commit deffb33cf97383ea5d555cf8360e92076aab6609 Author: lacvet Date: Fri Apr 3 18:23:52 2026 +0900 Initial commit to new repository diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..59a710a Binary files /dev/null and b/.DS_Store differ diff --git a/.vs/AxCommander/DesignTimeBuild/.dtbcache.v2 b/.vs/AxCommander/DesignTimeBuild/.dtbcache.v2 new file mode 100644 index 0000000..c95f986 Binary files /dev/null and b/.vs/AxCommander/DesignTimeBuild/.dtbcache.v2 differ diff --git a/.vs/AxCommander/FileContentIndex/0823ffdc-6538-4366-ad84-196ab007885b.vsidx b/.vs/AxCommander/FileContentIndex/0823ffdc-6538-4366-ad84-196ab007885b.vsidx new file mode 100644 index 0000000..72b9543 Binary files /dev/null and b/.vs/AxCommander/FileContentIndex/0823ffdc-6538-4366-ad84-196ab007885b.vsidx differ diff --git a/.vs/AxCommander/FileContentIndex/33548cde-b28f-4395-a392-6555f3632749.vsidx b/.vs/AxCommander/FileContentIndex/33548cde-b28f-4395-a392-6555f3632749.vsidx new file mode 100644 index 0000000..407a79b Binary files /dev/null and b/.vs/AxCommander/FileContentIndex/33548cde-b28f-4395-a392-6555f3632749.vsidx differ diff --git a/.vs/AxCommander/FileContentIndex/4ce75ea3-7d71-479e-9e26-2d0470fd8628.vsidx b/.vs/AxCommander/FileContentIndex/4ce75ea3-7d71-479e-9e26-2d0470fd8628.vsidx new file mode 100644 index 0000000..a35b7bd Binary files /dev/null and b/.vs/AxCommander/FileContentIndex/4ce75ea3-7d71-479e-9e26-2d0470fd8628.vsidx differ diff --git a/.vs/AxCommander/FileContentIndex/695bb2bd-3c88-4462-93db-56afca2e91fc.vsidx b/.vs/AxCommander/FileContentIndex/695bb2bd-3c88-4462-93db-56afca2e91fc.vsidx new file mode 100644 index 0000000..f397836 Binary files /dev/null and b/.vs/AxCommander/FileContentIndex/695bb2bd-3c88-4462-93db-56afca2e91fc.vsidx differ diff --git a/.vs/AxCommander/FileContentIndex/8109c639-9fb6-41da-9a52-3ab2a49856a9.vsidx b/.vs/AxCommander/FileContentIndex/8109c639-9fb6-41da-9a52-3ab2a49856a9.vsidx new file mode 100644 index 0000000..5e9e0ed Binary files /dev/null and b/.vs/AxCommander/FileContentIndex/8109c639-9fb6-41da-9a52-3ab2a49856a9.vsidx differ diff --git a/.vs/AxCommander/v18/.futdcache.v2 b/.vs/AxCommander/v18/.futdcache.v2 new file mode 100644 index 0000000..a8c78d6 Binary files /dev/null and b/.vs/AxCommander/v18/.futdcache.v2 differ diff --git a/.vs/AxCommander/v18/.suo b/.vs/AxCommander/v18/.suo new file mode 100644 index 0000000..dd30096 Binary files /dev/null and b/.vs/AxCommander/v18/.suo differ diff --git a/.vs/AxCommander/v18/DocumentLayout.backup.json b/.vs/AxCommander/v18/DocumentLayout.backup.json new file mode 100644 index 0000000..b5ba43d --- /dev/null +++ b/.vs/AxCommander/v18/DocumentLayout.backup.json @@ -0,0 +1,34 @@ +{ + "Version": 1, + "WorkspaceRootPath": "E:\\AX Commander\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\admin\\AppData\\Local\\Temp\\.vsdbgsrc\\47857252c2f7918acd7cde28b121406cd435acaad3354ed659f220603fb46572\\XamlReader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 0, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "XamlReader.cs", + "DocumentMoniker": "C:\\Users\\admin\\AppData\\Local\\Temp\\.vsdbgsrc\\47857252c2f7918acd7cde28b121406cd435acaad3354ed659f220603fb46572\\XamlReader.cs", + "ToolTip": "C:\\Users\\admin\\AppData\\Local\\Temp\\.vsdbgsrc\\47857252c2f7918acd7cde28b121406cd435acaad3354ed659f220603fb46572\\XamlReader.cs", + "ViewState": "AgIAAMIBAAAAAAAAAAAUwNkBAAACAAAAAQAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-03-26T21:45:20.636Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/AxCommander/v18/DocumentLayout.json b/.vs/AxCommander/v18/DocumentLayout.json new file mode 100644 index 0000000..03752b5 --- /dev/null +++ b/.vs/AxCommander/v18/DocumentLayout.json @@ -0,0 +1,34 @@ +{ + "Version": 1, + "WorkspaceRootPath": "E:\\AX Commander\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\admin\\AppData\\Local\\Temp\\.vsdbgsrc\\47857252c2f7918acd7cde28b121406cd435acaad3354ed659f220603fb46572\\XamlReader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 0, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "XamlReader.cs", + "DocumentMoniker": "C:\\Users\\admin\\AppData\\Local\\Temp\\.vsdbgsrc\\47857252c2f7918acd7cde28b121406cd435acaad3354ed659f220603fb46572\\XamlReader.cs", + "ToolTip": "C:\\Users\\admin\\AppData\\Local\\Temp\\.vsdbgsrc\\47857252c2f7918acd7cde28b121406cd435acaad3354ed659f220603fb46572\\XamlReader.cs", + "ViewState": "AgIAAMIBAAAAAAAAAAAYwNkBAAACAAAAAQAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-03-26T21:45:20.636Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/ProjectEvaluation/axcommander.metadata.v10.bin b/.vs/ProjectEvaluation/axcommander.metadata.v10.bin new file mode 100644 index 0000000..788c586 Binary files /dev/null and b/.vs/ProjectEvaluation/axcommander.metadata.v10.bin differ diff --git a/.vs/ProjectEvaluation/axcommander.projects.v10.bin b/.vs/ProjectEvaluation/axcommander.projects.v10.bin new file mode 100644 index 0000000..95f63d2 Binary files /dev/null and b/.vs/ProjectEvaluation/axcommander.projects.v10.bin differ diff --git a/.vs/ProjectEvaluation/axcommander.strings.v10.bin b/.vs/ProjectEvaluation/axcommander.strings.v10.bin new file mode 100644 index 0000000..5897cea Binary files /dev/null and b/.vs/ProjectEvaluation/axcommander.strings.v10.bin differ diff --git a/AXCommander_SRS_draft.rtf b/AXCommander_SRS_draft.rtf new file mode 100644 index 0000000..06ca2d3 --- /dev/null +++ b/AXCommander_SRS_draft.rtf @@ -0,0 +1,540 @@ +{\rtf1\ansi\ansicpg949\cocoartf2868 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset129 AppleSDGothicNeo-Regular;\f2\fnil\fcharset0 LucidaGrande; +} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\paperw11900\paperh16840\margl1440\margr1440\vieww20200\viewh15100\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 1. +\f1 \'bd\'c3\'bd\'ba\'c5\'db +\f0 +\f1 \'c7\'d9\'bd\'c9 +\f0 +\f1 \'be\'c6\'c5\'b0\'c5\'d8\'c3\'b3 +\f0 \ + +\f1 \'c1\'d6\'bf\'e4 +\f0 +\f1 \'b8\'f0\'b5\'e2 +\f0 +\f1 \'b1\'b8\'bc\'ba\ + * \'c0\'a9\'b5\'b5\'bf\'ec os\'bf\'a1\'bc\'ad \'b5\'bf\'c0\'db\'c7\'cf\'b4\'c2 \'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5\'c0\'b8\'b7\'ce \'c1\'a4\'c0\'c7 +\f0 \ + * Input Listener (Global Hook): +\f1 \'be\'ee\'b6\'b2 +\f0 +\f1 \'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5 +\f0 +\f1 \'c0\'a7\'bf\'a1 +\f0 +\f1 \'c0\'d6\'b5\'e7 +\f0 Alt + Space +\f1 \'bf\'cd +\f0 +\f1 \'b0\'b0\'c0\'ba +\f0 +\f1 \'b4\'dc\'c3\'e0\'c5\'b0\'b8\'a6 +\f0 +\f1 \'b0\'a8\'c1\'f6\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Context Manager: +\f1 \'c7\'f6\'c0\'e7 +\f0 +\f1 \'bf\'ad\'b7\'c1 +\f0 +\f1 \'c0\'d6\'b4\'c2 +\f0 +\f1 \'c0\'a9\'b5\'b5\'bf\'ec\'b5\'e9\'c0\'c7 +\f0 +\f1 \'c7\'da\'b5\'e9 +\f0 (HWND), +\f1 \'c7\'c1\'b7\'ce\'bc\'bc\'bd\'ba +\f0 +\f1 \'b0\'e6\'b7\'ce +\f0 , +\f1 \'c3\'a2 +\f0 +\f1 \'c0\'a7\'c4\'a1 +\f0 (Rect) +\f1 \'b8\'a6 +\f0 +\f1 \'bd\'ba\'b3\'c0\'bc\'a6\'c0\'b8\'b7\'ce +\f0 +\f1 \'c4\'b8\'c3\'b3\'c7\'cf\'b0\'ed +\f0 +\f1 \'ba\'b9\'bf\'f8\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Command Resolver: +\f1 \'c0\'d4\'b7\'c2\'b5\'c8 +\f0 +\f1 \'b8\'ed\'b7\'c9\'be\'ee +\f0 ( +\f1 \'bf\'b9 +\f0 : @nas, !dev) +\f1 \'b8\'a6 +\f0 +\f1 \'c7\'d8\'bc\'ae\'c7\'cf\'bf\'a9 +\f0 +\f1 \'b9\'cc\'b8\'ae +\f0 +\f1 \'c1\'a4\'c0\'c7\'b5\'c8 +\f0 +\f1 \'be\'d7\'bc\'c7 +\f0 ( +\f1 \'c6\'fa\'b4\'f5 +\f0 +\f1 \'bf\'ad\'b1\'e2 +\f0 , +\f1 \'b9\'e8\'c4\'a1 +\f0 +\f1 \'bd\'c7\'c7\'e0 +\f0 , +\f1 \'c0\'a9\'b5\'b5\'bf\'ec +\f0 +\f1 \'c1\'a4\'b7\'c4 +\f0 ) +\f1 \'c0\'bb +\f0 +\f1 \'b8\'c5\'c7\'ce\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Fuzzy Engine: +\f1 \'c6\'c4\'c0\'cf\'b8\'ed\'c0\'cc\'b3\'aa +\f0 +\f1 \'c5\'b0\'bf\'f6\'b5\'e5\'c0\'c7 +\f0 +\f1 \'c0\'cf\'ba\'ce\'b8\'b8 +\f0 +\f1 \'c0\'d4\'b7\'c2\'c7\'d8\'b5\'b5 +\f0 +\f1 \'b0\'a1\'c0\'e5 +\f0 +\f1 \'c0\'af\'bb\'e7\'c7\'d1 +\f0 +\f1 \'c7\'d7\'b8\'f1\'c0\'bb +\f0 +\f1 \'c3\'ca\'b0\'ed\'bc\'d3\'c0\'b8\'b7\'ce +\f0 +\f1 \'c3\'a3\'be\'c6\'c1\'dd\'b4\'cf\'b4\'d9 +\f0 .\ + * max os\uc0\u51032 \u50508 \u54532 \u47112 \u46300 \u50752 \u50976 \u49324 \u54620 \u44592 \u45733 \u51012 \u50952 \u46020 \u50864 os\u50640 \u44396 \u52629 \ +2. +\f1 \'c1\'d6\'bf\'e4 +\f0 +\f1 \'b1\'e2\'b4\'c9 +\f0 +\f1 \'bb\'f3\'bc\'bc +\f0 (Feature List)\ +A. +\f1 \'bf\'f6\'c5\'a9\'bd\'ba\'c6\'e4\'c0\'cc\'bd\'ba +\f0 +\f1 \'bd\'ba\'b3\'c0\'bc\'a6 +\f0 & +\f1 \'bd\'c3\'c7\'c1\'c6\'ae +\f0 (The Shifter)\ + +\f1 \'b4\'dc\'bc\'f8\'c8\'f7 +\f0 +\f1 \'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5\'c0\'bb +\f0 +\f1 \'b6\'e7\'bf\'ec\'b4\'c2 +\f0 +\f1 \'b0\'cd\'c0\'cc +\f0 +\f1 \'be\'c6\'b4\'cf\'b6\'f3 +\f0 , ' +\f1 \'be\'ee\'b6\'b2 +\f0 +\f1 \'c0\'a7\'c4\'a1\'bf\'a1 +\f0 +\f1 \'be\'ee\'b6\'b2 +\f0 +\f1 \'c5\'a9\'b1\'e2\'b7\'ce +\f0 ' +\f1 \'b6\'b0 +\f0 +\f1 \'c0\'d6\'b4\'c2\'c1\'f6\'b1\'ee\'c1\'f6 +\f0 +\f1 \'b0\'fc\'b8\'ae\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Snapshot Capture: +\f1 \'c7\'f6\'c0\'e7 +\f0 +\f1 \'c8\'ad\'b8\'e9\'bf\'a1 +\f0 +\f1 \'b6\'b0 +\f0 +\f1 \'c0\'d6\'b4\'c2 +\f0 +\f1 \'b8\'f0\'b5\'e7 +\f0 +\f1 \'be\'f7\'b9\'ab\'bf\'eb +\f0 +\f1 \'c3\'a2 +\f0 +\f1 \'b9\'e8\'c4\'a1\'b8\'a6 +\f0 ' +\f1 \'c7\'c1\'b7\'ce\'c7\'ca +\f0 ' +\f1 \'b7\'ce +\f0 +\f1 \'c0\'fa\'c0\'e5\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 . ( +\f1 \'bf\'b9 +\f0 : +\f1 \'bf\'de\'c2\'ca\'bf\'a3 +\f0 VS Code, +\f1 \'bf\'c0\'b8\'a5\'c2\'ca +\f0 +\f1 \'bb\'f3\'b4\'dc\'bf\'a3 +\f0 +\f1 \'b1\'e2\'c8\'b9\'bc\'ad +\f0 PDF, +\f1 \'c7\'cf\'b4\'dc\'bf\'a3 +\f0 SQL +\f1 \'c5\'f8 +\f0 )\ + * Instant Restore: !dev +\f1 \'b8\'ed\'b7\'c9 +\f0 +\f1 \'bd\'c3 +\f0 , +\f1 \'c0\'fa\'c0\'e5\'b5\'c8 +\f0 +\f1 \'c7\'c1\'b7\'ce\'c7\'ca\'c0\'bb +\f0 +\f1 \'ba\'d2\'b7\'af\'bf\'cd +\f0 +\f1 \'c3\'a2\'b5\'e9\'c0\'bb +\f0 +\f1 \'b0\'ad\'c1\'a6\'b7\'ce +\f0 +\f1 \'c0\'e7\'b9\'e8\'c4\'a1\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Multi-Monitor Support: +\f1 \'b5\'e0\'be\'f3 +\f0 +\f1 \'b8\'f0\'b4\'cf\'c5\'cd +\f0 +\f1 \'c8\'af\'b0\'e6\'bf\'a1\'bc\'ad\'b5\'b5 +\f0 +\f1 \'b0\'a2 +\f0 +\f1 \'b8\'f0\'b4\'cf\'c5\'cd\'ba\'b0 +\f0 +\f1 \'c3\'a2 +\f0 +\f1 \'b9\'e8\'c4\'a1\'b8\'a6 +\f0 +\f1 \'c1\'a4\'c8\'ae\'c8\'f7 +\f0 +\f1 \'b1\'e2\'be\'ef\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ +B. +\f1 \'bd\'c3\'b8\'c7\'c6\'bd +\f0 +\f1 \'c4\'bf\'b8\'c7\'b5\'e5 +\f0 +\f1 \'b7\'b1\'c3\'b3 +\f0 (The Alfred)\ + +\f1 \'c5\'b0\'ba\'b8\'b5\'e5\'b8\'b8\'c0\'b8\'b7\'ce +\f0 +\f1 \'b8\'b6\'bf\'ec\'bd\'ba +\f0 +\f1 \'c5\'ac\'b8\'af +\f0 +\f1 \'bc\'f6\'bd\'ca +\f0 +\f1 \'b9\'f8\'c0\'c7 +\f0 +\f1 \'b0\'a1\'c4\'a1\'b8\'a6 +\f0 +\f1 \'b8\'b8\'b5\'e9\'be\'ee\'b3\'c0\'b4\'cf\'b4\'d9 +\f0 .\ + * Smart Aliases: +\f1 \'b1\'e4 +\f0 +\f1 \'b0\'e6\'b7\'ce\'b3\'aa +\f0 +\f1 \'ba\'b9\'c0\'e2\'c7\'d1 +\f0 +\f1 \'b8\'ed\'b7\'c9\'c0\'bb +\f0 +\f1 \'c2\'aa\'c0\'ba +\f0 +\f1 \'ba\'b0\'c4\'aa\'c0\'b8\'b7\'ce +\f0 +\f1 \'b5\'ee\'b7\'cf\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * @blog +\f2 \uc0\u8594 +\f0 swarchitect.net +\f1 \'b0\'fc\'b8\'ae\'c0\'da +\f0 +\f1 \'c6\'e4\'c0\'cc\'c1\'f6 +\f0 +\f1 \'bf\'c0\'c7\'c2 +\f0 \ + * #jira +\f2 \uc0\u8594 +\f0 +\f1 \'b3\'bb\'b0\'a1 +\f0 +\f1 \'b4\'e3\'b4\'e7\'c7\'d1 +\f0 +\f1 \'c3\'d6\'bd\'c5 +\f0 +\f1 \'c6\'bc\'c4\'cf +\f0 +\f1 \'c6\'e4\'c0\'cc\'c1\'f6\'b7\'ce +\f0 +\f1 \'b9\'d9\'b7\'ce +\f0 +\f1 \'c0\'cc\'b5\'bf +\f0 \ + * Clipboard Transformer: +\f1 \'ba\'b9\'bb\'e7\'c7\'d1 +\f0 +\f1 \'c5\'d8\'bd\'ba\'c6\'ae\'b8\'a6 +\f0 +\f1 \'b1\'d4\'c4\'a2\'bf\'a1 +\f0 +\f1 \'b5\'fb\'b6\'f3 +\f0 +\f1 \'b0\'a1\'b0\'f8\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 . ( +\f1 \'bf\'b9 +\f0 : JSON +\f1 \'c6\'f7\'b8\'cb\'c6\'c3 +\f0 , +\f1 \'c0\'af\'b4\'d0\'bd\'ba +\f0 +\f1 \'c5\'b8\'c0\'d3\'bd\'ba\'c5\'c6\'c7\'c1 +\f0 +\f1 \'ba\'af\'c8\'af +\f0 +\f1 \'b5\'ee +\f0 )\ +3. UI/UX +\f1 \'b5\'f0\'c0\'da\'c0\'ce +\f0 +\f1 \'b0\'a1\'c0\'cc\'b5\'e5 +\f0 (WPF +\f1 \'b1\'e2\'b9\'dd +\f0 )\ + +\f1 \'bb\'e7\'bf\'eb\'c0\'da\'c0\'c7 +\f0 +\f1 \'bd\'c3\'b0\'a2\'c0\'fb +\f0 +\f1 \'b9\'e6\'c7\'d8\'b8\'a6 +\f0 +\f1 \'c3\'d6\'bc\'d2\'c8\'ad\'c7\'cf\'b8\'e9\'bc\'ad +\f0 +\f1 \'bc\'bc\'b7\'c3\'b5\'c8 +\f0 +\f1 \'b4\'c0\'b3\'a6\'c0\'bb +\f0 +\f1 \'c1\'d6\'b4\'c2 +\f0 +\f1 \'b5\'f0\'c0\'da\'c0\'ce +\f0 +\f1 \'b9\'e6\'c7\'e2\'c0\'d4\'b4\'cf\'b4\'d9 +\f0 .\ +| +\f1 \'bf\'e4\'bc\'d2 +\f0 | +\f1 \'b5\'f0\'c0\'da\'c0\'ce +\f0 +\f1 \'b1\'c7\'c0\'e5 +\f0 +\f1 \'bb\'e7\'c7\'d7 +\f0 |\ +|---|---|\ +| +\f1 \'c3\'a2 +\f0 +\f1 \'c7\'fc\'c5\'c2 +\f0 | +\f1 \'c8\'ad\'b8\'e9 +\f0 +\f1 \'c1\'df\'be\'d3\'bf\'a1 +\f0 +\f1 \'b6\'df\'b4\'c2 +\f0 +\f1 \'c5\'f5\'b8\'ed\'b5\'b5 +\f0 (Opacity) +\f1 \'b0\'a1 +\f0 +\f1 \'c0\'fb\'bf\'eb\'b5\'c8 +\f0 +\f1 \'b9\'d9 +\f0 (Bar) +\f1 \'c7\'fc\'c5\'c2 +\f0 |\ +| +\f1 \'c5\'d7\'b8\'b6 +\f0 | +\f1 \'bd\'c3\'bd\'ba\'c5\'db +\f0 +\f1 \'bc\'b3\'c1\'a4\'bf\'a1 +\f0 +\f1 \'b5\'fb\'b8\'a5 +\f0 +\f1 \'b4\'d9\'c5\'a9 +\f0 / +\f1 \'b6\'f3\'c0\'cc\'c6\'ae +\f0 +\f1 \'b8\'f0\'b5\'e5 +\f0 +\f1 \'c0\'da\'b5\'bf +\f0 +\f1 \'c0\'fc\'c8\'af +\f0 |\ +| +\f1 \'b0\'e1\'b0\'fa +\f0 +\f1 \'b8\'ae\'bd\'ba\'c6\'ae +\f0 | +\f1 \'b8\'ed\'b7\'c9\'be\'ee +\f0 +\f1 \'c0\'d4\'b7\'c2 +\f0 +\f1 \'bd\'c3 +\f0 +\f1 \'be\'c6\'b7\'a1\'b7\'ce +\f0 +\f1 \'c3\'d6\'b4\'eb +\f0 5~7 +\f1 \'b0\'b3\'c0\'c7 +\f0 +\f1 \'c3\'df\'c3\'b5 +\f0 +\f1 \'b8\'ae\'bd\'ba\'c6\'ae\'b0\'a1 +\f0 +\f1 \'b8\'ae\'bd\'ba\'c6\'ae\'ba\'e4 +\f0 +\f1 \'c7\'fc\'c5\'c2\'b7\'ce +\f0 +\f1 \'c7\'a5\'bd\'c3 +\f0 |\ +| +\f1 \'be\'d6\'b4\'cf\'b8\'de\'c0\'cc\'bc\'c7 +\f0 | +\f1 \'c8\'a3\'c3\'e2 +\f0 +\f1 \'bd\'c3 +\f0 +\f1 \'c6\'e4\'c0\'cc\'b5\'e5\'c0\'ce +\f0 (Fade-in), +\f1 \'bd\'c7\'c7\'e0 +\f0 +\f1 \'bd\'c3 +\f0 +\f1 \'bb\'e7\'b6\'f3\'c1\'f6\'b4\'c2 +\f0 +\f1 \'c8\'bf\'b0\'fa\'b7\'ce +\f0 +\f1 \'bc\'d3\'b5\'b5\'b0\'a8 +\f0 +\f1 \'ba\'ce\'bf\'a9 +\f0 |\ +4. +\f1 \'b1\'b8\'c7\'f6\'c0\'bb +\f0 +\f1 \'c0\'a7\'c7\'d1 +\f0 +\f1 \'c7\'d9\'bd\'c9 +\f0 +\f1 \'b1\'e2\'bc\'fa +\f0 +\f1 \'c6\'f7\'c0\'ce\'c6\'ae +\f0 (C# .NET)\ + +\f1 \'c0\'cc +\f0 +\f1 \'b5\'b5\'b1\'b8\'c0\'c7 +\f0 +\f1 \'bd\'c9\'c0\'e5\'c0\'ba +\f0 Windows API +\f1 \'c1\'a6\'be\'ee\'bf\'a1 +\f0 +\f1 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9 +\f0 .\ + * +\f1 \'c0\'a9\'b5\'b5\'bf\'ec +\f0 +\f1 \'c1\'a6\'be\'ee +\f0 : User32.dll +\f1 \'c0\'c7 +\f0 GetWindowPlacement, SetWindowPos, ShowWindow +\f1 \'c7\'d4\'bc\'f6\'b8\'a6 +\f0 +\f1 \'c5\'eb\'c7\'d8 +\f0 +\f1 \'b4\'d9\'b8\'a5 +\f0 +\f1 \'be\'db\'c0\'c7 +\f0 +\f1 \'c0\'a7\'c4\'a1\'bf\'cd +\f0 +\f1 \'c5\'a9\'b1\'e2\'b8\'a6 +\f0 +\f1 \'b0\'ad\'c1\'a6 +\f0 +\f1 \'c1\'b6\'c1\'a4\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * +\f1 \'b1\'db\'b7\'ce\'b9\'fa +\f0 +\f1 \'b4\'dc\'c3\'e0\'c5\'b0 +\f0 : RegisterHotKey +\f1 \'b8\'a6 +\f0 +\f1 \'bb\'e7\'bf\'eb\'c7\'cf\'bf\'a9 +\f0 +\f1 \'bd\'c3\'bd\'ba\'c5\'db +\f0 +\f1 \'c0\'fc\'c3\'bc\'bf\'a1\'bc\'ad +\f0 +\f1 \'c0\'db\'b5\'bf\'c7\'cf\'b4\'c2 +\f0 +\f1 \'c7\'d6\'c5\'b0\'b8\'a6 +\f0 +\f1 \'b1\'b8\'c7\'f6\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * +\f1 \'b5\'a5\'c0\'cc\'c5\'cd +\f0 +\f1 \'c0\'fa\'c0\'e5 +\f0 : +\f1 \'ba\'b9\'c0\'e2\'c7\'d1 +\f0 DB +\f1 \'b4\'eb\'bd\'c5 +\f0 JSON +\f1 \'c6\'c4\'c0\'cf +\f0 (settings.json) +\f1 \'c0\'bb +\f0 +\f1 \'bb\'e7\'bf\'eb\'c7\'cf\'bf\'a9 +\f0 +\f1 \'bb\'e7\'bf\'eb\'c0\'da\'b0\'a1 +\f0 +\f1 \'c1\'f7\'c1\'a2 +\f0 +\f1 \'c5\'d8\'bd\'ba\'c6\'ae +\f0 +\f1 \'bf\'a1\'b5\'f0\'c5\'cd\'b7\'ce +\f0 +\f1 \'ba\'b0\'c4\'aa\'c0\'bb +\f0 +\f1 \'bc\'f6\'c1\'a4\'c7\'d2 +\f0 +\f1 \'bc\'f6 +\f0 +\f1 \'c0\'d6\'b0\'d4 +\f0 +\f1 \'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ +} \ No newline at end of file diff --git a/AXCommander_SRS_v1.0.html b/AXCommander_SRS_v1.0.html new file mode 100644 index 0000000..9b031fa --- /dev/null +++ b/AXCommander_SRS_v1.0.html @@ -0,0 +1,575 @@ + + +AXCommander_SRS_v1.0 + + +

<b>OLEDi Commander</b>

+

Software Requirements Specification

+

Windows 전용 시맨틱 런처 & 워크스페이스 매니저

+ + + + + + + + +
항목내용
문서 버전v1.0
작성일2026-03-21
최종 검토일2026-03-21
상태초안 (Draft)
대상 플랫폼Windows 10 / 11 (x64)
구현 언어C# / .NET 8 / WPF
+ +

<br/>

+

<b>목차</b>

+

<br/>

+

<b>1. 개요 (Overview)</b>

+

<b>1.1 프로젝트 목적</b>

+

OLEDi Commander는 macOS 생산성 도구 Alfred에서 영감을 받아, Windows 환경에서 동등하거나 그 이상의 생산성을 제공하기 위해 설계된 키보드 우선(Keyboard-first) 런처 겸 워크스페이스 매니저입니다.

+

전통적인 마우스 중심 UI 조작을 Alt+Space 단축키 하나로 대체하여, 개발자·파워유저가 컨텍스트 전환 비용 없이 빠르게 작업을 수행할 수 있도록 합니다.

+ +

<b>1.2 범위 (Scope)</b>

+

본 문서는 OLEDi Commander 1.0 릴리스를 대상으로 하며, 아래 두 핵심 모듈을 포함합니다.

+ +

아래 항목은 v1.0 범위에서 제외됩니다.

+ + +

<b>1.3 용어 정의 (Glossary)</b>

+ + + + + + + + + + + +
용어정의
HWNDWindows API에서 창(Window)을 식별하는 핸들 값
Rect창의 좌상단·우하단 좌표로 이루어진 사각형 구조체
Profile특정 시점의 창 배치 및 크기 정보를 저장한 JSON 객체
Alias긴 경로·명령을 짧게 치환하는 사용자 정의 키워드
Fuzzy Search오타·부분 입력도 유사 항목을 찾아주는 비정확 검색
Global Hook어떤 앱이 포커스를 갖고 있어도 키 입력을 감지하는 OS 훅
PluginCommandResolver에 새로운 ActionHandler를 추가하는 확장 단위
SkillPlugin의 다른 표현. 사용자 정의 실행 규칙 묶음
settings.json사용자 설정 및 Alias를 저장하는 로컬 JSON 파일
+ +

<b>1.4 참조 문서</b>

+ +

<br/>

+

<b>2. 시스템 아키텍처</b>

+

OLEDi Commander는 단일 프로세스(Single-process) 구조이며, 아래 5개 핵심 모듈로 구성됩니다. 모든 모듈은 의존성 주입(DI) 방식으로 연결되어 테스트 및 확장이 용이합니다.

+ + + + + + + + +
모듈역할핵심 기술
Input Listener글로벌 키 훅 – 어떤 앱에서도 Alt+Space 감지WH_KEYBOARD_LL, RegisterHotKey
Context Manager열린 창의 HWND, Rect, 프로세스 경로 수집 및 복원EnumWindows, GetWindowPlacement, SetWindowPos
Command Resolver입력 텍스트 파싱 → ActionHandler 라우팅Prefix 테이블, ActionHandler 인터페이스
Fuzzy Engine파일명·키워드 부분 입력으로 빠른 유사 항목 탐색Fuse.js 알고리즘 포팅 또는 FuzzySharp
Plugin Host외부 .dll 또는 JSON 기반 스킬을 로드·실행Reflection, IActionHandler 인터페이스
+ +

<b>2.1 모듈 간 데이터 흐름</b>

+

[사용자 키 입력] → Input Listener → Command Resolver → ActionHandler (Shifter / Alfred / Plugin)

+

[창 배치 저장] → Context Manager → Profile JSON → settings.json

+

[창 배치 복원] → settings.json → Context Manager → User32 API

+ +

<b>2.2 Prefix 라우팅 테이블</b>

+

Command Resolver는 입력 텍스트의 첫 번째 토큰(prefix)을 기준으로 ActionHandler를 선택합니다. 빌트인 prefix는 다음과 같습니다.

+ + + + + + + + + +
Prefix타입예시동작
!워크스페이스!dev저장된 "dev" 프로필 즉시 복원
@URL / 웹@blogsettings.json의 해당 URL 브라우저로 오픈
#동적 API#jira설정된 API 어댑터 호출 후 결과 표시
>터미널 명령>git statusWindows Terminal / PowerShell에서 실행
~파일 경로~projects등록된 폴더 경로를 탐색기로 오픈
(없음)Fuzzy 검색vsc인덱스에서 유사 파일·앱·Alias 검색
+ + + +
확장 가능성
위 prefix 목록은 settings.json의 "prefixMap" 배열을 통해 사용자가 직접 추가·변경할 수 있습니다.
플러그인 개발자는 IActionHandler 인터페이스를 구현하는 .dll을 제공하여 새로운 prefix 동작을 등록합니다.
자세한 내용은 섹션 7 개발자 확장 가이드를 참조하십시오.
+

<br/>

+

<b>3. 기능 요구사항</b>

+

<b>3.1 워크스페이스 스냅샷 & 시프트 (The Shifter)</b>

+

"어떤 위치에 어떤 크기로" 떠 있는지까지 관리하는 워크스페이스 레이아웃 엔진입니다. 단순 앱 실행을 넘어 창의 상태(State)를 완전히 복원합니다.

+ +

<b>3.1.1 Snapshot Capture</b>

+ + +

<b>3.1.2 Instant Restore</b>

+ + +

<b>3.1.3 Profile 관리</b>

+ + +

<b>3.1.4 Multi-Monitor 지원</b>

+ + +

<b>3.2 시맨틱 커맨드 런처 (The Alfred)</b>

+

키보드만으로 마우스 클릭 수십 번의 가치를 만들어냅니다. Alt+Space → 명령어 입력의 단일 패턴으로 모든 작업을 처리합니다.

+ +

<b>3.2.1 Smart Aliases</b>

+

긴 경로나 복잡한 명령을 짧은 별칭으로 등록합니다. settings.json의 "aliases" 배열로 관리됩니다.

+ + + + + + + + + +
Alias 타입예시동작 설명
url@blog → https://swarchitect.net/admin브라우저로 URL 오픈
folder~proj → C:\\Dev\\Projects탐색기로 폴더 오픈
app@term → C:\\Windows\\wt.exe지정 실행파일 실행
batch>build → cmd /c build.bat커맨드 실행 (출력 창 선택)
api#jira → JiraAdapter (토큰 설정 필요)동적 데이터 조회 후 결과 표시
clipboard$upper → UPPER_CASE 변환현재 클립보드 텍스트 변환
+ +

<b>3.2.2 Fuzzy Engine</b>

+ + +

<b>3.2.3 Clipboard Transformer</b>

+

복사한 텍스트를 규칙에 따라 가공합니다. $ prefix로 호출하며, 변환 결과를 클립보드에 덮어쓴 후 활성 창에 붙여넣기(Ctrl+V) 시뮬레이션을 수행합니다.

+ + + + + + + + + + + + + +
빌트인 변환명령예시
JSON 포맷팅$json{"a":1} → 들여쓰기 적용 JSON
유닉스 타임스탬프 → 날짜$ts1700000000 → 2023-11-14 22:13:20
날짜 → 유닉스 타임스탬프$epoch2023-11-14 → 1700000000
대문자 변환$upperhello → HELLO
소문자 변환$lowerHELLO → hello
URL 인코딩$urle한글 → %ED%95%9C%EA%B8%80
URL 디코딩$urld%ED%95%9C%EA%B8%80 → 한글
Base64 인코딩$b64etext → dGV4dA==
Base64 디코딩$b64ddGV4dA== → text
마크다운 → 텍스트$md**bold** → bold
+ +

사용자 정의 변환 규칙은 settings.json의 "clipboardTransformers" 배열에 추가하며, 정규식 기반 변환과 외부 스크립트 호출을 지원합니다. 자세한 내용은 섹션 7.4를 참조하십시오.

+ +

<b>3.3 동적 API Alias (#)</b>

+

# prefix를 사용하는 Alias는 외부 API를 호출하여 동적 결과를 표시합니다. 각 API 연결은 "apiAdapters" 설정으로 정의합니다.

+ + + + + + + +
항목요구사항
인증Personal Access Token(PAT) 또는 OAuth 2.0. 토큰은 Windows Credential Manager에 저장
네트워크 오류3초 내 응답 없으면 타임아웃, 오프라인 캐시(최대 1시간) 표시
결과 표시최대 10개 항목을 런처 결과 리스트에 표시, Enter로 기본 동작(URL 오픈) 실행
빌트인 어댑터Jira Cloud, GitHub Issues (v1.0). 추가 어댑터는 플러그인으로 제공
+

<br/>

+

<b>4. UI/UX 디자인 요구사항</b>

+

<b>4.1 런처 윈도우</b>

+ + + + + + + + + + +
요소명세
형태화면 중앙 상단 1/3 지점에 위치하는 반투명 바(Bar) 형태 오버레이
기본 크기너비: 680px, 높이: 54px (입력 상태). 결과 표시 시 높이 자동 확장
투명도Opacity 0.96 (기본). settings.json에서 0.7~1.0 조정 가능
테마시스템 다크/라이트 모드 자동 감지(WMI 또는 레지스트리 감시). 수동 고정 설정 가능
폰트Segoe UI (영문), Malgun Gothic (한글), 16px
애니메이션호출: 상단 20px에서 Fade-in + SlideDown (120ms). 닫힘: Fade-out (80ms)
항상 최상위Topmost = true. 다른 창에 가려지지 않음
포커스 처리런처 외부 클릭 시 자동 닫힘 (LostFocus 이벤트)
+ +

<b>4.2 결과 리스트</b>

+ + +

<b>4.3 접근성 (Accessibility)</b>

+ +

<br/>

+

<b>5. 비기능 요구사항 (NFR)</b>

+

<b>5.1 성능</b>

+ + + + + + + + +
항목목표 수치측정 방법
Fuzzy 검색 응답< 100ms (p95)로컬 인덱스 10,000건 기준 자동화 벤치마크
Instant Restore (5창 기준)< 1.5초스톱워치 측정, 5회 평균
앱 시작 시간< 800ms (백그라운드 Ready 상태)프로세스 시작 → 트레이 아이콘 표시까지
메모리 사용량유휴 시 < 80MB RSSProcess Explorer 모니터링
CPU 점유율유휴 시 < 0.5%10분 유휴 후 평균
인덱싱 시간10,000파일 < 3초초기 기동 시 측정
+ +

<b>5.2 신뢰성 & 안정성</b>

+ + +

<b>5.3 보안</b>

+ + + +
보안 주의사항 – Windows Defender / EDR 탐지
WH_KEYBOARD_LL 훅은 일부 보안 소프트웨어에서 키로거로 오탐될 수 있습니다.
대응 방안: 앱 배포 시 코드 서명 인증서 적용, Microsoft Store 등록 검토.
기업 환경 배포 시에는 GPO 화이트리스트 등록 가이드를 별도 제공합니다.
+ +

<b>5.4 유지보수성</b>

+ + +

<b>5.5 호환성</b>

+ +

<br/>

+

<b>6. 예외 처리 및 엣지 케이스</b>

+ + + + + + + + + + + + +
시나리오원인처리 방침
Restore 시 앱 미실행저장된 EXE가 닫혀 있음자동 EXE 실행 → 3초 대기 → 실패 시 건너뜀, 결과 알림
모니터 구성 변경모니터 추가/제거/해상도 변경settings.json의 "monitorMismatch" 정책에 따라 fit/skip/warn
단축키 충돌타 앱이 Alt+Space 선점등록 실패 감지 → 트레이에 경고 → 대체 단축키 제안
관리자 권한 창 제어타 프로세스가 elevatedSetWindowPos 예외 캐치 → 해당 창 건너뜀, 로그 기록
settings.json 손상JSON 파싱 오류원본 .bak 저장 → 기본값 로드 → 복구 안내 메시지
Alias 중복 등록동일 키워드 중복나중에 추가된 항목이 우선. 경고 로그 기록
플러그인 로드 실패.dll 서명 불일치 또는 예외해당 플러그인 건너뜀, 오류 로그. 앱은 계속 실행
API 타임아웃네트워크 불안정3초 타임아웃 → 오프라인 캐시 표시 (1시간 유효) → 캐시 없으면 오류 메시지
앱 인덱스 폴더 접근 불가권한 없는 폴더해당 폴더 스킵, 인덱싱 완료 후 경고 로그
Fuzzy 검색 결과 없음입력에 일치 항목 없음"일치하는 항목이 없습니다" 표시, 입력 지속 허용
+

<br/>

+

<b>7. 데이터 스키마 (settings.json)</b>

+

모든 사용자 설정과 Profile, Alias는 단일 JSON 파일로 관리됩니다. 파일 위치: %APPDATA%\OLEDiCommander\settings.json

+ +

{

+

"version": "1.0",

+

"hotkey": "Alt+Space",

+

"launcher": {

+

"opacity": 0.96,

+

"maxResults": 7,

+

"theme": "system",

+

"position": "center-top"

+

},

+

"indexPaths": [

+

"%USERPROFILE%\\Desktop",

+

"%APPDATA%\\Microsoft\\Windows\\Start Menu"

+

],

+

"monitorMismatch": "warn",

+

"profiles": [

+

{

+

"name": "dev",

+

"windows": [

+

{

+

"exe": "C:\\Program Files\\Microsoft VS Code\\Code.exe",

+

"title": "Visual Studio Code",

+

"rect": { "x": 0, "y": 0, "width": 1280, "height": 1080 },

+

"showCmd": "Normal",

+

"monitor": 0

+

}

+

]

+

}

+

],

+

"aliases": [

+

{ "key": "@blog", "type": "url", "target": "https://swarchitect.net/admin" },

+

{ "key": "#jira", "type": "api", "adapter": "jira", "query": "assignee=currentUser() ORDER BY updated DESC" },

+

{ "key": "~proj", "type": "folder", "target": "C:\\Dev\\Projects" },

+

{ "key": ">build", "type": "batch", "target": "cmd /c C:\\Dev\\build.bat", "showWindow": false }

+

],

+

"clipboardTransformers": [

+

{ "key": "$myRule", "type": "regex", "pattern": "(\\d{4})-(\\d{2})-(\\d{2})", "replace": "$3/$2/$1" }

+

],

+

"apiAdapters": [

+

{ "id": "jira", "baseUrl": "https://yourorg.atlassian.net", "credentialKey": "jira_pat" }

+

],

+

"plugins": [

+

{ "path": "C:\\OLEDiPlugins\\MyPlugin.dll", "enabled": true }

+

]

+

}

+

<br/>

+

<b>8. 개발자 확장 가이드 (Plugin & Skill Development)</b>

+

이 섹션은 OLEDi Commander에 새로운 기능, 명령어, API 연결, 변환 규칙을 추가하려는 개발자를 위한 문서입니다. 확장 방법은 세 가지 경로로 제공됩니다.

+ + + + + + +
확장 방법난이도추천 대상
settings.json 수정쉬움URL Alias, 폴더 단축키, 배치 명령 추가
JSON 스킬 파일 (.skill.json)보통API 어댑터, 커스텀 변환 규칙
.dll 플러그인 (C# IActionHandler)어려움완전히 새로운 명령 타입, UI 커스터마이징
+ +

<b>8.1 settings.json으로 Alias 추가하기</b>

+

가장 간단한 확장 방법입니다. settings.json 파일을 텍스트 에디터로 열어 "aliases" 배열에 항목을 추가합니다.

+ +

// URL 열기 Alias 추가

+

{ "key": "@notion", "type": "url", "target": "https://notion.so/your-workspace" }

+ +

// 폴더 열기 Alias 추가

+

{ "key": "~dl", "type": "folder", "target": "%USERPROFILE%\\Downloads" }

+ +

// 배치 파일 실행 Alias 추가 (출력 창 표시)

+

{ "key": ">deploy", "type": "batch", "target": "cmd /c C:\\deploy.bat", "showWindow": true }

+ +

// 배치 파일 실행 Alias 추가 (백그라운드 실행)

+

{ "key": ">silent", "type": "batch", "target": "powershell -File C:\\task.ps1", "showWindow": false }

+ + + +
팁: 환경변수 사용
"target" 값에 %USERPROFILE%, %APPDATA%, %TEMP% 등 Windows 환경변수를 사용할 수 있습니다.
앱 실행 시 자동으로 확장됩니다.
+ +

<b>8.2 Clipboard Transformer 규칙 추가하기</b>

+

settings.json의 "clipboardTransformers" 배열에 변환 규칙을 추가합니다. 정규식(regex) 또는 외부 스크립트(script) 타입을 지원합니다.

+ +

// 정규식 변환: 날짜 형식 YYYY-MM-DD → DD/MM/YYYY

+

{

+

"key": "$date",

+

"type": "regex",

+

"pattern": "(\\d{4})-(\\d{2})-(\\d{2})",

+

"replace": "$3/$2/$1",

+

"description": "ISO 날짜를 로컬 날짜 형식으로 변환"

+

}

+ +

// PowerShell 스크립트 호출 변환

+

{

+

"key": "$ps",

+

"type": "script",

+

"command": "powershell -NoProfile -Command \"$input | ConvertTo-Json\"",

+

"timeout": 5000,

+

"description": "클립보드 텍스트를 PowerShell로 처리"

+

}

+ +

스크립트 타입의 경우, 앱은 클립보드 텍스트를 stdin으로 전달하고 stdout 결과를 클립보드에 저장합니다. timeout(ms) 초과 시 원본 텍스트를 유지합니다.

+ +

<b>8.3 JSON 스킬 파일로 API Adapter 추가하기</b>

+

새로운 API 서비스(예: Notion, Linear, Slack)를 연결하려면 .skill.json 파일을 작성합니다. 파일은 %APPDATA%\OLEDiCommander\skills\ 폴더에 저장합니다.

+ +

// %APPDATA%\OLEDiCommander\skills\notion.skill.json

+

{

+

"id": "notion",

+

"name": "Notion 페이지 검색",

+

"version": "1.0",

+

"prefix": "#notion",

+

"credential": {

+

"type": "bearer_token",

+

"credentialKey": "notion_api_token"

+

},

+

"request": {

+

"method": "POST",

+

"url": "https://api.notion.com/v1/search",

+

"headers": { "Notion-Version": "2022-06-28" },

+

"body": { "query": "{{INPUT}}", "page_size": 10 }

+

},

+

"response": {

+

"resultsPath": "results",

+

"titleField": "properties.title.title[0].plain_text",

+

"subtitleField": "url",

+

"actionUrl": "url"

+

},

+

"cache": { "ttl": 300 }

+

}

+ +

{{INPUT}}은 사용자가 # 이후에 입력한 텍스트로 치환됩니다. 토큰은 앱 내 설정 화면에서 입력하며 Windows Credential Manager에 암호화 저장됩니다.

+ + + + + + + + + + +
필드필수설명
id스킬 고유 식별자 (영문 소문자, 하이픈 허용)
prefix런처에서 이 스킬을 호출하는 명령어 (예: #notion)
credential.typebearer_token / basic_auth / oauth2 중 선택
request.urlAPI 엔드포인트. {{INPUT}}, {{TOKEN}} 템플릿 변수 사용 가능
response.resultsPathJSON 응답에서 결과 배열 경로 (dot notation)
response.actionUrlEnter 시 열리는 URL 필드 경로
cache.ttl아니오결과 캐시 유효 시간(초). 기본값 0 (캐시 없음)
+ +

<b>8.4 C# .dll 플러그인으로 새 ActionHandler 개발하기</b>

+

완전히 새로운 명령 타입, 복잡한 UI, 또는 OS 레벨 기능이 필요한 경우 C# 플러그인을 개발합니다.

+ +

<b>8.4.1 인터페이스 정의</b>

+

// OLEDiCommander.SDK NuGet 패키지 설치 후 사용

+

using OLEDiCommander.SDK;

+ +

/// <summary>

+

/// 모든 플러그인은 이 인터페이스를 구현해야 합니다.

+

/// </summary>

+

public interface IActionHandler

+

{

+

// 이 핸들러가 처리할 prefix (예: "@", "#", "!") 또는 null (Fuzzy 결과에만 등록)

+

string? Prefix { get; }

+ +

// 런처 결과 리스트에 표시할 항목을 반환합니다.

+

// query: prefix 이후의 입력 텍스트

+

Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct);

+ +

// 사용자가 항목을 선택(Enter)했을 때 실행됩니다.

+

Task ExecuteAsync(LauncherItem item, CancellationToken ct);

+ +

// 플러그인 메타데이터

+

PluginMetadata Metadata { get; }

+

}

+ +

public record LauncherItem(

+

string Title,

+

string Subtitle,

+

string? IconPath, // null이면 기본 아이콘 사용

+

object? Data // ExecuteAsync에 전달되는 임의 데이터

+

);

+ +

public record PluginMetadata(

+

string Id,

+

string Name,

+

string Version,

+

string Author

+

);

+ +

<b>8.4.2 예제: 계산기 플러그인</b>

+

using OLEDiCommander.SDK;

+

using System.Data;

+ +

[Export(typeof(IActionHandler))]

+

public class CalculatorHandler : IActionHandler

+

{

+

public string? Prefix => "="; // "=2+3" 입력 시 이 핸들러 호출

+ +

public PluginMetadata Metadata => new("calculator", "계산기", "1.0", "YourName");

+ +

public async Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)

+

{

+

try

+

{

+

var result = new DataTable().Compute(query, null);

+

return [new LauncherItem($"= {result}", "Enter로 복사", null, result.ToString())];

+

}

+

catch

+

{

+

return [new LauncherItem("수식 오류", "올바른 수식을 입력하세요", null, null)];

+

}

+

}

+ +

public async Task ExecuteAsync(LauncherItem item, CancellationToken ct)

+

{

+

if (item.Data is string val)

+

Clipboard.SetText(val); // 결과를 클립보드에 복사

+

}

+

}

+ +

<b>8.4.3 플러그인 배포 및 등록</b>

+ +

{ "path": "C:\\OLEDiPlugins\\MyPlugin.dll", "enabled": true }

+ + + + +
개발 팁: 핫 리로드
개발 중에는 시스템 트레이 → "개발자 모드" 활성화 시 플러그인 파일 변경 감지 후 자동 재로드됩니다.
OLEDiCommander.SDK.dll은 NuGet 패키지(OLEDiCommander.SDK)로 배포됩니다.
단위 테스트 시 MockLauncherContext를 주입하여 UI 없이 IActionHandler를 테스트할 수 있습니다.
+ +

<b>8.5 확장 체크리스트</b>

+

새 기능을 추가하기 전에 아래 항목을 확인하십시오.

+ + + + + + + + + + + +
체크 항목확인 기준
Prefix 충돌 확인기존 Prefix 테이블(섹션 2.2)과 중복 없는지 확인
에러 처리네트워크 오류, 타임아웃, null 결과 등 모든 예외 처리 구현
CancellationToken 사용사용자가 ESC 입력 시 진행 중인 비동기 작업 즉시 취소
캐싱 고려API 호출 결과는 TTL 캐시 적용으로 불필요한 네트워크 요청 방지
로깅 추가ILogger를 통해 DEBUG/ERROR 레벨 로그 기록
단위 테스트GetItemsAsync, ExecuteAsync 각각 최소 1개 이상 테스트 케이스 작성
아이콘 제공32x32 PNG 아이콘을 LauncherItem.IconPath에 포함
설명 작성PluginMetadata.Name, settings.json의 description 필드 작성
+

<br/>

+

<b>9. 설치 및 배포</b>

+ + + + + + + + + +
항목내용
배포 형태MSIX 패키지 (Microsoft Store) 또는 Squirrel.Windows 인스톨러 (.exe)
Self-contained.NET 8 Self-contained 배포 – 별도 런타임 설치 불필요
설치 경로%LOCALAPPDATA%\Programs\OLEDiCommander\
설정 경로%APPDATA%\OLEDiCommander\
자동 시작HKCU Run 레지스트리 키 등록 (설치 시 옵션 선택)
자동 업데이트앱 실행 시 GitHub Releases API 버전 확인, 백그라운드 다운로드
제거일반 "앱 및 기능"으로 제거 가능. 설정 파일 유지 여부 선택
+ +

<b>10. 미결 사항 및 향후 계획 (v2.0)</b>

+ + + + + + + + + +
항목우선순위비고
플러그인 마켓플레이스 UI높음서드파티 스킬 검색/설치/업데이트 통합 UI
OAuth 2.0 인증 흐름높음GitHub, Google 등 OAuth 기반 API 어댑터 지원
AI 자연어 명령중간예: "1주일 전 내 Jira 티켓 열어줘" → #jira 쿼리 자동 생성
클라우드 설정 동기화중간OneDrive / iCloud Drive를 통한 settings.json 동기화
플러그인 서명 강제화높음v2.0부터 서명 없는 .dll 실행 차단
스크립트 언어 지원낮음Python / Node.js 스크립트를 스킬로 직접 등록
음성 명령 입력낮음Windows Speech API 연동
+ +

<b>변경 이력</b>

+ + + +
버전날짜작성자변경 내용
v1.02026-03-21초안 작성 (SRS 전체 구조 + 개발자 확장 가이드 포함)
+ + + diff --git a/AxCopilot.sln b/AxCopilot.sln new file mode 100644 index 0000000..ed546f5 --- /dev/null +++ b/AxCopilot.sln @@ -0,0 +1,39 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 18 +VisualStudioVersion = 18.2.11415.280 d18.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AxCopilot", "src\AxCopilot\AxCopilot.csproj", "{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AxCopilot.SDK", "src\AxCopilot.SDK\AxCopilot.SDK.csproj", "{B2C3D4E5-F6A7-8901-BCDE-F12345678901}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AxCopilot.Tests", "src\AxCopilot.Tests\AxCopilot.Tests.csproj", "{C3D4E5F6-A7B8-9012-CDEF-123456789012}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AxKeyEncryptor", "src\AxKeyEncryptor\AxKeyEncryptor.csproj", "{D4E5F6A7-B8C9-0123-DEFA-234567890123}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|Any CPU.Build.0 = Release|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B2C3D4E5-F6A7-8901-BCDE-F12345678901}.Release|Any CPU.Build.0 = Release|Any CPU + {C3D4E5F6-A7B8-9012-CDEF-123456789012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3D4E5F6-A7B8-9012-CDEF-123456789012}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3D4E5F6-A7B8-9012-CDEF-123456789012}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3D4E5F6-A7B8-9012-CDEF-123456789012}.Release|Any CPU.Build.0 = Release|Any CPU + {D4E5F6A7-B8C9-0123-DEFA-234567890123}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D4E5F6A7-B8C9-0123-DEFA-234567890123}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D4E5F6A7-B8C9-0123-DEFA-234567890123}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D4E5F6A7-B8C9-0123-DEFA-234567890123}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..336b2d9 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,755 @@ +# AX Copilot 개발 지시사항 + +이 파일은 모든 개발 세션에서 일관된 품질의 결과물을 보장하기 위한 필수 지시사항입니다. + +--- + +## 1. UI/UX 디자인 원칙 + +### 기본 컨트롤 사용 금지 +- **ContextMenu, MenuItem** 사용 금지 → 커스텀 `Popup` (Border + MouseLeftButtonUp, 12px 라운드, 호버, 드롭섀도) +- **MessageBox** 사용 금지 → `CustomMessageBox.Show()` 사용 +- **기본 CheckBox** 사용 금지 → `Style="{StaticResource ToggleSwitch}"` 좌우 슬라이드 토글 +- **Popup 내부에 Button** 사용 금지 → `Border` + `MouseLeftButtonUp` 패턴 (포커스 캡처 방지) +- 수평 스크롤바 금지 → `WrapPanel` 자동 줄바꿈 + +### 테마 통일성 +- 색상 하드코딩 금지 — XAML: `{DynamicResource PrimaryText}`, 코드비하인드: `TryFindResource("PrimaryText") as Brush ?? Brushes.White` +- 모든 UI 요소는 현재 적용된 테마 리소스(`LauncherBackground`, `ItemBackground`, `AccentColor`, `PrimaryText`, `SecondaryText` 등)를 사용 +- 다크 테마 6종 모두에서 텍스트 가독성 확인 필수 + +### 코드비하인드 팝업/다이얼로그 테마 규칙 +- **코드비하인드에서 생성하는 모든 팝업 Window/다이얼로그**도 현재 테마를 따라야 함 +- 배경: `TryFindResource("LauncherBackground")`, 텍스트: `TryFindResource("PrimaryText")`, 보조 텍스트: `TryFindResource("SecondaryText")` +- 테두리: `TryFindResource("BorderColor")`, 아이템 배경: `TryFindResource("ItemBackground")`, 액센트: `TryFindResource("AccentColor")` +- 호버 효과 배경: `TryFindResource("ItemHoverBackground")` +- `#1A1B2E`, `Brushes.White` 등 고정 색상을 팝업에 직접 사용하는 것은 **금지** — 라이트/다크 테마 전환 시 색상 불일치 발생 +- 팝업 Window에 테마 적용 패턴: +```csharp +// 팝업 생성 후 부모 창의 Resources를 팝업에 전달 +popup.Resources.MergedDictionaries.Add(this.Resources); +// 또는 직접 리소스 조회 +var bg = TryFindResource("LauncherBackground") as Brush ?? Brushes.White; +var fg = TryFindResource("PrimaryText") as Brush ?? Brushes.Black; +``` + +### 인터랙티브 요소 +- 클릭 가능 영역 최소 36px, FontSize 최소 12px, Padding 최소 6px +- 호버/클릭 효과 필수 — `#18FFFFFF` 반투명 배경 + 핸드 커서 +- 팝업은 `PopupAnimation="Fade"` 기본 적용 +- 메뉴 항목 FontSize 13px 이상 + +### 아이콘 색상 +- Segoe MDL2 Assets 아이콘은 가능한 한 **의미에 맞는 색상**을 적용 (단색 `SecondaryText` 지양) +- 메뉴 항목: 아이콘 + 라벨에 동일 색상 적용 (예: Ask=파랑, Auto=앰버, Deny=빨강) +- 하단 바: 각 버튼 아이콘에 기능별 색상 (포맷=보라, 파일=앰버, 권한=파랑, 데이터=녹색) +- 활성 상태 항목: `AccentColor` 또는 해당 기능 고유 색상으로 강조 + +### 설정 UI 패턴 +- 켜기/끄기: ToggleSwitch 스타일 (Grid 좌: 라벨, 우: 토글) +- 선택형: 커스텀 Popup 드롭다운 (`[라벨: 현재값 ▾]`) +- AI/고급 설정 항목 옆에 `?` 도움말 아이콘 + 커스텀 다크 툴팁 (`HelpTooltipStyle`) +- 설정 저장 시 `CustomMessageBox`로 완료 알림 + +### 헬프 화면 (HelpDetailWindow) 규칙 +- **버전 정보 금지** — 헬프에 버전별 신기능(예: "v1.6.0 신기능") 항목을 넣지 않으며, 앞으로도 추가하지 않음 +- **영역별 핵심 기능만 표시** — 개요, AI, 업무 보조 등 영역별로 사용자가 "무엇을 할 수 있는지"만 간결히 설명 +- **기술 보호 (IP 보호)** — 설명에서 내부 기술·구현 방식을 유추할 수 없어야 함. 아래 용어를 헬프에 직접 노출하는 것은 **금지**: + +| 사용 금지 (내부 기술) | 대신 사용 (사용자 관점) | +|---------------------|----------------------| +| SSE, Server-Sent Events | "실시간 응답" | +| AES-256-GCM, DPAPI, 암호화 알고리즘명 | "암호화 저장", "안전하게 보호" | +| OpenXML, python-docx, openpyxl | "문서 생성", "파일 생성" | +| MCP, JSON-RPC, stdio | "외부 도구 연결" | +| LINQ, TF-IDF, LCS, Mustache | 기능 설명으로 대체 | +| Ollama, vLLM, Gemini, Claude (모델명) | "AI 서비스", "AI 모델" | +| OWASP, CVE | "보안 점검", "취약점 분석" | +| system_prompt.txt, 클래스명, 파일명 | 기능 설명으로 대체 | + +--- + +## 2. 설정값 관리 원칙 + +### 신규 기능 → 설정 검토 필수 +신규 기능 추가 시 사용자/개발자가 제어할 수 있는 설정값을 반드시 검토하고 추가합니다: +1. `AppSettings.cs`에 프로퍼티 + JsonPropertyName + 기본값 추가 +2. `SettingsViewModel.cs`에 바인딩 프로퍼티 + Load/Save 매핑 +3. `SettingsWindow.xaml`에 적절한 탭에 UI 컨트롤 배치 +4. 도구(Tool) 클래스에서 설정값을 실제로 체크하여 동작에 반영 + +### Cowork / Code 설정 분리 원칙 +에이전트 동작 설정은 **공통(LlmSettings)에 넣지 말고, Cowork/Code 각각에 배치**합니다: +- **Cowork 전용 설정**: `LlmSettings`에 직접 프로퍼티 추가 → SettingsWindow의 `AgentPanelCowork` 패널에 배치 +- **Code 전용 설정**: `CodeSettings` 클래스에 프로퍼티 추가 → SettingsWindow의 `AgentPanelCode` 패널에 배치. XAML 바인딩은 `{Binding Code.PropertyName}` +- **진짜 공통인 경우만** `AgentPanelCoworkCode` 패널에 배치 (예: MaxAgentIterations, MaxRetryOnError) +- 검증 강제, 출력 형식, 폴더 데이터 활용 등 **탭마다 다르게 동작하는 기능**은 반드시 분리 +- AgentLoopService에서 `ActiveTab == "Code"` 분기로 탭별 설정 참조 + +```csharp +// 탭별 설정 참조 패턴 +var shouldVerify = ActiveTab == "Code" + ? llm.Code.EnableCodeVerification + : llm.EnableCoworkVerification; +``` + +### 설정값이 코드에서 실제 동작해야 함 +설정을 정의만 하고 코드에서 읽지 않는 것은 금지. 설정 체크 패턴: +```csharp +var app = System.Windows.Application.Current as App; +var enabled = app?.SettingsService?.Settings.Llm.Code.EnableLsp ?? true; +if (!enabled) return ToolResult.Ok("비활성 상태입니다. 설정에서 활성화하세요."); +``` + +--- + +## 3. 버전 관리 및 배포 + +### 버전 번호 규칙 +- **소규모 배포** (버그 수정, 설정 추가, UI 개선): `+0.0.1` (예: 1.4.0 → 1.4.1) +- **대규모 기능 배포** (Phase 완료, 새 에이전트 도구, 핵심 기능): `+0.1.0` (예: 1.4.0 → 1.5.0) + +### 버전 변경 시 반드시 수정할 파일 (체크리스트) + +| # | 대상 | 파일 경로 | 수정 내용 | +|---|------|----------|----------| +| 1 | 앱 버전 | `src/AxCopilot/AxCopilot.csproj` → `` | 버전 번호 | +| 2 | 인스톨러 프로젝트 | `src/AxCopilot.Installer/AxCopilot.Installer.csproj` → `` | 동일 | +| 3 | 인스톨러 표시 | `src/AxCopilot.Installer/SetupForm.cs` → `AppVer` | 동일 | +| 4 | MCP 클라이언트 | `src/AxCopilot/Services/McpClientService.cs` → `clientInfo.version` | 동일 | +| 5 | 개발자 가이드 | `src/AxCopilot/Assets/AX Copilot 개발자가이드.htm` | 버전 이력 항목 추가만 (**헤더/푸터에 버전 번호 표기 금지**) | +| 6 | 사용자 가이드 | `src/AxCopilot/Assets/AX Copilot 사용가이드.htm` | 개발자 가이드에서 버전이력 섹션 제거 후 복사 (**헤더/푸터 버전 표기 없음**) | +| 7 | 가이드 암호화 | `src/AxCopilot/Assets/guide_dev.enc`, `guide_user.enc` | 가이드 수정 후 반드시 암호화 재실행 | +| 8 | 개발 문서 | `docs/DEVELOPMENT.md` | 버전 이력 추가 | +| 9 | 로드맵 문서 | `docs/AGENT_ROADMAP.md/html`, `docs/LAUNCHER_ROADMAP.md/html` | 버전 번호 갱신 | + +### 가이드 문서 관리 워크플로우 + +가이드 문서는 **개발자 가이드가 마스터**이며, 사용자 가이드는 이를 기반으로 생성합니다: + +1. **개발자 가이드 수정** (`AX Copilot 개발자가이드.htm`) — 버전 이력 항목 추가. **헤더 `version-tag` div 및 푸터 버전 번호는 표기하지 않음** +2. **사용자 가이드 생성** — 개발자 가이드를 복사한 뒤 **버전 이력 섹션 제거** (`` ~ ``). 헤더/푸터에 버전 번호 없음 +3. **암호화 실행** — `encrypt_guides.ps1` 스크립트 실행하여 `.enc` 파일 생성 +4. **빌드** — `.enc` 파일이 출력 폴더에 복사됨 (평문 .htm은 출력에 포함되지 않음) + +```bash +# 가이드 암호화 명령 (프로젝트 루트에서) +powershell -ExecutionPolicy Bypass -File encrypt_guides.ps1 +``` + +- 앱에서는 `GuideViewerWindow`가 암호화된 가이드를 복호화하여 내장 뷰어로 표시 +- 개발자 모드 ON → 개발자 가이드 (버전이력 포함), OFF → 사용자 가이드 (버전이력 없음) +- 암호화 키: `GuideEncryptor.cs`에 고정 AES-256-CBC 키 내장 (모든 PC 동일) + +### 사용자 노출 문서 작성 원칙 (사용가이드 · 헬프) + +사용자 가이드와 헬프 화면은 **내부 기술이 노출되지 않도록** 작성합니다: + +| 구분 | 사용 금지 (내부 기술) | 대신 사용 (사용자 관점) | +|------|---------------------|----------------------| +| 프로토콜 | MCP, JSON-RPC, stdio, P/Invoke, DPAPI | "외부 도구 연결", "암호화 저장" | +| 클래스명 | McpClientService, TokenEstimator, DiffService | 기능 설명으로 대체 | +| 내부 구조 | FallbackModels, SettingsViewModel, ParentId | "자동 전환", "설정", "분기" | +| 코드 패턴 | CJK 가중치, SWE-bench, LCS, TF-IDF | "더 정확한 분석", "검색 개선" | + +**원칙**: 사용자에게는 "무엇을 할 수 있는지"만 전달합니다. + +--- + +## 4. 코드 품질 + +### 빌드 기준 +- 모든 변경 후 `dotnet build` 실행 → **경고 0, 오류 0** 필수 +- CS8603 (nullable) 경고 즉시 수정 + +### 리소스 관리 +- `IDisposable` 구현 객체는 반드시 해제 (PerformanceCounter, LspClientService 등) +- P/Invoke 메모리: `Marshal.AllocHGlobal` 후 `finally`에서 `FreeHGlobal` +- WinEvent 훅: `UnhookWinEvent` 보장 + +### 에이전트 도구 등록 +- 새 `IAgentTool` 구현 시 `ToolRegistry.CreateDefault()`에 `Register()` 추가 필수 +- 도구의 `Parameters` 스키마가 LLM function calling 명세에 정확히 맞는지 확인 + +--- + +## 5. AI 차단 버전 (클로드 버전) 패턴 + +AI 기능이 필요 없는 환경에 배포하거나, AI 기능 문의를 차단해야 할 때 사용하는 패턴입니다. + +### 활성화/비활성화 제어 방법 + +`AppSettings.AiEnabled` (기본값 **`false`**) 한 곳만 바꾸면 전체 AI 기능이 제어됩니다. + +| 조건 | 동작 | +|------|------| +| `AiEnabled = false` | **기본값 (배포 기본)** — AI 전체 차단 | +| `AiEnabled = true` | AI 활성화 — 비밀번호 인증 후 설정 가능 | + +### AI 활성화 비밀번호 + +- 설정 창 > 일반 탭 > AI 기능 토글 ON 시 비밀번호 다이얼로그 표시 +- 비밀번호: **`axgo123!`** +- 비밀번호 틀리거나 취소 시 토글 자동 복구 (OFF 유지) +- 비활성화(OFF)는 비밀번호 없이 즉시 적용 +- 구현 위치: `SettingsWindow.xaml.cs` `AiEnabled_Changed()` + +### AI 차단 시 적용되는 항목 + +| 항목 | 구현 위치 | 설명 | +|------|----------|------| +| `!` prefix 배지 숨김 | `LauncherViewModel.cs` `ActivePrefix`/`HasActivePrefix` | `!` prefix 인식 안 함 | +| `!` 입력 시 결과 없음 | `ChatHandler.cs` `GetItemsAsync` | 빈 리스트 반환 (항목 자체 미표시) | +| `!` 실행 차단 | `ChatHandler.cs` `ExecuteAsync` | 실행 불가 | +| 트레이 메뉴 항목 숨김 | `App.xaml.cs` `Opening` 이벤트 | "AX Agent 대화하기" 항목 `Collapsed` | +| AX Agent 설정 탭 숨김 | `SettingsWindow.xaml.cs` `ApplyAiEnabledState()` | 설정 창의 AX Agent 탭 `Collapsed` | + +### 설정 토글 UI + +- 위치: 설정 창 > 일반 탭 > **AI 기능** 섹션 > "AX Agent (AI 기능) 활성화" 토글 +- 저장 위치: `%APPDATA%\AxCopilot\settings.dat` → `"ai_enabled": true/false` + +### 신규 AI 기능 추가 시 체크리스트 + +AI 관련 기능을 새로 추가하면 `AiEnabled` 체크를 반드시 연동합니다: + +```csharp +// 핸들러/도구에서 AI 차단 체크 패턴 +var settings = (System.Windows.Application.Current as App)?.SettingsService?.Settings; +if (settings?.AiEnabled == false) return; // 또는 빈 결과 반환 +``` + +--- + +## 6. 사내/사외 모드 (Network Access Mode) + +### 개요 + +배포 환경에 따라 외부 인터넷 접속 허용 여부를 제어합니다. + +| 구분 | 모드 이름 | 기본값 | 설명 | +|------|----------|--------|------| +| `InternalModeEnabled = true` | **사내 모드** | ✅ 기본 | 외부 인터넷 접속 차단. 사내망 + LLM API만 허용 | +| `InternalModeEnabled = false` | **사외 모드** | — | 인터넷 검색, 외부 HTTP 허용 (비밀번호 인증 필요) | + +### 제어 방법 + +`AppSettings.InternalModeEnabled` (기본값 **`true`**) 한 곳만 바꾸면 모든 외부 접속 제어가 변경됩니다. + +- 설정 창 > 일반 탭 > **네트워크 모드** 섹션 > "사외 모드 활성화" 토글 +- 사외 모드 ON 시 비밀번호 다이얼로그 표시 → **`axgo123!`** +- 사내 모드 복귀(OFF)는 비밀번호 없이 즉시 적용 + +### 모드별 허용/차단 항목 + +| 기능 | 사내 모드 | 사외 모드 | +|------|---------|---------| +| LLM API 호출 (Ollama/Gemini/Claude) | ✅ 허용 | ✅ 허용 | +| 사내 MCP 서버 연결 | ✅ 허용 | ✅ 허용 | +| 웹 검색 (? 프리픽스) | ❌ 차단 | ✅ 허용 | +| `http_request` 도구 외부 URL | ❌ 차단 | ✅ 허용 | +| 외부 MCP 서버 연결 | ❌ 차단 | ✅ 허용 (명시적 등록 시) | + +### 코드 체크 패턴 + +```csharp +// 외부 접속이 필요한 기능에서 반드시 체크 +var settings = (System.Windows.Application.Current as App)?.SettingsService?.Settings; +if (settings?.InternalModeEnabled == true) + return ToolResult.Fail("사내 모드에서는 외부 인터넷 접속이 차단됩니다. 설정에서 사외 모드를 활성화하세요."); + +// URL이 내부 주소인지 검사 (사내 모드에서 허용 가능한 경우) +bool IsInternalUrl(string url) => + url.StartsWith("http://localhost", StringComparison.OrdinalIgnoreCase) || + url.StartsWith("http://127.", StringComparison.OrdinalIgnoreCase) || + url.StartsWith("http://192.168.", StringComparison.OrdinalIgnoreCase) || + url.StartsWith("http://10.", StringComparison.OrdinalIgnoreCase) || + url.StartsWith("http://172.", StringComparison.OrdinalIgnoreCase); +``` + +### 신규 외부 접속 기능 추가 시 체크리스트 + +외부 인터넷에 접속하는 기능을 추가하면 반드시 `InternalModeEnabled` 체크를 연동합니다: +1. 도구 또는 핸들러 실행 초반에 모드 체크 +2. 사내 모드에서는 명확한 오류 메시지 반환 +3. SettingsWindow에 해당 기능의 모드 의존성 설명 추가 + +--- + +## 7. 공통 비밀번호 정책 + +앱 내 보호된 설정은 모두 동일한 비밀번호를 사용합니다: + +| 보호 항목 | 비밀번호 | 구현 위치 | +|----------|---------|---------| +| AI 기능 활성화 | `axgo123!` | `SettingsWindow.xaml.cs` `AiEnabled_Changed()` | +| 사외 모드 활성화 | `axgo123!` | `SettingsWindow.xaml.cs` `NetworkMode_Changed()` | + +**구현 규칙**: +- 비밀번호를 코드에 하드코딩 — 암호화 불필요 (배포 제어용, 보안 목적 아님) +- 상수로 분리: `private const string SettingsPassword = "axgo123!";` +- 비밀번호 일치 시만 토글 활성화 유지, 불일치/취소 시 토글 자동 복구 + +--- + +## 8. 프로젝트 명칭 체계 + +| 구분 | 명칭 | 용도 | +|------|------|------| +| 앱 전체 | **AX Copilot** | 제품명, 설정, 정보 | +| 런처 | **AX Commander** | 명령 입력창 | +| AI 대화 | **AX Agent** | Chat/Cowork/Code 대화 | + +--- + +## 9. 사내 환경 개발 원칙 + +### 외부 의존 최소화 (항상 적용) +- **데이터 로컬 저장** — 설정, 대화, 클립보드, 인덱스, 로그 등 모든 데이터는 `%APPDATA%\AxCopilot\` 로컬에 저장. 클라우드 동기화 없음 +- **플러그인 설치** — URL 기반 다운로드 금지. 로컬 zip 파일 기반 설치만 허용 +- **코드 검색/인덱싱** — 외부 임베딩 API 사용 금지. 로컬 TF-IDF 또는 로컬 임베딩 엔진(ONNX) 사용 +- **업데이트 확인** — 외부 서버 자동 업데이트 체크 금지. 인스톨러를 통한 수동 업그레이드만 지원 +- **텔레메트리** — 사용 통계를 외부로 전송하지 않음. 모든 통계는 로컬 파일에만 기록 + +### 항상 허용되는 외부 접속 +- LLM API 호출 (Ollama/vLLM은 사내 서버, Gemini/Claude는 설정에 따라) +- 사내 MCP 서버 연결 (설정에서 명시적 등록된 것만) + +### 사외 모드에서만 허용 (섹션 6 참조) +- 인터넷 웹 검색 (? 프리픽스) +- `http_request` 도구의 외부 URL 호출 +- 외부 MCP 서버 연결 + +--- + +## 10. 문서 관리 원칙 + +### 기본 원칙: .md 파일이 마스터 +- **모든 로드맵·계획 문서는 `.md` 파일로 관리**합니다. 기본 작업(기능 개발·계획 수립·완료 기록)은 항상 `.md` 파일만 업데이트합니다. +- **HTML 웹 문서는 명시적으로 요청할 때만 업데이트**합니다. ("웹 문서도 업데이트해줘" 또는 "HTML 문서 갱신해줘" 요청 시에만 작업) +- HTML 문서는 `.md` 마스터를 기반으로 생성되는 **파생 문서**입니다. 자동으로 동기화하지 않습니다. + +### 문서 체계 + +| 문서 (.md 마스터) | HTML (파생) | 관리 대상 | .md 업데이트 시점 | +|-----------------|------------|----------|-----------------| +| `docs/AGENT_ROADMAP.md` | `docs/AGENT_ROADMAP.html` | **대화 서비스** Phase별 기능, 완료 이력, 기술부채 | Phase 완료 시, 기능 추가 시 | +| `docs/LAUNCHER_ROADMAP.md` | `docs/LAUNCHER_ROADMAP.html` | **런처** Phase별 기능, 완료 이력, 경쟁 비교 | Phase 완료 시, 기능 추가 시 | +| `docs/NEXT_ROADMAP.md` | `docs/NEXT_ROADMAP.html` | **종합** 경쟁 분석, 기술 동향, 차기 계획 | 분기별 또는 대규모 계획 변경 시 | +| `docs/DEVELOPMENT.md` | — | **개발 상세** 아키텍처, 핸들러, 버전 이력, 코드 패턴 | 매 버전 배포 시 | + +### 문서 업데이트 규칙 +- **기능 개발 완료 시**: 해당 영역 .md 로드맵(AGENT/LAUNCHER)에 완료 표시 + 구현 내용 기록 +- **배포 시**: DEVELOPMENT.md 버전 이력 추가, 사용자 가이드/헬프 갱신 +- **차기 계획 수립 시**: NEXT_ROADMAP.md 업데이트 (경쟁 분석 반영) +- **HTML 동기화 요청 시에만**: 해당 .md 내용을 기반으로 HTML 파일 갱신 (열고/닫기 토글, badge 스타일 done/plan/hold 통일) + +--- + +## 11. 고도화 계획 수립 원칙 + +### 외부 동향 기반 계획 수립 +고도화 계획(Phase)을 수립할 때는 **내부 개발 필요성만이 아닌 외부 동향**을 종합적으로 반영합니다: + +| 관점 | 검토 사항 | +|------|----------| +| **경쟁 서비스** | Claude Code, Cursor, Windsurf, GitHub Copilot, Raycast 등 최신 기능/UX 비교 | +| **최신 논문/기술** | Agentic Coding Survey, SWE-Agent, CodeAct, Reflexion 등 에이전트 코딩 연구 동향 | +| **업계 표준** | MCP 프로토콜, SKILL.md 오픈 포맷, LSP, DAP 등 표준 프로토콜 채택 여부 | +| **사내 환경** | 네트워크 제한, 보안 정책, Python/Node 설치 현황, 사용 빈도가 높은 워크플로우 | +| **커뮤니티 스킬** | Anthropic 공식 스킬, 오픈소스 프롬프트 엔지니어링 기법, 검증된 에이전트 패턴 | + +### 앱 크기 관리 +배포 앱(인스톨러)의 크기가 과도하게 커지지 않도록 관리합니다: + +- **기본 배포 크기 목표**: 인스톨러 **150MB 이하** 유지 (현재 ~80MB) +- **대형 의존성 추가 시**: ONNX 모델, 임베딩 엔진, 사전 데이터 등은 **별도 선택적 다운로드** 또는 **로컬 zip 설치** 방식 검토 +- **스킬 파일**: 내장 스킬(`.skill.md`)은 텍스트 기반이므로 크기 부담 없음 (수십 KB 단위). 적극 번들 가능 +- **NuGet 패키지**: 새 패키지 추가 시 DLL 크기 확인. 단일 기능에 10MB+ 패키지는 대안 검토 +- **런타임 의존**: Python/Node 스크립트 기반 기능은 사용자 PC 런타임에 의존 → 앱 크기 증가 없음 +- **리소스 파일**: 이미지/아이콘은 SVG 또는 시스템 폰트(Segoe MDL2 Assets) 우선. 대형 비트맵 금지 + +--- + +## 12. 코드 설계 원칙 (SOLID + 디자인 패턴) + +### SOLID 원칙 준수 (필수) + +#### S — 단일 책임 원칙 (SRP) +- **클래스 하나 = 책임 하나**. 에이전트 도구 클래스는 도구 로직만, UI 코드비하인드는 UI만 담당 +- 500줄 이상 클래스는 분리 검토. 메서드는 20줄 이하 권장 +- 파일 I/O, 비즈니스 로직, UI 렌더링이 같은 클래스에 섞이는 것 금지 + +```csharp +// 금지: AgentLoopService가 UI도 업데이트 +// 허용: AgentLoopService → 이벤트 발행 → ViewModel이 UI 갱신 +``` + +#### O — 개방/폐쇄 원칙 (OCP) +- 새 도구 추가 시 기존 `AgentLoopService` 수정 없이 `IAgentTool` 구현 + Registry 등록만으로 확장 +- 새 훅 이벤트 추가 시 기존 훅 처리기 수정 없이 새 핸들러 등록으로 확장 +- `switch/if-else` 체인으로 타입 분기하는 것 지양 → 다형성 또는 전략 패턴으로 대체 + +#### L — 리스코프 치환 원칙 (LSP) +- `IAgentTool` 구현체는 항상 교환 가능해야 함 — 특정 구현에만 의존하는 코드 금지 +- `ToolResult.Ok()` / `ToolResult.Error()` 반환 규약은 모든 도구 구현체에서 일관 유지 + +#### I — 인터페이스 분리 원칙 (ISP) +- 거대 인터페이스 금지. `IAgentTool`은 `Execute`, `Parameters`, `Name`만 정의 +- 추가 기능(검증, 로깅, 캐시)은 별도 인터페이스(`IVerifiable`, `IAuditable`)로 분리 +- 구현체가 사용하지 않는 메서드를 강제하는 인터페이스 금지 + +#### D — 의존성 역전 원칙 (DIP) +- 구체 클래스가 아닌 **인터페이스/추상 클래스에 의존** +- `AgentLoopService`는 `IAgentTool[]`, `ILlmService`, `IHookRunner`에만 의존 (구체 구현 직접 참조 금지) +- 의존성 주입: 생성자 주입 우선. `App.SettingsService`처럼 전역 싱글턴 직접 접근은 서비스 계층에만 허용 + +### 적극 사용할 디자인 패턴 + +#### Strategy 패턴 — 에이전트 도구, 훅 타입, 권한 모드 +```csharp +// 훅 타입별 전략 분리 +public interface IHookExecutor { Task ExecuteAsync(HookContext ctx); } +public class CommandHookExecutor : IHookExecutor { ... } +public class PromptHookExecutor : IHookExecutor { ... } // NEW: LLM 검사 +public class AgentHookExecutor : IHookExecutor { ... } // NEW: 에이전트 루프 +``` + +#### Observer 패턴 — 에이전트 이벤트, 훅 이벤트 +```csharp +// AgentLoopService에서 이벤트 발행 → 다수 구독자 (UI, 훅, 감사 로그) +public event EventHandler AgentEventOccurred; +// 구독: WorkflowAnalyzer, HookRunner, AuditLogService 각각 독립 구독 +``` + +#### Factory 패턴 — 도구 생성, 훅 생성, 에이전트 생성 +```csharp +// 도구 팩토리: 타입 기반 생성, 외부에서 new 금지 +public static class AgentToolFactory +{ + public static IAgentTool Create(string toolName, LlmSettings settings) { ... } +} +``` + +#### Decorator 패턴 — 도구 검증·로깅·위험도 래핑 +```csharp +// 기존 도구에 검증/로깅 기능 추가 — 도구 자체 수정 없이 +public class VerifiedToolDecorator : IAgentTool +{ + private readonly IAgentTool _inner; + public VerifiedToolDecorator(IAgentTool inner) { _inner = inner; } + public async Task ExecuteAsync(...) + { + var result = await _inner.ExecuteAsync(...); + await RunPostVerificationAsync(result); + return result; + } +} +``` + +#### Chain of Responsibility — 훅 체인, 권한 규칙 체인 +```csharp +// 권한 규칙을 체인으로 처리: Allow규칙 → Deny규칙 → 모드 기본값 +public abstract class PermissionRule +{ + protected PermissionRule? _next; + public abstract PermissionDecision Evaluate(ToolCall call); +} +``` + +#### Repository 패턴 — 설정, 대화 이력, 에이전트 메모리 +```csharp +public interface IAgentMemoryRepository +{ + Task GetAsync(string agentType, string projectId); + Task SaveAsync(AgentMemory memory); +} +``` + +#### Command 패턴 — 슬래시 명령, 커맨드 팔레트 +```csharp +public interface ISlashCommand +{ + string Name { get; } + string Description { get; } + Task ExecuteAsync(string arguments, IChatContext context); +} +``` + +### 구조 분리 원칙 + +#### 계층 분리 규칙 +``` +UI 계층 (Views/ViewModels) + ↓ 이벤트/명령 (Commands, Events) +서비스 계층 (Services) + ↓ 인터페이스 (IAgentTool, IHookExecutor 등) +도메인 계층 (Models, Tools) + ↓ 데이터 접근 (Repositories) +인프라 계층 (외부 API, 파일 시스템) +``` +- **계층 역방향 의존 금지**: 도메인 계층이 UI를 참조하는 것 금지 +- **서비스 계층 간 직접 호출 지양**: 이벤트/메시지 버스로 느슨한 결합 + +#### 에이전트 도구 분리 원칙 +- 도구 클래스는 `Services/AgentTools/` 하위의 **카테고리별 폴더**에 배치 +- 각 도구는 `독립 파일` 1개 — 여러 도구를 하나의 파일에 합치는 것 금지 +- 도구 간 직접 호출 금지 — 공통 로직은 `Services/AgentToolHelpers/`에 분리 + +#### 설정 분리 원칙 (기존 원칙 강화) +- Cowork/Code 전용 설정은 반드시 분리 (공통 설정에 넣지 않음) +- 새 기능 추가 시 설정 클래스 → ViewModel → UI → 코드 순서로 구현 + +### 새 기능 구현 체크리스트 + +새 Phase 기능을 구현하기 전 확인: +1. **인터페이스 먼저**: 구체 구현 전 `IXxx` 인터페이스 정의 +2. **단일 책임**: 클래스가 2가지 이상의 이유로 변경될 수 있으면 분리 +3. **패턴 적합성**: Strategy/Observer/Decorator 중 적합한 패턴 선택 +4. **의존성 방향**: 새 클래스의 의존성이 올바른 방향인지 확인 +5. **설정 연동**: 설정 없이 하드코딩된 동작 금지 +6. **테스트 가능성**: 외부 의존(파일, API)을 인터페이스로 추상화하여 단위 테스트 가능하게 + +--- + +## 13. AX Agent 채팅 화면 UI/UX 원칙 (Claude.ai + Codex 스타일) + +### 핵심 패러다임: AX Agent = 독립 앱 공간 + +**절대 원칙**: AX Agent와 관련된 **모든** 설정은 ChatWindow 내부에서 처리한다. +- SettingsWindow에서 **AX Agent 탭을 완전 제거**. AX Agent 관련 설정은 ChatWindow 내 설정 패널로 이관. +- 사용자는 ChatWindow를 벗어나지 않고 모델 변경, 도구 토글, 권한 모드, 에이전트 파라미터, API 키까지 모두 설정 가능해야 함. +- SettingsWindow에는 앱 전역 설정(테마, 핫키, 런처, 인덱싱)만 남긴다. + +> **레퍼런스**: Claude.ai — 대화 목록 + 채팅 + 설정이 단일 창 내 패널로 구성. Codex — 에이전트 제어 항목(모델, 도구, 권한, Plan) 전부 채팅 헤더/사이드바에 인라인 배치. 별도 설정 다이얼로그 없음. + +--- + +### 전체 레이아웃 구조 (3-Pane) + +``` +┌──────────────────────────────────────────────────────────────────────┐ +│ [좌측 사이드바 260px] │ [메인 채팅 영역 — 가변] │ [우측 패널 300px] │ +│ │ │ (토글, 기본 접힘) │ +│ ┌──────────────────┐ │ ┌─────────────────────┐ │ │ +│ │ ≡ AX Agent ✕ │ │ │ 현재 탭 이름 │ │ ┌───────────────┐ │ +│ └──────────────────┘ │ │ 모델▾ Plan▾ 권한▾ │ │ │ ⚙ 설정 패널 │ │ +│ │ └─────────────────────┘ │ │ ───────────── │ │ +│ [ Chat │ Cowork│Code] │ │ │ 탭별 에이전트 │ │ +│ ──────────────────── │ [메시지 스트림] │ │ 파라미터 │ │ +│ ▸ 프리셋1 │ │ │ 모델/API 설정 │ │ +│ ▸ 프리셋2 │ │ │ 도구 토글 │ │ +│ ▸ 프리셋3 │ │ │ MCP 서버 │ │ +│ ──────────────────── │ │ └───────────────┘ │ +│ [+ 새 대화] │ │ │ +│ ──────────────────── │ ┌──────────────────────┐ │ ┌───────────────┐ │ +│ 오늘 │ │ @멘션 /스킬 📎 ⚙ │ │ │ 🔀 워크플로우 │ │ +│ · 대화 제목 1 │ │ [ 입력 텍스트 ] │ │ └───────────────┘ │ +│ · 대화 제목 2 │ │ 모델칩 권한칩 [전송]│ │ ┌───────────────┐ │ +│ 어제 │ └──────────────────────┘ │ │ 📄 Diff 뷰 │ │ +│ · 대화 제목 3 │ │ └───────────────┘ │ +└──────────────────────────────────────────────────────────────────────┘ +``` + +--- + +### 좌측 사이드바 (AgentSidebarView) — Claude.ai 스타일 + +#### 구조 및 동작 +- **헤더**: `≡ AX Agent` 로고 + 사이드바 접기 버튼 (최소 48px 아이콘 모드로 접힘) +- **탭 세그먼트**: `Chat | Cowork | Code` — 가로 3분할 세그먼트 컨트롤 (Border + MouseLeftButtonUp, 선택 탭 AccentColor 배경) +- **프리셋 목록**: 현재 탭의 프리셋 항목 직접 목록 표시. 클릭 시 즉시 적용. 우클릭 커스텀 Popup (편집/삭제) +- **새 대화 버튼**: `[+ 새 대화]` — 전체 너비 Border 버튼, 호버 시 AccentColor 틴트 +- **대화 이력**: 날짜 그룹(`오늘 / 어제 / 이전 7일 / 이전 30일`) 구분선 + 대화명. 클릭 시 해당 세션 복원. 우클릭 커스텀 Popup (이름변경/삭제/즐겨찾기) +- **하단**: ⚙ 설정 아이콘 → 우측 설정 패널 토글 (Claude.ai 프로필 메뉴 대응) + +#### 크기/테마 +- 기본 너비 260px, 접기 시 48px (아이콘만) +- 배경: `LauncherBackground`, 구분선: `BorderColor` 1px, 선택 항목: `ItemHoverBackground` +- 접기/펼치기: Width 애니메이션 260→48px, 180ms EaseInOut + +--- + +### 메인 채팅 영역 — 탭별 콘텐츠 + +#### 세션 헤더 바 (탭당 고정) + +탭 전환 시 해당 탭의 헤더로 교체됨. 항상 표시. + +| 위치 | 컨트롤 | 구현 | 설명 | +|------|--------|------|------| +| 좌측 | 현재 탭 레이블 | TextBlock | "Chat", "Cowork", "Code" | +| 중앙 | 모델 선택칩 | Border + Popup | 현재 모델명 + ▾. 클릭 시 등록 모델 목록 팝업 | +| 중앙 | Plan 모드 칩 | Border 3-state | Off → Auto → Always 순환 클릭. 활성=AccentColor | +| 중앙 | 권한 모드 칩 | Border + Popup | Default / AcceptEdits / Plan / Bypass | +| 우측 | 도구 아이콘 열 | 아이콘 N개 | 활성=기능색, 비활성=SecondaryText 흐림. 클릭 토글 | +| 우측 | ⚙ 설정 버튼 | Border | 우측 설정 패널 슬라이드인 토글 | +| 우측 | 🔀 워크플로우 | Border | 워크플로우 분석기 우측 패널 열기 | + +#### 메시지 스트림 + +- 사용자 메시지: 우측 정렬, `ItemBackground` 배경 버블, 최대 너비 70% +- AI 메시지: 좌측 정렬, 배경 없음 (Claude.ai 스타일), 마크다운 렌더링 +- 도구 호출 블록: 접히는 `Border` (`▶ file_write` → 클릭 시 펼쳐서 파라미터/결과 표시) +- 스트리밍 중: 커서 깜빡임 애니메이션 (Opacity 0→1, 500ms 반복) +- 신규 메시지 SlideIn: TranslateTransform Y +20→0, Opacity 0→1, 120ms EaseOut + +--- + +### 우측 설정 패널 (AgentSettingsPanel) — 필수 구현 + +**⚙ 클릭 시 우측에서 슬라이드인 (TranslateTransform X +300→0, 200ms EaseOut)** +**기존 SettingsWindow의 AX Agent 탭을 이 패널로 완전 대체.** + +#### 패널 구성 (탭별 섹션 분기) + +``` +┌─────────────────── ⚙ 설정 ────── [✕] ┐ +│ ── 현재 탭: Chat / Cowork / Code ── │ +│ │ +│ [모델 & 서비스] │ +│ LLM 서비스 [Ollama ▾] │ +│ 모델 [llama3:8b ▾] │ +│ API 엔드포인트 [____________] │ +│ API 키 [•••••••• 👁] │ +│ │ +│ [에이전트 동작] │ +│ 최대 반복 횟수 [──────○──] 20 │ +│ 오류 시 재시도 [──○──────] 3 │ +│ 병렬 도구 실행 ◉──── (토글) │ +│ │ +│ [탭 전용 설정] ← 탭에 따라 다름 │ +│ (Cowork) 검증 강제 ◉──── │ +│ (Code) LSP 분석 ◉──── │ +│ (Code) 작업 폴더 [경로... 📁] │ +│ │ +│ [도구 관리] │ +│ file_write ◉──── 활성 │ +│ file_read ◉──── 활성 │ +│ git_tool ────◉ 비활성 │ +│ … │ +│ │ +│ [MCP 서버] │ +│ ● server1 연결됨 [비활성화] │ +│ ○ server2 오프라인 [재연결] │ +│ │ +│ [프리셋] │ +│ 현재 설정으로 저장 [저장] │ +│ 프리셋 관리 [관리 →] │ +│ │ +│ [고급] │ +│ 폴백 모델 목록 [편집] │ +│ 프로젝트 규칙 ◉──── 활성 │ +│ AX.md 편집 [열기 →] │ +└───────────────────────────────────────┘ +``` + +#### 설정 패널 구현 규칙 +- 모든 컨트롤: ToggleSwitch 또는 Border+Popup 드롭다운 (Section 1 원칙 준수) +- API 키 필드: `PasswordBox` 스타일 + 👁 토글로 표시/숨김 +- 탭별 분기: `ActiveTab == "Code"` 조건으로 탭 전용 섹션 표시/숨김 +- 설정 변경 즉시 저장 (`SettingsService.Save()`) — 별도 저장 버튼 불필요 +- 슬라이더: WPF `Slider` + 현재값 TextBlock 우측 표시 + +--- + +### SettingsWindow 잔류 원칙 (AX Agent 탭 제거) + +SettingsWindow에 **남기는 항목** (앱 전역 설정만): +- **일반**: AI 활성화(비밀번호), 네트워크 모드(비밀번호), 앱 시작 설정, 개발자 모드 +- **런처**: 인덱싱 경로/확장자, 핫키, 독 바, 테마 선택 +- **플러그인**: 플러그인 설치/제거 (PluginGalleryViewModel) +- **퀵링크**: QuickLinkEntry 목록 관리 +- **AI 스니펫**: AiSnippetTemplate 목록 관리 +- **감사 로그**: 로그 파일 열기, 보존 기간 설정 + +SettingsWindow에서 **제거 (ChatWindow 이관 완료)**: +- AX Agent 탭 전체 → ChatWindow 우측 설정 패널 +- 모델/LLM 서비스 설정 → 설정 패널 [모델 & 서비스] 섹션 +- 에이전트 파라미터(반복, 재시도, 병렬) → 설정 패널 [에이전트 동작] 섹션 +- 도구 개별 토글 → 설정 패널 [도구 관리] 섹션 + 헤더 바 아이콘 +- MCP 서버 활성화 → 설정 패널 [MCP 서버] 섹션 (등록/삭제는 SettingsWindow) +- 프리셋 관리 → 설정 패널 [프리셋] 섹션 +- 프로젝트 규칙, 작업 폴더 → 설정 패널 [고급] 섹션 + +--- + +### 입력 영역 (AgentInputArea) — Claude.ai + Codex 스타일 + +``` +┌──────────────────────────────────────────────────────┐ +│ @멘션 /스킬 📎 첨부 │ +│ ┌──────────────────────────────────────────────────┐ │ +│ │ 메시지를 입력하세요… │ │ +│ │ │ │ +│ └──────────────────────────────────────────────────┘ │ +│ [모델명 칩] [권한 칩] [Plan 칩] ⚙설정 [▶전송] │ +└──────────────────────────────────────────────────────┘ +``` + +- **상단 툴바**: `@` (파일 멘션 자동완성) · `/` (스킬/슬래시 명령) · 📎 (파일/이미지 첨부) +- **텍스트 입력**: 최소 60px, 최대 220px 자동 확장, Ctrl+Enter 전송 +- **하단 칩 열**: 현재 모델명 칩 (클릭 시 변경) + 권한 모드 칩 + Plan 칩 — 항상 현재 상태 표시 +- **⚙ 버튼**: 우측 설정 패널 토글 (헤더 바와 동일 동작) +- **전송 버튼 [▶]**: 실행 중 → `[■ 중단]`으로 전환, Border + MouseLeftButtonUp 패턴 + +--- + +### 구현 클래스 구조 + +``` +Views/ + ChatWindow.xaml # 최상위 창 — 3-pane Grid 구조 + ChatWindow.xaml.cs # 탭 전환, 패널 토글, 입력 처리 + + Controls/ # 재사용 UserControl + AgentSidebarView.xaml # 탭 세그먼트 + 프리셋 + 대화 이력 + AgentSidebarView.xaml.cs + AgentSessionHeaderBar.xaml # 모델/Plan/권한/도구 칩 바 + AgentSessionHeaderBar.xaml.cs + AgentSettingsPanel.xaml # 우측 슬라이드인 설정 패널 (전체 AX Agent 설정) + AgentSettingsPanel.xaml.cs + AgentInputArea.xaml # 멀티기능 입력 영역 + AgentInputArea.xaml.cs + AgentDiffPanel.xaml # 우측 Diff 뷰 패널 + AgentDiffPanel.xaml.cs + +ViewModels/ + ChatWindowViewModel.cs # 창 통합 VM (탭, 패널 상태) + AgentSidebarViewModel.cs # 사이드바 VM (탭/프리셋/이력) + AgentSessionHeaderViewModel.cs # 헤더 칩 VM + AgentSettingsPanelViewModel.cs # 설정 패널 VM (모든 AX Agent 설정) +``` + +#### 파일 배치 원칙 +- 기존 `ChatWindow.xaml` / `ChatWindow.xaml.cs` 를 리팩터링. 새 파일을 신규 생성. +- `AgentSettingsPanel`은 독립 UserControl — `ChatWindow`에 `Grid.Column="2"`로 배치. +- 우측 패널 3종 (설정/워크플로우/Diff)은 `Visibility` + `TranslateTransform`으로 전환. + +--- + +### 애니메이션 / 전환 원칙 + +| 동작 | 구현 | 시간 | +|------|------|------| +| 사이드바 접기/펼치기 | Width 260→48px DoubleAnimation EaseInOut | 180ms | +| 우측 패널 슬라이드인 | TranslateTransform X +300→0 EaseOut | 200ms | +| 우측 패널 슬라이드아웃 | TranslateTransform X 0→+300 EaseIn | 150ms | +| 탭 전환 | Opacity 0→1 + TranslateY +8→0 | 120ms | +| 메시지 신규 등장 | Opacity 0→1 + TranslateY +16→0 EaseOut | 120ms | +| 스트리밍 커서 | Opacity 0↔1 RepeatForever | 500ms | +| 도구 블록 펼치기 | Height Auto DoubleAnimation | 150ms | + +--- + +## 14. 관련 문서 + +| 문서 | 경로 | 설명 | +|------|------|------| +| 개발 문서 | `docs/DEVELOPMENT.md` | 아키텍처, 핸들러, 버전 이력, 개발 원칙 상세 | +| AX Agent 로드맵 | `docs/AGENT_ROADMAP.md` | 대화 서비스 고도화 계획 (Phase별) — HTML은 요청 시만 갱신 | +| 런처 로드맵 | `docs/LAUNCHER_ROADMAP.md` | 런처 고도화 계획 (Phase별) — HTML은 요청 시만 갱신 | +| 차기 종합 계획 | `docs/NEXT_ROADMAP.md` | v1.7.1~v2.0 CC 내부 문서 기반 전면 개정판 — HTML은 요청 시만 갱신 | +| Claude Code 참고 문서 | `docs/claude-code-docs-main/` | CC 훅·스킬·멀티에이전트·권한·메모리·SDK 내부 아키텍처 문서 | +| 사용자 가이드 | `src/AxCopilot/Assets/AX Copilot 사용가이드.htm` | 단축키/예약어 가이드 | +| 브랜딩 가이드 | `src/AxCopilot/Assets/BRANDING_가이드.md` | 아이콘/색상/명칭 규칙 | diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe1a52c --- /dev/null +++ b/README.md @@ -0,0 +1,221 @@ +# AX Commander + +Windows 전용 시맨틱 런처 & 워크스페이스 매니저 + +> Alfred (macOS)에서 영감을 받아 Windows 환경에 최적화된 키보드 중심 생산성 도구입니다. + +--- + +## 주요 기능 (프리픽스 치트시트) + +| 프리픽스 | 기능 | 예시 | +|----------|------|------| +| *(없음)* | 앱·파일 퍼지 검색 + 앱 단축키 | `vscode`, `크롬`, `ㅅㄷ` (초성) | +| `=` | **계산기** — 수식 즉시 계산, Enter로 결과 복사 | `= sqrt(16)`, `= 2^10`, `= sin(30)` | +| `/` | **시스템 명령** — 잠금·절전·재시작·종료 | `/lock`, `/sleep`, `/shutdown` | +| `;` | **텍스트 스니펫** — 키워드로 저장된 텍스트 붙여넣기 | `;addr`, `;sig` | +| `#` | **클립보드 히스토리** — 복사 이력 검색 & 재사용 | `# hello`, `#` | +| `@` | URL 단축키 | `@gh` → GitHub 열기 | +| `~` | 폴더 단축키 | `~dl` → Downloads 폴더 | +| `>` | 명령 실행 / 배치 단축키 | `>git status` | +| `$` | 클립보드 텍스트 변환 (12종) | `$json`, `$b64e`, `$upper`, `$ts` | +| `!` | 워크스페이스 저장·복원 | `!save work`, `!restore work` | + +### Alfred 대비 기능 현황 + +| 기능 | Alfred | AX Commander | +|------|--------|-----------------| +| 앱 퍼지 검색 | ✅ | ✅ | +| 한국어 초성 검색 | ❌ | ✅ | +| 파일 검색 | ✅ | ✅ (exe/lnk/bat/ps1) | +| 계산기 | ✅ | ✅ `=` 프리픽스 | +| 시스템 명령 | ✅ | ✅ `/` 프리픽스 (7가지) | +| 텍스트 스니펫 | ✅ | ✅ `;` 프리픽스 + 변수 치환 | +| 클립보드 히스토리 | ✅ | ✅ `#` 프리픽스 | +| 클립보드 변환 | ❌ | ✅ `$` 프리픽스 (12종) | +| URL 단축키 | ✅ | ✅ `@` 프리픽스 | +| 폴더 단축키 | ✅ | ✅ `~` 프리픽스 | +| 터미널 명령 | ✅ | ✅ `>` 프리픽스 | +| 워크스페이스 관리 | ❌ | ✅ `!` 프리픽스 | +| 플러그인 SDK | ✅ | ✅ (`IActionHandler`) | +| HTTP API 스킬 | ✅ | ✅ (`.skill.json`) | +| 테마 커스터마이징 | ❌ | ✅ (7종 프리셋 + 완전 커스텀) | +| 설정 UI | ✅ | ✅ (7탭 전체 GUI 설정) | + +--- + +## 설치 및 빌드 + +### 요구 사항 + +- **OS**: Windows 10 20H2 이상 (Windows 11 권장) +- **.NET**: 8.0 Runtime (Self-contained 빌드 시 불필요) + +### 빌드 + +```bash +# 소스 클론 +git clone https://github.com/your/oledic.git +cd "oledic/AX Commander" + +# 개발 실행 +dotnet run --project src/AxCommander + +# Release 단일 파일 빌드 (self-contained) +dotnet publish src/AxCommander -c Release -r win-x64 --self-contained +``` + +### 데이터 경로 + +| 용도 | 경로 | +|------|------| +| 설정 파일 | `%APPDATA%\AxCommander\settings.json` | +| 로그 | `%APPDATA%\AxCommander\logs\app-YYYY-MM-DD.log` | +| 스킬 파일 | `%APPDATA%\AxCommander\skills\*.skill.json` | +| 크래시 덤프 | `%APPDATA%\AxCommander\crashes\` | + +--- + +## 사용법 + +### 키보드 단축키 + +| 동작 | 단축키 | +|------|--------| +| 런처 열기 / 닫기 | `Alt+Space` | +| 설정 열기 | `Ctrl+,` | +| 다음 항목 선택 | `↓` | +| 이전 항목 선택 | `↑` | +| 실행 | `Enter` | +| 자동완성 (선택 항목 제목 채우기) | `Tab` | +| 닫기 | `Esc` | + +### 계산기 예시 + +``` += 1 + 2 * 3 → 7 += sqrt(144) → 12 += 2^10 → 1024 += sin(30) → 0.5 (도 단위) += log(1000) → 3 += pi * 5^2 → 78.5398... += 0xFF + 16 → 271 += round(3.14159, 2) → 3.14 +``` + +### 스니펫 변수 + +스니펫 내용에서 아래 변수를 사용할 수 있습니다: + +| 변수 | 치환 값 | 예시 | +|------|---------|------| +| `{date}` | 오늘 날짜 | `2026-03-23` | +| `{time}` | 현재 시각 | `14:30:00` | +| `{datetime}` | 날짜+시각 | `2026-03-23 14:30:00` | +| `{year}` | 연도 | `2026` | +| `{month}` | 월 (2자리) | `03` | +| `{day}` | 일 (2자리) | `23` | + +--- + +## 플러그인 개발 + +### DLL 플러그인 + +`AxCommander.SDK`를 참조하여 `IActionHandler` 인터페이스를 구현합니다. + +```csharp +using AxCommander.SDK; + +public class MyHandler : IActionHandler +{ + public string? Prefix => "?"; // 트리거 프리픽스 (null이면 prefix 없는 핸들러) + public PluginMetadata Metadata => new("MyPlugin", "설명", Version: "1.0"); + + public async Task> GetItemsAsync(string query, CancellationToken ct) + { + return [ new LauncherItem("제목", "부제목", null, myData, Symbol: "\uE721") ]; + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + // item.Data로 전달한 데이터를 꺼내 실행 로직 작성 + return Task.CompletedTask; + } +} +``` + +빌드한 DLL 경로를 `settings.json`의 `plugins` 배열에 추가: + +```json +{ + "plugins": [ + { "path": "C:\\MyPlugins\\MyPlugin.dll", "enabled": true } + ] +} +``` + +### JSON 스킬 (코드 없이 HTTP API 연동) + +`%APPDATA%\AxCommander\skills\` 에 `.skill.json` 파일을 놓으면 됩니다. + +```json +{ + "id": "github-search", + "name": "GitHub 검색", + "prefix": "@gh", + "credential": { "type": "bearer_token", "credentialKey": "github_token" }, + "request": { + "method": "GET", + "url": "https://api.github.com/search/repositories?q={{INPUT}}&per_page=10" + }, + "response": { + "resultsPath": "items", + "titleField": "full_name", + "subtitleField": "description", + "actionUrl": "html_url" + }, + "cache": 30 +} +``` + +--- + +## 테마 + +7가지 내장 테마와 완전 커스텀 테마를 지원합니다. + +| 테마 | 특징 | +|------|------| +| `system` | Windows 다크/라이트 모드 자동 감지 | +| `dark` | 딥 네이비 다크 (기본) | +| `light` | 클린 화이트 라이트 | +| `oled` | 순수 블랙 (OLED 절전) | +| `nord` | Arctic 컬러 팔레트 | +| `monokai` | Sublime Text 스타일 | +| `catppuccin` | Mocha 따뜻한 파스텔 | +| `sepia` | 황갈색 아날로그 감성 | +| `custom` | 14개 색상 완전 커스터마이징 | + +설정 UI(`Ctrl+,` → 테마 탭)에서 클릭 한 번으로 즉시 미리보기 적용. + +--- + +## 변경 이력 + +### v1.6.1 — 전체 점검 수정 + +| 분류 | 내용 | +|------|------| +| 빌드 오류 수정 | `using System.IO` 누락, `Key.Enter`/`Key.Return` 중복 switch 케이스, `EnumDisplayMonitors` 람다 타입 혼합, `icon.ico` 다이아몬드 픽셀 보석 아이콘으로 교체, nullable 역참조 경고 | +| 런타임 버그 수정 | JSON 스킬 경로 파싱(`field[0` 형식 오류 방지), 클립보드 서비스 스레드 안전성, 디바운스 타이머 원자적 교체, 설정 백업 실패 로깅 | +| 보안 수정 | JSON 스킬 `ActionUrl` 실행 전 `http`/`https` 스킴 검증 추가 | +| 데드 코드 제거 | `SystemCommandHandler` no-op `timer`/`alarm` 항목 제거 | + +자세한 내용은 [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md)의 "v1.6 3차 전체 점검 수정" 섹션을 참고하세요. + +--- + +## 라이선스 + +MIT License diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..5d45109 --- /dev/null +++ b/build.bat @@ -0,0 +1,90 @@ +@echo off +chcp 65001 >nul +echo. +echo ======================================== +echo AX Copilot - Build Script +echo ======================================== +echo. + +set APP=src\AxCopilot\AxCopilot.csproj +set ENCRYPTOR=src\AxKeyEncryptor\AxKeyEncryptor.csproj +set OFFLINE=src\AxCopilot.Installer\AxCopilot.Installer.csproj +set OUT=dist + +:: Kill running app +tasklist /FI "IMAGENAME eq AxCopilot.exe" 2>nul | find /i "AxCopilot.exe" >nul +if %ERRORLEVEL%==0 ( + echo [0] Stopping AxCopilot... + taskkill /IM AxCopilot.exe /F >nul 2>nul + timeout /t 2 /nobreak >nul +) +:: Kill legacy process +tasklist /FI "IMAGENAME eq AxCommander.exe" 2>nul | find /i "AxCommander.exe" >nul +if %ERRORLEVEL%==0 ( + echo [0] Stopping legacy AxCommander... + taskkill /IM AxCommander.exe /F >nul 2>nul + timeout /t 2 /nobreak >nul +) + +if exist "%OUT%" rd /s /q "%OUT%" 2>nul +mkdir "%OUT%" +mkdir "%OUT%\AxCopilot" + +:: ======================================== +:: 1. Main app (self-contained, folder) +:: ======================================== +echo [1/4] Building main app (self-contained)... +dotnet publish "%APP%" -c Release -o "%OUT%\AxCopilot" --self-contained true --nologo -v quiet +if %ERRORLEVEL% NEQ 0 ( echo [FAILED] Main app build & pause & exit /b 1 ) +echo OK - dist\AxCopilot\ +echo. + +:: ======================================== +:: 2. AxKeyEncryptor (developer tool) +:: ======================================== +echo [2/4] Building AxKeyEncryptor (WinForms)... +mkdir "%OUT%\AxKeyEncryptor" 2>nul +dotnet publish "%ENCRYPTOR%" -c Release -o "%OUT%\AxKeyEncryptor" --self-contained false --nologo -v quiet +if %ERRORLEVEL% NEQ 0 ( echo [FAILED] AxKeyEncryptor build & pause & exit /b 1 ) +del /q "%OUT%\AxKeyEncryptor\*.pdb" 2>nul +echo OK - dist\AxKeyEncryptor\ +echo. + +:: ======================================== +:: 3. Create payload ZIP for installer +:: ======================================== +echo [3/4] Creating installer payload ZIP... +powershell -NoProfile -Command "Compress-Archive -Path '%OUT%\AxCopilot\*' -DestinationPath 'src\AxCopilot.Installer\payload.zip' -Force" +echo OK - payload.zip +echo. + +:: ======================================== +:: 4. Build installer (.NET Framework 4.8) +:: ======================================== +echo [4/4] Building installer (.NET Framework 4.8)... +dotnet build "%OFFLINE%" -c Release --nologo -v quiet +if %ERRORLEVEL% NEQ 0 ( echo [FAILED] Installer build & pause & exit /b 1 ) +copy /Y "src\AxCopilot.Installer\bin\Release\net48\AxCopilot_Setup.exe" "%OUT%\" >nul +for %%F in ("%OUT%\AxCopilot_Setup.exe") do echo OK - AxCopilot_Setup.exe (%%~zF bytes) +echo. + +:: ======================================== +:: Cleanup +:: ======================================== +:: Remove debug symbols and metadata (anti-decompile) +del /q "%OUT%\*.pdb" 2>nul +del /q "%OUT%\AxCopilot\*.pdb" 2>nul +del /q "%OUT%\AxCopilot\*.xml" 2>nul +del /q "%OUT%\*.deps.json" 2>nul +del /q "%OUT%\*.runtimeconfig.json" 2>nul +del /q "src\AxCopilot.Installer\payload.zip" 2>nul + +echo ======================================== +echo Build Complete! +echo ======================================== +echo. +echo dist\AxCopilot\ Main app (EXE + DLL) +echo dist\AxKeyEncryptor\ Settings Encryptor (dev tool) +echo dist\AxCopilot_Setup.exe Installer (offline, .NET 4.8) +echo. +pause diff --git a/build_output.txt b/build_output.txt new file mode 100644 index 0000000..c5242cd --- /dev/null +++ b/build_output.txt @@ -0,0 +1,14 @@ + 복원할 프로젝트를 확인하는 중... + E:\AX Copilot\src\AxCopilot\AxCopilot.csproj을(를) 1.41초 동안 복원했습니다. + E:\AX Copilot\src\AxCopilot.Tests\AxCopilot.Tests.csproj을(를) 1.41초 동안 복원했습니다. + 복원할 4 프로젝트의 2이(가) 최신 상태입니다. + AxCopilot.SDK -> E:\AX Copilot\src\AxCopilot.SDK\bin\Debug\net8.0-windows\AxCopilot.SDK.dll + AxCopilot -> E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.dll + AxKeyEncryptor -> E:\AX Copilot\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.dll + AxCopilot.Tests -> E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.Tests.dll + +빌드했습니다. + 경고 0개 + 오류 0개 + +경과 시간: 00:00:07.34 diff --git a/dist/AxCopilot/Accessibility.dll b/dist/AxCopilot/Accessibility.dll new file mode 100644 index 0000000..718d330 Binary files /dev/null and b/dist/AxCopilot/Accessibility.dll differ diff --git a/dist/AxCopilot/Assets/SearchEngines/duckduckgo.png b/dist/AxCopilot/Assets/SearchEngines/duckduckgo.png new file mode 100644 index 0000000..64ee943 Binary files /dev/null and b/dist/AxCopilot/Assets/SearchEngines/duckduckgo.png differ diff --git a/dist/AxCopilot/Assets/SearchEngines/github.png b/dist/AxCopilot/Assets/SearchEngines/github.png new file mode 100644 index 0000000..52126e0 Binary files /dev/null and b/dist/AxCopilot/Assets/SearchEngines/github.png differ diff --git a/dist/AxCopilot/Assets/SearchEngines/google.png b/dist/AxCopilot/Assets/SearchEngines/google.png new file mode 100644 index 0000000..8642fc1 Binary files /dev/null and b/dist/AxCopilot/Assets/SearchEngines/google.png differ diff --git a/dist/AxCopilot/Assets/SearchEngines/namuwiki.png b/dist/AxCopilot/Assets/SearchEngines/namuwiki.png new file mode 100644 index 0000000..5423adf Binary files /dev/null and b/dist/AxCopilot/Assets/SearchEngines/namuwiki.png differ diff --git a/dist/AxCopilot/Assets/SearchEngines/naver.png b/dist/AxCopilot/Assets/SearchEngines/naver.png new file mode 100644 index 0000000..020e16d Binary files /dev/null and b/dist/AxCopilot/Assets/SearchEngines/naver.png differ diff --git a/dist/AxCopilot/Assets/SearchEngines/navermap.png b/dist/AxCopilot/Assets/SearchEngines/navermap.png new file mode 100644 index 0000000..9e0bfaf Binary files /dev/null and b/dist/AxCopilot/Assets/SearchEngines/navermap.png differ diff --git a/dist/AxCopilot/Assets/SearchEngines/wikipedia.png b/dist/AxCopilot/Assets/SearchEngines/wikipedia.png new file mode 100644 index 0000000..4405b8d Binary files /dev/null and b/dist/AxCopilot/Assets/SearchEngines/wikipedia.png differ diff --git a/dist/AxCopilot/Assets/SearchEngines/youtube.png b/dist/AxCopilot/Assets/SearchEngines/youtube.png new file mode 100644 index 0000000..c20e1d3 Binary files /dev/null and b/dist/AxCopilot/Assets/SearchEngines/youtube.png differ diff --git a/dist/AxCopilot/Assets/guide_dev.enc b/dist/AxCopilot/Assets/guide_dev.enc new file mode 100644 index 0000000..e798fe5 Binary files /dev/null and b/dist/AxCopilot/Assets/guide_dev.enc differ diff --git a/dist/AxCopilot/Assets/guide_user.enc b/dist/AxCopilot/Assets/guide_user.enc new file mode 100644 index 0000000..d1264f8 Binary files /dev/null and b/dist/AxCopilot/Assets/guide_user.enc differ diff --git a/dist/AxCopilot/Assets/icon.ico b/dist/AxCopilot/Assets/icon.ico new file mode 100644 index 0000000..273db74 Binary files /dev/null and b/dist/AxCopilot/Assets/icon.ico differ diff --git a/dist/AxCopilot/AxCopilot.SDK.dll b/dist/AxCopilot/AxCopilot.SDK.dll new file mode 100644 index 0000000..c1fcb64 Binary files /dev/null and b/dist/AxCopilot/AxCopilot.SDK.dll differ diff --git a/dist/AxCopilot/AxCopilot.deps.json b/dist/AxCopilot/AxCopilot.deps.json new file mode 100644 index 0000000..b6901f3 --- /dev/null +++ b/dist/AxCopilot/AxCopilot.deps.json @@ -0,0 +1,1319 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0/win-x64", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": {}, + ".NETCoreApp,Version=v8.0/win-x64": { + "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", + "Microsoft.Web.WebView2.Core": "1.0.2903.40", + "Microsoft.Web.WebView2.WinForms": "1.0.2903.40", + "Microsoft.Web.WebView2.Wpf": "1.0.2903.40", + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64": "8.0.25", + "runtimepack.Microsoft.WindowsDesktop.App.Runtime.win-x64": "8.0.25" + }, + "runtime": { + "AxCopilot.dll": {} + } + }, + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/8.0.25": { + "runtime": { + "Microsoft.CSharp.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "Microsoft.VisualBasic.Core.dll": { + "assemblyVersion": "13.0.0.0", + "fileVersion": "13.0.2526.11203" + }, + "Microsoft.Win32.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "Microsoft.Win32.Registry.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.AppContext.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Buffers.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.Concurrent.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.Immutable.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.NonGeneric.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.Specialized.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.Annotations.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.DataAnnotations.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.EventBasedAsync.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.TypeConverter.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Configuration.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Console.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Core.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Data.Common.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Data.DataSetExtensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Data.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Contracts.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Debug.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.DiagnosticSource.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.FileVersionInfo.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Process.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.StackTrace.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.TextWriterTraceListener.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Tools.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.TraceSource.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Tracing.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Drawing.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Dynamic.Runtime.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Formats.Asn1.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Formats.Tar.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Globalization.Calendars.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Globalization.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Globalization.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Compression.Brotli.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Compression.FileSystem.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Compression.ZipFile.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Compression.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.DriveInfo.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.Watcher.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.IsolatedStorage.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.MemoryMappedFiles.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Pipes.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Pipes.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.UnmanagedMemoryStream.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Linq.Expressions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Linq.Parallel.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Linq.Queryable.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Linq.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Memory.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Http.Json.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Http.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.HttpListener.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Mail.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.NameResolution.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.NetworkInformation.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Ping.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Quic.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Requests.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Security.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.ServicePoint.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Sockets.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebClient.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebHeaderCollection.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebProxy.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebSockets.Client.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebSockets.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Numerics.Vectors.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Numerics.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ObjectModel.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.CoreLib.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.DataContractSerialization.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.Uri.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.Xml.Linq.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.Xml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.DispatchProxy.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Emit.ILGeneration.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Emit.Lightweight.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Emit.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Metadata.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.TypeExtensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Resources.Reader.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Resources.ResourceManager.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Resources.Writer.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.CompilerServices.VisualC.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Handles.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.InteropServices.JavaScript.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.InteropServices.RuntimeInformation.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.InteropServices.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Intrinsics.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Loader.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Numerics.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.Formatters.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.Json.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.Xml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Claims.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Algorithms.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Cng.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Csp.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Encoding.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.OpenSsl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.X509Certificates.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Principal.Windows.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Principal.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.SecureString.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ServiceModel.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ServiceProcess.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Encoding.CodePages.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Encoding.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Encoding.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Encodings.Web.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Json.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.RegularExpressions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Channels.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Overlapped.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Tasks.Dataflow.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Tasks.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Tasks.Parallel.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Tasks.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Thread.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.ThreadPool.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Timer.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Transactions.Local.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Transactions.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ValueTuple.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Web.HttpUtility.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Windows.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.Linq.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.ReaderWriter.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XDocument.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XPath.XDocument.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XPath.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XmlDocument.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XmlSerializer.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "mscorlib.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "netstandard.dll": { + "assemblyVersion": "2.1.0.0", + "fileVersion": "8.0.2526.11203" + } + }, + "native": { + "Microsoft.DiaSymReader.Native.amd64.dll": { + "fileVersion": "14.42.34436.0" + }, + "System.IO.Compression.Native.dll": { + "fileVersion": "8.0.2526.11203" + }, + "clretwrc.dll": { + "fileVersion": "8.0.2526.11203" + }, + "clrgc.dll": { + "fileVersion": "8.0.2526.11203" + }, + "clrjit.dll": { + "fileVersion": "8.0.2526.11203" + }, + "coreclr.dll": { + "fileVersion": "8.0.2526.11203" + }, + "createdump.exe": { + "fileVersion": "8.0.2526.11203" + }, + "hostfxr.dll": { + "fileVersion": "8.0.2526.11203" + }, + "hostpolicy.dll": { + "fileVersion": "8.0.2526.11203" + }, + "mscordaccore.dll": { + "fileVersion": "8.0.2526.11203" + }, + "mscordaccore_amd64_amd64_8.0.2526.11203.dll": { + "fileVersion": "8.0.2526.11203" + }, + "mscordbi.dll": { + "fileVersion": "8.0.2526.11203" + }, + "mscorrc.dll": { + "fileVersion": "8.0.2526.11203" + }, + "msquic.dll": { + "fileVersion": "2.4.16.0" + } + } + }, + "runtimepack.Microsoft.WindowsDesktop.App.Runtime.win-x64/8.0.25": { + "runtime": { + "Accessibility.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "DirectWriteForwarder.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "Microsoft.VisualBasic.Forms.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "Microsoft.VisualBasic.dll": { + "assemblyVersion": "10.1.0.0", + "fileVersion": "8.0.2526.11204" + }, + "Microsoft.Win32.Registry.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "Microsoft.Win32.SystemEvents.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "PresentationCore.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemCore.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemData.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemDrawing.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemXml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemXmlLinq.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Aero.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Aero2.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.AeroLite.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Classic.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Luna.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Royale.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationUI.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "ReachFramework.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.CodeDom.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Configuration.ConfigurationManager.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Design.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Diagnostics.EventLog.Messages.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "0.0.0.0" + }, + "System.Diagnostics.EventLog.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.PerformanceCounter.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.DirectoryServices.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Drawing.Common.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Drawing.Design.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Drawing.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.IO.Packaging.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Printing.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Resources.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Pkcs.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.ProtectedData.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Xml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Permissions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Windows.Controls.Ribbon.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Windows.Forms.Design.Editors.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Forms.Design.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Forms.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Forms.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Input.Manipulations.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Presentation.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Xaml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "UIAutomationClient.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "UIAutomationClientSideProviders.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "UIAutomationProvider.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "UIAutomationTypes.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "WindowsBase.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "WindowsFormsIntegration.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + } + }, + "native": { + "D3DCompiler_47_cor3.dll": { + "fileVersion": "10.0.26100.6901" + }, + "PenImc_cor3.dll": { + "fileVersion": "8.0.2526.11204" + }, + "PresentationNative_cor3.dll": { + "fileVersion": "8.0.25.61506" + }, + "vcruntime140_cor3.dll": { + "fileVersion": "14.44.35211.0" + }, + "wpfgfx_cor3.dll": { + "fileVersion": "8.0.2526.11204" + } + } + }, + "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": { + "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.ServiceProcess.ServiceController/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.7.2": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/8.0.25": { + "type": "runtimepack", + "serviceable": false, + "sha512": "" + }, + "runtimepack.Microsoft.WindowsDesktop.App.Runtime.win-x64/8.0.25": { + "type": "runtimepack", + "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.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": "" + } + }, + "runtimes": { + "win-x64": [ + "win", + "any", + "base" + ] + } +} \ No newline at end of file diff --git a/dist/AxCopilot/AxCopilot.dll b/dist/AxCopilot/AxCopilot.dll new file mode 100644 index 0000000..90d236f Binary files /dev/null and b/dist/AxCopilot/AxCopilot.dll differ diff --git a/dist/AxCopilot/AxCopilot.exe b/dist/AxCopilot/AxCopilot.exe new file mode 100644 index 0000000..96dbd2c Binary files /dev/null and b/dist/AxCopilot/AxCopilot.exe differ diff --git a/dist/AxCopilot/AxCopilot.runtimeconfig.json b/dist/AxCopilot/AxCopilot.runtimeconfig.json new file mode 100644 index 0000000..524daea --- /dev/null +++ b/dist/AxCopilot/AxCopilot.runtimeconfig.json @@ -0,0 +1,19 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "includedFrameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "8.0.25" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "8.0.25" + } + ], + "configProperties": { + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false + } + } +} \ No newline at end of file diff --git a/dist/AxCopilot/D3DCompiler_47_cor3.dll b/dist/AxCopilot/D3DCompiler_47_cor3.dll new file mode 100644 index 0000000..ef8ac8c Binary files /dev/null and b/dist/AxCopilot/D3DCompiler_47_cor3.dll differ diff --git a/dist/AxCopilot/DirectWriteForwarder.dll b/dist/AxCopilot/DirectWriteForwarder.dll new file mode 100644 index 0000000..f9d1933 Binary files /dev/null and b/dist/AxCopilot/DirectWriteForwarder.dll differ diff --git a/dist/AxCopilot/DocumentFormat.OpenXml.Framework.dll b/dist/AxCopilot/DocumentFormat.OpenXml.Framework.dll new file mode 100644 index 0000000..f9f3da9 Binary files /dev/null and b/dist/AxCopilot/DocumentFormat.OpenXml.Framework.dll differ diff --git a/dist/AxCopilot/DocumentFormat.OpenXml.dll b/dist/AxCopilot/DocumentFormat.OpenXml.dll new file mode 100644 index 0000000..fc7bada Binary files /dev/null and b/dist/AxCopilot/DocumentFormat.OpenXml.dll differ diff --git a/dist/AxCopilot/Markdig.dll b/dist/AxCopilot/Markdig.dll new file mode 100644 index 0000000..4931e93 Binary files /dev/null and b/dist/AxCopilot/Markdig.dll differ diff --git a/dist/AxCopilot/Microsoft.CSharp.dll b/dist/AxCopilot/Microsoft.CSharp.dll new file mode 100644 index 0000000..80d592c Binary files /dev/null and b/dist/AxCopilot/Microsoft.CSharp.dll differ diff --git a/dist/AxCopilot/Microsoft.Data.Sqlite.dll b/dist/AxCopilot/Microsoft.Data.Sqlite.dll new file mode 100644 index 0000000..c5fef6d Binary files /dev/null and b/dist/AxCopilot/Microsoft.Data.Sqlite.dll differ diff --git a/dist/AxCopilot/Microsoft.DiaSymReader.Native.amd64.dll b/dist/AxCopilot/Microsoft.DiaSymReader.Native.amd64.dll new file mode 100644 index 0000000..92b355b Binary files /dev/null and b/dist/AxCopilot/Microsoft.DiaSymReader.Native.amd64.dll differ diff --git a/dist/AxCopilot/Microsoft.VisualBasic.Core.dll b/dist/AxCopilot/Microsoft.VisualBasic.Core.dll new file mode 100644 index 0000000..87b1964 Binary files /dev/null and b/dist/AxCopilot/Microsoft.VisualBasic.Core.dll differ diff --git a/dist/AxCopilot/Microsoft.VisualBasic.Forms.dll b/dist/AxCopilot/Microsoft.VisualBasic.Forms.dll new file mode 100644 index 0000000..12a1be7 Binary files /dev/null and b/dist/AxCopilot/Microsoft.VisualBasic.Forms.dll differ diff --git a/dist/AxCopilot/Microsoft.VisualBasic.dll b/dist/AxCopilot/Microsoft.VisualBasic.dll new file mode 100644 index 0000000..69c4a13 Binary files /dev/null and b/dist/AxCopilot/Microsoft.VisualBasic.dll differ diff --git a/dist/AxCopilot/Microsoft.Web.WebView2.Core.dll b/dist/AxCopilot/Microsoft.Web.WebView2.Core.dll new file mode 100644 index 0000000..4a27877 Binary files /dev/null and b/dist/AxCopilot/Microsoft.Web.WebView2.Core.dll differ diff --git a/dist/AxCopilot/Microsoft.Web.WebView2.WinForms.dll b/dist/AxCopilot/Microsoft.Web.WebView2.WinForms.dll new file mode 100644 index 0000000..b2d08ad Binary files /dev/null and b/dist/AxCopilot/Microsoft.Web.WebView2.WinForms.dll differ diff --git a/dist/AxCopilot/Microsoft.Web.WebView2.Wpf.dll b/dist/AxCopilot/Microsoft.Web.WebView2.Wpf.dll new file mode 100644 index 0000000..ed79cd9 Binary files /dev/null and b/dist/AxCopilot/Microsoft.Web.WebView2.Wpf.dll differ diff --git a/dist/AxCopilot/Microsoft.Win32.Primitives.dll b/dist/AxCopilot/Microsoft.Win32.Primitives.dll new file mode 100644 index 0000000..de80f4f Binary files /dev/null and b/dist/AxCopilot/Microsoft.Win32.Primitives.dll differ diff --git a/dist/AxCopilot/Microsoft.Win32.Registry.AccessControl.dll b/dist/AxCopilot/Microsoft.Win32.Registry.AccessControl.dll new file mode 100644 index 0000000..cb43e37 Binary files /dev/null and b/dist/AxCopilot/Microsoft.Win32.Registry.AccessControl.dll differ diff --git a/dist/AxCopilot/Microsoft.Win32.Registry.dll b/dist/AxCopilot/Microsoft.Win32.Registry.dll new file mode 100644 index 0000000..180bfcd Binary files /dev/null and b/dist/AxCopilot/Microsoft.Win32.Registry.dll differ diff --git a/dist/AxCopilot/Microsoft.Win32.SystemEvents.dll b/dist/AxCopilot/Microsoft.Win32.SystemEvents.dll new file mode 100644 index 0000000..9da2cae Binary files /dev/null and b/dist/AxCopilot/Microsoft.Win32.SystemEvents.dll differ diff --git a/dist/AxCopilot/PenImc_cor3.dll b/dist/AxCopilot/PenImc_cor3.dll new file mode 100644 index 0000000..9490687 Binary files /dev/null and b/dist/AxCopilot/PenImc_cor3.dll differ diff --git a/dist/AxCopilot/PresentationCore.dll b/dist/AxCopilot/PresentationCore.dll new file mode 100644 index 0000000..8da7479 Binary files /dev/null and b/dist/AxCopilot/PresentationCore.dll differ diff --git a/dist/AxCopilot/PresentationFramework-SystemCore.dll b/dist/AxCopilot/PresentationFramework-SystemCore.dll new file mode 100644 index 0000000..5954507 Binary files /dev/null and b/dist/AxCopilot/PresentationFramework-SystemCore.dll differ diff --git a/dist/AxCopilot/PresentationFramework-SystemData.dll b/dist/AxCopilot/PresentationFramework-SystemData.dll new file mode 100644 index 0000000..cc53a1c Binary files /dev/null and b/dist/AxCopilot/PresentationFramework-SystemData.dll differ diff --git a/dist/AxCopilot/PresentationFramework-SystemDrawing.dll b/dist/AxCopilot/PresentationFramework-SystemDrawing.dll new file mode 100644 index 0000000..0ea9322 Binary files /dev/null and b/dist/AxCopilot/PresentationFramework-SystemDrawing.dll differ diff --git a/dist/AxCopilot/PresentationFramework-SystemXml.dll b/dist/AxCopilot/PresentationFramework-SystemXml.dll new file mode 100644 index 0000000..3b661b8 Binary files /dev/null and b/dist/AxCopilot/PresentationFramework-SystemXml.dll differ diff --git a/dist/AxCopilot/PresentationFramework-SystemXmlLinq.dll b/dist/AxCopilot/PresentationFramework-SystemXmlLinq.dll new file mode 100644 index 0000000..252c653 Binary files /dev/null and b/dist/AxCopilot/PresentationFramework-SystemXmlLinq.dll differ diff --git a/dist/AxCopilot/PresentationFramework.Aero.dll b/dist/AxCopilot/PresentationFramework.Aero.dll new file mode 100644 index 0000000..4e6ac9b Binary files /dev/null and b/dist/AxCopilot/PresentationFramework.Aero.dll differ diff --git a/dist/AxCopilot/PresentationFramework.Aero2.dll b/dist/AxCopilot/PresentationFramework.Aero2.dll new file mode 100644 index 0000000..f9608ee Binary files /dev/null and b/dist/AxCopilot/PresentationFramework.Aero2.dll differ diff --git a/dist/AxCopilot/PresentationFramework.AeroLite.dll b/dist/AxCopilot/PresentationFramework.AeroLite.dll new file mode 100644 index 0000000..5b58d6e Binary files /dev/null and b/dist/AxCopilot/PresentationFramework.AeroLite.dll differ diff --git a/dist/AxCopilot/PresentationFramework.Classic.dll b/dist/AxCopilot/PresentationFramework.Classic.dll new file mode 100644 index 0000000..0c1bee8 Binary files /dev/null and b/dist/AxCopilot/PresentationFramework.Classic.dll differ diff --git a/dist/AxCopilot/PresentationFramework.Luna.dll b/dist/AxCopilot/PresentationFramework.Luna.dll new file mode 100644 index 0000000..cf290b4 Binary files /dev/null and b/dist/AxCopilot/PresentationFramework.Luna.dll differ diff --git a/dist/AxCopilot/PresentationFramework.Royale.dll b/dist/AxCopilot/PresentationFramework.Royale.dll new file mode 100644 index 0000000..86e73c5 Binary files /dev/null and b/dist/AxCopilot/PresentationFramework.Royale.dll differ diff --git a/dist/AxCopilot/PresentationFramework.dll b/dist/AxCopilot/PresentationFramework.dll new file mode 100644 index 0000000..437bee9 Binary files /dev/null and b/dist/AxCopilot/PresentationFramework.dll differ diff --git a/dist/AxCopilot/PresentationNative_cor3.dll b/dist/AxCopilot/PresentationNative_cor3.dll new file mode 100644 index 0000000..589a8ee Binary files /dev/null and b/dist/AxCopilot/PresentationNative_cor3.dll differ diff --git a/dist/AxCopilot/PresentationUI.dll b/dist/AxCopilot/PresentationUI.dll new file mode 100644 index 0000000..e39b9f8 Binary files /dev/null and b/dist/AxCopilot/PresentationUI.dll differ diff --git a/dist/AxCopilot/ReachFramework.dll b/dist/AxCopilot/ReachFramework.dll new file mode 100644 index 0000000..fa651eb Binary files /dev/null and b/dist/AxCopilot/ReachFramework.dll differ diff --git a/dist/AxCopilot/SQLitePCLRaw.batteries_v2.dll b/dist/AxCopilot/SQLitePCLRaw.batteries_v2.dll new file mode 100644 index 0000000..f9eb46b Binary files /dev/null and b/dist/AxCopilot/SQLitePCLRaw.batteries_v2.dll differ diff --git a/dist/AxCopilot/SQLitePCLRaw.core.dll b/dist/AxCopilot/SQLitePCLRaw.core.dll new file mode 100644 index 0000000..556d40f Binary files /dev/null and b/dist/AxCopilot/SQLitePCLRaw.core.dll differ diff --git a/dist/AxCopilot/SQLitePCLRaw.provider.e_sqlite3.dll b/dist/AxCopilot/SQLitePCLRaw.provider.e_sqlite3.dll new file mode 100644 index 0000000..a6df9a6 Binary files /dev/null and b/dist/AxCopilot/SQLitePCLRaw.provider.e_sqlite3.dll differ diff --git a/dist/AxCopilot/System.AppContext.dll b/dist/AxCopilot/System.AppContext.dll new file mode 100644 index 0000000..a7e6dd0 Binary files /dev/null and b/dist/AxCopilot/System.AppContext.dll differ diff --git a/dist/AxCopilot/System.Buffers.dll b/dist/AxCopilot/System.Buffers.dll new file mode 100644 index 0000000..9f017b1 Binary files /dev/null and b/dist/AxCopilot/System.Buffers.dll differ diff --git a/dist/AxCopilot/System.CodeDom.dll b/dist/AxCopilot/System.CodeDom.dll new file mode 100644 index 0000000..f6e3693 Binary files /dev/null and b/dist/AxCopilot/System.CodeDom.dll differ diff --git a/dist/AxCopilot/System.Collections.Concurrent.dll b/dist/AxCopilot/System.Collections.Concurrent.dll new file mode 100644 index 0000000..5a5d56a Binary files /dev/null and b/dist/AxCopilot/System.Collections.Concurrent.dll differ diff --git a/dist/AxCopilot/System.Collections.Immutable.dll b/dist/AxCopilot/System.Collections.Immutable.dll new file mode 100644 index 0000000..ea74832 Binary files /dev/null and b/dist/AxCopilot/System.Collections.Immutable.dll differ diff --git a/dist/AxCopilot/System.Collections.NonGeneric.dll b/dist/AxCopilot/System.Collections.NonGeneric.dll new file mode 100644 index 0000000..ac7b3f3 Binary files /dev/null and b/dist/AxCopilot/System.Collections.NonGeneric.dll differ diff --git a/dist/AxCopilot/System.Collections.Specialized.dll b/dist/AxCopilot/System.Collections.Specialized.dll new file mode 100644 index 0000000..7859a23 Binary files /dev/null and b/dist/AxCopilot/System.Collections.Specialized.dll differ diff --git a/dist/AxCopilot/System.Collections.dll b/dist/AxCopilot/System.Collections.dll new file mode 100644 index 0000000..8a97ac3 Binary files /dev/null and b/dist/AxCopilot/System.Collections.dll differ diff --git a/dist/AxCopilot/System.ComponentModel.Annotations.dll b/dist/AxCopilot/System.ComponentModel.Annotations.dll new file mode 100644 index 0000000..6f3147b Binary files /dev/null and b/dist/AxCopilot/System.ComponentModel.Annotations.dll differ diff --git a/dist/AxCopilot/System.ComponentModel.DataAnnotations.dll b/dist/AxCopilot/System.ComponentModel.DataAnnotations.dll new file mode 100644 index 0000000..4fa8f4b Binary files /dev/null and b/dist/AxCopilot/System.ComponentModel.DataAnnotations.dll differ diff --git a/dist/AxCopilot/System.ComponentModel.EventBasedAsync.dll b/dist/AxCopilot/System.ComponentModel.EventBasedAsync.dll new file mode 100644 index 0000000..662a7cc Binary files /dev/null and b/dist/AxCopilot/System.ComponentModel.EventBasedAsync.dll differ diff --git a/dist/AxCopilot/System.ComponentModel.Primitives.dll b/dist/AxCopilot/System.ComponentModel.Primitives.dll new file mode 100644 index 0000000..0e8048f Binary files /dev/null and b/dist/AxCopilot/System.ComponentModel.Primitives.dll differ diff --git a/dist/AxCopilot/System.ComponentModel.TypeConverter.dll b/dist/AxCopilot/System.ComponentModel.TypeConverter.dll new file mode 100644 index 0000000..b466c2c Binary files /dev/null and b/dist/AxCopilot/System.ComponentModel.TypeConverter.dll differ diff --git a/dist/AxCopilot/System.ComponentModel.dll b/dist/AxCopilot/System.ComponentModel.dll new file mode 100644 index 0000000..61445ca Binary files /dev/null and b/dist/AxCopilot/System.ComponentModel.dll differ diff --git a/dist/AxCopilot/System.Configuration.ConfigurationManager.dll b/dist/AxCopilot/System.Configuration.ConfigurationManager.dll new file mode 100644 index 0000000..4cd2a7e Binary files /dev/null and b/dist/AxCopilot/System.Configuration.ConfigurationManager.dll differ diff --git a/dist/AxCopilot/System.Configuration.dll b/dist/AxCopilot/System.Configuration.dll new file mode 100644 index 0000000..782d3bf Binary files /dev/null and b/dist/AxCopilot/System.Configuration.dll differ diff --git a/dist/AxCopilot/System.Console.dll b/dist/AxCopilot/System.Console.dll new file mode 100644 index 0000000..8b2d00c Binary files /dev/null and b/dist/AxCopilot/System.Console.dll differ diff --git a/dist/AxCopilot/System.Core.dll b/dist/AxCopilot/System.Core.dll new file mode 100644 index 0000000..64d4621 Binary files /dev/null and b/dist/AxCopilot/System.Core.dll differ diff --git a/dist/AxCopilot/System.Data.Common.dll b/dist/AxCopilot/System.Data.Common.dll new file mode 100644 index 0000000..0d79229 Binary files /dev/null and b/dist/AxCopilot/System.Data.Common.dll differ diff --git a/dist/AxCopilot/System.Data.DataSetExtensions.dll b/dist/AxCopilot/System.Data.DataSetExtensions.dll new file mode 100644 index 0000000..24a10a8 Binary files /dev/null and b/dist/AxCopilot/System.Data.DataSetExtensions.dll differ diff --git a/dist/AxCopilot/System.Data.dll b/dist/AxCopilot/System.Data.dll new file mode 100644 index 0000000..d03eba7 Binary files /dev/null and b/dist/AxCopilot/System.Data.dll differ diff --git a/dist/AxCopilot/System.Design.dll b/dist/AxCopilot/System.Design.dll new file mode 100644 index 0000000..be5a5dc Binary files /dev/null and b/dist/AxCopilot/System.Design.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.Contracts.dll b/dist/AxCopilot/System.Diagnostics.Contracts.dll new file mode 100644 index 0000000..c72d41f Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.Contracts.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.Debug.dll b/dist/AxCopilot/System.Diagnostics.Debug.dll new file mode 100644 index 0000000..3204c5f Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.Debug.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.DiagnosticSource.dll b/dist/AxCopilot/System.Diagnostics.DiagnosticSource.dll new file mode 100644 index 0000000..7765fff Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.DiagnosticSource.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.EventLog.Messages.dll b/dist/AxCopilot/System.Diagnostics.EventLog.Messages.dll new file mode 100644 index 0000000..8352119 Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.EventLog.Messages.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.EventLog.dll b/dist/AxCopilot/System.Diagnostics.EventLog.dll new file mode 100644 index 0000000..a6b646e Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.EventLog.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.FileVersionInfo.dll b/dist/AxCopilot/System.Diagnostics.FileVersionInfo.dll new file mode 100644 index 0000000..0a96c36 Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.FileVersionInfo.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.PerformanceCounter.dll b/dist/AxCopilot/System.Diagnostics.PerformanceCounter.dll new file mode 100644 index 0000000..ffb6dc1 Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.PerformanceCounter.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.Process.dll b/dist/AxCopilot/System.Diagnostics.Process.dll new file mode 100644 index 0000000..83c80bd Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.Process.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.StackTrace.dll b/dist/AxCopilot/System.Diagnostics.StackTrace.dll new file mode 100644 index 0000000..190a45b Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.StackTrace.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.TextWriterTraceListener.dll b/dist/AxCopilot/System.Diagnostics.TextWriterTraceListener.dll new file mode 100644 index 0000000..eacf93b Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.TextWriterTraceListener.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.Tools.dll b/dist/AxCopilot/System.Diagnostics.Tools.dll new file mode 100644 index 0000000..4bc3799 Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.Tools.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.TraceSource.dll b/dist/AxCopilot/System.Diagnostics.TraceSource.dll new file mode 100644 index 0000000..5235685 Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.TraceSource.dll differ diff --git a/dist/AxCopilot/System.Diagnostics.Tracing.dll b/dist/AxCopilot/System.Diagnostics.Tracing.dll new file mode 100644 index 0000000..9d5a6f1 Binary files /dev/null and b/dist/AxCopilot/System.Diagnostics.Tracing.dll differ diff --git a/dist/AxCopilot/System.DirectoryServices.dll b/dist/AxCopilot/System.DirectoryServices.dll new file mode 100644 index 0000000..91201f9 Binary files /dev/null and b/dist/AxCopilot/System.DirectoryServices.dll differ diff --git a/dist/AxCopilot/System.Drawing.Common.dll b/dist/AxCopilot/System.Drawing.Common.dll new file mode 100644 index 0000000..c7c7349 Binary files /dev/null and b/dist/AxCopilot/System.Drawing.Common.dll differ diff --git a/dist/AxCopilot/System.Drawing.Design.dll b/dist/AxCopilot/System.Drawing.Design.dll new file mode 100644 index 0000000..fc2d666 Binary files /dev/null and b/dist/AxCopilot/System.Drawing.Design.dll differ diff --git a/dist/AxCopilot/System.Drawing.Primitives.dll b/dist/AxCopilot/System.Drawing.Primitives.dll new file mode 100644 index 0000000..64b81ae Binary files /dev/null and b/dist/AxCopilot/System.Drawing.Primitives.dll differ diff --git a/dist/AxCopilot/System.Drawing.dll b/dist/AxCopilot/System.Drawing.dll new file mode 100644 index 0000000..1307b8b Binary files /dev/null and b/dist/AxCopilot/System.Drawing.dll differ diff --git a/dist/AxCopilot/System.Dynamic.Runtime.dll b/dist/AxCopilot/System.Dynamic.Runtime.dll new file mode 100644 index 0000000..d9e24c5 Binary files /dev/null and b/dist/AxCopilot/System.Dynamic.Runtime.dll differ diff --git a/dist/AxCopilot/System.Formats.Asn1.dll b/dist/AxCopilot/System.Formats.Asn1.dll new file mode 100644 index 0000000..e094803 Binary files /dev/null and b/dist/AxCopilot/System.Formats.Asn1.dll differ diff --git a/dist/AxCopilot/System.Formats.Tar.dll b/dist/AxCopilot/System.Formats.Tar.dll new file mode 100644 index 0000000..1230561 Binary files /dev/null and b/dist/AxCopilot/System.Formats.Tar.dll differ diff --git a/dist/AxCopilot/System.Globalization.Calendars.dll b/dist/AxCopilot/System.Globalization.Calendars.dll new file mode 100644 index 0000000..9b3821b Binary files /dev/null and b/dist/AxCopilot/System.Globalization.Calendars.dll differ diff --git a/dist/AxCopilot/System.Globalization.Extensions.dll b/dist/AxCopilot/System.Globalization.Extensions.dll new file mode 100644 index 0000000..8d1e39b Binary files /dev/null and b/dist/AxCopilot/System.Globalization.Extensions.dll differ diff --git a/dist/AxCopilot/System.Globalization.dll b/dist/AxCopilot/System.Globalization.dll new file mode 100644 index 0000000..aceb317 Binary files /dev/null and b/dist/AxCopilot/System.Globalization.dll differ diff --git a/dist/AxCopilot/System.IO.Compression.Brotli.dll b/dist/AxCopilot/System.IO.Compression.Brotli.dll new file mode 100644 index 0000000..38c445d Binary files /dev/null and b/dist/AxCopilot/System.IO.Compression.Brotli.dll differ diff --git a/dist/AxCopilot/System.IO.Compression.FileSystem.dll b/dist/AxCopilot/System.IO.Compression.FileSystem.dll new file mode 100644 index 0000000..6adbf64 Binary files /dev/null and b/dist/AxCopilot/System.IO.Compression.FileSystem.dll differ diff --git a/dist/AxCopilot/System.IO.Compression.Native.dll b/dist/AxCopilot/System.IO.Compression.Native.dll new file mode 100644 index 0000000..2e60b93 Binary files /dev/null and b/dist/AxCopilot/System.IO.Compression.Native.dll differ diff --git a/dist/AxCopilot/System.IO.Compression.ZipFile.dll b/dist/AxCopilot/System.IO.Compression.ZipFile.dll new file mode 100644 index 0000000..85fada0 Binary files /dev/null and b/dist/AxCopilot/System.IO.Compression.ZipFile.dll differ diff --git a/dist/AxCopilot/System.IO.Compression.dll b/dist/AxCopilot/System.IO.Compression.dll new file mode 100644 index 0000000..790716f Binary files /dev/null and b/dist/AxCopilot/System.IO.Compression.dll differ diff --git a/dist/AxCopilot/System.IO.FileSystem.AccessControl.dll b/dist/AxCopilot/System.IO.FileSystem.AccessControl.dll new file mode 100644 index 0000000..4c3e64d Binary files /dev/null and b/dist/AxCopilot/System.IO.FileSystem.AccessControl.dll differ diff --git a/dist/AxCopilot/System.IO.FileSystem.DriveInfo.dll b/dist/AxCopilot/System.IO.FileSystem.DriveInfo.dll new file mode 100644 index 0000000..882e082 Binary files /dev/null and b/dist/AxCopilot/System.IO.FileSystem.DriveInfo.dll differ diff --git a/dist/AxCopilot/System.IO.FileSystem.Primitives.dll b/dist/AxCopilot/System.IO.FileSystem.Primitives.dll new file mode 100644 index 0000000..902567f Binary files /dev/null and b/dist/AxCopilot/System.IO.FileSystem.Primitives.dll differ diff --git a/dist/AxCopilot/System.IO.FileSystem.Watcher.dll b/dist/AxCopilot/System.IO.FileSystem.Watcher.dll new file mode 100644 index 0000000..909de72 Binary files /dev/null and b/dist/AxCopilot/System.IO.FileSystem.Watcher.dll differ diff --git a/dist/AxCopilot/System.IO.FileSystem.dll b/dist/AxCopilot/System.IO.FileSystem.dll new file mode 100644 index 0000000..ef3f38f Binary files /dev/null and b/dist/AxCopilot/System.IO.FileSystem.dll differ diff --git a/dist/AxCopilot/System.IO.IsolatedStorage.dll b/dist/AxCopilot/System.IO.IsolatedStorage.dll new file mode 100644 index 0000000..3e73992 Binary files /dev/null and b/dist/AxCopilot/System.IO.IsolatedStorage.dll differ diff --git a/dist/AxCopilot/System.IO.MemoryMappedFiles.dll b/dist/AxCopilot/System.IO.MemoryMappedFiles.dll new file mode 100644 index 0000000..43756aa Binary files /dev/null and b/dist/AxCopilot/System.IO.MemoryMappedFiles.dll differ diff --git a/dist/AxCopilot/System.IO.Packaging.dll b/dist/AxCopilot/System.IO.Packaging.dll new file mode 100644 index 0000000..617e201 Binary files /dev/null and b/dist/AxCopilot/System.IO.Packaging.dll differ diff --git a/dist/AxCopilot/System.IO.Pipes.AccessControl.dll b/dist/AxCopilot/System.IO.Pipes.AccessControl.dll new file mode 100644 index 0000000..617b9cd Binary files /dev/null and b/dist/AxCopilot/System.IO.Pipes.AccessControl.dll differ diff --git a/dist/AxCopilot/System.IO.Pipes.dll b/dist/AxCopilot/System.IO.Pipes.dll new file mode 100644 index 0000000..b6fa8eb Binary files /dev/null and b/dist/AxCopilot/System.IO.Pipes.dll differ diff --git a/dist/AxCopilot/System.IO.UnmanagedMemoryStream.dll b/dist/AxCopilot/System.IO.UnmanagedMemoryStream.dll new file mode 100644 index 0000000..91ade0c Binary files /dev/null and b/dist/AxCopilot/System.IO.UnmanagedMemoryStream.dll differ diff --git a/dist/AxCopilot/System.IO.dll b/dist/AxCopilot/System.IO.dll new file mode 100644 index 0000000..3529768 Binary files /dev/null and b/dist/AxCopilot/System.IO.dll differ diff --git a/dist/AxCopilot/System.Linq.Expressions.dll b/dist/AxCopilot/System.Linq.Expressions.dll new file mode 100644 index 0000000..e3f4697 Binary files /dev/null and b/dist/AxCopilot/System.Linq.Expressions.dll differ diff --git a/dist/AxCopilot/System.Linq.Parallel.dll b/dist/AxCopilot/System.Linq.Parallel.dll new file mode 100644 index 0000000..adc335a Binary files /dev/null and b/dist/AxCopilot/System.Linq.Parallel.dll differ diff --git a/dist/AxCopilot/System.Linq.Queryable.dll b/dist/AxCopilot/System.Linq.Queryable.dll new file mode 100644 index 0000000..e276a00 Binary files /dev/null and b/dist/AxCopilot/System.Linq.Queryable.dll differ diff --git a/dist/AxCopilot/System.Linq.dll b/dist/AxCopilot/System.Linq.dll new file mode 100644 index 0000000..e9b9ddf Binary files /dev/null and b/dist/AxCopilot/System.Linq.dll differ diff --git a/dist/AxCopilot/System.Memory.dll b/dist/AxCopilot/System.Memory.dll new file mode 100644 index 0000000..9c836e8 Binary files /dev/null and b/dist/AxCopilot/System.Memory.dll differ diff --git a/dist/AxCopilot/System.Net.Http.Json.dll b/dist/AxCopilot/System.Net.Http.Json.dll new file mode 100644 index 0000000..f1d682c Binary files /dev/null and b/dist/AxCopilot/System.Net.Http.Json.dll differ diff --git a/dist/AxCopilot/System.Net.Http.dll b/dist/AxCopilot/System.Net.Http.dll new file mode 100644 index 0000000..f03455b Binary files /dev/null and b/dist/AxCopilot/System.Net.Http.dll differ diff --git a/dist/AxCopilot/System.Net.HttpListener.dll b/dist/AxCopilot/System.Net.HttpListener.dll new file mode 100644 index 0000000..bd42e7b Binary files /dev/null and b/dist/AxCopilot/System.Net.HttpListener.dll differ diff --git a/dist/AxCopilot/System.Net.Mail.dll b/dist/AxCopilot/System.Net.Mail.dll new file mode 100644 index 0000000..c8b57ca Binary files /dev/null and b/dist/AxCopilot/System.Net.Mail.dll differ diff --git a/dist/AxCopilot/System.Net.NameResolution.dll b/dist/AxCopilot/System.Net.NameResolution.dll new file mode 100644 index 0000000..1235e88 Binary files /dev/null and b/dist/AxCopilot/System.Net.NameResolution.dll differ diff --git a/dist/AxCopilot/System.Net.NetworkInformation.dll b/dist/AxCopilot/System.Net.NetworkInformation.dll new file mode 100644 index 0000000..a493fa2 Binary files /dev/null and b/dist/AxCopilot/System.Net.NetworkInformation.dll differ diff --git a/dist/AxCopilot/System.Net.Ping.dll b/dist/AxCopilot/System.Net.Ping.dll new file mode 100644 index 0000000..cfb9833 Binary files /dev/null and b/dist/AxCopilot/System.Net.Ping.dll differ diff --git a/dist/AxCopilot/System.Net.Primitives.dll b/dist/AxCopilot/System.Net.Primitives.dll new file mode 100644 index 0000000..ca6eabd Binary files /dev/null and b/dist/AxCopilot/System.Net.Primitives.dll differ diff --git a/dist/AxCopilot/System.Net.Quic.dll b/dist/AxCopilot/System.Net.Quic.dll new file mode 100644 index 0000000..cf938d8 Binary files /dev/null and b/dist/AxCopilot/System.Net.Quic.dll differ diff --git a/dist/AxCopilot/System.Net.Requests.dll b/dist/AxCopilot/System.Net.Requests.dll new file mode 100644 index 0000000..58e3d6d Binary files /dev/null and b/dist/AxCopilot/System.Net.Requests.dll differ diff --git a/dist/AxCopilot/System.Net.Security.dll b/dist/AxCopilot/System.Net.Security.dll new file mode 100644 index 0000000..cd7e9c6 Binary files /dev/null and b/dist/AxCopilot/System.Net.Security.dll differ diff --git a/dist/AxCopilot/System.Net.ServicePoint.dll b/dist/AxCopilot/System.Net.ServicePoint.dll new file mode 100644 index 0000000..4c5aa19 Binary files /dev/null and b/dist/AxCopilot/System.Net.ServicePoint.dll differ diff --git a/dist/AxCopilot/System.Net.Sockets.dll b/dist/AxCopilot/System.Net.Sockets.dll new file mode 100644 index 0000000..e152432 Binary files /dev/null and b/dist/AxCopilot/System.Net.Sockets.dll differ diff --git a/dist/AxCopilot/System.Net.WebClient.dll b/dist/AxCopilot/System.Net.WebClient.dll new file mode 100644 index 0000000..a60c500 Binary files /dev/null and b/dist/AxCopilot/System.Net.WebClient.dll differ diff --git a/dist/AxCopilot/System.Net.WebHeaderCollection.dll b/dist/AxCopilot/System.Net.WebHeaderCollection.dll new file mode 100644 index 0000000..35f2511 Binary files /dev/null and b/dist/AxCopilot/System.Net.WebHeaderCollection.dll differ diff --git a/dist/AxCopilot/System.Net.WebProxy.dll b/dist/AxCopilot/System.Net.WebProxy.dll new file mode 100644 index 0000000..0f3fa06 Binary files /dev/null and b/dist/AxCopilot/System.Net.WebProxy.dll differ diff --git a/dist/AxCopilot/System.Net.WebSockets.Client.dll b/dist/AxCopilot/System.Net.WebSockets.Client.dll new file mode 100644 index 0000000..712555d Binary files /dev/null and b/dist/AxCopilot/System.Net.WebSockets.Client.dll differ diff --git a/dist/AxCopilot/System.Net.WebSockets.dll b/dist/AxCopilot/System.Net.WebSockets.dll new file mode 100644 index 0000000..afceb08 Binary files /dev/null and b/dist/AxCopilot/System.Net.WebSockets.dll differ diff --git a/dist/AxCopilot/System.Net.dll b/dist/AxCopilot/System.Net.dll new file mode 100644 index 0000000..784b9a6 Binary files /dev/null and b/dist/AxCopilot/System.Net.dll differ diff --git a/dist/AxCopilot/System.Numerics.Vectors.dll b/dist/AxCopilot/System.Numerics.Vectors.dll new file mode 100644 index 0000000..55ae19a Binary files /dev/null and b/dist/AxCopilot/System.Numerics.Vectors.dll differ diff --git a/dist/AxCopilot/System.Numerics.dll b/dist/AxCopilot/System.Numerics.dll new file mode 100644 index 0000000..25d0431 Binary files /dev/null and b/dist/AxCopilot/System.Numerics.dll differ diff --git a/dist/AxCopilot/System.ObjectModel.dll b/dist/AxCopilot/System.ObjectModel.dll new file mode 100644 index 0000000..d3a65af Binary files /dev/null and b/dist/AxCopilot/System.ObjectModel.dll differ diff --git a/dist/AxCopilot/System.Printing.dll b/dist/AxCopilot/System.Printing.dll new file mode 100644 index 0000000..552ab94 Binary files /dev/null and b/dist/AxCopilot/System.Printing.dll differ diff --git a/dist/AxCopilot/System.Private.CoreLib.dll b/dist/AxCopilot/System.Private.CoreLib.dll new file mode 100644 index 0000000..36bda7f Binary files /dev/null and b/dist/AxCopilot/System.Private.CoreLib.dll differ diff --git a/dist/AxCopilot/System.Private.DataContractSerialization.dll b/dist/AxCopilot/System.Private.DataContractSerialization.dll new file mode 100644 index 0000000..34e3226 Binary files /dev/null and b/dist/AxCopilot/System.Private.DataContractSerialization.dll differ diff --git a/dist/AxCopilot/System.Private.Uri.dll b/dist/AxCopilot/System.Private.Uri.dll new file mode 100644 index 0000000..b66b207 Binary files /dev/null and b/dist/AxCopilot/System.Private.Uri.dll differ diff --git a/dist/AxCopilot/System.Private.Xml.Linq.dll b/dist/AxCopilot/System.Private.Xml.Linq.dll new file mode 100644 index 0000000..93c8df2 Binary files /dev/null and b/dist/AxCopilot/System.Private.Xml.Linq.dll differ diff --git a/dist/AxCopilot/System.Private.Xml.dll b/dist/AxCopilot/System.Private.Xml.dll new file mode 100644 index 0000000..51bb5bb Binary files /dev/null and b/dist/AxCopilot/System.Private.Xml.dll differ diff --git a/dist/AxCopilot/System.Reflection.DispatchProxy.dll b/dist/AxCopilot/System.Reflection.DispatchProxy.dll new file mode 100644 index 0000000..2434e6c Binary files /dev/null and b/dist/AxCopilot/System.Reflection.DispatchProxy.dll differ diff --git a/dist/AxCopilot/System.Reflection.Emit.ILGeneration.dll b/dist/AxCopilot/System.Reflection.Emit.ILGeneration.dll new file mode 100644 index 0000000..68aca7b Binary files /dev/null and b/dist/AxCopilot/System.Reflection.Emit.ILGeneration.dll differ diff --git a/dist/AxCopilot/System.Reflection.Emit.Lightweight.dll b/dist/AxCopilot/System.Reflection.Emit.Lightweight.dll new file mode 100644 index 0000000..92d7c90 Binary files /dev/null and b/dist/AxCopilot/System.Reflection.Emit.Lightweight.dll differ diff --git a/dist/AxCopilot/System.Reflection.Emit.dll b/dist/AxCopilot/System.Reflection.Emit.dll new file mode 100644 index 0000000..8fe5fa5 Binary files /dev/null and b/dist/AxCopilot/System.Reflection.Emit.dll differ diff --git a/dist/AxCopilot/System.Reflection.Extensions.dll b/dist/AxCopilot/System.Reflection.Extensions.dll new file mode 100644 index 0000000..c3a8857 Binary files /dev/null and b/dist/AxCopilot/System.Reflection.Extensions.dll differ diff --git a/dist/AxCopilot/System.Reflection.Metadata.dll b/dist/AxCopilot/System.Reflection.Metadata.dll new file mode 100644 index 0000000..d049735 Binary files /dev/null and b/dist/AxCopilot/System.Reflection.Metadata.dll differ diff --git a/dist/AxCopilot/System.Reflection.Primitives.dll b/dist/AxCopilot/System.Reflection.Primitives.dll new file mode 100644 index 0000000..41e0870 Binary files /dev/null and b/dist/AxCopilot/System.Reflection.Primitives.dll differ diff --git a/dist/AxCopilot/System.Reflection.TypeExtensions.dll b/dist/AxCopilot/System.Reflection.TypeExtensions.dll new file mode 100644 index 0000000..551b4a2 Binary files /dev/null and b/dist/AxCopilot/System.Reflection.TypeExtensions.dll differ diff --git a/dist/AxCopilot/System.Reflection.dll b/dist/AxCopilot/System.Reflection.dll new file mode 100644 index 0000000..c59a93c Binary files /dev/null and b/dist/AxCopilot/System.Reflection.dll differ diff --git a/dist/AxCopilot/System.Resources.Extensions.dll b/dist/AxCopilot/System.Resources.Extensions.dll new file mode 100644 index 0000000..a700817 Binary files /dev/null and b/dist/AxCopilot/System.Resources.Extensions.dll differ diff --git a/dist/AxCopilot/System.Resources.Reader.dll b/dist/AxCopilot/System.Resources.Reader.dll new file mode 100644 index 0000000..4d822aa Binary files /dev/null and b/dist/AxCopilot/System.Resources.Reader.dll differ diff --git a/dist/AxCopilot/System.Resources.ResourceManager.dll b/dist/AxCopilot/System.Resources.ResourceManager.dll new file mode 100644 index 0000000..4b23690 Binary files /dev/null and b/dist/AxCopilot/System.Resources.ResourceManager.dll differ diff --git a/dist/AxCopilot/System.Resources.Writer.dll b/dist/AxCopilot/System.Resources.Writer.dll new file mode 100644 index 0000000..c0fb9ba Binary files /dev/null and b/dist/AxCopilot/System.Resources.Writer.dll differ diff --git a/dist/AxCopilot/System.Runtime.CompilerServices.Unsafe.dll b/dist/AxCopilot/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 0000000..ff0dc2f Binary files /dev/null and b/dist/AxCopilot/System.Runtime.CompilerServices.Unsafe.dll differ diff --git a/dist/AxCopilot/System.Runtime.CompilerServices.VisualC.dll b/dist/AxCopilot/System.Runtime.CompilerServices.VisualC.dll new file mode 100644 index 0000000..d67ab9d Binary files /dev/null and b/dist/AxCopilot/System.Runtime.CompilerServices.VisualC.dll differ diff --git a/dist/AxCopilot/System.Runtime.Extensions.dll b/dist/AxCopilot/System.Runtime.Extensions.dll new file mode 100644 index 0000000..1833bfd Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Extensions.dll differ diff --git a/dist/AxCopilot/System.Runtime.Handles.dll b/dist/AxCopilot/System.Runtime.Handles.dll new file mode 100644 index 0000000..6f38e17 Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Handles.dll differ diff --git a/dist/AxCopilot/System.Runtime.InteropServices.JavaScript.dll b/dist/AxCopilot/System.Runtime.InteropServices.JavaScript.dll new file mode 100644 index 0000000..ad30f0b Binary files /dev/null and b/dist/AxCopilot/System.Runtime.InteropServices.JavaScript.dll differ diff --git a/dist/AxCopilot/System.Runtime.InteropServices.RuntimeInformation.dll b/dist/AxCopilot/System.Runtime.InteropServices.RuntimeInformation.dll new file mode 100644 index 0000000..795446c Binary files /dev/null and b/dist/AxCopilot/System.Runtime.InteropServices.RuntimeInformation.dll differ diff --git a/dist/AxCopilot/System.Runtime.InteropServices.dll b/dist/AxCopilot/System.Runtime.InteropServices.dll new file mode 100644 index 0000000..701d77e Binary files /dev/null and b/dist/AxCopilot/System.Runtime.InteropServices.dll differ diff --git a/dist/AxCopilot/System.Runtime.Intrinsics.dll b/dist/AxCopilot/System.Runtime.Intrinsics.dll new file mode 100644 index 0000000..f581073 Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Intrinsics.dll differ diff --git a/dist/AxCopilot/System.Runtime.Loader.dll b/dist/AxCopilot/System.Runtime.Loader.dll new file mode 100644 index 0000000..087e3bd Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Loader.dll differ diff --git a/dist/AxCopilot/System.Runtime.Numerics.dll b/dist/AxCopilot/System.Runtime.Numerics.dll new file mode 100644 index 0000000..2cc48fd Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Numerics.dll differ diff --git a/dist/AxCopilot/System.Runtime.Serialization.Formatters.dll b/dist/AxCopilot/System.Runtime.Serialization.Formatters.dll new file mode 100644 index 0000000..602d383 Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Serialization.Formatters.dll differ diff --git a/dist/AxCopilot/System.Runtime.Serialization.Json.dll b/dist/AxCopilot/System.Runtime.Serialization.Json.dll new file mode 100644 index 0000000..3708322 Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Serialization.Json.dll differ diff --git a/dist/AxCopilot/System.Runtime.Serialization.Primitives.dll b/dist/AxCopilot/System.Runtime.Serialization.Primitives.dll new file mode 100644 index 0000000..b2d6736 Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Serialization.Primitives.dll differ diff --git a/dist/AxCopilot/System.Runtime.Serialization.Xml.dll b/dist/AxCopilot/System.Runtime.Serialization.Xml.dll new file mode 100644 index 0000000..4ef2d71 Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Serialization.Xml.dll differ diff --git a/dist/AxCopilot/System.Runtime.Serialization.dll b/dist/AxCopilot/System.Runtime.Serialization.dll new file mode 100644 index 0000000..8190f35 Binary files /dev/null and b/dist/AxCopilot/System.Runtime.Serialization.dll differ diff --git a/dist/AxCopilot/System.Runtime.dll b/dist/AxCopilot/System.Runtime.dll new file mode 100644 index 0000000..ebc8ec5 Binary files /dev/null and b/dist/AxCopilot/System.Runtime.dll differ diff --git a/dist/AxCopilot/System.Security.AccessControl.dll b/dist/AxCopilot/System.Security.AccessControl.dll new file mode 100644 index 0000000..d7538ae Binary files /dev/null and b/dist/AxCopilot/System.Security.AccessControl.dll differ diff --git a/dist/AxCopilot/System.Security.Claims.dll b/dist/AxCopilot/System.Security.Claims.dll new file mode 100644 index 0000000..a151774 Binary files /dev/null and b/dist/AxCopilot/System.Security.Claims.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.Algorithms.dll b/dist/AxCopilot/System.Security.Cryptography.Algorithms.dll new file mode 100644 index 0000000..dbbbf89 Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.Algorithms.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.Cng.dll b/dist/AxCopilot/System.Security.Cryptography.Cng.dll new file mode 100644 index 0000000..22102fb Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.Cng.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.Csp.dll b/dist/AxCopilot/System.Security.Cryptography.Csp.dll new file mode 100644 index 0000000..a1df139 Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.Csp.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.Encoding.dll b/dist/AxCopilot/System.Security.Cryptography.Encoding.dll new file mode 100644 index 0000000..6dd3126 Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.Encoding.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.OpenSsl.dll b/dist/AxCopilot/System.Security.Cryptography.OpenSsl.dll new file mode 100644 index 0000000..4982518 Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.OpenSsl.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.Pkcs.dll b/dist/AxCopilot/System.Security.Cryptography.Pkcs.dll new file mode 100644 index 0000000..8a7904c Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.Pkcs.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.Primitives.dll b/dist/AxCopilot/System.Security.Cryptography.Primitives.dll new file mode 100644 index 0000000..1460f3a Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.Primitives.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.ProtectedData.dll b/dist/AxCopilot/System.Security.Cryptography.ProtectedData.dll new file mode 100644 index 0000000..92c8443 Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.ProtectedData.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.X509Certificates.dll b/dist/AxCopilot/System.Security.Cryptography.X509Certificates.dll new file mode 100644 index 0000000..aa18299 Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.X509Certificates.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.Xml.dll b/dist/AxCopilot/System.Security.Cryptography.Xml.dll new file mode 100644 index 0000000..69e9ced Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.Xml.dll differ diff --git a/dist/AxCopilot/System.Security.Cryptography.dll b/dist/AxCopilot/System.Security.Cryptography.dll new file mode 100644 index 0000000..ee20249 Binary files /dev/null and b/dist/AxCopilot/System.Security.Cryptography.dll differ diff --git a/dist/AxCopilot/System.Security.Permissions.dll b/dist/AxCopilot/System.Security.Permissions.dll new file mode 100644 index 0000000..3a28e02 Binary files /dev/null and b/dist/AxCopilot/System.Security.Permissions.dll differ diff --git a/dist/AxCopilot/System.Security.Principal.Windows.dll b/dist/AxCopilot/System.Security.Principal.Windows.dll new file mode 100644 index 0000000..f94b887 Binary files /dev/null and b/dist/AxCopilot/System.Security.Principal.Windows.dll differ diff --git a/dist/AxCopilot/System.Security.Principal.dll b/dist/AxCopilot/System.Security.Principal.dll new file mode 100644 index 0000000..f23385d Binary files /dev/null and b/dist/AxCopilot/System.Security.Principal.dll differ diff --git a/dist/AxCopilot/System.Security.SecureString.dll b/dist/AxCopilot/System.Security.SecureString.dll new file mode 100644 index 0000000..b63afdb Binary files /dev/null and b/dist/AxCopilot/System.Security.SecureString.dll differ diff --git a/dist/AxCopilot/System.Security.dll b/dist/AxCopilot/System.Security.dll new file mode 100644 index 0000000..1162897 Binary files /dev/null and b/dist/AxCopilot/System.Security.dll differ diff --git a/dist/AxCopilot/System.ServiceModel.Web.dll b/dist/AxCopilot/System.ServiceModel.Web.dll new file mode 100644 index 0000000..5f068f0 Binary files /dev/null and b/dist/AxCopilot/System.ServiceModel.Web.dll differ diff --git a/dist/AxCopilot/System.ServiceProcess.ServiceController.dll b/dist/AxCopilot/System.ServiceProcess.ServiceController.dll new file mode 100644 index 0000000..0d456dc Binary files /dev/null and b/dist/AxCopilot/System.ServiceProcess.ServiceController.dll differ diff --git a/dist/AxCopilot/System.ServiceProcess.dll b/dist/AxCopilot/System.ServiceProcess.dll new file mode 100644 index 0000000..6cd3c48 Binary files /dev/null and b/dist/AxCopilot/System.ServiceProcess.dll differ diff --git a/dist/AxCopilot/System.Text.Encoding.CodePages.dll b/dist/AxCopilot/System.Text.Encoding.CodePages.dll new file mode 100644 index 0000000..dfdbae0 Binary files /dev/null and b/dist/AxCopilot/System.Text.Encoding.CodePages.dll differ diff --git a/dist/AxCopilot/System.Text.Encoding.Extensions.dll b/dist/AxCopilot/System.Text.Encoding.Extensions.dll new file mode 100644 index 0000000..fd38716 Binary files /dev/null and b/dist/AxCopilot/System.Text.Encoding.Extensions.dll differ diff --git a/dist/AxCopilot/System.Text.Encoding.dll b/dist/AxCopilot/System.Text.Encoding.dll new file mode 100644 index 0000000..1692a09 Binary files /dev/null and b/dist/AxCopilot/System.Text.Encoding.dll differ diff --git a/dist/AxCopilot/System.Text.Encodings.Web.dll b/dist/AxCopilot/System.Text.Encodings.Web.dll new file mode 100644 index 0000000..c390b7a Binary files /dev/null and b/dist/AxCopilot/System.Text.Encodings.Web.dll differ diff --git a/dist/AxCopilot/System.Text.Json.dll b/dist/AxCopilot/System.Text.Json.dll new file mode 100644 index 0000000..baa8bd8 Binary files /dev/null and b/dist/AxCopilot/System.Text.Json.dll differ diff --git a/dist/AxCopilot/System.Text.RegularExpressions.dll b/dist/AxCopilot/System.Text.RegularExpressions.dll new file mode 100644 index 0000000..846c96a Binary files /dev/null and b/dist/AxCopilot/System.Text.RegularExpressions.dll differ diff --git a/dist/AxCopilot/System.Threading.AccessControl.dll b/dist/AxCopilot/System.Threading.AccessControl.dll new file mode 100644 index 0000000..0c4607b Binary files /dev/null and b/dist/AxCopilot/System.Threading.AccessControl.dll differ diff --git a/dist/AxCopilot/System.Threading.Channels.dll b/dist/AxCopilot/System.Threading.Channels.dll new file mode 100644 index 0000000..a5cd341 Binary files /dev/null and b/dist/AxCopilot/System.Threading.Channels.dll differ diff --git a/dist/AxCopilot/System.Threading.Overlapped.dll b/dist/AxCopilot/System.Threading.Overlapped.dll new file mode 100644 index 0000000..99aabcc Binary files /dev/null and b/dist/AxCopilot/System.Threading.Overlapped.dll differ diff --git a/dist/AxCopilot/System.Threading.Tasks.Dataflow.dll b/dist/AxCopilot/System.Threading.Tasks.Dataflow.dll new file mode 100644 index 0000000..4d54125 Binary files /dev/null and b/dist/AxCopilot/System.Threading.Tasks.Dataflow.dll differ diff --git a/dist/AxCopilot/System.Threading.Tasks.Extensions.dll b/dist/AxCopilot/System.Threading.Tasks.Extensions.dll new file mode 100644 index 0000000..382799b Binary files /dev/null and b/dist/AxCopilot/System.Threading.Tasks.Extensions.dll differ diff --git a/dist/AxCopilot/System.Threading.Tasks.Parallel.dll b/dist/AxCopilot/System.Threading.Tasks.Parallel.dll new file mode 100644 index 0000000..b5da743 Binary files /dev/null and b/dist/AxCopilot/System.Threading.Tasks.Parallel.dll differ diff --git a/dist/AxCopilot/System.Threading.Tasks.dll b/dist/AxCopilot/System.Threading.Tasks.dll new file mode 100644 index 0000000..af8605e Binary files /dev/null and b/dist/AxCopilot/System.Threading.Tasks.dll differ diff --git a/dist/AxCopilot/System.Threading.Thread.dll b/dist/AxCopilot/System.Threading.Thread.dll new file mode 100644 index 0000000..dbff2e7 Binary files /dev/null and b/dist/AxCopilot/System.Threading.Thread.dll differ diff --git a/dist/AxCopilot/System.Threading.ThreadPool.dll b/dist/AxCopilot/System.Threading.ThreadPool.dll new file mode 100644 index 0000000..7756839 Binary files /dev/null and b/dist/AxCopilot/System.Threading.ThreadPool.dll differ diff --git a/dist/AxCopilot/System.Threading.Timer.dll b/dist/AxCopilot/System.Threading.Timer.dll new file mode 100644 index 0000000..aa09082 Binary files /dev/null and b/dist/AxCopilot/System.Threading.Timer.dll differ diff --git a/dist/AxCopilot/System.Threading.dll b/dist/AxCopilot/System.Threading.dll new file mode 100644 index 0000000..2ca4f95 Binary files /dev/null and b/dist/AxCopilot/System.Threading.dll differ diff --git a/dist/AxCopilot/System.Transactions.Local.dll b/dist/AxCopilot/System.Transactions.Local.dll new file mode 100644 index 0000000..4933bda Binary files /dev/null and b/dist/AxCopilot/System.Transactions.Local.dll differ diff --git a/dist/AxCopilot/System.Transactions.dll b/dist/AxCopilot/System.Transactions.dll new file mode 100644 index 0000000..aef014e Binary files /dev/null and b/dist/AxCopilot/System.Transactions.dll differ diff --git a/dist/AxCopilot/System.ValueTuple.dll b/dist/AxCopilot/System.ValueTuple.dll new file mode 100644 index 0000000..a8011a9 Binary files /dev/null and b/dist/AxCopilot/System.ValueTuple.dll differ diff --git a/dist/AxCopilot/System.Web.HttpUtility.dll b/dist/AxCopilot/System.Web.HttpUtility.dll new file mode 100644 index 0000000..8c3a6df Binary files /dev/null and b/dist/AxCopilot/System.Web.HttpUtility.dll differ diff --git a/dist/AxCopilot/System.Web.dll b/dist/AxCopilot/System.Web.dll new file mode 100644 index 0000000..ef0e4fb Binary files /dev/null and b/dist/AxCopilot/System.Web.dll differ diff --git a/dist/AxCopilot/System.Windows.Controls.Ribbon.dll b/dist/AxCopilot/System.Windows.Controls.Ribbon.dll new file mode 100644 index 0000000..aeb56c1 Binary files /dev/null and b/dist/AxCopilot/System.Windows.Controls.Ribbon.dll differ diff --git a/dist/AxCopilot/System.Windows.Extensions.dll b/dist/AxCopilot/System.Windows.Extensions.dll new file mode 100644 index 0000000..0dfdb84 Binary files /dev/null and b/dist/AxCopilot/System.Windows.Extensions.dll differ diff --git a/dist/AxCopilot/System.Windows.Forms.Design.Editors.dll b/dist/AxCopilot/System.Windows.Forms.Design.Editors.dll new file mode 100644 index 0000000..e138158 Binary files /dev/null and b/dist/AxCopilot/System.Windows.Forms.Design.Editors.dll differ diff --git a/dist/AxCopilot/System.Windows.Forms.Design.dll b/dist/AxCopilot/System.Windows.Forms.Design.dll new file mode 100644 index 0000000..ba52c7a Binary files /dev/null and b/dist/AxCopilot/System.Windows.Forms.Design.dll differ diff --git a/dist/AxCopilot/System.Windows.Forms.Primitives.dll b/dist/AxCopilot/System.Windows.Forms.Primitives.dll new file mode 100644 index 0000000..1dd9d98 Binary files /dev/null and b/dist/AxCopilot/System.Windows.Forms.Primitives.dll differ diff --git a/dist/AxCopilot/System.Windows.Forms.dll b/dist/AxCopilot/System.Windows.Forms.dll new file mode 100644 index 0000000..55839c5 Binary files /dev/null and b/dist/AxCopilot/System.Windows.Forms.dll differ diff --git a/dist/AxCopilot/System.Windows.Input.Manipulations.dll b/dist/AxCopilot/System.Windows.Input.Manipulations.dll new file mode 100644 index 0000000..b6c6336 Binary files /dev/null and b/dist/AxCopilot/System.Windows.Input.Manipulations.dll differ diff --git a/dist/AxCopilot/System.Windows.Presentation.dll b/dist/AxCopilot/System.Windows.Presentation.dll new file mode 100644 index 0000000..a6c4b7c Binary files /dev/null and b/dist/AxCopilot/System.Windows.Presentation.dll differ diff --git a/dist/AxCopilot/System.Windows.dll b/dist/AxCopilot/System.Windows.dll new file mode 100644 index 0000000..ed41971 Binary files /dev/null and b/dist/AxCopilot/System.Windows.dll differ diff --git a/dist/AxCopilot/System.Xaml.dll b/dist/AxCopilot/System.Xaml.dll new file mode 100644 index 0000000..b2ebc05 Binary files /dev/null and b/dist/AxCopilot/System.Xaml.dll differ diff --git a/dist/AxCopilot/System.Xml.Linq.dll b/dist/AxCopilot/System.Xml.Linq.dll new file mode 100644 index 0000000..f0e5359 Binary files /dev/null and b/dist/AxCopilot/System.Xml.Linq.dll differ diff --git a/dist/AxCopilot/System.Xml.ReaderWriter.dll b/dist/AxCopilot/System.Xml.ReaderWriter.dll new file mode 100644 index 0000000..142a4b8 Binary files /dev/null and b/dist/AxCopilot/System.Xml.ReaderWriter.dll differ diff --git a/dist/AxCopilot/System.Xml.Serialization.dll b/dist/AxCopilot/System.Xml.Serialization.dll new file mode 100644 index 0000000..03b1af8 Binary files /dev/null and b/dist/AxCopilot/System.Xml.Serialization.dll differ diff --git a/dist/AxCopilot/System.Xml.XDocument.dll b/dist/AxCopilot/System.Xml.XDocument.dll new file mode 100644 index 0000000..ec3ced5 Binary files /dev/null and b/dist/AxCopilot/System.Xml.XDocument.dll differ diff --git a/dist/AxCopilot/System.Xml.XPath.XDocument.dll b/dist/AxCopilot/System.Xml.XPath.XDocument.dll new file mode 100644 index 0000000..b289bf4 Binary files /dev/null and b/dist/AxCopilot/System.Xml.XPath.XDocument.dll differ diff --git a/dist/AxCopilot/System.Xml.XPath.dll b/dist/AxCopilot/System.Xml.XPath.dll new file mode 100644 index 0000000..0a78e48 Binary files /dev/null and b/dist/AxCopilot/System.Xml.XPath.dll differ diff --git a/dist/AxCopilot/System.Xml.XmlDocument.dll b/dist/AxCopilot/System.Xml.XmlDocument.dll new file mode 100644 index 0000000..1e89458 Binary files /dev/null and b/dist/AxCopilot/System.Xml.XmlDocument.dll differ diff --git a/dist/AxCopilot/System.Xml.XmlSerializer.dll b/dist/AxCopilot/System.Xml.XmlSerializer.dll new file mode 100644 index 0000000..8a12e58 Binary files /dev/null and b/dist/AxCopilot/System.Xml.XmlSerializer.dll differ diff --git a/dist/AxCopilot/System.Xml.dll b/dist/AxCopilot/System.Xml.dll new file mode 100644 index 0000000..86de56b Binary files /dev/null and b/dist/AxCopilot/System.Xml.dll differ diff --git a/dist/AxCopilot/System.dll b/dist/AxCopilot/System.dll new file mode 100644 index 0000000..5d47261 Binary files /dev/null and b/dist/AxCopilot/System.dll differ diff --git a/dist/AxCopilot/UIAutomationClient.dll b/dist/AxCopilot/UIAutomationClient.dll new file mode 100644 index 0000000..c13f402 Binary files /dev/null and b/dist/AxCopilot/UIAutomationClient.dll differ diff --git a/dist/AxCopilot/UIAutomationClientSideProviders.dll b/dist/AxCopilot/UIAutomationClientSideProviders.dll new file mode 100644 index 0000000..d6b93d9 Binary files /dev/null and b/dist/AxCopilot/UIAutomationClientSideProviders.dll differ diff --git a/dist/AxCopilot/UIAutomationProvider.dll b/dist/AxCopilot/UIAutomationProvider.dll new file mode 100644 index 0000000..2778581 Binary files /dev/null and b/dist/AxCopilot/UIAutomationProvider.dll differ diff --git a/dist/AxCopilot/UIAutomationTypes.dll b/dist/AxCopilot/UIAutomationTypes.dll new file mode 100644 index 0000000..4af390f Binary files /dev/null and b/dist/AxCopilot/UIAutomationTypes.dll differ diff --git a/dist/AxCopilot/UglyToad.PdfPig.Core.dll b/dist/AxCopilot/UglyToad.PdfPig.Core.dll new file mode 100644 index 0000000..d623133 Binary files /dev/null and b/dist/AxCopilot/UglyToad.PdfPig.Core.dll differ diff --git a/dist/AxCopilot/UglyToad.PdfPig.Fonts.dll b/dist/AxCopilot/UglyToad.PdfPig.Fonts.dll new file mode 100644 index 0000000..444918b Binary files /dev/null and b/dist/AxCopilot/UglyToad.PdfPig.Fonts.dll differ diff --git a/dist/AxCopilot/UglyToad.PdfPig.Tokenization.dll b/dist/AxCopilot/UglyToad.PdfPig.Tokenization.dll new file mode 100644 index 0000000..a9b3be9 Binary files /dev/null and b/dist/AxCopilot/UglyToad.PdfPig.Tokenization.dll differ diff --git a/dist/AxCopilot/UglyToad.PdfPig.Tokens.dll b/dist/AxCopilot/UglyToad.PdfPig.Tokens.dll new file mode 100644 index 0000000..7595fb6 Binary files /dev/null and b/dist/AxCopilot/UglyToad.PdfPig.Tokens.dll differ diff --git a/dist/AxCopilot/UglyToad.PdfPig.dll b/dist/AxCopilot/UglyToad.PdfPig.dll new file mode 100644 index 0000000..3645736 Binary files /dev/null and b/dist/AxCopilot/UglyToad.PdfPig.dll differ diff --git a/dist/AxCopilot/WebView2Loader.dll b/dist/AxCopilot/WebView2Loader.dll new file mode 100644 index 0000000..983ee32 Binary files /dev/null and b/dist/AxCopilot/WebView2Loader.dll differ diff --git a/dist/AxCopilot/WindowsBase.dll b/dist/AxCopilot/WindowsBase.dll new file mode 100644 index 0000000..d45700b Binary files /dev/null and b/dist/AxCopilot/WindowsBase.dll differ diff --git a/dist/AxCopilot/WindowsFormsIntegration.dll b/dist/AxCopilot/WindowsFormsIntegration.dll new file mode 100644 index 0000000..b7ac5eb Binary files /dev/null and b/dist/AxCopilot/WindowsFormsIntegration.dll differ diff --git a/dist/AxCopilot/clretwrc.dll b/dist/AxCopilot/clretwrc.dll new file mode 100644 index 0000000..ce4bd4d Binary files /dev/null and b/dist/AxCopilot/clretwrc.dll differ diff --git a/dist/AxCopilot/clrgc.dll b/dist/AxCopilot/clrgc.dll new file mode 100644 index 0000000..b8ec919 Binary files /dev/null and b/dist/AxCopilot/clrgc.dll differ diff --git a/dist/AxCopilot/clrjit.dll b/dist/AxCopilot/clrjit.dll new file mode 100644 index 0000000..1bf755b Binary files /dev/null and b/dist/AxCopilot/clrjit.dll differ diff --git a/dist/AxCopilot/coreclr.dll b/dist/AxCopilot/coreclr.dll new file mode 100644 index 0000000..aaf3f0b Binary files /dev/null and b/dist/AxCopilot/coreclr.dll differ diff --git a/dist/AxCopilot/createdump.exe b/dist/AxCopilot/createdump.exe new file mode 100644 index 0000000..5fc263f Binary files /dev/null and b/dist/AxCopilot/createdump.exe differ diff --git a/dist/AxCopilot/cs/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/cs/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..62ad696 Binary files /dev/null and b/dist/AxCopilot/cs/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/cs/PresentationCore.resources.dll b/dist/AxCopilot/cs/PresentationCore.resources.dll new file mode 100644 index 0000000..36d7a55 Binary files /dev/null and b/dist/AxCopilot/cs/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/cs/PresentationFramework.resources.dll b/dist/AxCopilot/cs/PresentationFramework.resources.dll new file mode 100644 index 0000000..5519562 Binary files /dev/null and b/dist/AxCopilot/cs/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/cs/PresentationUI.resources.dll b/dist/AxCopilot/cs/PresentationUI.resources.dll new file mode 100644 index 0000000..dcd3c7b Binary files /dev/null and b/dist/AxCopilot/cs/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/cs/ReachFramework.resources.dll b/dist/AxCopilot/cs/ReachFramework.resources.dll new file mode 100644 index 0000000..7937899 Binary files /dev/null and b/dist/AxCopilot/cs/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/cs/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/cs/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..3f5adbf Binary files /dev/null and b/dist/AxCopilot/cs/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/cs/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/cs/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..14cf7c6 Binary files /dev/null and b/dist/AxCopilot/cs/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/cs/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/cs/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..a92056b Binary files /dev/null and b/dist/AxCopilot/cs/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/cs/System.Windows.Forms.resources.dll b/dist/AxCopilot/cs/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..bfa9d56 Binary files /dev/null and b/dist/AxCopilot/cs/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/cs/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/cs/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..a6501d1 Binary files /dev/null and b/dist/AxCopilot/cs/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/cs/System.Xaml.resources.dll b/dist/AxCopilot/cs/System.Xaml.resources.dll new file mode 100644 index 0000000..67d647b Binary files /dev/null and b/dist/AxCopilot/cs/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/cs/UIAutomationClient.resources.dll b/dist/AxCopilot/cs/UIAutomationClient.resources.dll new file mode 100644 index 0000000..ef83908 Binary files /dev/null and b/dist/AxCopilot/cs/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/cs/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/cs/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..5298cf9 Binary files /dev/null and b/dist/AxCopilot/cs/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/cs/UIAutomationProvider.resources.dll b/dist/AxCopilot/cs/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..256616a Binary files /dev/null and b/dist/AxCopilot/cs/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/cs/UIAutomationTypes.resources.dll b/dist/AxCopilot/cs/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..23230b4 Binary files /dev/null and b/dist/AxCopilot/cs/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/cs/WindowsBase.resources.dll b/dist/AxCopilot/cs/WindowsBase.resources.dll new file mode 100644 index 0000000..c4ea203 Binary files /dev/null and b/dist/AxCopilot/cs/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/cs/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/cs/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..b69c9ea Binary files /dev/null and b/dist/AxCopilot/cs/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/de/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/de/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..a4b80de Binary files /dev/null and b/dist/AxCopilot/de/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/de/PresentationCore.resources.dll b/dist/AxCopilot/de/PresentationCore.resources.dll new file mode 100644 index 0000000..c0d85b1 Binary files /dev/null and b/dist/AxCopilot/de/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/de/PresentationFramework.resources.dll b/dist/AxCopilot/de/PresentationFramework.resources.dll new file mode 100644 index 0000000..ec00067 Binary files /dev/null and b/dist/AxCopilot/de/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/de/PresentationUI.resources.dll b/dist/AxCopilot/de/PresentationUI.resources.dll new file mode 100644 index 0000000..5916466 Binary files /dev/null and b/dist/AxCopilot/de/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/de/ReachFramework.resources.dll b/dist/AxCopilot/de/ReachFramework.resources.dll new file mode 100644 index 0000000..58b499a Binary files /dev/null and b/dist/AxCopilot/de/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/de/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/de/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..272392e Binary files /dev/null and b/dist/AxCopilot/de/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/de/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/de/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..effac2e Binary files /dev/null and b/dist/AxCopilot/de/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/de/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/de/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..6f74b1b Binary files /dev/null and b/dist/AxCopilot/de/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/de/System.Windows.Forms.resources.dll b/dist/AxCopilot/de/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..5251820 Binary files /dev/null and b/dist/AxCopilot/de/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/de/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/de/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..9dad3c3 Binary files /dev/null and b/dist/AxCopilot/de/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/de/System.Xaml.resources.dll b/dist/AxCopilot/de/System.Xaml.resources.dll new file mode 100644 index 0000000..9114dfb Binary files /dev/null and b/dist/AxCopilot/de/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/de/UIAutomationClient.resources.dll b/dist/AxCopilot/de/UIAutomationClient.resources.dll new file mode 100644 index 0000000..0de7e45 Binary files /dev/null and b/dist/AxCopilot/de/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/de/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/de/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..32b7476 Binary files /dev/null and b/dist/AxCopilot/de/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/de/UIAutomationProvider.resources.dll b/dist/AxCopilot/de/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..99b4612 Binary files /dev/null and b/dist/AxCopilot/de/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/de/UIAutomationTypes.resources.dll b/dist/AxCopilot/de/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..7305c8d Binary files /dev/null and b/dist/AxCopilot/de/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/de/WindowsBase.resources.dll b/dist/AxCopilot/de/WindowsBase.resources.dll new file mode 100644 index 0000000..59b20e0 Binary files /dev/null and b/dist/AxCopilot/de/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/de/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/de/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..cb90b33 Binary files /dev/null and b/dist/AxCopilot/de/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/e_sqlite3.dll b/dist/AxCopilot/e_sqlite3.dll new file mode 100644 index 0000000..379665c Binary files /dev/null and b/dist/AxCopilot/e_sqlite3.dll differ diff --git a/dist/AxCopilot/es/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/es/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..8a3e906 Binary files /dev/null and b/dist/AxCopilot/es/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/es/PresentationCore.resources.dll b/dist/AxCopilot/es/PresentationCore.resources.dll new file mode 100644 index 0000000..c1de376 Binary files /dev/null and b/dist/AxCopilot/es/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/es/PresentationFramework.resources.dll b/dist/AxCopilot/es/PresentationFramework.resources.dll new file mode 100644 index 0000000..b5d422e Binary files /dev/null and b/dist/AxCopilot/es/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/es/PresentationUI.resources.dll b/dist/AxCopilot/es/PresentationUI.resources.dll new file mode 100644 index 0000000..7a06348 Binary files /dev/null and b/dist/AxCopilot/es/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/es/ReachFramework.resources.dll b/dist/AxCopilot/es/ReachFramework.resources.dll new file mode 100644 index 0000000..2c67bd1 Binary files /dev/null and b/dist/AxCopilot/es/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/es/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/es/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..10431f2 Binary files /dev/null and b/dist/AxCopilot/es/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/es/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/es/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..a3ebe05 Binary files /dev/null and b/dist/AxCopilot/es/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/es/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/es/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..6fbf528 Binary files /dev/null and b/dist/AxCopilot/es/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/es/System.Windows.Forms.resources.dll b/dist/AxCopilot/es/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..491b5fc Binary files /dev/null and b/dist/AxCopilot/es/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/es/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/es/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..13b6d11 Binary files /dev/null and b/dist/AxCopilot/es/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/es/System.Xaml.resources.dll b/dist/AxCopilot/es/System.Xaml.resources.dll new file mode 100644 index 0000000..ae10076 Binary files /dev/null and b/dist/AxCopilot/es/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/es/UIAutomationClient.resources.dll b/dist/AxCopilot/es/UIAutomationClient.resources.dll new file mode 100644 index 0000000..723d0c8 Binary files /dev/null and b/dist/AxCopilot/es/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/es/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/es/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..fc3f43a Binary files /dev/null and b/dist/AxCopilot/es/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/es/UIAutomationProvider.resources.dll b/dist/AxCopilot/es/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..3df29f2 Binary files /dev/null and b/dist/AxCopilot/es/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/es/UIAutomationTypes.resources.dll b/dist/AxCopilot/es/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..b683290 Binary files /dev/null and b/dist/AxCopilot/es/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/es/WindowsBase.resources.dll b/dist/AxCopilot/es/WindowsBase.resources.dll new file mode 100644 index 0000000..824d435 Binary files /dev/null and b/dist/AxCopilot/es/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/es/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/es/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..65620a9 Binary files /dev/null and b/dist/AxCopilot/es/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/fr/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/fr/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..ce93226 Binary files /dev/null and b/dist/AxCopilot/fr/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/fr/PresentationCore.resources.dll b/dist/AxCopilot/fr/PresentationCore.resources.dll new file mode 100644 index 0000000..e8ee4db Binary files /dev/null and b/dist/AxCopilot/fr/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/fr/PresentationFramework.resources.dll b/dist/AxCopilot/fr/PresentationFramework.resources.dll new file mode 100644 index 0000000..2bc24e7 Binary files /dev/null and b/dist/AxCopilot/fr/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/fr/PresentationUI.resources.dll b/dist/AxCopilot/fr/PresentationUI.resources.dll new file mode 100644 index 0000000..b7fcd7a Binary files /dev/null and b/dist/AxCopilot/fr/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/fr/ReachFramework.resources.dll b/dist/AxCopilot/fr/ReachFramework.resources.dll new file mode 100644 index 0000000..cf31c14 Binary files /dev/null and b/dist/AxCopilot/fr/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/fr/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/fr/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..a2a3270 Binary files /dev/null and b/dist/AxCopilot/fr/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/fr/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/fr/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..efe7f21 Binary files /dev/null and b/dist/AxCopilot/fr/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/fr/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/fr/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..835dbaa Binary files /dev/null and b/dist/AxCopilot/fr/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/fr/System.Windows.Forms.resources.dll b/dist/AxCopilot/fr/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..8fbf425 Binary files /dev/null and b/dist/AxCopilot/fr/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/fr/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/fr/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..709d93f Binary files /dev/null and b/dist/AxCopilot/fr/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/fr/System.Xaml.resources.dll b/dist/AxCopilot/fr/System.Xaml.resources.dll new file mode 100644 index 0000000..913fc8a Binary files /dev/null and b/dist/AxCopilot/fr/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/fr/UIAutomationClient.resources.dll b/dist/AxCopilot/fr/UIAutomationClient.resources.dll new file mode 100644 index 0000000..d72cdb5 Binary files /dev/null and b/dist/AxCopilot/fr/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/fr/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/fr/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..5e179c2 Binary files /dev/null and b/dist/AxCopilot/fr/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/fr/UIAutomationProvider.resources.dll b/dist/AxCopilot/fr/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..f311bb9 Binary files /dev/null and b/dist/AxCopilot/fr/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/fr/UIAutomationTypes.resources.dll b/dist/AxCopilot/fr/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..0ff6a7e Binary files /dev/null and b/dist/AxCopilot/fr/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/fr/WindowsBase.resources.dll b/dist/AxCopilot/fr/WindowsBase.resources.dll new file mode 100644 index 0000000..a775e1d Binary files /dev/null and b/dist/AxCopilot/fr/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/fr/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/fr/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..3f9c44f Binary files /dev/null and b/dist/AxCopilot/fr/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/hostfxr.dll b/dist/AxCopilot/hostfxr.dll new file mode 100644 index 0000000..b68e7ea Binary files /dev/null and b/dist/AxCopilot/hostfxr.dll differ diff --git a/dist/AxCopilot/hostpolicy.dll b/dist/AxCopilot/hostpolicy.dll new file mode 100644 index 0000000..2b6e13f Binary files /dev/null and b/dist/AxCopilot/hostpolicy.dll differ diff --git a/dist/AxCopilot/it/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/it/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..9853aeb Binary files /dev/null and b/dist/AxCopilot/it/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/it/PresentationCore.resources.dll b/dist/AxCopilot/it/PresentationCore.resources.dll new file mode 100644 index 0000000..3cccddf Binary files /dev/null and b/dist/AxCopilot/it/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/it/PresentationFramework.resources.dll b/dist/AxCopilot/it/PresentationFramework.resources.dll new file mode 100644 index 0000000..066b32e Binary files /dev/null and b/dist/AxCopilot/it/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/it/PresentationUI.resources.dll b/dist/AxCopilot/it/PresentationUI.resources.dll new file mode 100644 index 0000000..dab8111 Binary files /dev/null and b/dist/AxCopilot/it/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/it/ReachFramework.resources.dll b/dist/AxCopilot/it/ReachFramework.resources.dll new file mode 100644 index 0000000..7d6a1bf Binary files /dev/null and b/dist/AxCopilot/it/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/it/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/it/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..8faac17 Binary files /dev/null and b/dist/AxCopilot/it/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/it/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/it/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..59518ef Binary files /dev/null and b/dist/AxCopilot/it/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/it/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/it/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..e120beb Binary files /dev/null and b/dist/AxCopilot/it/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/it/System.Windows.Forms.resources.dll b/dist/AxCopilot/it/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..5012226 Binary files /dev/null and b/dist/AxCopilot/it/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/it/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/it/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..247330a Binary files /dev/null and b/dist/AxCopilot/it/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/it/System.Xaml.resources.dll b/dist/AxCopilot/it/System.Xaml.resources.dll new file mode 100644 index 0000000..1ec3ac1 Binary files /dev/null and b/dist/AxCopilot/it/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/it/UIAutomationClient.resources.dll b/dist/AxCopilot/it/UIAutomationClient.resources.dll new file mode 100644 index 0000000..8804c89 Binary files /dev/null and b/dist/AxCopilot/it/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/it/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/it/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..a03cf91 Binary files /dev/null and b/dist/AxCopilot/it/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/it/UIAutomationProvider.resources.dll b/dist/AxCopilot/it/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..91f2d26 Binary files /dev/null and b/dist/AxCopilot/it/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/it/UIAutomationTypes.resources.dll b/dist/AxCopilot/it/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..71d18cc Binary files /dev/null and b/dist/AxCopilot/it/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/it/WindowsBase.resources.dll b/dist/AxCopilot/it/WindowsBase.resources.dll new file mode 100644 index 0000000..34d138b Binary files /dev/null and b/dist/AxCopilot/it/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/it/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/it/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..841f6ce Binary files /dev/null and b/dist/AxCopilot/it/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/ja/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/ja/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..65b7dd6 Binary files /dev/null and b/dist/AxCopilot/ja/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/ja/PresentationCore.resources.dll b/dist/AxCopilot/ja/PresentationCore.resources.dll new file mode 100644 index 0000000..d1d2393 Binary files /dev/null and b/dist/AxCopilot/ja/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/ja/PresentationFramework.resources.dll b/dist/AxCopilot/ja/PresentationFramework.resources.dll new file mode 100644 index 0000000..5753bcd Binary files /dev/null and b/dist/AxCopilot/ja/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/ja/PresentationUI.resources.dll b/dist/AxCopilot/ja/PresentationUI.resources.dll new file mode 100644 index 0000000..369617e Binary files /dev/null and b/dist/AxCopilot/ja/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/ja/ReachFramework.resources.dll b/dist/AxCopilot/ja/ReachFramework.resources.dll new file mode 100644 index 0000000..5d85611 Binary files /dev/null and b/dist/AxCopilot/ja/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/ja/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/ja/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..456dc4a Binary files /dev/null and b/dist/AxCopilot/ja/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/ja/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/ja/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..d49fab4 Binary files /dev/null and b/dist/AxCopilot/ja/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/ja/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/ja/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..179ce29 Binary files /dev/null and b/dist/AxCopilot/ja/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/ja/System.Windows.Forms.resources.dll b/dist/AxCopilot/ja/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..1c7239b Binary files /dev/null and b/dist/AxCopilot/ja/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/ja/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/ja/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..448b23a Binary files /dev/null and b/dist/AxCopilot/ja/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/ja/System.Xaml.resources.dll b/dist/AxCopilot/ja/System.Xaml.resources.dll new file mode 100644 index 0000000..9332199 Binary files /dev/null and b/dist/AxCopilot/ja/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/ja/UIAutomationClient.resources.dll b/dist/AxCopilot/ja/UIAutomationClient.resources.dll new file mode 100644 index 0000000..a68085c Binary files /dev/null and b/dist/AxCopilot/ja/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/ja/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/ja/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..e5f78eb Binary files /dev/null and b/dist/AxCopilot/ja/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/ja/UIAutomationProvider.resources.dll b/dist/AxCopilot/ja/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..9ff7b8f Binary files /dev/null and b/dist/AxCopilot/ja/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/ja/UIAutomationTypes.resources.dll b/dist/AxCopilot/ja/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..b1cdfe2 Binary files /dev/null and b/dist/AxCopilot/ja/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/ja/WindowsBase.resources.dll b/dist/AxCopilot/ja/WindowsBase.resources.dll new file mode 100644 index 0000000..ec6c503 Binary files /dev/null and b/dist/AxCopilot/ja/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/ja/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/ja/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..18aa0e3 Binary files /dev/null and b/dist/AxCopilot/ja/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/ko/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/ko/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..de853c1 Binary files /dev/null and b/dist/AxCopilot/ko/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/ko/PresentationCore.resources.dll b/dist/AxCopilot/ko/PresentationCore.resources.dll new file mode 100644 index 0000000..1754cbc Binary files /dev/null and b/dist/AxCopilot/ko/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/ko/PresentationFramework.resources.dll b/dist/AxCopilot/ko/PresentationFramework.resources.dll new file mode 100644 index 0000000..0f0b748 Binary files /dev/null and b/dist/AxCopilot/ko/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/ko/PresentationUI.resources.dll b/dist/AxCopilot/ko/PresentationUI.resources.dll new file mode 100644 index 0000000..5a2d16f Binary files /dev/null and b/dist/AxCopilot/ko/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/ko/ReachFramework.resources.dll b/dist/AxCopilot/ko/ReachFramework.resources.dll new file mode 100644 index 0000000..c27c6a0 Binary files /dev/null and b/dist/AxCopilot/ko/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/ko/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/ko/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..e8ce016 Binary files /dev/null and b/dist/AxCopilot/ko/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/ko/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/ko/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..0b3da3e Binary files /dev/null and b/dist/AxCopilot/ko/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/ko/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/ko/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..923aae5 Binary files /dev/null and b/dist/AxCopilot/ko/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/ko/System.Windows.Forms.resources.dll b/dist/AxCopilot/ko/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..b4f036c Binary files /dev/null and b/dist/AxCopilot/ko/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/ko/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/ko/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..9b90f21 Binary files /dev/null and b/dist/AxCopilot/ko/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/ko/System.Xaml.resources.dll b/dist/AxCopilot/ko/System.Xaml.resources.dll new file mode 100644 index 0000000..c735c85 Binary files /dev/null and b/dist/AxCopilot/ko/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/ko/UIAutomationClient.resources.dll b/dist/AxCopilot/ko/UIAutomationClient.resources.dll new file mode 100644 index 0000000..78a7675 Binary files /dev/null and b/dist/AxCopilot/ko/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/ko/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/ko/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..fea66ed Binary files /dev/null and b/dist/AxCopilot/ko/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/ko/UIAutomationProvider.resources.dll b/dist/AxCopilot/ko/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..583dee8 Binary files /dev/null and b/dist/AxCopilot/ko/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/ko/UIAutomationTypes.resources.dll b/dist/AxCopilot/ko/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..336f779 Binary files /dev/null and b/dist/AxCopilot/ko/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/ko/WindowsBase.resources.dll b/dist/AxCopilot/ko/WindowsBase.resources.dll new file mode 100644 index 0000000..39bb4a1 Binary files /dev/null and b/dist/AxCopilot/ko/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/ko/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/ko/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..ad5b588 Binary files /dev/null and b/dist/AxCopilot/ko/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/mscordaccore.dll b/dist/AxCopilot/mscordaccore.dll new file mode 100644 index 0000000..03955f5 Binary files /dev/null and b/dist/AxCopilot/mscordaccore.dll differ diff --git a/dist/AxCopilot/mscordaccore_amd64_amd64_8.0.2526.11203.dll b/dist/AxCopilot/mscordaccore_amd64_amd64_8.0.2526.11203.dll new file mode 100644 index 0000000..03955f5 Binary files /dev/null and b/dist/AxCopilot/mscordaccore_amd64_amd64_8.0.2526.11203.dll differ diff --git a/dist/AxCopilot/mscordbi.dll b/dist/AxCopilot/mscordbi.dll new file mode 100644 index 0000000..f133f67 Binary files /dev/null and b/dist/AxCopilot/mscordbi.dll differ diff --git a/dist/AxCopilot/mscorlib.dll b/dist/AxCopilot/mscorlib.dll new file mode 100644 index 0000000..27463e0 Binary files /dev/null and b/dist/AxCopilot/mscorlib.dll differ diff --git a/dist/AxCopilot/mscorrc.dll b/dist/AxCopilot/mscorrc.dll new file mode 100644 index 0000000..1e092f0 Binary files /dev/null and b/dist/AxCopilot/mscorrc.dll differ diff --git a/dist/AxCopilot/msquic.dll b/dist/AxCopilot/msquic.dll new file mode 100644 index 0000000..9fd10ab Binary files /dev/null and b/dist/AxCopilot/msquic.dll differ diff --git a/dist/AxCopilot/netstandard.dll b/dist/AxCopilot/netstandard.dll new file mode 100644 index 0000000..e54daa6 Binary files /dev/null and b/dist/AxCopilot/netstandard.dll differ diff --git a/dist/AxCopilot/pl/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/pl/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..b8c9e4b Binary files /dev/null and b/dist/AxCopilot/pl/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/pl/PresentationCore.resources.dll b/dist/AxCopilot/pl/PresentationCore.resources.dll new file mode 100644 index 0000000..41b125e Binary files /dev/null and b/dist/AxCopilot/pl/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/pl/PresentationFramework.resources.dll b/dist/AxCopilot/pl/PresentationFramework.resources.dll new file mode 100644 index 0000000..d5f2f0e Binary files /dev/null and b/dist/AxCopilot/pl/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/pl/PresentationUI.resources.dll b/dist/AxCopilot/pl/PresentationUI.resources.dll new file mode 100644 index 0000000..85d7a46 Binary files /dev/null and b/dist/AxCopilot/pl/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/pl/ReachFramework.resources.dll b/dist/AxCopilot/pl/ReachFramework.resources.dll new file mode 100644 index 0000000..34d4fe1 Binary files /dev/null and b/dist/AxCopilot/pl/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/pl/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/pl/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..f90e8f6 Binary files /dev/null and b/dist/AxCopilot/pl/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/pl/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/pl/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..66ed2ce Binary files /dev/null and b/dist/AxCopilot/pl/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/pl/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/pl/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..881f20f Binary files /dev/null and b/dist/AxCopilot/pl/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/pl/System.Windows.Forms.resources.dll b/dist/AxCopilot/pl/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..37d911d Binary files /dev/null and b/dist/AxCopilot/pl/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/pl/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/pl/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..9ef5fd3 Binary files /dev/null and b/dist/AxCopilot/pl/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/pl/System.Xaml.resources.dll b/dist/AxCopilot/pl/System.Xaml.resources.dll new file mode 100644 index 0000000..6c22361 Binary files /dev/null and b/dist/AxCopilot/pl/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/pl/UIAutomationClient.resources.dll b/dist/AxCopilot/pl/UIAutomationClient.resources.dll new file mode 100644 index 0000000..2359952 Binary files /dev/null and b/dist/AxCopilot/pl/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/pl/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/pl/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..0d4875f Binary files /dev/null and b/dist/AxCopilot/pl/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/pl/UIAutomationProvider.resources.dll b/dist/AxCopilot/pl/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..5e569f2 Binary files /dev/null and b/dist/AxCopilot/pl/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/pl/UIAutomationTypes.resources.dll b/dist/AxCopilot/pl/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..e848dc6 Binary files /dev/null and b/dist/AxCopilot/pl/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/pl/WindowsBase.resources.dll b/dist/AxCopilot/pl/WindowsBase.resources.dll new file mode 100644 index 0000000..a50f7c3 Binary files /dev/null and b/dist/AxCopilot/pl/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/pl/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/pl/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..52c5ac7 Binary files /dev/null and b/dist/AxCopilot/pl/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/pt-BR/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..fe4535f Binary files /dev/null and b/dist/AxCopilot/pt-BR/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/PresentationCore.resources.dll b/dist/AxCopilot/pt-BR/PresentationCore.resources.dll new file mode 100644 index 0000000..53df88f Binary files /dev/null and b/dist/AxCopilot/pt-BR/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/PresentationFramework.resources.dll b/dist/AxCopilot/pt-BR/PresentationFramework.resources.dll new file mode 100644 index 0000000..00fa7e7 Binary files /dev/null and b/dist/AxCopilot/pt-BR/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/PresentationUI.resources.dll b/dist/AxCopilot/pt-BR/PresentationUI.resources.dll new file mode 100644 index 0000000..7525f77 Binary files /dev/null and b/dist/AxCopilot/pt-BR/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/ReachFramework.resources.dll b/dist/AxCopilot/pt-BR/ReachFramework.resources.dll new file mode 100644 index 0000000..4100eac Binary files /dev/null and b/dist/AxCopilot/pt-BR/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/pt-BR/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..788b9a6 Binary files /dev/null and b/dist/AxCopilot/pt-BR/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/pt-BR/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..0d06600 Binary files /dev/null and b/dist/AxCopilot/pt-BR/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/pt-BR/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..fd6287d Binary files /dev/null and b/dist/AxCopilot/pt-BR/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/System.Windows.Forms.resources.dll b/dist/AxCopilot/pt-BR/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..73af266 Binary files /dev/null and b/dist/AxCopilot/pt-BR/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/pt-BR/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..f533ed3 Binary files /dev/null and b/dist/AxCopilot/pt-BR/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/System.Xaml.resources.dll b/dist/AxCopilot/pt-BR/System.Xaml.resources.dll new file mode 100644 index 0000000..31d4eef Binary files /dev/null and b/dist/AxCopilot/pt-BR/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/UIAutomationClient.resources.dll b/dist/AxCopilot/pt-BR/UIAutomationClient.resources.dll new file mode 100644 index 0000000..1220868 Binary files /dev/null and b/dist/AxCopilot/pt-BR/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/pt-BR/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..55d4ff8 Binary files /dev/null and b/dist/AxCopilot/pt-BR/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/UIAutomationProvider.resources.dll b/dist/AxCopilot/pt-BR/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..0bcc724 Binary files /dev/null and b/dist/AxCopilot/pt-BR/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/UIAutomationTypes.resources.dll b/dist/AxCopilot/pt-BR/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..078d705 Binary files /dev/null and b/dist/AxCopilot/pt-BR/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/WindowsBase.resources.dll b/dist/AxCopilot/pt-BR/WindowsBase.resources.dll new file mode 100644 index 0000000..6ccbc56 Binary files /dev/null and b/dist/AxCopilot/pt-BR/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/pt-BR/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/pt-BR/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..377e3bf Binary files /dev/null and b/dist/AxCopilot/pt-BR/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/ru/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/ru/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..4942a60 Binary files /dev/null and b/dist/AxCopilot/ru/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/ru/PresentationCore.resources.dll b/dist/AxCopilot/ru/PresentationCore.resources.dll new file mode 100644 index 0000000..1cbb847 Binary files /dev/null and b/dist/AxCopilot/ru/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/ru/PresentationFramework.resources.dll b/dist/AxCopilot/ru/PresentationFramework.resources.dll new file mode 100644 index 0000000..a8a62c2 Binary files /dev/null and b/dist/AxCopilot/ru/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/ru/PresentationUI.resources.dll b/dist/AxCopilot/ru/PresentationUI.resources.dll new file mode 100644 index 0000000..65218a2 Binary files /dev/null and b/dist/AxCopilot/ru/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/ru/ReachFramework.resources.dll b/dist/AxCopilot/ru/ReachFramework.resources.dll new file mode 100644 index 0000000..94588a8 Binary files /dev/null and b/dist/AxCopilot/ru/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/ru/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/ru/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..36656a9 Binary files /dev/null and b/dist/AxCopilot/ru/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/ru/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/ru/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..feebd5d Binary files /dev/null and b/dist/AxCopilot/ru/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/ru/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/ru/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..46823f9 Binary files /dev/null and b/dist/AxCopilot/ru/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/ru/System.Windows.Forms.resources.dll b/dist/AxCopilot/ru/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..ee70ba5 Binary files /dev/null and b/dist/AxCopilot/ru/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/ru/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/ru/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..ef8ff1a Binary files /dev/null and b/dist/AxCopilot/ru/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/ru/System.Xaml.resources.dll b/dist/AxCopilot/ru/System.Xaml.resources.dll new file mode 100644 index 0000000..9591c99 Binary files /dev/null and b/dist/AxCopilot/ru/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/ru/UIAutomationClient.resources.dll b/dist/AxCopilot/ru/UIAutomationClient.resources.dll new file mode 100644 index 0000000..26073b0 Binary files /dev/null and b/dist/AxCopilot/ru/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/ru/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/ru/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..54884d2 Binary files /dev/null and b/dist/AxCopilot/ru/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/ru/UIAutomationProvider.resources.dll b/dist/AxCopilot/ru/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..9c39566 Binary files /dev/null and b/dist/AxCopilot/ru/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/ru/UIAutomationTypes.resources.dll b/dist/AxCopilot/ru/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..3baf0a3 Binary files /dev/null and b/dist/AxCopilot/ru/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/ru/WindowsBase.resources.dll b/dist/AxCopilot/ru/WindowsBase.resources.dll new file mode 100644 index 0000000..d58e699 Binary files /dev/null and b/dist/AxCopilot/ru/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/ru/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/ru/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..3cb5e5b Binary files /dev/null and b/dist/AxCopilot/ru/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/runtimes/win-x64/native/WebView2Loader.dll b/dist/AxCopilot/runtimes/win-x64/native/WebView2Loader.dll new file mode 100644 index 0000000..983ee32 Binary files /dev/null and b/dist/AxCopilot/runtimes/win-x64/native/WebView2Loader.dll differ diff --git a/dist/AxCopilot/skills/adr-writer.skill.md b/dist/AxCopilot/skills/adr-writer.skill.md new file mode 100644 index 0000000..e746d27 --- /dev/null +++ b/dist/AxCopilot/skills/adr-writer.skill.md @@ -0,0 +1,95 @@ +--- +name: adr-writer +label: 아키텍처 결정 기록 (ADR) +description: 아키텍처 결정 사항을 표준 ADR 형식으로 문서화합니다. +icon: \uE82D +allowed-tools: + - file_read + - file_write + - folder_map + - grep + - search_codebase +tabs: code +--- + +아키텍처 결정 사항을 ADR(Architecture Decision Record) 형식으로 문서화하세요. + +## ADR이란? +소프트웨어 아키텍처에서 내린 중요한 결정의 배경, 대안, 근거를 기록하는 경량 문서입니다. +미래의 팀원이 "왜 이렇게 결정했는지"를 이해할 수 있게 합니다. + +## 워크플로우 + +1. **결정 사항 확인**: 사용자에게 다음을 파악 + - 어떤 결정을 내렸는가 (또는 내려야 하는가) + - 관련 코드/시스템 영역 + - 고려한 대안들 +2. **코드 분석** (선택): 관련 코드 구조를 읽어 현재 상태 파악 +3. **ADR 작성**: 표준 형식으로 문서 생성 +4. **파일 저장**: `docs/adr/` 폴더에 번호 형식으로 저장 + +## ADR 표준 형식 + +```markdown +# ADR-[번호]: [결정 제목] + +**상태**: 제안됨 | 승인됨 | 폐기됨 | 대체됨 +**날짜**: YYYY-MM-DD +**결정자**: [이름/팀] + +## 맥락 (Context) +어떤 상황에서 이 결정이 필요한가? +- 기술적 배경 +- 비즈니스 요구사항 +- 제약 조건 + +## 결정 (Decision) +무엇을 결정했는가? +- 선택한 방안의 구체적 내용 +- 적용 범위 + +## 대안 (Alternatives) + +### 대안 1: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +### 대안 2: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +## 근거 (Rationale) +왜 이 결정을 선택했는가? +- 대안 대비 장점 +- 트레이드오프 분석 +- 참고 자료/벤치마크 + +## 결과 (Consequences) + +### 긍정적 +- ... + +### 부정적 +- ... + +### 리스크 +- ... + +## 관련 문서 +- ADR-[관련번호]: [제목] +- [외부 참고 링크] +``` + +## 파일 명명 규칙 +- 위치: `docs/adr/` (없으면 생성) +- 파일명: `ADR-NNNN-제목-요약.md` (예: `ADR-0001-데이터베이스-선택.md`) +- 번호: 기존 ADR 파일 조회 후 자동 부여 + +## 규칙 +- 결정의 "왜"를 중심으로 작성 (코드를 읽으면 "무엇"은 알 수 있음) +- 대안은 최소 2개 이상 제시 +- 트레이드오프를 솔직하게 기록 (완벽한 선택은 없음) +- 짧고 명확하게 (1~2페이지 이내) +- 한국어로 작성 diff --git a/dist/AxCopilot/skills/api-docs.skill.md b/dist/AxCopilot/skills/api-docs.skill.md new file mode 100644 index 0000000..dc8c12e --- /dev/null +++ b/dist/AxCopilot/skills/api-docs.skill.md @@ -0,0 +1,53 @@ +--- +name: api-docs +label: API 문서 생성 +description: 코드에서 API 엔드포인트를 분석하여 마크다운/HTML API 문서를 자동 생성합니다. +icon: \uE8A1 +tabs: code +--- + +작업 폴더의 소스 코드를 분석하여 API 문서를 생성하세요. + +## 분석 대상 +- REST API 엔드포인트 (Controller, Route 어노테이션) +- 함수/메서드 시그니처 및 주석 +- 요청/응답 모델 (DTO, Schema) +- 인증/권한 요구사항 + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — API 엔드포인트 패턴 검색 (`[HttpGet]`, `@GetMapping`, `router.get`, `@app.route` 등) +3. `file_read` — 컨트롤러/라우터 파일 분석 +4. `grep_tool` — 요청/응답 모델 클래스 검색 +5. `file_read` — 모델 구조 분석 +6. `file_write` — API 문서 생성 + +## 출력 형식 +마크다운으로 작성하되 다음 구조를 따르세요: + +``` +# API 문서 + +## 개요 +- Base URL, 인증 방식, 공통 헤더 + +## 엔드포인트 + +### [POST] /api/users +- **설명**: 사용자 생성 +- **인증**: Bearer Token 필요 +- **요청 본문**: + | 필드 | 타입 | 필수 | 설명 | + |------|------|------|------| + | name | string | ✓ | 사용자 이름 | +- **응답**: 201 Created + ```json + { "id": 1, "name": "..." } + ``` +- **에러 코드**: 400, 401, 409 +``` + +## 주의사항 +- 코드에서 실제 확인된 내용만 문서화하세요. 추측하지 마세요. +- 주석이나 Swagger/OpenAPI 어노테이션이 있으면 우선 활용하세요. +- 인증, 페이징, 에러 처리 등 공통 패턴은 별도 섹션으로 정리하세요. diff --git a/dist/AxCopilot/skills/batch-rename.skill.md b/dist/AxCopilot/skills/batch-rename.skill.md new file mode 100644 index 0000000..0598dbc --- /dev/null +++ b/dist/AxCopilot/skills/batch-rename.skill.md @@ -0,0 +1,70 @@ +--- +name: batch-rename +label: 파일 일괄 이름 변경 +description: 패턴 매칭, 번호 붙이기, 날짜 추가 등 파일 이름을 일괄 변경합니다. +icon: \uE8AC +tabs: cowork +allowed-tools: + - folder_map + - file_read + - file_manage + - clipboard_tool +--- + +파일 이름을 규칙에 따라 일괄 변경하세요. 변경 전 반드시 미리보기를 제공합니다. + +## 작업 절차 + +1. **대상 파일 스캔**: folder_map으로 작업 폴더의 파일 목록을 수집 +2. **이름 변경 규칙 확인**: 사용자에게 다음 옵션을 확인 + - 대상 파일 필터 (확장자, 이름 패턴) + - 변경 규칙 (아래 지원 규칙 참조) + - 적용 순서 (이름순, 날짜순, 크기순) +3. **변경 미리보기 생성**: 변경 전/후 이름을 표로 표시 + ``` + | # | 현재 이름 | 변경 후 이름 | + |---|----------------------|----------------------| + | 1 | IMG_20260101_001.jpg | 2026-01-01_001.jpg | + | 2 | IMG_20260101_002.jpg | 2026-01-01_002.jpg | + ``` +4. **사용자 확인**: 미리보기를 보여주고 진행 여부를 확인 +5. **일괄 변경 실행**: file_manage로 파일 이름을 순차 변경 +6. **결과 보고**: 변경 성공/실패 건수와 상세 내역을 안내 + +## 지원 이름 변경 규칙 + +### 패턴 치환 +- **문자열 치환**: "IMG_" → "사진_" +- **정규식 치환**: `(\d{4})(\d{2})(\d{2})` → `$1-$2-$3` +- **대소문자 변환**: 소문자, 대문자, 타이틀 케이스 + +### 번호 붙이기 +- **순번 추가**: `문서_001.pdf`, `문서_002.pdf`, ... +- **시작 번호**: 사용자 지정 (기본: 1) +- **자릿수**: 자동 계산 (파일 수 기준) +- **위치**: 접두사 또는 접미사 + +### 날짜 추가 +- **오늘 날짜**: `보고서_2026-03-30.docx` +- **파일 수정일**: 파일의 실제 수정 날짜 사용 +- **날짜 형식**: YYYY-MM-DD, YYYYMMDD, YY.MM.DD + +### 정리 +- **공백 처리**: 공백 → 언더스코어/하이픈 +- **특수문자 제거**: 파일명에서 특수문자 제거 +- **확장자 변경**: `.jpeg` → `.jpg` +- **접두사/접미사 추가 또는 제거** + +## 충돌 처리 +- 변경 후 이름이 이미 존재하면 자동으로 번호 추가 (`_1`, `_2`) +- 충돌 건은 미리보기에서 ⚠️ 표시로 경고 +- 원본 파일 덮어쓰기 절대 금지 + +## 규칙 +- **미리보기 없이 직접 변경하지 않음** — 반드시 미리보기 후 사용자 확인 +- 하위 폴더 포함 여부는 사용자에게 확인 +- 숨김 파일(.으로 시작)은 기본 제외 +- 변경 실패 시 이미 변경된 파일은 원복하지 않으므로, 중요한 경우 백업 권장 +- 한 번에 1,000개 이상의 파일 변경 시 경고 + +한국어로 안내하세요. diff --git a/dist/AxCopilot/skills/changelog.skill.md b/dist/AxCopilot/skills/changelog.skill.md new file mode 100644 index 0000000..a40539b --- /dev/null +++ b/dist/AxCopilot/skills/changelog.skill.md @@ -0,0 +1,74 @@ +--- +name: changelog +label: 변경 이력 / 릴리즈 노트 +description: Git 커밋 이력에서 자동으로 변경 이력과 릴리즈 노트를 생성합니다. +icon: \uE81C +allowed-tools: + - git_tool + - file_read + - file_write + - html_create + - text_summarize +tabs: code +--- + +Git 커밋 이력을 분석하여 변경 이력(CHANGELOG) 또는 릴리즈 노트를 생성하세요. + +## 워크플로우 + +1. **이력 조회**: git_tool로 커밋 로그 수집 + - 지정 기간 또는 태그 간 커밋 + - 커밋 메시지 + 변경 파일 목록 +2. **분류**: 커밋을 Conventional Commits 기준으로 분류 +3. **Breaking Change 감지**: 시그니처 변경, API 삭제 등 감지 +4. **문서 생성**: Markdown 또는 HTML로 출력 + +## Conventional Commits 분류 + +| 접두사 | 분류 | 설명 | +|--------|------|------| +| feat | ✨ 신기능 | 새로운 기능 추가 | +| fix | 🐛 버그 수정 | 버그 수정 | +| docs | 📝 문서 | 문서 변경 | +| style | 💄 스타일 | 코드 포맷팅 (동작 변경 없음) | +| refactor | ♻️ 리팩토링 | 코드 리팩토링 | +| perf | ⚡ 성능 | 성능 개선 | +| test | ✅ 테스트 | 테스트 추가/수정 | +| chore | 🔧 기타 | 빌드, 설정 변경 | +| BREAKING | 💥 Breaking | 하위 호환성 깨지는 변경 | + +## 출력 형식 + +### CHANGELOG.md +```markdown +# Changelog + +## [1.6.0] - 2026-03-30 + +### ✨ 신기능 +- 멀티패스 문서 생성 엔진 (#123) +- PPT 네이티브 생성 도구 + +### 🐛 버그 수정 +- 탭 전환 시 대화 유실 문제 해결 + +### 💥 Breaking Changes +- 없음 + +### 📝 문서 +- 개발자 가이드 v1.6.0 업데이트 +``` + +### 릴리즈 노트 (HTML) +사용자 친화적인 형식: +- 주요 변경사항 (스크린샷 포함 가능) +- 개선 사항 +- 알려진 이슈 +- 업그레이드 가이드 + +## 규칙 +- Conventional Commits 형식이 아닌 커밋도 내용 분석으로 분류 +- 중복/사소한 커밋은 병합하여 요약 +- Breaking Change는 반드시 별도 섹션으로 강조 +- 이슈 번호가 있으면 링크 포함 +- 한국어로 작성 diff --git a/dist/AxCopilot/skills/code-scaffold.skill.md b/dist/AxCopilot/skills/code-scaffold.skill.md new file mode 100644 index 0000000..35e4a74 --- /dev/null +++ b/dist/AxCopilot/skills/code-scaffold.skill.md @@ -0,0 +1,31 @@ +--- +name: code-scaffold +label: 코드 스캐폴딩 +description: 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 자동 생성합니다. +icon: \uE943 +tabs: code +--- + +작업 폴더의 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 프로젝트 구조 파악 +2. file_read — 기존 코드 패턴 분석 +3. grep_tool — 코딩 컨벤션 확인 +4. file_write — 새 파일 생성 + +작업 순서: +1. 프로젝트 타입 감지 (언어, 프레임워크, 빌드 시스템) +2. 기존 코드 패턴 분석 (네이밍, 폴더 구조, 임포트 스타일) +3. 사용자 요청에 맞는 코드 뼈대 생성 + +생성 항목: +- 클래스/모듈 파일 (프로젝트 컨벤션에 맞춰) +- 인터페이스/타입 정의 +- 단위 테스트 파일 +- 필요한 설정/구성 파일 + +규칙: +- 기존 프로젝트의 코딩 스타일을 따르세요 +- TODO 주석으로 구현이 필요한 부분을 표시하세요 +- 한국어 주석을 추가하세요 diff --git a/dist/AxCopilot/skills/commit-review.skill.md b/dist/AxCopilot/skills/commit-review.skill.md new file mode 100644 index 0000000..0f8663b --- /dev/null +++ b/dist/AxCopilot/skills/commit-review.skill.md @@ -0,0 +1,67 @@ +--- +name: commit-review +label: 커밋 메시지 리뷰 +description: Git 커밋 메시지를 Conventional Commits 기준으로 검토하고 개선을 제안합니다. +icon: \uE8CB +tabs: code +--- + +작업 폴더의 최근 Git 커밋 메시지를 검토하고 개선안을 제시하세요. + +## 작업 절차 +1. `process_run` — `git log --oneline -20` 으로 최근 커밋 목록 확인 +2. `process_run` — `git log --format="%H%n%s%n%b%n---" -10` 으로 상세 메시지 확인 +3. `process_run` — `git diff HEAD~1` 으로 최신 커밋 변경 내용 확인 (필요 시) +4. 각 커밋을 Conventional Commits 기준으로 분석 +5. 결과를 정리하여 출력 + +## Conventional Commits 규칙 +``` +[optional scope]: + +[optional body] + +[optional footer(s)] +``` + +### type 종류 +- `feat`: 새 기능 +- `fix`: 버그 수정 +- `docs`: 문서 변경 +- `style`: 포맷팅 (코드 동작 변경 없음) +- `refactor`: 리팩토링 +- `perf`: 성능 개선 +- `test`: 테스트 추가/수정 +- `chore`: 빌드/도구 설정 +- `ci`: CI 설정 변경 + +## 검토 항목 +1. **type 적절성**: 변경 내용과 type이 일치하는가 +2. **설명 품질**: 50자 이내, 명령형, 명확한 내용 +3. **본문 유무**: 복잡한 변경에 "왜" 설명이 있는가 +4. **일관성**: 팀 내 커밋 스타일이 통일되어 있는가 +5. **Breaking Change**: BREAKING CHANGE 푸터 또는 ! 표기 + +## 출력 형식 +``` +## 커밋 메시지 리뷰 결과 + +### 전체 요약 +- 검토 커밋: N개 +- 규칙 준수: N개 ✓ / 위반: N개 ✗ + +### 개별 리뷰 + +#### abc1234 "Fix login bug" +- ❌ type 없음 → `fix: resolve login authentication failure` +- ❌ 본문 없음 → 원인과 해결 방법 추가 권장 + +#### def5678 "feat: add user profile page" +- ✅ Conventional Commits 준수 +- 💡 scope 추가 권장: `feat(profile): add user profile page` +``` + +## 주의사항 +- 비판이 아닌 건설적 제안을 하세요. +- 팀의 기존 컨벤션이 있으면 그것을 우선 존중하세요. +- 개선된 메시지 예시를 항상 함께 제시하세요. diff --git a/dist/AxCopilot/skills/compare.skill.md b/dist/AxCopilot/skills/compare.skill.md new file mode 100644 index 0000000..6538dd7 --- /dev/null +++ b/dist/AxCopilot/skills/compare.skill.md @@ -0,0 +1,51 @@ +--- +name: compare +label: 비교 분석표 +description: 2개 이상 항목의 비교 분석 매트릭스를 생성합니다. +icon: \uE9D5 +allowed-tools: + - html_create + - excel_create + - file_read + - document_read + - chart_create +tabs: all +--- + +사용자가 요청한 항목들을 체계적으로 비교 분석하는 매트릭스를 생성하세요. + +## 워크플로우 + +1. **비교 대상 확인**: 어떤 항목들을 비교할지 파악 + - 제품, 기술, 방안, 서비스, 도구, 프레임워크 등 +2. **비교 기준 설정**: 적절한 비교 축을 설계 + - 기능, 가격, 성능, 사용성, 확장성, 지원, 보안 등 +3. **데이터 수집**: 참고 파일이 있으면 읽어서 반영 +4. **분석표 생성**: HTML 또는 Excel로 비교 매트릭스 생성 +5. **종합 평가**: 총평 + 추천 의견 제시 + +## 비교표 구성 + +### 기본 매트릭스 +| 기준 | 항목 A | 항목 B | 항목 C | +|------|--------|--------|--------| +| 기능1 | ✅ 지원 | ⚠ 일부 | ❌ 미지원 | +| 기능2 | ... | ... | ... | + +### 점수 비교 (radar 차트 활용) +- 각 항목을 1~10점으로 정량화 +- chart_create로 레이더 차트 또는 바 차트 시각화 + +### 종합 평가 +- 장점/단점 요약 +- 상황별 추천 (예: "예산이 제한적이면 A, 확장성이 중요하면 B") + +## 출력 형식 +- **HTML** (권장): 색상 배지, 차트 포함 비주얼 보고서 +- **Excel**: 정량 데이터 + 수식 기반 점수표 + +## 규칙 +- 객관적 사실 기반으로 비교 (주관적 판단은 별도 섹션) +- 각 항목의 강점과 약점을 균형 있게 서술 +- 출처/근거가 있으면 명시 +- 한국어로 작성 diff --git a/dist/AxCopilot/skills/csv-to-xlsx.skill.md b/dist/AxCopilot/skills/csv-to-xlsx.skill.md new file mode 100644 index 0000000..fb819ac --- /dev/null +++ b/dist/AxCopilot/skills/csv-to-xlsx.skill.md @@ -0,0 +1,125 @@ +--- +name: csv-to-xlsx +label: CSV → Excel 변환 +description: CSV 파일을 서식이 완성된 Excel(.xlsx)로 변환합니다. 헤더 고정, 필터, 조건부 서식, 자동 열 너비를 적용합니다. +icon: \uE9F9 +tabs: cowork +requires: python +--- + +CSV 파일을 전문적인 서식이 적용된 Excel 파일로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install openpyxl pandas +``` + +## 작업 절차 + +1. **파일 확인**: folder_map으로 작업 폴더에서 CSV 파일을 탐색 +2. **CSV 분석**: file_read로 CSV 파일의 구조(컬럼, 행 수, 인코딩, 구분자) 파악 +3. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 헤더 행 고정 여부 (기본: 활성) + - 자동 필터 적용 여부 (기본: 활성) + - 조건부 서식 대상 컬럼 (숫자 컬럼 자동 감지) + - 시트 이름 (기본: 파일명) +4. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +5. **스크립트 실행**: process_run으로 Python 스크립트 실행 +6. **결과 확인**: 생성된 .xlsx 파일 경로와 요약 정보를 안내 + +## Python 스크립트 템플릿 +```python +import pandas as pd +from openpyxl import load_workbook +from openpyxl.styles import Font, PatternFill, Alignment, Border, Side +from openpyxl.utils import get_column_letter +from openpyxl.formatting.rule import CellIsRule + +# CSV 읽기 (인코딩 자동 감지) +for enc in ['utf-8', 'cp949', 'euc-kr', 'utf-8-sig']: + try: + df = pd.read_csv('input.csv', encoding=enc) + break + except (UnicodeDecodeError, Exception): + continue + +# Excel 저장 +output_path = 'output.xlsx' +df.to_excel(output_path, index=False, sheet_name='Sheet1') + +# 서식 적용 +wb = load_workbook(output_path) +ws = wb.active + +# 헤더 스타일 +header_font = Font(bold=True, color='FFFFFF', size=11) +header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid') +header_align = Alignment(horizontal='center', vertical='center', wrap_text=True) +thin_border = Border( + left=Side(style='thin'), + right=Side(style='thin'), + top=Side(style='thin'), + bottom=Side(style='thin') +) + +for col_idx, cell in enumerate(ws[1], 1): + cell.font = header_font + cell.fill = header_fill + cell.alignment = header_align + cell.border = thin_border + +# 자동 열 너비 +for col_idx in range(1, ws.max_column + 1): + max_length = 0 + col_letter = get_column_letter(col_idx) + for row in ws.iter_rows(min_col=col_idx, max_col=col_idx): + for cell in row: + if cell.value: + max_length = max(max_length, len(str(cell.value))) + ws.column_dimensions[col_letter].width = min(max_length + 4, 50) + +# 헤더 행 고정 (Freeze Panes) +ws.freeze_panes = 'A2' + +# 자동 필터 +ws.auto_filter.ref = ws.dimensions + +# 숫자 컬럼 조건부 서식 (음수 빨강) +for col_idx in range(1, ws.max_column + 1): + col_letter = get_column_letter(col_idx) + sample_values = [ws.cell(row=r, column=col_idx).value for r in range(2, min(ws.max_row + 1, 12))] + if any(isinstance(v, (int, float)) for v in sample_values if v is not None): + cell_range = f'{col_letter}2:{col_letter}{ws.max_row}' + ws.conditional_formatting.add(cell_range, + CellIsRule(operator='lessThan', formula=['0'], + font=Font(color='FF0000'))) + +# 데이터 행 줄무늬 (가독성) +light_fill = PatternFill(start_color='D9E2F3', end_color='D9E2F3', fill_type='solid') +for row_idx in range(2, ws.max_row + 1): + for col_idx in range(1, ws.max_column + 1): + cell = ws.cell(row=row_idx, column=col_idx) + cell.border = thin_border + if row_idx % 2 == 0: + cell.fill = light_fill + +wb.save(output_path) +print(f'변환 완료: {output_path} ({ws.max_row - 1}행 × {ws.max_column}열)') +``` + +## 서식 옵션 +- **헤더 스타일**: 파란 배경 + 흰색 굵은 글씨 + 가운데 정렬 +- **줄무늬**: 짝수 행 연한 파랑 배경 (가독성 향상) +- **열 너비**: 내용 기준 자동 조정 (최대 50) +- **조건부 서식**: 숫자 컬럼 음수 빨강 표시 +- **Freeze Panes**: 헤더 행 고정 +- **Auto Filter**: 전체 컬럼 필터 활성화 + +## 규칙 +- 원본 CSV 파일은 수정하지 않음 +- 인코딩 자동 감지 (UTF-8 → CP949 → EUC-KR 순) +- 대용량 파일 (100,000행 이상) 경고 후 진행 +- 출력 파일명: 원본 파일명 기준 (.csv → .xlsx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/dist/AxCopilot/skills/data-convert.skill.md b/dist/AxCopilot/skills/data-convert.skill.md new file mode 100644 index 0000000..edd84f6 --- /dev/null +++ b/dist/AxCopilot/skills/data-convert.skill.md @@ -0,0 +1,56 @@ +--- +name: data-convert +label: 데이터 변환기 +description: 데이터 포맷 간 변환, 정제, 필터링, 통계 요약을 수행합니다. +icon: \uE8AB +allowed-tools: + - file_read + - file_write + - json_tool + - csv_create + - data_pivot + - excel_create +tabs: cowork +--- + +데이터 파일의 포맷 변환, 정제, 필터링, 통계 요약을 수행하세요. + +## 지원 변환 + +| 입력 → | JSON | CSV | Excel | Markdown | +|--------|------|-----|-------|----------| +| JSON | — | ✅ | ✅ | ✅ | +| CSV | ✅ | — | ✅ | ✅ | +| Excel | ✅ | ✅ | — | ✅ | +| TSV | ✅ | ✅ | ✅ | ✅ | + +## 워크플로우 + +1. **파일 분석**: 입력 파일의 포맷, 인코딩, 구조 파악 +2. **데이터 정제** (선택): + - 빈 행/열 제거 + - 중복 제거 + - 데이터 타입 정리 (숫자 문자열 → 숫자) + - 결측치 처리 (제거 또는 기본값) +3. **필터링** (선택): + - 조건 기반 행 필터링 + - 필요 컬럼만 추출 +4. **변환**: 대상 포맷으로 변환 +5. **통계 요약**: 기본 통계 제공 + +## 정제 옵션 +- `remove_empty`: 빈 행 제거 +- `remove_duplicates`: 중복 행 제거 +- `trim`: 공백 제거 +- `fill_na`: 결측치 채우기 (값 지정) + +## 출력 +- 변환된 파일 저장 +- 변환 통계 (원본 행 수, 변환 후 행 수, 제거 행 수) +- 컬럼별 기본 통계 (수치 컬럼: 합계, 평균, 최소, 최대) + +## 규칙 +- 원본 파일은 수정하지 않음 (새 파일로 저장) +- 인코딩: UTF-8 기본 (EUC-KR 옵션) +- 대용량 파일 (10MB 이상) 경고 +- 한국어로 안내 diff --git a/dist/AxCopilot/skills/data-visualize-adv.skill.md b/dist/AxCopilot/skills/data-visualize-adv.skill.md new file mode 100644 index 0000000..53817d4 --- /dev/null +++ b/dist/AxCopilot/skills/data-visualize-adv.skill.md @@ -0,0 +1,125 @@ +--- +name: data-visualize-adv +label: 고급 데이터 시각화 +description: Python matplotlib/seaborn을 사용하여 히트맵, 산점도, 상관관계 등 고급 시각화를 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +데이터를 고급 시각화 차트로 변환하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib seaborn pandas numpy +``` + +## 작업 절차 +1. **데이터 확인**: 사용자가 제공한 CSV/JSON/Excel 데이터 파일 확인 +2. **데이터 로드**: pandas로 데이터 읽기 +3. **Python 스크립트 작성**: file_write로 시각화 스크립트 생성 +4. **스크립트 실행**: process_run으로 실행 +5. **결과 확인**: 생성된 차트 이미지 경로를 사용자에게 안내 + +## 시각화 유형별 템플릿 + +### 공통 설정 +```python +import matplotlib.pyplot as plt +import seaborn as sns +import pandas as pd +import numpy as np + +# 한글 폰트 설정 +plt.rcParams['font.family'] = 'Malgun Gothic' +plt.rcParams['axes.unicode_minus'] = False +sns.set_theme(style='whitegrid', font='Malgun Gothic') +``` + +### 히트맵 (상관관계 행렬) +```python +df = pd.read_csv('data.csv') +corr = df.select_dtypes(include=[np.number]).corr() + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r', + center=0, square=True, linewidths=0.5, ax=ax) +ax.set_title('상관관계 히트맵') +plt.tight_layout() +plt.savefig('heatmap.png', dpi=150) +``` + +### 산점도 (Scatter Plot) +```python +df = pd.read_csv('data.csv') + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.scatterplot(data=df, x='col_x', y='col_y', hue='category', + size='value', sizes=(20, 200), alpha=0.7, ax=ax) +ax.set_title('산점도') +plt.tight_layout() +plt.savefig('scatter.png', dpi=150) +``` + +### 시계열 분석 +```python +df = pd.read_csv('data.csv', parse_dates=['date']) + +fig, ax = plt.subplots(figsize=(12, 6)) +sns.lineplot(data=df, x='date', y='value', hue='category', ax=ax) +ax.set_title('시계열 트렌드') +plt.xticks(rotation=45) +plt.tight_layout() +plt.savefig('timeseries.png', dpi=150) +``` + +### 분포 비교 (박스플롯 + 바이올린) +```python +fig, axes = plt.subplots(1, 2, figsize=(14, 6)) + +sns.boxplot(data=df, x='group', y='value', ax=axes[0]) +axes[0].set_title('박스플롯') + +sns.violinplot(data=df, x='group', y='value', ax=axes[1]) +axes[1].set_title('바이올린 플롯') + +plt.tight_layout() +plt.savefig('distribution.png', dpi=150) +``` + +### 다중 차트 대시보드 +```python +fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + +# 좌상: 히트맵 +sns.heatmap(corr, annot=True, fmt='.1f', ax=axes[0,0]) + +# 우상: 산점도 +sns.scatterplot(data=df, x='x', y='y', ax=axes[0,1]) + +# 좌하: 히스토그램 +sns.histplot(data=df, x='value', kde=True, ax=axes[1,0]) + +# 우하: 박스플롯 +sns.boxplot(data=df, x='group', y='value', ax=axes[1,1]) + +fig.suptitle('데이터 분석 대시보드', fontsize=16, fontweight='bold') +plt.tight_layout() +plt.savefig('dashboard.png', dpi=150) +``` + +### 페어플롯 (변수 간 관계 전체) +```python +g = sns.pairplot(df, hue='category', diag_kind='kde') +g.fig.suptitle('변수 간 관계', y=1.02) +plt.savefig('pairplot.png', dpi=150) +``` + +## 스타일 옵션 +- seaborn 테마: `whitegrid`, `darkgrid`, `white`, `dark`, `ticks` +- 컬러 팔레트: `Set2`, `husl`, `coolwarm`, `RdBu_r`, `viridis` +- 출력 형식: png, svg, pdf +- 해상도: `dpi=150` (기본), `dpi=300` (인쇄용) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/dist/AxCopilot/skills/data-visualize.skill.md b/dist/AxCopilot/skills/data-visualize.skill.md new file mode 100644 index 0000000..965bf8b --- /dev/null +++ b/dist/AxCopilot/skills/data-visualize.skill.md @@ -0,0 +1,38 @@ +--- +name: data-visualize +label: 데이터 시각화 +description: CSV/Excel 데이터를 분석하여 차트가 포함된 HTML 보고서를 생성합니다. +icon: \uE9D9 +tabs: cowork +--- + +작업 폴더의 데이터 파일을 분석하고 시각화 보고서를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — HTML 시각화 보고서 생성 + +���각화 전략: +1. **데이터 파악**: 컬럼 타입, 결측치, 기본 통계량 확인 +2. **적절한 차트 선택**: + - 시계열 → 라인 차트 + - 비교 → 바 차트 + - 비율 → 파이/도넛 차트 + - 분포 → 히스토그램 + - 상관관계 → 산점도 +3. **HTML 보고서 생성**: 인라인 SVG 또는 CSS 기반 차트 (외부 라이브러리 없이) + +보고서 구성: +## 데이터 요약 +- 기본 통계 테이블 + +## 시각화 +- 데이터 특성에 맞는 2~4개 차트 +- 각 차트에 대한 해석 + +## 인사이트 +- 데이터에서 발견한 주요 패턴 +- 이상치 또는 주목할 포인트 + +한국어로 작성하세요. 차트는 CSS/SVG 기반으로 외부 의존성 없이 생성하세요. diff --git a/dist/AxCopilot/skills/db-schema.skill.md b/dist/AxCopilot/skills/db-schema.skill.md new file mode 100644 index 0000000..446d5e1 --- /dev/null +++ b/dist/AxCopilot/skills/db-schema.skill.md @@ -0,0 +1,60 @@ +--- +name: db-schema +label: DB 스키마 분석 +description: 데이터베이스 스키마를 분석하여 ERD 다이어그램과 테이블 문서를 생성합니다. +icon: \uE968 +tabs: code +--- + +작업 폴더의 코드에서 데이터베이스 스키마를 분석하고 문서화하세요. + +## 분석 대상 +- ORM 모델/엔티티 클래스 (Entity Framework, SQLAlchemy, Sequelize, JPA 등) +- 마이그레이션 파일 +- SQL DDL 스크립트 (CREATE TABLE) +- 관계 정의 (FK, Navigation Property) + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — 엔티티/모델 클래스 검색 (`DbSet`, `@Entity`, `Model.define`, `CREATE TABLE` 등) +3. `file_read` — 모델 파일 분석 (컬럼, 타입, 관계) +4. `grep_tool` — 인덱스, 제약 조건 검색 +5. `file_write` — 스키마 문서 + Mermaid ERD 생성 + +## 출력 형식 + +### 테이블 문서 +각 테이블에 대해: +``` +## Users 테이블 +| 컬럼 | 타입 | Null | 기본값 | 설명 | +|------|------|------|--------|------| +| Id | int | NO | AUTO_INCREMENT | PK | +| Name | nvarchar(100) | NO | - | 사용자 이름 | +| CreatedAt | datetime | NO | GETDATE() | 생성일 | + +- **인덱스**: IX_Users_Name (Name) +- **관계**: Orders (1:N), Profile (1:1) +``` + +### Mermaid ERD +```mermaid +erDiagram + Users ||--o{ Orders : "has" + Users ||--|| Profile : "has" + Users { + int Id PK + string Name + datetime CreatedAt + } + Orders { + int Id PK + int UserId FK + decimal Amount + } +``` + +## 주의사항 +- 코드에서 실제 확인된 스키마만 문서화하세요. +- 관계(1:1, 1:N, N:M)를 정확히 파악하세요. +- 마이그레이션이 있으면 최종 상태를 기준으로 작성하세요. diff --git a/dist/AxCopilot/skills/dependency-audit.skill.md b/dist/AxCopilot/skills/dependency-audit.skill.md new file mode 100644 index 0000000..73dbb2e --- /dev/null +++ b/dist/AxCopilot/skills/dependency-audit.skill.md @@ -0,0 +1,85 @@ +--- +name: dependency-audit +label: 의존성 분석 +description: 프로젝트 의존성 그래프를 분석하고 보안 취약점, 라이선스, 업데이트 현황을 보고합니다. +icon: \uE964 +allowed-tools: + - file_read + - grep + - folder_map + - glob + - html_create + - process +tabs: code +--- + +프로젝트의 패키지 의존성을 분석하여 보안, 라이선스, 업데이트 보고서를 생성하세요. + +## 워크플로우 + +1. **패키지 파일 탐지**: glob으로 의존성 파일 검색 + - .NET: `*.csproj`, `packages.config`, `Directory.Build.props` + - Node: `package.json`, `package-lock.json`, `yarn.lock` + - Python: `requirements.txt`, `Pipfile`, `pyproject.toml` + - Java: `pom.xml`, `build.gradle` +2. **의존성 목록 추출**: file_read로 파일 파싱 +3. **분석 수행**: 각 의존성에 대해 검사 +4. **보고서 생성**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 1. 직접 의존성 목록 +| 패키지 | 현재 버전 | 최신 버전 | 업데이트 필요 | +|--------|----------|----------|-------------| +| ... | ... | ... | ✅/⚠/❌ | + +### 2. 보안 취약점 (알려진 패턴) +- 알려진 취약 버전 패턴 탐지 +- 폐기된(deprecated) 패키지 식별 +- 유지보수 중단된 패키지 경고 + +### 3. 라이선스 검사 +| 라이선스 | 호환성 | 패키지 | +|---------|--------|--------| +| MIT | ✅ 허용 | lib-a, lib-b | +| GPL-3.0 | ⚠ 주의 | lib-c | +| 상용 | ❌ 검토 필요 | lib-d | + +### 4. 의존성 크기 분석 +- 패키지별 예상 크기 +- 전체 node_modules / NuGet 캐시 크기 +- 불필요하게 큰 패키지 식별 + +### 5. 중복/충돌 검사 +- 동일 기능 중복 패키지 (예: lodash + underscore) +- 버전 충돌 가능성 + +## 프레임워크별 검사 명령 + +### .NET +``` +dotnet list package --outdated +dotnet list package --vulnerable +``` + +### Node.js +``` +npm audit +npm outdated +``` + +### Python +``` +pip list --outdated +pip-audit +``` + +## 출력 +- HTML 보고서: 위험도별 색상 구분, 차트 포함 +- 요약: 총 패키지 수, 업데이트 필요 수, 보안 이슈 수, 라이선스 경고 수 + +## 규칙 +- 외부 서버 접속 없이 로컬 파일 분석만 수행 +- process 도구 사용 시 `dotnet list` / `npm audit` 등 읽기 전용 명령만 +- 패키지를 직접 업데이트하지 않음 (보고서만) +- 한국어로 작성 diff --git a/dist/AxCopilot/skills/diagram-generator.skill.md b/dist/AxCopilot/skills/diagram-generator.skill.md new file mode 100644 index 0000000..9d887e0 --- /dev/null +++ b/dist/AxCopilot/skills/diagram-generator.skill.md @@ -0,0 +1,99 @@ +--- +name: diagram-generator +label: 다이어그램 생성 +description: Python matplotlib/graphviz를 사용하여 플로차트, 시퀀스, ER 다이어그램 등을 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 다이어그램을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib graphviz +``` +시스템에 Graphviz가 설치되어 있어야 합니다 (https://graphviz.org/download/). + +## 작업 절차 +1. **요구사항 파악**: 다이어그램 유형, 노드/관계, 스타일 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립트 실행 +4. **결과 확인**: 생성된 이미지 파일 경로를 사용자에게 안내 + +## 다이어그램 유형별 템플릿 + +### 플로차트 (Graphviz) +```python +from graphviz import Digraph + +dot = Digraph(comment='Flowchart', format='png') +dot.attr(rankdir='TB', fontname='Malgun Gothic') +dot.attr('node', shape='box', style='rounded,filled', fillcolor='#E8F0FE') + +dot.node('start', '시작', shape='ellipse', fillcolor='#34A853', fontcolor='white') +dot.node('process1', '데이터 수집') +dot.node('decision', '조건 확인?', shape='diamond', fillcolor='#FBBC04') +dot.node('process2', '처리') +dot.node('end', '종료', shape='ellipse', fillcolor='#EA4335', fontcolor='white') + +dot.edge('start', 'process1') +dot.edge('process1', 'decision') +dot.edge('decision', 'process2', label='예') +dot.edge('decision', 'end', label='아니오') +dot.edge('process2', 'end') + +dot.render('flowchart', cleanup=True) +``` + +### 시퀀스 다이어그램 (matplotlib) +```python +import matplotlib.pyplot as plt +import matplotlib.patches as patches + +fig, ax = plt.subplots(1, 1, figsize=(10, 8)) +# 액터 라이프라인, 메시지 화살표 등을 matplotlib으로 직접 그리기 +ax.set_xlim(0, 10) +ax.set_ylim(0, 10) +ax.invert_yaxis() +ax.axis('off') +plt.savefig('sequence.png', dpi=150, bbox_inches='tight') +``` + +### ER 다이어그램 (Graphviz) +```python +from graphviz import Graph + +er = Graph('ER', format='png', engine='neato') +er.attr('node', shape='box', style='filled', fillcolor='#E8F0FE') + +er.node('user', 'User\n─────\nid (PK)\nname\nemail') +er.node('order', 'Order\n─────\nid (PK)\nuser_id (FK)\ntotal') + +er.edge('user', 'order', label='1:N') +er.render('er_diagram', cleanup=True) +``` + +### 조직도 (Graphviz) +```python +from graphviz import Digraph + +org = Digraph(format='png') +org.attr(rankdir='TB') +org.attr('node', shape='box', style='rounded,filled', fillcolor='#E3F2FD') + +org.node('ceo', 'CEO') +org.node('cto', 'CTO') +org.node('cfo', 'CFO') +org.edges([('ceo', 'cto'), ('ceo', 'cfo')]) +org.render('org_chart', cleanup=True) +``` + +## 스타일 옵션 +- 폰트: `fontname='Malgun Gothic'` (한글 지원) +- 색상: HTML 컬러 코드 지원 +- 출력 형식: png, svg, pdf +- 레이아웃 엔진: dot(계층), neato(스프링), circo(원형), fdp(포스) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/dist/AxCopilot/skills/docx-creator.skill.md b/dist/AxCopilot/skills/docx-creator.skill.md new file mode 100644 index 0000000..74a62ce --- /dev/null +++ b/dist/AxCopilot/skills/docx-creator.skill.md @@ -0,0 +1,97 @@ +--- +name: docx-creator +label: Word 문서 생성 +description: Python을 사용하여 전문적인 Word 문서(.docx)를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE8A5 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 전문적인 Word 문서를 Python으로 생성하세요. + +## 사전 준비 +먼저 python-docx 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx +``` + +## 양식 활용 (템플릿 모드) +작업 폴더에 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.docx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .docx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식 파일의 구조(스타일, 헤더, 섹션)를 먼저 확인 +4. **양식 기반 생성**: + ```python + doc = Document('양식_보고서.docx') # ← 빈 Document() 대신 양식 로드 + # 양식의 스타일, 머리글/바닥글, 로고, 페이지 설정이 자동 상속됨 + # 기존 본문 내용을 지우고 새 내용만 추가 + for paragraph in doc.paragraphs: + paragraph.clear() # 기존 내용 제거 + # 또는 필요에 따라 특정 섹션만 교체 + ``` +5. **양식이 없으면**: 아래 기본 템플릿으로 새 문서 생성 + +## 작업 절차 +1. **요구사항 파악**: 사용자가 원하는 문서의 종류, 구조, 내용을 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .docx 파일이 있는지 확인 +3. **Python 스크립트 작성**: file_write로 .py 파일 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 .docx 파일 경로를 사용자에게 안내 + +## Python 스크립트 템플릿 +```python +from docx import Document +from docx.shared import Inches, Pt, Cm +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.style import WD_STYLE_TYPE +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.docx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 문서 +if template_file: + doc = Document(template_file) + print(f'양식 활용: {template_file}') +else: + doc = Document() + # 스타일 설정 (양식이 없을 때만) + style = doc.styles['Normal'] + font = style.font + font.name = '맑은 고딕' + font.size = Pt(11) + +# 제목 +doc.add_heading('문서 제목', level=0) + +# 본문 +doc.add_paragraph('내용을 여기에 작성합니다.') + +# 표 +table = doc.add_table(rows=2, cols=3) +table.style = 'Light Grid Accent 1' + +# 저장 +doc.save('output.docx') +``` + +## 지원 기능 +- 제목/소제목 계층 구조 +- 표 (스타일, 병합, 서식) +- 이미지 삽입 +- 머리글/바닥글 +- 페이지 번호 +- 목차 +- 글머리 기호/번호 목록 +- **양식 파일 기반 스타일 상속** (로고, 헤더, 페이지 설정 자동 유지) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/dist/AxCopilot/skills/email-draft.skill.md b/dist/AxCopilot/skills/email-draft.skill.md new file mode 100644 index 0000000..62f4e5f --- /dev/null +++ b/dist/AxCopilot/skills/email-draft.skill.md @@ -0,0 +1,55 @@ +--- +name: email-draft +label: 비즈니스 이메일 작성 +description: 상황과 톤에 맞는 전문적인 비즈니스 이메일 초안을 생성합니다. +icon: \uE715 +allowed-tools: + - clipboard_tool + - file_write +tabs: all +--- + +사용자의 요청에 맞는 전문적인 비즈니스 이메일을 작성하세요. + +## 워크플로우 + +1. 사용자에게 다음 정보를 확인하세요: + - **수신자**: 이름, 직급, 부서 (알고 있다면) + - **목적**: 요청 / 보고 / 안내 / 감사 / 사과 / 협조 / 초대 / 회신 + - **핵심 내용**: 전달할 주요 메시지 (1~3가지) + - **톤**: 공식(格式) / 반공식 / 친근 + - **언어**: 한국어 / 영어 / 일본어 + +2. 이메일 초안을 작성합니다: + - 적절한 인사말로 시작 + - 핵심 내용은 **굵게** 강조 + - 요청 사항은 명확하고 구체적으로 + - 마무리 인사와 서명 포함 + +3. 사용자에게 초안을 보여주고 수정 요청을 받습니다. + +4. 최종본을 clipboard_tool로 클립보드에 복사합니다. + +## 이메일 구조 + +``` +제목: [간결하고 명확한 제목] + +[수신자] 님께, + +[인사말] + +[본문 - 목적과 핵심 내용] + +[요청 사항 또는 다음 단계] + +[마무리 인사] + +[서명] +``` + +## 규칙 +- 한 문단은 3~4문장을 넘지 않도록 간결하게 +- 수동적 표현보다 능동적 표현 선호 +- 약어는 처음 사용 시 풀어 쓰기 +- 긴급도에 따라 제목에 [긴급], [참고] 등 태그 사용 diff --git a/dist/AxCopilot/skills/env-setup.skill.md b/dist/AxCopilot/skills/env-setup.skill.md new file mode 100644 index 0000000..f1b397e --- /dev/null +++ b/dist/AxCopilot/skills/env-setup.skill.md @@ -0,0 +1,152 @@ +--- +name: env-setup +label: 프로젝트 환경 설정 +description: .gitignore, requirements.txt, .editorconfig 등 프로젝트 환경 설정 파일을 자동 생성합니다. +icon: \uE835 +tabs: code +allowed-tools: + - folder_map + - file_read + - file_write + - process_run +--- + +프로젝트 유형에 맞는 환경 설정 파일을 자동으로 생성하세요. + +## 작업 절차 + +1. **프로젝트 분석**: folder_map으로 프로젝트 구조를 파악하고 유형 판별 + - `.py` 파일 → Python 프로젝트 + - `package.json` 또는 `.js/.ts` 파일 → Node.js 프로젝트 + - `.csproj` 또는 `.sln` 파일 → .NET 프로젝트 + - `pom.xml` 또는 `.java` 파일 → Java 프로젝트 + - 복합 프로젝트인 경우 모든 유형을 병합 +2. **기존 설정 확인**: 이미 존재하는 설정 파일이 있는지 확인 + - 있으면: 내용을 분석하여 누락된 항목만 추가 제안 + - 없으면: 새로 생성 +3. **생성할 파일 목록 제안**: 사용자에게 생성할 파일 목록을 보여주고 확인 +4. **파일 생성**: file_write로 각 설정 파일 생성 +5. **결과 안내**: 생성된 파일 목록과 주요 설정 내용 요약 + +## 프로젝트별 템플릿 + +### Python 프로젝트 +생성 파일: `.gitignore`, `requirements.txt`, `.editorconfig`, `setup.cfg`, `.flake8` + +**.gitignore (Python)**: +``` +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +venv/ +.venv/ +*.egg-info/ +dist/ +build/ +.eggs/ +*.egg +.mypy_cache/ +.pytest_cache/ +.coverage +htmlcov/ +.env +.idea/ +.vscode/ +*.log +``` + +**requirements.txt**: 프로젝트에서 import 문을 스캔하여 자동 생성 + +### Node.js 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `.nvmrc`, `.prettierrc` + +**.gitignore (Node)**: +``` +node_modules/ +dist/ +build/ +.env +.env.local +*.log +npm-debug.log* +.DS_Store +coverage/ +.nyc_output/ +.idea/ +.vscode/ +*.tgz +``` + +### .NET 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `Directory.Build.props` + +**.gitignore (.NET)**: +``` +bin/ +obj/ +.vs/ +*.user +*.suo +*.cache +packages/ +*.nupkg +TestResults/ +.idea/ +*.DotSettings.user +``` + +### Java 프로젝트 +생성 파일: `.gitignore`, `.editorconfig` + +**.gitignore (Java)**: +``` +*.class +*.jar +*.war +*.ear +target/ +.gradle/ +build/ +.idea/ +*.iml +.settings/ +.classpath +.project +out/ +``` + +## 공통 .editorconfig +```ini +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[*.{json,js,ts,jsx,tsx}] +indent_size = 2 + +[Makefile] +indent_style = tab +``` + +## 규칙 +- 기존 설정 파일이 있으면 덮어쓰지 않고, 누락 항목만 제안 +- .env 파일은 생성하지 않음 (보안 — 사용자가 직접 생성) +- 생성 전 파일 목록을 반드시 사용자에게 확인 +- 프로젝트 루트에 생성 (하위 폴더에 생성하지 않음) + +한국어로 안내하세요. diff --git a/dist/AxCopilot/skills/gen-test.skill.md b/dist/AxCopilot/skills/gen-test.skill.md new file mode 100644 index 0000000..ede8c8d --- /dev/null +++ b/dist/AxCopilot/skills/gen-test.skill.md @@ -0,0 +1,63 @@ +--- +name: gen-test +label: 테스트 생성기 +description: 지정 파일의 단위 테스트를 자동 생성하고 실행하여 커버리지를 분석합니다. +icon: \uE9D5 +allowed-tools: + - file_read + - file_write + - test_loop + - grep + - folder_map + - dev_env_detect + - build_run +tabs: code +--- + +지정된 소스 파일의 단위 테스트를 자동 생성하고 실행하세요. + +## 워크플로우 + +1. **환경 감지**: dev_env_detect로 프로젝트 타입, 테스트 프레임워크 확인 +2. **대상 분석**: file_read로 테스트 대상 파일 분석 + - 공개 메서드/함수 목록 추출 + - 메서드별 입출력 타입 파악 + - 의존성 확인 (Mock 필요 여부) +3. **테스트 생성**: 각 메서드에 대해 테스트 케이스 작성 + - 정상 케이스 (Happy Path) + - 경계값 (Boundary) + - 예외/에러 케이스 + - null/empty 입력 +4. **실행 및 검증**: test_loop으로 테스트 실행 +5. **결과 보고**: 성공/실패 요약, 커버리지 추정 + +## 테스트 작성 원칙 + +### 명명 규칙 +- C#: `[메서드명]_[시나리오]_[기대결과]` +- Python: `test_[메서드명]_[시나리오]` +- JavaScript: `should [기대 동작] when [조건]` + +### 테스트 구조 (AAA 패턴) +``` +Arrange — 테스트 데이터 준비 +Act — 대상 메서드 실행 +Assert — 결과 검증 +``` + +### 프레임워크별 지원 +- C#: xUnit, NUnit, MSTest +- Python: pytest, unittest +- JavaScript: Jest, Mocha, Vitest +- Java: JUnit 5 + +## 출력 +- 테스트 파일 생성 (프로젝트 컨벤션에 맞는 위치) +- 테스트 실행 결과 요약 +- 커버리지 추정 (메서드별 테스트 유무) + +## 규칙 +- 기존 테스트가 있으면 스타일을 따르기 +- 외부 의존성은 Mock/Stub 사용 +- 테스트 간 독립성 보장 (상태 공유 금지) +- 한국어 주석으로 테스트 의도 설명 diff --git a/dist/AxCopilot/skills/image-processor.skill.md b/dist/AxCopilot/skills/image-processor.skill.md new file mode 100644 index 0000000..86c6c31 --- /dev/null +++ b/dist/AxCopilot/skills/image-processor.skill.md @@ -0,0 +1,75 @@ +--- +name: image-processor +label: 이미지 처리 +description: Python Pillow를 사용하여 이미지 리사이즈, 크롭, 워터마크, 포맷 변환을 수행합니다. +icon: \uEB9F +requires: python +tabs: cowork +--- + +사용자의 요구에 맞게 이미지를 처리하세요. + +## 사전 준비 +먼저 Pillow 패키지가 설치되어 있��지 확인하고, 없으면 설���하세요: +``` +process_run: pip install Pillow +``` + +## 작업 절�� +1. **요구사항 파악**: 처리할 이미지 파일과 원하는 작업 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립�� 실행 +4. **결과 확인**: 처리된 이미지 파일 경로를 사용자에게 안내 + +## 지원 기능 + +### 리사이즈 +```python +from PIL import Image +img = Image.open('input.png') +img_resized = img.resize((800, 600)) # 고정 크기 +# 또는 비율 유지 +img.thumbnail((800, 800)) +img.save('output.png') +``` + +### 크롭 +```python +img = Image.open('input.png') +cropped = img.crop((left, top, right, bottom)) +cropped.save('output.png') +``` + +### 워터마크 +```python +from PIL import Image, ImageDraw, ImageFont +img = Image.open('input.png') +draw = ImageDraw.Draw(img) +draw.text((10, 10), "Watermark", fill=(255, 255, 255, 128)) +img.save('output.png') +``` + +### 포맷 변환 +```python +img = Image.open('input.png') +img.save('output.jpg', 'JPEG', quality=85) +img.save('output.webp', 'WEBP', quality=80) +``` + +### 배치 처리 +```python +import glob +for path in glob.glob('*.png'): + img = Image.open(path) + img.thumbnail((800, 800)) + img.save(f'resized_{path}') +``` + +## 추가 기능 +- 회전/뒤집기 (rotate, transpose) +- 밝기/대비/선명도 조절 (ImageEnhance) +- 필터 적용 (ImageFilter: BLUR, SHARPEN, CONTOUR) +- 이미지 합성 (Image.paste, Image.alpha_composite) +- EXIF 정보 읽기 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/dist/AxCopilot/skills/impact.skill.md b/dist/AxCopilot/skills/impact.skill.md new file mode 100644 index 0000000..1b0d56b --- /dev/null +++ b/dist/AxCopilot/skills/impact.skill.md @@ -0,0 +1,67 @@ +--- +name: impact +label: 변경 영향 분석 +description: 코드 변경 시 영향받는 파일, 함수, 테스트를 식별합니다. +icon: \uE946 +allowed-tools: + - lsp_code_intel + - grep + - search_codebase + - git_tool + - file_read + - folder_map +tabs: code +--- + +코드 변경이 미치는 영향 범위를 분석하여 안전한 수정을 도와주세요. + +## 워크플로우 + +1. **변경 대상 확인**: 어떤 파일/함수/클래스를 변경할 예정인지 파악 +2. **직접 참조 분석**: lsp_code_intel의 find_references로 직접 호출처 확인 +3. **간접 영향 분석**: + - grep으로 문자열 기반 참조 검색 + - search_codebase로 의미적 유사 코드 탐색 + - 상속/인터페이스 체인 추적 +4. **테스트 영향**: 관련 테스트 파일 식별 +5. **위험도 평가**: 변경 영향 범위와 위험도 매트릭스 생성 +6. **보고서 작성**: 영향 분석 보고서 생성 + +## 분석 항목 + +### 직접 영향 +- 해당 함수/클래스를 직접 호출하는 코드 +- import/using 하는 파일 +- 상속받는 클래스 + +### 간접 영향 +- 인터페이스 구현체를 통한 호출 +- 리플렉션/동적 호출 +- 설정 파일 참조 +- UI 바인딩 + +### 테스트 영향 +- 직접 테스트하는 테스트 파일 +- 관련 통합 테스트 +- 테스트 더블(Mock) 대상 여부 + +## 출력 형식 + +### 영향 분석 보고서 + +| 영향 수준 | 파일 | 관련 함수 | 위험도 | 비고 | +|----------|------|----------|--------|------| +| 🔴 직접 | A.cs | MethodX() | 높음 | 시그니처 변경 시 컴파일 오류 | +| 🟡 간접 | B.cs | MethodY() | 중간 | 동적 호출, 런타임 오류 가능 | +| 🟢 테스트 | A.Tests.cs | Test1() | 낮음 | 테스트 수정 필요 | + +### 변경 체크리스트 +- [ ] 직접 참조 N개 확인 및 수정 +- [ ] 테스트 M개 업데이트 +- [ ] 관련 문서 갱신 + +## 규칙 +- 코드를 직접 수정하지 않음 (분석만 수행) +- 가능하면 LSP 기반 정확한 참조 분석 우선 +- LSP 불가 시 grep 기반 텍스트 검색으로 대체 +- 위험도는 보수적으로 평가 (의심스러우면 높음) diff --git a/dist/AxCopilot/skills/json-schema.skill.md b/dist/AxCopilot/skills/json-schema.skill.md new file mode 100644 index 0000000..821dbf4 --- /dev/null +++ b/dist/AxCopilot/skills/json-schema.skill.md @@ -0,0 +1,107 @@ +--- +name: json-schema +label: JSON/YAML 스키마 도구 +description: JSON 또는 YAML 데이터에서 스키마를 생성하고, 데이터의 유효성을 검증합니다. +icon: \uE943 +tabs: code +allowed-tools: + - json_tool + - file_read + - file_write + - clipboard_tool +--- + +JSON/YAML 샘플 데이터에서 스키마를 추출하거나, 기존 스키마로 데이터를 검증하세요. + +## 작업 절차 + +1. **요청 유형 판별**: + - **스키마 생성**: 샘플 JSON/YAML → JSON Schema 추출 + - **스키마 검증**: 데이터 + 스키마 → 유효성 검사 + - **스키마 문서화**: 기존 스키마 → 사람이 읽을 수 있는 설명 생성 +2. **입력 데이터 확인**: file_read 또는 사용자 입력으로 데이터 로드 +3. **스키마 생성 또는 검증 수행**: json_tool로 처리 +4. **결과 출력**: 생성된 스키마 또는 검증 결과를 표시 +5. **파일 저장**: file_write로 결과를 저장하거나 clipboard_tool로 복사 + +## 스키마 생성 규칙 + +### 타입 추론 +| JSON 값 | JSON Schema 타입 | 추가 속성 | +|---------|-----------------|----------| +| `"text"` | `string` | — | +| `123` | `integer` | — | +| `1.5` | `number` | — | +| `true` | `boolean` | — | +| `null` | `null` | nullable 처리 | +| `[]` | `array` | items 스키마 | +| `{}` | `object` | properties 스키마 | + +### 추론 강화 +- **패턴 감지**: 이메일, URL, 날짜, UUID 등은 `format` 속성 추가 +- **열거형 감지**: 값의 종류가 적으면 `enum` 으로 제안 +- **필수 필드**: 모든 샘플에 존재하는 필드는 `required`로 표시 +- **배열 항목**: 배열 내 모든 항목을 분석하여 통합 스키마 생성 + +### 출력 형식 (JSON Schema Draft 7) +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "사용자 정보", + "description": "사용자 프로필 데이터 스키마", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "사용자 이름" + }, + "email": { + "type": "string", + "format": "email", + "description": "이메일 주소" + }, + "age": { + "type": "integer", + "minimum": 0, + "maximum": 150, + "description": "나이" + } + }, + "required": ["name", "email"], + "additionalProperties": false +} +``` + +## 검증 결과 형식 +검증 결과는 다음과 같이 표시하세요: +``` +검증 결과: ❌ 실패 (3건의 오류) + +| # | 경로 | 오류 | 기대값 | +|---|------|------|--------| +| 1 | $.email | 필수 필드 누락 | string (required) | +| 2 | $.age | 타입 불일치 | integer (실제: string) | +| 3 | $.tags[2] | 열거형 불일치 | "A", "B", "C" 중 하나 | +``` + +## 스키마 문서화 형식 +기존 스키마를 분석하여 사람이 읽기 쉬운 문서를 생성: +``` +## 사용자 정보 스키마 + +| 필드 | 타입 | 필수 | 설명 | 제약 조건 | +|------|------|------|------|----------| +| name | string | ✅ | 사용자 이름 | — | +| email | string | ✅ | 이메일 주소 | format: email | +| age | integer | — | 나이 | 0~150 | +| tags | array | — | 태그 목록 | items: string | +``` + +## 규칙 +- JSON Schema Draft 7 형식 사용 +- 스키마 생성 시 description 필드를 한국어로 작성 +- 복수 샘플이 제공되면 모든 샘플을 분석하여 통합 스키마 생성 +- 중첩 객체는 재귀적으로 스키마 추출 +- 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/dist/AxCopilot/skills/log-analyze.skill.md b/dist/AxCopilot/skills/log-analyze.skill.md new file mode 100644 index 0000000..0ac33d9 --- /dev/null +++ b/dist/AxCopilot/skills/log-analyze.skill.md @@ -0,0 +1,69 @@ +--- +name: log-analyze +label: 로그 분석기 +description: 로그 파일의 패턴을 분석하고 에러를 요약하며 타임라인을 시각화합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - chart_create + - html_create + - data_pivot + - text_summarize +tabs: cowork +--- + +로그 파일을 분석하여 패턴, 에러, 추세를 파악하고 보고서를 생성하세요. + +## 워크플로우 + +1. **로그 파일 로드**: file_read로 로그 파일 읽기 +2. **패턴 분석**: + - grep으로 에러/경고/예외 패턴 검색 + - 시간대별 이벤트 빈도 파악 + - 반복되는 에러 패턴 식별 +3. **통계 생성**: data_pivot으로 집계 +4. **시각화**: chart_create로 타임라인 차트 생성 +5. **보고서**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 에러 분석 +- ERROR, WARN, FATAL, Exception 키워드 추출 +- 에러 유형별 발생 빈도 +- 최초 발생 시점 및 최근 발생 시점 +- 에러 메시지 클러스터링 (유사 에러 그룹화) + +### 시간대 분석 +- 시간대별 로그 발생 빈도 +- 피크 시간대 식별 +- 에러 집중 시간대 + +### 패턴 분석 +- 반복 패턴 (주기적 에러) +- 연쇄 에러 (A 에러 후 B 에러 발생 패턴) +- 비정상 패턴 (평소와 다른 로그량) + +## 출력 형식 + +``` +## 로그 분석 보고서 +- 분석 기간: [시작] ~ [끝] +- 총 로그: N줄 + +### 에러 요약 (상위 10건) +| 순위 | 에러 유형 | 발생 횟수 | 최근 발생 | +|------|----------|----------|----------| + +### 타임라인 차트 +[시간대별 이벤트 빈도 차트] + +### 상세 분석 +[에러별 상세 내용 및 권장 조치] +``` + +## 지원 로그 형식 +- 일반 텍스트 로그 (타임스탬프 자동 감지) +- JSON 로그 (각 줄이 JSON 객체) +- CSV 로그 (헤더 포함) +- syslog 형식 diff --git a/dist/AxCopilot/skills/markdown-to-doc.skill.md b/dist/AxCopilot/skills/markdown-to-doc.skill.md new file mode 100644 index 0000000..7a852d8 --- /dev/null +++ b/dist/AxCopilot/skills/markdown-to-doc.skill.md @@ -0,0 +1,164 @@ +--- +name: markdown-to-doc +label: Markdown → 문서 변환 +description: Markdown 파일을 서식이 적용된 Word(.docx) 또는 PDF 문서로 변환합니다. +icon: \uE8A5 +tabs: cowork +requires: python +--- + +Markdown 파일을 전문적인 Word 또는 PDF 문서로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx markdown +``` + +## 작업 절차 + +1. **Markdown 파일 확인**: file_read로 변환할 Markdown 파일의 내용과 구조를 파악 +2. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 출력 형식: Word(.docx) 또는 PDF + - 폰트: 맑은 고딕 (기본) / 사용자 지정 + - 여백, 페이지 크기 설정 + - 머리글/바닥글 포함 여부 +3. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 문서 파일 경로와 페이지 수를 안내 + +## 스타일 매핑 + +| Markdown | Word 스타일 | 설명 | +|----------|------------|------| +| `# 제목` | Heading 1 | 16pt, 굵게 | +| `## 소제목` | Heading 2 | 14pt, 굵게 | +| `### 항목` | Heading 3 | 12pt, 굵게 | +| 본문 텍스트 | Normal | 11pt | +| `**굵게**` | Bold run | 굵게 | +| `*기울임*` | Italic run | 기울임 | +| `` `코드` `` | 코드 스타일 | Consolas, 배경색 | +| `> 인용` | Quote | 들여쓰기 + 왼쪽 테두리 | +| `- 목록` | List Bullet | 글머리 기호 | +| `1. 번호` | List Number | 번호 목록 | +| 표 | Table Grid | 테두리 표 | +| `---` | 페이지 구분 | 가로선 → 페이지 나누기 | +| 코드 블록 | 코드 단락 | Consolas, 회색 배경 | + +## Python 스크립트 템플릿 +```python +import re +from docx import Document +from docx.shared import Inches, Pt, Cm, RGBColor +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.oxml.ns import qn +import markdown + +# Markdown 파일 읽기 +with open('input.md', 'r', encoding='utf-8') as f: + md_content = f.read() + +doc = Document() + +# 기본 스타일 설정 +style = doc.styles['Normal'] +font = style.font +font.name = '맑은 고딕' +font.size = Pt(11) +style.element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕') + +# 여백 설정 +for section in doc.sections: + section.top_margin = Cm(2.54) + section.bottom_margin = Cm(2.54) + section.left_margin = Cm(3.17) + section.right_margin = Cm(3.17) + +# Markdown 파싱 및 변환 +lines = md_content.split('\n') +i = 0 +while i < len(lines): + line = lines[i] + + # 제목 (Heading) + if line.startswith('#'): + level = len(line) - len(line.lstrip('#')) + text = line.lstrip('#').strip() + doc.add_heading(text, level=min(level, 4)) + + # 코드 블록 + elif line.startswith('```'): + code_lines = [] + i += 1 + while i < len(lines) and not lines[i].startswith('```'): + code_lines.append(lines[i]) + i += 1 + p = doc.add_paragraph() + run = p.add_run('\n'.join(code_lines)) + run.font.name = 'Consolas' + run.font.size = Pt(9) + + # 인용 + elif line.startswith('>'): + text = line.lstrip('>').strip() + p = doc.add_paragraph(text) + p.paragraph_format.left_indent = Cm(1.27) + + # 글머리 기호 + elif line.startswith('- ') or line.startswith('* '): + text = line[2:].strip() + doc.add_paragraph(text, style='List Bullet') + + # 번호 목록 + elif re.match(r'^\d+\.\s', line): + text = re.sub(r'^\d+\.\s', '', line).strip() + doc.add_paragraph(text, style='List Number') + + # 가로선 → 페이지 나누기 + elif line.strip() in ('---', '***', '___'): + doc.add_page_break() + + # 빈 줄 + elif line.strip() == '': + pass + + # 일반 텍스트 + else: + p = doc.add_paragraph() + # 굵게, 기울임 처리 + parts = re.split(r'(\*\*.*?\*\*|\*.*?\*|`.*?`)', line) + for part in parts: + if part.startswith('**') and part.endswith('**'): + run = p.add_run(part[2:-2]) + run.bold = True + elif part.startswith('*') and part.endswith('*'): + run = p.add_run(part[1:-1]) + run.italic = True + elif part.startswith('`') and part.endswith('`'): + run = p.add_run(part[1:-1]) + run.font.name = 'Consolas' + run.font.size = Pt(10) + else: + p.add_run(part) + + i += 1 + +# 저장 +doc.save('output.docx') +print(f'변환 완료: output.docx ({len(doc.paragraphs)}개 단락)') +``` + +## 표 변환 +Markdown 표가 있으면 Word 표로 변환합니다: +- 헤더 행: 굵게, 배경색 적용 +- 셀 정렬: Markdown의 `:---`, `:---:`, `---:` 구문 반영 +- 테두리: 전체 셀에 얇은 테두리 + +## 규칙 +- 원본 Markdown 파일은 수정하지 않음 +- 인코딩: UTF-8 기본 +- 이미지 링크(`![](path)`)는 로컬 파일이면 삽입, URL이면 경로만 표시 +- 복잡한 Markdown(수식, 다이어그램)은 지원 범위와 한계를 안내 +- 출력 파일명: 원본 파일명 기준 (.md → .docx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/dist/AxCopilot/skills/meeting-minutes.skill.md b/dist/AxCopilot/skills/meeting-minutes.skill.md new file mode 100644 index 0000000..e3ec988 --- /dev/null +++ b/dist/AxCopilot/skills/meeting-minutes.skill.md @@ -0,0 +1,40 @@ +--- +name: meeting-minutes +label: 회의록 정리 +description: 회의 내용을 체계적으로 정리하여 회의록을 생성합니다. +icon: \uE771 +tabs: cowork +--- + +사용자가 제공한 회의 내용(텍스트, 메모, 파일)을 정리하여 체계적인 회의록을 작성하세요. + +다음 도구를 사용하세요: +1. file_read — 회의 관련 파일 읽기 (필요 시) +2. file_write — 회의록 파일 생성 + +회의록 형식: +## 회의 정보 +- 일시: +- 참석자: +- 장소/방법: +- 주제: + +## 안건 및 논의 내용 +각 안건별로: +- **안건**: 주제 +- **논의 내용**: 주요 발언 및 의견 정리 +- **결정 사항**: 합의된 내용 + +## 액션 아이템 +| 번호 | 담당자 | 내용 | 기한 | 비고 | +|------|--------|------|------|------| +| 1 | - | - | - | - | + +## 다음 회의 +- 예정일: +- 주요 안건: + +규칙: +- 핵심 내용 위주로 간결하게 정리 +- 결정 사항과 액션 아이템은 명확하게 기술 +- 한국어로 작성 diff --git a/dist/AxCopilot/skills/ocr-extract.skill.md b/dist/AxCopilot/skills/ocr-extract.skill.md new file mode 100644 index 0000000..8c7e71d --- /dev/null +++ b/dist/AxCopilot/skills/ocr-extract.skill.md @@ -0,0 +1,108 @@ +--- +name: ocr-extract +label: OCR 텍스트 추출 +description: Python pytesseract를 사용하여 이미지/스캔 문서에서 텍스트를 추출합니다. +icon: \uE8D4 +requires: python +tabs: cowork +--- + +이미지 또는 스캔된 문서에서 텍스트를 추출하세요. + +## 사전 준비 +1. Tesseract OCR 엔진이 시스템에 설치되어 있어야 합니다. + - Windows: https://github.com/UB-Mannheim/tesseract/wiki 에서 설치 + - 한국어 지원: 설치 시 "Korean" 언어 데이터 선택 +2. Python 패키지 설치: +``` +process_run: pip install pytesseract Pillow +``` + +## 작업 절차 +1. **이미지 확인**: 사용자가 제공한 이미지 파일 확인 +2. **전처리 (선택)**: 이미지 품질이 낮으면 전처리 스크립트 적용 +3. **OCR 실행**: pytesseract로 텍스트 추출 +4. **결과 저장**: 추출된 텍스트를 파일로 저장하고 사용자에게 안내 + +## OCR 스크립트 템플릿 + +### 기본 텍스트 추출 +```python +import pytesseract +from PIL import Image + +# Windows에서 Tesseract 경로 지정 (필요 시) +# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' + +img = Image.open('scan.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +print(text) + +with open('extracted.txt', 'w', encoding='utf-8') as f: + f.write(text) +``` + +### 이미지 전처리 (품질 개선) +```python +from PIL import Image, ImageFilter, ImageEnhance + +img = Image.open('scan.png') + +# 그레이스케일 변환 +img = img.convert('L') + +# 대비 향상 +enhancer = ImageEnhance.Contrast(img) +img = enhancer.enhance(2.0) + +# 선명도 향상 +img = img.filter(ImageFilter.SHARPEN) + +# 이진화 (흑백) +threshold = 128 +img = img.point(lambda x: 255 if x > threshold else 0) + +img.save('preprocessed.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +``` + +### 배치 OCR (여러 이미지) +```python +import glob +import pytesseract +from PIL import Image + +results = [] +for path in sorted(glob.glob('*.png')): + img = Image.open(path) + text = pytesseract.image_to_string(img, lang='kor+eng') + results.append(f'--- {path} ---\n{text}\n') + +with open('all_extracted.txt', 'w', encoding='utf-8') as f: + f.write('\n'.join(results)) +``` + +### 표 영역 추출 +```python +import pytesseract +from PIL import Image + +img = Image.open('table.png') +# TSV 형식으로 추출 (표 구조 보존) +tsv_data = pytesseract.image_to_data(img, lang='kor+eng', output_type=pytesseract.Output.DATAFRAME) +print(tsv_data) +``` + +## 지원 언어 +- `kor` — 한국어 +- `eng` — 영어 +- `kor+eng` — 한국어+영어 혼합 (권장) +- `jpn` — 일본어 +- `chi_sim` — 중국어 간체 + +## 팁 +- 스캔 해상도 300dpi 이상이면 인식률이 높습니다 +- 기울어진 이미지는 `img.rotate()` 로 보정 후 추출하세요 +- 손글씨는 인식률이 낮을 수 있습니다 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/dist/AxCopilot/skills/paper-review.skill.md b/dist/AxCopilot/skills/paper-review.skill.md new file mode 100644 index 0000000..72b558c --- /dev/null +++ b/dist/AxCopilot/skills/paper-review.skill.md @@ -0,0 +1,54 @@ +--- +name: paper-review +label: 논문 분석 +description: 논문 또는 기술 문서를 체계적으로 분석하고 핵심 내용을 정리합니다. +icon: \uE736 +tabs: cowork +--- + +사용자가 제공한 논문 또는 기술 문서를 체계적으로 분석하세요. + +## 파일 읽기 전략 +- **PDF 파일**: 반드시 `document_read` 도구를 사용하세요. 페이지 범위 지정이 가능합니다. + - 먼저 전체 페이지 수를 확인한 후, 초록(1-2페이지)→본문→참고문헌 순으로 읽으세요. + - `file_read`로 PDF를 읽으면 텍스트가 깨질 수 있으므로 사용하지 마세요. +- **텍스트 파일** (.txt, .md, .html 등): `file_read` 도구를 사용하세요. + +## 사용 도구 +1. document_read — PDF 논문 파일 읽기 (페이지 범위 지정, 초록/참고문헌 추출) +2. file_read — 텍스트 기반 문서 파일 읽기 +3. file_write — 분석 보고서 생성 + +## 분석 항목 +## 논문 개요 +- 제목, 저자, 발표 연도/학회 +- 연구 분야 및 키워드 + +## 연구 목적 및 배경 +- 연구 문제 정의 +- 기존 연구의 한계점 + +## 방법론 +- 제안 방법의 핵심 아이디어 +- 실험 설계 및 데이터셋 + +## 주요 결과 +- 핵심 실험 결과 (표/수치 인용) +- 기존 방법 대비 개선점 + +## 한계점 및 향후 연구 +- 저자가 인정한 한계 +- 발전 가능성 + +## 실무 적용 가능성 +- 우리 업무에 적용할 수 있는 포인트 +- 기술 도입 시 고려사항 + +## 작업 절차 +1. 사용자가 파일명을 언급하면 작업 폴더에서 해당 파일을 찾아 읽기 +2. PDF인 경우 `document_read`로 초록(1-2p) 먼저 읽어 전체 구조 파악 +3. 본문을 페이지 범위별로 나누어 순차 읽기 +4. 위 분석 항목에 따라 체계적으로 정리 +5. `file_write`로 분석 보고서를 마크다운 파일로 저장 + +한국어로 작성하고, 전문 용어는 원문과 함께 표기하세요. diff --git a/dist/AxCopilot/skills/pdf-processor.skill.md b/dist/AxCopilot/skills/pdf-processor.skill.md new file mode 100644 index 0000000..4076e47 --- /dev/null +++ b/dist/AxCopilot/skills/pdf-processor.skill.md @@ -0,0 +1,63 @@ +--- +name: pdf-processor +label: PDF 처리 +description: Python을 사용하여 PDF에서 텍스트/표를 추출하거나 PDF를 생성합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +PDF 파일을 읽거나 새 PDF를 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pypdf pdfplumber reportlab +``` + +## 작업 절차 + +### PDF 텍스트 추출 +1. **파일 확인**: folder_map으로 PDF 파일 위치 확인 +2. **추출 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행**: process_run으로 실행 +4. **결과 전달**: 추출된 텍스트를 사용자에게 전달 + +### PDF 생성 +1. **내용 파악**: 사용자가 원하는 문서 내용 확인 +2. **생성 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행 및 확인**: process_run으로 실행 + +## 텍스트 추출 템플릿 +```python +import pdfplumber +import json + +results = [] +with pdfplumber.open('input.pdf') as pdf: + for i, page in enumerate(pdf.pages): + text = page.extract_text() or '' + tables = page.extract_tables() or [] + results.append({ + 'page': i + 1, + 'text': text, + 'tables': tables, + }) + +with open('pdf_extracted.json', 'w', encoding='utf-8') as f: + json.dump(results, f, ensure_ascii=False, indent=2) + +for r in results: + print(f"--- 페이지 {r['page']} ---") + print(r['text'][:500]) +``` + +## 지원 기능 +- 텍스트 추출 (페이지별) +- 표 추출 (구조 보존) +- PDF 병합 / 분할 +- PDF 생성 (reportlab) +- 페이지 회전 +- 메타데이터 읽기 + +한국어로 안내하세요. 원본 PDF는 수정하지 마세요. diff --git a/dist/AxCopilot/skills/perf-audit.skill.md b/dist/AxCopilot/skills/perf-audit.skill.md new file mode 100644 index 0000000..9db18d8 --- /dev/null +++ b/dist/AxCopilot/skills/perf-audit.skill.md @@ -0,0 +1,94 @@ +--- +name: perf-audit +label: 성능 감사 +description: 코드 복잡도, 성능 병목, 메모리 이슈를 분석하고 최적화 방안을 제시합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - glob + - html_create +tabs: code +--- + +코드베이스의 성능 관련 이슈를 분석하고 최적화 보고서를 생성하세요. + +## 워크플로우 + +1. **프로젝트 분석**: folder_map으로 구조 파악, 언어/프레임워크 식별 +2. **복잡도 분석**: 파일별 줄 수, 메서드 크기, 중첩 깊이 측정 +3. **성능 안티패턴 탐지**: grep으로 알려진 성능 이슈 패턴 검색 +4. **메모리 이슈 탐지**: 리소스 해제 누락, 대용량 할당 패턴 +5. **보고서 생성**: html_create로 성능 감사 보고서 + +## 분석 항목 + +### 코드 복잡도 지표 +- **파일 크기**: 500줄 이상 파일 식별 +- **메서드 크기**: 50줄 이상 메서드 식별 +- **중첩 깊이**: 4단계 이상 들여쓰기 +- **매개변수 수**: 5개 이상 파라미터 메서드 + +### 성능 안티패턴 + +#### 데이터베이스 +- N+1 쿼리 패턴 (루프 내 DB 호출) +- SELECT * 사용 (불필요한 컬럼 로드) +- 인덱스 미사용 쿼리 힌트 + +#### 메모리 +- IDisposable 미해제 (using 미사용) +- 대용량 문자열 결합 (StringBuilder 미사용) +- 정적 컬렉션 무한 증가 +- 이벤트 핸들러 미해제 (메모리 누수) + +#### I/O +- 동기 파일 I/O (async 미사용) +- 동기 네트워크 호출 +- 불필요한 직렬화/역직렬화 + +#### 알고리즘 +- O(n²) 이상 루프 (중첩 foreach/for) +- 반복 계산 (캐싱 미적용) +- LINQ 체인의 불필요한 ToList() + +#### 프론트엔드 +- 불필요한 리렌더링 패턴 +- 대용량 번들 임포트 +- 이미지 최적화 미적용 + +### .NET 전용 패턴 +``` +탐지 대상: +- Task.Result / .Wait() (데드락 위험) +- lock 내부 async 호출 +- GC.Collect() 직접 호출 +- Reflection 반복 사용 +- string + string 반복 (루프 내) +``` + +## 출력 형식 + +### 성능 감사 보고서 + +**요약 대시보드** +| 지표 | 값 | 상태 | +|------|-----|------| +| 총 파일 수 | ... | — | +| 대형 파일 (500줄+) | ... | ⚠ | +| 대형 메서드 (50줄+) | ... | ⚠ | +| 성능 안티패턴 | ... | 🔴 | +| 메모리 이슈 | ... | 🟡 | + +**상세 이슈 목록** +| 우선순위 | 파일 | 라인 | 이슈 | 영향 | 권장 조치 | +|---------|------|------|------|------|----------| +| 🔴 높음 | ... | ... | N+1 쿼리 | 응답 지연 | 일괄 로드 | + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 성능 이슈는 영향도와 수정 난이도를 함께 평가 +- 추측보다 패턴 기반 탐지 우선 +- 한국어로 작성 diff --git a/dist/AxCopilot/skills/pptx-creator.skill.md b/dist/AxCopilot/skills/pptx-creator.skill.md new file mode 100644 index 0000000..eeea93c --- /dev/null +++ b/dist/AxCopilot/skills/pptx-creator.skill.md @@ -0,0 +1,111 @@ +--- +name: pptx-creator +label: PPT 프레젠테이션 생성 +description: Python을 사용하여 전문적인 PowerPoint 프레젠테이션을 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE7BE +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 PowerPoint 프레젠테이션을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install python-pptx +``` + +## 양식 활용 (마스터 슬라이드 템플릿) +작업 폴더에 PPT 양식이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.pptx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .pptx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식의 슬라이드 레이아웃 목록 확인 +4. **양식 기반 생성**: + ```python + prs = Presentation('양식_발표.pptx') + # 마스터 슬라이드의 배경, 로고, 색 테마, 폰트가 자동 상속 + # 기존 슬라이드 제거 후 새 내용 추가 + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + ``` +5. **레이아웃 확인** (양식마다 다를 수 있음): + ```python + for i, layout in enumerate(prs.slide_layouts): + print(f'{i}: {layout.name}') + ``` +6. **양식이 없으면**: 아래 기본 템플릿으로 새 프레젠테이션 생성 + +## 작업 절차 +1. **요구사항 파악**: 발표 주제, 슬라이드 수, 스타일 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .pptx 파일이 있는지 확인 +3. **스크립트 작성**: file_write로 Python 스크립트 생성 +4. **실행**: process_run으로 스크립트 실행 +5. **결과 안내**: 생성된 .pptx 파일 경로를 사용자에게 전달 + +## 스크립트 템플릿 +```python +from pptx import Presentation +from pptx.util import Inches, Pt, Emu +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.pptx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 프레젠테이션 +if template_file: + prs = Presentation(template_file) + # 기존 슬라이드 제거 (마스터/레이아웃은 유지) + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + print(f'양식 활용: {template_file}') + print(f'사용 가능한 레이아웃: {[l.name for l in prs.slide_layouts]}') +else: + prs = Presentation() + prs.slide_width = Inches(13.333) + prs.slide_height = Inches(7.5) + +# 제목 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[0]) +slide.shapes.title.text = '프레젠테이션 제목' +if len(slide.placeholders) > 1: + slide.placeholders[1].text = '부제목' + +# 내용 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[1]) +slide.shapes.title.text = '섹션 제목' +body = slide.placeholders[1] +body.text = '첫 번째 포인트' +p = body.text_frame.add_paragraph() +p.text = '두 번째 포인트' + +prs.save('presentation.pptx') +print('프레젠테이션 생성 완료: presentation.pptx') +``` + +## 지원 기능 +- 제목/내용/빈 슬라이드 레이아웃 +- 텍스트 서식 (글꼴, 크기, 색상, 정렬) +- 표 삽입 +- 이미지 삽입 +- 도형 (사각형, 원, 화살표) +- 차트 (막대, 선, 원형) +- 슬라이드 번호 +- 마스터 슬라이드 커스터마이징 +- **양식 파일 기반 마스터/레이아웃 상속** (배경, 로고, 색 테마, 폰트 자동 유지) + +한국어로 안내하세요. 작업 폴더에 결과 파일을 저장하세요. diff --git a/dist/AxCopilot/skills/prd-generator.skill.md b/dist/AxCopilot/skills/prd-generator.skill.md new file mode 100644 index 0000000..8236401 --- /dev/null +++ b/dist/AxCopilot/skills/prd-generator.skill.md @@ -0,0 +1,100 @@ +--- +name: prd-generator +label: 요구사항 정의서 (PRD) +description: 제품 요구사항 정의서, 유저 스토리, 수용 기준을 체계적으로 생성합니다. +icon: \uE8A5 +allowed-tools: + - file_read + - file_write + - html_create + - docx_create + - document_plan + - document_assemble +tabs: cowork +--- + +제품/기능의 요구사항 정의서(PRD)를 체계적으로 작성하세요. + +## 워크플로우 + +1. **요구사항 수집**: 사용자에게 다음을 확인 + - 제품/기능 이름 + - 목적과 배경 + - 대상 사용자 + - 핵심 기능 목록 + - 제약 조건 (기술, 일정, 예산) + +2. **구조화**: document_plan으로 PRD 개요 설계 + +3. **상세 작성**: 섹션별 상세 내용 작성 + - 유저 스토리 (As a... I want... So that...) + - 수용 기준 (Given... When... Then...) + - 기능 우선순위 (MoSCoW) + +4. **문서 생성**: document_assemble 또는 html_create로 최종 문서 + +## PRD 구조 + +### 1. 개요 +- 제품/기능 이름 +- 버전 / 작성일 / 작성자 +- 문서 목적 + +### 2. 배경 및 목적 +- 비즈니스 배경 +- 해결하려는 문제 +- 기대 효과 (정량적 KPI) + +### 3. 대상 사용자 +- 사용자 페르소나 +- 사용 시나리오 +- 사용자 여정 맵 + +### 4. 기능 요구사항 + +#### 유저 스토리 형식 +``` +US-001: [기능명] +As a [역할], +I want [기능], +So that [가치]. + +수용 기준: +- Given [사전 조건], When [행동], Then [기대 결과] +- Given ..., When ..., Then ... + +우선순위: Must Have / Should Have / Could Have / Won't Have +``` + +### 5. 비기능 요구사항 +- 성능 (응답 시간, 처리량) +- 보안 (인증, 권한, 암호화) +- 접근성 (WCAG 수준) +- 호환성 (브라우저, OS, 디바이스) + +### 6. 기술 제약 +- 기술 스택 제한 +- 연동 시스템 +- 데이터 마이그레이션 + +### 7. 일정 및 마일스톤 +| 마일스톤 | 예정일 | 산출물 | +|---------|--------|--------| +| 설계 완료 | ... | 상세 설계서 | +| 개발 완료 | ... | 릴리즈 빌드 | +| QA 완료 | ... | 테스트 보고서 | + +### 8. 성공 지표 +- 핵심 KPI 및 측정 방법 +- 목표 수치 + +### 9. 리스크 및 대안 +| 리스크 | 영향 | 대안 | +|--------|------|------| +| ... | 높음 | ... | + +## 규칙 +- 사용자 관점에서 작성 (기술 용어 최소화) +- 유저 스토리는 INVEST 원칙 준수 (Independent, Negotiable, Valuable, Estimable, Small, Testable) +- 수용 기준은 테스트 가능하도록 구체적으로 +- 한국어로 작성 (영어 용어 병기 가능) diff --git a/dist/AxCopilot/skills/refactor.skill.md b/dist/AxCopilot/skills/refactor.skill.md new file mode 100644 index 0000000..a58d54e --- /dev/null +++ b/dist/AxCopilot/skills/refactor.skill.md @@ -0,0 +1,65 @@ +--- +name: refactor +label: 리팩토링 가이드 +description: 코드베이스를 분석하여 리팩토링 포인트를 식별하고 실행 계획을 생성합니다. +icon: \uE90F +allowed-tools: + - search_codebase + - grep + - file_read + - code_review + - folder_map + - lsp_code_intel +tabs: code +--- + +코드베이스를 분석하여 리팩토링이 필요한 부분을 식별하고 개선 계획을 수립하세요. + +## 워크플로우 + +1. **구조 파악**: folder_map + grep으로 프로젝트 전체 구조 분석 +2. **코드 스멜 탐지**: + - 중복 코드 (grep으로 유사 패턴 검색) + - 긴 메서드/클래스 (file_read로 크기 확인) + - 복잡한 조건문 (중첩 if/switch) + - 미사용 코드 (lsp_code_intel로 참조 확인) +3. **의존성 분석**: lsp_code_intel로 참조 관계 파악 +4. **우선순위 결정**: 영향도 × 난이도 매트릭스 +5. **리팩토링 계획 생성**: 단계별 실행 계획 + +## 분석 항목 + +### 코드 스멜 (Code Smells) +- **중복 코드**: 3곳 이상 반복되는 유사 코드 +- **거대 클래스**: 500줄 이상의 클래스 +- **긴 메서드**: 50줄 이상의 메서드 +- **매개변수 과다**: 5개 이상 파라미터 +- **의존성 순환**: 상호 참조 관계 +- **매직 넘버**: 하드코딩된 숫자/문자열 +- **깊은 중첩**: 4단계 이상 들여쓰기 + +### 리팩토링 기법 (제안) +- Extract Method / Extract Class +- Rename (변수, 메서드, 클래스) +- Move Method / Move Field +- Replace Conditional with Polymorphism +- Introduce Parameter Object +- Remove Dead Code + +## 출력 형식 + +### 리팩토링 보고서 +| 우선순위 | 파일 | 이슈 | 제안 | 영향도 | 난이도 | +|---------|------|------|------|--------|--------| +| 🔴 높음 | ... | ... | ... | ★★★ | ★☆☆ | +| 🟡 중간 | ... | ... | ... | ★★☆ | ★★☆ | + +### 실행 계획 +1. [안전한 변경부터] ... +2. [테스트 추가 후] ... +3. [구조 변경] ... + +## 규칙 +- 코드를 직접 수정하지 않음 (분석 + 계획만) +- 기존 테스트가 있으면 테스트 커버리지 확인 +- 팀 컨벤션/스타일 가이드 존중 diff --git a/dist/AxCopilot/skills/regex-helper.skill.md b/dist/AxCopilot/skills/regex-helper.skill.md new file mode 100644 index 0000000..91e10dd --- /dev/null +++ b/dist/AxCopilot/skills/regex-helper.skill.md @@ -0,0 +1,86 @@ +--- +name: regex-helper +label: 정규식 도우미 +description: 정규식 패턴을 생성하고, 기존 패턴을 해석하며, 테스트 케이스로 검증합니다. +icon: \uE8FD +tabs: code +allowed-tools: + - regex_tool + - clipboard_tool + - file_read +--- + +사용자의 요구에 맞는 정규식 패턴을 작성하거나, 기존 패턴을 해석하고 테스트하세요. + +## 작업 절차 + +1. **요구사항 파악**: 사용자의 요청 유형을 판별 + - **패턴 생성**: "이메일 주소를 찾는 정규식 만들어줘" + - **패턴 해석**: "이 정규식이 무슨 뜻이야? `^[\w.-]+@[\w.-]+\.\w+$`" + - **패턴 테스트**: "이 패턴이 이 문자열에 매칭되는지 확인해줘" +2. **패턴 작성 또는 분석**: + - 생성: 요구사항을 분석하여 정규식 패턴 작성 + - 해석: 패턴을 구성 요소별로 분해하여 설명 +3. **테스트 수행**: regex_tool로 패턴을 테스트 케이스에 적용 + - 매칭되어야 할 문자열 (positive cases) + - 매칭되지 않아야 할 문자열 (negative cases) +4. **결과 설명**: 매칭 결과와 캡처 그룹을 상세히 설명 +5. **최적화 제안**: 성능 또는 가독성 개선이 가능하면 대안 제시 + +## 패턴 생성 가이드 + +### 자주 사용되는 패턴 +| 용도 | 패턴 | 설명 | +|------|------|------| +| 이메일 | `[\w.-]+@[\w.-]+\.\w{2,}` | 기본 이메일 형식 | +| 전화번호 (한국) | `0\d{1,2}-\d{3,4}-\d{4}` | 010-1234-5678 형식 | +| 날짜 (YYYY-MM-DD) | `\d{4}-(?:0[1-9]\|1[0-2])-(?:0[1-9]\|[12]\d\|3[01])` | ISO 날짜 형식 | +| IP 주소 | `(?:\d{1,3}\.){3}\d{1,3}` | IPv4 기본 | +| URL | `https?://[\w.-]+(?:/[\w./?#&=-]*)?` | HTTP/HTTPS URL | +| 한글만 | `[가-힣]+` | 한글 문자 | +| 사업자등록번호 | `\d{3}-\d{2}-\d{5}` | 123-45-67890 형식 | + +### 패턴 해석 형식 +패턴을 해석할 때는 다음 구조로 설명하세요: +``` +패턴: ^(\d{3})-(\d{2})-(\d{5})$ +해석: + ^ → 문자열 시작 + (\d{3}) → 캡처 그룹 1: 숫자 3자리 + - → 하이픈 (리터럴) + (\d{2}) → 캡처 그룹 2: 숫자 2자리 + - → 하이픈 (리터럴) + (\d{5}) → 캡처 그룹 3: 숫자 5자리 + $ → 문자열 끝 +``` + +## 테스트 형식 +테스트 결과는 다음 형식으로 표시하세요: +``` +패턴: \d{3}-\d{2}-\d{5} + +✅ 매칭 성공: + "123-45-67890" → 전체 매칭: "123-45-67890" + "사업자번호: 123-45-67890입니다" → 부분 매칭: "123-45-67890" + +❌ 매칭 실패: + "12-345-67890" → 형식 불일치 + "abc-de-fghij" → 숫자가 아닌 문자 +``` + +## 플래그 안내 +| 플래그 | 설명 | +|--------|------| +| `i` | 대소문자 무시 | +| `m` | 멀티라인 (^$가 각 줄에 적용) | +| `s` | 점(.)이 줄바꿈도 매칭 | +| `g` | 전역 검색 (모든 매칭) | + +## 규칙 +- 패턴 생성 시 positive/negative 테스트 케이스를 반드시 포함 +- 복잡한 패턴은 주석이 포함된 확장 모드(`x`)로 설명 +- 캡처 그룹이 있으면 각 그룹의 의미를 설명 +- 성능에 민감한 경우 탐욕적/게으른 수량자 선택 이유를 설명 +- 최종 패턴은 clipboard_tool로 클립보드에 복사 + +한국어로 안내하세요. diff --git a/dist/AxCopilot/skills/release-note.skill.md b/dist/AxCopilot/skills/release-note.skill.md new file mode 100644 index 0000000..2dc122a --- /dev/null +++ b/dist/AxCopilot/skills/release-note.skill.md @@ -0,0 +1,96 @@ +--- +name: release-note +label: 릴리즈 노트 생성 +description: 비개발자 대상의 사용자 친화적인 릴리즈 노트를 자동 생성합니다. +icon: \uE70B +tabs: code +allowed-tools: + - file_read + - file_write + - clipboard_tool + - html_create +--- + +사용자(비개발자) 대상의 읽기 쉬운 릴리즈 노트를 작성하세요. + +## 작업 절차 + +1. **변경 정보 수집**: 사용자에게 다음 정보를 확인 + - 버전 번호 (예: v1.6.0) + - 릴리즈 날짜 + - 주요 변경 내용 (기능 추가, 개선, 버그 수정) + - 참고 자료: CHANGELOG, 커밋 이력, 개발 문서 등 +2. **내용 분류**: 수집된 변경 사항을 사용자 관점으로 분류 + - 기술 용어 → 사용자 언어로 변환 + - 내부 리팩토링 등 사용자에게 무관한 항목은 제외 +3. **릴리즈 노트 초안 작성**: 아래 템플릿 기반으로 작성 +4. **사용자 검토**: 초안을 보여주고 수정 요청 반영 +5. **최종 출력**: Markdown, HTML, 또는 텍스트 형식으로 저장 + +## 릴리즈 노트 템플릿 + +```markdown +# [제품명] v[버전] 업데이트 안내 + +안녕하세요. [제품명] v[버전] 업데이트 소식을 안내드립니다. + +## 🎉 새로운 기능 + +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] + +## ✨ 개선 사항 + +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] + +## 🐛 문제 해결 + +- [사용자가 겪었던 문제]를 해결했습니다. +- [사용자가 겪었던 문제]를 해결했습니다. + +## ⚠️ 알려진 이슈 + +- [현재 알려진 제한 사항이나 이슈] +- [해결 예정 시기 또는 임시 해결 방법] + +--- + +문의 사항이 있으시면 [연락처/채널]로 알려주세요. +감사합니다. +``` + +## 작성 원칙 + +### 사용자 언어로 변환 +| 개발 용어 (사용 금지) | 사용자 표현 (사용) | +|---------------------|-------------------| +| API 엔드포인트 추가 | 새로운 연동 기능 추가 | +| 메모리 누수 수정 | 장시간 사용 시 느려지는 문제 해결 | +| UI 리팩토링 | 화면 디자인 개선 | +| 캐시 최적화 | 실행 속도 개선 | +| null 참조 오류 수정 | 예기치 않은 오류로 종료되는 문제 해결 | +| 인코딩 이슈 수정 | 한글이 깨져 보이는 문제 해결 | +| 동시성 버그 수정 | 여러 작업 동시 실행 시 오류 발생 문제 해결 | + +### 작성 규칙 +- **혜택 중심**: "무엇을 했다"가 아닌 "사용자에게 어떤 도움이 되는지" 설명 +- **간결**: 한 항목당 1~2문장 이내 +- **구체적**: "성능 개선" → "파일 열기 속도가 약 2배 빨라졌습니다" +- **긍정적 톤**: 문제를 "해결했습니다", 기능을 "추가했습니다" +- **이모지 활용**: 섹션별 시각적 구분 (새 기능: 🎉, 개선: ✨, 수정: 🐛, 주의: ⚠️) + +## 출력 형식 +- **Markdown**: 기본 출력 형식 (.md) +- **HTML**: html_create로 스타일이 적용된 웹 페이지 생성 +- **텍스트**: 이메일 본문용 서식 없는 텍스트 +- 사용자가 원하는 형식으로 제공 + +## 규칙 +- 내부 기술 구현 세부사항은 노출하지 않음 +- 사용자에게 무관한 변경(코드 리팩토링, 테스트 추가 등)은 제외 +- Breaking Change가 있으면 "이전 버전과 달라진 점" 섹션 추가 +- 업데이트 방법 안내를 포함 (인스톨러 경로, 주의사항) +- 최종 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/dist/AxCopilot/skills/report-writer.skill.md b/dist/AxCopilot/skills/report-writer.skill.md new file mode 100644 index 0000000..f5e9181 --- /dev/null +++ b/dist/AxCopilot/skills/report-writer.skill.md @@ -0,0 +1,33 @@ +--- +name: report-writer +label: 보고서 작성 +description: 작업 폴더의 데이터를 분석하여 체계적인 업무 보고서를 생성합��다. +icon: \uE9F9 +tabs: cowork +--- + +작업 폴더의 파일과 데이터를 분석하여 업무 보고서를 작성하세요. + +다음 도구를 사용하세요: +1. folder_map — 작업 폴더의 파일 구조 파악 +2. file_read — 관련 데이터 파일 읽기 (CSV, Excel, 텍스트) +3. file_write — 보고서 파일 생성 (HTML 또는 Markdown) + +보고서 구성: +## 제목 +- 작성 일시, 작성자 (요청 시) + +## 요약 (Executive Summary) +- 핵심 내용을 3줄 이내로 요약 + +## 본문 +- 데이터 기반 분석 결과 +- 표/차트를 활용한 시각적 정리 +- 주요 발견 사항 + +## 결론 및 제안 +- 결론 요약 +- 향후 조치 사항 + +HTML 보고서 생성 시 현재 적용된 디자인 무드를 반영하세요. +한국어로 작성하세요. diff --git a/dist/AxCopilot/skills/security-audit.skill.md b/dist/AxCopilot/skills/security-audit.skill.md new file mode 100644 index 0000000..d32ed32 --- /dev/null +++ b/dist/AxCopilot/skills/security-audit.skill.md @@ -0,0 +1,93 @@ +--- +name: security-audit +label: 보안 코드 감사 +description: 코드베이스의 보안 취약점을 점검하고 OWASP 기반 보안 보고서를 생성합니다. +icon: \uE72E +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - html_create + - glob +tabs: code +--- + +코드베이스의 보안 취약점을 체계적으로 점검하고 보고서를 생성하세요. + +## 워크플로우 + +1. **스캔 범위 확인**: folder_map으로 프로젝트 구조 파악, 언어/프레임워크 식별 +2. **취약점 패턴 탐지**: grep으로 위험 패턴 검색 +3. **의존성 분석**: 패키지 파일(package.json, *.csproj, requirements.txt) 읽기 +4. **비밀 정보 노출 검사**: API 키, 토큰, 비밀번호 하드코딩 탐지 +5. **보고서 생성**: html_create로 보안 감사 보고서 생성 + +## OWASP Top 10 점검 항목 + +### A01 — 접근 제어 취약 +- 인증 없는 API 엔드포인트 +- 하드코딩된 권한 체크 +- 관리자 경로 노출 + +### A02 — 암호화 실패 +- 평문 비밀번호 저장 +- 약한 해시 알고리즘 (MD5, SHA1) +- HTTP (비HTTPS) 통신 + +### A03 — 인젝션 +- SQL 인젝션 (문자열 결합 쿼리) +- XSS (innerHTML, dangerouslySetInnerHTML) +- 명령 인젝션 (Process.Start, exec, system) +- 경로 순회 (../ 미검증) + +### A04 — 불안전한 설계 +- 비즈니스 로직 검증 누락 +- 레이트 리밋 미적용 + +### A05 — 보안 설정 오류 +- 디버그 모드 활성화 상태 +- 기본 자격증명 사용 +- 불필요한 포트/서비스 노출 + +### A07 — 인증 실패 +- 약한 비밀번호 정책 +- 세션 만료 미설정 +- 브루트포스 방어 부재 + +### A09 — 로깅/모니터링 부족 +- 보안 이벤트 미기록 +- 민감 정보 로그 출력 + +## 비밀 정보 탐지 패턴 + +``` +grep 대상 패턴: +- password\s*=\s*["'][^"']+["'] +- api[_-]?key\s*=\s*["'][^"']+["'] +- secret\s*=\s*["'][^"']+["'] +- token\s*=\s*["'][A-Za-z0-9+/=]{20,}["'] +- -----BEGIN (RSA |EC )?PRIVATE KEY----- +- AWS_ACCESS_KEY_ID +- AKIA[0-9A-Z]{16} +``` + +## 출력 형식 + +### 보안 감사 보고서 +| 위험도 | 카테고리 | 파일 | 라인 | 내용 | 권장 조치 | +|--------|---------|------|------|------|----------| +| 🔴 심각 | A03 인젝션 | ... | ... | SQL 문자열 결합 | 파라미터 바인딩 사용 | +| 🟡 경고 | A02 암호화 | ... | ... | MD5 해시 사용 | SHA-256 이상 전환 | +| 🟢 참고 | A09 로깅 | ... | ... | 에러 로깅 미흡 | 보안 이벤트 로깅 추가 | + +### 요약 통계 +- 심각/경고/참고 건수 +- OWASP 카테고리별 분포 +- 우선 조치 항목 Top 5 + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 발견된 비밀 정보는 마스킹하여 보고 (앞 4자만 표시) +- 위험도는 보수적으로 평가 +- 한국어로 보고서 작성 diff --git a/dist/AxCopilot/skills/sql-report.skill.md b/dist/AxCopilot/skills/sql-report.skill.md new file mode 100644 index 0000000..76efeca --- /dev/null +++ b/dist/AxCopilot/skills/sql-report.skill.md @@ -0,0 +1,52 @@ +--- +name: sql-report +label: SQL 리포트 +description: DB 쿼리를 실행하고 결과를 차트화하여 HTML/Excel 보고서로 생성합니다. +icon: \uE968 +allowed-tools: + - sql_tool + - chart_create + - excel_create + - html_create + - data_pivot +tabs: cowork +--- + +데이터베이스에서 쿼리를 실행하고 결과를 시각화된 보고서로 생성하세요. + +## 워크플로우 + +1. **DB 확인**: sql_tool로 테이블 목록 및 스키마 확인 +2. **쿼리 작성**: 사용자 요청에 맞는 SQL 쿼리 작성 +3. **데이터 조회**: sql_tool로 쿼리 실행 +4. **데이터 가공**: data_pivot으로 집계/피벗 (필요 시) +5. **시각화**: chart_create로 차트 생성 +6. **보고서**: html_create 또는 excel_create로 최종 보고서 생성 + +## 쿼리 작성 원칙 +- SELECT 쿼리만 실행 (데이터 변경 금지) +- 결과 행 수 제한: LIMIT 1000 (대량 데이터 방지) +- 인덱스 활용 쿼리 작성 +- 한글 컬럼명은 alias로 변환 + +## 보고서 구성 + +### 1. 데이터 요약 +- 조회 조건, 기간, 데이터 건수 +- 기본 통계 (합계, 평균, 최대/최소) + +### 2. 시각화 +- 적절한 차트 유형 자동 선택 +- 비교 → 바 차트 +- 추세 → 라인 차트 +- 비율 → 파이/도넛 차트 + +### 3. 상세 데이터 +- Excel: 원본 데이터 + 서식 + 수식 +- HTML: 테이블 + 정렬/필터 + +## 규칙 +- DB 경로는 사용자에게 확인 +- 민감 데이터(개인정보) 마스킹 권고 +- 쿼리 실행 전 사용자 승인 +- 한국어로 보고서 작성 diff --git a/dist/AxCopilot/skills/translate.skill.md b/dist/AxCopilot/skills/translate.skill.md new file mode 100644 index 0000000..bc793de --- /dev/null +++ b/dist/AxCopilot/skills/translate.skill.md @@ -0,0 +1,60 @@ +--- +name: translate +label: 번역 + 교정 +description: 문서나 텍스트를 번역하고 전문 용어를 보존하며 교정합니다. +icon: \uE8C1 +allowed-tools: + - file_read + - file_write + - document_read + - clipboard_tool +tabs: all +--- + +사용자가 제공한 텍스트 또는 문서를 번역하고 교정하세요. + +## 워크플로우 + +1. **입력 확인**: 텍스트 직접 입력 또는 파일 경로 확인 +2. **언어 감지**: 원문 언어를 자동 감지 +3. **번역 실행**: + - 원문의 뉘앙스와 문맥을 살려 번역 + - 전문 용어는 원어를 괄호 안에 병기: "수율(Yield)" + - 문화적 차이를 고려한 자연스러운 표현 사용 +4. **교정**: 번역 결과의 문법, 맞춤법, 어색한 표현 수정 +5. **결과 제공**: 번역문 + 주요 용어 대조표 + +## 번역 원칙 + +### 정확성 +- 원문의 의미를 정확하게 전달 +- 숫자, 날짜, 고유명사는 원문 그대로 유지 +- 약어는 처음 등장 시 풀어 번역 + +### 가독성 +- 목표 언어의 자연스러운 문체 사용 +- 긴 문장은 적절히 분리 +- 수동태 → 능동태 변환 (한국어의 경우) + +### 전문성 +- 분야별 전문 용어 일관 사용 +- 동일 용어는 문서 전체에서 통일 +- 번역 불가능한 용어는 원어 유지 + +## 출력 형식 + +``` +## 번역 결과 + +[번역된 텍스트] + +--- + +## 용어 대조표 +| 원문 | 번역 | 비고 | +|------|------|------| +| Yield | 수율 | 반도체 공정 용어 | +``` + +## 지원 언어 +한국어 ↔ 영어 / 일본어 / 중국어 (간/번체) / 독일어 / 프랑스어 / 스페인어 diff --git a/dist/AxCopilot/skills/weekly-report.skill.md b/dist/AxCopilot/skills/weekly-report.skill.md new file mode 100644 index 0000000..342449e --- /dev/null +++ b/dist/AxCopilot/skills/weekly-report.skill.md @@ -0,0 +1,65 @@ +--- +name: weekly-report +label: 주간 보고서 +description: 작업 폴더의 변경 이력을 기반으로 자동 주간보고 초안을 생성합니다. +icon: \uE787 +allowed-tools: + - git_tool + - folder_map + - file_read + - file_watch + - html_create + - docx_create + - text_summarize +tabs: cowork +--- + +작업 폴더의 최근 활동을 분석하여 주간 보고서 초안을 자동 생성하세요. + +## 워크플로우 + +1. **활동 수집**: + - git_tool로 최근 7일간 커밋 이력 조회 + - file_watch로 최근 변경/생성된 파일 목록 확인 + - folder_map으로 프로젝트 구조 파악 + +2. **내용 분석**: + - 커밋 메시지 분류 (기능 추가, 버그 수정, 리팩토링 등) + - 변경 파일 유형별 분류 + - 주요 변경사항 요약 + +3. **보고서 작성**: + - HTML 또는 Word 형식으로 보고서 생성 + - 차트/표로 활동 통계 시각화 + +## 보고서 구성 + +### 1. 주간 요약 +- 보고 기간: yyyy-MM-dd ~ yyyy-MM-dd +- 주요 성과 (3줄 이내) + +### 2. 완료 항목 +| 번호 | 구분 | 내용 | 비고 | +|------|------|------|------| +| 1 | 기능 | ... | 커밋 참조 | + +### 3. 진행 중 항목 +- 현재 작업 중인 사항 +- 진척률 (가능하면) + +### 4. 이슈 및 리스크 +- 지연 사항 +- 블로킹 이슈 + +### 5. 다음 주 계획 +- 예정 작업 항목 + +### 6. 활동 통계 (차트) +- 일별 커밋 수 +- 파일 유형별 변경 비율 + +## 규칙 +- 사실 기반으로 작성 (추측 금지) +- Git 이력이 없으면 파일 변경 이력만으로 작성 +- 한국어로 작성 +- 보고서 톤: 간결하고 전문적 diff --git a/dist/AxCopilot/skills/xlsx-analyzer.skill.md b/dist/AxCopilot/skills/xlsx-analyzer.skill.md new file mode 100644 index 0000000..267a312 --- /dev/null +++ b/dist/AxCopilot/skills/xlsx-analyzer.skill.md @@ -0,0 +1,97 @@ +--- +name: xlsx-analyzer +label: Excel 데이터 분석 +description: Python을 사용하여 Excel/CSV 데이터를 분석하고 보고서를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +작업 폴더의 Excel 또는 CSV 데이터를 Python으로 분석하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pandas openpyxl +``` + +## 양식 활용 (Excel 보고서 템플릿) +작업 폴더에 Excel 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더에서 `.xlsx` 파일 목록 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본", "보고서양식" 포함 + - 또는 사용자가 "XX 양식에 맞춰서 작성해줘" 요청 + - 또는 사용자가 특정 .xlsx 파일명을 양식으로 지정 +3. **양식 구조 파악**: `document_read`로 양식의 시트 구조, 셀 레이아웃 확인 +4. **양식 기반 데이터 삽입**: + ```python + from openpyxl import load_workbook + wb = load_workbook('양식_보고서.xlsx') + ws = wb.active + # 양식의 서식(셀 병합, 테두리, 글꼴, 색상, 열 너비)이 그대로 유지됨 + # 데이터 영역에만 새 값 삽입 + ws['B3'] = '분석 결과값' + wb.save('결과_보고서.xlsx') + ``` +5. **양식이 없으면**: 아래 기본 방식으로 분석 결과 생성 + +## 작업 절차 +1. **데이터 파일 탐색**: folder_map으로 작업 폴더에서 .xlsx, .csv 파일 확인 +2. **양식 확인**: 양식 .xlsx 파일이 있는지 확인 (데이터 파일과 양식 파일 구분) +3. **데이터 읽기**: file_read 또는 document_read로 파일 구조 파악 +4. **분석 스크립트 작성**: file_write로 Python 분석 스크립트 생성 +5. **실행**: process_run으로 스크립트 실행 +6. **결과 보고**: 분석 결과를 사용자에게 정리하여 전달 + +## 분석 스크립트 템플릿 +```python +import pandas as pd +import json +import os + +df = pd.read_excel('data.xlsx') # 또는 pd.read_csv('data.csv') + +report = { + 'shape': list(df.shape), + 'columns': list(df.columns), + 'dtypes': {col: str(dtype) for col, dtype in df.dtypes.items()}, + 'missing': df.isnull().sum().to_dict(), + 'describe': df.describe().to_dict(), +} + +# 양식 파일로 결과 내보내기 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.xlsx') and f != 'data.xlsx' and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +if template_file: + from openpyxl import load_workbook + wb = load_workbook(template_file) + ws = wb.active + # 양식 서식 유지하면서 데이터 삽입 + print(f'양식 활용: {template_file}') + # TODO: 양식 구조에 맞게 데이터 삽입 로직 작성 + wb.save('결과_보고서.xlsx') +else: + # 양식 없으면 JSON으로 저장 + with open('analysis_result.json', 'w', encoding='utf-8') as f: + json.dump(report, f, ensure_ascii=False, indent=2, default=str) + +print(json.dumps(report, ensure_ascii=False, indent=2, default=str)) +``` + +## 지원 분석 +- 기본 통계 (평균, 중앙값, 표준편차, 분위수) +- 결측치 분석 +- 컬럼별 고유값 분포 +- 피벗 테이블 / 그룹별 집계 +- 시트 간 비교 분석 +- 필터링 및 조건부 추출 +- 분석 결과를 새 Excel로 내보내기 +- **양식 파일 기반 보고서 생성** (셀 서식, 병합, 테두리, 차트 영역 유지) + +한국어로 안내하세요. 원본 파일은 수정하지 마세요. diff --git a/dist/AxCopilot/skills/yield-analysis.skill.md b/dist/AxCopilot/skills/yield-analysis.skill.md new file mode 100644 index 0000000..408ba31 --- /dev/null +++ b/dist/AxCopilot/skills/yield-analysis.skill.md @@ -0,0 +1,40 @@ +--- +name: yield-analysis +label: 수율 분석 +description: 제조/연구 데이터의 수율을 분석하고 개선 포인트를 도출합니다. +icon: \uE9D2 +tabs: cowork +--- + +작업 폴더의 데이터를 활���하여 수율 분석을 수행하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — 분석 보고서 생성 + +분석 프로세스: +## 데이터 개요 +- 분석 대상 데이터셋 설명 +- 데이터 기간, 샘플 수, 주요 변수 + +## 수율 현황 +- 전체 수율 통계 (평균, 중앙값, 표준편차) +- 기간별/로트별/공정별 수율 추이 +- 목표 수율 대비 달성률 + +## 불량 분석 +- 불량 유형별 분류 및 비율 +- 파레토 분석 (상위 불량 원인) +- 시간대/조건별 불량 패턴 + +## 상관관계 분석 +- 주요 공정 변수와 수율의 관계 +- 이상치 탐지 및 원인 추정 + +## 개선 제안 +- 수율 향상을 위한 구체적 조치 사항 +- 우선순위별 개선 로드맵 +- 예상 개선 효과 + +표와 수치를 적극 활용하세요. 한국어로 작성하세요. diff --git a/dist/AxCopilot/system_prompt.txt b/dist/AxCopilot/system_prompt.txt new file mode 100644 index 0000000..5a999d3 --- /dev/null +++ b/dist/AxCopilot/system_prompt.txt @@ -0,0 +1 @@ +[역할] 당신은 회사 업무의 도움을 주는 매우 유능한 비서입니다. 말투는 정중하게 하며, 욕을 해서는 안됩니다. \ No newline at end of file diff --git a/dist/AxCopilot/tr/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/tr/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..8eea594 Binary files /dev/null and b/dist/AxCopilot/tr/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/tr/PresentationCore.resources.dll b/dist/AxCopilot/tr/PresentationCore.resources.dll new file mode 100644 index 0000000..8bc24e8 Binary files /dev/null and b/dist/AxCopilot/tr/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/tr/PresentationFramework.resources.dll b/dist/AxCopilot/tr/PresentationFramework.resources.dll new file mode 100644 index 0000000..b8bdeae Binary files /dev/null and b/dist/AxCopilot/tr/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/tr/PresentationUI.resources.dll b/dist/AxCopilot/tr/PresentationUI.resources.dll new file mode 100644 index 0000000..113dcbb Binary files /dev/null and b/dist/AxCopilot/tr/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/tr/ReachFramework.resources.dll b/dist/AxCopilot/tr/ReachFramework.resources.dll new file mode 100644 index 0000000..b873815 Binary files /dev/null and b/dist/AxCopilot/tr/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/tr/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/tr/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..df07d56 Binary files /dev/null and b/dist/AxCopilot/tr/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/tr/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/tr/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..b823ba1 Binary files /dev/null and b/dist/AxCopilot/tr/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/tr/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/tr/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..19163ce Binary files /dev/null and b/dist/AxCopilot/tr/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/tr/System.Windows.Forms.resources.dll b/dist/AxCopilot/tr/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..cc1ab6f Binary files /dev/null and b/dist/AxCopilot/tr/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/tr/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/tr/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..8aa0811 Binary files /dev/null and b/dist/AxCopilot/tr/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/tr/System.Xaml.resources.dll b/dist/AxCopilot/tr/System.Xaml.resources.dll new file mode 100644 index 0000000..f12c281 Binary files /dev/null and b/dist/AxCopilot/tr/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/tr/UIAutomationClient.resources.dll b/dist/AxCopilot/tr/UIAutomationClient.resources.dll new file mode 100644 index 0000000..1aa3bd5 Binary files /dev/null and b/dist/AxCopilot/tr/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/tr/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/tr/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..b4703ef Binary files /dev/null and b/dist/AxCopilot/tr/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/tr/UIAutomationProvider.resources.dll b/dist/AxCopilot/tr/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..e91b7a2 Binary files /dev/null and b/dist/AxCopilot/tr/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/tr/UIAutomationTypes.resources.dll b/dist/AxCopilot/tr/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..ce81902 Binary files /dev/null and b/dist/AxCopilot/tr/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/tr/WindowsBase.resources.dll b/dist/AxCopilot/tr/WindowsBase.resources.dll new file mode 100644 index 0000000..f0d9524 Binary files /dev/null and b/dist/AxCopilot/tr/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/tr/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/tr/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..68a247a Binary files /dev/null and b/dist/AxCopilot/tr/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/vcruntime140_cor3.dll b/dist/AxCopilot/vcruntime140_cor3.dll new file mode 100644 index 0000000..5786e93 Binary files /dev/null and b/dist/AxCopilot/vcruntime140_cor3.dll differ diff --git a/dist/AxCopilot/wpfgfx_cor3.dll b/dist/AxCopilot/wpfgfx_cor3.dll new file mode 100644 index 0000000..aa7d287 Binary files /dev/null and b/dist/AxCopilot/wpfgfx_cor3.dll differ diff --git a/dist/AxCopilot/zh-Hans/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/zh-Hans/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..141280d Binary files /dev/null and b/dist/AxCopilot/zh-Hans/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/PresentationCore.resources.dll b/dist/AxCopilot/zh-Hans/PresentationCore.resources.dll new file mode 100644 index 0000000..78f3317 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/PresentationFramework.resources.dll b/dist/AxCopilot/zh-Hans/PresentationFramework.resources.dll new file mode 100644 index 0000000..3e3c601 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/PresentationUI.resources.dll b/dist/AxCopilot/zh-Hans/PresentationUI.resources.dll new file mode 100644 index 0000000..1a97bc1 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/ReachFramework.resources.dll b/dist/AxCopilot/zh-Hans/ReachFramework.resources.dll new file mode 100644 index 0000000..ae6cc13 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/zh-Hans/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..1ebf330 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/zh-Hans/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..46afdf9 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/zh-Hans/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..066d961 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/System.Windows.Forms.resources.dll b/dist/AxCopilot/zh-Hans/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..7e2f746 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/zh-Hans/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..695fe5a Binary files /dev/null and b/dist/AxCopilot/zh-Hans/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/System.Xaml.resources.dll b/dist/AxCopilot/zh-Hans/System.Xaml.resources.dll new file mode 100644 index 0000000..e000568 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/UIAutomationClient.resources.dll b/dist/AxCopilot/zh-Hans/UIAutomationClient.resources.dll new file mode 100644 index 0000000..7cd27a7 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/zh-Hans/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..3390c92 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/UIAutomationProvider.resources.dll b/dist/AxCopilot/zh-Hans/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..ff5f6e7 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/UIAutomationTypes.resources.dll b/dist/AxCopilot/zh-Hans/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..5a9cee8 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/WindowsBase.resources.dll b/dist/AxCopilot/zh-Hans/WindowsBase.resources.dll new file mode 100644 index 0000000..34e5fe3 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/zh-Hans/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/zh-Hans/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..2aef8b7 Binary files /dev/null and b/dist/AxCopilot/zh-Hans/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/Microsoft.VisualBasic.Forms.resources.dll b/dist/AxCopilot/zh-Hant/Microsoft.VisualBasic.Forms.resources.dll new file mode 100644 index 0000000..2461e41 Binary files /dev/null and b/dist/AxCopilot/zh-Hant/Microsoft.VisualBasic.Forms.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/PresentationCore.resources.dll b/dist/AxCopilot/zh-Hant/PresentationCore.resources.dll new file mode 100644 index 0000000..172948a Binary files /dev/null and b/dist/AxCopilot/zh-Hant/PresentationCore.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/PresentationFramework.resources.dll b/dist/AxCopilot/zh-Hant/PresentationFramework.resources.dll new file mode 100644 index 0000000..dd559ef Binary files /dev/null and b/dist/AxCopilot/zh-Hant/PresentationFramework.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/PresentationUI.resources.dll b/dist/AxCopilot/zh-Hant/PresentationUI.resources.dll new file mode 100644 index 0000000..50606ee Binary files /dev/null and b/dist/AxCopilot/zh-Hant/PresentationUI.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/ReachFramework.resources.dll b/dist/AxCopilot/zh-Hant/ReachFramework.resources.dll new file mode 100644 index 0000000..91d47af Binary files /dev/null and b/dist/AxCopilot/zh-Hant/ReachFramework.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/System.Windows.Controls.Ribbon.resources.dll b/dist/AxCopilot/zh-Hant/System.Windows.Controls.Ribbon.resources.dll new file mode 100644 index 0000000..5d40c0d Binary files /dev/null and b/dist/AxCopilot/zh-Hant/System.Windows.Controls.Ribbon.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/System.Windows.Forms.Design.resources.dll b/dist/AxCopilot/zh-Hant/System.Windows.Forms.Design.resources.dll new file mode 100644 index 0000000..43ff8ac Binary files /dev/null and b/dist/AxCopilot/zh-Hant/System.Windows.Forms.Design.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/System.Windows.Forms.Primitives.resources.dll b/dist/AxCopilot/zh-Hant/System.Windows.Forms.Primitives.resources.dll new file mode 100644 index 0000000..ec2718b Binary files /dev/null and b/dist/AxCopilot/zh-Hant/System.Windows.Forms.Primitives.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/System.Windows.Forms.resources.dll b/dist/AxCopilot/zh-Hant/System.Windows.Forms.resources.dll new file mode 100644 index 0000000..19d2346 Binary files /dev/null and b/dist/AxCopilot/zh-Hant/System.Windows.Forms.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/System.Windows.Input.Manipulations.resources.dll b/dist/AxCopilot/zh-Hant/System.Windows.Input.Manipulations.resources.dll new file mode 100644 index 0000000..d79f7ba Binary files /dev/null and b/dist/AxCopilot/zh-Hant/System.Windows.Input.Manipulations.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/System.Xaml.resources.dll b/dist/AxCopilot/zh-Hant/System.Xaml.resources.dll new file mode 100644 index 0000000..1c5780f Binary files /dev/null and b/dist/AxCopilot/zh-Hant/System.Xaml.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/UIAutomationClient.resources.dll b/dist/AxCopilot/zh-Hant/UIAutomationClient.resources.dll new file mode 100644 index 0000000..a15b9d3 Binary files /dev/null and b/dist/AxCopilot/zh-Hant/UIAutomationClient.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/UIAutomationClientSideProviders.resources.dll b/dist/AxCopilot/zh-Hant/UIAutomationClientSideProviders.resources.dll new file mode 100644 index 0000000..761a785 Binary files /dev/null and b/dist/AxCopilot/zh-Hant/UIAutomationClientSideProviders.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/UIAutomationProvider.resources.dll b/dist/AxCopilot/zh-Hant/UIAutomationProvider.resources.dll new file mode 100644 index 0000000..52486af Binary files /dev/null and b/dist/AxCopilot/zh-Hant/UIAutomationProvider.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/UIAutomationTypes.resources.dll b/dist/AxCopilot/zh-Hant/UIAutomationTypes.resources.dll new file mode 100644 index 0000000..182b9ba Binary files /dev/null and b/dist/AxCopilot/zh-Hant/UIAutomationTypes.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/WindowsBase.resources.dll b/dist/AxCopilot/zh-Hant/WindowsBase.resources.dll new file mode 100644 index 0000000..78230d8 Binary files /dev/null and b/dist/AxCopilot/zh-Hant/WindowsBase.resources.dll differ diff --git a/dist/AxCopilot/zh-Hant/WindowsFormsIntegration.resources.dll b/dist/AxCopilot/zh-Hant/WindowsFormsIntegration.resources.dll new file mode 100644 index 0000000..9cab001 Binary files /dev/null and b/dist/AxCopilot/zh-Hant/WindowsFormsIntegration.resources.dll differ diff --git a/dist/AxCopilot_Setup.exe b/dist/AxCopilot_Setup.exe new file mode 100644 index 0000000..112c994 Binary files /dev/null and b/dist/AxCopilot_Setup.exe differ diff --git a/dist/AxKeyEncryptor/AxKeyEncryptor.deps.json b/dist/AxKeyEncryptor/AxKeyEncryptor.deps.json new file mode 100644 index 0000000..2faf9b9 --- /dev/null +++ b/dist/AxKeyEncryptor/AxKeyEncryptor.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "AxKeyEncryptor/1.0.0": { + "runtime": { + "AxKeyEncryptor.dll": {} + } + } + } + }, + "libraries": { + "AxKeyEncryptor/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/dist/AxKeyEncryptor/AxKeyEncryptor.dll b/dist/AxKeyEncryptor/AxKeyEncryptor.dll new file mode 100644 index 0000000..a28db68 Binary files /dev/null and b/dist/AxKeyEncryptor/AxKeyEncryptor.dll differ diff --git a/dist/AxKeyEncryptor/AxKeyEncryptor.exe b/dist/AxKeyEncryptor/AxKeyEncryptor.exe new file mode 100644 index 0000000..2410db0 Binary files /dev/null and b/dist/AxKeyEncryptor/AxKeyEncryptor.exe differ diff --git a/dist/AxKeyEncryptor/AxKeyEncryptor.runtimeconfig.json b/dist/AxKeyEncryptor/AxKeyEncryptor.runtimeconfig.json new file mode 100644 index 0000000..b65a073 --- /dev/null +++ b/dist/AxKeyEncryptor/AxKeyEncryptor.runtimeconfig.json @@ -0,0 +1,19 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "8.0.0" + } + ], + "configProperties": { + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false + } + } +} \ No newline at end of file diff --git a/docs/26-03-29 report.txt b/docs/26-03-29 report.txt new file mode 100644 index 0000000..55a4b10 --- /dev/null +++ b/docs/26-03-29 report.txt @@ -0,0 +1,164 @@ +E:\AX Copilot\src\AxCopilot\Views\TrayContextMenu.cs 55번째 줄입니다. + +var menu = new SpacedContextMenuStrip(new Padding(20, 16, 20, 16)); +// 좌 상 우 하 + + + +이제 전체적인 보고를 정리하겠습니다. + +--- + +# AX Copilot 고도화 계획 종합 보고 + +**현재 버전**: v1.5.2 | **보고일**: 2026-03-29 + +--- + +## 1. 전체 구조 요약 + +| 영역 | 완료 Phase | 차기 Phase | 문서 | +|------|-----------|-----------|------| +| **AX Agent** (대화 서비스) | Phase 2.5~13 (모두 완료) | Phase 14 (차기) | `AGENT_ROADMAP.md` | +| **AX Commander** (런처) | Phase L1 (완료) | Phase L2, L3 (차기) | `LAUNCHER_ROADMAP.md` | +| **종합** | — | v1.5.0~v2.0 | `NEXT_ROADMAP.html` | + +--- + +## 2. AX Agent — 완료 이력 (Phase 2.5 ~ Phase 13) + +### Phase 8 (v1.5.0) — 경쟁 벤치마크 기반 ✅ +MCP 클라이언트, 모델 폴백, 대화 분기, 스플릿 뷰, 커맨드 팔레트, 토큰 관리, 자율성, 개발자 모드, 보안 감사 + +### Phase 9 (v1.5.0) — 차세대 고도화 ✅ +LSP 연동 코드 인텔리전스, 병렬 에이전트(서브에이전트), TF-IDF 시맨틱 검색, 자동 테스트 루프, 이벤트 트리거, PDF 내보내기, 실시간 diff 뷰어 + +### Phase 10 (v1.5.0) — 지능형 에이전트 ✅ +Auto Router 자동 모델 선택, 에이전트 메모리(영속 학습), 멀티모달(Vision), 코드 검색 개선(SQLite 영속), 에이전트 훅 + +### Phase 11 (v1.5.0) — 생태계 확장 ✅ +스킬 시스템(슬래시 명령), AI 코드 리뷰 자동화, 드래그&드롭 AI 처리 + +### Phase 12 (v1.5.1~1.5.2) — 스킬/커넥터 고도화 ✅ (일부) +- ✅ 런타임 의존 스킬 (Python/Node 감지 + 4종 고급 스킬) +- ✅ 워크플로우 분석기 (실시간 타임라인 시각화) +- ⬜ 도구/커넥터 관리 UI (계획) +- ⬜ SKILL.md 표준 호환 (계획) + +### Phase 13 (v1.5.2) — 스킬 생태계 + 분석 ✅ +스킬 갤러리 UI, 시각적 편집기, 가져오기/내보내기, 실행 통계 대시보드, AgentLogLevel 채팅 연동 + +--- + +## 3. AX Agent — 차기 계획: Phase 14 (v1.5.4+) + +> **방향**: ① 에이전트 도구 25종 → 40종+ 확대 ② 검증된 외부 스킬 12종 번들 + +### 14-A. 데이터 처리 도구 (5종) +| 우선순위 | 도구 | +|----------|------| +| 높음 | `json_tool` (파싱/검증/jq쿼리), `regex_tool` (정규식 테스트/추출) | +| 중간 | `diff_tool` (파일 비교) | +| 낮음 | `base64_tool`, `hash_tool` | + +### 14-B. 시스템/환경 도구 (6종) +| 우선순위 | 도구 | +|----------|------| +| 높음 | `clipboard_tool` (클립보드 읽기/쓰기), `notify_tool` (Windows 알림) | +| 중간 | `env_tool` (환경변수), `zip_tool` (압축) | +| 낮음 | `log_search`, `datetime_tool` | + +### 14-C. 네트워크/API 도구 (3종) +| 우선순위 | 도구 | +|----------|------| +| 높음 | `http_tool` (사내 API 호출), `sql_tool` (SQLite 쿼리) | +| 낮음 | `network_tool` (포트/DNS/ping) | + +### 14-D. 코드 품질 도구 (4종) +| 우선순위 | 도구 | +|----------|------| +| 높음 | `snippet_runner` (코드 즉시 실행) | +| 중간 | `template_tool` (보일러플레이트), `complexity_tool` (복잡도 분석) | +| 낮음 | `dependency_tool` (의존성 트리) | + +### 14-E. UX 개선 +| 상태 | 항목 | +|------|------| +| ✅ 완료 | 슬래시 칩 표시, 팝업 페이징 | +| 차기 | compact 명령어 (`/init`, `/ctx`, `/pr` 등), 즐겨찾기, 스킬 자동 추천 | + +### 14-F. 외부 검증 스킬 내장 번들 (12종) +- **일반 (8종)**: code-scaffold, meeting-minutes, paper-review, data-visualize, report-writer, api-docs, db-schema, commit-review +- **런타임 필요 (4종)**: docx-creator(python), xlsx-analyzer(python), pdf-processor(python), pptx-creator(python) +- **크기 영향**: ~120KB (무시 가능) + +### 구현 순서 +1. **14-F** (즉시) → 2. **14-A+B** (1차) → 3. **14-C+D** (2차) → 4. **14-E** (3차) + +--- + +## 4. AX Commander (런처) — 완료 및 차기 계획 + +### Phase L1 (v1.5.0) ✅ 완료 +TextAction, Everything, 22 레이아웃 타일링, 플러그인 zip 설치, 독 바, 대화상자 통합, 클립보드 핀/카테고리, 셸 확장, 저장 공간 관리 + +### Phase L2 (v1.5.3) — 클립보드 고도화 + UX 개선 +| 우선순위 | 기능 | +|----------|------| +| **높음** | L2-1 이미지 원본 해상도 보존 (현재 축소 저장 → 원본 DPAPI 저장) | +| **높음** | L2-2 Shift+Enter 실행 시 자동 클립보드 복사 | +| 중간 | L2-3 이미지 미리보기 창 (확대/축소) | +| 중간 | L2-4 OCR 기반 이미지 검색 (Windows OCR API 로컬) | +| 낮음 | L2-5 클립보드 항목 병합 | + +### Phase L3 (v1.6.0+) — 차세대 런처 +| 우선순위 | 기능 | +|----------|------| +| 높음 | 플러그인 인앱 갤러리 (사내 NAS/Git) | +| 중간 | 웹 검색 AI 요약, 파일 태그, 오프라인 AI (ONNX + phi-3) | +| 낮음 | 다중 디스플레이, 알림 센터, 음성 입력, 미니 위젯 | + +--- + +## 5. 현재 에이전트 도구 현황 (25종) + +| 카테고리 | 도구 | +|----------|------| +| 파일 | `file_read`, `file_write`, `file_list`, `file_search` | +| 코드 분석 | `grep_tool`, `search_codebase`, `lsp_goto_definition`, `lsp_find_references`, `lsp_symbols` | +| 실행 | `process_run`, `build_run`, `git_tool` | +| 에이전트 | `spawn_agent`, `wait_agents`, `skill_manager` | +| 테스트 | `test_generate`, `test_run`, `test_analyze` | +| 코드 리뷰 | `code_review` | +| 기타 | `dev_env_detect`, `mcp_tool`, `hook_execute`, `event_trigger` 등 | + +**Phase 14 목표**: 18종 추가 → **43종** (실무 작업 80% 이상 자율 수행) + +--- + +## 6. 계획 수립 원칙 (CLAUDE.md §8) + +| 관점 | 검토 사항 | +|------|----------| +| 경쟁 서비스 | Claude Code, Cursor, Windsurf, Copilot, Raycast 최신 기능 | +| 최신 논문 | SWE-Agent v2, CodeAct, Reflexion, Agentic Coding Survey | +| 업계 표준 | MCP, SKILL.md, LSP, DAP | +| 사내 환경 | 네트워크 제한, 보안, Python/Node 설치 현황 | +| 앱 크기 | 인스톨러 **150MB 이하** 유지 (현재 ~80MB) | + + + + + +변경 파일 5개: + +파일 변경 +Models/AppSettings.cs EnableMultiPassDocument 기본값 true → false +ViewModels/SettingsViewModel.cs 프로퍼티 선언 + Load/Save 매핑 추가 +Views/SettingsWindow.xaml 코워크 탭에 "고품질 문서 생성" ToggleSwitch 추가 +Services/Agent/DocumentPlannerTool.cs 설정 OFF 시 document_plan 도구 비활성 → LLM에 html_create/docx_create 사용 안내 +Services/Agent/DocumentAssemblerTool.cs 설정 OFF 시 document_assemble 도구 비활성 → 동일 안내 +동작: + +OFF (기본값): document_plan, document_assemble 호출 시 실패 메시지 반환 → LLM이 기존 html_create/docx_create로 한 번에 생성 (v1.5.x 이전 방식) +ON: 멀티패스 문서 생성 전체 사용 가능 (개요→섹션별 상세→조립) \ No newline at end of file diff --git a/docs/AGENT_ROADMAP.html b/docs/AGENT_ROADMAP.html new file mode 100644 index 0000000..8579291 --- /dev/null +++ b/docs/AGENT_ROADMAP.html @@ -0,0 +1,1634 @@ + + + + + +AX Agent 대화 서비스 고도화 — 종합 계획 및 코드 리뷰 + + + +
+ + + +
+
COMPREHENSIVE PLAN & CODE REVIEW
+

AX Agent 대화 서비스 고도화
— 종합 계획 및 코드 리뷰

+

+ 코드 리뷰 현황 + 완료된 고도화 + 차기 로드맵을 하나의 문서로 통합
+ LlmService · ChatWindow · ChatStorageService · AgentLoopService · McpClientService +

+
2026-03-30 · v1.6.1
+
+ + + +
+

목차 (Table of Contents)

+
+

Part 1 — 코드 리뷰 및 현황

+
    +
  1. 현재 구현 상태
  2. +
  3. 아키텍처 개요
  4. +
  5. 지원 백엔드
  6. +
  7. 파일별 상세 분석
  8. +
  9. 경쟁 서비스 비교
  10. +
  11. Claude Desktop 분석
  12. +
  13. 오픈소스 코어 분석
  14. +
  15. 에이전트 논문 및 오픈소스 심층 분석
  16. +
  17. 3탭 개발 로드맵
  18. +
  19. 공통 개발 지침
  20. +
+

Part 2 — 완료된 고도화

+
    +
  1. Phase 2.5~7 (v1.1.0 ~ v1.2.1) 완료
  2. +
  3. Phase 7.5 (v1.2.2) 완료
  4. +
  5. Phase 8 (v1.3.0) 완료
  6. +
  7. 개발 진행 로그 (v1.0.5~v1.0.7)
  8. +
+

Part 3 — 다음 고도화 계획

+
    +
  1. Phase 9 — 차세대 고도화 (v1.5.0)
  2. +
  3. Phase 10 — 지능형 에이전트 (v1.5.0)
  4. +
  5. Phase 11 — 생태계 확장 (v1.5.0)
  6. +
  7. Phase 12 — 자율 에이전트 (v2.0+)
  8. +
  9. Phase 13 — 스킬 생태계 + 분석 고도화
  10. +
  11. Phase 14 — 에이전트 도구 + 스킬 대확장 (v1.5.4)
  12. +
  13. Phase 15 — 멀티패스 문서 엔진 (v1.6.0)
  14. +
+

Part 4 — 차세대 고도화 계획

+
    +
  1. Phase 16 — 에이전트 지능 강화 (v1.7.0)
  2. +
  3. Phase 17 — 심화 지능 + UX 혁신 (v1.8.0)
  4. +
  5. Phase 18 — 에코시스템 + 차별화 (v2.0)
  6. +
  7. 기술 부채
  8. +
+
+
+ + + + + +
Part 1 — 코드 리뷰 및 현황
+ + +

1. 현재 구현 상태

+
+ 백엔드(LlmService, ChatStorageService, CryptoService)는 100% 구현 완료.
+ 설정 UI(SettingsWindow AI 탭)와 DEPLOY_STUB 해제 완료. 핵심 기능은 즉시 사용 가능 상태. +
+ + + + + + + + + +
파일라인 수상태역할
LlmService.cs362완료Ollama/vLLM/Gemini 3종 LLM API 통신
ChatStorageService.cs260+완료AES-256-GCM 암호화 대화 저장/로드 + 디스크 용량 관리
ChatWindow.xaml(.cs)209 + 650+완료채팅 UI · 스트리밍 · 피드백 · 워터마크
ChatHandler.cs154완료"!" 프리픽스 핸들러
SettingsWindow (AI 탭)~120완료서비스/모델/키/온도 설정 UI
CryptoService.cs200+완료Portable + Local 이중 암호화
+ + + +

2. 아키텍처 개요

+ +
+

메시지 흐름

+
+사용자 입력 (! 예약어)
+  ↓
+ChatHandler.GetItemsAsync()
+  ↓ (Enter)
+ChatHandler.ExecuteAsync() → ChatWindow 열기
+  ↓
+사용자 메시지 입력 → SendMessageAsync()
+  ↓
+LlmService.StreamAsync() / SendAsync()
+  ↓
+백엔드 선택 (Ollama / vLLM / Gemini)
+  ↓
+HTTP 요청 (Messages + SystemPrompt)
+  ↓
+스트리밍 응답 → UI 실시간 갱신
+  ↓
+ChatStorageService.Save() (AES-256-GCM 암호화)
+    
+
+ +
+

암호화 구조

+ + + + +
용도알고리즘키 파생이식성
설정값 (API 키)AES-256-CBCPBKDF2(AppSeed, 100K)모든 PC 동일
대화 파일 (.axchat)AES-256-GCMDPAPI 마스터 키해당 PC만
+
+ +
+

3탭 통합 아키텍처 (C# 네이티브)

+
+┌─────────────────────────────────────────────────────────────┐
+│                    AX Agent (WPF Desktop)                    │
+├──────────┬──────────────────┬────────────────────────────────┤
+│  Chat    │    Cowork        │         Code                   │
+│  (대화)  │  (자율 작업)     │       (코딩 에이전트)          │
+├──────────┴──────────────────┴────────────────────────────────┤
+│               공통 UI: 폴더 선택 바 + 권한 시스템             │
+├──────────────────────────────────────────────────────────────┤
+│         C# AgentLoopService (계획→실행→관찰→재평가)          │
+├──────────────────────────────────────────────────────────────┤
+│ LlmService (Function Calling)  │  PermissionService         │
+│ 4종 LLM 통합 + Tool-use 프로토콜│  Ask / Auto / Deny         │
+├──────────────────────────────────────────────────────────────┤
+│               C# 네이티브 도구 시스템 (IAgentTool)            │
+│ FileRead│FileWrite│FileEdit│Process│Glob│Grep              │
+├──────────────────────────────────────────────────────────────┤
+│  LibGit2Sharp  │  AvalonEdit  │  StreamJsonRpc (LSP)        │
+│  Git 스냅샷     │  코드 에디터  │  언어 서버 연동             │
+├──────────────────────────────────────────────────────────────┤
+│                작업 폴더 (사용자 선택)                        │
+│        파일 읽기/쓰기 · cmd/powershell · Git 스냅샷          │
+└─────────────────────────────────────────────────────────────┘
+    
+
+ + + +

3. 지원 백엔드

+ + + + + + + +
서비스API 형식기본 엔드포인트API 키키 보안
OllamaPOST /api/chathttp://localhost:11434선택AES-256-CBC 암호화
vLLMPOST /v1/chat/completionshttp://localhost:8000선택AES-256-CBC 암호화
GeminiGoogle GenerateContent APIgenerativelanguage.googleapis.com필수평문 (사내 연결 제한)
ClaudeAnthropic Messages APIapi.anthropic.com필수평문 (사내 연결 제한)
+ + + +

4. 파일별 상세 분석

+ +
+발견된 이슈 및 해결 현황 (클릭하여 펼치기) + + + + + + + + + + + + + +
심각도파일이슈해결
HIGHLlmServiceJSON 파싱 시 null 체크 없음해결 SafeParseJson 래퍼
HIGHLlmServiceAPI 에러 시 상세 컨텍스트 부재해결 ClassifyHttpError
HIGHChatWindowMessages 컬렉션 멀티스레드 접근해결 _convLock
HIGHChatWindow스트리밍 매 청크 UI 갱신 포화해결 50ms 쓰로틀링
HIGHChatStorageSave/Load/Delete 동시 실행 경쟁해결 ReaderWriterLockSlim
MEDIUMLlmService스트리밍 타임아웃 고정해결 30초 청크 타임아웃
MEDIUMChatStorage원자적 쓰기 미사용해결 tmp→rename
MEDIUMChatHandler창 생성 스레드 안전 없음해결 lock(_windowLock)
LOWLlmServiceGemini 스트리밍 파싱 오류 무시해결 LogService.Warn
LOWChatWindowBrush 할당 캐싱 안 됨해결 CacheBrushes()
+
+ +
+파일별 상세 분석 (클릭하여 펼치기) + +
+

LlmService.cs

+
src/AxCommander/Services/LlmService.cs
+
    +
  • JSON 파싱 안전성 — 모든 API 응답에 SafeParseJson 래퍼 적용, 배열 길이 검증
  • +
  • 에러 메시지 — ClassifyHttpError로 401/403/404/429/500 분류
  • +
  • 재시도 — PostJsonWithRetryAsync에서 429/타임아웃 시 최대 2회
  • +
  • 청크 타임아웃 — ReadLineWithTimeoutAsync 30초
  • +
  • Gemini 파싱 오류 — catch에서 LogService.Warn 기록
  • +
+
+ +
+

ChatWindow.xaml.cs

+
src/AxCommander/Views/ChatWindow.xaml.cs
+
    +
  • UI 쓰로틀링 — DispatcherTimer 50ms 간격으로 스트리밍 텍스트 갱신
  • +
  • 스레드 안전 — _convLock으로 Messages 접근 보호
  • +
  • Brush 캐싱 — CacheBrushes()에서 로드 시 한 번만 조회
  • +
  • 창 닫기 보호 — Closed 이벤트에서 _streamCts.Cancel() 호출
  • +
+
+ +
+

ChatStorageService.cs

+
src/AxCommander/Services/ChatStorageService.cs
+
    +
  • 파일 동기화 — ReaderWriterLockSlim으로 Save/Load/Delete 보호
  • +
  • 원자적 쓰기 — .tmp 파일에 쓴 뒤 rename
  • +
  • 에러 로깅 — catch에서 LogService.Warn으로 구체적 파일명 기록
  • +
+
+ +
+

ChatHandler.cs

+
src/AxCommander/Handlers/ChatHandler.cs
+
    +
  • 싱글턴 — lock(_windowLock)으로 중복 ChatWindow 생성 방지
  • +
+
+
+ +
+크로스 체크 오류 검증 절차 (클릭하여 펼치기) +
+
+ 원칙: 하나의 LLM 백엔드에서 오류가 발생하면, 반드시 다른 모든 백엔드에서도 동일 문제가 발생하는지 크로스 체크한 후 수정합니다. +
+ + + + + + + +
검증 항목ClaudeGeminiOllamavLLM
Function Calling 응답 파싱tool_use 블록functionCall 블록tool_calls 배열tool_calls 배열
Tool Result 메시지 구성tool_result contentfunctionResponsetool role messagetool role message
Assistant tool_use 블록 재전송_tool_use_blocks JSON_tool_use_blocks JSON_tool_use_blocks JSON_tool_use_blocks JSON
Array 파라미터 items 스키마불필요 (자동 추론)필수불필요불필요
GetProperty 안전성전체 TryGetProperty로 교체 완료 (2026-03-28)
+

+ 크로스 체크 절차:
+ 1. 오류 발생 시 해당 백엔드의 API 응답 JSON 구조를 로그로 확인
+ 2. 동일 시나리오를 다른 3개 백엔드에서 테스트
+ 3. JSON 파싱 코드에서 GetProperty → TryGetProperty 전환 여부 확인
+ 4. 응답 구조가 다른 부분(예: Gemini=functionCall vs Claude=tool_use)은 별도 처리 검증
+ 5. 수정 후 전체 백엔드 빌드 + 기본 도구 호출 테스트 +

+
+
+ + + +

5. 경쟁 서비스 심층 비교

+ +
+ ChatGPT, Claude, Open WebUI, LobeChat 등 주요 서비스와의 기능/디자인/성능 격차 분석. +
+ +
+UX/디자인 리더십 비교 + 다크 모드 가이드 (클릭하여 펼치기) +
+

UX/디자인 리더십 비교

+ + + + + + + + + + +
영역업계 리더AX Copilot 현황격차
전체 UX 완성도Claude (프로젝트/아티팩트)기본 채팅 UIHIGH
마크다운/코드 렌더링ChatGPT, Claude, LobeChat플레인 텍스트만HIGH
이미지 생성/분석ChatGPT (DALL-E/GPT Image)미지원MEDIUM
음성 대화ChatGPT (Advanced Voice)미지원LOW
다크 모드 색상 품질Claude, LobeChat테마 리소스 연동 완료해결
사이드바 + 아이콘 바Claude Desktop구현 완료해결
멀티 LLM 지원Open WebUI, LibreChat4종 지원해결
암호화 저장없음 (전 서비스)AES-256-GCM우위
+
+ +
+

다크 모드 디자인 가이드 (2026 업계 표준)

+
    +
  • 순수 검정(#000) 금지 — 배경은 #0D0D14~#1A1B2E 사용, 눈 피로 감소
  • +
  • 대비율 WCAG 4.5:1 이상 — 본문 텍스트, 버튼 라벨 필수 충족
  • +
  • 편안한 대비 — 너무 강한 대비(순백 #FFF)도 피로 유발, 밝은 회색(#E0E4F0) 권장
  • +
  • 시맨틱 색상 토큰 — PrimaryText, SecondaryText, HintText 등 의미 기반 네이밍
  • +
  • 글래스모피즘 — AI 출력 영역에 반투명 패널 + blur 효과로 시각적 분리
  • +
  • 적응형 색상 — OS 설정 존중(prefers-color-scheme), 수동 토글 항상 제공
  • +
+
+
+ +
+경쟁사 핵심 기능 상세 비교 (클릭하여 펼치기) +
+

경쟁사 핵심 기능 상세

+ + + + + + + + + + + + + + + + + + + + +
기능ChatGPTClaudeOpen WebUILobeChatAX Cmd
마크다운 렌더링OOOOO
코드 구문 강조OOOOO
코드 블록 복사OOOOO
이미지 생성OX일부플러그인X
파일 첨부 분석OOOOX
웹 검색 연동OX플러그인플러그인X
응답 재생성OOOOO
메시지 편집OOOOO
프롬프트 템플릿O (GPTs)O (프로젝트)OOO
대화 내보내기OXOOO
토큰 사용량일부XOOO
좋아요/싫어요OOOXO
대화 분류폴더프로젝트태그태그O (6종)
대화 고정(핀)XOXXO
제목 인라인 편집OOOOO
멀티 LLM 백엔드XXOOO (4종)
암호화 저장XXXXO (AES)
사내 독립 배포XXOOO
+
+
+ +
+AI 서비스 개선 원칙 + 개선 로드맵 (클릭하여 펼치기) +
+

AI 서비스 개선 원칙

+ + + + + +
#원칙설명
1현대적 웹 디자인디자인은 현대적인 웹 디자인 트렌드를 따르며, ChatGPT·Claude·Open WebUI 등 타 서비스와의 디자인을 고려하여 심미적으로 향상시킨다.
2오픈소스 적극 활용오픈소스를 적극 활용하고 오픈소스들의 핵심 기능 및 우수한 코드를 접목하여 개선한다.
3확장 가능한 서비스 설계단순한 채팅이 아닌, 주고받는 의사소통 및 업무 조율, 보고서·파일 작성 저장, PC 제어 등 향후 서비스 확장(AX Copilot)을 고려하여 설계한다.
+
+ +
+

P0 — 핵심 기능 (v1.0.6 목표)

+ + + + + + + + + + + +
항목현재목표
마크다운 렌더링완료볼드/이탤릭/헤더/리스트/코드블록 + 코드 복사
코드 블록 복사 버튼완료코드 블록 헤더에 언어 표시 + 복사 버튼
대화 제목 인라인 편집완료제목 클릭 시 즉시 편집
응답 재생성 버튼완료AI 응답 하단 "다시 생성" 버튼
생성 중지 버튼완료스트리밍 중 빨간 정지 버튼, ESC 지원
대화 내보내기완료Markdown/TXT 파일로 저장 (Ctrl+E)
연결 테스트완료설정에서 LLM 서버 상태 확인 버튼
키보드 단축키완료Ctrl+N/W/E, Ctrl+Shift+C, ESC 중지
스크롤 개선완료사용자 스크롤 시 자동 스크롤 일시정지
+
+ +
+

P0.5 — UI/UX 디자인 혁신 (v1.0.7 목표)

+ + + + + + + + + +
항목현재목표참고
AI 심볼 로딩 애니메이션텍스트 "생각 중..."회전/펄스 AI 아이콘 + 그라디언트 효과Siri 무지개 원형
무지개 테두리 효과없음AI 응답 시 입력 바 또는 AI 아이콘에 무지개 그라디언트 글로우Apple Siri
아이콘 호버 애니메이션배경색 변경 (네모)아이콘 자체 밝기 전환 + 미세 바운스(Y축 -2px) 또는 스케일(1.1x)LobeChat
좋아요/싫어요 피드백완료클릭 시 아이콘 채움(filled) + 색상 전환 + 상호 배타 토글ChatGPT
메시지 페이드인즉시 표시새 메시지 Opacity 0→1 + Y축 슬라이드(10px) 300msClaude Desktop
스트리밍 커서완료텍스트 끝에 깜빡이는 블록 커서 (타이핑 효과)ChatGPT
스트리밍 글자 단위 표시완료청크 단위 실시간 갱신 + Dispatcher.InvokeAsync(Background)ChatGPT, Claude
+
+ +
+

P1 — 생산성 향상 (v1.0.7 목표)

+ + + + + + + +
항목상태설명
메시지 편집완료보낸 메시지 수정 후 재전송
프롬프트 템플릿완료프롬프트 카드 3종 + 워터마크 placeholder
슬래시 명령어완료/요약, /번역, /코드리뷰 등 빠른 명령
토큰 사용량 표시완료요청/응답 토큰 수 + 잔여 컨텍스트
모델 전환 (채팅 내)완료대화 중 모델을 바로 변경
+
+ +
+

P2 — 고급 기능 (v1.1.0 이후)

+ + + + + + + + +
항목설명
파일 첨부 분석PDF/이미지/문서 업로드 후 AI 분석
웹 검색 연동미구현 — 사내 보안 정책으로 에이전트 웹 검색 차단
대화 분기/포크특정 메시지에서 새 대화 분기
대화 내 검색메시지 내용 검색 (제목뿐 아니라)
멀티 대화 비교두 대화를 나란히 비교
장기 메모리대화 간 사용자 선호 기억
+
+
+ + + +

6. Claude Desktop 심층 분석 — Chat · Cowork · Code

+ +
+ Claude Desktop의 3개 탭(Chat, Cowork, Code)을 심층 분석하고,
+ AX Copilot에 동등한 기능을 구현하기 위한 아키텍처 및 개발 로드맵을 수립합니다. +
+ +
+Claude Desktop 3탭 기능 비교 + 핵심 패턴 분석 (클릭하여 펼치기) +
+

Claude Desktop 3탭 기능 비교

+ + + + + + + + + +
구분ChatCoworkCode
대상 사용자전체 사용자지식 노동자 (기획, 분석, 문서)개발자
상호작용 모델대화형 Q&A자율적 멀티스텝 작업 수행에이전틱 코딩
파일 접근없음선택된 폴더 (VM 샌드박스)선택된 프로젝트 폴더
실행 환경N/A로컬 VM (격리)로컬 / 리모트 / SSH
핵심 기능웹 검색, 커넥터, 아티팩트문서 작성, 데이터 분석, 스프레드시트Visual Diff, Git Worktree, 앱 프리뷰
권한 모델읽기 전용폴더 선택 + 읽기/쓰기 분리 + 삭제 확인도구별 허용/차단 + 샌드박스
보안기본VM 격리 + 네트워크 차단SecurityAnalyzer + ConfirmationPolicy
+
+ +
+

Claude Desktop 핵심 패턴 분석

+ + + + + + + + +
패턴설명AX Copilot 적용 방향
폴더 선택채팅 하단에 작업 폴더 선택 UI. 선택한 폴더만 접근 가능Chat 하단에 FolderBrowserDialog + 경로 표시 바
권한 단계읽기/쓰기 분리, 삭제 시 확인 프롬프트, 네트워크 차단3단계: Ask(매번 확인) / Auto(자동 허용) / Deny(차단)
에이전트 루프계획 → 도구 실행 → 관찰 → 재평가 반복OpenHands/OpenCode 코어 엔진 활용
도구 시스템파일 읽기/쓰기, Bash, 브라우저, 웹 검색WPF 네이티브 도구 + MCP 통합 (웹 검색 제외)
Git 스냅샷매 작업 단계마다 Git 커밋으로 롤백 가능OpenCode의 Git snapshot 시스템 활용
LSP 검증파일 수정 후 Language Server로 오류 자동 검증OpenCode의 LSP 통합 활용
+
+ +
+

Claude Cowork vs AX Copilot — 전략적 차별화

+ + + + + + + + +
항목Claude CoworkAX Copilot 차별점
실행 환경클라우드 VM 샌드박스완전 로컬 실행 — 데이터가 외부로 전송되지 않음
LLM 선택 자유Claude만 사용 가능4종 LLM 지원 — Ollama/vLLM/Gemini/Claude
보안 통제Ask/Auto 2단계Ask/Auto/Deny 3단계 + 차단 경로/확장자/위험 명령
배포Electron 기반단일 EXE + NuGet DLL
비용Pro $20/월, Max $100/월무료 + API 비용만
네트워크 의존상시 인터넷 필요Ollama/vLLM 사용 시 인트라넷만으로 동작
+
+
+ + + +

7. 오픈소스 코어 엔진 분석

+ +
+OpenHands + OpenCode + 비교 (클릭하여 펼치기) + +
+

OpenHands — Cowork 코어 (MIT 라이선스)

+
github.com/All-Hands-AI/OpenHands · Python 72% / TypeScript 25% · 64k+
+ + + + + + +
구성 요소역할내장 방식
openhands.sdkAgent, Conversation, LLM, Tool, 이벤트 시스템Python subprocess 또는 HTTP API
openhands.tools파일 조작, Bash, 브라우저, 웹 검색필요한 도구만 선별 내장 (웹 검색 제외)
openhands.workspace실행 환경 (로컬/Docker/리모트)LocalWorkspace (Docker 없이 직접 실행)
agent_serverREST/WebSocket API 서버로컬 HTTP 서버로 WPF와 통신
+
    +
  • 에이전트 루프: 사용자 메시지 → LLM → Action → Runtime(샌드박스) → Observation → 반복
  • +
  • 보안: SecurityAnalyzer(위험도 평가) + ConfirmationPolicy(승인 요구) + SecretRegistry(비밀 관리)
  • +
  • 컨텍스트 관리: LLMSummarizingCondenser — 컨텍스트 초과 시 자동 요약 (비용 2x 절감)
  • +
+
+ +
+

OpenCode — Code 코어 (MIT 라이선스)

+
github.com/opencode-ai/opencode · Go(TUI) / JavaScript+Bun(서버) · 95k+
+ + + + + + + +
구성 요소역할내장 방식
Bun HTTP 서버 (Hono)에이전트 루프, 도구 실행, LLM 통신백그라운드 프로세스 + REST API
도구 시스템파일 읽기/쓰기, Bash, Glob, Grep, 웹 검색HTTP API로 호출 (웹 검색 제외)
LSP 통합파일 수정 후 Language Server 진단서버 내장 LSP 그대로 활용
Git Snapshot매 단계 임시 커밋 → undo/redo 지원서버 내장 기능 그대로 활용
이벤트 버스 (SSE)실시간 스트리밍 (tool-call, text-delta 등)WPF HttpClient + SSE 파싱
+
    +
  • 에이전트 루프: 프롬프트 → LLM streamText → 도구 호출 → 결과 피드백 → LSP 검증 → 반복
  • +
  • 에이전트 모드: Plan 모드(읽기 전용) / Build 모드(파일 수정 허용)
  • +
  • 서브에이전트: task 도구로 새 세션 생성 (별도 컨텍스트, 다른 LLM 가능)
  • +
+
+ +
+

오픈소스 코어 비교

+ + + + + + + + + +
항목OpenHandsOpenCode
주 언어Python + TypeScriptGo + JavaScript(Bun)
아키텍처이벤트 소싱 + Docker 샌드박스클라이언트-서버 + HTTP API + SSE
격리 수준Docker 컨테이너 (완전 격리)없음 (Git 스냅샷으로 롤백)
LLM 지원100+ (LiteLLM)75+ (AI SDK)
.NET 통합 난이도중간 (Python subprocess + HTTP)낮음 (순수 HTTP REST + SSE)
Windows 지원Docker 필요WSL 권장, 네이티브 가능
적합 용도Cowork (문서/데이터/분석 작업)Code (코드 편집/생성/리팩토링)
+
+
+ + + +

8. 에이전트 고도화를 위한 논문 및 오픈소스 심층 분석

+ +
+ AX Copilot의 자체 구현 에이전트 코어(AgentLoopService)를 고도화하기 위해
+ 관련 학술 논문과 유사 오픈소스 프레임워크를 분석하고, 적용 가능한 기법을 도출합니다. +
+ +
+12.1 핵심 논문 분석 (ReAct, Reflexion, SWE-Agent 등 10편) (클릭하여 펼치기) +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
논문/개념핵심 아이디어주요 기법AX Copilot 적용 방안
ReAct
Yao et al., 2023
Reasoning + Acting 인터리빙Thought-Action-Observation 트리플 반복현재 부분 적용. Thought 단계를 명시적으로 분리하여 UI에 표시.
Toolformer
Schick et al., 2023
LLM이 스스로 도구 사용 시점과 방법을 학습Self-supervised API call insertion시스템 프롬프트에서 도구 사용 규칙 정의. 추가 조치 불필요.
MRKL Systems
Karpas et al., 2022
LLM을 라우터로, 전문 모듈을 실행기로 분리Neural + Symbolic 모듈 하이브리드이미 적용. ToolRegistry가 MRKL의 모듈 레지스트리 역할.
HuggingGPT / TaskMatrix
Shen et al., 2023
LLM이 작업을 분해하고 전문 모델에 위임하는 오케스트레이터 패턴Task Planning → Model Selection → Execution → Response핵심 적용 대상. Task Decomposition 단계 추가 — 복잡한 요청을 하위 작업으로 분해.
Voyager
Wang et al., 2023
자동 커리큘럼 + 스킬 라이브러리Skill Library + Self-verification + Iterative Refinement장기 적용 대상. 커스텀 스킬 저장 시스템.
SWE-Agent
Yang et al., 2024
Agent-Computer Interface (ACI) 설계 원칙Linting, Window-based file viewing, Search & NavigateCode 탭에 핵심 적용. FileEditTool 실행 후 자동 구문 검증 추가.
Reflexion
Shinn et al., 2023
자기 반성을 통한 에이전트 성능 향상Evaluator → Self-Reflection → Memory → Retry with insight중요 개선 대상. 도구 실패 시 반성 프롬프트 추가. 최대 N회 자동 재시도.
Plan-and-Solve
Wang et al., 2023
먼저 계획을 세우고 단계별로 실행계획 → 변수 추출 → 단계별 계산시스템 프롬프트 개선에 즉시 적용 가능.
MemGPT / LLM OS
Packer et al., 2023
LLM 컨텍스트 윈도우를 가상 메모리처럼 관리Main context ↔ Archival storage ↔ Recall storage 계층Context Condenser의 이론적 기반. 3계층 메모리 시스템.
AutoGPT
Richards, 2023
완전 자율 에이전트Self-criticism, Budget/Step limit, Persistent memory가드레일 설계 참고. 에이전트 루프 최대 반복 횟수 제한.
Tree of Thoughts
Yao et al., 2023
여러 추론 경로를 트리로 탐색BFS/DFS 기반 탐색, 백트래킹장기 연구 대상.
+
+
+ +
+12.2 오픈소스 에이전트 프레임워크 비교 (OpenHands, Aider, Cline, Cursor 등) (클릭하여 펼치기) +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
프로젝트Stars아키텍처핵심 차별점AX Copilot 적용 포인트
OpenHands64k+이벤트 소싱 + Docker 샌드박스SecurityAnalyzer, LLMSummarizingCondenser, 이벤트 소싱ContextCondenser 구현, 위험도 평가, 이벤트 로그
Aider30k+Git 기반 diff 편집 + 코드맵Repository Map, Unified Diff, Auto-commitRepo Map (작업 폴더 트리 요약), Git 스냅샷
Cline35k+VS Code 확장 + 에이전트 루프Diff 미리보기, 비용 추적, MCP 지원Diff 미리보기 UI, 누적 비용 표시
Cursor상용IDE 내장 에이전트 + Shadow WorkspaceShadow Workspace, Tab Completion, @-mentionsShadow Workspace, @-참조 컨텍스트 첨부
Devon4k+세션 기반 에이전트 + 자동 테스트자동 테스트 실행, 세션 이력, Interrupt & Resume세션 직렬화, 자동 테스트
Sweep8k+GitHub Issue → PR 자동 생성코드 검색 인덱싱, Self-reviewSelf-review 2-pass 패턴
Mentat3k+터미널 기반 코딩 에이전트Auto Context (import/dependency 자동 수집)Auto Context 파일 편집 시 관련 파일 자동 추가
+
+
+ +
+12.3 고도화 기술 영역 — 적용 우선순위 (12항목) (클릭하여 펼치기) +
+ + + + + + + + + + + + + + +
#기술 영역현재 상태목표 구현참고우선순위
1Task Decomposition없음복잡한 요청을 하위 작업으로 분해 + 진행률 UIHuggingGPT, Plan-and-SolveP1
2Self-Reflection에러 메시지만반성 프롬프트 + 최대 3회 자동 재시도Reflexion, SWE-AgentP1
3Context Condenser없음토큰 임계값 시 LLM 요약으로 압축OpenHandsP1
4Repo/Folder Map없음파일 트리를 시스템 프롬프트에 자동 포함Aider RepoMapP2
5Risk AssessmentAsk/Auto/Deny만도구별 위험도 자동 분류OpenHands SecurityAnalyzerP2
6Diff Preview즉시 수정파일 수정 전 diff 뷰 + 사용자 승인Cline, CursorP2
7Session Serialization대화만 저장에이전트 루프 전체 상태 JSON 저장/복원Devon, OpenHandsP2
8Custom Skill Library내장 12개 고정사용자 정의 스킬 저장/관리VoyagerP3
9Self-Review없음2-pass 품질 검증 패턴Sweep, ReflexionP3
10Parallel Tool Execution순차 1개씩Task.WhenAll 병렬 실행Claude API parallel tool_useP3
11Auto Context없음편집 대상 파일의 import/참조 파일 자동 감지Mentat, CursorP3
12Shadow Workspace없음임시 복사본에서 편집 → 검증 → 적용CursorP3
+
+ 핵심 원칙: 모든 고도화는 C# 네이티브로 구현. Python/Node.js 의존성 없음.
+ 최우선 3개: Task Decomposition + Self-Reflection + Context Condenser +
+
+
+ +
+12.5 UX 고도화 계획 + 12.7 경쟁 서비스 설정 분석 (클릭하여 펼치기) +
+

UX 고도화 계획

+ + + + + + + +
#기능설명우선순위
1파일 포맷 선택 UI사용자가 결과물 형식(Excel/Word/HTML/Markdown/CSV)을 직접 선택P1
2실행 이력 상세 표시에이전트 전체 이력을 타임라인으로 표시 (접이식 이벤트 카드)P1
3문서 실시간 미리보기Claude Artifacts 스타일 오른쪽 패널 미리보기P1
4디자인 템플릿 시스템고품질 디자인 템플릿 내장 (보고서, 분석표, 대시보드 등)P2
5Suggestion Chips 고도화다양한 선택지 패턴 감지하여 칩 표시P2
+
+ +
+

경쟁 서비스 설정 분석 — 사용자 자유 설정 극대화

+ + + + + + + + +
설정 카테고리경쟁 서비스 현황AX Copilot 구현 계획우선순위
미리보기 자동 열기Claude Artifact 자동 표시AutoPreview: Auto / Manual / OffP1
기본 출력 포맷AI가 자동 선택DefaultOutputFormat: 자동 / Excel / Word / HTML / MD / CSVP1
에이전트 권한 세부프로젝트별 권한 프로필도구별 개별 권한, 경로별 권한, 위험도 기반 자동 분류P2
이벤트 로그 수준상세/간략 모드 전환AgentLogLevel: 간략 / 상세 / 디버그P2
에이전트 루프 제한기본 25회MaxAgentIterations: 1~50 슬라이더P2
탭별 모델 설정단일 모델Chat/Cowork/Code 탭별 다른 LLM 지정 가능P3
+
+
+ +
+12.8 커스텀 UI 가이드라인 (클릭하여 펼치기) +
+

커스텀 UI 가이드라인 — 심미적 일관성 원칙

+ + + + + + + +
UI 요소문제점커스텀 구현 방안상태
ContextMenu시스템 기본 흰색 메뉴WPF Popup 기반 커스텀 메뉴 + DynamicResource완료
MessageBoxWin32 스타일 테마 불일치CustomMessageBox 클래스로 대체완료
ComboBox 드롭다운다크 테마에서 불일치Popup 기반 커스텀 드롭다운P2 예정
FolderBrowserDialog테마 적용 불가자체 최근 폴더 메뉴를 1차 접점으로 제공완료
ToolTip시스템 기본 노란색커스텀 ToolTip — 다크 배경, 라운드 코너P2 예정
+
+ 개발 규칙:
+ 1. 새 팝업/메뉴/대화상자 — 시스템 기본 컨트롤 사용 금지, 반드시 커스텀 구현
+ 2. 모든 색상은 DynamicResource 키 사용 (하드코딩 절대 금지)
+ 3. 폰트 크기: 메뉴 항목 13px 이상, 설명 텍스트 12px 이상
+ 4. 호버/클릭 효과 필수 — #18FFFFFF 반투명 배경 + 핸드 커서
+ 5. Popup 내부에 Button 사용 금지 — Border + MouseLeftButtonUp 사용 +
+
+
+ + + +

9. AX Agent 3탭 개발 로드맵

+ +
+ AX Agent를 Chat · Cowork · Code 3탭 구조로 확장.
+ 서버 기반 오픈소스 플랫폼의 계획→실행→검증 루프를 데스크톱 앱에 내장. +
+ +
+Phase 1~3 + 공통 인프라 + 전체 스킬 목록 (클릭하여 펼치기) + +
+

Phase 1 — Chat 탭 고도화 (v1.0.7)

+ + + + + + +
항목설명우선순위
탭 UI 구조ChatWindow 상단에 Chat | Cowork | Code 3탭 추가P0
작업 폴더 선택채팅 하단 폴더 경로 표시 바 + 선택 버튼P0
권한 시스템 설계3단계: Ask / Auto / DenyP0
파일 컨텍스트 첨부드래그&드롭 또는 버튼으로 파일 첨부P1
+
+ +
+

환경 제약: Docker/WSL 사용 불가

+

+ 사내 보안 정책으로 Docker 및 WSL이 차단. 웹 검색 기능은 보안 정책상 구현하지 않습니다.
+ 대안 전략: 오픈소스 핵심 로직을 C# 네이티브 코드로 재구현. +

+
+ +
+

Phase 2 — Cowork 탭 (v1.1.0) — C# 네이티브 에이전트 엔진

+ + + + + + + + +
항목설명구현 방식
에이전트 루프 엔진계획→도구실행→관찰→재평가 반복C# AgentLoopService
기본 도구 (Tools)FileRead/Write/Edit, Process, Glob, GrepC# IAgentTool 인터페이스
내장 스킬ExcelSkill, DocxSkill, CsvSkill, MarkdownSkill, HtmlSkill, BatchSkill앱 내장 스킬 시스템
LLM 함수 호출Tool-use / Function-calling 프로토콜기존 LlmService 확장
권한 승인 UI인라인 승인 UI + 경로 표시 배너C# PermissionService
컨텍스트 요약토큰 초과 시 자동 요약C# ContextCondenser
+
+ +
+

Phase 2.5 — Cowork 기능 고도화 (v1.1.x)

+ + + + + + + +
항목설명상태
프리뷰 탭 시스템다중 파일 프리뷰, 채팅↔프리뷰 드래그 리사이즈완료
드롭다운 메뉴 패턴컴팩트 드롭다운 + Popup 방식완료
프리뷰 동적 갱신에이전트 파일 수정 시 자동 새로고침완료
문서 읽기 도구PDF, DOCX, XLSX, CSV, TXT 텍스트 추출완료
폴더맵 도구작업 폴더 디렉토리 트리 생성완료
+
+ +
+

Phase 3 — Code 탭 (v1.2.0) — C# 네이티브 코딩 에이전트

+ + + + + + + + + +
항목설명구현 방식
코딩 에이전트 엔진프롬프트→LLM→도구호출→결과피드백→검증 루프Phase 2 AgentLoopService 확장
코드 도구 시스템Glob, Grep, FileEdit, Bash, 코드 분석C# GlobTool, GrepTool, FileEditTool
코드 에디터 뷰파일 트리 + 코드 뷰어 + diff 표시AvalonEdit NuGet
Git Snapshot매 작업 단계 자동 커밋 + undo/redoLibGit2Sharp
LSP 진단파일 수정 후 오류/경고 인라인 표시StreamJsonRpc (LSP JSON-RPC)
에이전트 모드 전환Plan 모드(읽기 전용) ↔ Build 모드(실제 수정)도구 권한 레벨로 구분
서브에이전트복잡한 작업을 하위 에이전트에 위임SubAgentService + Task.WhenAll
+
+ +
+

공통 인프라 (전 Phase 공유)

+ + + + + + + + +
항목설명
작업 폴더 시스템Chat 하단에 폴더 선택 바. Cowork/Code 탭 전환 시 동일 폴더 유지
권한 3단계Ask(매번 확인) / Auto(자동 허용, 경고 배너) / Deny(완전 차단)
탭별 대화 분리Chat · Cowork · Code 탭별 대화 이력 완전 분리
외부 런타임 불필요순수 C#/.NET 8.0으로 모든 기능 구현
웹 검색 차단사내 보안 정책으로 에이전트의 외부 웹 접속 차단
NuGet 패키지만 사용LibGit2Sharp, AvalonEdit, StreamJsonRpc, FileSystemGlobbing
+
+ +
+

전체 스킬 목록 (확장 계획)

+ + + + + + + + + + + + + + + + + + +
분류우선순위스킬기능보안
문서P0ExcelSkill 고도화셀 서식, 수식, 다중 시트안전
P0DocxSkillWord 문서 생성안전
P1PptxSkill프레젠테이션 생성안전
P0HtmlSkill 고도화JS 지원, Chart.js 차트, Mermaid안전
데이터P0CsvSkillCSV 읽기/쓰기/필터링안전
P1JsonSkillJSON 쿼리/변환/검증안전
P2SqliteSkill로컬 DB 생성/쿼리SQL 인젝션 방지
시각화P1ChartSkillBar/Line/Pie 차트안전
P1MermaidSkillMermaid 다이어그램안전
PDFP1PdfReadSkillPDF 텍스트 추출읽기 전용
P2PdfCreateSkill보고서 PDF 생성안전
유틸P0ZipSkill압축/해제Zip-slip 검증
P1DiffSkill두 파일 비교읽기 전용
스크립트P0BatchSkill.bat 파일 생성 (실행 X)시스템 명령 차단
P1PowerShellSkill.ps1 스크립트 생성시스템 명령 차단
개발P1GitSkillstatus/log/diff/commit + 스냅샷쓰기 작업 확인
+
+
+ +
+Cowork · Code 탭 설정 항목 계획 (클릭하여 펼치기) +
+ + + + + + + + + + + +
설정 항목Claude DesktopAX Copilot 계획상태
기본 파일 접근 권한Ask / Auto 선택Ask / Auto / Deny 3단계완료
탭별 대화 분리탭별 별도 대화 이력탭별 대화 완전 분리 저장완료
허용 도구 목록도구별 활성/비활성 토글설정에서 도구별 체크박스Phase 2
내장 스킬없음 (Artifacts로 대체)ExcelSkill, MarkdownSkill, HtmlSkill 등Phase 2
최대 에이전트 반복 횟수내부 제한 (~100회)설정에서 25~100 지정Phase 2
자동 컨텍스트 요약자동 (토큰 초과 시)임계치 조절 가능Phase 2
탭별 모델 선택전역 모델 선택Chat / Cowork / Code 탭별 기본 모델Phase 2
Git 스냅샷자동 커밋/되돌리기작업 전 자동 스냅샷, 원클릭 롤백Phase 3
코드 에디터 설정없음AvalonEdit 테마, 폰트/크기, 줄번호Phase 3
+
+
+ + + +

10. 공통 개발 지침

+
+ 모든 기능 개발 시 아래 5가지 공통 원칙을 준수합니다. +
+ +
+지침 1~5 상세 (클릭하여 펼치기) + +
+

지침 1. 커스텀 UI 적극 개발

+

화면 디자인 개선을 위해 커스텀 화면을 적극 개발하여 사용합니다.

+
    +
  • WPF 기본 제공 컨트롤(ContextMenu, MessageBox, Dialog 등) 사용을 지양합니다.
  • +
  • 다크/라이트 테마 모두에서 올바르게 동작하도록 DynamicResource 기반으로 구현합니다.
  • +
+
+ +
+

지침 2. 사용자-모델 상호 피드백 구조

+

사용자와 대화 모델이 상호 피드백하는 구조로 개발합니다.

+ + + + + +
단계AI 행동사용자 피드백 방식
계획작업 목록 + 예상 결과 제시승인 / 수정 / 취소 버튼
실행도구 호출 전 확인 요청실행 / 건너뛰기 버튼
검수결과 미리보기 + 요약 표시승인 / 재작업 / 메시지
+
+ +
+

지침 3. 최신 논문 및 오픈소스 적극 활용

+

최신 논문 및 오픈소스를 활용하여 기능 고도화를 적극 추진합니다.

+
    +
  • 에이전트 아키텍처, 도구 사용 패턴, RAG 기법 등 학술 연구 결과를 구현에 반영합니다.
  • +
  • 새로운 기능 기획 시 관련 논문/오픈소스를 먼저 조사하고 벤치마크합니다.
  • +
+
+ +
+

지침 4. NuGet 고성능 라이브러리 적극 채용 + 포함배포

+

필요한 경우 고성능 NuGet 라이브러리를 적극 채용하고, 포함배포(self-contained)로 인트라넷 호환성을 보장합니다.

+ + + + + + + +
영역현재검토 대상 NuGet용도
DOCX/XLSXDocumentFormat.OpenXml이미 채택Word/Excel 생성
PDF 생성미구현QuestPDF, itext7PDF 보고서 직접 생성
Excel 고급OpenXml 직접ClosedXML더 간편한 Excel API
차트 이미지CSS 차트ScottPlot, LiveCharts2차트를 이미지로 렌더링
마크다운직접 파싱MarkdigMD→HTML 고품질 변환
+
+ +
+

지침 5. 마우스 오버 애니메이션 필수 적용

+

대화창에서 마우스 오버가 가능한 모든 버튼, 아이콘에 호버 시 애니메이션을 적용합니다.

+ + + + + + + +
대상호버 효과구현 방법
GhostBtn (사이드바 버튼)1.08x 확대XAML Style.Triggers + ScaleTransform
TopTabBtn (탭 버튼)1.06x 확대XAML Style.Triggers + ScaleTransform
BtnSend, BtnStop, BtnAttach1.10~1.12x 확대코드비하인드 ApplyHoverScaleAnimation()
BtnModelSelectorY축 -2.5px 바운스코드비하인드 ApplyHoverBounceAnimation()
액션 버튼 (복사, 편집 등)1.15x 확대CreateActionButton 내 적용
+
+ 금지 사항: 인접 요소(탭 버튼, 가로 나열 메뉴, 툴바 아이콘 등)에 ScaleTransform 확대 효과 사용 금지 — 이웃 요소를 가리거나 레이아웃 깨짐. 대안: TranslateTransform(바운스), 배경색 변경, Opacity 변경 사용. +
+
+ 디자인 통일 원칙: 모든 선택 표시는 심플한 V 체크 Path(CreateSimpleCheck())로 통일. Segoe MDL2 Assets 폰트 체크마크 사용 금지. 라디오 버튼 형태(원+점) 사용 금지. +
+
+
+ + + + + +
Part 2 — 완료된 고도화
+ + + +

11. Phase 2.5~7 (v1.1.0 ~ v1.2.1) 완료

+
+
    +
  • 에이전트 루프 엔진 (21개 도구), 10종 무드, 커스텀 프리셋
  • +
  • 마크다운 렌더링 (테이블/인용/링크/취소선), 코드 블록 강화
  • +
  • Code 탭 (5프리셋), DevEnvDetect/BuildRun/GitTool, Nexus 연동
  • +
  • 8단계 워크플로우 시스템 프롬프트, AX.md 프로젝트 컨텍스트
  • +
+
+ + + +

12. Phase 7.5 (v1.2.2) 완료

+
+
    +
  • 무지개 글로우 효과 (런처/채팅), 커스텀 UI (컨텍스트 메뉴, InputDialog)
  • +
  • 설정 구조 개편 (공통 탭 통합), 다크 테마 6종 가독성 개선
  • +
  • 알림 오류 수정 (ShowTips/NotifyOnComplete), ViewModel 바인딩 정비
  • +
+
+ + + +

13. Phase 8 (v1.3.0) — 경쟁 서비스 벤치마크 기반 완료

+
+ + + + + + + + + + + + +
#기능구현 내용
8-1MCP 클라이언트McpClientService (stdio/JSON-RPC), McpTool 래핑, 설정 UI
8-2모델 폴백FallbackModels 순차 시도, 폴백 알림, 설정 편집 UI
8-3대화 분기ParentId/BranchLabel, 우클릭 "여기서 분기", 사이드바 분기 아이콘
8-4스플릿 뷰자동 프리뷰 (에이전트 파일 수정 시), AutoPreview 설정
8-5커맨드 팔레트Ctrl+Shift+P, 16개 명령, 한글 초성 검색
8-6토큰 관리TokenEstimator (비용 추정, CJK 가중치), 상태바 비용 표시
8-7에이전트 자율성동적 반복 한도 (도구 15+ → 2배), 다단계 반성
8-8개발자 모드공통 탭, 비밀번호 보호, 스텝 승인
8-9보안 감사 로그AuditLogService (JSON 영속화), 설정 토글 + 폴더 열기
추가다중 서버RegisteredModel에 endpoint/apiKey 필드, 모델별 서버 라우팅
+
+ + + +

14. 개발 진행 로그 (v1.0.5 ~ v1.0.7)

+ +
+v1.0.5 AI 서비스 전면 개선 (클릭하여 펼치기) +
+

2026-03-28 — v1.0.5 AI 서비스 전면 개선

+ + + + + + + + + + + + +
항목상태변경 내용
LlmService JSON 파싱 안전완료SafeParseJson 래퍼, 배열 길이 검사, API error 응답 감지
API 에러 분류완료HTTP 상태 코드별 메시지 (401/403/404/429/500)
재시도 로직완료PostJsonWithRetryAsync — 429/타임아웃 시 최대 2회
청크 타임아웃완료ReadLineWithTimeoutAsync — 30초 무응답 시 스트림 종료
ChatStorageService 동기화완료ReaderWriterLockSlim, 원자적 쓰기(tmp→rename)
ChatHandler 싱글턴완료lock(_windowLock)으로 중복 창 생성 방지
ChatWindow UI 쓰로틀링완료DispatcherTimer 50ms 간격 갱신, Brush 캐싱
Claude API 백엔드완료Anthropic Messages API, 스트리밍(content_block_delta)
API 키 보안 분리완료Ollama/vLLM=암호화, Gemini/Claude=평문
설정 UI AI 탭완료4종 서비스 선택, 서비스별 키 입력 안내 텍스트 분리
+
+
+ +
+v1.0.6 채팅 서비스 품질 집중 개선 (클릭하여 펼치기) +
+

2026-03-28 — v1.0.6 채팅 서비스 품질 집중 개선

+ + + + + + + + + +
항목상태변경 내용
스트리밍 실시간 표시 수정완료청크 단위 갱신 + Dispatcher.InvokeAsync(Background) 방식
Shift+Enter 줄바꿈완료AcceptsReturn="True" + PreviewKeyDown 핸들러
프롬프트 카드 워터마크완료워터마크(placeholder) 오버레이 표시
좋아요/싫어요 상호 배타완료resetSibling/registerReset 콜백 패턴
디스크 용량 초과 자동 삭제완료드라이브 사용률 98% 초과 시 오래된 대화 자동 삭제
우클릭 컨텍스트 메뉴완료대화 제목에서 우클릭 시 바로 커스텀 메뉴 표시
대화 더블클릭 오류 수정완료RemoveAt+Insert 패턴으로 안전 교체
+
+
+ +
+v1.0.7 Chat 1단계 개발 (3탭 · 폴더 · 첨부 · 프리셋) (클릭하여 펼치기) +
+

2026-03-28 — v1.0.7 Chat 1단계 개발

+ + + + + + + + + + + +
항목상태변경 내용
Chat/Cowork/Code 3탭 UI완료상단 RadioButton 탭을 Agent 단일 → 3탭으로 전환
작업 폴더 선택 바완료폴더 경로 표시 + 선택/해제 버튼. 최근 폴더 10개 저장
파일 컨텍스트 첨부완료파일 첨부 버튼 + 드래그 앤 드롭. 10MB 제한
권한 시스템 설계완료3단계 파일 접근 권한: Ask / Auto / Deny
대화 주제 프리셋 7종완료일반/경영/연구개발/제품분석/수율분석/제조기술/시스템
대화 내보내기 확장완료Markdown + JSON + HTML + Text 4종 포맷
메시지 타임스탬프완료사용자/AI 메시지에 HH:mm 시간 표시
격려 알림 주기 타이머완료System.Timers.Timer 기반 주기적 알림
커스텀 메시지 박스완료앱 전체 기본 MessageBox → 테마 통합 커스텀 다이얼로그
+
+
+ + + + + +
Part 3 — 다음 고도화 계획
+ + + +

15. Phase 9 — 차세대 고도화 (v1.5.0) ✓ 완료

+ +
+

Context (2026년 3월 기준)

+
    +
  • Claude Code: SWE-bench 80.8%, Opus 4.6 1M 컨텍스트, 서브에이전트, MCP 표준화, 원격 트리거
  • +
  • Cursor: Tab 자동완성, Multi-file 에이전트, 백그라운드 에이전트, LSP 통합
  • +
  • OpenCode: Go 기반 오픈소스 131K★, Tree-of-Thought, MCP, 벡터 DB 컨텍스트
  • +
  • GitHub Copilot: 코딩 에이전트, 자동 PR, 이슈→코드 파이프라인
  • +
  • Windsurf: Cascade 멀티스텝 에이전트, 브라우저 통합
  • +
  • 논문: Agentic Coding Survey (arXiv 2025), SWE-Agent v2, CodeAct, Reflexion
  • +
+
+ +
+
+

9-1. 코드 인텔리전스 (LSP 연동)

+ ✓ 완료 +
+

갭: 코드 분석 없이 텍스트 기반으로만 코드 이해

+

구현: Language Server Protocol 클라이언트로 정의 이동, 참조 검색, 심볼 목록 활용

+

에이전트 도구: lsp_goto_definition, lsp_find_references, lsp_symbols

+

기술: OmniSharp (C#), typescript-language-server, pyright

+
+ +
+
+

9-2. 병렬 에이전트 (서브에이전트) — ✓ 완료

+ 높음 +
+

갭: 단일 에이전트가 순차 처리, 큰 작업에서 느림

+

구현:

+
    +
  • 메인 에이전트가 서브태스크 분할 → 서브에이전트 독립 실행 → 결과 병합
  • +
  • 에이전트 도구: spawn_agent, wait_agents
  • +
+

패턴: Claude Code의 Agent tool, OpenCode의 parallel execution

+
+ +
+
+

9-3. 코드 시맨틱 검색 (TF-IDF) — ✓ 완료

+ 높음 +
+

갭: 대규모 프로젝트에서 관련 파일을 찾지 못함

+
    +
  • 프로젝트 파일을 임베딩 벡터로 인덱싱 → 질문 관련 파일 자동 검색
  • +
  • 에이전트 도구: search_codebase (시맨틱 검색)
  • +
+

기술: SQLite-vec 또는 Hnswlib (로컬 벡터 DB, 서버 불필요)

+
+ +
+
+

9-4. 자동 테스트 루프 — ✓ 완료

+ 중간 +
+

구현: 코드 변경 감지 → 관련 테스트 자동 생성 → 실행 → 결과 기반 수정

+

에이전트 도구: test_generate, test_run, test_analyze

+
+ +
+
+

9-5. 이벤트 트리거 에이전트 — ✓ 완료

+ 중간 +
+

구현: 스케줄된 작업 실행 (코드 리뷰, 보안 스캔, 일일 보고서)

+

트리거 소스: 타이머, 파일 변경 감지, Git push/pull 이벤트

+
+ +
+
+

9-6. PDF/문서 내보내기 — ✓ 완료

+ 중간 +
+

구현: 대화 → PDF, 보고서 → Word/PDF 변환

+

기술: HTML → PDF (PuppeteerSharp 또는 wkhtmltopdf)

+
+ +
+
+

9-7. 실시간 diff 뷰어 — ✓ 완료

+ 중간 +
+
    +
  • 수정 전/후 비교 (라인 기반 diff, 색상 하이라이트)
  • +
  • 프리뷰 패널에 diff 탭 자동 추가
  • +
  • Accept/Reject 버튼으로 변경 승인/취소
  • +
+
+ +
+
+

9-8. 대화 분기 트리 탐색기

+ 낮음 +
+

구현: 트리 형태 대화 탐색기 (노드 = 메시지, 간선 = 분기, 현재 위치 하이라이트)

+
+ +
+
+

9-9. 접근성 (A11y)

+ 중간 +
+

구현: WPF AutomationPeer, 키보드 내비게이션, 고대비 모드 (WCAG 2.1 AA)

+
+ + + +

16. Phase 10 — 지능형 에이전트 (v1.5.0) ✓ 완료

+ +
+ + + + + + + + +
#기능구현 내용상태
10-1자동 모델 선택 (Auto Router)질문 유형 감지 → 최적 모델 자동 라우팅, 잠금 모드✓ 완료
10-2에이전트 메모리 (영속 학습)프로젝트 규칙/코딩 선호도 자동 기억, 대화 간 유지✓ 완료
10-3웹훅 트리거 확장Git push/PR, Jira/Slack 웹훅 → 에이전트 자동 실행높음
10-4멀티모달 입력 (Vision)Ctrl+V 이미지 붙여넣기 → Gemini/Claude/Ollama/OpenAI Vision API✓ 완료
10-5코드 검색 개선TF-IDF + SQLite 영속 인덱스, 증분 업데이트, 바이그램✓ 완료
10-6에이전트 훅 시스템도구 호출 전/후 사용자 스크립트 실행✓ 완료
+
+ + +

17. Phase 11 — 생태계 확장 (v1.5.0) ✓ 완료

+ +
+ + + + + + + +
#기능구현 내용상태
11-1스킬 시스템*.skill.md YAML 프론트매터 → 슬래시 명령 자동 등록. 3폴더 우선순위. 기본 스킬 3종✓ 완료
11-2AI 코드 리뷰 자동화CodeReviewTool — diff_review/file_review/pr_summary. 정적 분석 + diff 파서✓ 완료
11-3드래그&드롭 AI 처리파일 유형별 AI 액션 팝업 (코드/문서/데이터/이미지)✓ 완료
추가프로젝트 지침 (AX.md)ProjectRuleTool — read/append/write, 사용자 승인✓ 완료
추가슬래시 명령어 강화탭별 필터링, /help 도움말 창, 12개 내장 명령✓ 완료
+
+ + +

18. Phase 12 — 스킬/커넥터 고도화 + 자율 에이전트 (v2.0+) 차기 개발

+ +
+ + + + + + + + + + + + + +
#기능설명우선순위
12-1도구/커넥터 관리 UI설정 → 기타에 29개 도구 카드 리스트, 활성/비활성 토글, 권한 표시최고
12-2SKILL.md 표준 호환agentskills.io 스펙 지원. *.skill.md + 폴더/SKILL.md 양쪽 호환. 도구명 매핑최고
12-3스킬 시각적 편집기폼 기반 UI로 스킬 생성 (이름/설명/지시사항/도구 선택). SKILL.md 저장✓ 완료
12-4런타임 의존 스킬Python/Node 감지 → 고급 스킬 자동 활성화, 4종 번들✓ 완료
12-5워크플로우 분석기에이전트 실행 실시간 시각화 창, AgentLogLevel 연동, 타이밍/토큰 추적✓ 완료
12-6스킬 갤러리 UI설치된 스킬 카드 뷰, 카테고리 필터, 내장/사용자 뱃지, 편집/복제/삭제✓ 완료
12-7스킬 가져오기/내보내기로컬 zip 기반 스킬 패키지 설치/내보내기 (온라인 마켓 제외)✓ 완료
12-8에이전트 팀 (다중 세션 협업)여러 에이전트 메시지 교환 + 분업중간
12-9오프라인 AI (로컬 SLM)ONNX Runtime + phi-3, 서버 없이 번역/요약낮음
12-10음성 입출력Whisper STT + TTS낮음
12-11접근성 (A11y)WCAG 2.1 AA, 키보드 내비게이션낮음
+
+ + +

19. Phase 13 — 스킬 생태계 + 에이전트 분석 고도화 (v1.5.3+) 차기 개발

+ +
+ + + + + + + +
#기능설명우선순위
13-1스킬 갤러리 UI설치된 스킬 카드 뷰, 카테고리 필터, 내장/사용자/고급 뱃지, 편집/복제/삭제✓ 완료
13-2스킬 시각적 편집기폼 기반 UI로 스킬 생성 (이름/설명/지시사항/도구 선택), SKILL.md 저장✓ 완료
13-3스킬 가져오기/내보내기로컬 zip 기반 스킬 패키지 설치/내보내기✓ 완료
13-4에이전트 실행 통계 대시보드일별/주별 토큰 사용량, 도구 호출 빈도, 모델별 비용, 성공률 차트✓ 완료
13-5AgentLogLevel 채팅 UI 연동실행 이력 상세도를 코워크/코드 탭으로 이동, 채팅 본문 표시에 반영✓ 완료
+

+ 구현 순서: 13-A (13-5 + 13-3) → 13-B (13-1 + 13-4) → 13-C (13-2) +

+
+ + +

20. Phase 14 — 에이전트 도구 + 스킬 대확장 (v1.5.4+) ✓ 완료

+ +
+

방향

+
    +
  • 에이전트 도구 확장: 25종 → 42종+. 실무 작업 80% 이상을 에이전트가 자율 수행
  • +
  • 외부 검증 스킬 번들: Anthropic 공식, 커뮤니티 검증 스킬을 앱에 내장 (13개 → 29개)
  • +
  • 앱 인프라: 가이드 시스템, 설정 UI 개선, About 보안
  • +
+
+ +
+

14-A. 데이터 처리 도구 (5종) ✓ 완료

+ + + + + + + +
#도구설명상태
14-A1json_toolJSON 파싱·변환·검증·포맷팅 (jq 스타일 쿼리)✓ 완료
14-A2regex_tool정규식 테스트·추출·치환 (패턴 설명 포함)✓ 완료
14-A3diff_tool두 파일/텍스트 비교 → 통합 diff 출력✓ 완료
14-A4base64_toolBase64/URL 인코딩·디코딩✓ 완료
14-A5hash_tool파일·텍스트 MD5/SHA256 해시 계산✓ 완료
+
+ +
+

14-B. 시스템/환경 도구 (6종) ✓ 완료

+ + + + + + + + +
#도구설명상태
14-B1clipboard_toolWindows 클립보드 읽기·쓰기 (텍스트/이미지)✓ 완료
14-B2notify_toolWindows 알림 전송 (장시간 작업 완료 알림)✓ 완료
14-B3env_tool환경변수 읽기·설정 (프로세스 범위)✓ 완료
14-B4zip_tool파일 압축(zip) / 해제✓ 완료
14-B5log_searchWindows 이벤트 로그·애플리케이션 로그 검색낮음
14-B6datetime_tool날짜·시간 변환, 타임존, 기간 계산✓ 완료
+
+ +
+

14-C. 네트워크/API 도구

+ + + + + +
#도구설명상태
14-C1http_tool로컬/사내 HTTP API 호출 (GET/POST, JSON 파싱)✓ 완료
14-C2sql_toolSQLite DB 쿼리 실행 (로컬 파일 기반)✓ 완료
14-C3network_tool포트 열림 확인, DNS 조회, ping (사내 망)낮음
+
+ +
+

14-E. UX 개선 (슬래시 명령어 고도화)

+ + + + + +
#항목설명상태
14-E1슬래시 칩 표시명령 선택 후 입력창에 파란 칩으로 표시✓ 완료
14-E2팝업 페이징최대 N개 표시 + ▲▼ 네비게이션✓ 완료
14-E3compact 명령어/init, /ctx, /pr, /todo, /clean, /refactor 등차기
+
+ +
+

14-F. 외부 검증 스킬 내장 번들 (12종) ✓ 완료

+ + + + + + + + + + + + + + +
#스킬설명requires
14-F1code-scaffold프로젝트 구조 자동 생성
14-F2meeting-minutes회의록 정리 (참석자/결정사항/액션아이템)
14-F3paper-review논문 요약, 강점/약점 분석
14-F4data-visualize데이터 시각화 차트 (CSV/JSON → HTML)
14-F5docx-creatorWord 문서 자동 생성python
14-F6xlsx-analyzerExcel 데이터 분석·피벗·차트python
14-F7pdf-processorPDF 텍스트 추출·병합·분할python
14-F8pptx-creatorPPT 프레젠테이션 자동 생성node
14-F9report-writer구조화된 보고서 자동 작성
14-F10api-docsAPI 문서 자동 생성
14-F11db-schemaDB 스키마 → ERD 생성
14-F12commit-reviewGit 커밋 메시지 검토 + 개선
+

크기 영향: .skill.md 12개 ≈ 약 130KB (인스톨러 크기 영향 없음)

+
+ +
+

14-G. 앱 인프라 개선 (v1.5.3) ✓ 완료

+ + + + + +
#항목설명
14-G1가이드 시스템 신설사용자/개발자 가이드 분리, AES-256-CBC 암호화, GuideViewerWindow 내장 뷰어
14-G2설정 UI 개선독 바 탭 3번째 이동, 기타 탭 접기/열기 섹션
14-G3About 정보 보안기술 스택 비노출, "Commander + Agent" 표시
+
+ + + +

21. Phase 15 — 멀티패스 문서 엔진 + 스킬/도구 대확장 (v1.6.0) ✓ 완료

+ +
+ + + + + + + + + + + +
#기능구현 내용
15-A멀티패스 문서 생성document_plan (개요 구조화) + document_assemble (섹션 조립). 3페이지+ 문서를 개요→섹션별 상세→조립 방식으로 품질 향상
15-BPPT 네이티브 생성pptx_create — OpenXML 기반, Python 무의존, 5종 레이아웃, 4종 테마
15-C데이터 피벗/집계data_pivot — CSV/JSON 그룹화·필터·정렬·집계 (LINQ 기반)
15-D템플릿 렌더링template_render — Mustache 스타일 변수 치환·반복·조건부
15-E이미지 분석image_analyze — LLM 멀티모달 describe/OCR/데이터 추출/비교
15-F파일 변경 감지file_watch — 폴더 감시, 상대 시간(1h/7d), 유형별 통계
15-G텍스트 요약text_summarize — 청크 분할→핵심 추출 요약 (4종 스타일)
15-H내장 스킬 16종 추가비즈니스 4종 + 데이터 3종 + 개발 3종 + 외부 검증 6종 — 총 29종
15-I설정EnableMultiPassDocument, MultiPassThresholdPages
+

도구: 34개 → 42개 (+8), 스킬: 13개 → 29개 (+16)

+
+ + + + + +
Part 4 — 차세대 고도화 계획 (v1.7.0 ~ v2.0)
+ +
+

계획 기준 (2026년 3월)

+
    +
  • Claude Code: Plan mode, Hooks, 병렬 도구, 서브에이전트 팀
  • +
  • Cursor: 프로젝트 규칙(.cursor/rules), 멀티파일 diff, 백그라운드 에이전트
  • +
  • GitHub Copilot: 반복 테스트-수정, Workspace plan, 이슈→코드 파이프라인
  • +
  • Windsurf: 자동 컨텍스트 수집, 영속 메모리, Cascade 멀티스텝
  • +
  • 논문: Reflexion (자기 성찰), CodeAct (코드 기반 액션), SWE-Agent v2
  • +
+
+ + + +

22. Phase 16 — 에이전트 지능 강화 + 개발자 경험 (v1.7.0) 차기 개발

+ +
+ + + + + + + + + +
#기능설명우선순위
16-1플랜 모드 (Plan Mode)에이전트가 도구 실행 전 구조화된 계획 생성 → 사용자 검토/편집/승인 → 승인 후 실행. PlanMode: off/always/auto최고
16-2도구/커넥터 관리 UI설정에서 52개 도구 카테고리별 카드, 활성/비활성 토글, MCP 서버 연결 상태 표시높음
16-3프로젝트 규칙 시스템.ax/rules/*.md 디렉토리 — 파일 패턴·작업 유형별 규칙을 시스템 프롬프트에 자동 주입높음
16-4반복 테스트-수정 루프TestLoopTool auto_fix 모드 — 테스트 실행→실패 파싱→수정→재실행 자동 반복높음
16-5병렬 도구 실행LLM 다수 도구 동시 호출 시 의존성 분석 후 Task.WhenAll() 병렬 실행중간
16-6SKILL.md 표준 완전 호환agentskills.io 스펙 전체 파싱, 외부↔내부 도구 이름 매핑중간
16-R런타임 고급 스킬 확장4종 추가: image-processor, diagram-generator, ocr-extract, data-visualize-adv (총 8종)중간
+
+ +
+

16-1. 플랜 모드 (Plan Mode) — 핵심 기능

+

경쟁 대응: Claude Code Plan mode, GitHub Copilot Workspace plan

+

구현:

+
    +
  • AppSettings.csPlanMode 설정: off / always / auto
  • +
  • AgentLoopService.cs — 첫 반복에서 plan-only 시스템 프롬프트 주입, 도구 호출 차단
  • +
  • ChatWindow.xaml — PlanReviewPanel (계획 단계별 편집/순서변경/삭제 UI)
  • +
  • TaskDecomposer.cs — 구조화된 JSON 계획 포맷 파싱 강화
  • +
+
+ +
+

16-3. 프로젝트 규칙 시스템 (.ax/rules/)

+

경쟁 대응: Cursor .cursor/rules, Claude Code custom commands

+

구현:

+
    +
  • ProjectRulesService.cs — 규칙 로드, YAML 프론트매터 파싱 (applies-to: *.cs, when: code-review)
  • +
  • AgentLoopService.cs — 컨텍스트에 맞는 규칙만 시스템 프롬프트에 자동 주입
  • +
+
+ + + +

23. Phase 17 — 심화 지능 + UX 혁신 (v1.8.0) 계획

+ +
+ + + + + + + + +
#기능설명우선순위
17-1자기 성찰 (Self-Reflection)도구 실패 시 구조화된 성찰 프롬프트 주입, 에러 패턴 추적 (Reflexion 패턴)최고
17-2작업 기억 (Working Memory)대화 압축 시에도 유지되는 구조화된 태스크 상태 (현재 작업, 참조 파일, 의사결정 로그)높음
17-3멀티파일 통합 Diff 뷰에이전트 다수 파일 수정 시 전체 변경사항을 하나의 패널에서 파일별/헌크별 승인/거부높음
17-4자동 컨텍스트 수집사용자 메시지에서 파일명 감지 → 자동 읽기, Git diff, 관련 코드 검색 → 컨텍스트 주입중간
17-5MCP HTTP+SSE 전송stdio 전용 → HTTP+SSE 트랜스포트 추가, 원격 MCP 서버 연결 지원중간
17-6대화 요약 온디맨드/summarize-chat 슬래시 명령으로 현재 대화 구조화 요약낮음
+
+ +
+

17-1. 자기 성찰 (Self-Reflection) — 핵심 기능

+

현황: 현재 단순 재시도만 존재 (consecutiveErrors 카운터)

+

구현:

+
    +
  • ReflectionService.cs — 에러 패턴 추적, 성찰 프롬프트 생성
  • +
  • AgentLoopService.cs — 에러 후 성찰 주입
  • +
  • IAgentTool.csAgentEventType.Reflecting 추가
  • +
+
+ +
+

17-2. 작업 기억 (Working Memory)

+

경쟁 대응: Windsurf persistent memory, CrewAI structured memory layers

+

구현:

+
    +
  • WorkingMemoryService.cs — 구조화된 태스크 상태 추적
  • +
  • ContextCondenser.cs — 압축 시 작업 기억 보존
  • +
+
+ + + +

24. Phase 18 — 에코시스템 + 차별화 (v2.0) 계획

+ +
+ + + + + + + + +
#기능설명우선순위
18-1에이전트 팀 (Multi-Agent)특화 에이전트(코드리뷰, 문서작성, 보안감사)가 메시지 버스로 협업, 공동 작업 수행최고
18-2플러그인 갤러리 + 레지스트리로컬 NAS/Git 레지스트리 기반 플러그인/스킬 탐색, 설치, 업데이트 인앱 갤러리높음
18-3AI 스니펫;email {수신자} {주제} → LLM이 이메일 초안 자동 생성. 기존 스니펫에 AI 확장중간
18-4파라미터 퀵링크jira {티켓번호} → URL 템플릿 변수 치환 (사내 도구 빠른 접근)중간
18-5오프라인 AI (ONNX Runtime)서버 없이 번역/요약/분류 가능한 로컬 소형 모델, 모델 별도 배포낮음
18-6웹 검색 AI 요약? 검색 결과를 AI로 요약하여 런처에 표시낮음
+
+ +
+

18-1. 에이전트 팀 (Multi-Agent) — 차별화 핵심

+

경쟁 대응: GitHub Copilot workspace agents, CrewAI role-based teams

+

구현:

+
    +
  • AgentTeamService.cs — 팀 오케스트레이션
  • +
  • AgentMessageBus.cs — 에이전트 간 통신
  • +
  • AgentTeamConfig.cs — 팀 구성 모델
  • +
  • ChatWindow.xaml — 팀 모드 UI
  • +
+
+ + + +

25. 기존 기능 보완 (v1.3.0~v1.5.0 완료) ✓ 완료

+ +
+ + + + + + + + + + + + + +
항목상태
MCP UI (서버 관리 화면)✓ 비주얼 카드 리스트 + 활성/비활성 토글 + 서버 추가/삭제 UI 구현
대화 분기 트리 UI✓ 사이드바에 들여쓰기(16px) + 보라색 분기 아이콘 표시
스플릿 뷰 diff✓ DiffService (LCS 기반 라인 diff) 구현 — Added/Removed/Equal 분류
english.json 확장✓ 101 → 150개 완료
movies.json 확장✓ ~90 → 150개 완료
McpClientService nullable warning✓ CS8603 해결 — 전체 경고 0개, 오류 0개
대화별 하단 설정 저장✓ 권한/데이터활용/무드를 대화별 독립 저장/복원
vLLM 다중 서버 지원✓ RegisteredModel에 endpoint/apiKey 필드, 모델별 서버 라우팅
설정창 OutlineHoverBtn 크래시✓ 인라인 스타일로 교체
Auto 권한 경고 중복 표시✓ 기존 대화에서 Auto였으면 경고 숨김 처리
ShowTips/NotifyOnComplete 바인딩✓ SettingsViewModel 속성 추가, 설정값 저장 정상화
+
+ + + + + +
+ + + + diff --git a/docs/AGENT_ROADMAP.md b/docs/AGENT_ROADMAP.md new file mode 100644 index 0000000..323783d --- /dev/null +++ b/docs/AGENT_ROADMAP.md @@ -0,0 +1,292 @@ +# AX Agent 대화 서비스 고도화 계획 + +## 완료 이력 + +### Phase 2.5~7 (v1.1.0 ~ v1.2.1) +- 에이전트 루프 엔진 (21개 도구), 10종 무드, 커스텀 프리셋 +- 마크다운 렌더링 (테이블/인용/링크/취소선), 코드 블록 강화 +- Code 탭 (5프리셋), DevEnvDetect/BuildRun/GitTool, Nexus 연동 +- 8단계 워크플로우 시스템 프롬프트, AX.md 프로젝트 컨텍스트 + +### Phase 7.5 (v1.2.2) +- 무지개 글로우 효과 (런처/채팅), 커스텀 UI (컨텍스트 메뉴, InputDialog) +- 설정 구조 개편 (공통 탭 통합), 다크 테마 6종 가독성 개선 +- 알림 오류 수정 (ShowTips/NotifyOnComplete), ViewModel 바인딩 정비 + +### Phase 8 (v1.5.0) — 경쟁 서비스 벤치마크 기반 + +| # | 기능 | 구현 내용 | +|---|------|----------| +| 8-1 | MCP 클라이언트 | McpClientService (stdio/JSON-RPC), McpTool 래핑, 설정 UI | +| 8-2 | 모델 폴백 | FallbackModels 순차 시도, 폴백 알림, 설정 편집 UI | +| 8-3 | 대화 분기 | ParentId/BranchLabel, 우클릭 "여기서 분기", 사이드바 분기 아이콘 | +| 8-4 | 스플릿 뷰 | 자동 프리뷰 (에이전트 파일 수정 시), AutoPreview 설정 | +| 8-5 | 커맨드 팔레트 | Ctrl+Shift+P, 16개 명령, 한글 초성 검색 | +| 8-6 | 토큰 관리 | TokenEstimator (비용 추정, CJK 가중치), 상태바 비용 표시 | +| 8-7 | 에이전트 자율성 | 동적 반복 한도 (도구 15+ → 2배), 다단계 반성 | +| 8-8 | 개발자 모드 | 공통 탭, 비밀번호 보호, 스텝 승인 | +| 8-9 | 보안 감사 로그 | AuditLogService (JSON 영속화), 설정 토글 + 폴더 열기 | +| 추가 | 다중 서버 | RegisteredModel에 endpoint/apiKey 필드, 모델별 서버 라우팅 | + +--- + +## Phase 9 — 차세대 고도화 (v1.5.0) ✓ 완료 + +### Context (2026년 3월 기준) +- **Claude Code**: SWE-bench 80.8%, Opus 4.6 1M 컨텍스트, 서브에이전트, MCP 표준화, 원격 트리거 +- **Cursor**: Tab 자동완성, Multi-file 에이전트, 백그라운드 에이전트, LSP 통합 +- **논문**: Agentic Coding Survey (arXiv 2025), SWE-Agent v2, CodeAct, Reflexion + +### 9-1. 코드 인텔리전스 (LSP 연동) — ✓ 완료 +- **에이전트 도구**: `lsp_goto_definition`, `lsp_find_references`, `lsp_symbols` +- **기술**: OmniSharp (C#), typescript-language-server, pyright + +### 9-2. 병렬 에이전트 (서브에이전트) — ✓ 완료 +- **구현**: 메인 에이전트가 서브태스크 분할 → 서브에이전트 독립 실행 → 결과 병합 +- **에이전트 도구**: `spawn_agent` (서브에이전트 생성), `wait_agents` (결과 대기) +- **UI**: 진행률 바에 서브에이전트 상태 표시 (메인 + 서브 N개) + +### 9-3. 코드 시맨틱 검색 (TF-IDF) — ✓ 완료 +- **에이전트 도구**: `search_codebase` (시맨틱 검색) +- **기술**: SQLite 기반 로컬 벡터, 서버 불필요 + +### 9-4. 자동 테스트 루프 — ✓ 완료 +- **에이전트 도구**: `test_generate`, `test_run`, `test_analyze` +- **패턴**: SWE-bench — 실패 테스트 → 코드 수정 → 테스트 통과 루프 + +### 9-5. 이벤트 트리거 에이전트 — ✓ 완료 +- **트리거 소스**: 타이머, 파일 변경 감지, Git push/pull 이벤트 +- **결과**: 트레이 알림 + 로컬 리포트 파일 생성 + +### 9-6. PDF/문서 내보내기 — ✓ 완료 +- **구현**: 대화 → PDF, 보고서 → Word/PDF 변환 + +### 9-7. 실시간 diff 뷰어 — ✓ 완료 +- **구현**: 수정 전/후 비교 (라인 기반 diff, 색상 하이라이트) +- **Accept/Reject** 버튼으로 변경 승인/취소 + +--- + +## Phase 10 — 지능형 에이전트 (v1.5.0) ✓ 완료 + +| # | 기능 | 설명 | 우선순위 | +|---|------|------|----------| +| 10-1 | **자동 모델 선택 (Auto Router)** | 질문 유형(코딩/번역/분석) 감지 → 최적 모델 자동 라우팅 | ✅ 완료 (잠금) | +| 10-2 | **에이전트 메모리 (영속 학습)** | 프로젝트 규칙/코딩 선호도 자동 기억. 대화 간 유지 | ✅ 완료 | +| 10-3 | **웹훅 트리거 확장** | Git push/PR, Jira/Slack 웹훅 → 에이전트 자동 실행 | 높음 | +| 10-4 | **멀티모달 입력** | 이미지/스크린샷 → AI 분석 (Vision API) | ✅ 완료 | +| 10-5 | **코드 검색 개선** | TF-IDF + SQLite 영속 인덱스, 증분 업데이트, 바이그램, 스톱워드 | ✅ 완료 | +| 10-6 | **에이전트 훅 시스템** | 도구 호출 전/후 사용자 스크립트 실행 | ✅ 완료 | + +## Phase 11 — 생태계 확장 (v1.5.0) ✓ 완료 + +| # | 기능 | 설명 | 우선순위 | +|---|------|------|----------| +| 11-1 | **스킬 시스템** | 마크다운 기반 재사용 워크플로우, 슬래시 명령 호출 | ✅ 완료 | +| 11-2 | **AI 코드 리뷰 자동화** | Git diff → AI 리뷰 → 수정 → 테스트 닫힌 루프 | ✅ 완료 | +| 11-3 | **드래그&드롭 AI 처리** | 파일 드래그 → 자동 분석/변환/요약 | ✅ 완료 | + +### 11-1. 스킬 시스템 — ✓ 완료 +- **구현**: *.skill.md 파일의 YAML 프론트매터 파싱 → 슬래시 명령어로 노출 +- **스킬 폴더**: `%APPDATA%\AxCopilot\skills\` + 앱 기본 폴더 +- **에이전트 도구**: `skill_manager` (list/info/reload) +- **UI**: 슬래시 팝업에 스킬 아이콘(⚡) + 자동완성 통합 + +### 11-2. AI 코드 리뷰 자동화 — ✓ 완료 +- **에이전트 도구**: `code_review` (diff_review / file_review / pr_summary) +- **정적 분석**: 빈 catch, 동기 대기, 하드코딩 비밀번호, TODO/FIXME, 긴 메서드 +- **리뷰 초점**: all / bugs / performance / security / style + +### 11-3. 드래그&드롭 AI 처리 — ✓ 완료 +- **파일 유형 4종**: 코드 (리뷰/설명/리팩토링/테스트), 문서 (요약/분석/번역), 데이터 (분석/시각화/변환), 이미지 (설명/UI리뷰) + +--- + +## Phase 12 — 스킬/커넥터 고도화 (v1.5.x) ✓ 완료 (주요 항목) + +| # | 기능 | 상태 | +|---|------|------| +| 12-1 | **도구/커넥터 관리 UI** | ✅ 완료 → Phase 16-2로 통합 | +| 12-2 | **SKILL.md 표준 호환** | ✅ 완료 → Phase 16-6으로 통합 | +| 12-3 | **스킬 시각적 편집기** | ✅ 완료 | +| 12-4 | **런타임 의존 스킬 시스템** | ✅ 완료 (v1.5.1) | +| 12-5 | **워크플로우 분석기** | ✅ 완료 (v1.5.1) | +| 12-6 | **스킬 갤러리 UI** | ✅ 완료 | +| 12-7 | **스킬 가져오기/내보내기** | ✅ 완료 | + +### 12-4. 런타임 의존 스킬 시스템 — ✓ 완료 (v1.5.1) +- **RuntimeDetector**: Python/Node.js 설치 여부 자동 감지 (where.exe + --version, 5분 캐시) +- **SkillDefinition 확장**: `Requires`/`IsAvailable`/`UnavailableHint` 필드 +- **고급 스킬 4종 번들**: docx-creator, xlsx-analyzer, pdf-processor, pptx-creator +- **슬래시 팝업**: 비가용 스킬 회색 표시 + "(Python 필요)" 힌트 + +### 12-5. 워크플로우 분석기 — ✓ 완료 (v1.5.1) +- **AgentEvent 확장**: ElapsedMs, InputTokens, OutputTokens, ToolInput, Iteration +- **WorkflowAnalyzerWindow**: 세로 타임라인 실시간 시각화 (요약 카드 4종 + 노드 클릭 상세) +- **설정 연동**: 개발자 모드 → 워크플로우 시각화 토글 → Cowork/Code 실행 시 자동 열기 + +--- + +## Phase 15 — 멀티패스 문서 엔진 + 스킬/도구 대확장 (v1.6.0) ✓ 완료 + +| # | 기능 | 구현 내용 | +|---|------|----------| +| 15-A | **멀티패스 문서 생성** | document_plan (개요 구조화) + document_assemble (섹션 조립). 3페이지+ 문서를 개요→섹션별 상세→조립 방식으로 품질 향상 | +| 15-B | **PPT 네이티브 생성** | pptx_create — OpenXML 기반, Python 무의존, 5종 레이아웃, 4종 테마 | +| 15-C | **데이터 피벗/집계** | data_pivot — CSV/JSON 그룹화·필터·정렬·집계 (LINQ 기반) | +| 15-D | **템플릿 렌더링** | template_render — Mustache 스타일 변수 치환·반복·조건부 | +| 15-E | **이미지 분석** | image_analyze — LLM 멀티모달 describe/OCR/데이터 추출/비교 | +| 15-F | **파일 변경 감지** | file_watch — 폴더 감시, 상대 시간(1h/7d), 유형별 통계 | +| 15-G | **텍스트 요약** | text_summarize — 청크 분할→핵심 추출 요약 (4종 스타일) | +| 15-H | **내장 스킬 16종 추가** | 비즈니스: email-draft, translate, compare, weekly-report. 데이터: log-analyze, sql-report, data-convert. 개발: refactor, gen-test, impact. 외부 검증: security-audit, prd-generator, adr-writer, changelog, dependency-audit, perf-audit — 총 29종 | +| 15-I | **설정** | EnableMultiPassDocument, MultiPassThresholdPages | + +도구: 34개 → **42개** (+8), 스킬: 13개 → **29개** (+16) + +--- + +## Phase 16 — 에이전트 지능 강화 + 개발자 경험 (v1.7.0) ✅ 완료 + +> **계획 기준**: Claude Code(Plan mode, Hooks, 병렬 도구), Cursor(프로젝트 규칙, 멀티파일 diff), GitHub Copilot(반복 테스트-수정), Windsurf(자동 컨텍스트, 영속 메모리) 분석 + Reflexion/CodeAct 연구 동향 반영. + +| # | 기능 | 구현 내용 | +|---|------|----------| +| 16-1 | **플랜 모드 (Plan Mode)** | 에이전트가 도구 실행 전 구조화된 계획 생성 → 사용자 검토/승인 → 승인 후 실행. `PlanMode`: off/always/auto 3모드. always=텍스트 전용 계획 생성(최대 3회 수정), auto=계획 감지 시 승인 요청 | +| 16-2 | **도구/커넥터 관리 UI** | 설정 > AX Agent > 도구 탭. 52개 도구를 6개 카테고리(파일/검색, 문서 생성, 문서 품질, 코드/개발, 데이터/유틸, 시스템)별 카드로 표시. 개별 활성/비활성 토글 + MCP 서버 연결 상태 실시간 표시 | +| 16-3 | **프로젝트 규칙 시스템** | `.ax/rules/*.md` YAML 프론트매터(name, description, applies-to, when) 파싱. 파일 패턴 glob 매칭, when 조건 필터링, 시스템 프롬프트 자동 주입 | +| 16-4 | **반복 테스트-수정 루프** | TestLoopTool `auto_fix` 액션 — 테스트 실행→구조화된 실패 파싱(.NET/pytest)→반복 예산 자동 확장 (MaxTestFixIterations 설정) | +| 16-5 | **병렬 도구 실행** | 읽기 전용 도구(file_read, grep_tool, glob 등 12종) 자동 분류 → `Task.WhenAll()` 병렬 실행, 쓰기 도구는 순차 실행. `EnableParallelTools` 토글 | +| 16-6 | **SKILL.md 표준 완전 호환** | 외부↔내부 도구 이름 매핑 테이블 20개 (Bash→process, Read→file_read, Grep→grep_tool 등). ParseSkillFile에서 스킬 본문 자동 치환 | + +설정 추가: `PlanMode`, `EnableProjectRules`, `MaxTestFixIterations`, `EnableParallelTools`, `DisabledTools` + +--- + +## Phase 16.8 — 안정화 릴리즈 (v1.7.2) ✅ 완료 + +- **컨텍스트 자동 압축** — 2단계 압축(도구 결과 축약 + LLM 요약), 모델별 토큰 한도 자동 인식 +- **대화 이력 복원** — 앱 재시작 시 탭별 마지막 대화 자동 복원 +- **런처 속도 개선** — 핫키 응답 ~230ms 단축, 애니메이션 최적화 +- **스크롤 캡처 개선** — 증분 스티칭으로 중복 프레임 제거, 오버랩 감지 정확도 향상 +- **검증 리팩터링** — 도구 검증을 읽기 전용으로 제한하여 품질 저하 방지 +- **AI 모델 호환성 가이드** — Function Calling 지원 모델 호환표 추가 +- **버그 수정 6건** — 설정 비밀번호 재요구, 계획 버튼 동기화, 야간 근무 시간, 클립보드 붙여넣기, 활성 창 캡처 + +--- + +## Phase 16.5 — 검증 강제 + 오픈소스 갭 보완 (v1.7.1) ✅ 완료 + +> **계획 기준**: OpenHands(ICLR 2025), Claude Code, Cursor 에이전트 루프 비교 분석 기반. +> 업계 모든 에이전트 루프가 "1반복=1 LLM 호출, 검증 없음" 동일 구조임을 확인하여, AX Copilot만의 차별화 포인트로 "검증 강제"를 아키텍처 수준에서 구현. + +| # | 기능 | 구현 내용 | +|---|------|----------| +| 16.5-1 | **도구 실행 후 검증 강제** | 문서 생성 도구 실행 후 LLM 검증 전용 호출 자동 삽입. `RunPostToolVerificationAsync()`, `IsDocumentCreationTool()`. 대상 7종 도구 | +| 16.5-2 | **피드백 학습 컨텍스트** | `BuildFeedbackContext()` — 최근 20건 대화의 좋아요/싫어요 패턴 분석 → 시스템 프롬프트 주입 | +| 16.5-3 | **Gemini 배열 스키마 수정** | MultiReadTool.paths, UserAskTool.options에 Items 필드 추가 | +| 16.5-4 | **워크플로우/플랜 뷰어 UI 개선** | 타이틀바 드래그, 탭 가시성, 버튼 색상 개선 | +| 16.5-5 | **수정 후 재시도** | 두 번째 액션바 재시도 버튼, 슬래시 칩 워터마크 충돌 수정 | + +설정 추가: `EnablePostToolVerification` + +--- + +### OpenHands 대비 갭 분석 (2026-03-31) + +| # | 영역 | OpenHands | AX Copilot 현재 | 갭 | 보완 Phase | +|---|------|-----------|----------------|-----|-----------| +| G1 | Multi-Agent 위임 | ✅ AgentDelegateAction | ❌ 위임 패턴 없음 | 🔴 | Phase 18 | +| G2 | Event-Sourced State | ✅ 불변 이벤트 스트림 | △ Observable (재실행 불가) | 🟡 | Phase 17 | +| G3 | SecurityAnalyzer | ✅ 위험도 자동 분류 | △ Ask 모드 수동 | 🟢 | Phase 17 | +| G5 | 검증 깊이 확대 | ❌ | △ 문서만 검증 | 🟡 | Phase 17 | +| G6 | Reflexion 성공 시 | ❌ | △ 실패 시에만 | 🟡 | Phase 17 | +| G7 | 구조화 태스크 상태 | ✅ State 직렬화 | ❌ | 🟡 | Phase 17 | +| G8 | 에이전트 리플레이 | ✅ 이벤트 리플레이 | ❌ | 🟡 | Phase 18 | + +--- + +## Phase 17 — 에이전트 인프라 고도화 (v1.8.0) — 차기 개발 [2026-04-03 CC 문서 기반 전면 개정] + +> **개발 기준**: Claude Code 내부 아키텍처(훅·스킬·메모리·권한) + OpenHands 갭(G2/G5/G6/G7) 통합 보완 +> 세부 계획은 `docs/NEXT_ROADMAP.md` Phase 17 참조 + +### Group A — 에이전트 자기성찰 + +| # | 기능 | 설명 | 우선순위 | 갭 | +|---|------|------|----------|----| +| 17-A1 | **Reflexion 강화** | 성공·실패 모두 자기평가. 반성 메모리 저장 → 동일 유형 참고 | 최고 | G6 | +| 17-A2 | **검증 대상 확대** | 코드 생성 후 검증 강제. 구문·참조 무결성. 체크리스트 편집 | 최고 | G5 | + +### Group B — 상태/이력 관리 + +| # | 기능 | 설명 | 우선순위 | 갭 | +|---|------|------|----------|----| +| 17-B1 | **구조화된 태스크 상태** | 대화 압축 후에도 유지되는 TaskState. JSON 직렬화 영속 | 높음 | G7 | +| 17-B2 | **Event-Sourced 이벤트 로그** | SeqNo/ParentId/Payload. .jsonl 저장·재분석 | 높음 | G2 | + +### Group C — 훅 시스템 고도화 (CC 17종 이벤트·4타입 기반) + +| # | 기능 | 설명 | 우선순위 | +|---|------|------|----------| +| 17-C1 | **훅 이벤트 확장** | UserPromptSubmit, PreCompact/PostCompact, FileChanged, CwdChanged, SessionEnd, ConfigChange 추가 | 최고 | +| 17-C2 | **훅 타입 확장** | type:prompt (LLM 보안검사), type:agent (에이전트 루프 검증) 추가 | 최고 | +| 17-C3 | **훅 속성·출력 고도화** | if/once/async/statusMessage 속성. additionalContext·permissionDecision·updatedInput 출력 | 높음 | +| 17-C4 | **SessionStart 확장** | watchPaths (파일 감시 등록), initialUserMessage, additionalContext | 중간 | + +### Group D — 스킬 시스템 고도화 (CC 스킬 문서 기반) + +| # | 기능 | 설명 | 우선순위 | +|---|------|------|----------| +| 17-D1 | **스킬 fork 컨텍스트** | context:fork — 격리된 서브에이전트 컨텍스트에서 스킬 실행 | 높음 | +| 17-D2 | **경로 기반 스킬 활성화** | paths: 프론트매터 — 해당 파일 작업 시 스킬 자동 컨텍스트 주입 | 높음 | +| 17-D3 | **스킬 범위 훅·모델 오버라이드** | hooks: (스킬 범위 훅), model: (스킬별 모델), user-invocable:false (AI 전용) | 중간 | + +### Group E — 메모리/컨텍스트 고도화 (CC 메모리 문서 기반) + +| # | 기능 | 설명 | 우선순위 | +|---|------|------|----------| +| 17-E1 | **@include 지시어** | AX.md / .ax/rules에서 @파일경로로 외부 파일 포함. 최대 5단계 | 높음 | +| 17-E2 | **경로 기반 규칙 주입** | .ax/rules/*.md의 paths: — 해당 파일 작업 시만 규칙 주입 | 높음 | +| 17-E3 | **컨텍스트 컴팩션 + 파일 되감기** | /compact 명령, PreCompact/PostCompact 훅, 파일 변경 되감기 | 중간 | + +### Group F — 권한 시스템 고도화 (CC 권한 문서 기반) + +| # | 기능 | 설명 | 우선순위 | +|---|------|------|----------| +| 17-F1 | **acceptEdits 권한 모드** | 파일 편집 자동승인 + bash/process 명령 확인 유지 | 높음 | +| 17-F2 | **패턴 기반 허용/차단 규칙 UI** | process(git *) 허용, process(rm -rf *) 차단 등 패턴 규칙 편집기 | 높음 | +| 17-F3 | **MCP HTTP+SSE + MCP 도구 권한** | HTTP·SSE 트랜스포트 추가. mcp__서버__도구 단위 권한 규칙 | 중간 | + +### Group G — 개발자 경험 + +| # | 기능 | 설명 | 우선순위 | +|---|------|------|----------| +| 17-G1 | **멀티파일 통합 Diff 뷰** | 다수 파일 수정 시 파일별/헌크별 승인·거부 패널 | 높음 | +| 17-G2 | **자동 컨텍스트 + 도구 위험도** | 파일명 감지 자동 읽기, 도구 위험도 LOW/MED/HIGH 분류 | 중간 | + +--- + +## Phase 18 — 멀티에이전트 팀 + 에코시스템 (v2.0) [CC 문서 기반 전면 개정] + +> **개발 기준**: CC coordinator 모드·worktree 격리·백그라운드 에이전트·타입별 메모리 + OpenHands G1/G8 +> 세부 계획은 `docs/NEXT_ROADMAP.md` Phase 18 참조 + +### Group A — 멀티에이전트 아키텍처 (CC 기반 신규) + +| # | 기능 | 설명 | 우선순위 | 갭 | +|---|------|------|----------|----| +| 18-A1 | **코디네이터 에이전트 모드** | 계획·라우팅 전담, 구현은 서브에이전트 위임 | 최고 | G1 | +| 18-A2 | **Worktree 격리 서브에이전트** | 서브에이전트별 독립 git working copy. 승인 후 병합 | 최고 | — | +| 18-A3 | **에이전트 팀 위임 (delegate 도구)** | 특화 에이전트(코드·문서·보안·리서치) 독립 루프 실행 | 최고 | G1 | +| 18-A4 | **백그라운드 에이전트 + 타입별 메모리** | 비동기 실행 + 트레이 알림. agent-memory/타입/MEMORY.md | 높음 | — | + +### Group B — 디버깅 + 생태계 + +| # | 기능 | 설명 | 우선순위 | 갭 | +|---|------|------|----------|----| +| 18-B1 | **에이전트 리플레이/디버깅** | Event-Sourced 로그. 과거 세션 재생·분기 재실행 | 높음 | G8 | +| 18-C1 | **플러그인 갤러리 + 레지스트리** | 로컬 NAS/Git 기반 인앱 갤러리. zip 설치 | 높음 | — | +| 18-C2 | **AI 스니펫** | ;email {수신자} {주제} 등 LLM 초안 자동 생성 | 중간 | — | +| 18-C3 | **파라미터 퀵링크** | jira {번호} → URL 변수 치환 | 중간 | — | +| 18-C4 | **오프라인 AI (ONNX Runtime)** | 로컬 소형 모델, 별도 배포 | 낮음 | — | +| 18-C5 | **웹 검색 AI 요약** | ? 검색 결과 AI 요약 표시 | 낮음 | — | diff --git a/docs/AUTO_ROUTER_DEV_GUIDE.md b/docs/AUTO_ROUTER_DEV_GUIDE.md new file mode 100644 index 0000000..8b9ab6f --- /dev/null +++ b/docs/AUTO_ROUTER_DEV_GUIDE.md @@ -0,0 +1,132 @@ +# 자동 모델 라우팅 (Auto Model Router) 개발자 가이드 + +## 개요 + +자동 모델 라우팅은 사용자 메시지의 유형(코딩/번역/분석 등)을 키워드 기반으로 감지하여, +해당 유형에 최적화된 AI 모델로 자동 전환하는 기능입니다. + +**현재 상태**: 잠금 (설정 UI에 표시되나 활성화 불가) +**활성화 조건**: 사내 Ollama/vLLM 서버 확정 후 개발자가 아래 절차에 따라 활성화 + +--- + +## 활성화 절차 + +### 1단계: 사내 모델 능력 점수 등록 + +**파일**: `src/AxCopilot/Services/ModelRouterService.cs` +**메서드**: `GetDefaultCapabilities()` + +주석 처리된 Ollama/vLLM 예시를 해제하고 실제 모델 정보로 수정: + +```csharp +// ── 사내 Ollama/vLLM (예시 — 서버 확정 후 수정) ── +new() +{ + Service = "ollama", // "ollama" 또는 "vllm" + Model = "codellama:34b", // 실제 모델 ID + Alias = "CodeLlama 34B", // UI 표시명 + Scores = new() + { + ["coding"] = 0.85, // 코딩 적합도 (0.0~1.0) + ["translation"] = 0.40, // 번역 적합도 + ["analysis"] = 0.55, // 분석 적합도 + ["creative"] = 0.35, // 창작 적합도 + ["document"] = 0.40, // 문서 작성 적합도 + ["math"] = 0.50, // 수학/계산 적합도 + } +}, +``` + +**점수 가이드라인**: +| 점수 | 의미 | +|------|------| +| 0.90+ | 해당 분야 최고 수준 | +| 0.70~0.89 | 우수 | +| 0.50~0.69 | 보통 | +| 0.30~0.49 | 기본 가능하나 비추천 | +| 0.30 미만 | 부적합 | + +**인텐트 카테고리 키**: +- `coding` — 코드 작성/디버그/리팩토링 +- `translation` — 번역/다국어 +- `analysis` — 데이터 분석/요약/비교 +- `creative` — 창작 글쓰기/스토리/에세이 +- `document` — 보고서/문서/제안서 작성 +- `math` — 수학/계산/증명 + +### 2단계: 설정 UI 잠금 해제 + +**파일**: `src/AxCopilot/Views/SettingsWindow.xaml` + +"자동 모델 라우팅" 섹션에서 다음을 변경: + +1. 두 `Border`의 `Opacity="0.5"` 제거 (또는 `Opacity="1.0"`으로 변경) +2. `CheckBox`의 `IsEnabled="False" IsHitTestVisible="False"` 제거 +3. `Slider`의 `IsEnabled="False"` 제거 +4. 힌트 텍스트를 "비활성 시 항상 현재 선택된 모델을 사용합니다."로 변경 + +### 3단계: 기본값 활성화 (선택) + +사용자가 직접 활성화하도록 할 수도 있지만, 기본 활성화하려면: + +**파일**: `src/AxCopilot/Models/AppSettings.cs` + +```csharp +// 변경 전 +public bool EnableAutoRouter { get; set; } = false; + +// 변경 후 +public bool EnableAutoRouter { get; set; } = true; +``` + +--- + +## 아키텍처 요약 + +``` +사용자 메시지 + ↓ +IntentDetector.Detect(message) ← 키워드 매칭으로 인텐트 감지 + ↓ (category, confidence) +ModelRouterService.Route(message) ← 후보 모델 점수 비교 → 최적 모델 선택 + ↓ ModelRouteResult +ChatWindow.SendMessageAsync() ← PushRouteOverride → LLM 호출 → ClearRouteOverride + ↓ +LlmService.ResolveService/ResolveModel ← 오버라이드 있으면 해당 서비스/모델 사용 +``` + +### 핵심 파일 + +| 파일 | 역할 | +|------|------| +| `Services/IntentDetector.cs` | 키워드 기반 인텐트 분류기 | +| `Services/ModelRouterService.cs` | 모델 라우팅 로직 + 하드코딩 기본값 | +| `Services/LlmService.cs` | PushRouteOverride/ClearRouteOverride | +| `Services/LlmService.ToolUse.cs` | 에이전트 도구 호출 시 오버라이드 반영 | +| `Models/AppSettings.cs` | EnableAutoRouter, AutoRouterConfidence, ModelCapability | +| `Views/ChatWindow.xaml.cs` | 라우터 호출 및 상태 표시 | +| `Views/SettingsWindow.xaml` | 설정 UI (현재 잠금) | + +### 키워드 추가/수정 + +**파일**: `Services/IntentDetector.cs` + +`_keywords` 딕셔너리에서 카테고리별 키워드와 가중치를 수정할 수 있습니다. +한국어 키워드는 `string.Contains`로 매칭 (조사 붙어도 감지), +영어 키워드는 단어 경계 매칭 (공백 분리). + +--- + +## 테스트 방법 + +1. `GetDefaultCapabilities()`에 사내 모델 추가 +2. 설정 UI 잠금 해제 +3. `dotnet build` — 경고/오류 0 확인 +4. 앱 실행 → 설정 → 자동 라우팅 활성화 +5. 테스트 시나리오: + - "이 함수를 리팩토링해줘" → coding 감지 → 코드 특화 모델 + - "이 문장을 영어로 번역해줘" → translation 감지 + - "이 데이터를 분석해줘" → analysis 감지 + - "안녕하세요" → general → 기본 모델 유지 (라우팅 안함) +6. 상태바에 "라우팅: coding → [모델명]" 표시 확인 diff --git a/docs/AX_Commander_개발문서.html b/docs/AX_Commander_개발문서.html new file mode 100644 index 0000000..5cb10ee --- /dev/null +++ b/docs/AX_Commander_개발문서.html @@ -0,0 +1,253 @@ + + +AX_Commander_개발문서 + +

<b>AX Commander</b>

+

개발 문서

+

Windows 전용 시맨틱 런처 & 워크스페이스 매니저

+ +

사내 전용 프로그램 개발 원칙

+

AX Commander는 사내 전용 프로그램입니다. 아래 원칙을 반드시 준수하여 개발하세요.

+

외부 연결 금지

+ + + + + + + +
금지 항목설명
외부 HTTP/HTTPS 호출HttpClient, WebClient, HttpWebRequest 등으로 외부 서버에 요청 금지
외부 SDK 연동서드파티 클라우드 SDK, AI API, SaaS 라이브러리 사용 금지
원격 플러그인 다운로드런타임에 외부에서 DLL/코드 다운로드 금지
텔레메트리 / 오류 수집사용 데이터를 외부 서버로 전송하는 일체의 코드 금지
NuGet 패키지외부 네트워크 통신이 내장된 패키지 신규 도입 금지
+

허용: 로컬 파일 시스템 접근, Windows API (P/Invoke), 사내 인트라넷 URL, 로컬 프로세스 실행

+ +

아키텍처 개요

+

핵심 컴포넌트

+ + + + + + + + + + + +
컴포넌트역할
App.xaml.cs앱 진입점, 서비스 초기화, 트레이 아이콘 관리
LauncherWindowWPF 메인 UI (AllowsTransparency, WindowStyle=None)
CommandResolver프리픽스 기반 핸들러 라우팅 테이블
FuzzyEngine퍼지 검색 + 한국어 초성(ㅅㄷ) 매칭
IndexService파일 시스템 인덱서 + FileSystemWatcher
SettingsServicesettings.json 로드/저장 (자동 백업)
ClipboardHistoryServiceWM_CLIPBOARDUPDATE 훅 기반 히스토리
PluginHostDLL/JSON 스킬 플러그인 로더
NotificationService트레이 풍선 알림 (타이머/알람)
+ +

프리픽스 핸들러 치트시트

+ + + + + + + + + + + + + + + + + + + + + + + + +
프리픽스핸들러기능
(없음)FuzzyEngine앱·파일 퍼지 검색 + 한국어 초성
=CalculatorHandler수식 계산, 단위/통화 변환
/SystemCommandHandlerlock, sleep, restart, shutdown, timer, alarm
;SnippetHandler텍스트 스니펫 키워드 검색 & 붙여넣기
#ClipboardHistoryHandler클립보드 히스토리 검색 & 병합
@UrlAliasHandlerURL 단축키
~FolderAliasHandler폴더 단축키
>BatchHandler명령 실행 / 배치 단축키
$ClipboardHandler클립보드 텍스트 12종 변환
!WorkspaceHandler워크스페이스 저장·복원
emojiEmojiHandler이모지 피커 (300+)
colorColorHandlerHEX/RGB/HSL/HSV 색상 변환
recentRecentFilesHandlerWindows 최근 파일
noteNoteHandler빠른 메모 저장·조회
uninstallUninstallHandler앱 제거 (레지스트리)
portPortHandlerTCP 포트/프로세스 점검
envEnvHandler환경변수 조회
jsonJsonHandlerJSON 검증/포맷/미니파이
encodeEncodeHandlerbase64/url/hex/md5/sha256 인코딩
snapSnapHandler창 배치 레이아웃
capScreenCaptureHandler화면/창/스크롤 캡처
helpHelpHandler도움말
+ +

설정 스키마 (settings.json)

+

경로: %APPDATA%\AxCommander\settings.json

+ + + + + + + + + + + + + + + + +
타입설명
versionstring설정 버전
hotkeystring글로벌 단축키 (기본: Alt+Space)
launcher.opacityfloat창 투명도 (0.0~1.0, 기본 0.96)
launcher.maxResultsint최대 결과 수 (기본 7)
launcher.themestring테마 (system|dark|light|oled|nord|monokai|catppuccin|sepia|alfred|alfredlight|custom)
launcher.positionstring런처 위치 (center-top|center|bottom)
launcher.webSearchEnginestring기본 검색 엔진 (g|n|d|y|w)
launcher.snippetAutoExpandbool스니펫 자동 확장 활성화
indexPathsstring[]인덱싱할 폴더 경로 목록
aliasesobject[]URL/폴더/배치 단축키 목록
snippetsobject[]텍스트 스니펫 목록
clipboardHistory.enabledbool클립보드 히스토리 활성화
clipboardHistory.maxItemsint최대 보관 개수 (기본 50)
pluginsobject[]DLL 플러그인 경로 목록
+ +

테마 시스템

+

내장 테마 목록

+ + + + + + + + + + + + + +
테마 키이름특징
system시스템Windows 다크/라이트 모드 자동 감지
darkDark딥 네이비 다크 (기본)
lightLight클린 화이트 라이트
oledOLED순수 블랙 (OLED 절전)
nordNordArctic 컬러 팔레트
monokaiMonokaiSublime Text 스타일
catppuccinCatppuccinMocha 따뜻한 파스텔
sepiaSepia황갈색 아날로그 감성
alfredAlfred DarkAlfred 5 다크 팔레트 (딥 퍼플-차콜)
alfredlightAlfred LightAlfred 5 라이트 팔레트 (클린 화이트)
custom커스텀14개 색상 완전 커스터마이징
+

테마 ResourceKey 목록 (14개)

+ + + + + + + + + + + + + + + + +
용도
LauncherBackground전체 배경
ItemBackground항목 기본 배경
ItemSelectedBackground선택된 항목 배경
ItemHoverBackground호버 배경
PrimaryText주 텍스트 색상
SecondaryText보조 텍스트 색상
PlaceholderText플레이스홀더 텍스트
AccentColor강조색 (선택 바, 배지 등)
SeparatorColor구분선 색상
HintBackgroundESC 힌트 배경
HintTextESC 힌트 텍스트
BorderColor창 테두리
ScrollbarThumb스크롤바 색상
ShadowColor드롭 섀도우 색상
+

새 테마 추가 절차

+
    +
  • 1. Themes/MyTheme.xaml 작성 (위 14개 키 모두 정의)
  • +
  • 2. AxCommander.csproj에 <Resource Include="Themes/MyTheme.xaml"/> 추가
  • +
  • 3. LauncherWindow.xaml.cs → GetEffectiveThemeName() switch에 케이스 추가
  • +
  • 4. SettingsViewModel.ThemeCards 목록에 ThemeCardModel 항목 추가
  • +
+ +

보안 고려사항

+ + + + + + + + + +
항목구현
URL 스킴 검증http, https, ftp, ms-settings, mailto, file 허용. javascript: 등 차단
PowerShell 인젝션 방지> 명령어 입력의 " 이스케이프 처리
ReDoS 방지사용자 정의 Regex에 TimeSpan 타임아웃 적용
자격증명 저장Windows Credential Manager (advapi32.dll, DPAPI 암호화)
클립보드 민감 데이터Regex 기반 제외 패턴 — 신용카드·IP 등 기본 차단
API 타임아웃JSON 스킬 HTTP 요청 3초 제한
시스템 명령 확인재시작·종료·로그아웃 실행 전 MessageBox.Show 2단계 확인
+ +

단위 테스트

+ + + + + +
파일테스트 수대상
FuzzyEngineTests.cs19CalculateScore, FuzzyMatch, 초성 검색
ClipboardTransformTests.cs2112개 내장 변환기
SettingsServiceTests.cs17기본값, JSON 직렬화 라운드트립
+ +

v1.6 3차 전체 점검 수정

+

빌드 오류 3건, 컴파일 경고 1건, 런타임 버그 6건, 보안 이슈 2건을 수정하였습니다.

+

컴파일 오류 수정

+ + + + + +
파일수정 내용오류 코드
UsageRankingService.csusing System.IO; 누락 추가CS0103
SettingsWindow.xaml.csKey.Enter or Key.Return 단일 arm으로 통합CS8510
ContextManager.csEnumDisplayMonitors 람다 타입 혼합 수정CS0748
+

런타임 버그 수정

+ + + + + + + +
파일버그수정
JsonSkillLoader.csfield[0 형식 오류 방지 (IndexOf 반환 -1)closingIdx < 0 가드 추가
ClipboardHistoryService.cs_ignoreNext 스레드 비안전, 이중 초기화volatile + 이중 초기화 가드
IndexService.csScheduleRebuild 타이머 비원자적 교체_timerLock으로 원자적 교체
SettingsService.cs백업 실패 무음 catchLogService.Warn으로 기록
LauncherWindow.xaml.csWindow에 RenderTransform 설정 시 InvalidOperationExceptionContent(루트 Border)에 적용
+

보안 수정

+ + + + +
파일수정 내용
JsonSkillLoader.csActionUrl 실행 전 http/https 스킴 검증 추가
SettingsWindow.xaml.csNewIndexPathBox null 역참조 방어 처리
+ +

빌드 및 배포

+

빌드 명령

+

# 개발 실행

+

dotnet run --project src/AxCommander

+ +

# Release 단일 파일 빌드 (self-contained)

+

dotnet publish src/AxCommander -c Release -r win-x64 --self-contained

+ +

# 단위 테스트

+

dotnet test src/AxCommander.Tests

+

데이터 경로

+ + + + + + + + +
용도경로
설정 파일%APPDATA%\AxCommander\settings.json
로그%APPDATA%\AxCommander\logs\app-YYYY-MM-DD.log
스킬 파일%APPDATA%\AxCommander\skills\*.skill.json
메모%APPDATA%\AxCommander\notes.txt
사용 빈도%APPDATA%\AxCommander\usage.json
크래시 덤프%APPDATA%\AxCommander\crashes\
+

요구 사항

+
    +
  • OS: Windows 10 20H2 이상 (Windows 11 권장)
  • +
  • .NET 8.0 Runtime (Self-contained 빌드 시 불필요)
  • +
+ +

플러그인 개발

+

DLL 플러그인

+

AxCommander.SDK를 참조하여 IActionHandler 인터페이스를 구현합니다.

+

using AxCommander.SDK;

+ +

public class MyHandler : IActionHandler

+

{

+

public string? Prefix => "?"; // 트리거 프리픽스

+

public PluginMetadata Metadata => new("MyPlugin", "설명", "1.0");

+ +

public async Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct)

+

{

+

return [ new LauncherItem("제목", "부제목", null, myData, Symbol: "\uE721") ];

+

}

+ +

public Task ExecuteAsync(LauncherItem item, CancellationToken ct)

+

{

+

return Task.CompletedTask;

+

}

+

}

+

JSON 스킬 (코드 없이 HTTP API 연동)

+

경로: %APPDATA%\AxCommander\skills\*.skill.json

+

{

+

"id": "my-api",

+

"name": "API 연동",

+

"prefix": "?",

+

"request": {

+

"method": "GET",

+

"url": "https://intranet.example.com/api?q={{INPUT}}"

+

},

+

"response": {

+

"resultsPath": "items",

+

"titleField": "name",

+

"subtitleField": "description",

+

"actionUrl": "url"

+

},

+

"cache": 30

+

}

+ +

AX Commander · .NET 8.0 · WPF · MIT License

+ + diff --git a/docs/AX_Copilot_블로그_워드프레스.html b/docs/AX_Copilot_블로그_워드프레스.html new file mode 100644 index 0000000..f9c31e4 --- /dev/null +++ b/docs/AX_Copilot_블로그_워드프레스.html @@ -0,0 +1,281 @@ + + +
+ + +
+

AX Copilot

+

키보드 하나로 모든 업무를 제어하는 사내 전용 AI 런처

+

백승재 · AX연구소 AI팀 · SW Architect

+
+ + +

1. 왜 만들었는가

+ +

업무 중 가장 많이 반복하는 동작이 뭐냐고 물으면, 대부분의 사무직 직원이 이렇게 대답합니다:

+ +
    +
  • 앱을 찾아서 실행하기
  • +
  • 파일을 찾아서 열기
  • +
  • 클립보드에서 복사한 내용 다시 찾기
  • +
  • 계산기 열고 간단한 계산하기
  • +
  • AI에게 질문하려면 브라우저 열고 별도 서비스 접속하기
  • +
+ +

이 모든 동작에 마우스를 들고, 탐색기를 열고, 클릭하고… 키보드에서 손을 뗄 수가 없습니다.

+ +

AX Copilot은 이 문제를 해결합니다. Alt+Space 한 번으로 모든 것을 키보드로 제어할 수 있는 런처이자, AI 대화(AX Agent)까지 통합된 사내 전용 업무 도우미입니다.

+ +

이 프로젝트는 LLM(Claude)과 함께 기획부터 구현까지 진행한 사례로, AI와 협업하는 소프트웨어 개발의 실제 경험을 담고 있습니다.

+ + +

2. AX Copilot이란?

+ +

Alt+Space를 누르면 화면 상단에 깔끔한 런처 창(AX Commander)이 나타납니다. 여기에 원하는 명령을 입력하면 됩니다.

+ +
    +
  • 앱 이름을 치면 앱이 실행됩니다 (한국어 초성 검색도 가능!)
  • +
  • = 를 치면 계산기가 됩니다
  • +
  • # 을 치면 클립보드 히스토리가 나타납니다
  • +
  • cap region 을 치면 영역 캡처가 시작됩니다
  • +
  • win chrome 을 치면 크롬 창으로 즉시 전환됩니다
  • +
  • ! 을 치면 AI 대화(AX Agent)가 열립니다
  • +
+ +

프리픽스(접두어) 기반으로 45개 이상의 명령어를 지원하며, 한국어 초성 검색(ㅅㄷ → 설정)과 퍼지 매칭이 됩니다.

+ + +

3. 핵심 기능 소개

+ +

AX Copilot은 단순한 앱 런처가 아닙니다. 아래는 카테고리별 주요 기능입니다.

+ + +

AI 대화 — AX Agent NEW v1.0.5

+ +
    +
  • ! 예약어로 AI 대화 창 진입
  • +
  • 4종 LLM 지원: Ollama, vLLM(OpenAI 호환), Gemini, Claude API
  • +
  • 스트리밍 + 타이핑 효과: SSE 기반 실시간 응답, 12ms 타이머로 타이핑 애니메이션
  • +
  • 마크다운 + 코드 구문 강조: 10개 언어 키워드 하이라이팅, 코드 블록 복사 버튼
  • +
  • 토큰 사용량: k/m 단위 실시간 표시 + 응답 소요시간
  • +
  • 프롬프트 카드: 미리 설정된 시스템 프롬프트 + 사용자 정의 템플릿
  • +
  • 대화 관리: 고정/이름변경/분류(6종)/삭제, 날짜별 그룹, 30일 자동 정리
  • +
  • 메시지 편집: 사용자 메시지 편집/복사, 좋아요/싫어요 피드백
  • +
+ + +

검색

+ +
    +
  • 퍼지 검색: 앱/파일명을 일부만 입력해도 찾아줌
  • +
  • 한국어 초성: ㅇㅎㄴ → 아한글 검색
  • +
  • 실행 빈도 학습: 자주 쓰는 앱이 상단으로
  • +
  • 기본 앱 별칭: 메모장, 계산기, 엑셀 등 한글+영문 즉시 실행
  • +
  • 폴더 검색: 인덱스 경로의 하위 폴더도 검색 가능
  • +
+ + +

계산 · 변환

+ +
    +
  • = sqrt(144), = 0xFF + 1, = 100km in miles
  • +
  • = 100 USD to KRW (실시간 환율)
  • +
  • date +30d (30일 후 날짜), date unix (타임스탬프)
  • +
+ + +

클립보드

+ +
    +
  • # 히스토리: 복사 이력 검색 · 재사용 · 병합 (Shift+↑↓ 선택 → Shift+Enter 병합)
  • +
  • $ 변환: JSON 정렬, Base64, URL 인코딩 등 12종
  • +
  • pipe 파이프라인: pipe upper > trim > b64e (19종 필터 체이닝)
  • +
  • batch 일괄 처리: 줄번호, 정렬, 중복제거, 감싸기 등 14종
  • +
  • DPAPI 암호화: 클립보드 히스토리 파일이 현재 Windows 계정에서만 복호화 가능
  • +
+ + +

개발자 도구

+ +
    +
  • json format / minify / validate
  • +
  • encode base64 / url / sha256
  • +
  • color #FF5500 → HEX/RGB/HSL/HSV 4종 변환
  • +
  • port 3000 → 점유 프로세스 확인
  • +
  • env PATH → 환경변수 검색
  • +
  • pick → 스포이드로 화면 색상 HEX 코드 추출 (돋보기 + 실시간 미리보기)
  • +
  • diff → 클립보드 최근 2개 또는 파일 2개 비교
  • +
  • stats → 텍스트 통계 (글자수/단어수/읽기시간/키워드 빈도)
  • +
+ + +

화면 캡처

+ +
    +
  • cap region / window / scroll / screen (사용 빈도순 정렬)
  • +
  • 지연 캡처: Shift+Enter → 3초/5초/10초 타이머 후 캡처 NEW
  • +
  • 스크롤 캡처: 활성 창을 끝까지 스크롤하며 페이지 전체 캡처
  • +
  • 글로벌 단축키(PrintScreen 등) 지원
  • +
  • 보안: 클립보드에만 복사 (파일 저장은 설정에서 선택)
  • +
+ + +

창 관리 · 시스템

+ +
    +
  • ~save / ~restore: 창 배치 스냅샷
  • +
  • snap left/right/full: 창 분할 레이아웃
  • +
  • win: 열린 창 검색 → 즉시 전환 (Alt+Tab 대체)
  • +
  • /lock, /timer 5m, /alarm 14:30
  • +
  • svc: Windows 서비스 관리 + 클립보드 강제 재시작
  • +
  • monitor: CPU·메모리·디스크·가동시간 실시간 모니터링
  • +
+ + +

업무 자동화

+ +
    +
  • journal: 오늘 사용한 앱/명령어 기반 업무 일지 마크다운 자동 생성
  • +
  • routine: 출근/퇴근 루틴 등록 → 한 번에 실행
  • +
  • scaffold: 프로젝트 폴더 구조 템플릿 일괄 생성
  • +
  • rename: 파일 일괄 이름 변경 (순번/날짜 템플릿)
  • +
  • fav: 자주 쓰는 파일·폴더 즐겨찾기
  • +
+ + +

키보드 단축키 16종

+ + + + + + + + + + + + + + +
단축키기능
F1도움말
Ctrl+K단축키 도움말
Ctrl+H / R / B히스토리 / 최근 파일 / 즐겨찾기
Ctrl+1~9N번째 항목 즉시 실행
Ctrl+Enter관리자 권한 실행
Shift+EnterLarge Type / 병합 실행 / 지연 캡처
→ (화살표)파일 액션 모드 (경로복사/탐색기/터미널 등 7종)
Delete항목 제거 (확인 다이얼로그)
+ + +

4. 보안 — 사내 전용 원칙

+ +

AX Copilot은 사내 전용 프로그램으로, 외부 네트워크 통신을 원칙적으로 하지 않습니다.

+ +
    +
  • 외부 HTTP/HTTPS 호출 금지 — HttpClient, WebClient 등 사용 불가 (AI 서비스는 사내 Ollama/vLLM 연동)
  • +
  • 클립보드 히스토리 — Windows DPAPI 암호화 (CurrentUser 범위)
  • +
  • API 키 보호 — AES-256-CBC 암호화 모드 지원 (설정으로 전환 가능)
  • +
  • 화면 캡처 — 클립보드에만 복사, 파일 저장은 사용자 설정에서 선택
  • +
  • 시스템 명령 — 재시작/종료 등 위험 명령 실행 전 2단계 확인 다이얼로그
  • +
  • 대화 저장 — 모든 AI 대화 내역은 로컬(%APPDATA%)에만 저장, 외부 전송 없음
  • +
+ + +

5. 테마 시스템

+ +

9개 내장 테마(Dark, Light, OLED, Nord, Monokai, Catppuccin, Sepia, Alfred, Alfred Light) + 커스텀 테마를 지원합니다.

+ +
    +
  • 각 테마는 색상뿐 아니라 모서리 라운딩 비율도 다릅니다 (OLED가 가장 둥글고, Monokai가 가장 각짐)
  • +
  • 커스텀 테마는 14개 색상 + 모서리 라운딩 슬라이더로 자유롭게 편집
  • +
  • 트레이 메뉴, AI 대화 창 모두 현재 테마를 자동으로 따라감
  • +
+ + +

6. 사용 통계 & 알림

+ +
    +
  • 런처 호출 횟수: 최근 14일 막대 차트
  • +
  • PC 활성 시간: 최근 14일 막대 차트
  • +
  • 상위 명령: 30일 합산 Top 10 순위
  • +
  • 잠금 해제 알림: PC 잠금 해제 시 누적 사용시간 + 명언 팝업 (30분~4시간 간격, 5초~3분 표시)
  • +
+ + +

7. 주요 명령어 요약

+ + + + + + + + + + + + + + + + + + + + + + + +
프리픽스기능예시
!AI 대화 (AX Agent)!nginx 설정 방법
=계산기 + 단위/통화 변환= 100 USD to KRW
#클립보드 히스토리# api
$클립보드 변환 (12종)$ base64
cap화면 캡처cap region, cap scroll
win창 전환 (Alt+Tab 대체)win excel
snap창 분할 레이아웃snap left, snap full
jsonJSON 검증/포맷/미니파이json format
pipe클립보드 파이프라인pipe upper > trim
date날짜 계산/D-day/타임스탬프date +30d
?웹 검색 (10개 엔진)?n 맛집 (네이버)
;텍스트 스니펫;addr → 자동 확장
/시스템 명령 + 타이머/알람/timer 5m 회의
emoji이모지 피커 (300+)emoji 웃음
journal업무 일지 자동 생성journal
routine출퇴근 루틴 실행routine morning
+ + +

8. 기술 스택

+ +
    +
  • .NET 8, WPF (UseWPF=true), WinForms (일부 다이얼로그)
  • +
  • P/Invoke: SetWindowPos, PrintWindow, GlobalMemoryStatusEx, EnumWindows, GetPixel 등 Windows API 직접 호출
  • +
  • 단일 EXE 배포: Self-Contained + PublishSingleFile + IncludeNativeLibrariesForSelfExtract
  • +
  • 보안: DPAPI(System.Security.Cryptography.ProtectedData), AES-256-CBC, HKCU 레지스트리
  • +
  • LLM 통신: HttpClient SSE 스트리밍 (Ollama/vLLM/Gemini/Claude API)
  • +
  • 테스트: xUnit 2.9.0 + FluentAssertions (57개 단위 테스트)
  • +
+ + +

9. v1.0.5 주요 변경 사항

+ + + + + + + + + + + + + + + + +
구분내용
AX Agent! 예약어로 AI 대화 창. Claude Desktop 스타일 2패널 구조
LLM 4종Ollama, vLLM, Gemini, Claude API 통합 지원
스트리밍SSE 기반 스트리밍 + 12ms 타이핑 효과 + 커서 깜빡임
코드 강조10개 언어 키워드 하이라이팅 + 코드 블록 복사
토큰 표시k/m 단위 사용량 + 응답 소요시간(초)
프롬프트 카드시스템 프롬프트 프리셋 + 사용자 정의 템플릿
대화 관리고정/이름변경/분류/삭제, 피드백, 메시지 편집
지연 캡처Shift+Enter → 3/5/10초 타이머 후 캡처
커스텀 Popup모든 드롭다운 메뉴를 라운드 커스텀 Popup으로 통일
알림 확장기본 15초, 1분/2분/3분 표시 시간 추가
+ + +

10. 마무리 — LLM과 함께 만든 프로젝트

+ +

AX Copilot은 기획부터 구현, 테스트, 문서화까지 LLM(Claude)과 함께 진행한 프로젝트입니다.

+ +
    +
  • 기획: Alfred, Raycast 등 기존 런처의 장점을 분석하고, 사내 환경에 맞는 기능 선별
  • +
  • 구현: WPF + P/Invoke 기반으로 외부 의존성 없이 45개+ 기능 구현
  • +
  • AI 통합: Ollama/vLLM/Gemini/Claude 4종 LLM 서비스를 사내 환경에 맞게 통합
  • +
  • 검수: 코드 리뷰, 오류 분석, 보안 점검, 성능 최적화를 LLM과 함께 반복
  • +
  • 문서: 개발 문서, 사용자 매뉴얼, 블로그 글까지 LLM이 작성
  • +
+ +

+"개인적으로 느낀 것은, LLM은 '코드 생성기'가 아니라 '함께 생각하는 동료'에 가깝다는 것입니다."

+"이 기능은 이렇게 하면 어떠냐?" "이 부분은 보안 리스크가 있어" "사용자가 이렇게 쓰면 문제될 수 있어" — 이런 피드백을 주고받으며 프로젝트를 완성했습니다. +

+ + +
+

AX Copilot v1.0.5 — 모든 업무를 키보드 하나로.

+

백승재 · AX연구소 AI팀 · SW Architect · www.swarchitect.net

+
+ +
diff --git a/docs/Cowork_업무활용_계획보고서.md b/docs/Cowork_업무활용_계획보고서.md new file mode 100644 index 0000000..4f28e14 --- /dev/null +++ b/docs/Cowork_업무활용_계획보고서.md @@ -0,0 +1,188 @@ +# AX Copilot Cowork 업무 활용 계획 보고서 + +> 작성일: 2026-03-28 | 버전: v1.1.0 기준 + +--- + +## 1. 현재 Cowork 기능 요약 + +### 1.1 에이전트 실행 구조 +- **ReAct 패턴**: Plan → Tool Execute → Observe → Re-evaluate +- 최대 25회 반복, 에러 시 3회 자동 재시도 + 자기성찰 메커니즘 +- 컨텍스트 자동 압축으로 장기 작업 지원 +- 작업 분해(TaskDecomposer)로 단계별 진행 추적 + +### 1.2 등록된 도구 (14개) +| 구분 | 도구 | 기능 | +|------|------|------| +| 파일 I/O | file_read, file_write, file_edit | 파일 읽기/생성/수정 | +| 검색 | glob, grep | 파일 패턴 검색, 내용 검색 | +| 실행 | process | CMD/PowerShell 명령 실행 (위험 명령 차단) | +| 탐색 | folder_map | 디렉토리 트리 생성 | +| 문서 읽기 | document_read | PDF, DOCX, XLSX, CSV, TXT 텍스트 추출 | +| 문서 생성 | excel_create, docx_create, html_create, markdown_create, csv_create | 5종 포맷 출력 | +| 스크립트 | script_create | BAT/PS1 스크립트 생성 | + +### 1.3 프리셋 (5종) +| 프리셋 | 용도 | 주요 출력 | +|--------|------|-----------| +| 보고서 | 정형 보고서 작성 | Excel, Word, HTML | +| 문서작성 | 자유 문서 작성 | Word, Markdown, HTML | +| 데이터분석 | CSV/Excel 데이터 분석 | Excel, HTML 차트 | +| 자동화 | 반복 업무 스크립트화 | BAT, PS1 | +| 파일관리 | 파일 정리/검색/이름변경 | 실행 결과 보고 | + +### 1.4 디자인 템플릿 (10종) +Modern, Professional, Creative, Minimal, Elegant, Dark, Colorful, Corporate, Magazine, Dashboard + +--- + +## 2. 업무 활용 가능 영역 검토 + +### 2.1 경영/기획 업무 + +| 업무 | 활용 방식 | 난이도 | 기대효과 | +|------|-----------|--------|----------| +| **주간/월간 업무 보고서** | 프리셋=보고서, 폴더 내 데이터 참조하여 HTML/Word 자동 생성 | 낮음 | 보고서 작성 시간 70% 절감 | +| **회의록 정리** | 프리셋=문서작성, 회의 메모 텍스트를 구조화된 문서로 변환 | 낮음 | 형식 통일, 누락 방지 | +| **사업 계획서 초안** | 프리셋=보고서, 참고 자료 읽기 + Corporate 템플릿 적용 | 중간 | 초안 작성 시간 50% 절감 | +| **경쟁사 분석 보고서** | 프리셋=보고서, 수집 자료 종합 + Dashboard 템플릿 | 중간 | 분석 체계화 | + +### 2.2 인사/총무 업무 + +| 업무 | 활용 방식 | 난이도 | 기대효과 | +|------|-----------|--------|----------| +| **인사 데이터 분석** | 프리셋=데이터분석, Excel 인사DB 읽기 → 통계 보고서 | 낮음 | 수작업 집계 제거 | +| **교육 자료 제작** | 프리셋=문서작성, Magazine 템플릿으로 시각적 교재 생성 | 낮음 | 디자인 외주 불필요 | +| **내규/매뉴얼 정리** | 프리셋=문서작성, 기존 문서 읽기 → 최신 버전 재구성 | 중간 | 문서 버전 관리 개선 | +| **급여/근태 엑셀 자동화** | 프리셋=자동화, 반복 계산 스크립트 생성 | 중간 | 월간 2-3시간 절감 | + +### 2.3 재무/회계 업무 + +| 업무 | 활용 방식 | 난이도 | 기대효과 | +|------|-----------|--------|----------| +| **매출 데이터 분석** | 프리셋=데이터분석, CSV/Excel 매출 데이터 → 차트 포함 HTML 보고서 | 낮음 | 실시간 분석 가능 | +| **비용 항목 분류** | 프리셋=데이터분석, 거래 내역 파일 읽기 → 카테고리별 집계 | 낮음 | 수작업 분류 제거 | +| **예산 대비 실적 보고** | 프리셋=보고서, 예산/실적 Excel 비교 → Professional 템플릿 보고서 | 중간 | 월간 보고 시간 60% 절감 | +| **세금계산서 데이터 정리** | 프리셋=파일관리 + 데이터분석, 파일 수집 → CSV 통합 | 중간 | 분기 결산 효율화 | + +### 2.4 영업/마케팅 업무 + +| 업무 | 활용 방식 | 난이도 | 기대효과 | +|------|-----------|--------|----------| +| **고객 데이터 분석** | 프리셋=데이터분석, CRM 내보내기 파일 → 세그먼트 분석 | 낮음 | 타겟팅 정확도 향상 | +| **제안서/견적서 작성** | 프리셋=문서작성, Elegant 템플릿으로 고급 제안서 생성 | 낮음 | 제안서 품질 향상 | +| **캠페인 결과 보고** | 프리셋=보고서, Dashboard 템플릿으로 KPI 시각화 | 중간 | 성과 가시화 | +| **뉴스레터 콘텐츠** | 프리셋=문서작성, Magazine 템플릿으로 뉴스레터 HTML 생성 | 낮음 | 디자인 시간 제거 | + +### 2.5 R&D/개발 업무 + +| 업무 | 활용 방식 | 난이도 | 기대효과 | +|------|-----------|--------|----------| +| **코드 문서화** | 프리셋=문서작성, folder_map + grep으로 코드 분석 → API 문서 생성 | 중간 | 문서화 부채 해소 | +| **테스트 데이터 생성** | 프리셋=자동화, CSV/Excel 형식 테스트 데이터 대량 생성 | 낮음 | QA 준비 시간 절감 | +| **빌드/배포 스크립트** | 프리셋=자동화, BAT/PS1 스크립트 자동 생성 | 낮음 | DevOps 초기 설정 지원 | +| **기술 보고서** | 프리셋=보고서, Modern 템플릿으로 기술 검토 문서 생성 | 중간 | 기술 의사결정 체계화 | + +### 2.6 운영/생산 업무 + +| 업무 | 활용 방식 | 난이도 | 기대효과 | +|------|-----------|--------|----------| +| **재고 데이터 분석** | 프리셋=데이터분석, 재고 Excel → 부족/과잉 분석 보고서 | 낮음 | 재고 관리 효율화 | +| **작업 일지 자동 포맷** | 프리셋=문서작성, 수기 메모 → 정형 일지 Word 변환 | 낮음 | 기록 표준화 | +| **파일 정리 자동화** | 프리셋=파일관리, 날짜/유형별 파일 자동 분류 | 낮음 | 공유폴더 관리 효율화 | +| **품질 검사 보고서** | 프리셋=보고서, 검사 데이터 → Corporate 템플릿 보고서 | 중간 | 보고 양식 통일 | + +--- + +## 3. 고활용 시나리오 (즉시 적용 가능) + +### 시나리오 A: 주간 업무 보고서 자동 생성 +``` +1. 작업 폴더에 주간 업무 메모(txt/md) 저장 +2. Cowork → 보고서 → HTML 보고서(Professional 템플릿) +3. "이번 주 업무 내용을 종합해서 주간 보고서 작성해줘" +4. AI가 폴더 문서 읽기 → 구조화 → HTML 보고서 자동 생성 +``` +**소요 시간**: 기존 30분 → 2-3분 + +### 시나리오 B: Excel 데이터 분석 → 시각적 보고서 +``` +1. 작업 폴더에 매출 데이터(xlsx/csv) 저장 +2. Cowork → 데이터분석 → HTML 보고서(Dashboard 템플릿) +3. "월별 매출 추이와 상위 품목을 분석해서 보고서 만들어줘" +4. AI가 데이터 읽기 → 집계/분석 → 차트 포함 대시보드 생성 +``` +**소요 시간**: 기존 1-2시간 → 5분 + +### 시나리오 C: 다수 문서 종합 → 요약 보고서 +``` +1. 작업 폴더에 관련 자료(PDF, DOCX, TXT) 수집 +2. Cowork → 보고서 → Word(Corporate 템플릿) +3. "폴더 내 문서를 모두 읽고 핵심 내용 종합 보고서 작성해줘" +4. AI가 document_read로 전체 문서 읽기 → 종합 → Word 보고서 생성 +``` +**소요 시간**: 기존 2-3시간 → 5-10분 + +### 시나리오 D: 반복 업무 스크립트화 +``` +1. Cowork → 자동화 +2. "매일 아침 특정 폴더의 파일을 날짜별로 정리하는 스크립트 만들어줘" +3. AI가 요구사항 분석 → BAT/PS1 스크립트 생성 +``` +**소요 시간**: 기존 1시간(개발자 요청) → 3분 + +--- + +## 4. 현재 한계 및 향후 개선 방향 + +### 4.1 현재 한계 +| 한계 | 설명 | 영향도 | +|------|------|--------| +| 인터넷 검색 불가 | 외부 데이터 수집 자동화 미지원 | 중간 | +| 이미지/차트 직접 생성 불가 | HTML 내 CSS 기반 시각화만 가능 | 낮음 | +| 대용량 파일 제한 | 8,000자 기본 제한 (document_read) | 중간 | +| 데이터베이스 연동 없음 | DB 직접 쿼리 불가 (파일 내보내기 후 사용) | 중간 | +| 메일/메신저 연동 없음 | 생성 결과 자동 전송 불가 | 낮음 | + +### 4.2 향후 개선 계획 (v1.2.0+) +| 우선순위 | 기능 | 기대 효과 | +|----------|------|-----------| +| 1 | **Code 탭 에이전트 활성화** | 코드 분석/수정/테스트 자동화 | +| 2 | **웹 검색 도구 추가** | 실시간 정보 기반 보고서 작성 | +| 3 | **차트 이미지 생성** | 데이터 시각화 품질 향상 | +| 4 | **템플릿 사용자 정의** | 기업 CI/BI 맞춤 문서 생성 | +| 5 | **워크플로우 자동화** | 다단계 작업 사전 정의 및 원클릭 실행 | + +--- + +## 5. 도입 효과 예상 + +### 정량적 효과 +- **문서 작성 시간**: 평균 70% 절감 (30분 → 3-5분) +- **데이터 분석 보고**: 평균 80% 절감 (2시간 → 10-15분) +- **반복 작업 스크립트화**: 비개발자도 자동화 가능 +- **디자인 외주 비용**: 10종 템플릿으로 내부 해결 + +### 정성적 효과 +- 보고서 양식/품질 표준화 +- 데이터 기반 의사결정 문화 촉진 +- 비개발 직군의 자동화 접근성 향상 +- 문서 작성 부담 감소로 핵심 업무 집중도 향상 + +--- + +## 6. 부서별 우선 도입 권장 + +| 우선순위 | 부서 | 핵심 활용 | 권장 프리셋 | +|----------|------|-----------|-------------| +| 1순위 | 기획/경영지원 | 주간보고, 회의록, 사업계획 | 보고서, 문서작성 | +| 1순위 | 재무/회계 | 매출분석, 비용분류, 예산보고 | 데이터분석, 보고서 | +| 2순위 | 영업/마케팅 | 제안서, 고객분석, 캠페인보고 | 문서작성, 데이터분석 | +| 2순위 | 인사/총무 | 인사분석, 교육자료, 매뉴얼 | 데이터분석, 문서작성 | +| 3순위 | R&D/개발 | 기술문서, 테스트데이터, 스크립트 | 자동화, 보고서 | +| 3순위 | 운영/생산 | 재고분석, 작업일지, 파일정리 | 데이터분석, 파일관리 | + +--- + +*본 보고서는 AX Copilot v1.1.0 기준으로 작성되었으며, 향후 기능 업데이트에 따라 활용 범위가 확대될 예정입니다.* diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md new file mode 100644 index 0000000..49c7ae8 --- /dev/null +++ b/docs/DEVELOPMENT.md @@ -0,0 +1,2692 @@ +# AX Commander — 개발 문서 + +--- + +## 📑 목차 + +1. [관련 문서](#관련-문서) +2. [사내 전용 프로그램 개발 원칙](#사내-전용-프로그램-개발-원칙) +3. [프로젝트 구조](#프로젝트-구조) +4. [아키텍처 개요](#아키텍처-개요) +5. [핵심 데이터 흐름](#핵심-데이터-흐름) +6. [각 핸들러 상세](#각-핸들러-상세) +7. [설정 UI (SettingsWindow)](#설정-ui-settingswindow) +8. [설정 스키마 (`settings.json`)](#설정-스키마-settingsjson) +9. [주요 기능 상세](#주요-기능-상세) +10. [데이터 저장 경로](#데이터-저장-경로) +11. [보안 고려사항](#보안-고려사항) +12. [테마 커스터마이징](#테마-커스터마이징) +13. [단위 테스트](#단위-테스트) +14. [코드 검토 이력](#코드-검토-이력) +15. [버그 수정 이력](#버그-수정-이력) +16. [알려진 제한사항 및 향후 개선](#알려진-제한사항-및-향후-개선) +17. [개발 환경](#개발-환경) +18. [경쟁 제품 기능 비교](#경쟁-제품-기능-비교) +19. [새로운 핸들러/키워드 추가 방법](#새로운-핸들러키워드-추가-방법-개발자-가이드) +20. [사내 LLM / AI Agent 연동 가이드](#사내-llm--ai-agent-연동-가이드-향후-확장) +21. [버전 이력](#버전-이력) +22. [개발 검토 — 워크플로우 병목 분석 그래프](#개발-검토--워크플로우-병목-분석-그래프) +23. [양식 기반 문서 생성 (Template Mode)](#양식-기반-문서-생성-template-mode) + +--- + +## 관련 문서 + +| 문서 | 설명 | +|------|------| +| [AX Agent 로드맵](AGENT_ROADMAP.html) | AX Agent 대화 서비스 고도화 종합 계획 (Phase 2.5~11) | +| [AX Commander 로드맵](LAUNCHER_ROADMAP.html) | AX Commander 런처 고도화 계획 | +| [사용 가이드](../src/AxCopilot/Assets/AX%20Copilot%20사용가이드.htm) | 사용자용 단축키 & 예약어 가이드 | + +--- + +## 사내 전용 프로그램 개발 원칙 + +> **AX Commander는 사내 전용 프로그램입니다.** +> 아래 원칙을 반드시 준수하여 개발하세요. + +### 외부 연결 금지 + +| 금지 항목 | 설명 | +|-----------|------| +| 외부 HTTP/HTTPS 호출 | `HttpClient`, `WebClient`, `HttpWebRequest` 등으로 외부 서버에 요청 금지 | +| 외부 SDK 연동 | 서드파티 클라우드 SDK, AI API, SaaS 라이브러리 사용 금지 | +| 원격 플러그인 다운로드 | 런타임에 외부에서 DLL/코드 다운로드 금지 | +| 텔레메트리 / 오류 수집 | 사용 데이터를 외부 서버로 전송하는 일체의 코드 금지 | +| NuGet 패키지 | 외부 네트워크 통신이 내장된 패키지 신규 도입 금지 | + +**허용**: 로컬 파일 시스템 접근, Windows API (P/Invoke), 사내 인트라넷 URL (명시적으로 허가된 경우만), 로컬 프로세스 실행. + +### 외부 SDK 금지 + +기존에 등록된 `JsonSkillLoader`의 HTTP 스킬 기능(`type: "http"`)은 **사내 인트라넷 엔드포인트 전용**으로만 사용해야 합니다. 인터넷 접근이 필요한 기능은 구현하지 않습니다. + +### 의존성 관리 + +신규 NuGet 패키지를 추가하기 전에 다음을 확인하세요: +1. 패키지가 외부 서버와 통신하는지 검토 +2. 동일한 기능을 BCL(Base Class Library)이나 Windows API로 구현 가능한지 먼저 검토 +3. 추가 시 `DEVELOPMENT.md`에 이유를 기록 + +### UI 색상·레이아웃 규칙 + +> **모든 UI 개발 시 아래 규칙을 반드시 준수하세요.** (상세: `docs/AI_Service_Review.html` §12.8) + +1. **시스템 기본 컨트롤 사용 금지** — `ContextMenu`, `MessageBox`, `ComboBox` 드롭다운을 채팅 창에 사용하지 않음. 반드시 커스텀 `Popup` 기반으로 구현 +2. **색상 하드코딩 금지** — `Brushes.White`, `#A0A4BE` 등 하드코딩하면 라이트/다크 테마 전환 시 대비가 깨짐 + - XAML: `{DynamicResource PrimaryText}`, `{DynamicResource SecondaryText}` 등 리소스 키 사용 + - 코드비하인드: `TryFindResource("PrimaryText") as Brush ?? Brushes.White` 패턴 사용 +3. **수평 스크롤바 금지** — 아이콘/칩 목록은 `ScrollViewer` 가로 스크롤 대신 `WrapPanel`로 창 폭에 맞게 자동 줄바꿈 +4. **Popup 내부에 `Button` 사용 금지** — 포커스 캡처로 팝업이 즉시 닫힘. `Border` + `MouseLeftButtonUp` 패턴 사용 +5. **폰트 크기** — 메뉴 항목 13px 이상, 설명 텍스트 12px 이상 (가독성 확보) +6. **호버/클릭 효과 필수** — `#18FFFFFF` 반투명 배경 + 핸드 커서, 팝업 `PopupAnimation="Fade"` 기본 적용 +7. **사용자 의사결정 UI = 하단 드롭다운 메뉴 패턴** — AI가 사용자에게 선택을 요청할 때(포맷, 디자인, 권한 등) 아이콘을 주욱 나열하지 않고 **컴팩트 드롭다운 버튼** `[라벨: 현재값 ▾]` → 클릭 시 `Popup` 메뉴 표시. 마지막 항목에 텍스트 입력 옵션 포함 가능. + - 설정(Settings)에서 해당 값의 기본값을 선택할 수 있어야 함 + - 같은 패턴을 모든 탭(Chat, Cowork, Code)에 일관 적용 +8. **프리뷰 패널 = 탭 기반** — 다중 파일 프리뷰를 탭으로 관리, 파일명 표시, 탭 축소, 외부 프로그램 실행 아이콘 포함 +9. **켜기/끄기 UI = ToggleSwitch 스타일 사용** — 설정 창 등 모든 on/off 옵션에는 기본 `CheckBox`가 아닌 `Style="{StaticResource ToggleSwitch}"` 좌우 슬라이드 토글을 사용. 카테고리 선택 목록도 동일하게 적용 (Grid 좌: 라벨, 우: 토글) +10. **ContextMenu 사용 금지 → 커스텀 Popup 메뉴** — WPF 기본 `ContextMenu`/`MenuItem` 사용 금지. 모든 우클릭 메뉴·드롭다운을 커스텀 `Popup` (Border + MouseLeftButtonUp 패턴, 12px 라운드, 호버, 드롭섀도)으로 구현 +9. **폴더 데이터 활용 시 관련성 검증 필수** — 적극 활용 모드에서도 대화 주제와 무관한 파일은 읽지 않음. 계획 단계에서 읽을 파일 목록과 이유를 먼저 제시 +10. **인터랙티브 영역 최소 크기 36px** — 버튼·아이콘·메뉴 등 클릭 가능한 요소는 보내기 버튼(36×36)과 동일한 터치 크기 확보. FontSize 최소 12px, Padding 최소 6px. 폴더바·모델 선택 등 텍스트 영역도 MinHeight=34 이상 + +--- + +## 프로젝트 구조 + +``` +AX Commander/ +├── src/ +│ ├── AxCommander/ # 메인 WPF 애플리케이션 +│ │ ├── App.xaml / App.xaml.cs # 앱 진입점, 서비스 초기화, 트레이 아이콘 +│ │ ├── Assets/ +│ │ │ ├── icon.ico # 다이아몬드 픽셀 보석 아이콘 (7크기: 16~256px) +│ │ │ ├── diamond_pixel.svg # 아이콘 SVG 원본 (참고용) +│ │ │ ├── mascot.png # About 창 마스코트 이미지 (선택) +│ │ │ └── Quotes/ +│ │ │ └── famous.json # 내장 명언 500개 (EmbeddedResource) +│ │ ├── Core/ +│ │ │ ├── CommandResolver.cs # 프리픽스 기반 라우팅 테이블 +│ │ │ ├── ContextManager.cs # 윈도우 스냅샷 & 복원 (워크스페이스) +│ │ │ ├── FuzzyEngine.cs # 퍼지 검색 + 한국어 초성 지원 +│ │ │ ├── InputListener.cs # 전역 키보드 훅 (WH_KEYBOARD_LL) +│ │ │ └── PluginHost.cs # DLL/JSON 플러그인 로더 +│ │ ├── Handlers/ +│ │ │ ├── AliasHandler.cs # @(URL) ~(폴더) >(배치) 핸들러 +│ │ │ ├── CalculatorHandler.cs # = 계산기 + 단위변환 + 통화변환 +│ │ │ ├── ClipboardHandler.cs # $ 클립보드 변환 (12종 내장) +│ │ │ ├── ClipboardHistoryHandler.cs # # 클립보드 히스토리 +│ │ │ ├── ColorHandler.cs # color HEX/RGB/HSL/HSV 변환기 +│ │ │ ├── ColorPickHandler.cs # pick 스포이드 색상 추출 +│ │ │ ├── DateCalcHandler.cs # date 날짜 계산/D-day/타임스탬프 +│ │ │ ├── EncodeHandler.cs # encode base64/url/hex/md5/sha256 +│ │ │ ├── EnvHandler.cs # env 환경변수 조회 +│ │ │ ├── EmojiHandler.cs # emoji 이모지 피커 (300+ 이모지) +│ │ │ ├── JsonHandler.cs # json JSON 검증/포맷/미니파이 +│ │ │ ├── JsonSkillLoader.cs # .skill.json HTTP API 연동 +│ │ │ ├── NoteHandler.cs # note 빠른 메모 저장/조회 +│ │ │ ├── PortHandler.cs # port 포트/프로세스 점검 +│ │ │ ├── RecentFilesHandler.cs # recent Windows 최근 파일 +│ │ │ ├── RenameHandler.cs # rename 파일 일괄 이름변경 +│ │ │ ├── ScreenCaptureHandler.cs # cap 화면/창/스크롤 캡처 +│ │ │ ├── ScaffoldHandler.cs # scaffold 프로젝트 스캐폴딩 +│ │ │ ├── ServiceHandler.cs # svc Windows 서비스 관리 +│ │ │ ├── SnapHandler.cs # snap 창 배치 레이아웃 +│ │ │ ├── SnippetHandler.cs # ; 텍스트 스니펫 +│ │ │ ├── SystemCommandHandler.cs # / 시스템 명령 + 타이머/알람 +│ │ │ ├── TextStatsHandler.cs # stats 텍스트 통계 분석 +│ │ │ ├── UninstallHandler.cs # uninstall 앱 제거 (레지스트리) +│ │ │ ├── FavoriteHandler.cs # fav 즐겨찾기 (파일·폴더) +│ │ │ ├── MonitorHandler.cs # monitor 시스템 리소스 모니터 +│ │ │ └── WorkspaceHandler.cs # ! 워크스페이스 관리 +│ │ ├── Models/ +│ │ │ ├── AppSettings.cs # 설정 POCO (JSON 직렬화) +│ │ │ └── DailyUsageStats.cs # 일별 사용 통계 데이터 모델 +│ │ ├── Services/ +│ │ │ ├── ClipboardHistoryService.cs # WM_CLIPBOARDUPDATE 훅 +│ │ │ ├── IndexService.cs # 파일 시스템 인덱서 +│ │ │ ├── LogService.cs # 파일 로거 +│ │ │ ├── NotificationService.cs # 트레이 풍선 알림 (타이머/알람) +│ │ │ ├── QuoteService.cs # 명언 JSON 로더 (famous.json 내장 리소스) +│ │ │ ├── SessionTrackingService.cs # PC 잠금/해제 시간 추적 +│ │ │ ├── L10n.cs # 정적 다국어 서비스 (ko/en/ja/zh/vi) +│ │ │ ├── SettingsService.cs # settings.json 로드/저장 +│ │ │ ├── UsageRankingService.cs # 실행 빈도 추적 & 퍼지 결과 정렬 +│ │ │ ├── UsageStatisticsService.cs # 일별 통계 집계 (런처 호출/명령/활성시간) +│ │ │ ├── WindowTracker.cs # 이전 활성 창 핸들 보존 (snap/cap용) +│ │ │ └── WorktimeReminderService.cs # 잠금 해제 시 사용시간 알림 팝업 서비스 +│ │ ├── Themes/ +│ │ │ ├── Converters.cs # WPF 값 변환기 +│ │ │ ├── Symbols.cs # Segoe MDL2 Assets 상수 +│ │ │ ├── Dark.xaml / Light.xaml / OLED.xaml +│ │ │ ├── Nord.xaml / Monokai.xaml / Catppuccin.xaml / Sepia.xaml +│ │ │ ├── Alfred.xaml / AlfredLight.xaml +│ │ ├── ViewModels/ +│ │ │ ├── LauncherViewModel.cs # 런처 MVVM ViewModel +│ │ │ ├── SettingsViewModel.cs # 설정 창 ViewModel + 보조 모델 +│ │ │ │ # (ThemeCardModel, ColorRowModel, +│ │ │ │ # AppShortcutModel, SnippetRowModel) +│ │ │ └── StatisticsViewModel.cs # 사용 통계 창 ViewModel (DayBarItem, CommandStatItem) +│ │ └── Views/ +│ │ ├── LauncherWindow.xaml/.cs # 메인 런처 UI +│ │ ├── LargeTypeWindow.xaml/.cs # Large Type 전체 화면 오버레이 +│ │ ├── SettingsWindow.xaml/.cs # 설정 창 UI (좌측 사이드바 10탭) +│ │ ├── AboutWindow.xaml/.cs # 개발자 정보 창 +│ │ ├── HelpDetailWindow.xaml/.cs # 도움말 전체 목록 카드 창 +│ │ ├── EyeDropperWindow.xaml/.cs # 전체 화면 스포이드 오버레이 +│ │ ├── ColorPickResultWindow.xaml/.cs # 색상 추출 결과 반투명 팝업 +│ │ ├── ReminderPopupWindow.xaml/.cs # 잠금 해제 사용시간 알림 팝업 +│ │ ├── StatisticsWindow.xaml/.cs # 사용 통계 차트 창 +│ │ └── TrayContextMenu.cs # 트레이 컨텍스트 메뉴 팩토리 (모던 테마 인식) +│ ├── AxCommander.SDK/ +│ │ └── IActionHandler.cs # 플러그인 계약 (LauncherItem, PluginMetadata) +│ ├── AxCommander.Tests/ +│ │ ├── Core/FuzzyEngineTests.cs # 퍼지 엔진 단위 테스트 (19개) +│ │ ├── Handlers/ClipboardTransformTests.cs # 클립보드 변환 테스트 (21개) +│ │ └── Services/SettingsServiceTests.cs # 설정 서비스 테스트 (17개) +│ ├── AxCommander.Installer.Offline/ # 오프라인 인스톨러 (.NET 8, self-contained ZIP 내장) +│ │ ├── SetupForm.cs # 모던 WinForms UI (그라데이션 헤더, 설치/업그레이드/제거) +│ │ └── Program.cs +│ └── AxCommander.Installer.Online/ # 온라인 인스톨러 (.NET Framework 4.8, ~1MB) +│ ├── OnlineSetupForm.cs # .NET 4.8 WinForms UI + .NET 8 런타임 자동 다운로드 +│ └── Program.cs +├── tools/ +│ └── IconGenerator/ # 다이아몬드 픽셀 아이콘 생성 도구 (.NET 8 콘솔) +│ └── Program.cs # 보석 다이아몬드 컷 + RGBG 4색 → ICO 생성 +├── docs/ +│ └── DEVELOPMENT.md # 이 파일 +├── build.bat # 3종 빌드 스크립트 (본체 + 오프라인 + 온라인) +└── README.md +``` + +--- + +## 아키텍처 개요 + +``` +┌─────────────────────────────────────────────────────────┐ +│ App.xaml.cs │ +│ (서비스 초기화 · 핸들러 등록 · 트레이 아이콘 관리) │ +└────────┬───────────────────────────────────────────┬────┘ + │ │ +┌────────▼────────┐ ┌──────────▼───────┐ +│ LauncherWindow │ ◄─── MVVM ─────────► │ SettingsWindow │ +│ (WPF, OLED 스타일)│ │ (좌측 사이드바) │ +└────────┬────────┘ └──────────────────┘ + │ 입력 +┌────────▼────────┐ +│ CommandResolver │ ← 프리픽스 라우터 +└────────┬────────┘ + │ 프리픽스 분기 + ┌────────┴────────────────────────────────────────────────┐ + │ = Calculator/Currency /System+Timer ; Snippet │ + │ # History @ UrlAlias ~ Folder > Batch $ Clip │ + │ ! Workspace ? WebSearch emoji color recent │ + │ note uninstall kill media info [plugin/skill] │ + └────────────────────────────────────────────────────────┘ + │ 프리픽스 없음 +┌────────▼────────┐ +│ FuzzyEngine │ ← 한국어 초성 + 퍼지 매칭 +└─────────────────┘ +``` + +--- + +## 핵심 데이터 흐름 + +### 검색 흐름 + +1. 사용자가 런처에 텍스트 입력 +2. `LauncherViewModel.InputText` setter 트리거 +3. `CommandResolver.ResolveAsync(input)` 호출 +4. 프리픽스 일치 → 해당 `IActionHandler.GetItemsAsync()` 호출 +5. 프리픽스 없음 → `FuzzyEngine.Search()` 호출 +6. 결과를 `ObservableCollection`에 바인딩 +7. `LauncherWindow` ListView 자동 갱신 + +### 실행 흐름 + +1. 사용자가 `Enter` 키 입력 +2. `LauncherViewModel.ExecuteSelectedAsync()` 호출 +3. `CommandResolver.ExecuteAsync(item, lastInput)` 호출 +4. 프리픽스 있음 → `handler.ExecuteAsync(item)` 위임 +5. 프리픽스 없음 → `IndexEntry.Path`를 `Process.Start`로 실행 +6. 런처 창 자동 숨김 + +### 테마 전환 흐름 + +1. 설정 창 테마 탭에서 카드 클릭 +2. `SettingsViewModel.SelectTheme(key)` 호출 +3. `ThemePreviewRequested` 이벤트 발생 +4. `App.PreviewCallback` → `LauncherWindow.ApplyTheme(key)` 호출 +5. `Application.Current.Resources.MergedDictionaries` 교체 (런타임 핫스왑) +6. 설정 저장 없이 닫으면 `RevertCallback`으로 원복 + +--- + +## 각 핸들러 상세 + +### CalculatorHandler (`=`) + +- **엔진**: `MathEvaluator` 재귀 하강 파서 (외부 의존성 없음) +- **연산자**: `+`, `-`, `*`, `/`, `%`, `^` (거듭제곱) +- **함수**: `sqrt`, `abs`, `ceil`, `floor`, `round`, `sin`, `cos`, `tan`, `asin`, `acos`, `atan`, `log`, `log2`, `ln`, `exp`, `pow`, `min`, `max` +- **상수**: `pi`, `e`, `inf` +- **리터럴**: 일반 정수/소수, 16진수(`0xFF`), 과학적 표기(`1.5e3`) +- **단위 변환**: `100km in miles`, `32f in c`, `5lb to kg` 등 (길이/온도/무게/속도/데이터/넓이) +- **통화 변환**: `100 USD to KRW`, `50 EUR in JPY` — `open.er-api.com` 무료 API, 1시간 캐시 +- **실행**: 결과를 클립보드에 복사 + +### SystemCommandHandler (`/`) + +| 명령 | 기능 | P/Invoke | +|------|------|----------| +| `/lock` | 화면 잠금 | `user32.LockWorkStation` | +| `/sleep` | 절전 | `WinForms.SetSuspendState(Suspend)` | +| `/hibernate` | 최대 절전 | `WinForms.SetSuspendState(Hibernate)` | +| `/restart` | 재시작 | `shutdown /r /t 5` | +| `/shutdown` | 종료 | `shutdown /s /t 5` | +| `/logout` | 로그아웃 | `user32.ExitWindowsEx(EWX_LOGOFF)` | +| `/recycle` | 휴지통 비우기 | `shell32.SHEmptyRecycleBin` | +| `/timer 5m` | 타이머 | `Task.Delay` + `NotificationService.Notify` | +| `/timer 1h30m 회의` | 라벨 포함 타이머 | 위와 동일 | +| `/alarm 14:30` | 지정 시각 알람 | 목표 시각 미래 계산 + `Task.Delay` | + +각 명령은 `SystemCommandSettings`에서 개별 활성화/비활성화 가능. +위험한 명령(재시작, 종료 등)은 실행 전 `MessageBox.Show` 확인 다이얼로그 표시. +타이머/알람 완료 시 트레이 풍선 알림(`NotificationService.Notify`). + +**명령 별칭** (v0.8 추가): `CommandAliases` 딕셔너리로 명령키별 별칭 목록 설정 가능. + +```json +"commandAliases": { + "lock": ["잠금", "l"], + "sleep": ["절전", "s"], + "restart": ["재시작", "r"], + "shutdown": ["종료"], + "logout": ["로그아웃"] +} +``` + +예) `/잠금` 또는 `/l` 입력 시 화면 잠금 실행. 설정 UI의 시스템 탭에서 쉼표 구분으로 편집 가능. + +### EmojiHandler (`emoji`) + +- 300+ 이모지 내장 (한국어+영어 키워드 태그) +- **사용**: `emoji 하트`, `emoji wave`, `emoji` (기본 30개) +- **실행**: 이모지 문자를 클립보드에 복사 +- **카테고리**: 표정/감정, 손/몸, 하트/기호, 음식, 동물, 물건/도구, 이동수단, 장소, 기호 + +### ColorHandler (`color`) + +- **입력 형식**: HEX(`#FF5500`), RGB(`255,85,0` / `rgb(255,85,0)`), RGBA, HSL(`hsl(24,100%,50%)`), 색상 이름(`red`, `빨강`) +- **출력**: HEX / RGB / HSL / HSV 4가지 형식 동시 표시 +- **색상 이름**: 30+ 한/영 색상 이름 지원 (red, 빨강, skyblue, 하늘색 등) +- **실행**: 선택한 형식을 클립보드에 복사 + +### RecentFilesHandler (`recent`) + +- `%APPDATA%\Microsoft\Windows\Recent` 폴더의 `.lnk` 파일 읽기 +- 최근 수정 순 정렬, 최대 100개 스캔 → 20개 표시 +- 10초 캐시 +- **실행**: Windows 셸이 `.lnk` 링크를 따라 원본 파일 실행 + +### NoteHandler (`note`) + +- **저장**: `note 내일 회의 9시` → `%APPDATA%\AxCommander\notes.txt` 에 타임스탬프와 함께 append +- **조회**: `note` → 최근 10개 역순 표시 (Enter로 클립보드 복사) +- **전체 삭제**: `note clear` 또는 목록 맨 아래 항목 선택 +- **알림**: 저장 시 트레이 풍선 알림 표시 + +### UninstallHandler (`uninstall`) + +- `HKLM\SOFTWARE\...\Uninstall` + `HKCU\SOFTWARE\...\Uninstall` 레지스트리 스캔 +- `WOW6432Node` 경로도 포함 (32비트 앱) +- 이름 / 게시자로 검색, 30초 캐시 +- **실행**: `UninstallString` 파싱 후 `Process.Start` — `msiexec` 자동 처리 +- 시스템 구성 요소(`SystemComponent=1`) 및 KB 패치 자동 필터링 + +### SnippetHandler (`;`) + +- 설정 `snippets[]` 배열에서 키워드를 퍼지 검색 +- **변수 치환**: `{date}`, `{time}`, `{datetime}`, `{year}`, `{month}`, `{day}` +- **붙여넣기**: `Clipboard.SetText` 후 `SendInput(Ctrl+V)` 시뮬레이션 (100ms 지연) + +### ClipboardHistoryService + ClipboardHistoryHandler (`#`) + +- `HwndSource(HWND_MESSAGE)` 기반 숨겨진 메시지 창 생성 +- `AddClipboardFormatListener` + `WM_CLIPBOARDUPDATE` 훅 +- 최대 `maxItems`개 저장 (기본 50), FIFO 방식 +- **보안 제외 패턴**: `ExcludePatterns` Regex 목록으로 민감 데이터 자동 제외 +- `SuppressNextCapture()`: 자체 붙여넣기 시 중복 기록 방지 + +### ClipboardHandler (`$`) + +12가지 내장 변환기: + +| 키 | 변환 | +|----|------| +| `$json` | JSON 포맷팅 | +| `$upper` / `$lower` | 대/소문자 변환 | +| `$ts` | Unix 타임스탬프 → 날짜 | +| `$epoch` | 날짜 → Unix 타임스탬프 | +| `$urle` / `$urld` | URL 인코딩/디코딩 | +| `$b64e` / `$b64d` | Base64 인코딩/디코딩 | +| `$md` | Markdown 제거 | +| `$trim` | 공백 정리 | +| `$lines` | 빈 줄 제거 | + +--- + +## 설정 UI (SettingsWindow) + +### 레이아웃 구조 + +설정 창(`SettingsWindow.xaml`)은 **좌측 사이드바 + 우측 컨텐츠** 방식으로 구성됩니다. +WPF `TabControl`의 커스텀 `ControlTemplate`으로 구현되며, `TabStripPlacement="Left"`를 사용합니다. + +``` +┌──────────────────────────────────────────────────────────┐ +│ 820 × 610 │ +│ ┌────────────┐ ┌────────────────────────────────────┐ │ +│ │ AX │ │ │ │ +│ │ Commander │ │ 선택된 탭의 컨텐츠 │ │ +│ │────────────│ │ (ScrollViewer + StackPanel) │ │ +│ │ ● 일반 │ │ │ │ +│ │ 테마 │ │ │ │ +│ │ 색상 편집 │ │ │ │ +│ │ 스니펫 │ │ │ │ +│ │ 클립보드 │ │ │ │ +│ │ 시스템 │ │ │ │ +│ │ 빠른 실행 │ │ │ │ +│ │ 배치 명령 │ │ │ │ +│ │ 캡처 │ │ │ │ +│ │ 알림 │ │ │ │ +│ └────────────┘ └────────────────────────────────────┘ │ +│ ─────────────────────────────────────────────────────── │ +│ AX Commander · v1.0 [취소] [💾 저장] │ +└──────────────────────────────────────────────────────────┘ +``` + +### 탭 구성 + +| 탭 | MDL2 아이콘 | 주요 설정 항목 | +|----|------------|--------------| +| 일반 | E713 | 글로벌 단축키, 최대 결과 수, **기본 검색 엔진**, 투명도, **런처 위치**, 인덱스 경로, **검색 확장자** (태그형 UI, 추가/삭제 가능) | +| 테마 | E790 | 11개 테마 카드 (클릭 → 즉시 미리보기): Dark/Light/OLED/Nord/Monokai/Catppuccin/Sepia/Alfred/Alfred Light/System/Custom | +| 색상 편집 | E771 | 커스텀 테마 14개 색상 (커스텀 선택 시만 활성) | +| 스니펫 | E70B | **자동 확장 토글**, 스니펫 추가/삭제, 변수 치환 안내 | +| 클립보드 | E77F | 활성화 토글, 최대 보관 개수, 보안 패턴 표시 | +| 시스템 | E7E8 | 7개 시스템 명령 개별 활성화/비활성화, **명령별 별칭 편집**, **별칭 기본값 초기화** | +| 빠른 실행 | E7C3 | 키워드→앱/URL/폴더 단축키 추가/삭제 | +| 배치 명령 | E756 | **`>` 프리픽스 배치 명령 추가/삭제, ShowWindow 옵션** | +| 캡처 | E722 | `cap` 프리픽스 문자열 변경, 파일 자동 저장 토글·저장 경로 설정 | +| 알림 | EA8F | 잠금 해제 알림 활성화 토글, 표시 위치(4방향), 표시 간격, 자동 닫힘 시간 | + +### 디자인 시스템 + +**컬러 아이콘 박스** — 각 설정 행 좌측에 `36×36 CornerRadius="9"` 박스로 기능을 시각적으로 구분합니다. + +| 기능 영역 | 배경색 | +|----------|--------| +| 단축키 / 빠른 실행 | `#4B5EFC` | +| 검색 | `#00A8CC` | +| 투명도 / 절전 | `#7B2FBE` | +| 스니펫 | `#FF6B35` | +| 클립보드 활성화 | `#20B2AA` | +| 보관 개수 | `#FF8C42` | +| 보안 / 화면 잠금 | `#C50F1F` | +| 재시작 | `#107C10` | +| 시스템 종료 | `#C50F1F` | +| 로그아웃 | `#CA5010` | + +**토글 스위치** (`ToggleSwitch` 스타일) — iOS 스타일의 커스텀 `CheckBox` 스타일. 클립보드 활성화와 시스템 명령 7개에 적용. + +``` +OFF: [○──────] 배경: #D0D0E0 +ON: [──────●] 배경: #4B5EFC +``` + +**SideNavItem 스타일** — 탭 선택 상태: +- 선택됨: 좌측 3px `#4B5EFC` accent bar + `#EEF0FF` 배경 + SemiBold 텍스트 +- 호버: `#F4F4FF` 배경 +- 비선택: 투명 배경 + +### SettingsViewModel 보조 모델 + +```csharp +// 테마 카드 (테마 탭) +class ThemeCardModel { Key, Name, PreviewBackground/Text/Accent/..., IsSelected } + +// 커스텀 색상 행 (색상 편집 탭) +class ColorRowModel { Label, Property, Hex, Preview(SolidColorBrush) } + +// 빠른 실행 단축키 (빠른 실행 탭) +class AppShortcutModel { Key, Description, Target, Type, TypeSymbol, TypeLabel } + +// 스니펫 행 (스니펫 탭) +class SnippetRowModel { Key, Name, Content, Preview } + +// 배치 명령 행 (배치 명령 탭) +class BatchCommandModel { Key, Command, ShowWindow } +``` + +--- + +## 설정 스키마 (`settings.json`) + +```jsonc +{ + "version": "1.0", + "hotkey": "Alt+Space", + "launcher": { + "opacity": 0.96, + "maxResults": 7, + "theme": "dark", // system|dark|light|oled|nord|monokai|catppuccin|sepia|custom + "width": 680, + "position": "center-top", // center-top|center|bottom + "webSearchEngine": "g", // g|n|d|y|w (Google|Naver|DuckDuckGo|YouTube|Wikipedia) + "snippetAutoExpand": true, // 글로벌 스니펫 자동 확장 활성화 + "customTheme": { /* 14개 색상 키 */ } + }, + "indexPaths": [ + "%USERPROFILE%\\Desktop", + "%APPDATA%\\Microsoft\\Windows\\Start Menu" + ], + "indexExtensions": [ + ".exe", ".lnk", ".bat", ".ps1", ".url", ".cmd", ".msi", + ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".hwp", ".hwpx", + ".txt", ".md", ".csv", ".json", ".xml", ".yaml", ".yml", ".log", ".ini", + ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg", ".webp", + ".zip", ".7z", ".rar" + ], + "aliases": [ + { "key": "vscode", "type": "app", "target": "C:\\...\\Code.exe", "description": "VS Code" }, + { "key": "gh", "type": "url", "target": "https://github.com" }, + { "key": "dl", "type": "folder", "target": "%USERPROFILE%\\Downloads" }, + { "key": "build", "type": "batch", "target": "dotnet build", "description": "빌드", "showWindow": true }, + { "key": "test", "type": "batch", "target": "dotnet test", "description": "테스트", "showWindow": false } + ], + "snippets": [ + { "key": "addr", "name": "회사 주소", "content": "서울시 강남구 ..." } + ], + "clipboardHistory": { + "enabled": true, + "maxItems": 50, + "excludePatterns": ["^\\d{4}[\\s\\-]?\\d{4}[\\s\\-]?\\d{4}[\\s\\-]?\\d{4}$"] + }, + "systemCommands": { + "showLock": true, "showSleep": true, "showRestart": true, + "showShutdown": true, "showHibernate": false, + "showLogout": true, "showRecycleBin": true, + "commandAliases": { + "lock": ["잠금", "l"], + "sleep": ["절전", "s"], + "restart": ["재시작"], + "shutdown": ["종료"], + "hibernate": [], + "logout": ["로그아웃"], + "recycle": [] + } + }, + "clipboardTransformers": [ + { "key": "$mine", "type": "regex", "pattern": "foo", "replace": "bar", "timeout": 2000 } + ], + "screenCapture": { + "prefix": "cap", // cap 프리픽스 문자열 (변경 가능) + "saveToFile": false, // true면 캡처 결과를 파일로도 저장 + "savePath": "" // 빈 문자열이면 %USERPROFILE%\Pictures\Screenshots\ + }, + "reminder": { + "enabled": false, // 잠금 해제 사용시간 알림 활성화 + "position": "BottomRight", // TopLeft|TopRight|BottomLeft|BottomRight + "intervalMinutes": 60, // 알림 최소 간격 (분): 30|60|120|240 + "autoDismissSeconds": 10 // 자동 닫힘 초: 5|10|15|20|30 + }, + "monitorMismatch": "warn", // fit|skip|warn + "profiles": [], // !save로 자동 관리 + "plugins": [ + { "path": "C:\\Plugins\\MyPlugin.dll", "enabled": true } + ] +} +``` + +--- + +## 주요 기능 상세 + +### 파일 액션 서브메뉴 (`→` 키) + +검색 결과에서 파일이나 앱(IndexEntry)이 선택된 상태에서 `→` 키(커서가 입력 끝에 있을 때)를 누르면 파일 액션 서브메뉴로 진입합니다. + +**진입 조건**: `InputBox.CaretIndex == Text.Length && Text.Length > 0 && SelectedItem.Data is IndexEntry` + +**제공 액션**: + +| 액션 | 설명 | 구현 | +|------|------|------| +| 경로 복사 | 파일 전체 경로를 클립보드에 복사 | `Clipboard.SetText(path)` | +| 파일 탐색기에서 열기 | 탐색기에서 해당 파일을 선택 상태로 표시 | `explorer.exe /select,"path"` | +| 관리자 권한으로 실행 | UAC 권한 상승 후 실행 (파일만, 폴더 제외) | `ProcessStartInfo { Verb = "runas" }` | +| 터미널에서 열기 | Windows Terminal 또는 cmd.exe로 해당 경로 열기 | `wt.exe -d "dir"` → 실패 시 `cmd.exe /k cd /d "dir"` | + +**상태 흐름**: +``` +일반 모드 → [→ 키] → 액션 모드 (breadcrumb 바 표시) → [Enter] → 액션 실행 + 닫기 + → [Esc] → 일반 모드 복귀 (이전 쿼리 복원) +``` + +**관련 코드**: +- `LauncherViewModel.EnterActionMode()` — 액션 항목 빌드 및 `_savedQuery` 저장 +- `LauncherViewModel.ExitActionMode()` — 이전 쿼리 복원 및 재검색 +- `LauncherViewModel.ExecuteFileAction()` — 정적 메서드로 액션 실행 +- `LauncherWindow.xaml` — `Grid.Row="1"` breadcrumb 바 (ShowActionModeBar 바인딩) + +--- + +### Large Type (`Shift+Enter`) + +선택된 항목의 텍스트를 전체 화면 오버레이로 크게 표시합니다. + +**표시 텍스트 우선순위**: +1. 계산기 결과 (`SelectedItem.Data is string`) → 계산 결과값 +2. 클립보드 히스토리 텍스트 (`ClipboardEntry.IsText`) → 전체 텍스트 +3. 기본 → `SelectedItem.Title` + +**글꼴 크기 자동 결정** (`LargeTypeWindow`): + +| 텍스트 길이 | FontSize | +|------------|---------| +| ≤ 10자 | 120 | +| ≤ 30자 | 96 | +| ≤ 60자 | 72 | +| ≤ 120자 | 52 | +| 그 외 | 38 | + +`Viewbox Stretch=Uniform`으로 최종 크기를 화면에 맞게 스케일링합니다. + +**닫기**: `Esc` 키 / 화면 클릭 / 우상단 버튼 + +**관련 코드**: +- `Views/LargeTypeWindow.xaml/.cs` — 전체 화면 오버레이 창 +- `LauncherViewModel.GetLargeTypeText()` — 텍스트 추출 로직 +- `LauncherWindow.xaml.cs` → `ShowLargeType()` → `new LargeTypeWindow(text).Show()` + +> **주의**: 클립보드 병합 대기 항목이 있는 상태에서 `Shift+Enter`를 누르면 Large Type 대신 **클립보드 병합**이 실행됩니다. + +--- + +### 클립보드 병합 (`Shift+↑↓`, `Shift+Enter`) + +`#` 프리픽스(클립보드 히스토리) 모드에서 여러 항목을 선택하여 하나로 합쳐 클립보드에 복사합니다. + +**조작법**: + +| 키 | 동작 | +|----|------| +| `Shift+↓` | 현재 항목 선택/해제 후 다음 항목으로 이동 | +| `Shift+↑` | 현재 항목 선택/해제 후 이전 항목으로 이동 | +| `Shift+Enter` | 선택된 항목들을 `\n`으로 합쳐 클립보드에 복사 | +| `Esc` | 선택 취소 및 모드 종료 | + +**힌트 바**: 선택 항목이 있으면 `Grid.Row="3"` 힌트 바 표시 +``` +✓ 2개 선택됨 · Shift+Enter로 합치기 · Esc로 취소 +``` + +**병합 순서**: `Results` 컬렉션의 표시 순서 기준 (HashSet 순서 아님) + +**관련 코드**: +- `LauncherViewModel._mergeQueue` — `HashSet` 병합 대기 큐 +- `LauncherViewModel.ToggleMergeItem()` — 항목 추가/제거 토글 +- `LauncherViewModel.ExecuteMerge()` — Results 순서 기준으로 `\n` 결합 후 클립보드 복사 +- `LauncherViewModel.ClearMerge()` — 큐 초기화 + +--- + +### 런처 키 바인딩 전체 표 + +| 키 | 동작 | +|----|------| +| `↑` / `↓` | 결과 목록 탐색 | +| `Enter` | 선택 항목 실행 | +| `Shift+Enter` | Large Type 표시 (병합 항목 있으면 클립보드 병합) | +| `→` (커서 끝) | 파일 액션 서브메뉴 진입 | +| `Shift+↓` | 현재 항목 병합 선택 + 다음으로 이동 | +| `Shift+↑` | 현재 항목 병합 선택 + 이전으로 이동 | +| `Tab` | 선택 항목 제목을 입력창에 자동완성 | +| `Esc` | 액션 모드면 이전 화면 복귀 / 아니면 런처 닫기 | +| `Ctrl+,` | 설정 창 열기 | + +--- + +## 데이터 저장 경로 + +모든 사용자 데이터는 `%APPDATA%\AxCommander\`에 저장됩니다. EXE 실행 파일 옆에는 어떤 파일도 생성하지 않으므로, 어느 경로에서 실행해도 실행 파일 폴더는 깨끗하게 유지됩니다. + +``` +%APPDATA%\AxCommander\ +├── settings.json # 전체 설정 (JSON 평문) +├── clipboard_history.dat # 클립보드 히스토리 (DPAPI 암호화 바이너리) +├── usage.json # 실행 빈도 랭킹 데이터 +├── notes.txt # 빠른 메모 저장 +├── favorites.json # 즐겨찾기 목록 +├── routines.json # 루틴 자동화 정의 (사용자 편집 가능) +├── logs/ +│ └── app-YYYY-MM-DD.log # 일별 로그 (14일 자동 삭제) +├── stats/ +│ └── YYYY-MM-DD.json # 일별 사용 통계 (30일 자동 삭제) +├── templates/ +│ └── *.json # 프로젝트 스캐폴딩 사용자 템플릿 +└── plugins/ + └── *.dll # 외부 플러그인 (선택) +``` + +**자동 삭제 정책**: + +| 파일 | 보존 기간 | 방식 | +|------|----------|------| +| 로그 (`logs/app-*.log`) | 14일 | 앱 시작 시 1회 `PurgeOldLogs()` | +| 통계 (`stats/*.json`) | 30일 | 통계 기록 시 `PurgeOldFiles()` | +| 클립보드 히스토리 | 무기한 (최대 항목 수 제한) | `maxItems` 설정값 기준 FIFO | +| 기타 (settings, notes 등) | 무기한 | 수동 관리 | + +--- + +## 보안 고려사항 + +| 항목 | 구현 | +|------|------| +| URL 스킴 검증 | `http`, `https`, `ftp`, `ftps`, `ms-settings`, `mailto`, `file` 허용. `javascript:` 등 차단 | +| PowerShell 인젝션 방지 | `>` 명령어 입력의 `"` 이스케이프 처리 | +| ReDoS 방지 | 사용자 정의 Regex에 `TimeSpan` 타임아웃 적용 | +| 자격증명 저장 | Windows Credential Manager (`advapi32.dll`, DPAPI 암호화) | +| 클립보드 민감 데이터 | Regex 기반 제외 패턴 (`excludePatterns`) — 신용카드·IP 등 기본 차단 | +| API 타임아웃 | JSON 스킬 HTTP 요청 3초 제한 | +| 시스템 명령 확인 | 재시작·종료·로그아웃 실행 전 `MessageBox.Show` 2단계 확인 | +| **디컴파일 방지** | `Security/AntiTamper.cs` — 디버거 감지 (관리형+네이티브+원격), 디컴파일러 프로세스 감지 (dnSpy, ILSpy, dotPeek, x64dbg 등 15종), Release 빌드만 활성 | +| **PDB 제거** | Release 빌드 시 `DebugType=none`, `DebugSymbols=false`. build.bat에서 `.pdb`/`.xml` 전수 삭제 | +| **소스 링크 비활성** | `EnableSourceLink=false`, `EmbedAllSources=false` — 소스 코드 경로 노출 차단 | +| **난독화 호환** | `[assembly: Obfuscation]` 속성 적용. Obfuscar/ConfuserEx/Dotfuscator 연동 시 자동 난독화 | + +--- + +## 테마 커스터마이징 + +테마 XAML 파일(`Themes/*.xaml`)은 색상 14개 + 모양 2개 = **총 16개 ResourceKey**를 정의합니다: + +| 키 | 타입 | 용도 | +|----|------|------| +| `LauncherBackground` | SolidColorBrush | 전체 배경 | +| `ItemBackground` | SolidColorBrush | 항목 기본 배경 | +| `ItemSelectedBackground` | SolidColorBrush | 선택된 항목 배경 | +| `ItemHoverBackground` | SolidColorBrush | 호버 배경 | +| `PrimaryText` | SolidColorBrush | 주 텍스트 색상 | +| `SecondaryText` | SolidColorBrush | 보조 텍스트 색상 | +| `PlaceholderText` | SolidColorBrush | 플레이스홀더 텍스트 | +| `AccentColor` | SolidColorBrush | 강조색 (선택 바, 배지 등) | +| `SeparatorColor` | SolidColorBrush | 구분선 색상 | +| `HintBackground` | SolidColorBrush | 힌트 배경 | +| `HintText` | SolidColorBrush | 힌트 텍스트 | +| `BorderColor` | SolidColorBrush | 창 테두리 | +| `ScrollbarThumb` | SolidColorBrush | 스크롤바 색상 | +| `ShadowColor` | Color | 드롭 섀도우 색상 | +| `WindowCornerRadius` | CornerRadius | 창 전체 모서리 라운딩 | +| `ItemCornerRadius` | CornerRadius | 결과 항목 모서리 라운딩 | + +**테마별 모서리 라운딩 값**: + +| 테마 | WindowCornerRadius | ItemCornerRadius | 특징 | +|------|-------------------|-----------------|------| +| Dark / Light | 20 | 10 | 기본 부드러운 라운딩 | +| OLED | 26 | 13 | 가장 둥근 형태 | +| Catppuccin | 22 | 12 | 약간 더 둥근 파스텔 느낌 | +| Nord | 16 | 8 | 약간 각진 북유럽 스타일 | +| Monokai | 14 | 6 | 에디터 스타일 — 적당히 각진 | +| Sepia | 12 | 6 | 클래식하고 차분한 느낌 | +| Alfred / AlfredLight | 14 | 6 | Alfred 앱과 유사한 비율 | + +**트레이 컨텍스트 메뉴**: `TrayContextMenu.cs`의 `ModernTrayRenderer`는 런타임에 `Application.Current.Resources`에서 WPF 테마 색상(`LauncherBackground`, `AccentColor` 등)을 읽어 트레이 메뉴 배경·텍스트·호버 색상에 그대로 적용합니다. 테마를 전환하면 다음 메뉴 오픈 시 새 테마가 반영됩니다. + +**새 테마 추가 순서**: +1. `Themes/MyTheme.xaml` 작성 (위 16개 키 모두 정의, `WindowCornerRadius`·`ItemCornerRadius` 포함) +2. `.csproj`에 `` 추가 +3. `LauncherWindow.xaml.cs`의 `GetEffectiveThemeName()` switch에 케이스 추가 +4. `SettingsViewModel.ThemeCards` 목록에 `ThemeCardModel` 항목 추가 + +--- + +## 단위 테스트 + +```bash +dotnet test src/AxCommander.Tests +``` + +| 파일 | 테스트 수 | 대상 | +|------|----------|------| +| `FuzzyEngineTests.cs` | 19 | CalculateScore, FuzzyMatch, 초성 검색 | +| `ClipboardTransformTests.cs` | 21 | 12개 내장 변환기 | +| `SettingsServiceTests.cs` | 17 | 기본값, JSON 직렬화 라운드트립 | + +테스트 프로젝트는 `InternalsVisibleTo`로 `internal` 메서드에 접근합니다. + +--- + +## 코드 검토 이력 + +### v0.3 최종 검토 결과 (2026-03-24) + +전체 소스 코드 정적 분석 결과 **컴파일 오류 없음** 확인. v0.3 신규 코드 포함. + +| 검토 항목 | 결과 | +|----------|------| +| 타입 참조 (`Symbols.Lock`, `Symbols.MediaPlay`, `Symbols.Computer`) | ✅ 모두 `Themes/Symbols.cs`에 정의됨 | +| XAML 컨버터 (`BoolToVisibility`, `CountToVisibility`, `SymbolToBackground` 등) | ✅ `App.xaml`에 모두 등록됨 | +| ViewModel 바인딩 (`ShowActionModeBar`, `ActionModeBreadcrumb`, `ShowMergeHint`, `MergeHintText`) | ✅ `LauncherViewModel`에 모두 정의됨 | +| `LauncherItem` 생성자 호출부 (`Symbol:` named parameter) | ✅ SDK 레코드 시그니처 일치 | +| `ClipboardEntry` `IsText` / `Text` 프로퍼티 | ✅ `ClipboardHistoryService.cs`에 정의됨 | +| `HashSet` 동등성 | ✅ record 구조적 동등성 + 동일 객체 참조로 정상 작동 | +| `IndexEntry.Path` 프로퍼티 | ✅ `IndexService.cs`에 정의됨 | +| `FileAction` enum / `FileActionData` record 접근성 | ✅ 동일 파일(ViewModels) 내 정의, 접근 가능 | +| `LargeTypeWindow` 네임스페이스 | ✅ `AxCommander.Views` — LauncherWindow와 동일 네임스페이스, import 불필요 | +| `LauncherWindow.xaml` Grid.Row 번호 | ✅ Row 0~4 순서 정확 (0:입력, 1:액션바, 2:구분선, 3:병합힌트, 4:리스트) | + +--- + +## 버그 수정 이력 + +### v0.1 → v0.2 + +| 파일 | 문제 | 수정 내용 | +|------|------|----------| +| `InputListener.cs` | `LogService.Services.LogService.XXX()` — 존재하지 않는 네임스페이스 경로로 컴파일 오류 발생 | `using AxCommander.Services;` 추가 후 `LogService.XXX()` 직접 호출로 수정. 파일 하단의 빈 `namespace LogService { }` 선언 제거 | + +### v0.2 → v0.3 + +| 파일 | 변경 내용 | +|------|----------| +| `Core/HotkeyParser.cs` (신규) | 핫키 문자열 파싱/포맷 — `"Alt+Space"` ↔ `HotkeyDefinition` 변환 | +| `Core/InputListener.cs` | 하드코딩 Alt+Space 제거 → `HotkeyDefinition` 기반 동적 핫키 + `SuspendHotkey` 지원 | +| `Views/SettingsWindow.xaml/.cs` | Alfred 스타일 핫키 레코더 UI (클릭 → 배지 표시 → 키 입력 캡처) | +| `Views/LargeTypeWindow.xaml/.cs` (신규) | 전체 화면 Large Type 오버레이 | +| `ViewModels/LauncherViewModel.cs` | 파일 액션 모드 + 클립보드 병합 + Large Type 텍스트 추출 추가 | +| `Views/LauncherWindow.xaml` | 액션 모드 breadcrumb 바 (Row 1) + 병합 힌트 바 (Row 3) 추가 | +| `Views/LauncherWindow.xaml.cs` | `→`, `Shift+Enter`, `Shift+↑↓` 키 핸들러 추가 / Esc 액션모드 분기 | +| `App.xaml.cs` | 설정 저장 후 핫키 갱신 + SuspendHotkey 콜백 주입 | + +### v0.3 → v0.4 (Alfred 비교 기반 설정 UI 개선) + +| 파일 | 변경 내용 | +|------|----------| +| `Models/AppSettings.cs` | `LauncherSettings`에 `WebSearchEngine`, `SnippetAutoExpand`, `Position` 필드 추가 | +| `Handlers/WebSearchHandler.cs` | 기본 검색 엔진을 하드코딩에서 `settings.Launcher.WebSearchEngine` 런타임 읽기로 전환 / 불필요한 `using AxCommander.Models` 제거 | +| `App.xaml.cs` | `WebSearchHandler` 생성자에 `settings` 주입 | +| `Core/SnippetExpander.cs` | `HandleKey()` 진입부에 `SnippetAutoExpand` 비활성화 시 즉시 반환 추가 | +| `ViewModels/LauncherViewModel.cs` | `WindowPosition` 프로퍼티 추가 (설정 연동) | +| `Views/LauncherWindow.xaml.cs` | `CenterOnScreen()` — `position` 설정 연동 + `ActualHeight/Width = 0` 방어 처리 | +| `ViewModels/SettingsViewModel.cs` | `LauncherPosition`, `WebSearchEngine`, `SnippetAutoExpand` 바인딩 프로퍼티 추가 / `BatchCommandModel` 및 배치 명령 CRUD 추가 | +| `Views/SettingsWindow.xaml` | 일반 탭: 기본 검색 엔진·런처 위치 ComboBox 추가 / 스니펫 탭: 자동 확장 토글 추가 / 8번째 탭 배치 명령 탭 추가 | +| `Views/SettingsWindow.xaml.cs` | `AddBatchCommand_Click`, `DeleteBatchCommand_Click` 핸들러 추가 | + +**버그 수정**: + +| 파일 | 버그 | 수정 | +|------|------|------| +| `Views/LauncherWindow.xaml.cs` | `CenterOnScreen()` — 첫 `Show()` 호출 시 레이아웃 패스 이전 `ActualHeight`가 0이 되는 타이밍 이슈 | `var h = ActualHeight > 0 ? ActualHeight : 80` 방어 처리 추가 | +| `Handlers/WebSearchHandler.cs` | `using AxCommander.Models` — 파일 내 Models 타입 미사용 불필요한 임포트 | 해당 `using` 제거 | + +### v0.4 → v0.5 (배포 준비 + About 창 + 트레이 기능 강화) + +| 파일 | 변경 내용 | +|------|----------| +| `App.xaml.cs` | 자동 시작 토글 — `HKCU\...\Run` 레지스트리 읽기/쓰기, 트레이 메뉴 체크박스 항목 추가 | +| `App.xaml.cs` | "정보" 트레이 메뉴 항목 추가 → `AboutWindow` 오픈 | +| `Views/AboutWindow.xaml/.cs` (신규) | 개발자 정보 창 — 그라데이션 헤더, 마스코트 이미지, 개발 목적, 블로그 링크, 버전 정보 | +| `AxCommander.csproj` | `Assets/mascot.png/.jpg/.webp` 조건부 CopyToOutputDirectory 추가 | +| `Views/SettingsWindow.xaml` | 단축키 아이콘 E704(InkingTool) → E765(Keyboard) 수정 | +| `Views/LargeTypeWindow.xaml` | `LineHeight="1.2"` 제거 — WPF LineHeight는 픽셀 단위, 1.2px는 런타임 오류 유발 | +| `AxCommander.csproj` | `` 추가 — WPF+WinForms 동시 사용 시 `KeyEventArgs` 모호성 해소 | + +**설정 파일 경로 확인**: `%APPDATA%\AxCommander\settings.json` — 이미 올바른 경로 사용 중, 별도 변경 없음. + +**배포 방식**: `dotnet publish` → 단일 `.exe` 파일 (SelfContained, PublishSingleFile). 인스톨러 없이 EXE 복사 후 즉시 실행 가능. + +### v0.5 → v0.6 (Alfred 비교 기반 7개 기능 추가) + +| 파일 | 변경 내용 | +|------|----------| +| `Handlers/EmojiHandler.cs` (신규) | `emoji` 프리픽스, 300+ 이모지 내장 데이터베이스, 한/영 태그 검색, 클립보드 복사 | +| `Handlers/ColorHandler.cs` (신규) | `color` 프리픽스, HEX/RGB/RGBA/HSL/색상이름 → HEX+RGB+HSL+HSV 4종 변환 | +| `Handlers/SystemCommandHandler.cs` | `/timer`, `/alarm` 추가 — 시간 문자열 파싱(5m/1h30m/30s), Task.Delay 기반 백그라운드 타이머 | +| `Handlers/RecentFilesHandler.cs` (신규) | `recent` 프리픽스, Windows Recent .lnk 파싱, 최근순 정렬, 10초 캐시 | +| `Handlers/CalculatorHandler.cs` | `= 100 USD to KRW` 통화 변환 추가 — `CurrencyConverter` 내부 클래스, `open.er-api.com` 무료 API, 1시간 캐시, `async` 전환 | +| `Handlers/UninstallHandler.cs` (신규) | `uninstall` 프리픽스, 레지스트리 HKLM/HKCU/WOW6432Node 스캔, msiexec/exe 제거 실행 | +| `Handlers/NoteHandler.cs` (신규) | `note` 프리픽스, notes.txt append 저장, 역순 조회, clear 명령, ValueTuple 명시적 패턴 매칭 | +| `Services/NotificationService.cs` (신규) | static delegate 패턴 — App.xaml.cs에서 트레이 아이콘과 연결, 타이머/알람 알림에 사용 | +| `Themes/Symbols.cs` | Emoji/ColorPicker/Timer/RecentFiles/Currency/Uninstall/Note 심볼 추가 | +| `App.xaml.cs` | 5개 핸들러 등록 (Emoji/Color/Recent/Note/Uninstall) + `NotificationService.Initialize()` 연결 | + +**버그 수정**: + +| 파일 | 버그 | 수정 | +|------|------|------| +| `Handlers/NoteHandler.cs` | `case ("__SAVE__", string content):` — `object?` 타입에 대한 positional 패턴 컴파일 불안정 | `case ValueTuple t when t.Item1 == "__SAVE__":` 명시적 타입 패턴으로 변경 | +| `Themes/Symbols.cs` | `Warning` 상수 중복 정의 (신규 추가 시 실수) | 하단 중복 제거 | + +### v0.6 → v0.7 (개발자 도구 + 화면 캡처 + 랭킹 시스템) + +| 파일 | 변경 내용 | +|------|----------| +| `Handlers/PortHandler.cs` (신규) | `port` 프리픽스, TCP 활성 연결 조회, 포트번호/프로세스명 검색, netstat -ano PID 매핑 | +| `Services/UsageRankingService.cs` (신규) | 실행 빈도 JSON 저장(`usage.json`), `SortByUsage()` 제공 | +| `Core/CommandResolver.cs` | 퍼지 검색 결과를 `UsageRankingService.SortByUsage()`로 재정렬, IndexEntry 실행 시 `RecordExecution()` 호출 | +| `Handlers/EnvHandler.cs` (신규) | `env` 프리픽스, 우선순위 환경변수 20개 표시, 키/값 모두 검색, Enter로 복사 | +| `Handlers/JsonHandler.cs` (신규) | `json` 프리픽스, 클립보드 또는 인라인 JSON 파싱, `format`/`minify` 서브커맨드, `System.Text.Json` 내장 | +| `Handlers/EncodeHandler.cs` (신규) | `encode ` 프리픽스(뒤 공백), base64/url/hex/md5/sha1/sha256/sha512/html 인코딩 + decode 접두사로 역변환 | +| `Services/WindowTracker.cs` (신규) | `GetForegroundWindow()` P/Invoke, `Capture()` 호출 시 PreviousWindow 저장 | +| `Handlers/SnapHandler.cs` (신규) | `snap` 프리픽스, left/right/top/bottom/full/tl/tr/bl/br/center/restore, `SetWindowPos` + `GetMonitorInfo` | +| `Handlers/ScreenCaptureHandler.cs` (신규) | `cap` 프리픽스, screen(전체)/window(창)/scroll(스크롤 캡처), `PrintWindow`+`BitBlt`, 오버랩 검출 스티칭, `%USERPROFILE%\Pictures\Screenshots\` 저장 | +| `Themes/Symbols.cs` | PortIcon/EnvVar/JsonValid/JsonFormat/JsonMinify/EncodeIcon/SnapLayout/CaptureIcon/ScrollCapture 심볼 추가 | +| `App.xaml.cs` | 6개 핸들러 등록 (Port/Env/Json/Encode/Snap/ScreenCapture) + `OnHotkeyTriggered()`에 `WindowTracker.Capture()` 추가 | + +**v0.7 코드 검토 후 즉시 수정 (버그 픽스):** + +| 파일 | 수정 내용 | +|------|----------| +| `Handlers/PortHandler.cs` | `GetPidForPort()`가 루프마다 `netstat -ano` 실행하던 N+1 문제 → `RefreshProcessCache()` 내부에서 netstat 1회 실행 후 `_pidMap(포트→PID)` 캐시 구축. `GetPidForPort()`는 캐시 조회만 수행 | +| `Handlers/ScreenCaptureHandler.cs` | `AreSimilar()`/`FindOverlap()`의 `GetPixel()` 픽셀 비교 → `LockBits + unsafe 포인터` 연산으로 교체 (~50× 속도 향상) | +| `ViewModels/LauncherViewModel.cs` | `PrefixMap`에 v0.6 핸들러(emoji/color/recent/note/uninstall) + v0.7 핸들러(port/env/json/encode/snap/cap) + `/`(SystemCommand) 누락 항목 일괄 추가. `kill`/`media`/`info` 키를 공백 포함 버전으로 수정 | +| `AxCommander.csproj` | `true` 추가 | + +**스크롤 캡처 동작 방식**: +1. `WindowTracker.PreviousWindow`에 저장된 이전 활성 창을 포그라운드로 활성화 +2. `PrintWindow(PW_RENDERFULLCONTENT=2)` 또는 `CopyFromScreen` 폴백으로 첫 프레임 캡처 +3. `WM_VSCROLL SB_PAGEDOWN` (스크롤 가능 자식 창이 있는 경우) 또는 `WM_KEYDOWN VK_NEXT` 전송 +4. 120ms 대기 후 재캡처, 이전 프레임 하단 20%와 비교하여 97% 이상 유사하면 스크롤 종료 감지 → 중단 +5. 각 프레임 사이 오버랩 픽셀 수를 픽셀 샘플링으로 계산하여 비겹치는 부분만 수직 스티칭 +6. 결과를 `%USERPROFILE%\Pictures\Screenshots\scroll_yyyyMMdd_HHmmss.png`로 저장 + 클립보드 복사 + +**실행 빈도 랭킹 동작 방식**: +- 퍼지 검색(파일/앱/폴더) 실행 시 `IndexEntry.Path`를 키로 카운트 증가 +- `usage.json`에 비동기 저장 (앱 종료 시에도 누적됨) +- 다음 검색부터 `SortByUsage`로 상위 항목이 결과 목록 최상단에 표시 + +### About 창 (`AboutWindow`) + +``` +┌─────────────────────────────┐ +│ [블루-퍼플 그라데이션 헤더] │ +│ (마스코트 이미지 원형) │ +│ AX Commander │ +│ v1.0 │ +├─────────────────────────────┤ +│ ┌─── 개발 목적 배너 ─────────┐ │ +│ │ 업무 편의성 증가 및 LLM ... │ │ +│ └─────────────────────────┘ │ +│ │ +│ 🏢 AX연구소 AI팀 │ +│ 백승재 · SW Architect │ +│ 🔗 www.swarchitect.net │ +│ │ +│ AX Commander · .NET 8 │ +└─────────────────────────────┘ +``` + +- 앱 아이콘: `Assets/icon.ico` — 다이아몬드 픽셀 보석 컷 디자인 (Blue/Green/Red/Green 4색, 흰색 facet 선) + - 7개 크기 (16, 24, 32, 48, 64, 128, 256px) 포함 + - `tools/IconGenerator/` 콘솔 앱으로 재생성 가능: `dotnet run -- <출력경로>` + - SVG 원본: `Assets/diamond_pixel.svg` +- 마스코트 이미지: `Assets/mascot.png` (또는 .jpg/.webp) 존재 시 자동 로드, 없으면 앱 아이콘 표시 +- 정보 창: 초기 표시 시 앱 아이콘, 개발자 이름 클릭 시 마스코트 오버레이 +- 창 드래그 이동 가능 (`MouseDown` → `DragMove`) +- 블로그 링크 클릭 시 기본 브라우저로 열기 + +--- + +## v0.7 3차 전체 점검 수정 (버그·보안·스레딩) + +> 빌드 오류 3건, 컴파일 경고 1건, 런타임 버그 6건, 보안 이슈 2건을 수정하였습니다. + +### 컴파일 오류 수정 + +| 파일 | 수정 내용 | 오류 코드 | +|------|----------|----------| +| `Services/UsageRankingService.cs` | `using System.IO;` 누락 추가 (`Path`, `File`, `Directory` 인식 불가) | CS0103 | +| `Views/SettingsWindow.xaml.cs` | `Key.Enter`와 `Key.Return` 중복 switch 케이스 → `Key.Enter or Key.Return` 단일 arm으로 통합 | CS8510 | +| `Core/ContextManager.cs` | `EnumDisplayMonitors` 콜백 람다 파라미터 혼합 타입 (`ref RECT` + 암시적 `_`) → 전체 명시적 타입으로 수정 (×2) | CS0748 | +| `Assets/icon.ico` | 아이콘 파일 누락 → 다이아몬드 픽셀 보석 아이콘으로 교체 (`tools/IconGenerator`로 생성, 7크기 ICO) | CS7064 | +| `Views/SettingsWindow.xaml.cs` | `NewIndexPathBox` nullable 역참조 → null 조건 추가 | CS8602 | + +### 런타임 버그 수정 + +| 파일 | 수정 내용 | 심각도 | +|------|----------|-------| +| `Handlers/JsonSkillLoader.cs` | `NavigatePath`: `field[0` 같이 `]` 없는 경로 파싱 시 `IndexOf` 반환 −1로 인한 예외 → `closingIdx < 0` 조기 반환 추가 | HIGH | +| `Services/ClipboardHistoryService.cs` | `_ignoreNext` 플래그를 `volatile bool`로 선언하여 스레드 간 가시성 보장 | MEDIUM | +| `Services/ClipboardHistoryService.cs` | `Initialize()` 호출 시 이미 초기화된 경우(`_msgSource != null`) 또는 `Dispose()` 후 재호출 방지 가드 추가 | MEDIUM | +| `Services/ClipboardHistoryService.cs` | `Dispose()` 중복 호출 방지를 위한 `_disposed` 플래그 추가 | MEDIUM | +| `Services/IndexService.cs` | `ScheduleRebuild`: `_debounceTimer` 교체 시 비원자적 Dispose + 재할당을 `_timerLock` 으로 보호 | MEDIUM | +| `Services/SettingsService.cs` | settings.json 백업 실패 시 빈 `catch {}` → `LogService.Warn`으로 원인 기록 | MEDIUM | + +### 보안 수정 + +| 파일 | 수정 내용 | 심각도 | +|------|----------|-------| +| `Handlers/JsonSkillLoader.cs` | `ExecuteAsync`: `item.ActionUrl` 실행 전 `http`/`https` 스킴 검증 추가 — API 응답이 조작된 `file://` 등 비표준 URL 실행 방지 | MEDIUM | + +### 데드 코드 제거 + +| 파일 | 수정 내용 | +|------|----------| +| `Handlers/SystemCommandHandler.cs` | `allCommands` 목록에서 `timer`·`alarm` no-op 항목 제거 — 두 명령은 `q.StartsWith` early-return으로 완전히 처리되며, `Action = () => Task.CompletedTask` 항목은 클릭 시 아무것도 하지 않아 사용자 혼란 유발 | + +--- + +## v0.7 2차 코드 검토 수정 (컴파일러 경고 제거) + +| 파일 | 수정 내용 | 경고 코드 | +|------|----------|----------| +| `Services/UsageRankingService.cs` | `using AxCommander.Services;` 자기 자신 namespace import 제거 | CS0105 | +| `Handlers/PortHandler.cs` | `UdpStatistics? udpStats = null;` 미사용 변수 제거 | CS0219 | +| `Handlers/PortHandler.cs` | `using System.Net;` 미사용 using 제거 (모든 네트워크 타입은 `System.Net.NetworkInformation`에서 확보) | IDE0005 | +| `Handlers/ScreenCaptureHandler.cs` | 미사용 P/Invoke `keybd_event` 선언 제거 (실제 키 전송은 `SendMessage`로 구현) | CS0649 | +| `Handlers/ScreenCaptureHandler.cs` | 미사용 상수 `KEYEVENTF_KEYUP`, `SB_BOTTOM` 제거 | CS0219 | +| `Handlers/SnapHandler.cs` | 주석 `"snap " 프리픽스` → `"snap" 프리픽스` (실제 Prefix 필드와 일치) | 문서 오류 | + +### v0.7 → v0.8 (UI 개선 + 명령 별칭 + 사용 통계) + +| 파일 | 변경 내용 | +|------|----------| +| `Views/SettingsWindow.xaml` | 스니펫 탭 "추가" 버튼 `Width="60"` → `MinWidth="72"` (텍스트 잘림 수정) | +| `Models/AppSettings.cs` | `SystemCommandSettings`에 `CommandAliases` 딕셔너리 추가 | +| `Handlers/SystemCommandHandler.cs` | `GetItemsAsync` 필터링에 별칭 매칭 추가 — `/잠금`, `/l` 등 사용자 정의 별칭으로도 명령 접근 가능 | +| `ViewModels/SettingsViewModel.cs` | `AliasLock`·`AliasSleep`·`AliasRestart`·`AliasShutdown`·`AliasHibernate`·`AliasLogout`·`AliasRecycle` 7개 별칭 프로퍼티 추가 / `ResetSystemCommandAliases()` 추가 | +| `Views/SettingsWindow.xaml` | 시스템 탭 행을 4열 레이아웃으로 재설계 — [아이콘][이름/프리픽스][별칭 TextBox][토글], "별칭 기본값 초기화" 버튼 추가 | +| `Views/SettingsWindow.xaml.cs` | `ResetCommandAliases_Click` 핸들러 추가 | +| `Models/DailyUsageStats.cs` (신규) | 일별 사용 통계 데이터 모델 — `LauncherOpens`, `CommandUsage`, `ActiveSeconds` | +| `Services/UsageStatisticsService.cs` (신규) | static 통계 서비스 — `%APPDATA%\AxCommander\stats\YYYY-MM-DD.json` 저장, 30일 롤링 삭제, `RecordLauncherOpen()` / `RecordCommandUsage()` / `AddActiveSeconds()` / `GetStats()` | +| `Services/SessionTrackingService.cs` (신규) | `SystemEvents.SessionSwitch` 기반 PC 활성 시간 추적 — 잠금 시 누적 초 기록, 해제 시 타이머 재개, `Dispose()` 시 플러시 | +| `ViewModels/StatisticsViewModel.cs` (신규) | `DayBarItem` / `CommandStatItem` 레코드, `LauncherOpenBars` / `ActiveTimeBars` / `TopCommands` 컬렉션, 요약 카드 문자열 | +| `Views/StatisticsWindow.xaml` (신규) | 다크 그라데이션 헤더, 4개 요약 카드, 런처 호출 막대 차트 (최근 14일), PC 활성 시간 막대 차트 (최근 14일), 상위 명령 순위 목록 | +| `Views/StatisticsWindow.xaml.cs` (신규) | 드래그 이동, 새로고침/닫기 버튼 핸들러 | +| `Views/TrayContextMenu.cs` | `GlyphStats = "\uE9D9"` (Chart) 상수 추가 | +| `App.xaml.cs` | `_sessionTracking` 필드 추가, `OnHotkeyTriggered()`에 `UsageStatisticsService.RecordLauncherOpen()` 추가, 트레이 메뉴 "사용 통계" 항목 추가, `OnExit()`에 `_sessionTracking?.Dispose()` 추가 | +| `Core/CommandResolver.cs` | `ExecuteAsync()`에 명령 사용 통계 기록 추가 — 프리픽스 + 첫 단어를 키로 `UsageStatisticsService.RecordCommandUsage()` 호출 | + +**사용 통계 데이터 저장 경로**: `%APPDATA%\AxCommander\stats\` + +**일별 JSON 형식**: +```json +{ + "date": "2026-03-26", + "launcherOpens": 42, + "commandUsage": { "/lock": 3, "=": 8, ";addr": 5 }, + "activeSeconds": 18432 +} +``` + +**차트 구성**: +- 런처 호출 횟수: 최근 14일 막대 차트 (오늘 강조) +- PC 활성 시간: 최근 14일 막대 차트 (초 → 시간 환산) +- 상위 명령: 30일 합산 Top 10, 순위 + 명령키 + 사용횟수 + 비율 바 + +**빌드 검증**: `dotnet build --output "C:/Temp/axtest"` — **0 errors, 0 warnings** 확인 + +### v0.8 → v0.9 (UX 버그 수정 + 클립보드 영속성 + 다국어 + 단일 인스턴스) + +| 파일 | 변경 내용 | +|------|----------| +| `Views/LauncherWindow.xaml` | `Window` 요소에 `PreviewKeyDown="Window_PreviewKeyDown"` 추가. TextBox에서 키 핸들러 제거 (ScrollViewer 키 소비 문제 해결) | +| `Views/LauncherWindow.xaml.cs` | `Window_PreviewKeyDown` 으로 Escape·Enter·Down·Up·Right·Tab 일괄 처리. Tab 커서 위치를 `Dispatcher.BeginInvoke(DispatcherPriority.Input)`으로 뒤로 이동 수정. `Window_KeyDown`은 Ctrl+, 전담 | +| `Services/ClipboardHistoryService.cs` | JSON 영속성 추가 — `%APPDATA%\AxCommander\clipboard_history.json`. `Initialize()` 시 로드, 항목 변경·삭제 시 비동기 저장, `Dispose()` 시 동기 저장 | +| `Handlers/ClipboardHistoryHandler.cs` | 클립보드 항목 선택 후 이전 창 포커스 복원 + Ctrl+V 자동 붙여넣기. `SetForegroundWindow` P/Invoke 추가, 150ms 딜레이 후 `WindowTracker.PreviousWindow`로 포커스 이동 | +| `App.xaml.cs` | 단일 인스턴스 Mutex (`Global\\AXCommander_SingleInstance`) 추가. 중복 실행 시 안내 메시지 후 `Shutdown()`. 트레이 `DoubleClick` → `MouseClick` (좌클릭 한 번으로 런처 토글). `L10n.SetLanguage(settings.Settings.Launcher.Language)` 호출 추가. `OnExit()`에 Mutex 해제 추가 | +| `Services/SettingsService.cs` | `CreateDefaults()` 에서 `D:\Non_Document` 존재 시 인덱스 경로에 자동 추가 | +| `Services/L10n.cs` (신규) | 정적 다국어 서비스 — `L10n.SetLanguage(lang)` / `L10n.Get(key)`. 지원 언어: ko·en·ja·zh·vi. 키: placeholder·loading·no_results·clipboard_empty·merge_hint 등 | +| `Models/AppSettings.cs` | `LauncherSettings`에 `Language` 프로퍼티 추가 (`"ko"` 기본값) | +| `ViewModels/SettingsViewModel.cs` | `Language` 프로퍼티 추가, `Save()` 시 `L10n.SetLanguage()` 호출 | +| `ViewModels/LauncherViewModel.cs` | `PlaceholderText` → `L10n.Get("placeholder")` 반환 | +| `Views/SettingsWindow.xaml` | 일반 탭 상단에 언어 선택 ComboBox 추가 (한국어/English/日本語/中文/Tiếng Việt) | +| `Handlers/HelpHandler.cs` | 헤더 항목 `Data = "__HELP_OVERVIEW__"` 설정. `ExecuteAsync` 에서 `HelpDetailWindow` 열기 | +| `Views/HelpDetailWindow.xaml` (신규) | 프레임리스 다크 창 (720×640). 모든 도움말 항목을 카드 형태로 표시. ESC 닫기, 드래그 이동 | +| `Views/HelpDetailWindow.xaml.cs` (신규) | `HelpItemModel` 클래스 (Category·Command·Title·Description·Example·Symbol·ColorBrush) | +| `Views/` | `AboutWindow`에 `mascot.png` 이미지 표시 — `Assets/mascot.png` 파일이 있을 때만 표시 (없으면 공간 숨김) | + +**방향키 내비게이션 버그 원인 및 수정**: + +TextBox 내부의 `PART_ContentHost`(ScrollViewer)가 터널링 단계(PreviewKeyDown)에서 Up/Down 키를 소비하므로 TextBox 레벨 이벤트 핸들러로는 차단 불가. 수정: Window 레벨 `PreviewKeyDown`으로 이동 — Window는 터널링 최상위이므로 모든 자식 요소보다 먼저 키 이벤트를 수신. + +**Tab 커서 위치 버그 원인 및 수정**: + +`_vm.InputText = title` 바인딩 업데이트는 렌더링 사이클 이후에 TextBox에 반영되므로 직후 `CaretIndex`를 설정해도 바인딩이 덮어씀. 수정: `Dispatcher.BeginInvoke(() => InputBox.CaretIndex = ..., DispatcherPriority.Input)` 으로 다음 입력 처리 사이클에 커서 위치 설정. + +**클립보드 히스토리 JSON 형식** (`clipboard_history.json`): +```json +[ + { "text": "복사한 텍스트", "ts": "2026-03-26T10:30:00" }, + { "text": "이전 복사", "ts": "2026-03-26T10:25:00" } +] +``` +이미지 타입은 직렬화하지 않음 (텍스트 전용 저장). + +**빌드 검증**: `dotnet build --output "C:/Temp/axtest3"` — **0 errors, 0 warnings** 확인 + +### v0.9 2차 (잠금 해제 알림 + 화면 캡처 설정 + 테마 모양 + 트레이 메뉴 개선) + +| 파일 | 변경 내용 | +|------|----------| +| `Assets/Quotes/famous.json` (신규) | 내장 명언 500개 JSON (EmbeddedResource) — 동서양 철학자·사상가·과학자·경영자·작가·한국 위인 등 다양한 인물 | +| `Services/QuoteService.cs` (신규) | `GetRandomQuote()` — `famous.json` EmbeddedResource 로드, 앱 생애 동안 한 번만 파싱, 랜덤 반환 | +| `Services/WorktimeReminderService.cs` (신규) | `SessionTrackingService`로부터 잠금 해제 이벤트를 구독하여 누적 사용시간 계산. 설정한 간격(30~240분) 이상 경과 시 `ReminderPopupWindow` 표시. `enabled` 설정이 꺼져 있으면 즉시 비활성 | +| `Views/ReminderPopupWindow.xaml/.cs` (신규) | 잠금 해제 팝업 — 사용 시간·격려 문구·명언 표시. 설정한 화면 모서리(4방향)에 위치. `SetNoActivate()` P/Invoke로 포커스 비활성 상태 유지. 설정한 초 후 자동 닫힘 | +| `Models/AppSettings.cs` | `ScreenCaptureSettings` 중첩 클래스 추가 (`Prefix`, `SaveToFile`, `SavePath`). `ReminderSettings` 중첩 클래스 추가 (`Enabled`, `Position`, `IntervalMinutes`, `AutoDismissSeconds`) | +| `Views/SettingsWindow.xaml/.cs` | 캡처 탭 추가 — `cap` 프리픽스 TextBox, 파일 저장 토글, 저장 경로 TextBox+폴더 선택 버튼. 알림 탭 추가 — 활성화 토글, 위치 ComboBox(4방향), 간격 ComboBox(30/60/120/240분), 자동 닫힘 ComboBox(5/10/15/20/30초) | +| `ViewModels/SettingsViewModel.cs` | `CapPrefix`, `SaveToFile`, `SavePath`, `ReminderEnabled`, `ReminderPosition`, `ReminderIntervalMinutes`, `ReminderAutoDismissSeconds` 프로퍼티 추가 | +| `Handlers/ScreenCaptureHandler.cs` | `Prefix` 프로퍼티를 `settings.ScreenCapture.Prefix` 런타임 값으로 교체. 캡처 성공 시 `settings.ScreenCapture.SaveToFile`이 true면 `SavePath`(빈 값이면 기본 경로)에 PNG 파일 저장 | +| `App.xaml.cs` | `WorktimeReminderService` 초기화 + `SessionTrackingService`와 연결. `OnExit()`에 `_worktimeReminder?.Dispose()` 추가 | +| `Themes/*.xaml` (9개 파일) | 각 테마에 `WindowCornerRadius`·`ItemCornerRadius` `CornerRadius` 리소스 추가 (테마별 고유 값 적용) | +| `Views/LauncherWindow.xaml` | 창 최상위 `Border.CornerRadius` → `{DynamicResource WindowCornerRadius}`. 항목 `ControlTemplate Border.CornerRadius` → `{DynamicResource ItemCornerRadius}` | +| `Views/LauncherWindow.xaml.cs` | `BuildCustomDictionary()`에 `WindowCornerRadius`·`ItemCornerRadius` 기본값(20, 10) 추가 | +| `Views/TrayContextMenu.cs` | `DarkTrayRenderer`/`DarkColorTable` → `ModernTrayRenderer`/`ModernColorTable` 전면 재작성. WPF `Application.Current.Resources`에서 `LauncherBackground`·`AccentColor`·`PrimaryText` 등을 읽어 테마 색상 반영. `SetWindowRgn` P/Invoke로 메뉴 창 모서리 라운딩. 시작 시 자동실행 항목 글리프 → 전구(`\uE82F`), 활성 시 앰버 색상(`#FFB300`) + 후광 효과. `OnRenderItemCheck` 빈 override로 기본 체크마크 억제 | +| `Themes/Symbols.cs` | `ReminderBell = "\uEA8F"` (벨 아이콘) + `Lightbulb = "\uE82F"` (전구 아이콘) 추가 | +| `Handlers/HelpHandler.cs` | `cap` 항목: 프리픽스 변경 가능·파일 저장 경로 설명 추가. `info` 항목: 커맨드 표시 `"info · *"`, `*` 단축키 설명 추가. 신규 `알림` 카테고리 항목 추가 (잠금 해제 사용시간 알림) | + +**WorktimeReminderService 동작 흐름**: +``` +SessionTrackingService.Unlocked 이벤트 + → WorktimeReminderService.OnUnlocked() + → 설정 disabled? → 무시 + → 마지막 알림 이후 경과 시간 < IntervalMinutes? → 무시 + → ReminderPopupWindow(사용시간, 명언) 표시 (Dispatcher.Invoke) + → _lastReminderTime 갱신 +``` + +**트레이 메뉴 `ThemeColor()` 헬퍼**: +```csharp +private static Color ThemeColor(string key, Color fallback) +{ + try { + if (Application.Current?.Resources[key] + is System.Windows.Media.SolidColorBrush b) + return Color.FromArgb(b.Color.A, b.Color.R, b.Color.G, b.Color.B); + } catch { } + return fallback; +} +``` +WPF ResourceDictionary를 WinForms GDI 렌더러에서 안전하게 읽기 위해 try/catch로 감쌉니다. + +**빌드 검증**: `dotnet build` — **0 errors, 0 warnings** 확인 + +### v0.9 3차 (보안 강화 + 글로벌 캡처 단축키 + 영역 미세조정) + +| 파일 | 변경 내용 | +|------|----------| +| `Services/ClipboardHistoryService.cs` | 클립보드 히스토리 저장을 **DPAPI 암호화**로 전환. `clipboard_history.json`(평문) → `clipboard_history.dat`(DPAPI). 구버전 평문 파일 자동 마이그레이션 + 원본 삭제. `DataProtectionScope.CurrentUser` — 현재 Windows 사용자 계정에서만 복호화 가능 | +| `AxCommander.csproj` | `System.Security.Cryptography.ProtectedData 8.0.0` NuGet 패키지 추가 (로컬 전용, 네트워크 통신 없음) | +| `Models/AppSettings.cs` | `ScreenCaptureSettings`에서 `SaveToFile`, `SavePath` 완전 제거 (보안 정책). `GlobalHotkeyEnabled`, `GlobalHotkey`, `GlobalHotkeyMode`, `ScrollDelayMs` 추가. `CustomThemeColors`에 `WindowCornerRadius`, `ItemCornerRadius` 추가 | +| `Handlers/ScreenCaptureHandler.cs` | 파일 저장 로직(`ShouldSave`, `GetSaveDir`, `bmp.Save()`) 전면 제거 — 캡처 결과는 **클립보드에만 복사**. `CaptureDirectAsync(mode)` public 메서드 추가 (글로벌 단축키용). 스크롤 딜레이 하드코딩 120ms → `ScrollDelayMs` 설정값 사용 | +| `Core/InputListener.cs` | `_captureHotkey` + `CaptureHotkeyTriggered` 이벤트 추가. `UpdateCaptureHotkey(string, bool)` 메서드로 캡처 단축키 동적 등록/해제 | +| `Core/HotkeyParser.cs` | `PrintScreen`(0x2C), `Pause`(0x13), `ScrollLock`(0x91) 키 추가 | +| `App.xaml.cs` | `OnCaptureHotkeyTriggered` 핸들러 추가 — 런처 없이 `CaptureDirectAsync` 직접 호출. 설정 저장 시 캡처 단축키 갱신 | +| `ViewModels/SettingsViewModel.cs` | `CapGlobalHotkeyEnabled`, `CapGlobalHotkey`, `CapGlobalMode`, `CapScrollDelayMs/Str`, `CustomWindowCornerRadius`, `CustomItemCornerRadius` 프로퍼티 + Load/Save | +| `Views/SettingsWindow.xaml` | 캡처 탭: 파일 저장 UI 전면 제거, 글로벌 단축키 섹션 추가 (활성 토글·키 레코더·모드 선택·기본값 복원), 스크롤 딜레이 ComboBox. 색상 편집 탭: "모양 (모서리 라운딩)" 섹션 + 슬라이더 2개 (창/항목) | +| `Views/SettingsWindow.xaml.cs` | `CapHotkeyRecorder_PreviewKeyDown` 키 녹화 핸들러, `ResetCapGlobalHotkey_Click` 추가 | +| `Views/LauncherWindow.xaml.cs` | `BuildCustomDictionary()`가 커스텀 `WindowCornerRadius`/`ItemCornerRadius` 설정값 적용 (기존 하드코딩 20/10 → 사용자 값) | +| `Views/LauncherWindow.xaml` | 액션 breadcrumb 바 하드코딩 `#4B5EFC` → `{DynamicResource AccentColor}` 교체 | +| `Views/RegionSelectWindow.xaml.cs` | `_endPoint` 필드 추가, 드래그 종료 후 화살표 키(1px/Shift 10px) 미세조정 + Enter 확정 지원 | +| `Views/TrayContextMenu.cs` | `SetWindowRgn` 실패 시 `DeleteObject(rgn)` 호출 → GDI 핸들 누수 수정 | +| `Handlers/HelpHandler.cs` | `_entries.Length - 6` 하드코딩 → `_entries.Count(e => e.Category != "키보드")` 동적 계산. `cap` 항목 설명에 글로벌 단축키 언급 추가 | +| `Views/ReminderPopupWindow.xaml.cs` | `GetWindowLong`/`SetWindowLong` → `GetWindowLongPtr`/`SetWindowLongPtr` 64비트 안전 교체. 타이머 Tick 핸들러 해제. Esc 키 닫기 지원 | +| `Services/WorktimeReminderService.cs` | `lock(_lock)` 스레드 동기화 추가 (SessionSwitch 백그라운드 스레드 ↔ UI 스레드 레이스 컨디션 해소). `IntervalMinutes` 최소값 보호 (`Math.Max(1, ...)`) | + +**보안 정책 변경**: +- 캡처: 파일 저장 기능 코드에서 완전 제거. 설정 UI에도 없음. 클립보드에만 복사. +- 클립보드 히스토리: DPAPI `DataProtectionScope.CurrentUser`로 암호화 저장. 파일 확장자 `.json` → `.dat`. 다른 사용자/PC에서 열 수 없음. +- 통계(`stats/*.json`): 민감 데이터 아님, 암호화 미적용. + +**빌드 검증**: `dotnet build` — **0 errors, 0 warnings** 확인 + +### v0.9 → v1.0 (정식 릴리스 — 유틸리티 8종 + 스포이드 + 서비스 관리) + +| 파일 | 변경 내용 | +|------|----------| +| `Handlers/ColorPickHandler.cs` (신규) | `pick` 프리픽스. 전체 화면 스포이드 모드(`EyeDropperWindow`) → 클릭 지점 색상 HEX 코드 추출 → 반투명 결과 창(`ColorPickResultWindow`) 5초 표시 → 클립보드 복사 | +| `Views/EyeDropperWindow.xaml/.cs` (신규) | 전체 화면 투명 오버레이. 마우스 따라다니는 돋보기 원 + 실시간 HEX 코드 레이블. `GetPixel` P/Invoke로 화면 픽셀 색상 읽기. 좌클릭 확정, 우클릭/Esc 취소 | +| `Views/ColorPickResultWindow.xaml/.cs` (신규) | 반투명 다크 팝업. 색상 미리보기 원 + HEX/RGB 텍스트 + 자동 닫힘 5초 타이머 | +| `Handlers/DateCalcHandler.cs` (신규) | `date` 프리픽스. `+30d`/`-100d` 가감, D-day 계산, Unix timestamp ↔ 날짜 변환, 요일·ISO 주차, `date unix` 현재 타임스탬프 | +| `Handlers/ServiceHandler.cs` (신규) | `svc` 프리픽스. `ServiceController` API로 Windows 서비스 검색·상태 조회. `svc start/stop/restart [이름]`으로 제어(관리자 권한 UAC). `svc restart clipboard` → AX 클립보드 히스토리 서비스 강제 재시작 | +| `Services/ClipboardHistoryService.cs` | `Reinitialize()` 메서드 추가 — Dispose 후 내부 상태 초기화 + 클립보드 모니터링 재개 | +| `AxCommander.csproj` | `System.ServiceProcess.ServiceController 8.0.1` NuGet 패키지 추가 (로컬 전용) | +| `Handlers/TextStatsHandler.cs` (신규) | `stats` 프리픽스. 클립보드 텍스트 글자·단어·줄 수, UTF-8 바이트, 키워드 빈도(Top 5), 읽기 시간 추정, 특정 키워드 검색 | +| `Handlers/FavoriteHandler.cs` (신규) | `fav` 프리픽스. 자주 쓰는 파일·폴더 경로를 `favorites.json`에 저장, `fav add/del` 서브커맨드 | +| `Handlers/RenameHandler.cs` (신규) | `rename` 프리픽스. 폴더\패턴 파일 목록, 템플릿 변수 `{n}`순번 `{date}`날짜 `{orig}`원본명, 미리보기 후 실행 | +| `Handlers/MonitorHandler.cs` (신규) | `monitor` 프리픽스. CPU·메모리(`GlobalMemoryStatusEx`)·디스크·가동시간·Top 5 프로세스 | +| `Handlers/ScaffoldHandler.cs` (신규) | `scaffold` 프리픽스. 내장 5개 + 사용자 JSON 템플릿 | +| `Themes/Symbols.cs` | EyeDropper·DateIcon·ServiceIcon + TextStats·Favorite·RenameIcon·MonitorIcon·ScaffoldIcon 8개 심볼 추가 | +| `Handlers/ClipboardPipeHandler.cs` (신규) | `pipe` 프리픽스. 19종 필터를 `>` 체이닝 — upper/lower/trim/sort/unique/reverse/number/quote/b64e/b64d/urle/urld/md/lines/count/csv/tab/trimall 등 | +| `Handlers/JournalHandler.cs` (신규) | `journal` 프리픽스. `UsageStatisticsService` 데이터 기반 업무 일지 마크다운 자동 생성 (활성 시간, 런처 호출, 명령어 사용 순위) | +| `Handlers/RoutineHandler.cs` (신규) | `routine` 프리픽스. `routines.json` + 내장 2개(morning/endofday). 앱·폴더·URL·명령을 순서대로 일괄 실행 | +| `Handlers/BatchTextHandler.cs` (신규) | `batch` 프리픽스. 클립보드 각 줄에 동시 변환 — prefix/suffix/wrap/number/sort/unique/trim/replace/csv/split/indent 등 14종 | +| `Handlers/DiffHandler.cs` (신규) | `diff` 프리픽스. 클립보드 최근 2개 비교 + 파일 2개 경로 비교 + **파일 선택 다이얼로그(OpenFileDialog)** 지원 | +| `Handlers/WindowSwitchHandler.cs` (신규) | `win` 프리픽스. `EnumWindows` P/Invoke로 열린 창 목록 조회·검색, `SetForegroundWindow`로 즉시 전환. 최소화 창 자동 복원 | +| `Handlers/HelpHandler.cs` | 14개 신규 핸들러 도움말 항목 추가 | +| `Views/HelpDetailWindow.xaml/.cs` | **카테고리별 페이지네이션 재설계** — 상단 카테고리 탭 바 + ← → 키 페이지 전환 + 이전/다음 버튼 + 페이지 인디케이터 | +| `App.xaml.cs` | 14개 핸들러 등록 + `DispatcherUnhandledException` 전역 예외 핸들러 + `LoadAppIcon` 내장 리소스 폴백 | +| `Services/ClipboardHistoryService.cs` | `Reinitialize()` 메서드 추가 (ServiceHandler의 클립보드 강제 재시작용) | +| `AxCommander.csproj` | `IncludeNativeLibrariesForSelfExtract=true` (단일 EXE 배포), `System.ServiceProcess.ServiceController 8.0.1` 추가, mascot/icon 내장 리소스 | + +**배포** (`build.bat` 더블클릭으로 3종 자동 빌드): + +| 파일 | 크기 | 용도 | +|------|------|------| +| `dist\AxCommander\` | 163MB (폴더) | 본체 EXE + DLL — 폴더째 복사해도 실행 가능 | +| `dist\AxCommander_Setup.exe` | ~136MB | 오프라인 인스톨러 (본체+런타임 모두 ZIP 내장, 인터넷 불필요) | +| `dist\AxCommander_Setup_Online.exe` | **~1MB** | 온라인 인스톨러 (.NET Framework 4.8 기반, 본체(~2MB) ZIP 내장 + .NET 8 Runtime 인터넷 자동 설치) | + +인스톨러 기능: 설치 경로 선택 · 바탕화면 바로가기 · 시작 메뉴 · 자동 실행 · 프로그램 추가/제거 · 기존 설치 감지 → 업그레이드 · 제거 + +**v1.0 최종 수정 (디자인/오류 검수)**: + +| 파일 | 수정 | +|------|------| +| `Views/SettingsWindow.xaml` | `{StaticResource ModernComboBox}` 참조 2곳 제거 — 해당 스타일 미정의로 설정 창 XamlParseException 크래시 수정 | +| `Views/TrayContextMenu.cs` | `MakeItem()`에 1×1 투명 더미 `Image` 설정 — `OnRenderItemImage` 콜백이 호출되지 않아 글리프 아이콘 미표시 문제 수정. `OnRenderItemCheck`에서도 `DrawGlyph()` 호출. 전구 꺼짐 색상 `#A0A08C` → `#78788C` 진한 회색으로 변경 | +| `App.xaml.cs` | 자동실행 `autoStartItem`에 `Image = new Bitmap(1,1)` 추가 | +| `Views/HelpDetailWindow.xaml.cs` | `NavigateToPage()` 빈 카테고리 방어 코드 | +| `Handlers/WindowSwitchHandler.cs` | 자기 프로세스 제외를 하드코딩 타이틀 대신 `Process.GetCurrentProcess().ProcessName` 비교로 변경 | + +**v1.0 UI/UX 최종 수정**: + +| 파일 | 수정 | +|------|------| +| `Views/SettingsWindow.xaml` | 사이드바 `TabPanel`을 `ScrollViewer`로 감싸 탭 10개+ 스크롤 지원. `ModernComboBox` 미정의 참조 제거 (XamlParseException 수정) | +| `Views/TrayContextMenu.cs` | `MakeItem()`에 1×1 더미 Image 설정 → 글리프 아이콘 표시. `DrawLightbulbGlow`를 `PathGradientBrush` 원형 그라데이션으로 교체 (빛 대칭). `OnRenderItemCheck`에서도 `DrawGlyph` 호출 | +| `Views/HelpDetailWindow.xaml` | 카테고리 탭 바 `ScrollViewer` → `WrapPanel` (스크롤 제거, 모두 표시). 창 크기 880×680 | +| `Views/HelpDetailWindow.xaml.cs` | 프로그램 개요 3개 항목(설명/사용법/저장경로) 자동 삽입. `NavigateToPage()` 빈 카테고리 방어 코드 | +| `Handlers/HelpHandler.cs` | `static _entries` → `_baseEntries` + `GetEntries()` 동적 메서드. 설정에서 변경한 캡처 프리픽스·글로벌 핫키 실시간 반영 | +| `Views/AboutWindow.xaml/.cs` | 상단 원형 → 앱 아이콘(icon.ico) 표시. 마스코트는 숨김 상태로 로드 → 사용자 클릭 시 오버레이만. 조직명 행에서 이름/직급 제거 (하단에만 표시). `TryLoadAppIcon()` + `TryLoadMascot()` 분리 | +| `Services/LogService.cs` | `PurgeOldLogs()` 추가 — 14일 초과 로그 자동 삭제 (앱 세션 당 1회) | +| `App.xaml.cs` | `DispatcherUnhandledException` 전역 예외 핸들러. `LoadAppIcon` pack:// 내장 리소스 폴백. `HelpHandler(settings)` 주입 | + +**v1.0 추가 기능**: + +| 파일 | 변경 | +|------|------| +| `Services/FaviconService.cs` (신규) | URL 별칭 항목에 사이트 favicon 표시. Google Favicon API → 디스크 캐시(`%APPDATA%\AxCommander\favicons\`) → `IconPath`에 경로 전달 | +| `Handlers/AliasHandler.cs` | `UrlAliasHandler.GetFaviconPath()` — favicon 캐시 경로 조회 + 백그라운드 다운로드 | +| `Views/LauncherWindow.xaml` | 아이템 아이콘 영역에 `IconPath` 이미지 표시 지원 (`NullToCollapsedConverter`로 심볼/이미지 자동 전환) | +| `Themes/Converters.cs` | `NullToCollapsedConverter` 추가 | +| `App.xaml` | `NullToCollapsedConverter` 글로벌 등록 | +| `Handlers/WebSearchHandler.cs` | `?ni`(네이버 이미지), `?gi`(구글 이미지) 엔진 추가 (총 10개) | +| `Handlers/HelpHandler.cs` | 웹 검색 항목에 10개 엔진 전체 목록 표시 | +| `ViewModels/SettingsViewModel.cs` | `ValidateBeforeSave()` — 예약어/프리픽스 충돌 감지. 충돌 시 `MessageBox` 알림 + 저장 거부 | +| `Views/SettingsWindow.xaml/.cs` | 하단 바에 **내보내기/불러오기** 버튼 추가 (`.axsettings` 파일) | + +**v1.0 아이콘 교체 + 최종 디자인 검수**: + +| 파일 | 수정 | +|------|------| +| `Assets/icon.ico` | 다이아몬드 픽셀 보석 컷 아이콘으로 교체 (Blue/Green/Red/Green 4색, 흰색 facet 선, 7크기 16~256px) | +| `Assets/diamond_pixel.svg` | 아이콘 SVG 원본 (참고용) | +| `tools/IconGenerator/` | 아이콘 생성 콘솔 앱 (.NET 8 WinForms, `System.Drawing`으로 보석 다이아몬드 렌더링 → ICO 출력) | +| `Views/AboutWindow.xaml` | 버전 텍스트 폴백 `"v1.0"` → `"v1.0.1"` (csproj `Version=1.0.1`과 일치) | +| `Views/SettingsWindow.xaml` | 사이드바 `ScrollViewer`에서 `DockPanel.Dock="Top"` 제거 → 마지막 자식으로 남은 공간 채워 스크롤 정상 동작 | + +**최종 검수 결과**: +- 전체 빌드 (3개 프로젝트): **0 errors, 0 warnings** +- 버전 일치: csproj `1.0.1` = AboutWindow `v1.0.1` ✓ +- CornerRadius DynamicResource 바인딩: 정상 ✓ +- 사이드바 ScrollViewer: 수정 완료 (DockPanel.Dock 제거) ✓ +- 전구 글로우: PathGradientBrush 중심 대칭 확인 ✓ +- HelpHandler 항목: 전체 정확성 확인 ✓ +- 아이콘 로딩: pack:// 리소스 + 파일시스템 폴백 정상 ✓ + +--- + +## 🚧 개발 예정 — `!` 예약어 LLM 대화 기능 + +> **상태**: 구현 완료 (핵심 기능) +> **버전**: v1.0.5 +> **마지막 업데이트**: 2026-03-28 + +### 개요 + +`!` 예약어를 입력하면 LLM(대규모 언어 모델) 서비스에 질의를 보내고 응답을 받아 표시하는 **AI 대화 기능**. 런처 입력창에서 `!질문내용` 또는 `! 질문내용`으로 시작하면 전용 대화 창이 열리며, Claude Code / Gemini 스타일의 대화 인터페이스를 제공한다. + +### 입력 방식 + +| 입력 | 동작 | +|------|------| +| `!안녕하세요` | `!` 제거 후 "안녕하세요"를 LLM에 전송 | +| `! 안녕하세요` | `!`와 텍스트 사이 공백 제거 후 "안녕하세요"를 LLM에 전송 | +| `!` (단독) | 대화 창만 열기 (빈 상태) | + +### 대화 창 (ChatWindow) 설계 + +**레이아웃: 2패널 구조** + +``` +┌──────────────────────────────────────────────────┐ +│ [≡] AX Commander — AI 대화 [_][□][✕] │ +├──────────┬───────────────────────────────────────┤ +│ [+ 새 대화] │ │ +│ [🔍 검색] │ 대화 메시지 영역 │ +│ │ (마크다운 렌더링) │ +│ ── 고정 ── │ │ +│ 📌 서버설정 │ │ +│ 📌 코드리뷰 │ │ +│ │ │ +│ ── 오늘 ── │ │ +│ API 오류.. │ │ +│ 배포 방법.. │ │ +│ │ │ +│ ── 어제 ── │ ┌────────────────────────────────┐ │ +│ 회의록 정리 │ │ 메시지를 입력하세요... [▶] │ │ +│ │ └────────────────────────────────┘ │ +├──────────┴───────────────────────────────────────┤ +│ Ollama ▾ │ llama3:8b ▾ │ ● 연결됨 │ 토큰: 1.2k │ +└──────────────────────────────────────────────────┘ +``` + +**좌측 패널 — 대화 목록**: +- **새 대화** 버튼 (Ctrl+N) +- **검색** — 대화 제목·내용 필터 +- **고정 대화** — 핀 고정 항목이 최상단에 위치 (우클릭 > 고정/해제) +- **날짜별 그룹** — 오늘 / 어제 / 이번 주 / 이전 순서 +- **대화 삭제** — 우클릭 > 삭제 (확인 다이얼로그) + +**우측 패널 — 대화 영역**: +- 메시지 버블 (사용자: 우측 / AI: 좌측) +- **마크다운 렌더링** — 코드 블록, 목록, 볼드 등 기본 지원 +- **코드 블록 복사** 버튼 +- **스트리밍 응답** — SSE/스트림 지원 시 한 글자씩 표시 +- **재생성** 버튼 — 마지막 응답을 다시 요청 +- **복사** 버튼 — 개별 메시지 클립보드 복사 + +**창 기능**: +- 창 크기 자유 조절 (가로·세로) +- 전체 화면 / 최소화 / 최대화 지원 +- 테마 연동 (DynamicResource 사용, 런처와 동일한 8종 테마) +- 독립 창 (런처와 별도로 열림, 항상 위 선택 가능) + +### 대화 저장 — 로컬 전용 + +**핵심**: LLM API(Ollama, vLLM, Gemini)는 모두 **무상태(stateless)**. 서버 측에서 이전 대화를 기억하지 않음. 따라서 **모든 대화는 로컬에 저장**하고, API 호출 시 이전 대화 맥락을 함께 전송해야 함. + +``` +%APPDATA%/AxCommander/ + conversations/ + {uuid}.json ← 개별 대화 파일 + conversation-index.json ← 제목·날짜·고정 여부 인덱스 +``` + +**대화 파일 구조 (예시)**: +```json +{ + "id": "a1b2c3d4-...", + "title": "서버 설정 방법", + "createdAt": "2026-03-27T10:00:00", + "updatedAt": "2026-03-27T10:05:00", + "pinned": true, + "provider": "ollama", + "model": "llama3:8b", + "messages": [ + { "role": "user", "content": "nginx 설정 방법 알려줘", "timestamp": "..." }, + { "role": "assistant", "content": "nginx 설정은...", "timestamp": "..." } + ] +} +``` + +**보관 정책**: +- 기본 보관 기간: **30일** (설정에서 변경 가능: 7일 / 30일 / 90일 / 무제한) +- 고정(📌)된 대화는 보관 기간과 무관하게 **영구 보관** +- 만료된 대화는 앱 시작 시 자동 정리 + +**대화 관리 동작**: +- **보관함으로 이동**: 우클릭 > "보관함으로 이동" — 보관 기간이 지나도 자동 삭제되지 않음 (수동 삭제만 가능) +- **삭제**: 우클릭 > "삭제" — 확인 대화상자("이 대화를 정말 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.") 표시 후 진행 +- **보관함 탭**: 좌측 패널 하단에 "보관함" 탭 별도 표시, 보관된 대화 목록 열람 가능 +- 보관함 내 대화도 삭제 가능 (동일한 확인 절차) + +**API 호출 시 컨텍스트 전송**: +- 전체 대화 이력을 `messages` 배열로 전송 (OpenAI 호환 형식) +- 토큰 한도 초과 시 오래된 메시지부터 자동 잘라냄 (sliding window) +- 시스템 프롬프트는 설정에서 커스터마이징 가능 + +### 지원 LLM 서비스 (4종) + +설정 창에서 서비스별 모델 등록 후, 대화 창 입력 바에서 모델 선택 Popup으로 전환 가능. + +| 서비스 | 연결 방식 | 설정값 | +|--------|----------|--------| +| **Ollama** | 로컬 HTTP (`http://localhost:11434`) | 엔드포인트 URL, 모델명 | +| **vLLM** | HTTP API (OpenAI 호환) | 엔드포인트 URL, 모델명, API 키 | +| **Gemini API** | Google REST API | API 키, 모델명 (gemini-2.0-flash 등) | +| **Claude API** | Anthropic REST API | API 키, 모델명 (claude-sonnet-4-20250514 등) | + +### API 키 암호화 체계 + +**암호화 모드 전환**: `settings.json` → `llm.encryptionEnabled` 설정으로 제어 + +| 모드 | `encryptionEnabled` | 설명 | 용도 | +|------|---------------------|------|------| +| **비암호화 (기본)** | `false` | API 키·모델명을 평문으로 저장/표시 | 내부 개발 배포, 테스트 | +| **암호화** | `true` | AES-256-CBC(앱 공용 키)로 암호화 저장 | 운영 배포 | + +**비암호화 모드** (현재 기본값): +- API 키, 모델명이 settings.json에 **평문**으로 저장됨 +- 설정 창에서 입력한 값이 그대로 보이고 저장됨 +- 내부 개발자 배포 시 빠른 설정에 적합 + +**암호화 모드** (`encryptionEnabled: true`로 전환 시): +- 앱 내장 고정 키 + AES-256-CBC로 암호화 +- PBKDF2(SHA-256, 100,000회 반복)로 256-bit 키 파생 +- 관리자 PC에서 암호화한 값이 모든 PC에서 동일하게 복호화됨 +- AxKeyEncryptor 도구로 사전 암호화 가능 +- 설정 창에서 이미 저장된 키는 "(저장됨)"으로 표시 + +**운영 배포 시 암호화 전환 방법**: +1. `settings.json`에서 `"encryptionEnabled": true` 설정 +2. 기존 평문 키/모델명은 앱 재시작 시 설정 저장하면 자동으로 암호화됨 +3. 또는 AxKeyEncryptor 도구로 미리 암호화한 값 배포 + +**하위 호환**: 암호화 모드에서 복호화 실패 시 평문으로 간주하여 동작 (마이그레이션 안전) + +> **대화 내역 암호화**는 `encryptionEnabled`와 별개로 항상 **PC별 AES-256-GCM + DPAPI**로 암호화됩니다. 이는 대화 프라이버시 보호를 위한 별도 계층입니다. + +### 설정 UI (SettingsWindow — 새 탭 "AI 대화") + +| 설정 항목 | 타입 | 기본값 | +|-----------|------|--------| +| LLM 서비스 선택 | ComboBox (Ollama/vLLM/Gemini) | Ollama | +| 엔드포인트 URL | TextBox | `http://localhost:11434` | +| 모델명 | TextBox / ComboBox | `llama3:8b` | +| API 키 (암호화) | PasswordBox | (없음) | +| 시스템 프롬프트 | TextBox (여러 줄) | "당신은 유능한 AI 비서입니다." | +| 대화 보관 기간 | ComboBox | 30일 | +| 최대 컨텍스트 토큰 | Slider / TextBox | 4096 | +| 스트리밍 응답 | ToggleSwitch | ON | +| 연결 테스트 | Button | "연결 테스트" | + +### 구현 파일 구조 (예상) + +``` +src/AxCommander/ + Models/ + ChatMessage.cs ← 메시지 모델 (role, content, timestamp) + Conversation.cs ← 대화 모델 (id, title, messages, pinned, ...) + LlmSettings.cs ← LLM 설정 모델 + Services/ + LlmService.cs ← LLM API 추상화 (Ollama/vLLM/Gemini 통합) + OllamaClient.cs ← Ollama HTTP 클라이언트 + VllmClient.cs ← vLLM (OpenAI 호환) 클라이언트 + GeminiClient.cs ← Gemini REST 클라이언트 + ConversationStore.cs ← 대화 로컬 저장/로드/삭제/만료 처리 + KeyEncryptionService.cs ← API 키 암호화/복호화 + ViewModels/ + ChatViewModel.cs ← 대화 창 ViewModel + Views/ + ChatWindow.xaml / .cs ← 전용 대화 창 (2패널) + Handlers/ + LlmChatHandler.cs ← ! 예약어 핸들러 (런처에서 ChatWindow 열기) + +src/AxKeyEncryptor/ ← 별도 프로젝트 (암호화 도구) + Program.cs ← 콘솔 또는 간단한 WinForms GUI +``` + +### 단계별 구현 현황 + +| 단계 | 내용 | 상태 | +|------|------|------| +| **1단계** | Ollama 연결 + 기본 대화 창 (단일 대화) | ✅ 완료 | +| **2단계** | 대화 목록 + 저장/로드 + 고정/삭제/분류/이름변경 | ✅ 완료 | +| **3단계** | vLLM / Gemini / Claude 연결 추가 + 설정 탭 | ✅ 완료 | +| **4단계** | 스트리밍 응답 + 마크다운/코드 구문 강조 렌더링 | ✅ 완료 | +| **5단계** | 프롬프트 카드 + 사용자 프롬프트 템플릿 | ✅ 완료 | +| **6단계** | 토큰 사용량(k/m 단위) + 응답 소요시간 표시 | ✅ 완료 | +| **7단계** | 타이핑 효과 + 피드백(좋아요/싫어요) 영속성 | ✅ 완료 | +| **8단계** | 커스텀 Popup 메뉴 통일 (ContextMenu 제거) | ✅ 완료 | +| **9단계** | 지연 캡처 (Shift+Enter 3/5/10초 타이머) | ✅ 완료 | +| **향후** | 멀티 에이전트, 내보내기, Cowork 탭 | 계획 중 | + +--- + +## 알려진 제한사항 및 향후 개선 + +| 항목 | 현황 | 개선 방향 | +|------|------|----------| +| 클립보드 히스토리 이미지 | 텍스트만 지원 | `IDataObject` 이미지 타입 추가 | +| 클립보드 병합 항목 시각 표시 | 힌트 바로만 개수 표시 | 리스트 항목에 체크마크 아이콘 추가 | +| 스니펫 글로벌 확장 | 런처에서만 동작 | `WH_KEYBOARD_LL` 백그라운드 확장 | +| 인덱스 경로 | Desktop + Start Menu | Program Files 등 추가 옵션 | +| 보안 제외 패턴 편집 | 읽기 전용 표시 | 설정 UI에서 패턴 추가/삭제 지원 | + +### 향후 개선 — ONNX 임베딩 코드 검색 (사양 확보 시) + +현재 코드 검색은 **TF-IDF + SQLite 영속 인덱스** 방식을 사용합니다 (v1.5.x). +사내 PC 사양이 확보되면 ONNX 로컬 임베딩으로 업그레이드하여 시맨틱 검색 품질을 크게 개선할 수 있습니다. + +#### 현재 구현 (TF-IDF + SQLite) +- **방식**: 키워드 기반 TF-IDF 코사인 유사도 + 바이그램 + 스톱워드 제거 +- **저장**: `%APPDATA%\AxCopilot\index\{folderHash}.db` (SQLite) +- **장점**: 외부 의존 없음, 배포 +3MB, 저사양 PC에서도 동작 +- **한계**: 동의어/의미 유사성 미지원 ("사용자 인증" ↔ "로그인 검증" 매칭 불가) + +#### ONNX 임베딩 업그레이드 계획 + +| 항목 | 내용 | +|------|------| +| **NuGet** | `Microsoft.ML.OnnxRuntime` 1.17+ (CPU 전용) | +| **모델** | `all-MiniLM-L6-v2` (90MB, 384차원) 또는 `bge-small-en` (130MB) | +| **벡터 DB** | 기존 SQLite에 BLOB 컬럼 추가 (384×float32 = 1.5KB/청크) | +| **배포 크기** | 현재 ~20MB → ~160MB (+140MB) | +| **최소 사양** | RAM 4GB 이상, CPU AVX2 지원 권장 | + +#### 업그레이드 절차 (개발자 가이드) + +1. **NuGet 추가**: + ```bash + dotnet add src/AxCopilot/AxCopilot.csproj package Microsoft.ML.OnnxRuntime --version 1.17.0 + ``` + +2. **모델 배치**: `Assets/models/all-MiniLM-L6-v2.onnx` (빌드 시 복사) + +3. **CodeIndexService 수정**: + ```csharp + // 인덱싱 시 청크별 임베딩 벡터 생성 + var embedding = _onnxSession.Run(new[] { tokenizedInput }); + // SQLite chunks 테이블에 embedding BLOB 컬럼 추가 + // 검색 시 코사인 유사도를 벡터 간 계산 + ``` + +4. **SQLite 스키마 확장**: + ```sql + ALTER TABLE chunks ADD COLUMN embedding BLOB; + -- 검색 시: SELECT ... ORDER BY cosine_similarity(query_vec, embedding) DESC + ``` + +5. **설정 추가**: `AppSettings.Llm.Code.UseEmbeddingSearch` (bool, default false) + - false: 기존 TF-IDF 사용 (저사양 호환) + - true: ONNX 임베딩 사용 (고품질) + +6. **폴백**: ONNX 로드 실패 시 자동으로 TF-IDF 모드로 전환 + +> **참고**: 사내 PC 사양(CPU, RAM)이 낮아 ONNX 런타임 로드 시간(3~5초)과 +> 인덱싱 시간이 길어질 수 있음. 반드시 사양 확인 후 도입 결정. + +### 미지원 — 개발 계획 없음 + +아래 기능은 Alfred 비교에서 언급된 바 있으나 **AX Commander에 불필요한 기능으로 확정**되어 구현하지 않습니다. 향후 Alfred 비교 시에도 이 항목들은 비교 대상에서 제외합니다. + +| 기능 | 이유 | +|------|------| +| 워크플로우 자동화 체인 | 사내 업무 흐름상 불필요. 배치 명령(`>`)으로 충분히 대체 가능 | +| 연락처 검색 | MAPI/vCard 연동 복잡도 대비 사용 빈도 낮음 | +| 사전 (Dictionary) | OS 내장 사전 및 브라우저 검색으로 충분히 대체 가능 | +| QR코드 생성 | 업무 활용도 낮음, 외부 의존성 없는 구현 비용 대비 효용 낮음 | + +--- + +## 개발 환경 + +- **IDE**: Visual Studio 2022 / JetBrains Rider / VS Code (C# Dev Kit) +- **SDK**: .NET 8 SDK +- **타겟**: `net8.0-windows`, `win-x64` +- **UI 프레임워크**: WPF (`UseWPF=true`) + WinForms (`UseWindowsForms=true`, ColorDialog 사용) +- **테스트**: xUnit 2.9.0, FluentAssertions 6.12.0 + +--- + +## 경쟁 제품 기능 비교 + +AX Commander v1.0 기준으로 macOS Alfred 5, macOS Spotlight, Windows PowerToys Run과 비교합니다. + +| 기능 | AX Commander | Alfred 5 | Spotlight | PowerToys Run | +|------|:---:|:---:|:---:|:---:| +| 앱/파일 퍼지 검색 | O | O | O | O | +| 한국어 초성 검색 | **O** | X | X | X | +| 실행 빈도 학습 | O | O | O | O | +| 계산기 + 수학 함수 | O | O | △ (기본) | O | +| 단위 변환 | O | O | O | O | +| 통화 변환 (실시간) | O | O | X | X | +| 웹 검색 (다중 엔진) | O | O | O | O | +| 클립보드 히스토리 | O | O (Powerpack) | X | X | +| 클립보드 파이프라인 체이닝 | **O** | X | X | X | +| 텍스트 일괄 처리 (batch) | **O** | X | X | X | +| 텍스트 스니펫 + 자동 확장 | O | O (Powerpack) | X | X | +| 파일 액션 서브메뉴 | O | O | X | X | +| JSON 포맷/검증 | O | X | X | X | +| 인코딩/해싱 (Base64, SHA) | O | X | X | X | +| 색상 변환 (HEX/RGB/HSL) | O | X | X | X | +| 스포이드 색상 추출 | **O** | X | X | X | +| 포트/프로세스 조회 | O | X | X | X | +| 환경변수 조회 | O | X | X | X | +| 화면 캡처 (4모드) | O | X | △ (스크린샷) | X | +| 글로벌 캡처 단축키 | O | X | O | X | +| 스크롤 캡처 (자동 스티칭) | **O** | X | X | X | +| 영역 캡처 키보드 미세조정 | **O** | X | X | X | +| 창 스냅 레이아웃 | O | X | X | O | +| 워크스페이스 저장/복원 | O | X | X | X | +| 윈도우 스위처 (검색+전환) | **O** | X | X | O | +| 시스템 명령 (잠금/절전/종료) | O | O | X | O | +| 미디어 제어 | O | O | O | X | +| 타이머/알람 | O | X | X | X | +| 프로세스 종료 (kill) | O | X | X | O | +| 서비스 관리 (svc) | **O** | X | X | X | +| 날짜 계산/D-day/타임스탬프 | **O** | X | X | X | +| 파일 비교 (diff) | **O** | X | X | X | +| 파일 일괄 이름변경 | **O** | X | X | O | +| 프로젝트 스캐폴딩 | **O** | X | X | X | +| 즐겨찾기 관리 | O | X | X | X | +| 업무 일지 자동 생성 | **O** | X | X | X | +| 루틴 자동화 | **O** | △ (워크플로우) | X | X | +| 시스템 리소스 모니터 | O | X | X | O | +| 이모지 피커 | O | X | X | O | +| 최근 파일 | O | O | O | X | +| 빠른 메모 | O | X | X | X | +| 앱 제거 | O | X | X | X | +| 잠금 해제 사용시간 알림 | **O** | X | X | X | +| 테마 (9종 + 커스텀 + 모양) | O | O | X | △ (제한) | +| 다국어 (5개 언어) | O | O | O | O | +| 플러그인 DLL 확장 | O | O | X | O | +| DPAPI 클립보드 암호화 | **O** | X | X | X | +| 단일 EXE 배포 | **O** | X | N/A | X | +| 완전 오프라인 (외부 통신 없음) | **O** | △ | O | O | + +**O** = 지원, **△** = 부분 지원, **X** = 미지원, **굵은 O** = AX Commander 고유 기능 + +--- + +## 새로운 핸들러/키워드 추가 방법 (개발자 가이드) + +### 1단계: IActionHandler 구현 + +```csharp +// Handlers/MyNewHandler.cs +using AxCommander.SDK; +using AxCommander.Themes; + +namespace AxCommander.Handlers; + +public class MyNewHandler : IActionHandler +{ + // 이 핸들러를 트리거하는 프리픽스 (null이면 퍼지 검색에 통합) + public string? Prefix => "myprefix"; + + public PluginMetadata Metadata => new( + "MyNew", + "내 새로운 기능 — myprefix", + "1.0", + "AX"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + // query: 프리픽스 이후의 입력 텍스트 + // LauncherItem의 Data 필드에 실행 시 필요한 데이터를 담아 반환 + return Task.FromResult>( + [ + new LauncherItem( + "제목", + "설명 · Enter로 실행", + null, + "실행 시 전달될 데이터", + Symbol: Symbols.Info) + ]); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + // item.Data에서 데이터를 꺼내 실행 + if (item.Data is string data) + { + // 작업 수행 + } + return Task.CompletedTask; + } +} +``` + +### 2단계: 핸들러 등록 (App.xaml.cs) + +```csharp +// App.xaml.cs OnStartup() 내부, HelpHandler 위에 추가 +commandResolver.RegisterHandler(new MyNewHandler()); +``` + +### 3단계: 심볼 추가 (Symbols.cs) + +```csharp +// Themes/Symbols.cs +public const string MyNewIcon = "\uE946"; // Segoe MDL2 Assets 유니코드 +``` + +참고: [Segoe MDL2 Assets 아이콘 목록](https://learn.microsoft.com/en-us/windows/apps/design/style/segoe-ui-symbol-font) + +### 4단계: 도움말 항목 추가 (HelpHandler.cs) + +`_entries` 배열에 항목 추가 (키보드 섹션 위에): + +```csharp +new("카테고리", "myprefix", "기능 제목", + "기능 설명", + "사용 예시", + Symbols.MyNewIcon, "#HEX색상"), +``` + +### 5단계: 설정이 필요한 경우 + +1. `Models/AppSettings.cs`에 설정 클래스 추가 +2. `ViewModels/SettingsViewModel.cs`에 프로퍼티 추가 +3. `Views/SettingsWindow.xaml`에 탭 또는 섹션 추가 + +### 6단계: 외부 DLL 플러그인 + +외부 개발자는 `AxCommander.SDK` 프로젝트의 `IActionHandler`를 구현하는 DLL을 만들어 `settings.json`의 `plugins` 배열에 등록합니다: + +```json +"plugins": [ + { "path": "C:\\Plugins\\MyPlugin.dll", "enabled": true } +] +``` + +런타임에 `PluginHost`가 Assembly.LoadFrom()으로 로드하고 `IActionHandler` 구현체를 자동 검색하여 등록합니다. + +--- + +## 사내 LLM / AI Agent 연동 가이드 (향후 확장) + +AX Commander는 사내 LLM 또는 AI Agent를 연동하여 **자연어 질의-응답** 기능을 추가할 수 있도록 설계되어 있습니다. + +### 연동 시나리오 + +1. **사내 인트라넷 LLM API**: 별도 프리픽스(`ai` 또는 `?? `) 입력 → 사내 AI 서버에 질의 → 응답을 런처 결과로 표시 +2. **키워드 없는 자동 감지**: 프리픽스가 없고 퍼지 검색 결과가 없을 때 → 자동으로 AI에 질의 폴백 +3. **클립보드 AI 분석**: 클립보드 텍스트를 AI에 전달하여 요약/번역/교정 결과 반환 + +### 구현 방법 + +#### 방법 A: 전용 핸들러 (권장) + +```csharp +// Handlers/AiQueryHandler.cs +public class AiQueryHandler : IActionHandler +{ + public string? Prefix => "ai"; // 또는 "??" 등 + + private readonly HttpClient _client; // 사내 인트라넷 전용 + + public AiQueryHandler(string intranetEndpoint) + { + _client = new HttpClient { BaseAddress = new Uri(intranetEndpoint) }; + _client.Timeout = TimeSpan.FromSeconds(10); + } + + public async Task> GetItemsAsync(string query, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(query)) + return [new LauncherItem("AI에게 질문하세요", "사내 LLM에 질의합니다", null, null)]; + + try + { + // 사내 인트라넷 API 호출 (DEVELOPMENT.md 개발 원칙에 의거, + // 사내 명시 허가된 엔드포인트만 호출 가능) + var response = await _client.PostAsJsonAsync("/api/chat", + new { prompt = query }, ct); + var result = await response.Content.ReadAsStringAsync(ct); + + return [new LauncherItem( + "AI 응답", + result.Length > 200 ? result[..197] + "…" : result, + null, result, + Symbol: Symbols.Lightbulb)]; + } + catch (Exception ex) + { + return [new LauncherItem("AI 응답 실패", ex.Message, null, null, Symbol: Symbols.Error)]; + } + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text) + Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(text)); + return Task.CompletedTask; + } +} +``` + +#### 방법 B: CommandResolver 폴백 통합 + +`Core/CommandResolver.cs`의 `ResolveAsync` 메서드에서 퍼지 검색 결과가 0건일 때 AI 핸들러로 폴백: + +```csharp +// Core/CommandResolver.cs +if (fuzzyResults.Count == 0 && _aiHandler != null) +{ + return await _aiHandler.GetItemsAsync(input, ct); +} +``` + +#### 방법 C: JSON 스킬 플러그인 (기존 인프라 활용) + +기존 `JsonSkillLoader`가 이미 HTTP API 호출을 지원하므로, `.skill.json` 파일로 LLM API를 등록: + +```json +{ + "prefix": "ai", + "name": "사내 AI 질의", + "type": "http", + "url": "https://intranet.company.com/api/llm", + "method": "POST", + "bodyTemplate": "{\"prompt\": \"{{query}}\"}", + "responsePath": "data.answer" +} +``` + +### 보안 고려사항 + +| 항목 | 원칙 | +|------|------| +| 엔드포인트 | **사내 인트라넷 URL만 허용** — settings.json에 명시적 등록 필요 | +| 타임아웃 | 최대 10초 (런처 UX 유지) | +| 데이터 | 클립보드 내용을 AI에 전달할 때 보안 패턴 검사 선행 (기존 `excludePatterns` 활용) | +| 인증 | Windows 인증(SSPI) 또는 사내 토큰 — `CredentialManager` (advapi32.dll, DPAPI) 사용 | +| 로깅 | AI 질의 내용은 로그에 기록하지 않음 (민감 데이터 포함 가능) | + +### 설정 UI 확장 + +설정 창에 **AI 탭**을 추가하여 다음을 관리: + +| 설정 항목 | 설명 | +|----------|------| +| AI 연동 활성화 | 기능 전체 토글 | +| 사내 API 엔드포인트 | 인트라넷 URL 입력 | +| 프리픽스 | `ai`, `??`, 또는 빈 값 (자동 폴백) | +| 타임아웃 (초) | 1~30초 | +| 자동 폴백 | 검색 결과 0건 시 자동으로 AI 질의 | + +### 로드맵 + +| 단계 | 내용 | +|------|------| +| Phase 1 | `ai` 프리픽스 핸들러 + 사내 REST API 연동 (텍스트 질의/응답) | +| Phase 2 | 자동 폴백 (퍼지 검색 결과 없을 때) | +| Phase 3 | 클립보드 AI 분석 (`ai summarize`, `ai translate`, `ai proofread`) | +| Phase 4 | Agent 모드 — 멀티턴 대화 + 도구 호출 (파일 읽기, 계산 등을 AI가 결정) | + +--- + +## 슬래시 명령어 (/ Commands) + +AX Agent 대화 입력창에서 `/`를 입력하면 자동완성 팝업이 표시됩니다. 현재 탭에 맞는 명령어만 필터링됩니다. + +### 공통 명령어 (모든 탭) + +| 명령어 | 기능 | 설명 | +|--------|------|------| +| `/summary` | Summary | 텍스트/문서를 핵심 포인트 중심으로 요약 | +| `/translate` | Translate | 텍스트를 영어로 번역 (원문 톤 유지) | +| `/explain` | Explain | 내용을 쉽고 자세하게 설명 (예시 포함) | +| `/fix` | Fix | 맞춤법, 문법, 자연스러운 표현 교정 | +| `/help` | Help | 슬래시 명령어 도움말 창 표시 | + +### 개발 명령어 (Cowork/Code 탭 전용) + +| 명령어 | 기능 | 사용 도구 | +|--------|------|-----------| +| `/review` | Code Review | `code_review` (diff_review) | +| `/pr` | PR Summary | `code_review` (pr_summary) | +| `/test` | Test | `test_loop` | +| `/structure` | Structure | `folder_map` | +| `/build` | Build | `build_run` | +| `/search` | Search | `search_codebase` | + +### 스킬 명령어 + +`%APPDATA%\AxCopilot\skills\` 폴더에 `*.skill.md` 파일을 추가하면 슬래시 명령어로 자동 등록됩니다. + +**스킬 파일 형식** (2종류 지원): + +1) **기존 형식** (`*.skill.md` 단일 파일): +```markdown +--- +name: skill-name +label: 표시 이름 +description: 설명 +icon: \uE768 +--- +시스템 프롬프트 내용... +``` + +2) **SKILL.md 표준** (agentskills.io 호환, Claude Code/Cursor/Windsurf 공통): +``` +skill-name/ +├── SKILL.md +├── scripts/ (선택) +└── references/ (선택) +``` +```markdown +--- +name: skill-name +description: 설명. 사용 시점 키워드 포함 권장. +license: Apache-2.0 +compatibility: Requires Python 3.14+ +metadata: + label: 표시 이름 + icon: \uE768 + author: team-name + version: "1.0" +allowed-tools: process file_read grep_tool +--- +지시사항 마크다운... +``` + +**기본 제공 스킬** (자동 생성): +- `/daily-standup` — 데일리 스탠드업 보고서 +- `/bug-hunt` — 잠재적 버그 패턴 검색 +- `/code-explain` — 코드 상세 설명 + +### 에이전트 도구 목록 (v1.5.0) + +| 도구명 | 기능 | 탭 | +|--------|------|----| +| `file_read` | 파일 읽기 | Cowork/Code | +| `file_write` | 파일 쓰기 | Cowork/Code | +| `file_edit` | 파일 편집 (줄 기반) | Cowork/Code | +| `glob` | 파일 패턴 검색 | Cowork/Code | +| `grep_tool` | 텍스트 검색 | Cowork/Code | +| `process` | 프로세스 실행 | Cowork/Code | +| `folder_map` | 폴더 구조 조회 | Cowork/Code | +| `document_read` | 문서 읽기 (PDF/DOCX) | Cowork/Code | +| `search_codebase` | 코드 시맨틱 검색 (TF-IDF) | Cowork/Code | +| `code_review` | AI 코드 리뷰 | Cowork/Code | +| `project_rules` | AX.md 개발 지침 관리 | Cowork/Code | +| `git_tool` | Git 작업 | Code | +| `build_run` | 빌드/테스트 실행 | Code | +| `dev_env_detect` | 개발 환경 감지 | Code | +| `lsp` | LSP 코드 인텔리전스 | Code | +| `test_loop` | 테스트 자동 루프 | Code | +| `spawn_agent` | 서브에이전트 생성 | Code | +| `wait_agents` | 서브에이전트 결과 대기 | Code | +| `skill_manager` | 스킬 관리 (list/info/reload) | Cowork/Code | +| `memory` | 에이전트 메모리 관리 | Cowork/Code | +| `excel_create` | Excel 생성 | Cowork/Code | +| `docx_create` | Word 생성 | Cowork/Code | +| `csv_create` | CSV 생성 | Cowork/Code | +| `markdown_create` | 마크다운 생성 | Cowork/Code | +| `html_create` | HTML 생성 | Cowork/Code | +| `chart_create` | 차트 생성 | Cowork/Code | +| `batch_create` | 배치 스크립트 생성 | Cowork/Code | +| `document_review` | 문서 품질 검증 | Cowork/Code | +| `format_convert` | 포맷 변환 | Cowork/Code | + +--- + +## 버전 이력 + +> **⚠ 버전 변경 시 반드시 아래 모든 항목을 동시에 수정하세요. 하나라도 빠지면 버전 불일치가 발생합니다.** +> +> | # | 수정 대상 | 파일 경로 | 수정 내용 | +> |---|----------|----------|----------| +> | 1 | **프로젝트 버전** | `src/AxCopilot/AxCopilot.csproj` → `` | 버전 번호 변경 (설정 창·Windows 속성에 자동 반영) | +> | 2 | **인스톨러 프로젝트 버전** | `src/AxCopilot.Installer/AxCopilot.Installer.csproj` → `` | 인스톨러 어셈블리 버전 일치 | +> | 3 | **인스톨러 표시 버전** | `src/AxCopilot.Installer/SetupForm.cs` → `AppVer` 상수 | 설치 UI 헤더·레지스트리에 표시되는 버전 문자열 | +> | 4 | **개발 문서 버전 이력** | `docs/DEVELOPMENT.md` → 버전 이력 섹션 | 새 버전 항목 추가 (이 파일) | +> | 5 | **사용자 가이드 문서** | `src/AxCopilot/Assets/AX Copilot 사용가이드.htm` | 헤더 `version-tag` + 버전 이력 섹션에 새 항목 추가 | +> | 6 | **헬프 창 내용** | `src/AxCopilot/Views/HelpDetailWindow.xaml.cs` | `_overviewItems`의 신기능 항목·프리뷰 항목 갱신 | +> | 7 | **MCP 클라이언트 버전** | `src/AxCopilot/Services/McpClientService.cs` → `clientInfo.version` | MCP 프로토콜 클라이언트 버전 문자열 | +> | 8 | **로드맵 문서** | `docs/AGENT_ROADMAP.md`, `docs/AGENT_ROADMAP.html`, `docs/LAUNCHER_ROADMAP.md`, `docs/LAUNCHER_ROADMAP.html` | 푸터/헤더 버전 번호 갱신 | +> +> **인스톨러 주의**: `SetupForm.cs`의 `AppVer` 상수는 설치 UI 헤더 표시 + `RegAdd()`에서 +> 레지스트리 `DisplayVersion`에 기록됩니다. 이 값이 앱 본체와 다르면 업그레이드 감지가 오작동합니다. +> **반드시 앱 본체 csproj ``과 동일하게 유지하세요.** +> +> 설정 창(`SettingsWindow.xaml.cs → SetVersionText()`)과 정보 창(`AboutWindow.xaml.cs`)은 +> 앱 본체 csproj ``을 리플렉션으로 읽으므로 별도 수정 불필요합니다. + +> **⚠ 사용자 노출 문서 작성 원칙 (사용자 가이드 · 헬프 창)** +> +> 사용자 가이드(`AX Copilot 사용가이드.htm`)와 헬프 창(`HelpDetailWindow.xaml.cs`)은 +> **사용자가 직접 보는 문서**입니다. 외부에 내부 기술 스택이 노출되지 않도록 아래 원칙을 반드시 준수하세요. +> +> | 구분 | 사용 금지 (내부 기술) | 대신 사용 (사용자 관점) | +> |------|---------------------|----------------------| +> | 프로토콜/라이브러리 | MCP, JSON-RPC, stdio, P/Invoke, DPAPI, LCS, REST API | "외부 도구 연결", "암호화 저장" | +> | 클래스/서비스명 | McpClientService, TokenEstimator, AuditLogService, DiffService | 기능 설명으로 대체 | +> | 내부 구조 | ParentId/BranchLabel, FallbackModels, SettingsViewModel | "대화 분기", "자동 전환", "설정" | +> | 코드 패턴 | CJK 가중치, 동적 반복 한도, SWE-bench, 다단계 반성 | "더 정확한 분석", "AI 성능 개선" | +> | 파일명/경로 | english.json, movies.json, SetupForm.cs, endpoint/apiKey | 언급하지 않음 | +> +> **원칙**: 사용자에게는 "무엇을 할 수 있는지"만 전달합니다. +> "어떻게 구현했는지"는 이 개발 문서(`DEVELOPMENT.md`)에만 기록합니다. +> +> **적용 대상**: 버전 이력, 신기능 설명, 개요 항목, 모든 사용자 노출 텍스트 + +### v1.8.0 + +> **개발 범위**: 에이전트 인프라 전면 고도화 — Phase 17-UI, 17-A~G, 18-A~C, L3 완료. 사내/사외 네트워크 모드 추가. + +| 구분 | 내용 | +|------|------| +| **에이전트 채팅 화면 개편 (Phase 17-UI)** | 채팅 창 서브 바에 Plan 모드 3상태 토글 (Off / Auto / Always) 추가. 클릭 시 순환 전환, 활성 상태 색상 강조. `LlmSettings.PlanMode` 설정 연동 | +| **Reflexion 강화 (Phase 17-A)** | `ReflexionService` 확장: 자기 평가 → 전략 수정 루프 구현. 도구 실행 실패 시 반성 기반 재시도 전략 자동 선택 | +| **구조화된 이벤트 로그 (Phase 17-B)** | `AgentEventLog` JSONL 기록 시스템. `AgentLoopService`에 세션 ID 생성 + SessionStart / ToolRequest / ToolResult / SessionEnd 이벤트 기록 통합 | +| **훅 시스템 고도화 (Phase 17-C)** | `ExtendedHookRunner`: PreCompact / UserPromptSubmit / AgentThinking 훅 이벤트 추가. `asyncRewake` 속성으로 비동기 훅 완료 후 에이전트 재개 가능 | +| **스킬 시스템 고도화 (Phase 17-D)** | `PathBasedSkillActivator`: 경로 패턴 기반 스킬 자동 활성화. `SkillExtensionStore` 사이드카 패턴으로 스킬 확장 메타데이터 관리 | +| **메모리/컨텍스트 고도화 (Phase 17-E)** | `ContextCondenser` 경로 규칙 연동. `PathScopedRuleInjector`로 작업 폴더에 따른 규칙 자동 주입. `@include` 지시문 처리 | +| **권한 시스템 고도화 (Phase 17-F)** | `PermissionSystem` Chain of Responsibility 패턴. Allow/Deny 규칙 설정 UI 연동. acceptEdits 모드에서 파일 편집 도구 자동 승인 | +| **멀티파일 Diff + 자동 컨텍스트 (Phase 17-G)** | `MultiFileDiffViewModel`: 파일별 diff 추적 + 일괄 수락. `AutoContextCollector`: `@파일명` 멘션 정규식 파싱 + 자동 파일 내용 주입. `ToolRiskMapper`: 도구별 Low/Medium/High 위험도 분류 | +| **멀티에이전트 팀 (Phase 18-A)** | `DelegateAgentTool` + `BackgroundAgentService` + `WorktreeManager`. `AgentLoopService`에 `RunSubAgentAsync` 위임 연결. ToolRegistry에 자동 등록 | +| **에이전트 리플레이 (Phase 18-B)** | `AgentReplayService`: JSONL 이벤트 로그 파일 열거 + 단계별 재생. `ReplayTimelineViewModel`: 재생 UI 바인딩 ViewModel | +| **플러그인 설치 서비스 (Phase 18-C)** | `PluginInstallService`: 로컬 zip 파일 기반 설치 (URL 다운로드 없음). `PluginManifest` / `InstalledPlugin` / `PluginInstallResult` 레코드. 레지스트리 JSONL 영속화 | +| **사내/사외 네트워크 모드** | `AppSettings.InternalModeEnabled` (기본: 사내 모드). 사외 전환 시 비밀번호 `axgo123!` 인증 필요. `WebSearchHandler` + `HttpTool` 에서 모드 체크 적용 | +| **알림 센터 (L3-7)** | `NotificationCenterService`: 알림 타입(Info/Success/Warning/Error) + 히스토리 큐(최대 50건). `NotificationRaised` 이벤트로 UI 구독 지원. 기존 `NotificationService` 트레이 BalloonTip 위임 | +| **플러그인 갤러리 ViewModel (L3-1)** | `PluginGalleryViewModel`: 설치된 플러그인 목록 + 설치/제거/활성화 커맨드 바인딩. `PluginItemViewModel` 래퍼 | +| **파라미터 퀵링크 (L3-4)** | `QuickLinkHandler` (`ql` 프리픽스) + `UrlTemplateEngine`. `{0}`, `{query}` 플레이스홀더 치환. 설정에서 `QuickLinkEntry` 목록 관리 | +| **AI 스니펫 (L3-3)** | `AiSnippetHandler` (`ai` 프리픽스) + `SnippetTemplateService`. 업무 이메일/요약/번역/코드리뷰/커밋 기본 템플릿 5종 내장. LLM 호출 후 클립보드 복사. AI 비활성화 시 항목 미표시 | +| **웹 검색 AI 요약 (L3-2)** | `WebSearchSummaryHandler` (`?!` 프리픽스) + `ContentExtractor`. URL 또는 검색어 입력 시 AI가 요약 생성 후 클립보드 복사. 사외 모드 + AI 활성화 상태에서만 동작 | + +### v1.7.2 + +> **개발 범위**: 안정화 릴리즈 — 런처 속도, 에이전트 컨텍스트 압축, 대화 복원, 버그 수정 11건 + +| 구분 | 내용 | +|------|------| +| **컨텍스트 압축 (Context Condenser)** | 2단계 자동 압축 구현. 1단계: 오래된 도구 결과를 LLM 호출 없이 1500자로 축약. 2단계: 이전 대화를 LLM으로 요약하여 교체. 모델별 토큰 한도 자동 인식 (Claude 180K, Gemini 900K, GPT-4 120K, Ollama 16K). 65% 임계값에서 압축 시작 | +| **대화 이력 복원** | 앱 재시작 시 탭별 마지막 대화를 자동 복원. `LastConversationIds` 설정에 탭↔대화 ID 매핑 저장. 종료·탭 전환 시 자동 영속화 | +| **런처 속도 개선** | 핫키 응답 ~230ms 절감. `Thread.Sleep` 단축 (200→110ms), 애니메이션 최적화 (fade 160→100ms, slide 200→120ms). 텍스트 미사용 시 즉시 런처 표시 | +| **검증 리팩터링** | 도구 실행 후 검증을 읽기 전용(`file_read`, `directory_list`)으로 제한. 검증 결과를 보고만 하고 직접 수정하지 않도록 변경 — 문서 품질 저하 방지 | +| **설정 비밀번호 수정** | 개발자 모드·스텝바이스텝 토글이 설정 창 열 때마다 비밀번호 재입력을 요구하던 문제 수정. `IsLoaded` 가드 추가 | +| **계획 버튼 동기화** | PlanViewerWindow에서 승인 후 대화창 인라인 승인/취소 버튼이 자동 축소되지 않던 문제 수정. `TCS.ContinueWith` 콜백 추가 | +| **야간 시간 수정** | PC 미종료 상태에서 자정 넘길 때 근무 시간이 전날부터 누적되던 문제 수정. `_sessionStart`를 자정(DateTime.Today)으로 리셋 | +| **클립보드 붙여넣기 수정** | 이전 활성 창에 `SetForegroundWindow` 호출 후 `Ctrl+V` 전송하도록 변경 — 런처가 포커스를 뺏는 문제 해결 | +| **활성 창 캡처 수정** | 런처가 완전히 숨겨질 때까지 대기 + 대상 창에 `SetForegroundWindow` 호출 — 런처 자체가 캡처되던 문제 해결 | +| **스크롤 캡처 수정** | `FindOverlap` 다중 행 비교로 오버랩 감지 정확도 향상. `StitchFrames`를 증분 스티칭으로 변경 — 전체 프레임 중복 붙여넣기 문제 해결 | +| **런처 잔여 결과 제거** | `OnShown()`에서 `Results.Clear()` 호출 추가 — 런처 재표시 시 이전 검색 결과가 순간적으로 보이던 문제 해결 | +| **AI 모델 호환성 가이드** | 개발자 가이드에 도구 사용(Function Calling) 지원 모델 표 추가. 클라우드(Claude/Gemini) + Ollama 로컬 모델 15종 호환성 명시. 사내 환경 추천 조합 포함 | + +### v1.7.1 + +> **개발 범위**: 에이전트 루프 검증 강제 + UI 개선 + 도구 스키마 수정 + +| 구분 | 내용 | +|------|------| +| **도구 실행 후 검증 강제 (Post-Tool Verification)** | 문서 생성 도구(`file_write`, `docx_create`, `html_create`, `excel_create` 등) 실행 후 LLM에 검증 전용 호출을 자동 삽입. 생성된 파일을 `file_read`로 읽고 내용 완전성·구조·맞춤법을 확인하도록 강제. 문제 발견 시 즉시 수정 도구 호출. OpenHands 등 오픈소스에는 없는 차별화 기능. `EnablePostToolVerification` 설정 토글 (기본 OFF) | +| **Gemini 배열 스키마 수정** | `MultiReadTool.paths`와 `UserAskTool.options`에 `Items` 필드 추가. Gemini API가 array 타입 파라미터에 items 필드를 필수로 요구하는 문제 해결 | +| **워크플로우 분석기 UI 개선** | 타이틀바 전체 영역 드래그 가능 (`Background="Transparent"` 추가), 활성 탭 텍스트 White 강조, 상태 텍스트 `TextTrimming` + `MaxWidth` 적용 | +| **플랜 뷰어 버튼 가시성** | 아웃라인 버튼 배경 `0x18` 틴트 + 테두리 `0x80` 불투명도 + `1.2px` 두께로 가시성 개선 | +| **워터마크 슬래시 칩 충돌 수정** | 슬래시 칩 활성 시 `InputWatermark` 즉시 숨김 처리 | +| **피드백 학습 컨텍스트** | `BuildFeedbackContext()`를 Cowork/Code 시스템 프롬프트에 주입. 최근 20건 대화의 좋아요/싫어요 패턴 분석 | +| **수정 후 재시도 버튼** | 두 번째 액션바에 재시도 버튼 추가 (사용자 피드백 입력 후 재생성) | +| **설정 추가** | `EnablePostToolVerification`(bool, 기본 false) — 문서 생성 후 검증 LLM 호출 강제 | + +### v1.7.0 + +> **개발 범위**: Phase 16 — 에이전트 지능 강화 + 개발자 경험 + +| 구분 | 내용 | +|------|------| +| **플랜 모드 (Plan Mode)** | 에이전트 도구 실행 전 구조화된 계획 생성→사용자 검토/승인→실행 흐름. `PlanMode` 3모드(off/always/auto). always=LLM 텍스트 전용 계획 생성(최대 3회 수정 요청), auto=계획 감지 시 승인 요청 | +| **도구/커넥터 관리 UI** | 설정 › AX Agent › 도구 탭 신설. 52개 에이전트 도구를 6개 카테고리(파일/검색, 문서 생성, 문서 품질, 코드/개발, 데이터/유틸, 시스템)별 카드 표시. 개별 활성/비활성 토글 + MCP 서버 연결 상태 실시간 표시. `DisabledTools` 설정으로 영속 | +| **프로젝트 규칙 시스템** | `.ax/rules/*.md` YAML 프론트매터(name, description, applies-to, when) 파싱. glob 패턴 매칭, when 조건 필터링. 시스템 프롬프트에 "프로젝트 규칙" 섹션 자동 주입. ProjectRuleTool에 list_rules/read_rule 액션 추가. `EnableProjectRules` 토글 | +| **반복 테스트-수정 루프** | TestLoopTool `auto_fix` 액션 — 테스트 실행→구조화된 실패 파싱(.NET Failed/pytest FAILED, 파일 경로·라인 번호 추출)→`[AUTO_FIX:]` 마커 출력. AgentLoopService에서 test_loop+AUTO_FIX 감지 시 반복 예산 자동 확장. `MaxTestFixIterations` 설정 | +| **병렬 도구 실행** | 읽기 전용 도구(file_read, grep_tool, glob 등 12종 ReadOnlyTools 셋) 자동 분류 → `Task.WhenAll()` 병렬 실행, 쓰기 도구는 순차 유지. ParallelState 클래스로 async ref 제약 해결. `EnableParallelTools` 토글 | +| **SKILL.md 표준 호환** | 외부↔내부 도구 이름 매핑 테이블 20개(Bash→process, Read→file_read, Grep→grep_tool, execute_command→process 등). ParseSkillFile에서 스킬 본문 로드 시 자동 치환 | +| **사내 보안 예외** | AntiTamper 보안 감지에 사내 IP 대역(11.99/11.90/12.25/12.23/12.24) 예외 처리. IsTrustedNetwork()로 IPv4 프리픽스 매칭 | +| **설정 추가** | `PlanMode`(off/always/auto), `EnableProjectRules`(bool), `MaxTestFixIterations`(int), `EnableParallelTools`(bool), `DisabledTools`(List\) | + +### v1.6.1 + +> **개발 범위**: 설정 UI 개선 + 헬프 IP 보호 + 모델 선택 버그 수정 + 차세대 고도화 계획 수립 + +| 구분 | 내용 | +|------|------| +| **고품질 문서 생성 설정** | 설정 › 에이전트 › 코워크에 "고품질 문서 생성" ToggleSwitch 추가. 멀티패스 문서 엔진 기본값 OFF (무료 API 환경 호환성). 비활성 시 `document_plan`/`document_assemble` 도구 차단 | +| **헬프 화면 IP 보호** | 버전별 신기능 항목 삭제, 영역별 핵심 기능 중심 재구성. 내부 기술 용어(SSE, AES-256-GCM, DPAPI, OpenXML 등) 노출 제거. CLAUDE.md에 헬프 IP 보호 규칙 추가 | +| **모델 선택 팝업 버그 수정** | 서비스만 변경 후 모델 미선택 시 팝업 닫으면 이전 서비스/모델로 롤백. 모델 확정(`Save`) 시에만 변경 반영 | +| **ESC 키 닫기 확장** | AboutWindow(개발 정보) ESC 키 닫기 추가 | +| **가이드 버전 표기 제거** | 사용자/개발자 가이드 헤더 version-tag 및 푸터 버전 번호 제거. CLAUDE.md에 가이드 버전 미표기 규칙 추가 | +| **차세대 고도화 계획 수립** | Phase 16(v1.7.0)~18(v2.0) 계획: 플랜 모드, 도구 관리 UI, 프로젝트 규칙, 자기 성찰, 멀티파일 Diff, 에이전트 팀 등 18개 기능 | + +### v1.6.0 + +> **개발 범위**: Phase 15 — 멀티패스 문서 엔진 + 내장 스킬 29종 확장 + 에이전트 도구 42개 + PPT 네이티브 생성 + +| 구분 | 내용 | +|------|------| +| **멀티패스 문서 생성 엔진** | `document_plan` (개요 구조화) + `document_assemble` (섹션별 조립) 도구 신규 추가. 3페이지 이상 문서 작성 시 개요→섹션별 상세→조립 방식으로 품질 대폭 향상. 코워크 보고서/문서 프리셋에 멀티패스 지시문 자동 포함 | +| **PPT 네이티브 생성** | `pptx_create` 도구 — OpenXML SDK 기반 C# 네이티브 구현. Python/Node 없이 슬라이드 생성 (title/content/two_column/table/blank 레이아웃, 4종 테마) | +| **데이터 분석 도구** | `data_pivot` — CSV/JSON 그룹화·피벗·집계 (sum/avg/count/min/max), 필터·정렬·Top N 지원. LINQ 기반 순수 C# 구현 | +| **템플릿 렌더링** | `template_render` — Mustache 스타일 변수 치환 + 반복({{#list}}) + 조건부({{^cond}}) 렌더링. 정기 보고서 템플릿 자동화 | +| **이미지 분석** | `image_analyze` — LLM 멀티모달 활용 이미지 설명/텍스트 추출/차트 데이터 해석/비교 분석 | +| **파일 변경 감지** | `file_watch` — 폴더 내 최근 변경·생성 파일 탐지 (상대 시간 지원: 1h/24h/7d), 유형별 통계 | +| **텍스트 요약** | `text_summarize` — 긴 텍스트/문서 청크 분할 → 핵심 문장 추출 요약 (bullet/paragraph/executive/technical 스타일) | +| **내장 스킬 16종 추가** | email-draft, translate, compare, weekly-report, log-analyze, sql-report, data-convert, refactor, gen-test, impact + 외부 검증 스킬 6종: security-audit (보안 코드 감사/OWASP), prd-generator (요구사항 정의서/유저스토리), adr-writer (아키텍처 결정 기록), changelog (변경이력/릴리즈노트), dependency-audit (의존성 분석/라이선스), perf-audit (성능 감사/안티패턴) — **총 29종** | +| **설정 추가** | `EnableMultiPassDocument` (멀티패스 문서 ON/OFF), `MultiPassThresholdPages` (자동 멀티패스 기준 페이지 수, 기본 3) | +| **가이드 뷰어 버튼 수정** | 닫기/최소화/최대화 버튼 MouseLeftButtonDown + Handled로 DragMove 충돌 해결 | +| **ESC 키 닫기** | GuideViewerWindow, HelpDetailWindow에서 Escape 키로 창 닫기 지원 | + +### v1.5.4 + +> **개발 범위**: Phase 12-3 완료 + 대화 UX 안정화 + 슬래시 팝업 고도화 + 설정 개선 + +| 구분 | 내용 | +|------|------| +| **Phase 12-3 완료** | 실행이력상세도를 개발자 탭으로 이동. Phase 12-3 (런타임 스킬 + 워크플로우 분석기 + 설정 개선) 전체 완료 | +| **글로우 효과 지속** | 레인보우 글로우가 스트리밍 종료 시까지 지속 (기존 3초 자동 꺼짐 → StopRainbowGlow 페이드아웃). Chat/Cowork/Code 전체 적용 | +| **스트리밍 경과 시간 표시** | 헤더 우측에 실시간 경과 시간 표시 (0s, 5s, 12s...). 완료 후 하단에 최종 시간 + 토큰 사용량 한 줄 TextBlock 표시 (줄바꿈 방지) | +| **슬래시 팝업 UX 개선** | ↑/↓ 방향키 아이템 단위 이동 + 선택 하이라이트, Enter로 실행, 마우스 휠 스크롤 지원, 기본 표시 7개 (최대 20), `/help` 직접 입력 시 도움말 창 표시, 슬라이더에 현재 값 실시간 표시 | +| **도움말 창 닫기 수정** | DragMove 충돌 해결 — MouseLeftButtonDown + Handled로 닫기 이벤트 우선 처리. 드래그는 헤더 영역에서만 동작 | +| **설정 접기/열기 수정** | 도구 카테고리·스킬 그룹 접기/열기를 MouseLeftButtonDown으로 변경 (ScrollViewer 내 MouseUp 소실 WPF 이슈 해결) | +| **설정 닫기 다이얼로그 제거** | 저장하지 않고 닫을 때 확인 팝업 + 하단 토스트 배너 제거, 바로 닫힘 (변경사항 자동 revert) | +| **설정 스킬 로딩 지연 해결** | 스킬 미로드 시 백그라운드 Task로 RuntimeDetector 포함 비동기 로드 후 UI 구성 | +| **탭 전환 시 대화 유지** | StopStreamingIfActive() — 탭 전환 시 스트리밍 즉시 중단 + 대화 즉시 저장. originTab 캡처로 올바른 탭에 ID 매핑. SendRegenerateAsync 이력 갱신 추가 | +| **섹션 간 간격 개선** | 차단 확장자 → 도구/커넥터 간 16px 마진, 도움말 창 스킬 항목 간격 확대, 명령어 열 너비 120px | + +### v1.5.3 + +> **개발 범위**: Phase L2 클립보드 고도화 + Phase 14 에이전트 도구/스킬 확장 + 설정 UI 개선 + 가이드 시스템 + +| 구분 | 내용 | +|------|------| +| 클립보드 이미지 원본 보존 | 원본 PNG를 `clipboard_images/` 캐시 폴더에 저장, 썸네일(80px)은 표시용으로만 사용. Enter 복원 시 원본 해상도로 클립보드 복사. 캐시 정리 정책 (30일/500MB) | +| Shift+Enter 자동 복사 | 히스토리 미리보기(Shift+Enter) 시 시스템 클립보드에 자동 복사 (텍스트/이미지 원본 해상도) | +| 스킬 갤러리 버그 수정 | YAML 아이콘 이스케이프 변환, DragMove 닫기 충돌 해결(3창), 카드 클릭 상세 팝업, 상단바 정렬 | +| **에이전트 도구 12종 추가** | json_tool, regex_tool, diff_tool, clipboard_tool, notify_tool, env_tool, zip_tool, http_tool, sql_tool, base64_tool, hash_tool, datetime_tool | +| **내장 스킬 3종 추가** | api-docs, db-schema, commit-review (총 13종 번들) | +| **설정 UI 개선** | 독 바 탭 3번째 위치로 이동 (테마 뒤), 기타 탭 접기/열기 섹션 (등록된 도구·MCP 커넥터·슬래시 스킬 각각 접기/펼치기) | +| **About 정보 변경** | 개발 정보에서 ".NET 8" 제거 → "Commander + Agent" 표시 (기술 스택 비노출) | +| **가이드 시스템 신설** | 사용자 가이드 + 개발자 가이드 분리 (개발자 가이드에만 버전 이력 포함). AES-256-CBC 고정 키 암호화 (.enc). GuideViewerWindow 내장 뷰어 (WebView2 비동기 초기화). 개발자 모드 ON→개발자 가이드, OFF→사용자 가이드. 트레이 메뉴 → 외부 브라우저 대신 앱 내 뷰어로 전환 | +| **가이드 암호화 도구** | GuideEncryptor.cs (AES-256-CBC 암호화/복호화 유틸리티), encrypt_guides.ps1 (빌드 전 암호화 스크립트) | + +### v1.5.2 + +> **개발 범위**: Phase 12-4/12-5 런타임 스킬 + 워크플로우 분석기 + 개발자 탭 + 설정 개선 + +| 구분 | 내용 | +|------|------| +| **런타임 의존 스킬 (12-4)** | RuntimeDetector — Python/Node.js 설치 감지 (where.exe + --version, 5분 캐시). SkillDefinition.Requires/IsAvailable/UnavailableHint. 고급 스킬 4종 번들 (docx-creator, xlsx-analyzer, pdf-processor, pptx-creator). 슬래시 팝업에서 비가용 스킬 회색 표시. 기타 탭에 스킬 목록 카드 | +| **워크플로우 분석기 (12-5)** | WorkflowAnalyzerWindow — 세로 타임라인 실시간 시각화. AgentEvent 확장 (ElapsedMs/InputTokens/OutputTokens/ToolInput/Iteration). Stopwatch 타이밍 + LastTokenUsage 토큰. AgentLogLevel 3단계 분기 (simple/detailed/debug) | +| **개발자 탭 분리** | 설정 › 에이전트에 개발자 서브탭 신설. 비밀번호 보호 세션 전용. 개발자모드/실행이력상세도/스텝바이스텝/워크플로우 시각화/감사로그/에이전트고급/모델폴백/MCP서버 배치 | +| **설정 개선** | AgentLogLevel 기본값 simple, DevMode 세션 전용화 (매번 재인증), WorkflowVisualizer 토글 추가, 개발자모드 ? 툴팁 제거 | +| **UI 개선** | 훅/MCP 서버 추가 다이얼로그에 플레이스홀더 입력 예시, 좌우 패딩 증가, 훅 ESC 닫기, 코드 리뷰 툴팁 오탈자(변경사항) 수정 | +| **설정 기능 탭 개편** | 기능 설정 페이지를 3개 서브탭(AI 기능 / AX Commander / 디자인·기타)으로 분류. 클립보드 확장을 디자인·기타로 이동, 실행이력상세도를 코워크/코드 탭으로 복귀 | +| **Phase 13 계획 수립** | 스킬 생태계 + 에이전트 분석 고도화 5개 항목 (스킬 갤러리/편집기/가져오기·내보내기/통계 대시보드/AgentLogLevel 연동). AGENT_ROADMAP 문서 반영 | +| **스킬 시각적 편집기 (13-2)** | SkillEditorWindow — 폼 기반 스킬 생성/편집 GUI. 아이콘 선택기(MDL2 20종), 도구 체크리스트(ToolRegistry 연동), 템플릿 삽입(도구목록/출력형식/단계별), 토큰 예상 미리보기, YAML 프론트매터 + 마크다운 본문 자동 생성, 사용자 스킬 폴더 저장. 스킬 갤러리 연동 (새 스킬 → 편집기, 사용자 스킬 편집 → 시각적 편집기) | + +### v1.5.1 + +> **개발 범위**: Phase 12 스킬/커넥터 고도화 + UI 개선 + 버그 수정 + +| 구분 | 내용 | +|------|------| +| **슬래시 명령 영어 전환** | 내장 슬래시 명령 11개를 한국어(/요약,/번역)에서 영어(/summary,/translate,/review,/pr 등)로 전환. IME 전환 없이 즉시 입력 가능 | +| **도구/커넥터 관리 UI (12-1)** | 설정 › 에이전트 › 기타 탭에 등록된 도구 29종을 5개 카테고리(파일/프로세스/코드분석/문서생성/에이전트)로 분류하여 표시. MCP 커넥터 안내 섹션 | +| **SKILL.md 표준 호환 (12-2)** | SkillService — *.skill.md (기존) + 폴더/SKILL.md (표준) 2형식 동시 지원. YAML metadata 맵 파싱, license/compatibility/allowed-tools 필드. SkillDefinition 확장 | +| **커스텀 ComboBox** | 전역 ComboBox/ComboBoxItem 스타일 — ControlTemplate 기반 모던 드롭다운, 호버/선택 효과, Slide 애니메이션. 설정창 전체(27개소) 자동 적용 | +| **BlockedPaths 패턴 수정** | `*\Documents\*` → `*Documents*` — 백슬래시 없는 패턴으로 수정하여 정상 차단 동작 | +| **사용자 가이드 정리** | v1.5.1 이력 추가, v1.4.0 이하 이전 이력으로 접기, 내부 기술 용어 제거(DPAPI, Ollama/vLLM, 클래스명 등), 푸터 버전 갱신 | + +### v1.5.0 + +> **개발 범위**: 대화 서비스 Phase 9~11 완료 + 런처 Phase L1 추가 + 저장 공간 관리 + 문서 체계화 + +| 구분 | 내용 | +|------|------| +| **LSP 코드 인텔리전스 (9-1)** | LspClientService — C#/TS/Python/C++/Java 언어 서버 자동 감지. `lsp_code_intel` 도구 (goto_definition, find_references, symbols). 설정 `EnableLsp` 토글 | +| **서브에이전트 (9-2)** | SubAgentTool (`spawn_agent`) + WaitAgentsTool (`wait_agents`). 읽기 전용 격리 실행. `MaxSubAgents` 설정으로 동시 실행 제한 | +| **코드 시맨틱 검색 (9-3)** | CodeIndexService — TF-IDF 인덱싱 (camelCase 분할, 50라인 청크). `search_codebase` 도구. `EnableCodeIndex`/`CodeIndexMaxFileKb` 설정 | +| **자동 테스트 루프 (9-4)** | TestLoopTool — generate/run/analyze 3단계. .NET/Python/Node.js/Go 프레임워크 자동 감지 | +| **이벤트 트리거 (9-5)** | AgentTriggerService — FileSystemWatcher(파일 변경) + DispatcherTimer(스케줄). triggers.json 규칙 기반 | +| **PDF 내보내기 (9-6)** | PdfExportService — HTML 인쇄 최적화 + 브라우저 자동 인쇄. 대화 내보내기에 "PDF 인쇄용 HTML" 옵션 추가 | +| **diff 뷰어 (9-7)** | DiffViewerPanel — 라인 기반 diff (Added/Removed/Equal), 라인 번호, Accept/Reject 버튼 | +| **탐색기 셸 확장** | ShellExtensionService — HKCU 레지스트리 우클릭 메뉴 등록/해제. 파일/폴더/폴더배경 3종 | +| **저장 공간 관리** | StorageAnalyzer — 앱 데이터 사용량 분석 (대화/감사/로그/인덱스/클립보드), 드라이브 여유 공간, 7/14/30일 정리. 설정 공통 탭에 UI | +| **설정 도움말 아이콘** | AI 관련 설정 17개에 `?` 아이콘 + `HelpTooltipStyle` 커스텀 다크 툴팁 | +| **폴백 모델 개선** | 서비스별 그룹화 (Ollama/vLLM/Gemini/Claude). ViewModel과 AppSettings 동시 읽기로 저장 전 즉시 반영 | +| **클립보드 붙여넣기** | Alt+SetForegroundWindow 우회. TryGetSelectedText 후크 스레드 분리 | +| **독 바 개선** | 버튼 히트 테스트 수정 (MouseLeftButtonDown), 시작 시 자동 표시, 설정 실시간 반영 | +| **포맷 메뉴** | AI 자동 선택 맨 위로 이동 | +| **코드 탭 아이콘** | 파일(앰버)/권한(파랑·빨강)/데이터활용(녹·앰버·회) 색상 구분 | +| **사내 환경 원칙** | CLAUDE.md에 외부 의존 최소화, 데이터 로컬 저장, 텔레메트리 금지 지침 추가 | +| **문서 체계화** | CLAUDE.md 문서 관리 원칙 추가, AGENT/LAUNCHER ROADMAP Phase 9/L1 완료 표시, NEXT_ROADMAP 차기 계획 전면 업데이트 | +| **자동 모델 선택 (10-1)** | AutoRouterService — 질문 유형(코딩/번역/분석) 감지 → 최적 모델 자동 라우팅. 잠금 모드 지원 | +| **에이전트 메모리 (10-2)** | MemoryTool — 프로젝트 규칙, 코딩 선호도 자동 기억. 대화 간 영속 유지 | +| **멀티모달 입력 (10-4)** | 이미지/스크린샷 Ctrl+V 붙여넣기 → base64 인코딩 → Gemini/Claude/Ollama/OpenAI Vision API 직접 전달. 이미지 미리보기 UI | +| **코드 검색 개선 (10-5)** | TF-IDF + SQLite 영속 인덱스, 증분 업데이트, 바이그램 토큰, 스톱워드 필터링 | +| **에이전트 훅 시스템 (10-6)** | 도구 호출 전/후 사용자 정의 스크립트 실행. hooks.json 규칙 기반 | +| **스킬 시스템 (11-1)** | SkillService — *.skill.md YAML 프론트매터 파싱 → 슬래시 명령 자동 등록. 3폴더 우선순위(앱→%APPDATA%→커스텀). 기본 스킬 3종(daily-standup/bug-hunt/code-explain) 자동 생성. `skill_manager` 도구 | +| **AI 코드 리뷰 (11-2)** | CodeReviewTool — diff_review/file_review/pr_summary. 정적 분석(빈 catch/동기 대기/하드코딩 키/긴 메서드). Git diff 파서. 리뷰 초점(bugs/performance/security/style) | +| **드래그&드롭 AI (11-3)** | 파일 드래그 시 유형별 AI 액션 팝업(코드→리뷰/설명/리팩토링, 문서→요약/번역, 데이터→분석/시각화, 이미지→설명). "첨부만" 옵션. `EnableDragDropAiActions` 설정 | +| **프로젝트 지침 (11 추가)** | ProjectRuleTool — AX.md read/append/write. 사용자 승인 후 저장. 상위 3단계 탐색 | +| **슬래시 명령어 강화 (11 추가)** | 탭별 필터링(Chat=공통, Cowork/Code=공통+개발). `/help` 도움말 창. 총 12개 내장 명령 | +| **사용 통계 차트 확장** | 메인 탭 미니차트 2종, 커맨더 탭 요일별 평균차트, 에이전트 탭 탭비율+토큰비율 차트 | +| **인사 문구 외부화** | greetings.json 외부 파일 로딩 + 임베디드 리소스 폴백 + 5분 캐시 | +| **캡처 알림 개선** | 지연 캡처 카운트다운 알림 제거 (시작/초단위 모두). 완료 알림만 유지 | +| **알림 아이콘 수정** | ToolTipIcon.Info → ToolTipIcon.None 변경으로 앱 트레이 아이콘 표시 | + +### v1.4.0 + +> **개발 범위**: 런처 고도화 Phase L1 (LAUNCHER_ROADMAP) + 대화 서비스 고도화 Phase 9 (AGENT_ROADMAP) 병행 +> +> | 영역 | 문서 | 완료 항목 | +> |------|------|----------| +> | 런처 | `LAUNCHER_ROADMAP.md` | L1-1(선택 텍스트 AI), L1-5(독 바), L1-6(대화상자 통합), L1-7(클립보드 핀/카테고리) | +> | 대화 서비스 | `AGENT_ROADMAP.md` | Phase 8 완료, 기술부채 해결 | + +| 구분 | 내용 | +|------|------| +| **선택 텍스트 AI 명령 (L1-1)** | TextActionPopup — 핫키 시 선택 텍스트 감지 (Ctrl+C 시뮬레이션), 커서 위치에 액션 팝업 표시 (번역/요약/교정/설명/다시쓰기), ↑↓/마우스 선택, Enter 실행 → AX Agent에 `!` 프리픽스로 전달 | +| **독 바 (L1-5)** | DockBarWindow — 화면 하단 고정 미니 바. 설정 기반 동적 아이템 빌드 (`DockBarItems`). CPU(PerformanceCounter)/RAM(GlobalMemoryStatusEx)/시계 실시간 표시. 무지개 글로우, 투명도(0.3~1.0), 위치 기억(`DockBarLeft/Top`), 드래그 이동. 트레이 메뉴 토글 | +| **대화상자 통합 (L1-6)** | FileDialogWatcher — `SetWinEventHook(EVENT_OBJECT_SHOW)` + `#32770` 클래스 감지. 열기/저장 대화상자 감지 시 런처 자동 열기 (`cd ` 프리픽스) | +| **클립보드 핀/카테고리 (L1-7)** | ClipboardEntry에 `IsPinned`/`Category` 추가. 자동 카테고리 분류 (URL/코드/경로/일반). 핀 항목 상단 고정 + 삭제 보호. `#pin`/`#url`/`#코드`/`#경로` 필터. Ctrl+P 핀 토글 | +| **아이콘 교체** | 다이아몬드 픽셀 ICO (7 sizes, 25% block, rounded) 생성. 상=파랑/하=빨강/좌=녹/우=녹. AboutWindow/LauncherWindow/SetupForm/SVG 전체 색상 통일. 모든 Window에 `Icon=` 속성 추가. 바로가기에 `IconLocation` 명시 | +| **독 바 설정 탭** | SettingsWindow에 독 바 탭 추가 — 자동 표시, 글로우 효과, 투명도 슬라이더, 위치 초기화 버튼, 표시 항목 토글 (8종) | +| **인스톨러** | UAC `requireAdministrator` 유지. SetupForm 다이아몬드 아이콘 `FillRoundRect`로 둥근 모서리. 바로가기 `IconLocation` 설정 | +| **UI 통일** | 알림 카테고리 CheckBox → ToggleSwitch. Ollama/vLLM 서버 주소 라벨 "기본 서버 주소"로 통일. 개발자 정보창 기여자 표시 (`about.json` contributors). 창 높이 조정 | + +### v1.3.1 + +| 구분 | 내용 | +|------|------| +| **SnapHandler 레이아웃 확장** | 기존 11개 → 22개 스냅 옵션. 3등분(third-l/c/r), 2/3+1/3(two3-l/r), 3분할 조합(l-rt, l-rb, r-lt, r-lb) 추가 | +| **Everything SDK 연동** | `es` 프리픽스로 Everything 초고속 파일 검색 통합. Everything 미설치 시 graceful fallback. 파일 타입별 아이콘 구분 | +| **플러그인 자동 설치** | `PluginHost.InstallFromZip()` — 로컬 zip에서 DLL/JSON 스킬 자동 추출·등록·로드. `UninstallPlugin()` 제거 기능 포함. URL 기반 설치는 사내 보안 정책으로 제외 | +| **이미지 클립보드 영속화** | 클립보드 히스토리 이미지 항목을 PNG→Base64로 DPAPI 암호화 저장/복원. 앱 재시작 후에도 이미지 히스토리 유지 | +| **다크 테마 대비 강화** | 6종 다크 테마 SecondaryText/PlaceholderText/HintText 밝기 +12~20 추가 개선. 헬프/단축키 창 텍스트 가독성 향상 | +| **인스톨러 버전 동기화** | SetupForm.cs `AppVer` 1.2.2→1.3.1 수정. 버전 관리 체크리스트에 MCP 버전·로드맵 문서 항목 추가 | +| **사용자 가이드 업데이트** | version-tag v1.2.2→v1.3.1, v1.3.0/v1.3.1 버전 이력 추가, version-tag에 `color:#fff` 추가 | +| **헬프 창 업데이트** | v1.3.1 신기능 항목 추가, 파일 타입별 심볼 12종 추가 (Excel/Word/Pdf/Image/Video/Music/Archive/Code 등) | +| **문서 정비** | AI_Service_Review.html → AGENT_ROADMAP.html 병합 후 삭제, 기술부채 항목 완료 표시, LAUNCHER_ROADMAP 생성 | + +### v1.3.0 + +| 구분 | 내용 | +|------|------| +| **MCP 클라이언트** | McpClientService (stdio/JSON-RPC 2.0). ConnectAsync → initialize → tools/list → tools/call. McpTool이 IAgentTool로 래핑 | +| **모델 폴백** | LlmService.SendAsync에 FallbackModels 순차 시도. 실패 시 토스트 알림으로 폴백 모델 안내 | +| **대화 분기** | ChatConversation.ParentId/BranchLabel, ForkConversation(). 우클릭 "여기서 분기" 메뉴. 사이드바 들여쓰기 표시 | +| **커맨드 팔레트** | CommandPaletteWindow (Ctrl+Shift+P). 16개 명령, 한글 초성 검색 | +| **보안 감사 로그** | AuditLogService — JSON 영속화, 30일 보관, 설정 토글 + 폴더 열기 버튼 | +| **에이전트 자율성** | 동적 반복 한도 (도구 15+회 → 한도 2배, 최대 50). 다단계 반성 | +| **토큰 관리** | TokenEstimator (모델별 비용, CJK 가중치). 상태바 비용 표시 | +| **스플릿 뷰** | Code 탭 파일 수정 시 자동 프리뷰, AutoPreview 설정 | +| **다중 서버** | RegisteredModel에 endpoint/apiKey 필드. 모델별 서버 라우팅 (Ollama/vLLM) | +| **대화별 설정** | Permission/DataUsage/Mood를 대화별 독립 저장·복원 | +| **DiffService** | LCS 기반 라인 diff (Added/Removed/Equal). GetSummary() 통계 | + +### v1.2.2 + +| 구분 | 내용 | +|------|------| +| **AX.md 프로젝트 문맥 파일** | 작업 폴더에 AX.md를 만들면 Cowork/Code 시스템 프롬프트에 자동 주입. 상위 3단계까지 탐색, 최대 8000자 | +| **팁 알림 시스템** | Cowork/Code 탭 전환 시 24개 사용법 팁 랜덤 표시. 설정: 표시 여부(ShowTips) + 자동 사라짐 시간(TipDurationSeconds, 0~30초) | +| **개발자 모드** | 설정 → 공통 → 개발자 모드 (비밀번호 보호). 도구 호출 파라미터/결과 상세 표시 + 스텝별 승인/건너뛰기/중단 | +| **통계 강화** | DailyUsageStats에 ChatCounts(탭별), TotalTokens/PromptTokens/CompletionTokens 추가. 통계 윈도우에 대화 빈도 + 토큰 사용량 14일 막대 차트 | +| **무지개 글로우** | 메시지 전송 시 입력창 테두리에 7색 무지개 그라데이션 회전 애니메이션 (2초, LinearGradientBrush 회전) | +| **런처 중복 제거** | IndexService: Path 기반 중복 방지. CommandResolver: 검색 결과에서 같은 Path 필터링 (2중 방어) | + +### v1.2.1 + +| 구분 | 내용 | +|------|------| +| **Code 시스템 프롬프트 고도화** | Claude Code/OpenCode 벤치마크 기반 8단계 워크플로우 (ORIENT→BASELINE→ANALYZE→PLAN→IMPLEMENT→VERIFY→GIT→REPORT). 테스트 우선, 변경 영향 분석, 자기 검증 | +| **GitTool** | 사내 GitHub Enterprise 연동. status/diff/log/add/commit/branch/checkout/stash/remote 지원. push/pull/fetch/rebase 차단 (사용자 직접 수행) | +| **BuildRunTool lint/format** | action="lint", action="format" 추가. ESLint/Prettier(JS), Ruff/Black(Python), dotnet format(C#), checkstyle(Maven) 자동 매핑 | +| **Grep 강화** | context_lines(0~5줄) 파라미터로 매치 전후 코드 표시, case_sensitive 파라미터로 대소문자 구분 제어 | +| **FileEdit replace_all** | replace_all=true 시 모든 매치 일괄 교체. false면 기존 유일성 검증 유지 | +| **루트 드라이브 차단** | C:\, D:\ 등 최상위 드라이브를 작업공간으로 설정하는 것을 차단 (하위 폴더 선택 필수) | +| **프리셋 순서 정렬** | TopicPreset.Order 필드 추가, JSON에서 order 값으로 표시 순서 제어 | +| **카테고리 필터 개선** | Cowork/Code: 프리셋 카테고리 기반 필터, 커스텀 프리셋 `__custom__` 통합 분류 | +| **에이전트 이름 매핑** | Code 카테고리별 에이전트 이름 (코드개발/리팩터링/코드리뷰/보안점검/테스트) + 대화 이력 아이콘 정확 표시 | +| **AI Agent 상세 가이드** | 사용자 가이드에 Chat/Cowork/Code 3탭 상세 설명, 경고 문구 (백업 필수), 공통 기능 안내 | +| **보안 점검 리네이밍** | "보안 취약점 점검" → "보안 점검"으로 간결하게 변경 | + +### v1.2.0 + +| 구분 | 내용 | +|------|------| +| **Code 탭 활성화** | 코딩 에이전트 탭 활성화 — 코드 개발, 리팩터링, 코드 리뷰, 보안 점검, 테스트 작성 5개 프리셋 | +| **DevEnvDetectTool** | IDE(VS Code, Visual Studio, IntelliJ, PyCharm) + 런타임(dotnet, python/conda, java, node, gcc) + 빌드도구(MSBuild, Maven, Gradle, CMake) 자동 감지. 레지스트리+PATH+환경변수, 60초 캐시 | +| **BuildRunTool** | 프로젝트 타입 감지(*.csproj, pom.xml, package.json 등 7종) + 빌드/테스트/실행 명령 자동 매핑 | +| **CodeSettings** | Nexus URL, NuGet/PyPI/Maven/npm 저장소 설정, 선호 IDE 경로, 빌드 타임아웃(30~300초), 완료 알림 | +| **Code 시스템 프롬프트** | 분석→계획→구현→검증→보고 5단계 워크플로우, 언어별 가이드라인(C#/Python/Java/C++/JS), 패키지 저장소 주입 | +| **설정 UI** | Code 탭 전용 설정 패널 — Nexus 저장소, 언어별 소스 URL, IDE 경로, 빌드 타임아웃, 완료 알림 | +| **마크다운 렌더러 완성** | 테이블(`\|`), 인용(`>`), 취소선(`~~`), 링크(`[text](url)`) 지원 추가 | +| **메시지 삭제** | 우클릭 → "이후 메시지 모두 삭제" (확인 다이얼로그 + 재렌더링) | +| **탭 단축키** | Ctrl+1=Chat, Ctrl+2=Cowork, Ctrl+3=Code | +| **에러 복구 UI** | LLM 오류 시 "재시도" 버튼 자동 표시 | +| **카테고리 필터 개선** | Cowork/Code: 프리셋 카테고리 기반 필터, 커스텀 프리셋 통합 분류 | +| **에이전트 이름 확장** | Code 프리셋별 에이전트 이름 매핑 (코드 개발/리팩터링/리뷰/보안/테스트) | +| **최대화 버튼** | 타이틀바에 최소화-최대화-닫기 3버튼 | +| **서브 바** | 탭 바 아래에 대화 제목(좌) + 미리보기 버튼(우) 분리 배치 | +| **완료 알림** | Cowork/Code 에이전트 완료 시 시스템 트레이 알림 | + +### v1.1.1 + +| 구분 | 내용 | +|------|------| +| **WebView2 프리뷰** | IE 기반 WebBrowser → Chromium 기반 WebView2 교체. AppData에 데이터 디렉터리 지정 | +| **Markdown 프리뷰** | Markdig NuGet으로 .md 파일을 무드 CSS 적용 HTML 렌더링 | +| **코드 블록 강화** | 라인 번호, 전체화면 팝업, 파일 저장 버튼, 언어별 확장자 자동 추천 | +| **무드 갤러리** | 텍스트 목록 → 2열 비주얼 카드 레이아웃으로 무드 미리보기 선택 | +| **에이전트 진행률 스티키 바** | 메시지 상단 고정 바 — 단계/퍼센트/경과시간, 완료 시 페이드아웃 | +| **파일 빠른 작업** | 생성 파일 배너에 [프리뷰][열기][폴더][복사] 4개 인라인 액션 버튼 | +| **작업 폴더 파일 탐색기** | 접이식 TreeView, 지연 로딩, 우클릭 메뉴(열기/삭제/이름변경), 에이전트 파일 생성 시 자동 새로고침, 상태 저장 | +| **document_review 도구** | 빈 섹션, 플레이스홀더, 날짜 정합성, HTML 태그 균형, 반복 텍스트, 기대 섹션 누락 검사 | +| **format_convert 도구** | md→html, html→txt, csv→html, md→txt 변환. 미지원 변환은 대안 워크플로우 안내 | +| **대화 내 검색** | Ctrl+F 검색 바, 이전/다음 탐색, 결과 개수 표시, ESC 닫기 | +| **메시지 우클릭 메뉴** | 텍스트 복사, 마크다운 복사, 인용 답장, 재생성 | +| **토스트 알림** | 복사/저장 등 액션 시 하단 중앙 페이드인-아웃 알림 | +| **대화 목록 성능** | 레이지 로딩 (50개 단위 + "더 보기"), 제목+내용 통합 검색 (Preview 필드) | +| **의사결정 UI** | 승인/수정/취소 버튼 선택 후 자동 숨김 + 결과 라벨 표시 | +| **채팅 반응형 너비** | 창 크기에 비례하여 메시지 버블 MaxWidth 자동 조절 (최소 500, 최대 1200) | +| **커스텀 프리셋/무드** | 아이콘 셋 선택 UI (5카테고리×8아이콘), 커스텀 무드 CSS 편집, 프리셋 배지 | +| **탭 전환 안정화** | Auto 권한 경고 초기화, 파일 탐색기 상태 복원, 안내문구 갱신 | +| **런처 개선** | 퍼지 검색 Shift+Enter로 폴더 열기, 웹검색 경고문 수정 | + +### v1.1.0 + +| 구분 | 내용 | +|------|------| +| **Cowork 에이전트 루프 엔진** | LLM Function Calling 기반 Plan→Tool Execute→Observe→Re-evaluate 반복 루프. 최대 25회 반복, 실패 시 Self-Reflection 자동 재시도 (최대 3회) | +| **도구 시스템 (8종)** | file_read, file_write, file_edit, glob, grep, process, folder_map, document_read | +| **문서 생성 스킬 (6종)** | excel_create (.xlsx), docx_create (.docx), csv_create (.csv), markdown_create (.md), html_create (.html), script_create (.bat/.ps1) | +| **디자인 템플릿 시스템** | 10종 CSS 무드 템플릿 (modern, professional, creative, minimal, elegant, dark, colorful, corporate, magazine, dashboard). 대화창 하단 무드 아이콘 바로 선택 | +| **Task Decomposition** | LLM 응답에서 계획 단계 자동 추출 → 진행률 UI (단계 카드 + 프로그레스 바) | +| **Thinking UI** | LLM 추론 과정을 "Thinking..." 배너로 실시간 표시 | +| **Context Condenser** | 토큰 초과 시 이전 대화를 LLM으로 자동 요약하여 컨텍스트 윈도우 관리 | +| **Folder Map 도구** | 작업 폴더 디렉토리 트리 자동 생성 (depth/filter 지원, 빌드 산출물 자동 제외) | +| **Diff Preview** | file_edit 도구 실행 시 unified diff 생성 + 색상 하이라이팅 UI (추가=초록, 삭제=빨강) | +| **문서 읽기 도구** | PDF (PdfPig), DOCX, XLSX (OpenXml), CSV/TXT 등 다양한 형식 텍스트 추출. 보고서 작성 시 폴더 데이터 자동 참조 | +| **폴더 데이터 활용 설정** | 적극 활용(자동 탐색) / 소극 활용(요청 시) / 활용하지 않음 — 설정 + 대화창 하단 메뉴에서 전환 | +| **Cowork 설정 UI** | 파일 접근 권한, 출력 형식, 자동 미리보기, 에이전트 반복/재시도 횟수, 로그 상세도, 데이터 활용 수준 | +| **커스텀 폴더 메뉴** | 시스템 ContextMenu → 커스텀 Popup (Border+MouseLeftButtonUp 패턴, 14px 폰트) | +| **모델 선택기 개선** | 서비스 변경 시 팝업 유지, 모델 목록 동적 재구성 (closeOnClick 패턴) | +| **Gemini 모델 수정** | 존재하지 않는 모델 ID(gemini-3-flash 등) → 실제 모델(gemini-2.5-pro/flash 등)로 교체 | +| **에이전트 이벤트 UI** | Planning/StepStart/StepDone/ToolCall/ToolResult 배너 + 접이식 상세 보기 | + +### v1.0.7 + +| 구분 | 내용 | +|------|------| +| **Chat/Cowork/Code 3탭 UI** | 상단 탭을 Agent 단일 → Chat \| Cowork \| Code 3탭으로 전환. Cowork/Code 탭 활성화 (Phase 2/3 준비) | +| **작업 폴더 선택 바** | 입력 바 상단에 폴더 경로 표시 + 선택/해제 버튼. Cowork/Code 탭에서 자동 표시. 최근 폴더 10개 기억 | +| **파일 컨텍스트 첨부** | 파일 첨부 버튼 + 드래그 앤 드롭으로 파일을 대화 컨텍스트에 추가 (최대 10MB). 텍스트 파일 내용 자동 삽입 | +| **권한 시스템 설계** | 3단계 파일 접근 권한: Ask(매번 확인) / Auto(자동 허용) / Deny(차단). 설정에서 기본값 변경 가능 | +| **대화 주제 프리셋 7종** | 일반/경영/연구개발/제품분석/수율분석/제조기술/시스템 — JSON 기반 프리셋 동적 로드 (EmbeddedResource) | +| **대화 내보내기 확장** | Markdown + JSON + HTML + Text 4종 포맷 지원. HTML은 다크 테마 스타일 내장 | +| **메시지 타임스탬프** | 사용자/AI 메시지에 HH:mm 시간 표시 | +| **격려 알림 주기 타이머** | 주기적 타이머 추가 — 화면 잠금 없이도 설정 간격마다 격려 문구 팝업 표시 | +| **커스텀 메시지 박스** | 앱 전체 기본 MessageBox를 테마 통합 커스텀 다이얼로그로 교체 (인스톨러 포함) | + +### v1.0.6 + +| 구분 | 내용 | +|------|------| +| **스트리밍 실시간 표시 수정** | 80ms 쓰로틀 + Task.Delay → 청크 단위 갱신 + `Dispatcher.InvokeAsync(Background)` 방식으로 전환. 응답이 실시간으로 부드럽게 표시 | +| **Shift+Enter 줄바꿈** | `AcceptsReturn="True"` + PreviewKeyDown 핸들러. Shift+Enter=줄바꿈, Enter=전송. 입력 영역 자동 수직 확장 (MinHeight 40 → MaxHeight 160) | +| **프롬프트 카드 워터마크** | 프롬프트 카드 선택 시 안내 문구를 실제 텍스트가 아닌 워터마크(placeholder) 오버레이로 표시. 입력 시 자동 사라짐 | +| **좋아요/싫어요 상호 배타 토글** | 좋아요↔싫어요 상호 배타 — 하나를 누르면 다른 쪽 자동 해제. `resetSibling`/`registerReset` 콜백 패턴 | +| **디스크 용량 초과 자동 삭제** | 드라이브 사용률 98% 초과 시 핀 고정 제외 오래된 대화부터 자동 삭제 (`PurgeForDiskSpace`). 2% 여유 확보 후 중단 | +| **우클릭 컨텍스트 메뉴** | 대화 제목에서 우클릭 시 커스텀 메뉴 바로 표시 (펜 아이콘 클릭 불필요). `MouseRightButtonDown` 이벤트 | +| **대화 더블클릭 오류 수정** | Visual 자식 인덱스 충돌 오류 — `RemoveAt`+`Insert` 패턴으로 안전 교체 + 스트리밍 중 대화 전환 시 `_streamCts?.Cancel()` 처리 | + +### v1.0.5 + +| 구분 | 내용 | +|------|------| +| **AX Agent 대화 창** | `!` 예약어로 AI 대화 창 (ChatWindow) 구현. 좌측 대화 목록 + 우측 메시지 영역 2패널 구조. Claude Desktop 스타일 디자인 | +| **LLM 4종 서비스 지원** | Ollama, vLLM(OpenAI 호환), Gemini, Claude API 통합. 설정 창에서 서비스/모델 등록 및 전환 | +| **스트리밍 + 타이핑 효과** | SSE 기반 스트리밍 응답. 12ms 타이머로 1~3글자씩 타이핑 효과 표시. 커서 깜빡임 애니메이션 | +| **마크다운 + 코드 구문 강조** | 코드 블록(10개 언어 키워드 하이라이팅), 목록, 볼드, 인라인 코드, 복사 버튼 | +| **토큰 사용량 표시** | 각 서비스별 실제 토큰 파싱. k/m 단위 표기 (1.2k, 2.3m). 응답 소요시간(초) 실시간 표시 | +| **프롬프트 카드** | 개발자 미리 설정 시스템 프롬프트 (Tag 형식). 카드 클릭 시 SystemCommand 자동 삽입 + placeholder 안내 | +| **사용자 프롬프트 템플릿** | 설정에서 추가/삭제 가능한 사용자 정의 프롬프트 템플릿. 입력 바 왼쪽 버튼으로 접근 | +| **대화 관리** | 고정/이름변경/분류(6종 카테고리)/삭제. 커스텀 Popup 메뉴. 인라인 제목 편집 (클릭 → 입력 → Enter) | +| **피드백 영속성** | 메시지별 좋아요/싫어요 상태 저장 및 대화 로드 시 복원 | +| **사용자 메시지 편집/복사** | 사용자 메시지에 편집/복사 버튼 추가. 편집 시 해당 메시지 이후 재생성 | +| **커스텀 Popup 메뉴 통일** | 모든 드롭다운 메뉴를 ContextMenu → 커스텀 Popup (12px 라운드, 호버, 드롭섀도) 으로 전환 | +| **캡처 순서 변경** | cap 명령 아이템 순서: 영역 선택 → 활성 창 → 스크롤 → 전체 화면 (사용 빈도순) | +| **지연 캡처** | Shift+Enter로 캡처 아이템 선택 시 타이머(3초/5초/10초) 선택 후 카운트다운 캡처 | +| **버그 수정** | 목록 텍스트 오버플로(StackPanel→Grid), 편집 Visual 자식 오류, + 버튼 클릭 불가, 제목 편집 이중 커밋 크래시 | + +### v1.0.4 + +| 구분 | 내용 | +|------|------| +| **설정 알림 바로보기 버튼** | 알림 탭 하단에 "바로보기" 버튼 추가. 시간 미도래 시에도 설정한 위치·표시 시간으로 팝업 즉시 확인 가능 | +| **런처 안내 문구 랜덤화** | 고정 플레이스홀더 "무엇을 도와드릴까요?" → 25종 랜덤 문구. 정중한 인사 + 기능 홍보(계산기·클립보드·웹검색·즐겨찾기·스니펫·워크스페이스·캡처 등). 런처 열릴 때마다 교체. 5개국어 대응(ko/en/ja/zh/vi) | +| **다이아몬드 픽셀 아이콘 애니메이션** | 런처 입력창 좌측 4개 픽셀이 순차적으로 Opacity 점멸 (4초 주기 Forever). 디스플레이 패널 픽셀 점등 형상화 | +| **글로벌 단축키 콤보박스** | 불안정한 키 녹화 방식 제거 → 검증된 12종 키 조합 콤보박스 선택으로 변경. Alt+Space, Ctrl+Space, Ctrl+Alt+Space, Alt+X/A/Z, Ctrl+Shift+Space, Ctrl+`, Win+Space, Ctrl+Alt+A, Ctrl+;, F12 | +| **트레이 메뉴 개편** | "사용 가이드 문서보기" 항목 신규 추가 (GlyphGuide = `\uE736`). "정보" → "개발자 정보"로 이름 변경 + 종료 바로 위로 위치 이동 | +| **사용 통계 화면 FHD 최적화** | 창 높이 640→900px, MinHeight 540→700px. 차트 막대 높이 110→88px (MaxBarHeight 80→66). 자주 쓴 명령어 표시 개수 8→10개. 인기 명령어·즐겨찾기 섹션 간 마진 추가 | +| **사용 가이드 문서 배포** | `Assets/AX Commander 사용가이드.htm` 빌드 시 출력 폴더에 자동 복사. 트레이 메뉴에서 기본 브라우저로 열기. 버전 이력 섹션 포함 (v1.0.0 ~ v1.0.4) | + +### v1.0.3 + +| 구분 | 내용 | +|------|------| +| **키보드 단축키 16종 추가** | 1차: F1(도움말), F5(인덱스 새로 고침), Delete(항목 제거+확인), Ctrl+L(입력 초기화), Ctrl+C(이름 복사), Ctrl+Shift+C(경로 복사), Ctrl+Shift+E(탐색기 열기), Ctrl+Enter(관리자 실행), Alt+Enter(속성 보기). 2차: Ctrl+H(히스토리), Ctrl+R(최근), Ctrl+B(즐겨찾기), Ctrl+K(단축키 도움말), Ctrl+1~9(N번째 실행), F2(이름 바꾸기), PageUp/Down(페이지 스크롤) | +| **결과 목록 번호 뱃지** | 1~9 번호 표시 (IndexToNumberConverter). Ctrl+N으로 즉시 실행 연동 | +| **토스트 오버레이** | 별도 ToastOverlay Border (녹색 배경+체크 아이콘). 경로 복사 등 결과 표시, 2초 자동 숨김 | +| **도움말 검색** | HelpDetailWindow 상단에 SearchBox 추가. 실시간 키워드 필터링 (제목/명령/설명/카테고리) | +| **액션 모드 확장** | → 진입 시 7개 옵션: 경로 복사, 전체 경로 복사, 탐색기, 관리자, 터미널, 속성 보기, 이름 바꾸기 | +| **도움말 창 3탭 메뉴 재설계** | 상단 메뉴를 개요/단축키 현황/예약어 현황 3탭으로 분리. 하위 카테고리 탭 유지. 숫자키 1/2/3으로 탭 전환 | +| **프리픽스 변경** | `~` → 워크스페이스 관리 (기존 `!`), `cd` → 폴더 별칭 (기존 `~`), `!` → 비어있음 (신기능 배정 가능) | +| **설정 버전 마이그레이션** | SettingsService에 `MigrateIfNeeded()` 프레임워크 추가. 이전 버전 settings.json을 최신 스키마로 자동 마이그레이션. 신규 프로퍼티는 C# 기본값 자동 적용. 구조 변경(키 이름 변경 등)은 버전별 마이그레이션 로직 순차 실행 | +| **파괴적 동작 확인** | Delete 키 실행 시 MessageBox 확인 다이얼로그 (OK/Cancel) | +| **토스트 알림** | LauncherWindow에 ShowToast() 메서드 추가. 경로 복사 등 결과를 IndexStatusText에 임시 표시 | +| **Windows 실행 명령 (`^`)** | `^ notepad`, `^ cmd`, `^ calc` 등 Win+R 실행 창과 동일한 명령 실행. RunHandler 신규 추가 | +| **기본 앱 별칭 강화** | `note`, `txt` → 메모장, `msword`/`msexcel`/`mspowerpoint` + 확장자(`docx`, `xlsx`, `pptx`, `csv`, `doc`, `xls`, `ppt`) → 해당 Office 앱. Score 부스트(95)로 항상 최상단 표시 | +| **인스톨러 UI 아이콘** | 폼 아이콘(타이틀바+작업표시줄)에 다이아몬드 픽셀 아이콘 반영 | +| **Help 창 확대** | 880→1020px 너비 확대 + 카테고리 탭 패딩 축소 → 가로 스크롤 없이 모든 탭 표시 | +| **Help 개요 갱신** | 개요 문구에 v1.0.3 표기, 폴더 검색·루틴·일지·한글 앱 실행 기능 반영, 웹검색 예시(`?n` 네이버) 추가 | +| **코드 품질 개선** | ShowIndexingProgress 오버레이 누수 수정(finally 제거), RunHandler Process.Dispose, IndexService volatile, HelpDetailWindow 상수 추출, SetupForm Icon null 체크 | + +### v1.0.2 + +| 구분 | 내용 | +|------|------| +| **빠른 실행 Placeholder** | 입력 필드에 힌트 텍스트 표시 (키워드, 표시 이름, 경로). ModernTextBox 템플릿에 `Tag` 기반 워터마크 추가 | +| **기본 앱 별칭 19종** | 한글+영문 이름으로 즉시 실행: 메모장/notepad, 계산기/calc, 엑셀/excel, 워드/word, 파워포인트/ppt, 탐색기/explorer, cmd, powershell, 그림판/paint, 캡처/snip, Edge, Teams, VS Code, Outlook, 원격/rdp, 작업관리자/taskmgr 등. 실제 설치된 앱만 자동 감지 | + +### v1.0.1 + +| 구분 | 내용 | +|------|------| +| **인스톨러 통합** | 온라인/오프라인 2종 → 오프라인 1종으로 통합. .NET Framework 4.8 기반 (Windows 기본 포함). 관리자 권한 자동 요청 (app.manifest `requireAdministrator`) | +| **검색 확장자 설정** | 설정 → 일반 탭에 태그형 확장자 UI. 기본 30+종 (실행/문서/텍스트/이미지). 사용자 추가/삭제 가능 | +| **폴더 인덱싱** | 인덱스 경로의 1단계 하위 폴더도 검색·열기 가능 | +| **인덱싱 현황 표시** | 런처 하단에 `✓ N개 항목 색인됨 (X.X초)` 자동 표시 → 5초 후 사라짐. 설정 저장 시 프로그레스 오버레이 | +| **Help 인기 탭** | ⭐ 인기 탭 추가 (2번째 위치). 파일검색/웹검색/클립보드 핵심 기능만 필터 | +| **다이아몬드 픽셀 아이콘** | 런처 입력창 좌측 + 정보 창 + 트레이 + 인스톨러 헤더에 벡터 다이아몬드 아이콘 적용 | +| **정보 창 아이콘** | 비트맵 ICO → 벡터 Canvas 렌더링 (해상도 독립, DPI 무관 선명) | +| **언어 라벨** | 설정 → Language (영어 표기로 변경, 다국어 사용자 접근성) | +| **버그 수정** | HelpDetailWindow 인기 탭 연산자 우선순위 버그 (`&&`/`||`), DispatcherTimer 중복 생성 방지, Installer nullable 경고 13개 해소 | + +### v1.0.0 + +정식 릴리즈. 40개+ 명령어, 9종 테마, 11개 설정 탭, 클립보드 DPAPI 암호화, 잠금 해제 알림, 화면 캡처, 모던 트레이 메뉴, 설정 가져오기/내보내기. + +--- + +## 개발 검토 — 워크플로우 병목 분석 그래프 + +> **상태**: 검토 완료 · 구현 대기 +> **검토일**: 2026-03-30 +> **대상**: 개발자 모드 전용 기능 + +### 배경 + +WorkflowAnalyzerWindow(타임라인 뷰)와 AgentStatsDashboardWindow(통계 대시보드)가 이미 구현되어 있으나, +**실시간으로 어디가 병목인지 시각적으로 보여주는 그래프**가 없음. +에이전트 실행 중 "LLM 호출이 느린 건지, 특정 도구가 느린 건지" 판단이 어려움. + +### 현재 보유 기반 + +| 구성요소 | 상태 | 위치 | +|----------|:----:|------| +| WorkflowAnalyzerWindow | ✅ | `Views/WorkflowAnalyzerWindow.xaml(.cs)` — 이벤트 타임라인, 요약 카드 | +| AgentEvent.ElapsedMs | ✅ | 각 도구 실행 소요시간 수집중 | +| AgentEvent.InputTokens/OutputTokens | ✅ | LLM 호출별 토큰량 수집중 | +| AgentEvent.Iteration | ✅ | 반복 번호 수집중 | +| AgentStatsDashboardWindow | ✅ | `Views/AgentStatsDashboardWindow.xaml(.cs)` — 일별 바 차트, 도구 빈도 | +| LLM 호출 자체의 소요시간 | ❌ 미수집 | `SendWithToolsAsync` 전후 Stopwatch 추가 필요 | +| 차트 라이브러리 | ❌ 불필요 | 모든 차트를 WPF Canvas+Rectangle 직접 구현 | + +### 추가 구현 대상 — 3종 시각화 + +#### ① 워터폴 차트 (시간 흐름 + 병목 색상) + +``` +시간 → 0s 2s 4s 6s 8s 10s + ├───────┼───────┼───────┼───────┼───────┤ +LLM 1 ████████ 2.1s (토큰 1.2K) +Tool 1 ███ 0.8s folder_map +LLM 2 ████████████ 3.5s (토큰 2.8K) ← 🔴 병목! +Tool 2 █ 0.2s file_read +LLM 3 ████ 1.2s (토큰 1.5K) +Tool 3 ██████ 1.8s html_create +``` + +- **빨간 바**: 가장 긴 구간 (병목), **주황**: 평균 이상, **녹색**: 정상 +- LLM 호출과 도구 실행을 구분하여 시간 소비 패턴을 직관적으로 표현 +- **구현**: Canvas + Rectangle, 색상 임계값 자동 계산 (평균 × 1.5 = 주황, × 2.0 = 빨강) +- **전제 조건**: LLM 호출 소요시간 수집 (`SendWithToolsAsync` 전후 Stopwatch) + +#### ② 도구별 누적 소요시간 바 차트 + +``` +도구별 소요시간 (이번 세션) +───────────────────────────────────── +html_create ████████████████████ 4.2s ← 🔴 최다 +file_read ████████ 1.8s +folder_map ████ 0.9s +grep ██ 0.4s +LLM 호출 ██████████████████████████ 7.1s +``` + +- 현재 AgentStatsDashboardWindow의 도구 빈도 바 차트와 동일 패턴 +- ElapsedMs 기준 내림차순 정렬 +- 실시간: 이벤트 수신 시 `Dictionary`에 누적 후 바 재렌더링 +- **구현 난이도**: 낮음 — 기존 코드 복제 수준 + +#### ③ 반복별 토큰 추세선 + +``` +토큰 ↑ +3000 │ ● + │ ● ● +2000 │ ● ● + │● ● +1000 │ + 0 └───┬───┬───┬───┬───┬───┬──→ 반복 + 1 2 3 4 5 6 +``` + +- 꺾은선 그래프: Canvas + WPF `Polyline` (기본 도형) +- 입력 토큰 지속 증가 패턴 감지 → **"⚠ 컨텍스트 크기 급증"** 경고 배지 +- **구현 난이도**: 중간 + +### 구현 비용 분석 + +| 항목 | 예상 코드량 | 앱 크기 영향 | 비고 | +|------|------------|:----------:|------| +| LLM 호출 시간 수집 | ~5줄 | 0 | AgentLoopService에 Stopwatch 추가 | +| 워터폴 차트 | ~150줄 | 0 | Canvas+Rectangle | +| 도구별 바 차트 | ~80줄 | 0 | 기존 바 차트 패턴 복제 | +| 토큰 추세선 | ~100줄 | 0 | Canvas+Polyline | +| 외부 차트 라이브러리 | 불필요 | 0 | WPF 기본 기능으로 충분 | +| **합계** | **~335줄** | **0KB** | | + +### 권장 구현 순서 + +| Phase | 범위 | 효과 | +|-------|------|------| +| **Phase 1** (즉시 가능) | LLM 호출 시간 수집 + 도구별 바 차트 | "어떤 도구가 느린지" 즉시 파악 | +| **Phase 2** (다음) | 워터폴 차트 | 시간 흐름에서 LLM vs 도구 비율 시각화 | +| **Phase 3** (선택) | 토큰 추세선 + 컨텍스트 폭발 경고 | 고급 디버깅용 | + +### 결론 + +| 관점 | 평가 | +|------|------| +| 기술 가능성 | ✅ 높음 — 데이터 수집 90% 완성, 차트는 기존 패턴 재활용 | +| 구현 난이도 | 중~하 — 외부 라이브러리 불필요 | +| 사용자 가치 | 높음 — "왜 느린지" 원인 즉시 파악 가능 | +| 앱 크기 | 0 영향 — 코드만 추가 | +| 배치 위치 | WorkflowAnalyzerWindow 내부 (요약 카드 아래, 타임라인 위) | + +--- + +## 개발 검토 — 에이전트 루프 검증 강제 (Post-Tool Verification) + +> **상태**: 구현 완료 +> **검토일**: 2026-03-31 +> **대상**: Cowork/Code 모드 에이전트 루프 + +### 배경 — 업계 오픈소스와의 비교 + +에이전트 루프가 문서 생성 후 검수를 하지 않는 문제가 관찰됨. OpenHands(구 OpenDevin), Claude Code, Cursor 등 주요 오픈소스/상용 서비스의 에이전트 루프를 분석한 결과, **업계 전체가 동일한 구조적 한계**를 가지고 있음을 확인. + +#### 아키텍처 비교 + +| 항목 | AX Copilot | OpenHands | Claude Code | +|------|-----------|-----------|-------------| +| 루프 구조 | while + SendWithToolsAsync | while + agent.step(state) | while + tool_use | +| **반복당 LLM 호출** | **1회** | **1회** | **1회** | +| **검증 강제** | **✅ v1.7.1 구현** | ❌ 없음 | ❌ 없음 | +| 계획 단계 | PlanMode 3모드 | 없음 (implicit) | 없음 | +| 종료 조건 | 도구 호출 없음 | AgentFinishAction | 도구 호출 없음 | +| 자기 반성 | Self-Reflection 프롬프트 | 없음 | 없음 | +| 사용자 승인 | UserDecisionCallback | SecurityAnalyzer | 권한 프롬프트 | +| 컨텍스트 압축 | ContextCondenser | 요약 기반 | 없음 | + +#### OpenHands 루프 의사코드 + +```python +# OpenHands: agent.step() = 1 LLM 호출 + 1 도구 실행 +while budget > 0: + action = agent.step(state) # 1 LLM call + observation = runtime.run(action) # 1 tool execution + state.update(action, observation) + if action == AgentFinishAction: + break +# 검증 없음 — LLM이 자율적으로 다음 반복에서 확인 여부 결정 +``` + +#### AX Copilot 검증 강제 루프 (개선 후) + +``` +반복 1: LLM → "계획 수립" + file_read → 기존 파일 확인 +반복 2: LLM → "실행" + html_create → 문서 생성 + ↳ ★검증 LLM 호출★ → file_read로 내용 확인 → 수정 필요 시 도구 호출 +반복 3: LLM → 완료 응답 또는 추가 수정 +``` + +### 구현 상세 + +| 구성요소 | 파일 | 내용 | +|----------|------|------| +| 설정 | `AppSettings.cs` | `EnablePostToolVerification` (bool, 기본 false) | +| UI | `SettingsWindow.xaml` | "고품질 문서" 섹션에 토글 추가 | +| 바인딩 | `SettingsViewModel.cs` | Load/Save 매핑 | +| 엔진 | `AgentLoopService.cs` | `RunPostToolVerificationAsync()` + `IsDocumentCreationTool()` | + +#### 검증 대상 도구 + +| 도구명 | 설명 | +|--------|------| +| `file_write` | 일반 파일 쓰기 | +| `docx_create` | Word 문서 생성 | +| `html_create` | HTML 보고서 생성 | +| `excel_create` | Excel 파일 생성 | +| `csv_create` | CSV 파일 생성 | +| `script_create` | Python 스크립트 생성 | +| `pptx_create` | PowerPoint 생성 | + +#### 검증 프롬프트 구조 + +검증 LLM 호출 시 다음 4단계 체크리스트를 주입: +1. `file_read`로 생성된 파일 내용 읽기 +2. 사용자 요청 대비 완전성 확인 +3. 구조·형식 올바름 확인 +4. 문제 발견 시 즉시 수정 도구 호출 + +### 효과 + +| 관점 | Before (v1.7.0) | After (v1.7.1) | +|------|-----------------|-----------------| +| 문서 생성 후 확인 | LLM 자율 판단 (대부분 생략) | 강제 확인 + 수정 | +| 반복당 최소 LLM 호출 | 1회 | 문서 생성 시 2회 | +| 누락 섹션 | 사용자가 직접 발견 | AI가 자동 감지 | +| 업계 비교 | OpenHands와 동일 | **차별화 포인트** | + +--- + +## 양식 기반 문서 생성 (Template Mode) + +> **상태**: 구현 완료 +> **적용일**: 2026-03-30 +> **대상 스킬**: docx-creator, pptx-creator, xlsx-analyzer + +### 개요 + +작업 폴더에 양식 파일(`.docx`, `.pptx`, `.xlsx`)을 넣어두면, 런타임 고급 스킬(`/docx-creator`, `/pptx-creator`, `/xlsx-analyzer`) 실행 시 **양식의 스타일·레이아웃을 자동으로 상속**하여 문서를 생성합니다. + +### 동작 원리 + +``` +사용자: "이번 달 보고서 작성해줘" + +┌─ 스킬 시스템 프롬프트 ─────────────────────┐ +│ 1. folder_map → 작업 폴더 스캔 │ +│ 2. 양식 후보 탐색 (파일명 키워드 매칭) │ +│ 3. 양식 발견 → document_read로 구조 파악 │ +│ 4. Document('양식.docx') 기반 생성 │ +│ (양식 없으면 → Document() 새 문서) │ +└──────────────────────────────────────────┘ +``` + +### 양식 감지 키워드 + +파일명에 다음 키워드가 포함되면 양식으로 자동 인식: + +| 키워드 | 예시 파일명 | +|--------|------------| +| 양식 | `월간보고_양식.docx` | +| template | `report_template.pptx` | +| 서식 | `서식_공문.docx` | +| 표준 | `표준_발표자료.pptx` | +| 기본 | `기본양식.xlsx` | + +사용자가 명시적으로 파일명을 지정하면 키워드 무관하게 해당 파일을 양식으로 사용합니다. + +### 스킬별 양식 활용 방식 + +| 스킬 | 양식 로드 | 상속되는 요소 | +|------|----------|-------------| +| **docx-creator** | `Document('양식.docx')` | 스타일, 머리글/바닥글, 로고, 페이지 설정, 글꼴 | +| **pptx-creator** | `Presentation('양식.pptx')` | 마스터 슬라이드, 배경, 색 테마, 폰트, 레이아웃 | +| **xlsx-analyzer** | `load_workbook('양식.xlsx')` | 셀 서식, 병합, 테두리, 열 너비, 차트 영역 | + +### 구현 방식 + +C# 코드 변경 없이 **스킬 프롬프트(`.skill.md`)만 확장**하여 구현: + +- `skills/docx-creator.skill.md` — `## 양식 활용 (템플릿 모드)` 섹션 추가 +- `skills/pptx-creator.skill.md` — `## 양식 활용 (마스터 슬라이드 템플릿)` 섹션 추가 +- `skills/xlsx-analyzer.skill.md` — `## 양식 활용 (Excel 보고서 템플릿)` 섹션 추가 + +각 스킬의 Python 스크립트 템플릿에 양식 자동 감지 로직 포함: + +```python +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.docx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +if template_file: + doc = Document(template_file) # 양식 스타일 상속 +else: + doc = Document() # 새 문서 +``` + +### 사내 활용 시나리오 + +| 시나리오 | 양식 파일 | 결과 | +|---------|----------|------| +| 월간 보고서 | `월간보고_양식.docx` (사내 표준 헤더·로고·페이지 설정) | 동일 규격의 보고서 자동 생성 | +| 팀 발표 | `팀발표_양식.pptx` (부서 마스터 슬라이드) | 부서 디자인 유지 + 새 내용 | +| 수율 분석 | `수율보고_양식.xlsx` (셀 서식·차트 영역 설정) | 양식에 데이터만 삽입 | +| 공문 작성 | `공문_서식.docx` (사내 공문 규격) | 규격 유지 + 내용 작성 | + +### 향후 고도화 + +| 단계 | 내용 | 공수 | +|------|------|------| +| 현재 (v1.6.1) | 스킬 프롬프트에서 양식 자동 감지 안내 | 완료 | +| 다음 | 시스템 프롬프트에 양식 목록 자동 주입 (BuildCoworkSystemPrompt) | 낮음 | +| 장기 | `.ax/templates/` 공용 양식 폴더 + 프로젝트 규칙에서 기본 양식 지정 | 중간 | diff --git a/docs/LAUNCHER_ROADMAP.html b/docs/LAUNCHER_ROADMAP.html new file mode 100644 index 0000000..9b12620 --- /dev/null +++ b/docs/LAUNCHER_ROADMAP.html @@ -0,0 +1,619 @@ + + + + + +AX Commander (런처) 고도화 계획 | AX Copilot + + + + +
+
+
+ +
+

AX Commander (런처) 고도화 계획

+
AX Copilot Launcher Roadmap
+
+
+
+ Version: v1.6.1 + Last Updated: 2026-03-30 + Status: Active +
+
+
+ +
+ + + + + +
+
+
+

현재 상태 (v1.5.0) — 핵심 기능 44개 핸들러

+ 현재 +
+
+
+
    +
  • 퍼지 검색 + 한글 초성 검색 (FuzzyEngine)
  • +
  • 44개 프리픽스 명령 (계산기, 이모지, 웹검색, 스니펫, 클립보드, 프로세스 등)
  • +
  • 10가지 테마 + 커스텀 테마
  • +
  • 플러그인 시스템 (DLL + JSON 스킬)
  • +
  • AX Agent AI 대화 통합
  • +
  • 글로벌 핫키 (Alt+Space), 무지개 글로우 효과
  • +
  • 파일/앱 인덱싱, 북마크 검색, 사용 빈도 랭킹
  • +
  • 워크스페이스 프로파일 (창 레이아웃 저장/복원)
  • +
  • 클립보드 히스토리, 스니펫 확장
  • +
  • 스크린 캡처, 컬러 피커, JSON 도구
  • +
+
+
+ + +
+
+
+

경쟁 서비스 비교 (2026년 3월 기준)

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
기능AX CommanderRaycastAlfred 5Flow LauncherPowerToys
AI 대화O (AX Agent)O (멀티모델)워크플로우XX
MCP 프로토콜OXXXX
에이전트 코딩O (Code 탭)OXXX
플러그인DLL+JSON1500+ 스토어워크플로우 갤러리200+모듈
클립보드 히스토리OO (리치)파워팩플러그인X
윈도우 관리O (22 레이아웃)70+ 레이아웃XXFancyZones
파일 탐색기 통합XXXXX
Everything 연동O (es 프리픽스)XXOX
선택 텍스트 AIO (텍스트 액션)O (AI Commands)XXX
영구 독 UIO (독 바)XXXO
클라우드 동기화XProDropboxXX
다국어5개국어영어영어영어다국어
+
+
+
+ +
+ + +
+
+
+

Phase L1 — 차세대 런처 고도화 (v1.5.0)

+ ✓ 완료 +
+
+
+ + +
+
+

L1-1. 선택 텍스트 AI 명령 (AI Commands)

+ 최고 +
+

갭: 런처에서만 AI 사용 가능, 시스템 전역 텍스트 처리 불가

+

구현: 글로벌 핫키(예: Alt+A) → 선택된 텍스트에 AI 명령 실행

+

명령 예시: 번역, 문법 교정, 요약, 코드 설명, 포맷 변환

+

참고: Raycast AI Commands

+

기술: InputListener 확장 + Clipboard 읽기 + LLM 호출 + 결과 Popup

+
+ + +
+
+

L1-2. Everything (voidtools) 연동

+ 높음 +
+

갭: 자체 인덱싱은 설정된 폴더만 검색, 전체 디스크 검색 불가

+

구현: Everything SDK (IPC/HTTP API) 연동으로 NTFS 전체 즉시 검색

+

폴백: Everything 미설치 시 기존 IndexService 사용

+

참고: Flow Launcher, Wox의 Everything 통합

+

기술: Everything.dll P/Invoke 또는 HTTP API (http://localhost:8080)

+
+ + +
+
+

L1-3. 윈도우 타일링 레이아웃 확장

+ 높음 +
+

갭: 기본 snap만 지원, 복잡한 레이아웃 불가

+

구현: 2분할, 3분할, 4분할, 그리드 레이아웃 (halves/thirds/quarters)

+

UI: snap 프리픽스에 레이아웃 선택 UI 추가

+

참고: Raycast Window Management (70+ 레이아웃)

+

기술: SnapHandler 확장 + Win32 SetWindowPos

+
+ + +
+
+

L1-4. 플러그인 스토어 (인앱 갤러리)

+ 중간 +
+

갭: 플러그인 설치가 수동 (DLL 파일 복사)

+

구현: 인앱 플러그인 브라우저 + 원클릭 설치/업데이트

+

소스: GitHub 리포지토리 기반 플러그인 레지스트리 (JSON manifest)

+

참고: Raycast Extension Store, Flow Launcher pm install

+

기술: PluginHost 확장 + GitHub API + 다운로드/설치 자동화

+
+ + +
+
+

L1-5. 영구 독/위젯 모드

+ 중간 +
+

갭: 런처는 호출 시에만 나타남, 상시 접근 불가

+

구현: 화면 하단/측면에 고정되는 미니 바 (핀 고정 명령, CPU/메모리, 시계)

+

참고: PowerToys Command Palette Dock

+

기술: 별도 Window (TopMost, 자동 숨김 옵션)

+
+ + +
+
+

L1-6. 파일 탐색기 대화상자 통합

+ 중간 +
+

갭: 열기/저장 대화상자에서 빠른 검색 불가

+

구현: Windows 열기/저장 대화상자 감지 → 런처 오버레이 표시

+

참고: Listary의 대화상자 하이재킹

+

기술: SetWinEventHook + 대화상자 감지 + 경로 주입

+
+ + +
+
+

L1-7. 클립보드 히스토리 강화

+ 중간 +
+

갭: 텍스트만 저장, 이미지/파일 클립보드 미지원

+

구현: 이미지 클립보드 저장, 리치 텍스트, 핀 고정, 카테고리 분류

+

참고: Raycast Clipboard (리치 컨텐츠)

+

기술: ClipboardHistoryHandler 확장 + 이미지 직렬화

+
+ + +
+
+

L1-8. 클라우드 설정 동기화

+ 보류 +
+

갭: 여러 PC에서 설정 수동 복사 필요

+

구현: settings.json + 스니펫 + 별칭을 클라우드 저장소에 동기화

+

후보: OneDrive / Google Drive / 사내 NAS 공유 폴더

+

참고: Raycast Pro Cloud Sync

+
+ + +
+
+

L1-9. 커스텀 테마 마켓

+ 보류 +
+

갭: 10개 내장 테마만 사용 가능

+

구현: 사용자 테마 공유/다운로드 시스템

+

기술: 테마 JSON 파일 → GitHub 기반 레지스트리

+
+ +
+
+ +
+ + +
+
+
+

Phase L1 추가 완료 (v1.5.0)

+ ✓ 완료 +
+
+
+ + + + + + + + + + +
기능상태
Windows 탐색기 셸 확장✓ ShellExtensionService — HKCU 레지스트리 우클릭 메뉴 등록/해제
저장 공간 관리 UI✓ StorageAnalyzer — 사용량 분석, 드라이브 여유, 7/14/30일 정리
설정 도움말 아이콘✓ AI 관련 설정 17개에 ? 아이콘 + 커스텀 다크 툴팁
독 바 실시간 설정✓ 설정 변경 즉시 반영, 자동 표시, 위치 기억, 히트 테스트 수정
클립보드 이미지 썸네일✓ 런처에서 이미지 항목 썸네일 미리보기 표시
런처 독 바 명령어✓ /dock 명령으로 독 바 표시/숨기기
+
+
+ +
+ + +
+
+
+

Phase L2 — 클립보드 고도화 + UX 개선 (v1.5.3)

+ 계획 +
+
+
+

+ 방향: 클립보드 히스토리의 실용성 극대화 (이미지 원본 품질, 자동 복사 워크플로우). + Raycast의 리치 클립보드, Alfred의 Snippet 확장을 참고하되 사내 로컬 환경에 최적화. +

+ + + + + + + + + + + +
#기능설명우선순위
L2-1클립보드 이미지 원본 해상도 보존원본 PNG/BMP 그대로 DPAPI 저장. 썸네일은 표시용으로만 생성. 캐시 정리 정책 (30일/500MB)높음
L2-2Shift+Enter 실행 시 자동 클립보드 복사클립보드 히스토리에서 미리보기 시 해당 항목을 시스템 클립보드에 자동 복사높음
L2-3클립보드 이미지 미리보기 창이미지 항목 선택 시 별도 팝업으로 원본 크기 미리보기. 확대/축소, 복사 버튼중간
L2-4클립보드 검색 강화이미지 OCR 텍스트 추출 → 텍스트 기반 이미지 검색. Windows OCR API (로컬)중간
L2-5클립보드 항목 병합여러 텍스트 항목을 선택하여 하나로 병합 (줄바꿈 구분). Ctrl+Click 다중 선택낮음
+
+
+ +
+ + +
+
+
+

Phase L3 — 차세대 런처 (v2.0) + Agent Phase 18 교차

+ 계획 +
+
+
+

+ 방향: 경쟁 런처(Raycast 1500+ 확장, PowerToys Run)의 에코시스템 수준을 참고하되, + 사내 보안/오프라인 환경에서 동작하는 자체 완결형 기능으로 구현.
+ 참고: AX Agent Phase 18 (v2.0)과 교차 — 플러그인 갤러리(18-2), AI 스니펫(18-3), 퀵링크(18-4), 웹 검색 AI 요약(18-6). +

+ + + + + + + + + + + + + + + +
#기능참고우선순위
L3-1플러그인 인앱 갤러리 + 레지스트리로컬 NAS/Git 레지스트리 기반 탐색/설치/업데이트. → Agent Phase 18-2높음
L3-2웹 검색 AI 요약? 검색 결과를 AI로 요약. → Agent Phase 18-6중간
L3-3AI 스니펫;email {수신자} {주제} → LLM 초안 자동 생성. → Agent Phase 18-3중간
L3-4파라미터 퀵링크jira {티켓번호} → URL 템플릿 변수 치환. → Agent Phase 18-4중간
L3-5파일 태그 시스템사용자 태그 부여, 태그 기반 검색중간
L3-6오프라인 AI (로컬 SLM)ONNX Runtime + phi-3. → Agent Phase 18-5낮음
L3-7다중 디스플레이모니터별 런처/독 바 위치 기억낮음
L3-8알림 센터 통합Windows 알림과 연동낮음
L3-9런처 미니 위젯날씨/일정/할일 카드형 표시. 로컬 데이터 기반낮음
+
+
+ +
+ + +
+
+
+

기술 부채 (v1.5.0 해결)

+ ✓ 완료 +
+
+
+ + + + + + + + + + +
항목상태
SnapHandler 기본 기능만✓ 22개 레이아웃으로 확장 (3등분, 2/3, 3분할 조합)
Everything 미연동✓ EverythingHandler 구현 (es 프리픽스, P/Invoke, graceful fallback)
플러그인 설치 수동✓ PluginHost.InstallFromZip() 로컬 zip 자동 추출·등록 (URL 제외: 사내 보안)
이미지 클립보드 미지원✓ PNG→Base64 DPAPI 암호화 저장/복원, 앱 재시작 후 이미지 유지
+
+
+ +
+ + + + + + + diff --git a/docs/LAUNCHER_ROADMAP.md b/docs/LAUNCHER_ROADMAP.md new file mode 100644 index 0000000..939a1e0 --- /dev/null +++ b/docs/LAUNCHER_ROADMAP.md @@ -0,0 +1,117 @@ +# AX Commander (런처) 고도화 계획 + +## 현재 상태 (v1.5.0) + +### 핵심 기능 (44개 핸들러) +- 퍼지 검색 + 한글 초성 검색 (FuzzyEngine) +- 44개 프리픽스 명령 (계산기, 이모지, 웹검색, 스니펫, 클립보드, 프로세스 등) +- 10가지 테마 + 커스텀 테마 +- 플러그인 시스템 (DLL + JSON 스킬) +- AX Agent AI 대화 통합 +- 글로벌 핫키 (Alt+Space), 무지개 글로우 효과 +- 파일/앱 인덱싱, 북마크 검색, 사용 빈도 랭킹 +- 워크스페이스 프로파일 (창 레이아웃 저장/복원) +- 클립보드 히스토리, 스니펫 확장 +- 스크린 캡처, 컬러 피커, JSON 도구 + +### 경쟁 서비스 비교 (2026년 3월 기준) + +| 기능 | AX Commander | Raycast | Alfred 5 | Flow Launcher | PowerToys | +|------|-------------|---------|----------|---------------|-----------| +| AI 대화 | O (AX Agent) | O (멀티모델) | 워크플로우 | X | X | +| MCP 프로토콜 | O | X | X | X | X | +| 에이전트 코딩 | O (Code 탭) | O | X | X | X | +| 플러그인 | DLL+JSON | 1500+ 스토어 | 워크플로우 갤러리 | 200+ | 모듈 | +| 클립보드 히스토리 | O | O (리치) | 파워팩 | 플러그인 | X | +| 윈도우 관리 | O (22 레이아웃) | 70+ 레이아웃 | X | X | FancyZones | +| 파일 탐색기 통합 | X | X | X | X | X | +| Everything 연동 | O (es 프리픽스) | X | X | O | X | +| 선택 텍스트 AI | O (텍스트 액션 팝업) | O (AI Commands) | X | X | X | +| 영구 독 UI | O (독 바) | X | X | X | O (Command Palette Dock) | +| 클라우드 동기화 | X | Pro | Dropbox | X | X | +| 다국어 | 5개국어 | 영어 | 영어 | 영어 | 다국어 | + +--- + +## Phase L1 — 차세대 런처 고도화 (v1.5.0) + +| # | 기능 | 구현 내용 | +|---|------|----------| +| L1-1 | 선택 텍스트 AI 명령 | TextActionPopup (커서 위치 팝업), 번역/요약/교정/설명/다시쓰기. 설정 기반 명령 선택, 1개 시 팝업 없이 바로 실행 | +| L1-2 | Everything 연동 | EverythingHandler (`es` 프리픽스), Everything64.dll P/Invoke, 미설치 시 graceful fallback | +| L1-3 | 윈도우 타일링 확장 | SnapHandler 11→22개 레이아웃 (3등분, 2/3, 3분할 조합) | +| L1-4 | 플러그인 자동 설치 | PluginHost.InstallFromZip() + UninstallPlugin(). 로컬 zip 기반 (URL 제외: 사내 보안) | +| L1-5 | 영구 독 바 | DockBarWindow (화면 하단 고정). 설정 기반 아이템, CPU/RAM, 시계, 글로우, 투명도, 위치 기억 | +| L1-6 | 대화상자 통합 | FileDialogWatcher (SetWinEventHook + #32770 감지). 열기/저장 시 런처 자동 열기 | +| L1-7 | 클립보드 핀/카테고리 | IsPinned/Category 필드, 자동 분류(URL/코드/경로), Ctrl+P 핀 토글, #pin/#url/#코드 필터 | +| L1-8 | 클라우드 설정 동기화 | 보류 (사내 환경) | +| L1-9 | 커스텀 테마 마켓 | 보류 (사내 환경) | +| 추가 | 독 바 설정 탭 | 설정창에 독 바 전용 탭 (표시 항목, 투명도, 글로우, 위치 초기화) | +| 추가 | 설정창 UI 개편 | 테마+색상편집 하위탭 합침, 일반+알림 하위탭 합침, v1.5.0 신기능 설정값 추가 | +| 추가 | 아이콘 교체 | 다이아몬드 픽셀 ICO (7 sizes). 앱/인스톨러/바로가기/AboutWindow/LauncherWindow/SVG 전체 통일 | + +--- + +## Phase L1 추가 완료 (v1.5.0) + +| # | 기능 | 상태 | +|---|------|------| +| 추가 | **Windows 탐색기 셸 확장** | ✓ ShellExtensionService — HKCU 레지스트리 등록/해제, 명령줄 파싱 | +| 추가 | **저장 공간 관리 UI** | ✓ StorageAnalyzer — 사용량 분석, 드라이브 여유, 7/14/30일 정리 | +| 추가 | **설정 도움말 아이콘** | ✓ AI 관련 설정 17개에 `?` 아이콘 + 커스텀 다크 툴팁 | +| 추가 | **독 바 실시간 설정** | ✓ 설정 변경 즉시 반영, 자동 표시, 위치 기억 | + +--- + +## Phase L2 — 클립보드 고도화 + UX 개선 (v1.5.3) + +> **방향**: 클립보드 히스토리의 실용성 극대화 (이미지 원본 품질, 자동 복사 워크플로우), 런처 UX 개선. +> Raycast의 리치 클립보드, Alfred의 Snippet 확장을 참고하되 사내 로컬 환경에 최적화. + +| # | 기능 | 설명 | 우선순위 | +|---|------|------|----------| +| L2-1 | **클립보드 이미지 원본 해상도 보존** | 원본 PNG를 `clipboard_images/` 캐시 폴더에 저장, 썸네일(80px)은 표시용으로만 사용. 캐시 정리 정책 (30일/500MB). Enter 복원 시 원본 해상도로 클립보드 복사 | ✅ 완료 | +| L2-2 | **Shift+Enter 실행 시 자동 클립보드 복사** | Shift+Enter로 외부 뷰어 열기 전에 해당 항목을 시스템 클립보드에 자동 복사. 텍스트/이미지(원본 해상도) 모두 지원 | ✅ 완료 | +| L2-3 | **클립보드 이미지 미리보기 창** | 이미지 항목 선택 시 별도 팝업으로 원본 크기 미리보기. 확대/축소, 클립보드 복사 버튼 | 중간 | +| L2-4 | **클립보드 검색 강화** | 이미지 OCR 텍스트 추출 → 텍스트 기반 이미지 검색. Windows OCR API (로컬) 활용 | 중간 | +| L2-5 | **클립보드 항목 병합** | 여러 텍스트 항목을 선택하여 하나로 병합 (줄바꿈 구분). Ctrl+Click 다중 선택 | 낮음 | + +### Phase L2 추가 완료 (v1.5.3) + +| # | 기능 | 상태 | +|---|------|------| +| 추가 | **독 바 탭 위치 이동** | ✓ 설정 탭 순서에서 독 바를 3번째(테마 뒤)로 이동 — 사용 빈도 기반 접근성 향상 | +| 추가 | **설정 기타 탭 접기/열기** | ✓ 등록된 도구, MCP 커넥터, 슬래시 스킬 각각 접기/펼치기 섹션 (화살표 토글) | +| 추가 | **About 정보 변경** | ✓ ".NET 8" → "Commander + Agent" (기술 스택 비노출 원칙) | +| 추가 | **가이드 내장 뷰어** | ✓ GuideViewerWindow — 암호화된 가이드를 앱 내 WebBrowser로 복호화 렌더링. 개발자 모드 연동 | + +--- + +## Phase L3 — 차세대 런처 (v2.0) — 차기 개발 + +> **방향**: 경쟁 런처(Raycast 1500+ 확장, PowerToys Run)의 에코시스템 수준을 참고하되, +> 사내 보안/오프라인 환경에서 동작하는 자체 완결형 기능으로 구현. +> AX Agent **Phase 18 (v2.0)** 과 교차 개발 — 런처와 에이전트의 기능 경계가 겹치는 항목은 통합 구현. + +| # | 기능 | 설명 | 우선순위 | 교차 | +|---|------|------|----------|------| +| L3-1 | **플러그인 갤러리 + 레지스트리** | 로컬 NAS/Git 레지스트리 기반 탐색/설치/업데이트 인앱 갤러리 | 높음 | → Agent 18-2 | +| L3-2 | **웹 검색 AI 요약** | ? 검색 결과를 AI가 요약하여 런처에 표시 | 중간 | → Agent 18-6 | +| L3-3 | **AI 스니펫** | `;email {수신자} {주제}` → LLM이 이메일 초안 자동 생성. 기존 스니펫에 AI 확장 | 중간 | → Agent 18-3 | +| L3-4 | **파라미터 퀵링크** | `jira {티켓번호}` → URL 템플릿 변수 치환 (사내 JIRA/Confluence 등) | 중간 | → Agent 18-4 | +| L3-5 | **파일 태그 시스템** | 파일에 사용자 태그 부여, 태그 기반 검색 | 중간 | — | +| L3-6 | **오프라인 AI (로컬 SLM)** | ONNX Runtime + phi-3, 서버 없이 번역/요약 | 낮음 | → Agent 18-5 | +| L3-7 | **다중 디스플레이** | 모니터별 런처/독 바 위치 기억 | 낮음 | — | +| L3-8 | **알림 센터 통합** | Windows 알림과 연동 | 낮음 | — | +| L3-9 | **런처 미니 위젯** | 날씨/일정/할일을 런처 하단에 카드형으로 표시. 로컬 데이터 기반 | 낮음 | — | + +--- + +## 기술 부채 (v1.5.0 해결) + +| 항목 | 상태 | +|------|------| +| SnapHandler 기본 기능만 | ✓ 22개 레이아웃으로 확장 (3등분, 2/3, 3분할 조합 추가) | +| Everything 미연동 | ✓ EverythingHandler 구현 (`es` 프리픽스, P/Invoke, graceful fallback) | +| 플러그인 설치 수동 | ✓ PluginHost.InstallFromZip() 로컬 zip 자동 추출·등록 (URL 제외: 사내 보안) | +| 이미지 클립보드 미지원 | ✓ PNG→Base64 DPAPI 암호화 저장/복원, 앱 재시작 후 이미지 히스토리 유지 | diff --git a/docs/NEXT_ROADMAP.html b/docs/NEXT_ROADMAP.html new file mode 100644 index 0000000..462e74b --- /dev/null +++ b/docs/NEXT_ROADMAP.html @@ -0,0 +1,259 @@ + + + + + +AX Copilot — 차기 개발 계획 (v1.6.1~v2.0) + + + +
+ +
+
AX Copilot 차기 개발 계획
+

v1.6.1 ~ v2.0 로드맵

+

+ 2026년 3월 경쟁 서비스 분석 (Claude Code, Cursor, Copilot, Windsurf, Raycast, PowerToys) 및 에이전트 코딩 동향 기반
+ 현재 v1.6.1 — 52개 에이전트 도구, 29개 내장 스킬, 20개 코워크 프리셋, 4종 LLM 서비스 +

+
+ + +

v1.6.1 완료 현황

+ +
+
+

런처 (Phase L1) 완료

+ + + + + + + + +
선택 텍스트 AI 명령O
독 바 (설정 기반)O
클립보드 핀/카테고리O
파일 대화상자 연동O
Everything 연동O
SnapHandler 22종O
아이콘 전면 교체O
+
+
+

대화 서비스 (Phase 8~15) 완료

+ + + + + + + + + + + + + + + + +
MCP 클라이언트 + 모델 폴백O
LSP 코드 인텔리전스O
서브에이전트 + 코드 시맨틱 검색O
diff 뷰어 + PDF 내보내기O
이벤트 트리거 + 자동 테스트 루프O
자동 모델 선택 (Auto Router)O
에이전트 메모리 + 멀티모달 (Vision)O
에이전트 훅 시스템O
스킬 시스템 29종 (갤러리/편집기/가져오기)O
AI 코드 리뷰 + 드래그&드롭 AIO
에이전트 도구 52종 (데이터/시스템/네트워크)O
워크플로우 분석기 + 실행 통계 대시보드O
멀티패스 문서 생성 (plan→assemble)O
PPT 네이티브 생성 + 이미지 분석O
가이드 시스템 (암호화 뷰어)O
+
+
+ + +

경쟁 서비스 대비 포지션 (2026년 3월)

+ +
+ + + + + + + + + + + + + + + + +
기능AX CopilotClaude CodeCursorCopilotRaycast
MCPO서버 모드OO@멘션
서브에이전트O10개 팀8개 클라우드다중X에이전트 팀
이벤트 트리거O웹훅+스케줄Automations이슈→PRX
에이전트 메모리OOOOX
자동 모델 선택OXOOAuto
멀티모달OVisionOOX
스킬 시스템OSkillsXXX차별화
AI 코드 리뷰OXXReviewX
플러그인 마켓zip+갤러리마켓30+Extensions1500+인앱 레지스트리
멀티패스 문서O (plan→assemble)XXXX차별화
워크플로우 분석O (실시간 시각화)XXXX차별화
탐색기 셸 확장OXXXX차별화
독 바OXXXX차별화
Windows 네이티브O터미널IDEIDEbeta차별화
+
+ + +

Phase 16 — 에이전트 지능 강화 + 개발자 경험 (v1.7.0) 차기 개발

+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
#기능우선순위핵심 내용참고
16-1플랜 모드 (Plan Mode)최고에이전트가 도구 실행 전 구조화된 계획 생성 → 사용자 검토/편집/승인 → 승인 후 실행Claude Code Plan mode
16-2도구/커넥터 관리 UI높음52개 도구 카테고리별 카드, 활성/비활성 토글, MCP 서버 연결 상태Claude 커넥터 UI
16-3프로젝트 규칙 시스템높음.ax/rules/*.md — 파일 패턴·작업 유형별 규칙 자동 주입Cursor .cursor/rules
16-4반복 테스트-수정 루프높음TestLoopTool auto_fix 모드 — 테스트→실패 파싱→수정→재실행 자동 반복GitHub Copilot
16-5병렬 도구 실행중간LLM 다수 도구 동시 호출 시 의존성 분석 후 Task.WhenAll() 병렬 실행Claude Code parallel
16-6SKILL.md 표준 완전 호환중간agentskills.io 스펙 전체 파싱, 외부↔내부 도구 이름 매핑16개+ 도구 채택
16-R런타임 고급 스킬 확장중간4종 추가: image-processor, diagram-generator, ocr-extract, data-visualize-advPillow, Tesseract
+
+ + +

Phase 17 — 심화 지능 + UX 혁신 (v1.8.0) 계획

+ +
+ + + + + + + + + + + + + + + + + + + + +
#기능우선순위핵심 내용참고
17-1자기 성찰 (Self-Reflection)최고도구 실패 시 구조화된 성찰 프롬프트, 에러 패턴 추적 (Reflexion 패턴)Reflexion 논문
17-2작업 기억 (Working Memory)높음대화 압축 시에도 유지되는 구조화된 태스크 상태 (현재 작업, 참조 파일, 의사결정 로그)Windsurf memory
17-3멀티파일 통합 Diff 뷰높음에이전트 다수 파일 수정 시 하나의 패널에서 파일별/헌크별 승인/거부Cursor multi-file diff
17-4자동 컨텍스트 수집중간사용자 메시지에서 파일명 감지 → 자동 읽기, Git diff, 코드 검색 주입Windsurf auto context
17-5MCP HTTP+SSE 전송중간stdio 전용 → HTTP+SSE 트랜스포트 추가, 원격 MCP 서버 연결MCP 표준
17-6대화 요약 온디맨드낮음/summarize-chat 슬래시 명령으로 현재 대화 구조화 요약
+
+ + +

Phase 18 — 에코시스템 + 차별화 (v2.0) 계획

+ +
+ + + + + + + + + + + + + + + + + + + + +
#기능우선순위핵심 내용참고
18-1에이전트 팀 (Multi-Agent)최고특화 에이전트(코드리뷰, 문서작성, 보안감사)가 메시지 버스로 협업Claude Code 에이전트 팀
18-2플러그인 갤러리 + 레지스트리높음로컬 NAS/Git 레지스트리 기반 플러그인/스킬 인앱 갤러리Raycast Store
18-3AI 스니펫중간;email {수신자} {주제} → LLM이 이메일 초안 자동 생성Raycast AI Snippets
18-4파라미터 퀵링크중간jira {티켓번호} → URL 템플릿 변수 치환 (사내 도구 빠른 접근)Raycast Quicklinks
18-5오프라인 AI (ONNX Runtime)낮음서버 없이 번역/요약/분류. 모델 별도 배포 (인스톨러 크기 유지)
18-6웹 검색 AI 요약낮음? 검색 결과를 AI로 요약하여 런처에 표시
+
+ + +

장기 — macOS 크로스플랫폼 (v2.0+) 장기

+ +
+ + + + + + + + + + +
#기능우선순위핵심 내용
LP-1Avalonia UI 마이그레이션높음WPF → Avalonia UI (.NET 크로스플랫폼 XAML). Windows/macOS/Linux 동일 코드베이스. Skia 렌더링
LP-2아이콘 폰트 내장높음Segoe MDL2 → FluentUI System Icons (MIT). macOS에서도 동일 아이콘
LP-3P/Invoke 플랫폼 분기높음RuntimeInformation.IsOSPlatform 분기. macOS: AppKit, Keychain, CGEventTap, Spotlight
LP-4플러그인 인앱 갤러리중간JSON manifest 기반 플러그인 검색/설치/업데이트. 사내 NAS 또는 Git 기반 레지스트리
+

+ 전환 영향: 비즈니스 로직 (Services/Agent/Models) 100% 재사용. UI 계층 (Views) 약 40% 재작성. 빌드: dotnet publish -r osx-arm64 +

+
+ + +

보류 사내 환경

+
+ + + +
클라우드 설정 동기화외부 클라우드 접근 제한
커스텀 테마 마켓외부 URL 기반 다운로드 제한
+
+ + +

핵심 전략

+
+

1. Windows 네이티브 AI 플랫폼

+

Raycast(macOS/beta), Cursor(IDE), Claude Code(터미널) 사이 공백. 사내 환경 유일의 Windows AI 런처+에이전트.

+ +

2. 지능형 자동화

+

자동 모델 선택 + 이벤트 트리거 + 에이전트 메모리 → 사용자 개입 최소화. 플랜 모드(v1.7.0)와 자기 성찰(v1.8.0)로 에이전트 정확도 향상. 인간-에이전트 협업 UX에 집중.

+ +

3. 생태계 확장

+

플러그인+스킬 시스템으로 커뮤니티 기여 구조 마련. Phase 18에서 플러그인 갤러리+레지스트리, AI 스니펫, 퀵링크로 런처 생태계 완성. 사내 배포는 NAS/Git 기반.

+ +

4. 에이전트 팀 (v2.0 핵심)

+

특화 에이전트(코드리뷰, 문서작성, 보안감사)가 메시지 버스로 협업하여 복합 작업을 분업 수행. Claude Code 에이전트 팀, CrewAI 역할 기반 팀 패턴 참고.

+
+ + +

2026년 에이전트 코딩 기술 동향

+
+ + + + + + + + + + +
동향상세
시장 침투개발자 85%가 AI 코딩 도구 사용
에이전트 전환자동완성 → 자율 에이전트(클론→수정→PR→테스트)
멀티 에이전트Claude Code 에이전트 팀, Cursor 8개 클라우드 에이전트
이벤트 기반Slack/GitHub/PagerDuty/웹훅 → 에이전트 자동 실행
에이전트 메모리Windsurf 48시간 자동 분석, Cursor 러닝 메모리
FeatureBench 갭복잡 기능 11~12% vs 버그 수정 80%+. 인간 감독 필수
플러그인 생태계모든 주요 도구가 마켓플레이스 런칭
자동 모델 선택Raycast Auto, Copilot Auto — 작업 유형별 최적 모델 라우팅
+
+ + + +
+ + diff --git a/docs/NEXT_ROADMAP.md b/docs/NEXT_ROADMAP.md new file mode 100644 index 0000000..eba5ef3 --- /dev/null +++ b/docs/NEXT_ROADMAP.md @@ -0,0 +1,4542 @@ +# AX Copilot 차기 개발 계획 (v1.7.1 ~ v2.0) — 구현 수준 상세 명세 + +> **개정 기준**: 2026년 4월 — Claude Code 내부 아키텍처 문서 심층 분석 + 구현 수준 상세화 +> 각 Phase는 C# 인터페이스·메서드 시그니처·WPF 바인딩·설정 스키마·통합 포인트까지 명시 +> 현재 v1.7.1 — 52개 에이전트 도구, 29개 내장 스킬, 20개 코워크 프리셋 + +--- + +## Claude Code 아키텍처 갭 진단 (v1.7.1 기준) + +| 갭 영역 | CC 보유 기능 | AX 현재 | 우선순위 Phase | +|---------|------------|---------|--------------| +| 훅 이벤트 | 17종 이벤트, 4타입(command/http/prompt/agent) | ~8종, 2타입 | 17-C | +| 훅 출력 | additionalContext·permissionDecision·updatedInput 주입 | 없음 | 17-C | +| 스킬 격리 | context:fork 서브에이전트 컨텍스트 | 없음 | 17-D | +| 스킬 경로 활성화 | paths: glob 패턴 자동 주입 | 없음 | 17-D | +| @include 메모리 | @파일경로 5단계 포함 | 없음 | 17-E | +| 경로 기반 규칙 | rules/*.md paths: 프론트매터 | 없음 | 17-E | +| acceptEdits 모드 | 파일 편집 자동승인, bash 확인 유지 | 없음 | 17-F | +| 패턴 권한 규칙 | Bash(git *) 패턴 허용/차단 | 없음 | 17-F | +| 코디네이터 에이전트 | 계획/라우팅 전담, 구현 위임 | 없음 | 18-A | +| Worktree 격리 | 서브에이전트 독립 git 워킹카피 | 없음 | 18-A | +| 백그라운드 에이전트 | 비동기 실행 + 완료 알림 | 없음 | 18-A | +| Chat UI | 3패널, 인라인 설정, 세션 헤더 바 | 단일 패널, 별도 설정창 | 17-UI | + +--- + +## Phase 17-UI — AX Agent 채팅 화면 전면 개편 (v1.8.0) + +> **목표**: ChatGPT Codex 스타일 3패널 레이아웃으로 채팅 화면 완전 재설계. +> 에이전트 설정을 SettingsWindow에서 채팅 화면 인라인 패널로 이전. +> Chat/Cowork/Code 탭 및 프리셋 유지. + +### 17-UI-1: 신규 파일 구조 + +``` +src/AxCopilot/Views/AgentWindow/ + AgentWindow.xaml ← 기존 AgentChatWindow 대체 + AgentWindow.xaml.cs + AgentSidebarView.xaml ← 좌측 사이드바 (240px↔48px) + AgentSidebarView.xaml.cs + AgentSessionHeaderBar.xaml ← 상단 세션 헤더 바 + AgentSessionHeaderBar.xaml.cs + AgentInlineSettingsPanel.xaml ← 우측 슬라이드인 설정 패널 (300px) + AgentInlineSettingsPanel.xaml.cs + AgentInputArea.xaml ← 하단 입력 영역 + AgentInputArea.xaml.cs + AgentChatView.xaml ← 채팅 메시지 영역 + AgentChatView.xaml.cs + AgentDiffPanel.xaml ← 통합 diff 뷰 + +src/AxCopilot/ViewModels/ + AgentWindowViewModel.cs ← 신규 + AgentSidebarViewModel.cs ← 신규 + AgentSessionHeaderViewModel.cs ← 신규 + AgentInlineSettingsViewModel.cs ← 신규 +``` + +### 17-UI-2: AgentWindow.xaml 레이아웃 구조 + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +**애니메이션 스펙:** +- 사이드바 확장/축소: `DoubleAnimation` Duration=`0:0:0.2` EasingFunction=`CubicEase EaseInOut` + - Width: 240 ↔ 48 (GridLength 직접 애니메이션, `GridLengthAnimation` 헬퍼 클래스 사용) +- 설정 패널 슬라이드: `DoubleAnimation` Duration=`0:0:0.2` EasingFunction=`CubicEase EaseOut` + - Width: 0 ↔ 300 +- 아이콘 회전 (사이드바 토글 화살표): `RotateTransform` 0 ↔ 180도 + +### 17-UI-3: AgentWindowViewModel + +```csharp +public class AgentWindowViewModel : ViewModelBase +{ + // ── 패널 상태 ── + private bool _isSidebarExpanded = true; + public bool IsSidebarExpanded + { + get => _isSidebarExpanded; + set { SetProperty(ref _isSidebarExpanded, value); OnSidebarToggled(); } + } + + private bool _isSettingsPanelOpen; + public bool IsSettingsPanelOpen + { + get => _isSettingsPanelOpen; + set => SetProperty(ref _isSettingsPanelOpen, value); + } + + // ── 자식 ViewModel ── + public AgentSidebarViewModel Sidebar { get; } + public AgentSessionHeaderViewModel SessionHeader { get; } + public AgentInlineSettingsViewModel InlineSettings { get; } + public AgentInputAreaViewModel InputArea { get; } + public ObservableCollection Messages { get; } + + // ── 커맨드 ── + public ICommand ToggleSidebarCommand { get; } // IsSidebarExpanded 토글 + public ICommand ToggleSettingsPanelCommand { get; } // IsSettingsPanelOpen 토글 + public ICommand NewSessionCommand { get; } + public ICommand SendMessageCommand { get; } + public ICommand InterruptCommand { get; } + + // ── 의존성 ── + public AgentWindowViewModel( + AgentLoopService agentLoop, + SkillLoaderService skillLoader, + AgentMemoryService memory, + SettingsService settings, + IAgentSessionRepository sessionRepo) + { ... } + + // ── 기존 AgentChatWindow 통합 ── + // AgentLoopService.MessageReceived → Messages 추가 + // AgentLoopService.ToolExecuting → SessionHeader.IsRunning = true + // AgentLoopService.Completed → SessionHeader.IsRunning = false + private void WireAgentEvents() { ... } +} +``` + +### 17-UI-4: AgentSessionHeaderViewModel + +```csharp +public class AgentSessionHeaderViewModel : ViewModelBase +{ + // ── 모델 선택 ── + public ObservableCollection AvailableModels { get; } + private string _selectedModel; + public string SelectedModel + { + get => _selectedModel; + set { SetProperty(ref _selectedModel, value); ApplyModelChange(); } + } + + // ── 모드 상태 ── + public PlanMode PlanMode { get; set; } // Off | Always | Auto + public PermissionMode PermissionMode { get; set; } // Default | AcceptEdits | Plan | Bypass + public AgentTab ActiveTab { get; set; } // Chat | Cowork | Code + public string ActivePreset { get; set; } + + // ── 실행 상태 ── + public bool IsRunning { get; set; } + public string StatusText { get; set; } // "도구 실행 중...", "생각 중..." + public int CurrentIteration { get; set; } + public int MaxIterations { get; set; } + + // ── 도구 상태 아이콘 (우측 상단 아이콘 행) ── + // MCP 연결됨, 훅 활성, 스킬 N개 로드됨 등을 아이콘으로 표시 + public bool IsMcpConnected { get; set; } + public int ActiveHookCount { get; set; } + public int LoadedSkillCount { get; set; } + + // ── 커맨드 ── + public ICommand ChangePlanModeCommand { get; } // 클릭 시 Off→Always→Auto 순환 + public ICommand ChangePermissionModeCommand { get; } + public ICommand ChangeTabCommand { get; } // Chat/Cowork/Code + public ICommand ChangePresetCommand { get; } + public ICommand ToggleSettingsCommand { get; } // AgentWindowViewModel.ToggleSettingsPanelCommand 위임 + public ICommand InterruptCommand { get; } + public ICommand ExportPdfCommand { get; } +} +``` + +**XAML 바인딩 예시 (AgentSessionHeaderBar.xaml):** +```xml + + + + + + + + + + + + + + + + + +``` + +### 17-UI-5: AgentSidebarViewModel + +```csharp +public class AgentSidebarViewModel : ViewModelBase +{ + // ── 대화 이력 ── + public ObservableCollection RecentSessions { get; } + public SessionSummaryViewModel? SelectedSession { get; set; } + + // ── 프리셋 목록 ── + public ObservableCollection Presets { get; } + public PresetViewModel? ActivePreset { get; set; } + + // ── 확장 상태 ── + // IsExpanded = true: 240px (아이콘+라벨), false: 48px (아이콘만) + public bool IsExpanded { get; set; } + + // ── 커맨드 ── + public ICommand NewSessionCommand { get; } + public ICommand SelectSessionCommand { get; } // param: SessionSummaryViewModel + public ICommand DeleteSessionCommand { get; } + public ICommand SelectPresetCommand { get; } + public ICommand EditPresetCommand { get; } + public ICommand ImportSkillCommand { get; } +} +``` + +### 17-UI-6: AgentInlineSettingsPanel (SettingsWindow 분리) + +**SettingsWindow에서 이전되는 항목:** +``` +[이전 대상 — AgentInlineSettingsPanel] +- LLM 서비스 선택 (Chat/Cowork/Code별) +- 모델 선택 (탭별) +- 플랜 모드 (Off/Always/Auto) +- 권한 모드 (Default/AcceptEdits/Plan) +- MaxAgentIterations (탭별) +- MaxRetryOnError +- EnablePostToolVerification (탭별) +- EnableCoworkVerification / EnableCodeVerification +- 컨텍스트 파일 포함 설정 +- 시스템 프롬프트 미리보기/편집 +- 활성 프리셋 편집 + +[SettingsWindow에 남는 항목] +- 일반: 테마, 폰트, AI 활성화 토글 +- 런처: 단축키, 독 바, Everything 경로 +- MCP 서버 등록 (전문 설정) +- 훅 규칙 편집기 (전문 설정) +- 권한 패턴 규칙 편집기 (전문 설정) +- LSP 설정 +- 암호화/보안 설정 +``` + +```csharp +public class AgentInlineSettingsViewModel : ViewModelBase +{ + // ── 탭별 LLM 설정 (ActiveTab에 따라 바인딩 전환) ── + public string LlmService { get; set; } + public string ModelName { get; set; } + public int MaxIterations { get; set; } + public bool EnableVerification { get; set; } + public PlanMode PlanMode { get; set; } + public PermissionMode PermissionMode { get; set; } + + // ── 시스템 프롬프트 미리보기 ── + public string SystemPromptPreview { get; set; } // 처음 200자 + public ICommand EditSystemPromptCommand { get; } // 전체 편집 팝업 + + // ── 활성 스킬 목록 ── + public ObservableCollection ActiveSkills { get; } + public ICommand ManageSkillsCommand { get; } + + // ── MCP 상태 요약 ── + public ObservableCollection McpServers { get; } + + // 설정 변경 즉시 SettingsService.Save() 호출 + // 탭 전환 시 해당 탭 설정으로 바인딩 교체 + public void SwitchToTab(AgentTab tab) { ... } +} +``` + +### 17-UI-7: AgentInputArea + +```csharp +public class AgentInputAreaViewModel : ViewModelBase +{ + public string InputText { get; set; } + public bool IsMultiline { get; set; } // Shift+Enter로 전환 + public ObservableCollection AttachedFiles { get; } + public bool IsAtMentionOpen { get; set; } // @ 입력 시 팝업 + public bool IsSlashMenuOpen { get; set; } // / 입력 시 스킬 메뉴 + public ObservableCollection SlashSuggestions { get; } + + // 커맨드 + public ICommand SendCommand { get; } + public ICommand AttachFileCommand { get; } + public ICommand ClearAttachmentsCommand { get; } + public ICommand OpenSlashMenuCommand { get; } // / 키 감지 + public ICommand InsertAtMentionCommand { get; } // @ 키 감지 +} +``` + +**XAML (AgentInputArea.xaml) 핵심:** +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### 17-UI-8: 통합 포인트 + +| 기존 클래스 | 변경 내용 | +|-----------|---------| +| `AgentChatWindow.xaml.cs` | `AgentWindow`로 교체 (리네임 + 재구성). `App.xaml.cs`의 `OpenAgentWindow()` 호출부 교체 | +| `AgentChatViewModel.cs` | `AgentWindowViewModel`로 흡수·통합 | +| `SettingsWindow.xaml` | AX Agent 탭 내 에이전트 설정 섹션 제거, "채팅 화면에서 설정 가능" 안내 문구 추가 | +| `AgentLoopService.cs` | 이벤트 구독 포인트 변경 없음. ViewModel에서 이벤트 연결 방식만 변경 | +| `App.xaml.cs` | `_agentWindow` 필드를 `AgentWindow` 타입으로 변경 | + +### 17-UI-9: 구현 순서 + +``` +1. AgentWindowViewModel + AgentSessionHeaderViewModel (VM 먼저) +2. AgentWindow.xaml 레이아웃 골격 (3열 Grid, 빈 자식) +3. AgentSessionHeaderBar.xaml (탭, 모드, 상태) +4. AgentSidebarView.xaml (대화 목록, 프리셋) +5. 기존 AgentChatView 내용 이식 (메시지 버블 등) +6. AgentInputArea.xaml (입력창, 첨부, 슬래시 메뉴) +7. AgentInlineSettingsPanel.xaml + SettingsWindow 항목 이전 +8. 사이드바/설정 패널 애니메이션 +9. GridLengthAnimation 헬퍼 클래스 구현 +10. App.xaml.cs OpenAgentWindow() 교체 및 전체 통합 테스트 +``` + +--- + +## Phase 17-A — Reflexion 강화 (v1.8.0) + +> **목표**: 성공·실패 모두 구조화된 자기평가 저장 → 동일 작업 유형 재실행 시 자동 참고 + +### 17-A-1: 핵심 신규 클래스 + +```csharp +// 반성 메모리 엔트리 +public record ReflexionEntry +{ + public string TaskType { get; init; } // "code_generation", "file_refactor" 등 + public string Summary { get; init; } // 작업 요약 + public bool IsSuccess { get; init; } + public float CompletionScore { get; init; } // 0.0~1.0 + public string[] Weaknesses { get; init; } // 부족한 점 (실패 시) + public string[] Strengths { get; init; } // 잘된 점 (성공 시) + public string[] Lessons { get; init; } // 다음에 적용할 교훈 + public DateTime CreatedAt { get; init; } + public string SessionId { get; init; } +} + +// 반성 메모리 저장소 인터페이스 +public interface IReflexionRepository +{ + Task SaveAsync(ReflexionEntry entry); + Task> GetByTaskTypeAsync(string taskType, int limit = 5); + Task BuildContextPromptAsync(string taskType); + // 저장 위치: %APPDATA%\AxCopilot\reflexion\.jsonl +} + +// 반성 메모리 구현 +public class JsonlReflexionRepository : IReflexionRepository +{ + private readonly string _baseDir; // %APPDATA%\AxCopilot\reflexion\ + public Task SaveAsync(ReflexionEntry entry) { ... } + public Task> GetByTaskTypeAsync(string taskType, int limit = 5) { ... } + public Task BuildContextPromptAsync(string taskType) + { + // 최근 5개 엔트리를 시스템 프롬프트 삽입용 텍스트로 조합 + // "이전 유사 작업에서 배운 점: ..." + } +} + +// 자기평가 생성 서비스 +public class ReflexionEvaluatorService +{ + private readonly ILlmClient _llm; + private readonly IReflexionRepository _repo; + + // AgentLoopService.Completed 이벤트에서 호출 + public Task EvaluateAsync( + AgentSession session, + AgentResult result, + CancellationToken ct); + + // 평가 프롬프트: 완성도 점수, 강점/약점, 교훈 3가지 추출 + private string BuildEvaluationPrompt(AgentSession session, AgentResult result) { ... } +} + +// 작업 유형 분류기 +public class TaskTypeClassifier +{ + // 사용자 입력 → 작업 유형 분류 (규칙 기반 + LLM 보조) + public string Classify(string userMessage) { ... } + // "파일 수정", "코드 생성", "문서 작성", "검색", "분석", "테스트" 등 + private static readonly Dictionary _keywords = ...; +} +``` + +### 17-A-2: AgentLoopService 통합 포인트 + +```csharp +// AgentLoopService.cs 에 추가 +public class AgentLoopService +{ + // 기존 필드에 추가 + private readonly ReflexionEvaluatorService _reflexion; + private readonly IReflexionRepository _reflexionRepo; + private readonly TaskTypeClassifier _taskClassifier; + + // RunAsync() 시작 시: 반성 컨텍스트 주입 + private async Task BuildSystemPromptAsync(string userMessage) + { + var taskType = _taskClassifier.Classify(userMessage); + var reflexionContext = await _reflexionRepo.BuildContextPromptAsync(taskType); + // 기존 시스템 프롬프트 끝에 reflexionContext 추가 + } + + // RunAsync() 완료 후: 자기평가 저장 + private async Task OnSessionCompletedAsync(AgentSession session, AgentResult result) + { + var entry = await _reflexion.EvaluateAsync(session, result, CancellationToken.None); + await _reflexionRepo.SaveAsync(entry); + } +} +``` + +### 17-A-3: 검증 대상 확대 (17-A2) + +```csharp +// 기존 PostToolVerificationService 확장 +public class PostToolVerificationService +{ + // 기존: bash, process 도구 후 검증 + // 추가: script_create, file_edit 도구 후 검증 + private static readonly HashSet _verifiableTools = new() + { + "bash", "process", + "script_create", // 신규 + "file_edit", // 신규 + "file_write", // 신규 + }; + + // 검증 체크리스트 (사용자 편집 가능) + // 저장: %APPDATA%\AxCopilot\verification_checklist.json + public Task LoadChecklistAsync() { ... } + public Task SaveChecklistAsync(VerificationChecklist checklist) { ... } +} + +public record VerificationChecklist +{ + [JsonPropertyName("code_checks")] + public string[] CodeChecks { get; init; } = new[] + { + "구문 오류 없음", + "참조 무결성 확인", + "null 참조 없음" + }; + + [JsonPropertyName("file_checks")] + public string[] FileChecks { get; init; } = new[] + { + "파일이 실제로 수정됨", + "인코딩 올바름 (UTF-8)" + }; +} +``` + +### 17-A-4: 설정 스키마 변경 + +```csharp +// AppSettings.cs → LlmSettings 에 추가 +public class LlmSettings +{ + // ... 기존 ... + [JsonPropertyName("enable_reflexion")] + public bool EnableReflexion { get; set; } = true; + + [JsonPropertyName("reflexion_max_context_entries")] + public int ReflexionMaxContextEntries { get; set; } = 5; + + [JsonPropertyName("reflexion_evaluate_on_success")] + public bool ReflexionEvaluateOnSuccess { get; set; } = true; +} +``` + +--- + +## Phase 17-B — 구조화된 태스크 상태 + 이벤트 로그 (v1.8.0) + +> **목표**: 대화 압축 시에도 유지되는 Working Memory + JSONL 이벤트 로그 + +### 17-B-1: TaskState (Working Memory) + +```csharp +// 세션 전체에 걸쳐 유지되는 구조화된 작업 상태 +public class TaskState +{ + public string SessionId { get; init; } + public string CurrentTask { get; set; } // 현재 수행 중인 작업 요약 + public List ReferencedFiles { get; set; } // 이번 세션에서 참조한 파일들 + public List DecisionLog { get; set; } // 의사결정 이력 + public Dictionary KeyFacts { get; set; } // 핵심 사실 (key→value) + public string ContextSummary { get; set; } // 대화 압축 시 갱신되는 요약 + + // 직렬화: %APPDATA%\AxCopilot\sessions\\task_state.json + public Task SaveAsync(string baseDir) { ... } + public static Task LoadAsync(string sessionId, string baseDir) { ... } +} + +public record DecisionLogEntry +{ + public DateTime Timestamp { get; init; } + public string Decision { get; init; } + public string Reason { get; init; } + public string[] Alternatives { get; init; } +} + +// TaskState 관리 서비스 +public class TaskStateService +{ + private readonly string _baseDir; + private TaskState? _current; + + public TaskState Current => _current ?? throw new InvalidOperationException(); + + public Task InitializeAsync(string sessionId) { ... } + public Task UpdateCurrentTaskAsync(string taskDescription) { ... } + public Task AddReferencedFileAsync(string filePath) { ... } + public Task LogDecisionAsync(string decision, string reason, string[] alternatives) { ... } + public Task UpdateContextSummaryAsync(string summary) { ... } + + // AgentLoopService.ContextCompacting 이벤트에서 호출 + // 압축 전 현재 TaskState를 시스템 프롬프트에 추가 + public string BuildCompactContextInjection() { ... } +} +``` + +### 17-B-2: Event-Sourced 이벤트 로그 + +```csharp +// 모든 에이전트 이벤트의 구조화된 기록 +public record AgentEventRecord +{ + [JsonPropertyName("seq")] + public long SeqNo { get; init; } + + [JsonPropertyName("id")] + public string EventId { get; init; } // GUID + + [JsonPropertyName("parent_id")] + public string? ParentEventId { get; init; } + + [JsonPropertyName("session_id")] + public string SessionId { get; init; } + + [JsonPropertyName("type")] + public AgentEventType Type { get; init; } + + [JsonPropertyName("ts")] + public DateTime Timestamp { get; init; } + + [JsonPropertyName("payload")] + public JsonElement Payload { get; init; } // 이벤트별 페이로드 +} + +public enum AgentEventType +{ + SessionStart, SessionEnd, + UserMessage, AssistantMessage, + ToolRequest, ToolResult, + HookFired, HookResult, + SkillActivated, SkillCompleted, + CompactionTriggered, CompactionCompleted, + SubagentSpawned, SubagentCompleted, + Error +} + +// JSONL 기반 이벤트 로그 저장소 +// 저장: %APPDATA%\AxCopilot\sessions\\events.jsonl +public class AgentEventLog +{ + private readonly string _filePath; + private long _seq = 0; + + public Task AppendAsync(AgentEventType type, object payload, string? parentId = null) { ... } + public IAsyncEnumerable ReadAllAsync() { ... } + public IAsyncEnumerable ReadFromAsync(long fromSeq) { ... } +} + +// AgentLoopService에서 이벤트 기록 +public class AgentLoopService +{ + private AgentEventLog? _eventLog; + + // 기존 _events 컬렉션 대신 또는 병렬로 이벤트 로그 기록 + private async Task RecordEventAsync(AgentEventType type, object payload) + { + if (_eventLog != null) + await _eventLog.AppendAsync(type, payload); + } +} +``` + +### 17-B-3: 설정 스키마 변경 + +```csharp +// AppSettings.cs 에 추가 +public class AppSettings +{ + // ... 기존 ... + [JsonPropertyName("enable_event_log")] + public bool EnableEventLog { get; set; } = true; + + [JsonPropertyName("event_log_retention_days")] + public int EventLogRetentionDays { get; set; } = 30; + + [JsonPropertyName("enable_task_state")] + public bool EnableTaskState { get; set; } = true; +} +``` + +--- + +## Phase 17-C — 훅 시스템 고도화 (v1.8.0) + +> **목표**: Claude Code의 17종 이벤트·4타입 훅 시스템을 AX Copilot에 이식 + +### 17-C-1: 훅 이벤트 열거형 확장 + +```csharp +// 기존 HookEvent 열거형에 추가 +public enum HookEvent +{ + // ── 기존 (유지) ── + PreToolUse, + PostToolUse, + AgentStop, + + // ── 신규 (Phase 17-C) ── + UserPromptSubmit, // 사용자 프롬프트 제출 전 (차단·수정 가능) + PreCompact, // 컨텍스트 압축 전 + PostCompact, // 컨텍스트 압축 후 + FileChanged, // watchPaths에 등록된 파일 변경 시 + CwdChanged, // 작업 디렉토리 변경 시 (프로젝트 전환 감지) + SessionStart, // 세션 시작 (watchPaths 등록, 초기 컨텍스트 주입) + SessionEnd, // 세션 종료 (정리 작업) + ConfigChange, // .ax/rules/*.md 또는 AX.md 파일 변경 + PermissionRequest, // 도구 실행 권한 요청 (프로그래밍 방식 승인/거부) + PreSkillExecute, // 스킬 실행 전 + PostSkillExecute, // 스킬 실행 후 + SubagentStart, // 서브에이전트 시작 + SubagentStop, // 서브에이전트 종료 + AgentIterationStart, // 에이전트 루프 반복 시작 + AgentIterationEnd // 에이전트 루프 반복 종료 +} +``` + +### 17-C-2: 훅 타입 인터페이스 (Strategy 패턴) + +```csharp +// 훅 실행기 인터페이스 (Strategy) +public interface IHookExecutor +{ + HookType Type { get; } + Task ExecuteAsync(HookContext context, CancellationToken ct); +} + +// 훅 컨텍스트 (이벤트 정보 + 도구 입력 등) +public record HookContext +{ + public HookEvent Event { get; init; } + public string? ToolName { get; init; } // PreToolUse, PostToolUse 시 + public string? ToolInput { get; init; } // 도구 입력 JSON + public string? ToolOutput { get; init; } // PostToolUse 시 도구 출력 + public string? UserMessage { get; init; } // UserPromptSubmit 시 + public string? ChangedFilePath { get; init; } // FileChanged 시 + public string SessionId { get; init; } + public Dictionary EnvVars { get; init; } // $TOOL_NAME, $ARGUMENTS 등 +} + +// 훅 결과 +public record HookResult +{ + public bool Block { get; init; } = false; // true: 도구 실행 차단 + public string? BlockReason { get; init; } + public string? AdditionalContext { get; init; } // 시스템 프롬프트에 추가할 텍스트 + public string? UpdatedInput { get; init; } // 수정된 도구 입력 (updatedInput) + public PermissionDecision? PermissionDecision { get; init; } // allow | deny + public IReadOnlyList? WatchPaths { get; init; } // SessionStart 시 등록 + public string? StatusMessage { get; init; } // 스피너 커스텀 메시지 +} + +public enum PermissionDecision { Allow, Deny, Ask } + +// ── 구현체 ── + +// 1. command 타입: 외부 프로세스 실행 +public class CommandHookExecutor : IHookExecutor +{ + public HookType Type => HookType.Command; + + public async Task ExecuteAsync(HookContext context, CancellationToken ct) + { + // stdout → stdout 읽어서 HookResult 파싱 + // exit code 2 → Block = true + // JSON 출력 → AdditionalContext, UpdatedInput 파싱 + } +} + +// 2. http 타입: HTTP 웹훅 +public class HttpHookExecutor : IHookExecutor +{ + public HookType Type => HookType.Http; + // POST JSON 페이로드 → 응답 JSON 파싱 → HookResult +} + +// 3. prompt 타입: LLM 검사 (소형 모델로 빠른 판단) +public class PromptHookExecutor : IHookExecutor +{ + public HookType Type => HookType.Prompt; + private readonly ILlmClientFactory _llmFactory; + + public async Task ExecuteAsync(HookContext context, CancellationToken ct) + { + // 설정된 prompt 템플릿 + 컨텍스트 변수 치환 + // LLM 호출 (기본 claude-haiku-4-5, 타임아웃 15초) + // 응답에서 "BLOCK"/"ALLOW" 및 이유 파싱 + } + + // 훅 설정 필드 + public record PromptHookConfig + { + public string Prompt { get; init; } + public string Model { get; init; } = "claude-haiku-4-5"; + public int TimeoutSeconds { get; init; } = 15; + } +} + +// 4. agent 타입: 미니 에이전트 루프 +public class AgentHookExecutor : IHookExecutor +{ + public HookType Type => HookType.Agent; + private readonly AgentLoopService _agentLoop; + + public async Task ExecuteAsync(HookContext context, CancellationToken ct) + { + // 격리된 미니 에이전트 루프 실행 + // 파일 읽기·명령 실행·검증 가능 + // 최대 반복: 3회 (하드코딩 또는 설정) + // 결과를 HookResult로 변환 + } +} + +// 훅 실행기 팩토리 (Factory 패턴) +public class HookExecutorFactory +{ + private readonly IReadOnlyDictionary _executors; + + public HookExecutorFactory( + CommandHookExecutor cmd, + HttpHookExecutor http, + PromptHookExecutor prompt, + AgentHookExecutor agent) + { + _executors = new Dictionary + { + [HookType.Command] = cmd, + [HookType.Http] = http, + [HookType.Prompt] = prompt, + [HookType.Agent] = agent, + }; + } + + public IHookExecutor GetExecutor(HookType type) + => _executors.TryGetValue(type, out var exec) ? exec + : throw new NotSupportedException($"훅 타입 미지원: {type}"); +} +``` + +### 17-C-3: 훅 속성 모델 확장 + +```csharp +// 기존 HookDefinition 에 속성 추가 +public class HookDefinition +{ + // ── 기존 ── + public string? Matcher { get; init; } + public HookType Type { get; init; } + public string? Command { get; init; } + public string? Url { get; init; } + + // ── 신규 속성 (Phase 17-C) ── + [JsonPropertyName("if")] + public string? Condition { get; init; } // 조건부 실행 (권한 모드 등 체크) + + [JsonPropertyName("once")] + public bool Once { get; init; } = false; // 실행 후 자기 제거 + + [JsonPropertyName("async")] + public bool IsAsync { get; init; } = false; // 비동기 실행 (결과 기다리지 않음) + + [JsonPropertyName("async_rewake")] + public bool AsyncRewake { get; init; } = false; // 비동기 완료 후 에이전트 재깨우기 + + [JsonPropertyName("status_message")] + public string? StatusMessage { get; init; } // 실행 중 스피너 메시지 + + [JsonPropertyName("timeout")] + public int TimeoutSeconds { get; init; } = 30; + + // prompt 타입 전용 + [JsonPropertyName("prompt")] + public string? Prompt { get; init; } + + [JsonPropertyName("model")] + public string? Model { get; init; } + + // agent 타입 전용 + [JsonPropertyName("max_iterations")] + public int MaxIterations { get; init; } = 3; +} +``` + +### 17-C-4: HookRunnerService 확장 + +```csharp +public class HookRunnerService +{ + private readonly HookExecutorFactory _executorFactory; + private readonly HookConfigRepository _configRepo; + private readonly FileWatcherService _fileWatcher; // FileChanged 훅용 + + // ── 기존 메서드 시그니처 유지 + 새 이벤트 지원 ── + + // 훅 실행 (모든 이벤트 공통) + public async Task RunAsync( + HookEvent hookEvent, + HookContext context, + CancellationToken ct) + { + var defs = _configRepo.GetHooksForEvent(hookEvent, context.ToolName); + + // once 훅: 실행 후 설정에서 제거 + // async 훅: 비동기 실행, 결과 기다리지 않음 + // asyncRewake 훅: 완료 시 AgentLoopService.ResumeAsync() 호출 + // if 조건: EvaluateCondition(def.Condition, context) 통과 시만 실행 + } + + // FileChanged 감시 시작 (SessionStart 훅 watchPaths에서 호출) + public void RegisterWatchPaths(IReadOnlyList patterns) + { + foreach (var pattern in patterns) + _fileWatcher.Watch(pattern, path => + RunAsync(HookEvent.FileChanged, + new HookContext { ChangedFilePath = path, ... }, CancellationToken.None)); + } + + // Once 훅 자기 제거 + private void RemoveOnceHook(HookDefinition def) { ... } +} + +public record HookRunResult +{ + public bool AnyBlocked { get; init; } + public string? CombinedContext { get; init; } // 여러 훅의 AdditionalContext 합산 + public string? UpdatedInput { get; init; } // 마지막 updatedInput + public PermissionDecision? PermissionDecision { get; init; } +} +``` + +### 17-C-5: AgentLoopService 통합 + +```csharp +// AgentLoopService.cs 에서 새 이벤트 발화 위치: +public class AgentLoopService +{ + // 1. 사용자 메시지 수신 시 → UserPromptSubmit 훅 + private async Task OnUserMessageAsync(string message) + { + var ctx = new HookContext { Event = HookEvent.UserPromptSubmit, UserMessage = message, ... }; + var result = await _hookRunner.RunAsync(HookEvent.UserPromptSubmit, ctx, _ct); + if (result.AnyBlocked) return null; // 차단 + return result.UpdatedInput ?? message; // 수정된 메시지 반환 + } + + // 2. 세션 시작 시 → SessionStart 훅 + private async Task OnSessionStartAsync() + { + var result = await _hookRunner.RunAsync(HookEvent.SessionStart, ..., _ct); + if (result.WatchPaths?.Count > 0) + _hookRunner.RegisterWatchPaths(result.WatchPaths); + } + + // 3. 컨텍스트 압축 전후 → PreCompact/PostCompact 훅 + private async Task CompactContextAsync() + { + await _hookRunner.RunAsync(HookEvent.PreCompact, ..., _ct); + // ... 실제 압축 ... + await _hookRunner.RunAsync(HookEvent.PostCompact, ..., _ct); + } + + // 4. 권한 요청 시 → PermissionRequest 훅 + private async Task RequestPermissionAsync(string toolName, string input) + { + var ctx = new HookContext { Event = HookEvent.PermissionRequest, ToolName = toolName, ToolInput = input }; + var result = await _hookRunner.RunAsync(HookEvent.PermissionRequest, ctx, _ct); + return result.PermissionDecision ?? PermissionDecision.Ask; // 훅 미설정 시 기존 UI 표시 + } +} +``` + +### 17-C-6: 설정 스키마 변경 + +```csharp +// AppSettings.cs → LlmSettings에 추가 +public class LlmSettings +{ + [JsonPropertyName("hooks")] + public HooksConfig Hooks { get; set; } = new(); +} + +public class HooksConfig +{ + [JsonPropertyName("user_prompt_submit")] + public List UserPromptSubmit { get; set; } = new(); + + [JsonPropertyName("pre_compact")] + public List PreCompact { get; set; } = new(); + + [JsonPropertyName("post_compact")] + public List PostCompact { get; set; } = new(); + + [JsonPropertyName("file_changed")] + public List FileChanged { get; set; } = new(); + + [JsonPropertyName("session_start")] + public List SessionStart { get; set; } = new(); + + [JsonPropertyName("session_end")] + public List SessionEnd { get; set; } = new(); + + [JsonPropertyName("permission_request")] + public List PermissionRequest { get; set; } = new(); + + // ... 기존 PreToolUse, PostToolUse, AgentStop 유지 ... +} +``` + +### 17-C-7: 훅 편집기 UI (SettingsWindow에 잔류) + +```csharp +// SettingsWindow.xaml — Hooks 탭 (기존 위치 유지) +// 신규: 훅 타입 선택 드롭다운 (Command/Http/Prompt/Agent) +// 신규: prompt 타입 선택 시 → Prompt 텍스트박스 + Model 드롭다운 표시 +// 신규: agent 타입 선택 시 → Prompt 텍스트박스 + MaxIterations 숫자 입력 표시 +// 신규: 속성 체크박스 행: [once] [async] [asyncRewake] +// 신규: statusMessage 텍스트 입력 +// 신규: condition 텍스트 입력 (고급 섹션) +``` + +--- + +## Phase 17-D — 스킬 시스템 고도화 (v1.8.0) + +> **목표**: fork 격리·경로 자동 활성화·스킬 범위 훅·모델 오버라이드 구현 + +### 17-D-1: SkillFrontmatter 확장 + +```csharp +// 기존 SkillFrontmatter에 필드 추가 +public class SkillFrontmatter +{ + // ── 기존 ── + [JsonPropertyName("description")] + public string Description { get; init; } = string.Empty; + + [JsonPropertyName("when_to_use")] + public string WhenToUse { get; init; } = string.Empty; + + [JsonPropertyName("arguments")] + public IReadOnlyList Arguments { get; init; } = Array.Empty(); + + // ── 신규 (Phase 17-D) ── + [JsonPropertyName("context")] + public SkillContext Context { get; init; } = SkillContext.Default; + // "fork" → 격리된 서브에이전트 컨텍스트 + + [JsonPropertyName("paths")] + public IReadOnlyList Paths { get; init; } = Array.Empty(); + // glob 패턴 목록: ["**/*.py", "src/**/*.cs"] + // 해당 파일 작업 시 자동 컨텍스트 주입 + + [JsonPropertyName("model")] + public string? Model { get; init; } + // 스킬별 모델 오버라이드: "claude-opus-4-6", "claude-haiku-4-5" 등 + + [JsonPropertyName("user_invocable")] + public bool UserInvocable { get; init; } = true; + // false → /스킬 목록에서 숨김, AI가 자동 활성화만 가능 + + [JsonPropertyName("hooks")] + public SkillHooksConfig? Hooks { get; init; } + // 스킬 실행 중에만 적용되는 훅 +} + +public enum SkillContext { Default, Fork } + +public class SkillHooksConfig +{ + [JsonPropertyName("pre_skill_execute")] + public List PreSkillExecute { get; init; } = new(); + + [JsonPropertyName("post_skill_execute")] + public List PostSkillExecute { get; init; } = new(); + + [JsonPropertyName("post_tool_use")] + public List PostToolUse { get; init; } = new(); +} +``` + +### 17-D-2: PathBasedSkillActivator + +```csharp +// 파일 경로에 따라 적용할 스킬을 자동 선택 +public class PathBasedSkillActivator +{ + private readonly SkillLoaderService _skillLoader; + + // 현재 작업 중인 파일 경로 기반으로 활성 스킬 목록 반환 + public IReadOnlyList GetActiveSkillsForFile(string filePath) + { + return _skillLoader.GetAllSkills() + .Where(s => s.Frontmatter.Paths.Any(pattern => + GlobMatcher.IsMatch(filePath, pattern))) + .ToList(); + } + + // 활성 스킬의 컨텍스트를 시스템 프롬프트 주입용 텍스트로 빌드 + public string BuildSkillContextInjection(IReadOnlyList skills) + { + if (skills.Count == 0) return string.Empty; + var sb = new StringBuilder(); + sb.AppendLine("## 현재 파일에 자동 적용된 스킬"); + foreach (var skill in skills) + { + sb.AppendLine($"### {skill.Name}"); + sb.AppendLine(skill.Body); + } + return sb.ToString(); + } + + // GlobMatcher: ** 와일드카드, *.ext 패턴 지원 + private static class GlobMatcher + { + public static bool IsMatch(string path, string pattern) { ... } + } +} +``` + +### 17-D-3: ForkContextSkillRunner + +```csharp +// fork 컨텍스트 스킬: 격리된 서브에이전트 루프에서 실행 +public class ForkContextSkillRunner +{ + private readonly AgentLoopService _parentLoop; + + public async Task ExecuteInForkAsync( + LoadedSkill skill, + string userInput, + CancellationToken ct) + { + // 1. 격리된 AgentSession 생성 (부모 대화 히스토리 제외) + // 2. 스킬의 시스템 프롬프트만 포함 + // 3. 모델 오버라이드 적용 (skill.Frontmatter.Model) + // 4. 스킬 범위 훅 등록 (skill.Frontmatter.Hooks) + // 5. 미니 에이전트 루프 실행 (최대 10 반복) + // 6. 결과 텍스트 반환 (메인 대화에 reply로 주입) + } +} + +public record SkillResult +{ + public bool IsSuccess { get; init; } + public string Output { get; init; } = string.Empty; + public string? ErrorMessage { get; init; } + public int Iterations { get; init; } +} +``` + +### 17-D-4: SkillLoaderService 확장 + +```csharp +public class SkillLoaderService +{ + // 기존 메서드 유지 + + + // 신규: UserInvocable=false 스킬을 슬래시 메뉴에서 필터 + public IReadOnlyList GetUserInvocableSkills() + => GetAllSkills().Where(s => s.Frontmatter.UserInvocable).ToList(); + + // 신규: paths 패턴이 있는 스킬 목록 (PathBasedSkillActivator용) + public IReadOnlyList GetPathScopedSkills() + => GetAllSkills().Where(s => s.Frontmatter.Paths.Count > 0).ToList(); +} +``` + +### 17-D-5: AgentLoopService 통합 + +```csharp +public class AgentLoopService +{ + private readonly PathBasedSkillActivator _pathActivator; + private readonly ForkContextSkillRunner _forkRunner; + + // 도구 실행 후: 작업 파일 경로 감지 → 경로 기반 스킬 자동 주입 + private async Task OnFileToolExecutedAsync(string filePath) + { + var skills = _pathActivator.GetActiveSkillsForFile(filePath); + if (skills.Count > 0) + { + var injection = _pathActivator.BuildSkillContextInjection(skills); + _contextBuilder.AddDynamicContext("path_skills", injection); + } + } + + // 스킬 실행 시: fork vs default 분기 + public async Task ExecuteSkillAsync(LoadedSkill skill, string input, CancellationToken ct) + { + if (skill.Frontmatter.Context == SkillContext.Fork) + { + var result = await _forkRunner.ExecuteInForkAsync(skill, input, ct); + return result.Output; + } + else + { + // 기존 방식: 메인 컨텍스트에서 실행 + return await ExecuteSkillInMainContextAsync(skill, input, ct); + } + } +} +``` + +### 17-D-6: 설정 없음 (프론트매터 기반) + +> 스킬 시스템 고도화는 SKILL.md 프론트매터 확장이 핵심. 별도 AppSettings 변경 최소화. +> SkillLoaderService에서 신규 프론트매터 필드 파싱만 추가. + +--- + +## Phase 17-E — 메모리/컨텍스트 고도화 (v1.8.0) + +> **목표**: @include 지시어·경로 기반 규칙 주입·/compact 명령·파일 되감기 + +### 17-E-1: AxMdIncludeResolver + +```csharp +// AX.md 및 rules/*.md에서 @파일경로 지시어를 재귀 해석 +public class AxMdIncludeResolver +{ + private const int MaxDepth = 5; + private const long MaxFileSize = 40_000; // 40,000자 경고 임계값 + + // @파일경로 지시어 모두 해석하여 최종 텍스트 반환 + public async Task ResolveAsync( + string content, + string basePath, + int depth = 0, + HashSet? visited = null) + { + if (depth >= MaxDepth) return content; // 최대 깊이 초과 + visited ??= new HashSet(StringComparer.OrdinalIgnoreCase); + + // @로 시작하는 줄 감지: "@./shared/common.md", "@../global/rules.md" + var regex = new Regex(@"^@(.+)$", RegexOptions.Multiline); + // ... 파일 읽기·재귀·순환 감지 ... + } + + // 파일 크기 40,000자 초과 경고 + public bool IsOversized(string content) => content.Length > MaxFileSize; + + // 순환 참조 감지: visited 집합으로 추적 + private void DetectCircular(string filePath, HashSet visited) + { + if (visited.Contains(filePath)) + throw new InvalidOperationException($"순환 참조 감지: {filePath}"); + visited.Add(filePath); + } +} +``` + +### 17-E-2: PathScopedRuleInjector + +```csharp +// .ax/rules/*.md의 paths: 프론트매터를 읽어 현재 파일에 맞는 규칙만 주입 +public class PathScopedRuleInjector +{ + private readonly string _rulesDir; // 프로젝트/.ax/rules/ + private IReadOnlyList? _cachedRules; + + // 캐시 로드 (FileSystemWatcher로 변경 시 무효화) + public async Task LoadRulesAsync() { ... } + + // 현재 파일 경로에 맞는 규칙 파일 필터링 + public IReadOnlyList GetActiveRulesForFile(string currentFilePath) + { + return (_cachedRules ?? Array.Empty()) + .Where(r => r.Frontmatter.Paths.Count == 0 || // paths 없으면 항상 적용 + r.Frontmatter.Paths.Any(p => GlobMatcher.IsMatch(currentFilePath, p))) + .ToList(); + } + + // 시스템 프롬프트 주입용 텍스트 빌드 + public string BuildInjection(IReadOnlyList rules) + { + var sb = new StringBuilder("## 프로젝트 규칙\n\n"); + foreach (var rule in rules) + sb.AppendLine(rule.Body).AppendLine(); + return sb.ToString(); + } +} + +public record RuleFile +{ + public string FilePath { get; init; } + public RuleFrontmatter Frontmatter { get; init; } + public string Body { get; init; } +} + +public record RuleFrontmatter +{ + [JsonPropertyName("name")] + public string Name { get; init; } = string.Empty; + + [JsonPropertyName("paths")] + public IReadOnlyList Paths { get; init; } = Array.Empty(); + // 빈 배열 → 항상 적용 + // ["src/**/*.py"] → Python 파일 작업 시만 적용 +} +``` + +### 17-E-3: ContextCompactionService + /compact 명령 + +```csharp +// 컨텍스트 압축 서비스 +public class ContextCompactionService +{ + private readonly AgentLoopService _agentLoop; + private readonly HookRunnerService _hookRunner; + private readonly TaskStateService _taskState; + + // /compact 슬래시 명령 처리 + public async Task CompactAsync( + string sessionId, + CompactionOptions opts, + CancellationToken ct) + { + // 1. PreCompact 훅 실행 + await _hookRunner.RunAsync(HookEvent.PreCompact, ..., ct); + + // 2. 현재 TaskState를 새 컨텍스트 요약에 포함 + var stateContext = _taskState.BuildCompactContextInjection(); + + // 3. LLM으로 대화 이력 요약 생성 + var summary = await GenerateSummaryAsync(sessionId, stateContext, ct); + + // 4. 대화 이력 교체 (요약으로) + _agentLoop.ReplaceHistoryWithSummary(sessionId, summary); + + // 5. PostCompact 훅 실행 + await _hookRunner.RunAsync(HookEvent.PostCompact, ..., ct); + + return new CompactionResult { Summary = summary, SavedTokens = ... }; + } + + // rewind_files: 특정 메시지 이후 에이전트가 수정한 파일 되돌리기 + public async Task RewindFilesAsync(string sessionId, string afterMessageId) + { + // 1. AgentEventLog에서 afterMessageId 이후 file_edit 이벤트 수집 + // 2. 각 이벤트의 이전 파일 내용(백업)을 복원 + // 3. git checkout -- 또는 내부 백업에서 복원 + } +} + +public record CompactionOptions +{ + public bool KeepTaskState { get; init; } = true; + public bool KeepRecentN { get; init; } = true; + public int RecentNMessages { get; init; } = 5; // 최근 N개 메시지는 유지 +} +``` + +### 17-E-4: /compact 슬래시 명령 등록 + +```csharp +// SlashCommandRegistry 에 등록 +public class CompactSlashCommand : ISlashCommand +{ + public string Name => "compact"; + public string Description => "대화 컨텍스트를 수동으로 압축합니다"; + public bool UserInvocable => true; + + private readonly ContextCompactionService _compaction; + + public async Task ExecuteAsync( + string args, AgentSession session, CancellationToken ct) + { + var result = await _compaction.CompactAsync(session.Id, new CompactionOptions(), ct); + return SlashCommandResult.Success( + $"컨텍스트 압축 완료. 절약된 토큰: {result.SavedTokens:N0}"); + } +} +``` + +### 17-E-5: 파일 크기 경고 UI + +```csharp +// WorkflowAnalyzerViewModel 또는 AgentSessionHeaderViewModel 에 추가 +public bool HasOversizedRules { get; set; } // 40,000자 초과 시 true +public string OversizedRuleWarning { get; set; } // "python.md가 40,000자를 초과합니다. 파일 분리를 권장합니다." + +// AgentSessionHeaderBar.xaml에 경고 배지 표시 +// +// +// +``` + +--- + +## Phase 17-F — 권한 시스템 고도화 (v1.8.0) + +> **목표**: acceptEdits 모드 추가 + 패턴 기반 허용/차단 규칙 + MCP 도구 권한 + +### 17-F-1: PermissionMode 열거형 확장 + +```csharp +// 기존 AgentDecisionLevel → PermissionMode 로 개념 통합 +public enum PermissionMode +{ + Default, // 기존: 잠재적으로 위험한 작업에 확인 요청 + AcceptEdits, // 신규: 파일 편집 자동승인, bash/process 확인 유지 + Plan, // 기존: 읽기 전용, 쓰기 차단 + BypassPermissions // 기존: 모든 확인 건너뜀 (자동화 전용) +} +``` + +### 17-F-2: PermissionRule + Chain (Chain of Responsibility 패턴) + +```csharp +// 권한 규칙 하나 +public record PermissionRule +{ + [JsonPropertyName("tool")] + public string ToolName { get; init; } // "process", "file_edit", "mcp__myserver__*" + + [JsonPropertyName("pattern")] + public string? Pattern { get; init; } // "git *", "rm -rf *", null(모든 입력) + + [JsonPropertyName("behavior")] + public PermissionBehavior Behavior { get; init; } // Allow | Deny | Ask +} + +public enum PermissionBehavior { Allow, Deny, Ask } + +// 책임 연쇄 핸들러 인터페이스 +public abstract class PermissionHandler +{ + protected PermissionHandler? _next; + + public PermissionHandler SetNext(PermissionHandler next) + { + _next = next; + return next; + } + + public abstract PermissionDecision? Handle(string toolName, string input); +} + +// 구현: Deny 규칙 핸들러 +public class DenyRuleHandler : PermissionHandler +{ + private readonly IReadOnlyList _denyRules; + + public override PermissionDecision? Handle(string toolName, string input) + { + if (_denyRules.Any(r => Matches(r, toolName, input))) + return PermissionDecision.Deny; + return _next?.Handle(toolName, input); + } + + private bool Matches(PermissionRule rule, string toolName, string input) + => rule.ToolName == toolName && + (rule.Pattern == null || GlobMatcher.IsMatch(input, rule.Pattern)); +} + +// 구현: Allow 규칙 핸들러 +public class AllowRuleHandler : PermissionHandler +{ + private readonly IReadOnlyList _allowRules; + public override PermissionDecision? Handle(string toolName, string input) { ... } +} + +// 구현: AcceptEdits 모드 핸들러 +public class AcceptEditsHandler : PermissionHandler +{ + private readonly PermissionMode _mode; + private static readonly HashSet _editTools = new() { "file_edit", "file_write", "script_create" }; + + public override PermissionDecision? Handle(string toolName, string input) + { + if (_mode == PermissionMode.AcceptEdits && _editTools.Contains(toolName)) + return PermissionDecision.Allow; // 파일 편집 자동승인 + return _next?.Handle(toolName, input); + } +} + +// 권한 결정 서비스 (Chain 조립) +public class PermissionDecisionService +{ + private readonly PermissionHandler _chain; + + public PermissionDecisionService(AppSettings settings) + { + // Chain 조립: Deny → Allow → AcceptEdits → Default(Ask) + var denyHandler = new DenyRuleHandler(settings.Permissions.DenyRules); + var allowHandler = new AllowRuleHandler(settings.Permissions.AllowRules); + var acceptEditsHandler = new AcceptEditsHandler(settings.Permissions.Mode); + var defaultHandler = new DefaultAskHandler(); + + denyHandler.SetNext(allowHandler).SetNext(acceptEditsHandler).SetNext(defaultHandler); + _chain = denyHandler; + } + + public PermissionDecision Decide(string toolName, string input) + => _chain.Handle(toolName, input) ?? PermissionDecision.Ask; +} +``` + +### 17-F-3: MCP 도구 권한 + +```csharp +// MCP 도구 규칙: mcp__서버명, mcp__서버명__도구명 +// ToolName 패턴: "mcp__myserver", "mcp__myserver__query_db" +// PermissionRule에서 ToolName="mcp__myserver" → 해당 서버 모든 도구 차단 + +public class McpPermissionFilter +{ + private readonly PermissionDecisionService _permissions; + + // McpClientService.ExecuteToolAsync() 호출 전 적용 + public bool IsToolAllowed(string serverName, string toolName) + { + var fullName = $"mcp__{serverName}__{toolName}"; + var serverPattern = $"mcp__{serverName}"; + + var byTool = _permissions.Decide(fullName, string.Empty); + if (byTool == PermissionDecision.Deny) return false; + + var byServer = _permissions.Decide(serverPattern, string.Empty); + if (byServer == PermissionDecision.Deny) return false; + + return true; + } +} +``` + +### 17-F-4: 설정 스키마 변경 + +```csharp +// AppSettings.cs 에 추가 +public class AppSettings +{ + [JsonPropertyName("permissions")] + public PermissionsConfig Permissions { get; set; } = new(); +} + +public class PermissionsConfig +{ + [JsonPropertyName("mode")] + public PermissionMode Mode { get; set; } = PermissionMode.Default; + + [JsonPropertyName("allow")] + public List AllowRules { get; set; } = new(); + // 예: [{"tool":"process","pattern":"git *","behavior":"allow"}] + + [JsonPropertyName("deny")] + public List DenyRules { get; set; } = new(); + // 예: [{"tool":"process","pattern":"rm -rf *","behavior":"deny"}] +} +``` + +### 17-F-5: 권한 편집기 UI (SettingsWindow — 전문 설정 탭) + +``` +[설정창 > 권한 탭] + +권한 모드: [Default ▾] (Default / AcceptEdits / Plan / BypassPermissions) + +── 허용 규칙 ────────────────────────────── +[도구: process ] [패턴: git * ] [허용 ▾] [삭제] +[도구: process ] [패턴: dotnet * ] [허용 ▾] [삭제] +[+ 규칙 추가] + +── 차단 규칙 ────────────────────────────── +[도구: process ] [패턴: rm -rf * ] [차단 ▾] [삭제] +[도구: mcp__외부서버 ] [패턴: (전체) ] [차단 ▾] [삭제] +[+ 규칙 추가] +``` + +```csharp +// PermissionsTabViewModel (SettingsWindow 내 탭) +public class PermissionsTabViewModel : ViewModelBase +{ + public PermissionMode SelectedMode { get; set; } + public ObservableCollection AllowRules { get; } + public ObservableCollection DenyRules { get; } + public ICommand AddAllowRuleCommand { get; } + public ICommand AddDenyRuleCommand { get; } + public ICommand DeleteRuleCommand { get; } // param: PermissionRuleViewModel + public ICommand SaveCommand { get; } +} +``` + +### 17-F-6: MCP HTTP+SSE 전송 추가 + +```csharp +// McpClientService.cs 에 전송 타입 추가 +public enum McpTransport { Stdio, Http, Sse } + +public class McpServerConfig +{ + // 기존 + [JsonPropertyName("command")] + public string? Command { get; init; } + + [JsonPropertyName("args")] + public IReadOnlyList Args { get; init; } = Array.Empty(); + + // 신규 + [JsonPropertyName("type")] + public McpTransport Transport { get; init; } = McpTransport.Stdio; + + [JsonPropertyName("url")] + public string? Url { get; init; } // HTTP/SSE 전용 + + [JsonPropertyName("headers")] + public Dictionary Headers { get; init; } = new(); + // $VAR 환경변수 치환 지원 +} + +// McpClientService 에 HTTP/SSE 클라이언트 추가 +public class McpClientService +{ + // 기존: stdio 클라이언트 + + // 신규: HTTP 전송 클라이언트 + private async Task SendHttpAsync(McpServerConfig config, McpRequest req, CancellationToken ct) + { + // headers의 $VAR → 환경변수 치환 + // POST {config.Url} + Authorization 헤더 + } + + // 신규: SSE 전송 클라이언트 + private async Task SubscribeSseAsync(McpServerConfig config, McpRequest req, CancellationToken ct) + { + // Server-Sent Events 수신 + } +} +``` + +--- + +## Phase 17-G — 멀티파일 Diff + 자동 컨텍스트 수집 (v1.8.0) + +### 17-G-1: 멀티파일 통합 Diff 뷰 + +```csharp +// 기존 DiffPanel 확장 +public class MultiFileDiffViewModel : ViewModelBase +{ + public ObservableCollection FileDiffs { get; } + public int TotalChangedFiles => FileDiffs.Count; + public int TotalAddedLines { get; } + public int TotalRemovedLines { get; } + + // 전체 수락/거부 + public ICommand AcceptAllCommand { get; } + public ICommand RejectAllCommand { get; } + + // 파일별 수락/거부 + public ICommand AcceptFileCommand { get; } // param: FileDiffViewModel + public ICommand RejectFileCommand { get; } // param: FileDiffViewModel +} + +public class FileDiffViewModel : ViewModelBase +{ + public string FilePath { get; } + public ObservableCollection Hunks { get; } + public bool IsExpanded { get; set; } = true; // 파일별 접기/펼치기 + public DiffFileStatus Status { get; } // Modified | Added | Deleted | Renamed + + public ICommand AcceptCommand { get; } + public ICommand RejectCommand { get; } +} +``` + +**XAML 핵심:** +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### 17-G-2: 자동 컨텍스트 수집 + +```csharp +// 사용자 메시지에서 파일명 감지 → 자동 읽기 +public class AutoContextCollector +{ + private readonly IAgentTool _fileReadTool; + + // 패턴: "파일명.확장자", "`백틱경로`", "src/path/to/file" 형태 감지 + private static readonly Regex _filePatterns = new( + @"(?:^|\s)([A-Za-z가-힣_\-\.\/\\]+\.[a-zA-Z]{1,6})(?:\s|$)|`([^`]+)`", + RegexOptions.Multiline); + + public async Task> CollectAsync( + string userMessage, string projectRoot, CancellationToken ct) + { + var matches = _filePatterns.Matches(userMessage); + var results = new List(); + + foreach (Match m in matches) + { + var path = m.Groups[1].Value ?? m.Groups[2].Value; + var fullPath = Path.Combine(projectRoot, path); + if (File.Exists(fullPath)) + { + var content = await File.ReadAllTextAsync(fullPath, ct); + results.Add(new FileContext { Path = path, Content = content }); + } + } + return results; + } +} + +// 도구 위험도 정적 매핑 +public static class ToolRiskMapper +{ + public static ToolRisk GetRisk(string toolName) => toolName switch + { + "file_read" or "code_search" or "list_directory" => ToolRisk.Low, + "file_edit" or "script_create" or "git_commit" => ToolRisk.Medium, + "process" or "bash" or "file_delete" or "registry_write" => ToolRisk.High, + _ when toolName.StartsWith("mcp__") => ToolRisk.Medium, + _ => ToolRisk.Medium + }; +} + +public enum ToolRisk { Low, Medium, High } +``` + +--- + +## Phase 18-A — 멀티에이전트 팀 + Worktree 격리 (v2.0) + +> **목표**: 코디네이터 에이전트 모드·Worktree 격리·위임 도구·백그라운드 에이전트 + +### 18-A-1: 코디네이터 에이전트 + +```csharp +// 코디네이터 모드: 계획/라우팅 전담 +public interface IAgentCoordinator +{ + Task CreatePlanAsync(string userRequest, CancellationToken ct); + Task ExecutePlanAsync(CoordinatorPlan plan, IProgress progress, CancellationToken ct); +} + +public class CoordinatorAgent : IAgentCoordinator +{ + private readonly AgentLoopService _loop; + private readonly DelegateAgentTool _delegateTool; + + public async Task CreatePlanAsync(string userRequest, CancellationToken ct) + { + // 전용 시스템 프롬프트로 계획 생성 + // 출력: JSON 형태의 SubtaskList + // 각 서브태스크: agentType, description, dependencies[] + } + + public async Task ExecutePlanAsync(CoordinatorPlan plan, IProgress progress, CancellationToken ct) + { + // 의존성 없는 서브태스크 병렬 실행 + // 완료된 서브태스크 결과를 다음 서브태스크 컨텍스트에 주입 + // 최종 결과 병합 + } +} + +public record CoordinatorPlan +{ + public string OriginalRequest { get; init; } + public IReadOnlyList Tasks { get; init; } +} + +public record SubTask +{ + public string Id { get; init; } + public string AgentType { get; init; } // "code-reviewer", "researcher", "implementer" + public string Description { get; init; } + public IReadOnlyList Dependencies { get; init; } // 선행 SubTask Id 목록 + public SubTaskStatus Status { get; set; } // Pending | Running | Completed | Failed + public string? Result { get; set; } +} + +public enum SubTaskStatus { Pending, Running, Completed, Failed } +``` + +### 18-A-2: WorktreeManager + +```csharp +// git worktree 기반 격리 실행 환경 +public class WorktreeManager : IDisposable +{ + private readonly List _active = new(); + + // 새 worktree 생성 (임시 브랜치) + public async Task CreateAsync( + string repoRoot, + string branchName, + CancellationToken ct) + { + var worktreePath = Path.Combine(Path.GetTempPath(), "ax-worktree-" + Guid.NewGuid().ToString("N")[..8]); + // git worktree add -b + await RunGitAsync($"worktree add {worktreePath} -b {branchName}", repoRoot, ct); + var wt = new Worktree { Path = worktreePath, Branch = branchName, RepoRoot = repoRoot }; + _active.Add(wt); + return wt; + } + + // 변경 사항 병합 (승인 시) + public async Task MergeAsync(Worktree worktree, string targetBranch, CancellationToken ct) + { + await RunGitAsync($"merge {worktree.Branch}", worktree.RepoRoot, ct); + } + + // worktree 제거 (거부 시) + public async Task DisposeAsync(Worktree worktree, bool keepBranch = false, CancellationToken ct = default) + { + await RunGitAsync($"worktree remove {worktree.Path} --force", worktree.RepoRoot, ct); + if (!keepBranch) + await RunGitAsync($"branch -D {worktree.Branch}", worktree.RepoRoot, ct); + _active.Remove(worktree); + } + + private Task RunGitAsync(string args, string cwd, CancellationToken ct) { ... } + + public void Dispose() { /* 남은 worktree 정리 */ } +} + +public record Worktree +{ + public string Path { get; init; } + public string Branch { get; init; } + public string RepoRoot { get; init; } + public DateTime CreatedAt { get; init; } = DateTime.UtcNow; +} +``` + +### 18-A-3: DelegateAgentTool + +```csharp +// IAgentTool 구현: 전문 서브에이전트에 작업 위임 +public class DelegateAgentTool : IAgentTool +{ + public string Name => "delegate"; + public string Description => "전문 에이전트에 작업을 위임합니다"; + + public JsonObject Parameters => new() + { + ["type"] = "object", + ["properties"] = new JsonObject + { + ["agent_type"] = new JsonObject + { + ["type"] = "string", + ["enum"] = new JsonArray("researcher", "code-reviewer", "implementer", "security-auditor", "doc-writer"), + ["description"] = "위임할 에이전트 유형" + }, + ["task"] = new JsonObject + { + ["type"] = "string", + ["description"] = "에이전트에게 전달할 작업 설명" + }, + ["context"] = new JsonObject + { + ["type"] = "string", + ["description"] = "에이전트에게 전달할 추가 컨텍스트" + }, + ["isolation"] = new JsonObject + { + ["type"] = "string", + ["enum"] = new JsonArray("none", "worktree"), + ["description"] = "격리 수준: worktree → git worktree 격리" + } + }, + ["required"] = new JsonArray("agent_type", "task") + }; + + private readonly BackgroundAgentService _backgroundAgents; + private readonly WorktreeManager _worktreeManager; + private readonly AgentTypeMemoryRepository _agentMemory; + + public async Task ExecuteAsync(JsonObject args, CancellationToken ct) + { + var agentType = args["agent_type"]!.GetValue(); + var task = args["task"]!.GetValue(); + var context = args["context"]?.GetValue() ?? string.Empty; + var isolation = args["isolation"]?.GetValue() ?? "none"; + + // 에이전트 타입별 메모리 로드 + var memory = await _agentMemory.LoadMemoryAsync(agentType); + + // worktree 격리 필요 시 생성 + Worktree? worktree = null; + if (isolation == "worktree") + worktree = await _worktreeManager.CreateAsync( + GetCurrentRepoRoot(), $"ax-{agentType}-{DateTime.UtcNow:yyMMddHHmm}", ct); + + // 서브에이전트 실행 + var result = await _backgroundAgents.StartAsync(new AgentTask + { + AgentType = agentType, + Description = task, + Context = context + (memory != null ? $"\n\n## 이전 학습:\n{memory}" : string.Empty), + WorkingDirectory = worktree?.Path ?? GetCurrentDirectory() + }, ct); + + // 결과 크기 제한: 100,000자 + if (result.Length > 100_000) + result = result[..100_000] + "\n\n[결과가 100,000자를 초과하여 잘림]"; + + return ToolResult.Ok(result); + } +} +``` + +### 18-A-4: BackgroundAgentService + +```csharp +// 비동기 서브에이전트 실행 + 완료 알림 +public class BackgroundAgentService +{ + private readonly ConcurrentDictionary _running = new(); + + // 이벤트: 완료 시 발화 (트레이 알림 연결) + public event EventHandler? AgentCompleted; + + // 비동기 실행 시작 (즉시 반환, 완료 시 이벤트) + public async Task StartAsync(AgentTask task, CancellationToken ct) + { + var id = Guid.NewGuid().ToString("N")[..8]; + var bgTask = new BackgroundAgentTask { Id = id, Task = task, StartedAt = DateTime.UtcNow }; + _running[id] = bgTask; + + _ = Task.Run(async () => + { + try + { + // 격리된 AgentLoopService 인스턴스 생성 + var result = await RunSubAgentLoopAsync(task, ct); + bgTask.Result = result; + bgTask.Status = BackgroundAgentStatus.Completed; + AgentCompleted?.Invoke(this, new AgentCompletedEventArgs { Task = bgTask, Result = result }); + } + catch (Exception ex) + { + bgTask.Status = BackgroundAgentStatus.Failed; + bgTask.Error = ex.Message; + AgentCompleted?.Invoke(this, new AgentCompletedEventArgs { Task = bgTask, Error = ex.Message }); + } + finally { _running.TryRemove(id, out _); } + }, ct); + + return id; + } + + public IReadOnlyList GetActive() + => _running.Values.ToList(); +} + +// App.xaml.cs 에서 트레이 알림 연결 +// _backgroundAgents.AgentCompleted += (s, e) => +// _trayIcon.ShowBalloonTip(e.Task.AgentType + " 완료", e.Result?.Length > 100 ? e.Result[..100] + "..." : e.Result, ToolTipIcon.Info); +``` + +### 18-A-5: AgentTypeMemoryRepository + +```csharp +// 에이전트 타입별 영속 메모리 +// 저장: %APPDATA%\AxCopilot\agent-memory\\MEMORY.md +public class AgentTypeMemoryRepository +{ + private readonly string _baseDir; // %APPDATA%\AxCopilot\agent-memory\ + + public async Task LoadMemoryAsync(string agentType) + { + var path = GetPath(agentType); + return File.Exists(path) ? await File.ReadAllTextAsync(path) : null; + } + + public async Task SaveMemoryAsync(string agentType, string content) + { + Directory.CreateDirectory(Path.GetDirectoryName(GetPath(agentType))!); + await File.WriteAllTextAsync(GetPath(agentType), content); + } + + // 학습 내용 추가 (기존 내용 끝에 append) + public async Task AppendLearnAsync(string agentType, string learning) + { + var existing = await LoadMemoryAsync(agentType) ?? string.Empty; + var entry = $"\n- [{DateTime.Now:yyyy-MM-dd HH:mm}] {learning}"; + await SaveMemoryAsync(agentType, existing + entry); + } + + private string GetPath(string agentType) + => Path.Combine(_baseDir, agentType, "MEMORY.md"); +} +``` + +### 18-A-6: 코디네이터 모드 UI + +```csharp +// AgentSessionHeaderViewModel 에 추가 +public bool IsCoordinatorMode { get; set; } +public ICommand ToggleCoordinatorModeCommand { get; } + +// AgentSessionHeaderBar.xaml 에 추가: +// [코디네이터 모드 토글 버튼] — 활성 시 AccentColor로 강조 +// 코디네이터 모드 ON 시: 서브태스크 진행 패널 표시 + +// CoordinatorPlanViewModel: SubTask 목록 + 진행 상태 표시 +public class CoordinatorPlanViewModel : ViewModelBase +{ + public ObservableCollection Tasks { get; } + public int CompletedCount { get; } + public int TotalCount { get; } + public double Progress => TotalCount > 0 ? (double)CompletedCount / TotalCount : 0; +} +``` + +--- + +## Phase 18-B — 에이전트 리플레이/디버깅 (v2.0) + +> **목표**: Phase 17-B의 이벤트 로그를 활용한 세션 재생 및 분기 재실행 + +```csharp +// 세션 리플레이 서비스 +public class AgentReplayService +{ + private readonly AgentEventLog _eventLog; + private readonly AgentLoopService _agentLoop; + + // 특정 시점까지 이벤트 재생 + public async Task ReplayToAsync(string sessionId, long upToSeqNo, CancellationToken ct) + { + await foreach (var evt in _eventLog.ReadFromAsync(0).WithCancellation(ct)) + { + if (evt.SeqNo > upToSeqNo) break; + await ApplyEventAsync(evt); + } + } + + // 특정 시점에서 분기 (새 세션 생성) + public async Task ForkFromAsync(string sessionId, long forkAtSeqNo, CancellationToken ct) + { + var newSessionId = Guid.NewGuid().ToString("N"); + await ReplayToAsync(sessionId, forkAtSeqNo, ct); + // 새 세션 ID로 계속 + return newSessionId; + } + + // ViewModel: 타임라인 UI + // WorkflowAnalyzerViewModel 에 리플레이 타임라인 패널 추가 +} + +public class ReplayTimelineViewModel : ViewModelBase +{ + public ObservableCollection Events { get; } + public long CurrentPosition { get; set; } + public ICommand SeekToCommand { get; } // param: long seqNo + public ICommand ForkFromCommand { get; } // param: long seqNo + public ICommand PlayPauseCommand { get; } +} +``` + +--- + +## Phase 18-C — 플러그인 갤러리 + 생태계 확장 (v2.0) + +### 18-C-1: 플러그인 갤러리 + +```csharp +// 플러그인 매니페스트 +public record PluginManifest +{ + [JsonPropertyName("id")] + public string Id { get; init; } + + [JsonPropertyName("name")] + public string Name { get; init; } + + [JsonPropertyName("version")] + public string Version { get; init; } + + [JsonPropertyName("description")] + public string Description { get; init; } + + [JsonPropertyName("type")] + public PluginType Type { get; init; } // Skill | Tool | Theme + + [JsonPropertyName("entry")] + public string EntryFile { get; init; } // zip 내부 진입점 파일 + + [JsonPropertyName("min_app_version")] + public string MinAppVersion { get; init; } +} + +// 플러그인 설치 서비스 +public class PluginInstallService +{ + // zip 파일에서 설치 + public async Task InstallFromZipAsync(string zipPath, CancellationToken ct) + { + // 1. zip 압축 해제 → 임시 디렉토리 + // 2. manifest.json 파싱·검증 + // 3. %APPDATA%\AxCopilot\plugins\\ 에 복사 + // 4. 플러그인 타입에 따라 등록: + // - Skill → SkillLoaderService.Reload() + // - Tool → ToolRegistry.Register() + } + + // 로컬 레지스트리 갱신 (NAS/Git 기반) + public async Task RefreshRegistryAsync(string registryPath, CancellationToken ct) { ... } + + // 설치된 플러그인 목록 + public IReadOnlyList GetInstalled() { ... } + + // 플러그인 제거 + public Task UninstallAsync(string pluginId, CancellationToken ct) { ... } +} +``` + +--- + +## Phase L3 — 런처 에코시스템 (v2.0) + +| # | 기능 | 연결 Phase | 핵심 클래스 | +|---|------|-----------|-----------| +| L3-1 | 플러그인 갤러리 | 18-C1 | `PluginGalleryViewModel`, `PluginInstallService` | +| L3-2 | 웹 검색 AI 요약 | 18-C5 | `WebSearchSummaryHandler`, `ContentExtractor` | +| L3-3 | AI 스니펫 | 18-C2 | `AiSnippetHandler`, `SnippetTemplateService` | +| L3-4 | 파라미터 퀵링크 | 18-C3 | `QuickLinkHandler`, `UrlTemplateEngine` | +| L3-7 | 알림 센터 통합 | 18-A4 | `NotificationCenterService` (Windows Toast API) | + +--- + +## 구현 의존성 그래프 + +``` +Phase 17 구현 순서: + +[17-UI-1~4] AgentWindow 골격 + ViewModel + ↓ +[17-UI-5~6] Sidebar + InlineSettings (SettingsWindow 이전) + ↓ +[17-B-1~2] TaskState + EventLog (인프라 먼저) + ↓ +[17-C-1~5] Hook 이벤트/타입 확장 (TaskState 이용) + ↓ +[17-D-1~5] Skill fork/paths (Hook 인프라 이용) + ↓ +[17-E-1~4] @include + 경로 규칙 (Skill 시스템과 병렬) + ↓ +[17-F-1~5] Permission Chain + acceptEdits + ↓ +[17-A-1~4] Reflexion (모든 인프라 완성 후) + ↓ +[17-G-1~2] MultiFileDiff + AutoContext (독립, 병렬 가능) + +Phase 18 구현 순서: + +[18-A-2] WorktreeManager (git 인프라) + ↓ +[18-A-4] BackgroundAgentService + ↓ +[18-A-3] DelegateAgentTool (WorktreeManager + BackgroundAgent 이용) + ↓ +[18-A-1] CoordinatorAgent (DelegateTool 이용) + ↓ +[18-A-5] AgentTypeMemoryRepository + ↓ +[18-B] ReplayService (EventLog Phase 17-B 이용) + ↓ +[18-C] 플러그인 갤러리 (독립) +``` + +--- + +## 버전별 출시 계획 + +| 버전 | 코드명 | 포함 Phase | 핵심 신규 클래스 수 | +|------|--------|-----------|-----------------| +| **v1.8.0** | 에이전트 인프라 | 17-UI, 17-A~G | ~35개 신규 클래스 ✅ 완료 | +| **v1.8.1** | 인프라 안정화 | 버그픽스 + 17-* 마이너 | — | +| **v2.0** | 에이전트 팀 | 18-A~C, L3 | ~25개 신규 클래스 ✅ 완료 | +| **v2.1** | CC 동등성 | 19-A~G (Claude Code 갭 해소) | ~30개 신규 클래스 | +| **v2.2** | SDK 프로토콜 | 20-A~C (임베딩 + 외부 연동) | ~15개 신규 클래스 | +| **v2.3** | AX Agent UI 전면 개편 | 21 (Claude.ai+Codex 레이아웃) | UI 계층 60% 재작성 | +| **v3.0** | 크로스플랫폼 | LP-1~3 (Avalonia) | UI 계층 40% 재작성 | + +--- + +## Phase 19 — Claude Code 동등성 달성 (v2.1) + +> **목표**: `docs/claude-code-docs-main/` 문서 분석 결과 발견된 AX Agent 갭을 해소하여 Claude Code 수준의 에이전트 인프라를 달성한다. + +### 갭 분석 요약 + +| 기능 영역 | Claude Code | AX Agent 현황 | 우선순위 Phase | +|----------|------------|--------------|--------------| +| 계층형 메모리 (4층) | 시스템/유저/프로젝트/로컬 + @include | AX.md 단일 파일 | 19-A | +| 권한 패턴 매칭 | `git *`, `npm run *` 패턴 + 복합 명령 분해 | 경로 기반 Allow/Deny만 | 19-B | +| 훅 이벤트 완성 | 14+ 이벤트, Shell/HTTP/LLM/Agent 타입 | 일부 이벤트, Shell 위주 | 19-C | +| 스킬 인라인 실행 | `!``cmd`` ` 실행 치환, 유저급 스킬, 네임스페이스 | 프리셋 파일 치환 없음 | 19-D | +| 세션 재개/포크 | `--resume`, `forkSession()`, 태깅 | JSONL 리플레이만 | 19-E | +| 출력 예산 관리 | `maxResultSizeChars`, 임시파일 스필오버 | 고정 8000자 절단 | 19-F | +| /init 명령 | 프로젝트 분석 → AX.md 자동 생성 | 없음 | 19-G | + +--- + +## Phase 19-A — 계층형 메모리 시스템 (v2.1) + +> **목표**: AX.md 단일 파일 → 4계층 캐스케이드 메모리 시스템. 경로 기반 규칙 파일 지원. + +### 4계층 메모리 아키텍처 + +| 계층 | 경로 | 범위 | 우선순위 | +|------|------|------|---------| +| L1 시스템 | `%APPDATA%\AxCopilot\system.md` | 앱 전역 관리자 규칙 | 최하위 | +| L2 유저 | `%USERPROFILE%\.axcopilot\AX.md` | 유저 전체 선호 | ↑ | +| L3 프로젝트 | `\AX.md` + `\.axcopilot\rules\*.md` | 팀 공유 규칙 | ↑ | +| L4 로컬 | `\AX.local.md` | 개인 프로젝트 오버라이드 (gitignore) | 최상위 | + +### 핵심 클래스 + +```csharp +// HierarchicalMemoryLoader.cs +public class HierarchicalMemoryLoader +{ + /// CWD에서 루트까지 탐색하며 계층별 메모리 파일 수집. + public async Task LoadAsync(string workFolder, CancellationToken ct) + { + var layers = new List(); + layers.Add(await LoadSystemLayerAsync(ct)); // L1 + layers.Add(await LoadUserLayerAsync(ct)); // L2 + layers.AddRange(await LoadProjectLayersAsync(workFolder, ct)); // L3 (CWD→루트) + layers.Add(await LoadLocalLayerAsync(workFolder, ct)); // L4 + return new MemoryContext(layers); + } + + /// @include 지시문 처리 (최대 5단계 중첩, 순환 참조 감지). + private async Task ResolveIncludesAsync(string content, string basePath, + HashSet visited, int depth, CancellationToken ct) { ... } +} + +// PathScopedRuleLoader.cs — .axcopilot/rules/*.md 파일 로드 +public class PathScopedRuleLoader +{ + /// 현재 편집 파일 경로와 rules/*.md의 paths 패턴을 매칭하여 주입할 규칙 반환. + public IReadOnlyList GetApplicableRules(string editingFilePath, + IReadOnlyList ruleFiles) { ... } +} + +// MemoryContext.cs +public record MemoryLayer(string Source, string Content, MemoryScope Scope); +public enum MemoryScope { System, User, Project, Local } +public record MemoryContext(IReadOnlyList Layers) +{ + /// 모든 레이어를 우선순위 순서로 조합한 최종 컨텍스트 문자열. + public string Compose() => string.Join("\n\n", Layers.Select(l => l.Content)); +} +``` + +### AgentLoopService 통합 + +```csharp +// AgentLoopService.cs — 컨텍스트 조립 부분 교체 +private async Task BuildSystemContextAsync(CancellationToken ct) +{ + // 기존: 단일 AX.md 로드 + // 변경: 계층형 로더 사용 + var memCtx = await _memoryLoader.LoadAsync(_workFolder, ct); + var pathRules = _ruleScopeLoader.GetApplicableRules(_currentEditingFile, _cachedRules); + return memCtx.Compose() + "\n\n" + string.Join("\n\n", pathRules); +} +``` + +### 슬래시 명령 추가 + +```csharp +// /memory 슬래시 명령 → ChatWindow에서 메모리 파일 인라인 에디터 열기 +// 현재 로드된 모든 메모리 레이어 표시 + 편집 버튼 +public class MemorySlashCommand : ISlashCommand +{ + public string Name => "memory"; + public string Description => "로드된 메모리 파일 목록 및 편집"; + public Task ExecuteAsync(string args, IChatContext ctx); +} +``` + +### 설정 항목 + +```csharp +// AppSettings.LlmSettings +public bool EnableHierarchicalMemory { get; set; } = true; +public string UserMemoryPath { get; set; } = ""; // 기본: %USERPROFILE%\.axcopilot\AX.md +public int MaxIncludeDepth { get; set; } = 5; +``` + +--- + +## Phase 19-B — 권한 패턴 매칭 + 복합 명령 분해 (v2.1) + +> **목표**: 현재 경로 기반 Allow/Deny → 명령 패턴 매칭 + `&&`/`||`/`;`/`|` 복합 명령 서브 커맨드별 검증. + +### 핵심 클래스 + +```csharp +// CommandPatternMatcher.cs +public class CommandPatternMatcher +{ + /// 패턴(glob) 기반 명령 허용 여부 검사. + /// 예: "git *" → git commit, git push 모두 허용 + /// "npm run *" → npm run build, npm run test 허용 + /// "rm -rf *" → 금지 리스트에 명시 가능 + public PermissionDecision Match(string command, IReadOnlyList rules) { ... } +} + +// CompoundCommandParser.cs +public class CompoundCommandParser +{ + private static readonly string[] Operators = ["&&", "||", ";", "|"]; + + /// 복합 명령을 분해하여 서브 커맨드 목록 반환. + /// 예: "git add . && git commit -m 'msg'" → ["git add .", "git commit -m 'msg'"] + public IReadOnlyList Parse(string command) { ... } + + /// 복합 명령의 모든 서브 커맨드에 대해 권한 검사. + /// 하나라도 Deny이면 전체 Deny. + public PermissionDecision CheckAll(string compoundCommand, + CommandPatternMatcher matcher, + IReadOnlyList rules) { ... } +} + +// 항상 차단되는 명령 목록 (하드코딩) +public static class AlwaysBlockedCommands +{ + public static readonly string[] Patterns = + [ + "rd /s", "rmdir /s", // 재귀 폴더 삭제 + "format *", // 드라이브 포맷 + "reg delete *", // 레지스트리 삭제 + "del /f /s /q *", // 강제 재귀 파일 삭제 + "netsh * delete *", // 방화벽 규칙 삭제 + "schtasks /delete *", // 작업 스케줄러 삭제 + ]; +} +``` + +### PermissionRuleEntry 확장 + +```csharp +// 기존 PermissionRuleEntry에 패턴 지원 추가 +public class PermissionRuleEntry +{ + [JsonPropertyName("tool")] + public string Tool { get; set; } = ""; // 도구명 또는 "bash:*" + + [JsonPropertyName("pattern")] + public string Pattern { get; set; } = "*"; // glob 패턴 (bash 명령에만 적용) + + [JsonPropertyName("decision")] + public string Decision { get; set; } = "allow"; // "allow" | "deny" + + [JsonPropertyName("reason")] + public string Reason { get; set; } = ""; // 사용자 표시 이유 +} +``` + +### 도구 가시성 필터링 + +```csharp +// AgentLoopService — LLM 호출 전 비활성 도구를 tools 목록에서 제거 +// 현재: 도구 이름은 넘기되 실행 시 차단 +// 개선: 아예 스키마 자체를 LLM에 전달하지 않음 → 환각 방지 +private IReadOnlyList FilterVisibleTools(IReadOnlyList allTools) +{ + return allTools.Where(t => + !_settings.DisabledTools.Contains(t.Name) && + _permissionSystem.IsToolVisible(t.Name)).ToList(); +} +``` + +--- + +## Phase 19-C — 훅 이벤트 완성 (v2.1) + +> **목표**: 현재 부분 구현된 훅 시스템 → Claude Code의 14+ 이벤트 + 4가지 훅 타입 완성. + +### 추가 훅 이벤트 + +```csharp +// HookTypes.cs 확장 +public enum AgentHookEvent +{ + // 기존 + PreToolUse, PostToolUse, Stop, SessionStart, SessionEnd, + UserPromptSubmit, PreCompact, PostCompact, + + // 신규 추가 + PostToolUseFailure, // 도구 실행 실패 시 + SubAgentStart, // 서브에이전트 시작 + SubAgentStop, // 서브에이전트 완료 + PermissionRequest, // 승인 다이얼로그 직전 + PermissionDenied, // 거부 후 + Notification, // UI 알림 발생 시 + CwdChanged, // 작업 폴더 변경 시 + FileChanged, // 감시 파일 변경 시 + ConfigChange, // 설정 파일 변경 시 +} +``` + +### 훅 타입 완성 (4종) + +```csharp +// ExtendedHookRunner.cs 확장 +public enum HookCommandType { Shell, Http, Llm, Agent } + +public class HookEntry +{ + public AgentHookEvent Event { get; set; } + public string? Matcher { get; set; } // tool_name 또는 notification_type 패턴 + public HookCommandType Type { get; set; } = HookCommandType.Shell; + + // Shell 훅 + public string? Command { get; set; } + public int Timeout { get; set; } = 30; + public bool Async { get; set; } = false; + public bool AsyncRewake { get; set; } = false; // 완료 시 에이전트 재개 + + // HTTP 훅 + public string? Url { get; set; } + public Dictionary Headers { get; set; } = new(); + + // LLM 훅 (검증용 Claude 호출) + public string? LlmPrompt { get; set; } + public string? LlmModel { get; set; } + + // Agent 훅 (풀 에이전트 루프) + public string? AgentPrompt { get; set; } + public string[]? AgentTools { get; set; } +} + +// Exit code semantics +// 0 = 성공, 계속 +// 2 = 차단/주입 (stderr → Claude에게 전달, 동작 차단 또는 루프 계속) +// 기타 = stderr → 사용자에만 표시, 계속 + +// $AX_ENV_FILE: CwdChanged 훅에서 환경변수 주입 +// 예: echo "AX_PROJECT_TYPE=rust" >> $AX_ENV_FILE +``` + +### PreToolUse 입력 수정 기능 + +```csharp +// 훅이 도구 입력을 수정할 수 있도록 허용 +public record HookResult +{ + public bool Continue { get; init; } = true; + public string? Reason { get; init; } + public string? SystemMessage { get; init; } + public JsonElement? UpdatedInput { get; init; } // PreToolUse에서 도구 파라미터 수정 + public bool SuppressOutput { get; init; } = false; +} +``` + +--- + +## Phase 19-D — 스킬 시스템 완성 (v2.1) + +> **목표**: 스킬 파일의 `!``cmd`` ` 인라인 실행, 유저급 스킬, 네임스페이스, 스킬별 모델 오버라이드 완성. + +### 스킬 인라인 명령 실행 + +```csharp +// SkillService.cs 확장 +// 스킬 파일 내 !`command` 블록을 호출 시점에 실행하고 출력으로 치환 + +public class SkillInlineCommandProcessor +{ + private static readonly Regex InlineCmd = new(@"!\`([^`]+)\`", RegexOptions.Compiled); + + /// 스킬 본문의 !`cmd` 블록을 실행하고 결과로 치환합니다. + /// 예: !`git log --oneline -10` → 최근 10개 커밋 목록으로 치환 + public async Task ProcessAsync(string skillContent, string workFolder, + CancellationToken ct) + { + foreach (Match m in InlineCmd.Matches(skillContent)) + { + var cmd = m.Groups[1].Value; + var output = await ExecuteCommandAsync(cmd, workFolder, ct); + skillContent = skillContent.Replace(m.Value, output); + } + return skillContent; + } +} +``` + +### 스킬 프론트매터 확장 + +```yaml +--- +description: 한 줄 설명 (/skills 목록에 표시) +argument-hint: "[파일명] [옵션]" # 자동완성 힌트 +allowed-tools: [file_read, grep] # 허용 도구 제한 +model: claude-haiku-4-5-20251001 # 스킬별 모델 오버라이드 +user-invocable: false # /skills 목록 숨김 (Claude만 사용) +context: fork # 격리 서브에이전트로 실행 +paths: "**/*.cs" # 이 파일 편집 시 자동 활성화 +hooks: # 스킬 전용 훅 + PostToolUse: + - command: "dotnet build" +--- +``` + +### 유저급 스킬 경로 + +``` +%USERPROFILE%\.axcopilot\skills\\SKILL.md # 유저 전역 +\.axcopilot\skills\\SKILL.md # 프로젝트 +\.axcopilot\skills\\\SKILL.md # 네임스페이스 (/:) +``` + +### 스킬 네임스페이스 + +```csharp +// /database:migrate → .axcopilot/skills/database/migrate/SKILL.md +// /test:unit → .axcopilot/skills/test/unit/SKILL.md +public class SkillNamespaceResolver +{ + public string? ResolveFilePath(string slashCommand, string workFolder) { ... } + // "database:migrate" → "/.axcopilot/skills/database/migrate/SKILL.md" +} +``` + +--- + +## Phase 19-E — 세션 재개 + 포크 + 태깅 (v2.1) + +> **목표**: JSONL 리플레이(관찰용) → 실제 세션 재개 + 분기 지점 포크. + +### 세션 관리 API + +```csharp +// AgentSessionManager.cs +public class AgentSessionManager +{ + /// 이전 세션을 재개합니다. + /// 메모리 파일은 재개 시점 기준으로 재발견합니다. + public Task ResumeAsync(string sessionId, CancellationToken ct) { ... } + + /// 현재 세션의 특정 메시지 인덱스 이후를 분기합니다. + /// 원본 세션은 보존됩니다. + public Task ForkAsync(string sessionId, int messageIndex, CancellationToken ct) { ... } + + /// 세션에 태그를 붙입니다 (즐겨찾기, 분류 등). + public Task TagAsync(string sessionId, string tag, CancellationToken ct) { ... } + + /// 세션 이름을 변경합니다. + public Task RenameAsync(string sessionId, string newName, CancellationToken ct) { ... } + + /// 조건에 맞는 세션 목록 반환. + public Task> ListAsync( + string? tag = null, string? tabType = null, CancellationToken ct = default) { ... } +} + +public record AgentSession(string Id, string Name, string TabType, List Messages); +public record AgentSessionMeta(string Id, string Name, string TabType, + DateTime CreatedAt, DateTime LastAt, string? Tag, int MessageCount); +``` + +### 에이전트 타입별 영속 메모리 경로 + +``` +%USERPROFILE%\.axcopilot\agent-memory\\MEMORY.md # 유저 범위 +\.axcopilot\agent-memory\\MEMORY.md # 프로젝트 범위 +\.axcopilot\agent-memory-local\\MEMORY.md # 로컬 범위 +``` + +```csharp +// AgentTypeMemoryRepository.cs 확장 +public class AgentTypeMemoryRepository +{ + public enum MemoryScope { User, Project, Local } + + public async Task GetAsync(string agentType, string workFolder, + MemoryScope scope = MemoryScope.Project, CancellationToken ct = default) { ... } + + public async Task SaveAsync(string agentType, string workFolder, + string content, MemoryScope scope = MemoryScope.Project, + CancellationToken ct = default) { ... } +} +``` + +--- + +## Phase 19-F — 출력 예산 + 컨텍스트 최적화 (v2.1) + +> **목표**: 고정 8000자 절단 → 도구별 출력 예산 + 대형 출력 임시파일 스필오버. 컨텍스트 조립 메모이제이션. + +### 출력 예산 관리 + +```csharp +// ToolOutputBudget.cs +public static class ToolOutputBudget +{ + // 도구별 기본 최대 출력 크기 + private static readonly Dictionary DefaultBudgets = new() + { + ["file_read"] = 12_000, + ["grep"] = 8_000, + ["bash"] = 10_000, + ["git_tool"] = 6_000, + ["http_tool"] = 8_000, + ["directory_list"] = 4_000, + ["multi_read"] = 20_000, + // 기타 도구: 기본 6000자 + }; + + public static int GetBudget(string toolName) + => DefaultBudgets.GetValueOrDefault(toolName, 6_000); +} + +// ToolOutputSpillover.cs +public class ToolOutputSpillover +{ + private readonly string _tempDir = Path.Combine(Path.GetTempPath(), "AxCopilot", "spill"); + + /// 출력이 예산 초과 시 임시파일에 저장하고 경로+미리보기 반환. + public async Task ProcessAsync(string toolName, string output, CancellationToken ct) + { + var budget = ToolOutputBudget.GetBudget(toolName); + if (output.Length <= budget) return output; + + var path = Path.Combine(_tempDir, $"{Guid.NewGuid():N}.txt"); + Directory.CreateDirectory(_tempDir); + await File.WriteAllTextAsync(path, output, ct); + + var preview = output[..Math.Min(500, output.Length)]; + return $"[출력이 {output.Length:N0}자로 예산({budget:N0}자)을 초과하여 임시파일에 저장됨]\n" + + $"파일 경로: {path}\n미리보기:\n{preview}\n..."; + } +} +``` + +### 컨텍스트 조립 메모이제이션 + +```csharp +// ContextAssemblyCache.cs +public class ContextAssemblyCache +{ + private string? _cachedGitState; + private DateTime _gitStateCachedAt; + private MemoryContext? _cachedMemory; + private string? _cachedWorkFolder; + + /// 세션 내 git 상태는 5분 캐시. + public async Task GetGitStateAsync(string workFolder, CancellationToken ct) { ... } + + /// 메모리 파일은 세션 시작 시 한 번만 로드 (변경 감지 시 갱신). + public async Task GetMemoryContextAsync(string workFolder, CancellationToken ct) { ... } + + /// 파일 변경 감지 시 캐시 무효화. + public void Invalidate() { _cachedMemory = null; _cachedGitState = null; } +} +``` + +--- + +## Phase 19-G — /init 슬래시 명령 (v2.1) + +> **목표**: 프로젝트 분석 → AX.md 자동 생성 + 스킬/훅 초기 설정 제안. + +### 핵심 클래스 + +```csharp +// ProjectInitAnalyzer.cs +public class ProjectInitAnalyzer +{ + /// + /// 프로젝트 구조를 분석하여 AX.md 초안을 생성합니다. + /// - 언어/프레임워크 탐지 (*.csproj, package.json, Cargo.toml 등) + /// - 테스트 프레임워크 탐지 + /// - CI/CD 설정 탐지 (.github/workflows 등) + /// - 디렉터리 구조 요약 + /// - 기존 README.md 요약 (LLM 호출) + /// + public async Task AnalyzeAsync(string workFolder, CancellationToken ct) { ... } + + /// 분석 결과를 바탕으로 AX.md 초안 생성. + public async Task GenerateAxMdAsync(ProjectAnalysis analysis, + LlmService llm, CancellationToken ct) { ... } +} + +public record ProjectAnalysis( + string Language, + string Framework, + string? TestFramework, + string? CiSystem, + IReadOnlyList KeyDirectories, + string? ReadmeSummary); + +// /init 슬래시 명령 +public class InitSlashCommand : ISlashCommand +{ + public string Name => "init"; + public string Description => "프로젝트를 분석하여 AX.md를 생성합니다"; + public async Task ExecuteAsync(string args, IChatContext ctx) + { + // 1. 분석 실행 + 진행 상황 스트리밍 + // 2. 생성된 AX.md 미리보기 표시 + // 3. 사용자 확인 후 파일 저장 + // 4. 필요 시 추천 스킬 제안 + } +} +``` + +### 지원 언어/프레임워크 탐지 + +| 탐지 파일 | 언어 | 프레임워크 | +|----------|------|----------| +| `*.csproj`, `*.sln` | C# | .NET, ASP.NET, WPF | +| `package.json` | JavaScript/TypeScript | React, Vue, Next.js | +| `Cargo.toml` | Rust | — | +| `pyproject.toml`, `requirements.txt` | Python | Django, FastAPI, Flask | +| `pom.xml`, `build.gradle` | Java/Kotlin | Spring | +| `go.mod` | Go | — | + +--- + +## Phase 20 — SDK 제어 프로토콜 (v2.2) + +> **목표**: AX Agent를 외부 툴/스크립트에서 임베드 가능한 JSON 스트리밍 프로토콜로 노출. + +| # | 기능 | 핵심 클래스 | +|---|------|-----------| +| 20-A | 양방향 JSON 스트리밍 서버 | `AgentSdkServer`, `SdkControlRequest`, `SdkMessage` | +| 20-B | 커스텀 에이전트 정의 (세션별) | `CustomAgentDefinition`, `AgentTypeRegistry` | +| 20-C | SDK 훅 콜백 (외부 권한 처리) | `SdkHookCallbackHandler`, `SdkPermissionDelegate` | + +```csharp +// SdkControlRequest 타입 +public enum SdkControlRequestType +{ + Initialize, // 세션 설정, 커스텀 에이전트 정의, 훅 등록 + SetPermissionMode, // 권한 모드 변경 + SetModel, // 모델 전환 + Interrupt, // 현재 턴 취소 + CanUseTool, // 권한 처리기 응답 + GetContextUsage, // 컨텍스트 사용량 조회 + RewindFiles, // 메시지 이후 파일 변경 되돌리기 + HookCallback, // SDK측 훅 이벤트 전달 +} + +// SdkMessage (스트리밍 출력) +public enum SdkMessageType +{ + AssistantToken, // 스트리밍 텍스트 + ToolProgress, // 도구 실행 진행 + ToolResult, // 도구 결과 + SessionResult, // 최종 결과 + HookEvent, // 훅 이벤트 (SDK 처리 요청) + Notification, // 알림 +} +``` + +--- + +## Phase 21 — AX Agent UI 전면 개편 (v2.3) + +> **목표**: CLAUDE.md Section 13에 명시된 Claude.ai + Codex 스타일 레이아웃 전면 구현. + +| # | 기능 | 핵심 컴포넌트 | +|---|------|------------| +| 21-1 | 3-Pane 레이아웃 골격 | `ChatWindow.xaml` 리팩터링 | +| 21-2 | 좌측 사이드바 | `AgentSidebarView` (탭 세그먼트 + 프리셋 + 이력) | +| 21-3 | 세션 헤더 바 | `AgentSessionHeaderBar` (모델/Plan/권한/도구 칩) | +| 21-4 | 우측 설정 패널 | `AgentSettingsPanel` (SettingsWindow AX Agent 탭 완전 대체) | +| 21-5 | 고도화 입력 영역 | `AgentInputArea` (@멘션, /스킬, 하단 칩 열) | +| 21-6 | 메시지 버블 개선 | Claude.ai 스타일 (AI=배경 없음, 도구블록=접히는 Border) | +| 21-7 | SettingsWindow 정리 | AX Agent 탭 제거, 전역 설정만 유지 | + +--- + +## Phase 22 — 슬래시 명령 체계 완성 (v2.1) ✅ 완료 + +> **목표**: Claude Code의 16종 슬래시 명령을 AX Agent에 구현. `/init`(19-G)을 제외한 15종 명령 추가. +> 기존 스킬 기반 `/` 호출과 공존하되, 내장 명령은 스킬보다 우선 처리. +> +> **구현 완료** (2026-04-03): ISlashCommand 인터페이스, SlashCommandRegistry, InputRouter, 13종 명령 (/compact, /clear, /memory, /model, /plan, /commit, /review, /mcp, /permissions, /hooks, /config, /skills, /help) + SlashAutoCompleteProvider. + +### 22-1: ISlashCommand 인터페이스 + 레지스트리 + +```csharp +// 슬래시 명령 인터페이스 (Command 패턴) +public interface ISlashCommand +{ + string Name { get; } // "compact", "memory" 등 + string[] Aliases { get; } // "/settings" → "/config" 별칭 + string Description { get; } + string? ArgumentHint { get; } // 자동완성 힌트 + bool RequiresActiveSession { get; } // 세션 없이도 사용 가능 여부 + + Task ExecuteAsync(string arguments, IAgentChatContext context, CancellationToken ct); +} + +// 채팅 컨텍스트 인터페이스 (DIP: 명령이 UI에 직접 의존하지 않음) +public interface IAgentChatContext +{ + AgentLoopService AgentLoop { get; } + SettingsService Settings { get; } + SkillLoaderService SkillLoader { get; } + HookRunnerService HookRunner { get; } + McpManagerService McpManager { get; } + AgentSessionRepository SessionRepo { get; } + LlmService Llm { get; } + string ActiveTab { get; } // "Chat" | "Cowork" | "Code" + string WorkFolder { get; } + + // UI 상호작용 (ViewModel 위임) + Task SendSystemMessageAsync(string message); + Task PromptUserAsync(string question); // 사용자 입력 대기 + Task ShowToastAsync(string message); + void ClearMessages(); + void UpdateSessionHeader(); // 모델/모드 변경 시 헤더 갱신 +} + +// 슬래시 명령 레지스트리 (Factory + Registry) +public class SlashCommandRegistry +{ + private readonly Dictionary _commands = new(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary _aliases = new(StringComparer.OrdinalIgnoreCase); + + public void Register(ISlashCommand command) + { + _commands[command.Name] = command; + foreach (var alias in command.Aliases) + _aliases[alias] = command.Name; + } + + public ISlashCommand? Resolve(string input) + { + // "/compact focus on API changes" → name="compact", args="focus on API changes" + var name = input.Split(' ', 2)[0].TrimStart('/'); + if (_commands.TryGetValue(name, out var cmd)) return cmd; + if (_aliases.TryGetValue(name, out var canonical)) + return _commands.GetValueOrDefault(canonical); + return null; // null → 스킬 검색으로 폴백 + } + + public IReadOnlyList GetAll() => _commands.Values.ToList(); + + // 기본 명령 등록 + public static SlashCommandRegistry CreateDefault(IAgentChatContext ctx) + { + var reg = new SlashCommandRegistry(); + reg.Register(new CompactCommand()); + reg.Register(new ClearCommand()); + reg.Register(new MemoryCommand()); + reg.Register(new ConfigCommand()); + reg.Register(new HooksCommand()); + reg.Register(new McpCommand()); + reg.Register(new PermissionsCommand()); + reg.Register(new ModelCommand()); + reg.Register(new PlanCommand()); + reg.Register(new CommitCommand()); + reg.Register(new ReviewCommand()); + reg.Register(new SkillsCommand()); + reg.Register(new HelpCommand()); + reg.Register(new InitCommand()); // 19-G에서 구현 + return reg; + } +} +``` + +### 22-2: /compact — 컨텍스트 압축 + +```csharp +public class CompactCommand : ISlashCommand +{ + public string Name => "compact"; + public string[] Aliases => Array.Empty(); + public string Description => "대화 기록을 요약하여 컨텍스트 사용량을 줄입니다"; + public string? ArgumentHint => "[요약 지시사항]"; + public bool RequiresActiveSession => true; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + // 1. PreCompact 훅 실행 + var hookResult = await ctx.HookRunner.RunAsync(HookEvent.PreCompact, new HookContext + { + Event = HookEvent.PreCompact, + SessionId = ctx.AgentLoop.CurrentSessionId, + }, ct); + if (hookResult.AnyBlocked) + { + await ctx.SendSystemMessageAsync($"[컴팩션 차단됨] {hookResult.CombinedContext}"); + return; + } + + // 2. 현재 대화 메시지를 LLM에게 요약 요청 + var messages = ctx.AgentLoop.GetCurrentMessages(); + var summaryPrompt = string.IsNullOrEmpty(arguments) + ? "위 대화를 핵심 결정사항, 작업 파일, 남은 작업 중심으로 간결하게 요약하세요." + : $"위 대화를 다음 지시에 따라 요약하세요: {arguments}"; + + var summary = await ctx.Llm.GenerateAsync( + BuildCompactPrompt(messages, summaryPrompt), ct); + + // 3. TaskState 갱신 (Working Memory 보존) + if (ctx.AgentLoop.TaskState != null) + await ctx.AgentLoop.TaskState.UpdateContextSummaryAsync(summary); + + // 4. 메시지 목록을 요약 메시지 1개로 교체 + ctx.AgentLoop.ReplaceMessagesWithSummary(summary); + + // 5. PostCompact 훅 실행 + await ctx.HookRunner.RunAsync(HookEvent.PostCompact, new HookContext + { + Event = HookEvent.PostCompact, + }, ct); + + await ctx.SendSystemMessageAsync($"[컴팩션 완료] 대화가 요약되었습니다. 컨텍스트 사용량이 줄었습니다."); + } + + private string BuildCompactPrompt(IReadOnlyList messages, string instruction) + { + var sb = new StringBuilder(); + sb.AppendLine("# 대화 기록"); + foreach (var msg in messages) + sb.AppendLine($"[{msg.Role}] {msg.Content[..Math.Min(msg.Content.Length, 500)]}"); + sb.AppendLine(); + sb.AppendLine(instruction); + return sb.ToString(); + } +} +``` + +### 22-3: /clear — 대화 초기화 + +```csharp +public class ClearCommand : ISlashCommand +{ + public string Name => "clear"; + public string[] Aliases => new[] { "reset", "new" }; + public string Description => "대화 기록을 지우고 새 세션을 시작합니다"; + public string? ArgumentHint => null; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + // 1. 현재 세션 저장 + await ctx.SessionRepo.SaveAsync(ctx.AgentLoop.CurrentSession); + + // 2. UI 메시지 목록 초기화 + ctx.ClearMessages(); + + // 3. 새 세션 시작 + await ctx.AgentLoop.StartNewSessionAsync(ctx.ActiveTab, ct); + + // 4. SessionStart 훅 발화 (source: "clear") + await ctx.HookRunner.RunAsync(HookEvent.SessionStart, new HookContext + { + Event = HookEvent.SessionStart, + SessionId = ctx.AgentLoop.CurrentSessionId, + // source = "clear" + }, ct); + + await ctx.SendSystemMessageAsync("새 대화가 시작되었습니다."); + } +} +``` + +### 22-4: /memory — 메모리 파일 편집 + +```csharp +public class MemoryCommand : ISlashCommand +{ + public string Name => "memory"; + public string[] Aliases => Array.Empty(); + public string Description => "AX.md 메모리 파일을 편집합니다 (전역/프로젝트/로컬)"; + public string? ArgumentHint => "[global|project|local]"; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + // 범위 결정 + var scope = arguments.Trim().ToLowerInvariant() switch + { + "global" or "user" => MemoryScope.User, + "local" => MemoryScope.Local, + _ => MemoryScope.Project, // 기본값 + }; + + // 파일 경로 결정 + var path = scope switch + { + MemoryScope.User => Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), + ".axcopilot", "AX.md"), + MemoryScope.Local => Path.Combine(ctx.WorkFolder, "AX.local.md"), + _ => Path.Combine(ctx.WorkFolder, "AX.md"), + }; + + // 파일이 없으면 템플릿 생성 + if (!File.Exists(path)) + { + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + await File.WriteAllTextAsync(path, + $"# AX Copilot 프로젝트 메모리 ({scope})\n\n여기에 지시사항을 작성하세요.\n", ct); + } + + // 외부 에디터 열기 (기본 텍스트 에디터) + Process.Start(new ProcessStartInfo(path) { UseShellExecute = true }); + + await ctx.SendSystemMessageAsync( + $"메모리 파일을 열었습니다: `{path}`\n편집 후 저장하면 다음 세션부터 반영됩니다."); + } +} + +public enum MemoryScope { User, Project, Local } +``` + +### 22-5: /model — 세션 모델 전환 + +```csharp +public class ModelCommand : ISlashCommand +{ + public string Name => "model"; + public string[] Aliases => Array.Empty(); + public string Description => "현재 세션의 AI 모델을 변경합니다"; + public string? ArgumentHint => "[모델명]"; + public bool RequiresActiveSession => true; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(arguments)) + { + // 현재 모델 + 사용 가능한 모델 목록 표시 + var current = ctx.AgentLoop.CurrentModel; + var available = ctx.Settings.Settings.Llm.RegisteredModels + .Select(m => m.DisplayName).ToList(); + await ctx.SendSystemMessageAsync( + $"현재 모델: **{current}**\n사용 가능: {string.Join(", ", available)}"); + return; + } + + // 모델 변경 + var success = ctx.AgentLoop.TrySetModel(arguments.Trim()); + if (success) + { + ctx.UpdateSessionHeader(); + await ctx.SendSystemMessageAsync($"모델이 **{arguments.Trim()}**(으)로 변경되었습니다."); + } + else + { + await ctx.SendSystemMessageAsync($"모델 '{arguments.Trim()}'을(를) 찾을 수 없습니다."); + } + } +} +``` + +### 22-6: /plan — 플랜 모드 토글 + +```csharp +public class PlanCommand : ISlashCommand +{ + public string Name => "plan"; + public string[] Aliases => Array.Empty(); + public string Description => "플랜 모드를 토글하거나 계획을 생성합니다"; + public string? ArgumentHint => "[open|<계획 설명>]"; + public bool RequiresActiveSession => true; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var arg = arguments.Trim().ToLowerInvariant(); + + if (arg == "open") + { + // 현재 계획 표시 + var plan = ctx.AgentLoop.CurrentPlan; + if (plan == null) + await ctx.SendSystemMessageAsync("현재 활성 계획이 없습니다."); + else + await ctx.SendSystemMessageAsync($"## 현재 계획\n{plan}"); + return; + } + + if (string.IsNullOrEmpty(arg)) + { + // 플랜 모드 토글 + var newMode = ctx.AgentLoop.TogglePlanMode(); + ctx.UpdateSessionHeader(); + await ctx.SendSystemMessageAsync( + $"플랜 모드: **{newMode}** ({newMode switch { + PlanMode.Off => "변경 사항을 바로 실행합니다", + PlanMode.Always => "실행 전 항상 계획을 작성하고 승인을 기다립니다", + PlanMode.Auto => "복잡한 작업에만 자동으로 계획을 작성합니다", + _ => "" }})"); + return; + } + + // 주어진 설명으로 계획 생성 + await ctx.AgentLoop.CreatePlanAsync(arg, ct); + } +} +``` + +### 22-7: /commit — AI 커밋 메시지 + +```csharp +public class CommitCommand : ISlashCommand +{ + public string Name => "commit"; + public string[] Aliases => Array.Empty(); + public string Description => "AI가 생성한 메시지로 git 커밋을 만듭니다"; + public string? ArgumentHint => null; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + // 1. git status + git diff 확인 + var statusResult = await ProcessHelper.RunAsync("git", "status --porcelain", ctx.WorkFolder, ct); + if (string.IsNullOrWhiteSpace(statusResult.StdOut)) + { + await ctx.SendSystemMessageAsync("커밋할 변경 사항이 없습니다."); + return; + } + + var diffResult = await ProcessHelper.RunAsync("git", "diff --cached", ctx.WorkFolder, ct); + var diffAll = string.IsNullOrWhiteSpace(diffResult.StdOut) + ? (await ProcessHelper.RunAsync("git", "diff", ctx.WorkFolder, ct)).StdOut + : diffResult.StdOut; + + // 2. LLM에게 커밋 메시지 생성 요청 + var prompt = $""" + 아래 git diff를 분석하고 간결한 커밋 메시지를 작성하세요. + - 첫 줄: 50자 이내 제목 (무엇을 왜) + - 빈 줄 후 본문: 변경 이유와 영향 (선택) + - 비밀 파일(.env 등) 포함 여부 경고 + + ```diff + {diffAll[..Math.Min(diffAll.Length, 8000)]} + ``` + + git status: + {statusResult.StdOut} + """; + + var commitMsg = await ctx.Llm.GenerateAsync(prompt, ct); + + // 3. 사용자 확인 + await ctx.SendSystemMessageAsync($"## 제안된 커밋 메시지\n```\n{commitMsg}\n```\n\n이 메시지로 커밋할까요? (yes/no)"); + var answer = await ctx.PromptUserAsync("커밋 확인"); + if (answer?.Trim().ToLowerInvariant() is not ("yes" or "y" or "ㅇ")) + { + await ctx.SendSystemMessageAsync("커밋이 취소되었습니다."); + return; + } + + // 4. git add + commit 실행 + await ProcessHelper.RunAsync("git", "add -A", ctx.WorkFolder, ct); + var commitResult = await ProcessHelper.RunAsync("git", + $"commit -m \"{commitMsg.Replace("\"", "\\\"")}\"", ctx.WorkFolder, ct); + + await ctx.SendSystemMessageAsync( + commitResult.ExitCode == 0 + ? $"커밋 완료: {commitResult.StdOut}" + : $"커밋 실패: {commitResult.StdErr}"); + } +} +``` + +### 22-8: /mcp — MCP 서버 관리 + +```csharp +public class McpCommand : ISlashCommand +{ + public string Name => "mcp"; + public string[] Aliases => Array.Empty(); + public string Description => "MCP 서버 상태 확인 및 활성화/비활성화"; + public string? ArgumentHint => "[enable|disable [서버명]]"; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var parts = arguments.Trim().Split(' ', 2, StringSplitOptions.RemoveEmptyEntries); + var action = parts.Length > 0 ? parts[0].ToLowerInvariant() : ""; + var serverName = parts.Length > 1 ? parts[1] : null; + + if (string.IsNullOrEmpty(action)) + { + // 상태 표시 + var sb = new StringBuilder("## MCP 서버 상태\n"); + foreach (var client in ctx.McpManager.GetAllClients()) + { + var status = client.IsConnected ? "🟢 연결됨" : "🔴 끊김"; + sb.AppendLine($"- **{client.ServerName}** {status} ({client.Tools.Count}개 도구)"); + } + await ctx.SendSystemMessageAsync(sb.ToString()); + return; + } + + switch (action) + { + case "enable": + if (serverName != null) + await ctx.McpManager.EnableServerAsync(serverName, ct); + else + await ctx.McpManager.EnableAllAsync(ct); + await ctx.SendSystemMessageAsync($"MCP 서버 활성화: {serverName ?? "전체"}"); + break; + + case "disable": + if (serverName != null) + ctx.McpManager.DisableServer(serverName); + else + ctx.McpManager.DisableAll(); + await ctx.SendSystemMessageAsync($"MCP 서버 비활성화: {serverName ?? "전체"}"); + break; + + case "reconnect": + if (serverName != null) + await ctx.McpManager.ReconnectAsync(serverName, ct); + await ctx.SendSystemMessageAsync($"MCP 서버 재연결: {serverName}"); + break; + + default: + await ctx.SendSystemMessageAsync("사용법: /mcp [enable|disable|reconnect] [서버명]"); + break; + } + } +} +``` + +### 22-9: /permissions, /hooks, /config, /skills, /review, /help + +```csharp +// /permissions — 권한 규칙 관리 +public class PermissionsCommand : ISlashCommand +{ + public string Name => "permissions"; + public string[] Aliases => new[] { "allowed-tools" }; + public string Description => "도구 허용/차단 규칙을 관리합니다"; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + // 현재 권한 모드 + allow/deny 규칙 목록 표시 + // "allow Bash(git *)" / "deny Bash(rm -rf *)" 형식 인수 처리 + var settings = ctx.Settings.Settings.Llm; + var sb = new StringBuilder("## 권한 설정\n"); + sb.AppendLine($"현재 모드: **{settings.PermissionMode}**\n"); + + sb.AppendLine("### 허용 규칙"); + foreach (var rule in settings.AllowRules) + sb.AppendLine($"- ✅ `{rule}`"); + + sb.AppendLine("\n### 차단 규칙"); + foreach (var rule in settings.DenyRules) + sb.AppendLine($"- ❌ `{rule}`"); + + await ctx.SendSystemMessageAsync(sb.ToString()); + } +} + +// /hooks — 훅 설정 표시 +public class HooksCommand : ISlashCommand +{ + public string Name => "hooks"; + public string[] Aliases => Array.Empty(); + public string Description => "활성화된 훅 설정을 표시합니다"; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var hooks = ctx.HookRunner.GetAllDefinitions(); + var sb = new StringBuilder("## 활성 훅\n"); + foreach (var (eventName, defs) in hooks) + { + sb.AppendLine($"### {eventName}"); + foreach (var def in defs) + { + var matcher = string.IsNullOrEmpty(def.Matcher) ? "(전체)" : def.Matcher; + sb.AppendLine($"- [{def.Type}] {matcher}: `{def.Command ?? def.Prompt ?? def.Url}`"); + } + } + await ctx.SendSystemMessageAsync(sb.ToString()); + } +} + +// /config — 설정 열기 +public class ConfigCommand : ISlashCommand +{ + public string Name => "config"; + public string[] Aliases => new[] { "settings" }; + public string Description => "설정 화면을 엽니다"; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + // 인라인 설정 패널 토글 (Phase 21 UI) 또는 SettingsWindow 열기 + ctx.ToggleSettingsPanel(); + } +} + +// /skills — 스킬 목록 +public class SkillsCommand : ISlashCommand +{ + public string Name => "skills"; + public string[] Aliases => Array.Empty(); + public string Description => "사용 가능한 스킬 목록을 표시합니다"; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var skills = ctx.SkillLoader.GetUserInvocableSkills(); + var sb = new StringBuilder("## 사용 가능한 스킬\n"); + foreach (var skill in skills) + { + var hint = string.IsNullOrEmpty(skill.Frontmatter.ArgumentHint) + ? "" : $" `{skill.Frontmatter.ArgumentHint}`"; + sb.AppendLine($"- **/{skill.Name}**{hint} — {skill.Frontmatter.Description}"); + } + await ctx.SendSystemMessageAsync(sb.ToString()); + } +} + +// /review — PR 리뷰 +public class ReviewCommand : ISlashCommand +{ + public string Name => "review"; + public string[] Aliases => Array.Empty(); + public string Description => "AI 코드 리뷰를 실행합니다"; + public string? ArgumentHint => "[PR 번호 또는 diff]"; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + // git diff 가져오기 + string diff; + if (!string.IsNullOrWhiteSpace(arguments) && int.TryParse(arguments.Trim(), out var prNum)) + { + // GitHub PR diff 가져오기 (gh CLI 사용) + var result = await ProcessHelper.RunAsync("gh", $"pr diff {prNum}", ctx.WorkFolder, ct); + diff = result.StdOut; + } + else + { + // 현재 브랜치 diff + var result = await ProcessHelper.RunAsync("git", + "diff main...HEAD", ctx.WorkFolder, ct); + diff = result.StdOut; + } + + if (string.IsNullOrWhiteSpace(diff)) + { + await ctx.SendSystemMessageAsync("리뷰할 변경 사항이 없습니다."); + return; + } + + // LLM 코드 리뷰 요청 + var prompt = $""" + 아래 코드 변경 사항을 리뷰하세요: + 1. 변경 사항 개요 + 2. 코드 품질 및 스타일 + 3. 잠재적 버그 또는 보안 문제 + 4. 개선 제안 + + ```diff + {diff[..Math.Min(diff.Length, 12000)]} + ``` + """; + + var review = await ctx.Llm.GenerateAsync(prompt, ct); + await ctx.SendSystemMessageAsync($"## 코드 리뷰\n{review}"); + } +} + +// /help — 도움말 +public class HelpCommand : ISlashCommand +{ + public string Name => "help"; + public string[] Aliases => Array.Empty(); + public string Description => "사용 가능한 명령 목록을 표시합니다"; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var registry = ctx.SlashCommandRegistry; + var sb = new StringBuilder("## AX Agent 명령\n\n"); + foreach (var cmd in registry.GetAll().OrderBy(c => c.Name)) + { + var hint = cmd.ArgumentHint != null ? $" {cmd.ArgumentHint}" : ""; + var aliases = cmd.Aliases.Length > 0 + ? $" (별칭: {string.Join(", ", cmd.Aliases.Select(a => $"/{a}"))})" : ""; + sb.AppendLine($"- **/{cmd.Name}**{hint} — {cmd.Description}{aliases}"); + } + sb.AppendLine("\n스킬 명령은 `/skills`로 확인하세요."); + await ctx.SendSystemMessageAsync(sb.ToString()); + } +} +``` + +### 22-10: 입력 라우팅 통합 + +```csharp +// AgentLoopService 또는 AgentWindowViewModel에서 입력 처리 +public class InputRouter +{ + private readonly SlashCommandRegistry _slashCommands; + private readonly SkillLoaderService _skillLoader; + + /// 사용자 입력을 슬래시 명령 → 스킬 → 일반 메시지 순으로 라우팅. + public async Task RouteAsync(string input, IAgentChatContext ctx, CancellationToken ct) + { + if (!input.StartsWith("/")) + return InputRouteResult.Message(input); // 일반 메시지 + + var spaceIdx = input.IndexOf(' '); + var commandPart = spaceIdx > 0 ? input[..spaceIdx] : input; + var argsPart = spaceIdx > 0 ? input[(spaceIdx + 1)..] : ""; + + // 1. 내장 슬래시 명령 확인 + var cmd = _slashCommands.Resolve(commandPart); + if (cmd != null) + { + await cmd.ExecuteAsync(argsPart, ctx, ct); + return InputRouteResult.Handled; + } + + // 2. 스킬 검색 + var skillName = commandPart.TrimStart('/'); + var skill = _skillLoader.FindByName(skillName); + if (skill != null) + return InputRouteResult.Skill(skill, argsPart); + + // 3. 미인식 → 일반 메시지로 전달 + return InputRouteResult.Message(input); + } +} + +public record InputRouteResult(InputRouteType Type, string? Message = null, + LoadedSkill? Skill = null, string? SkillArgs = null) +{ + public static InputRouteResult Handled => new(InputRouteType.Handled); + public static InputRouteResult Message(string msg) => new(InputRouteType.Message, msg); + public static InputRouteResult Skill(LoadedSkill skill, string args) + => new(InputRouteType.Skill, Skill: skill, SkillArgs: args); +} + +public enum InputRouteType { Handled, Message, Skill } +``` + +--- + +## Phase 19-D 확장 — 스킬 시스템 CC 동등성 보완 (v2.1) + +> **기존 17-D에 없는 3가지 핵심 기능 추가**: 인라인 셸 커맨드, 네임스페이싱, 명명된 인수 + +### 19-D-EXT-1: 인라인 셸 커맨드 (`!`backtick`) + +```csharp +// SkillInlineCommandProcessor.cs +public class SkillInlineCommandProcessor +{ + // !`command` 패턴을 찾아 실행하고 출력으로 교체 + private static readonly Regex InlineCmdPattern = new(@"!\`([^`]+)\`", RegexOptions.Compiled); + + /// + /// 스킬 본문에서 !`command` 패턴을 찾아 셸 실행 결과로 교체합니다. + /// 호출 시점: 스킬이 로드된 후, LLM에 프롬프트로 전달하기 직전. + /// + public async Task ProcessAsync(string skillBody, string workFolder, CancellationToken ct) + { + var matches = InlineCmdPattern.Matches(skillBody); + if (matches.Count == 0) return skillBody; + + var result = skillBody; + foreach (Match match in matches.Reverse()) // 뒤에서부터 교체 (인덱스 유지) + { + var command = match.Groups[1].Value; + var output = await ExecuteCommandAsync(command, workFolder, ct); + result = result.Remove(match.Index, match.Length) + .Insert(match.Index, output); + } + return result; + } + + private async Task ExecuteCommandAsync(string command, string workFolder, CancellationToken ct) + { + try + { + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(10)); // 인라인 명령 타임아웃 10초 + + var psi = new ProcessStartInfo + { + FileName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "cmd.exe" : "bash", + Arguments = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) + ? $"/c {command}" : $"-c \"{command.Replace("\"", "\\\"")}\"", + WorkingDirectory = workFolder, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + }; + + using var proc = Process.Start(psi); + if (proc == null) return "[실행 실패]"; + + var stdout = await proc.StandardOutput.ReadToEndAsync(cts.Token); + await proc.WaitForExitAsync(cts.Token); + + return stdout.Trim(); + } + catch (OperationCanceledException) + { + return "[타임아웃]"; + } + catch (Exception ex) + { + return $"[오류: {ex.Message}]"; + } + } +} +``` + +### 19-D-EXT-2: 스킬 네임스페이싱 (서브디렉토리 콜론 구분) + +```csharp +// SkillLoaderService 확장 +public class SkillLoaderService +{ + // 기존 메서드 + 네임스페이싱 로직 + + /// + /// 스킬 디렉토리 구조를 콜론 구분 네임스페이스로 변환합니다. + /// .claude/skills/database/migrate/SKILL.md → "database:migrate" + /// .claude/skills/deploy/SKILL.md → "deploy" + /// + private string ResolveSkillName(string skillDir, string baseSkillsDir) + { + var relative = Path.GetRelativePath(baseSkillsDir, skillDir); + // Windows 경로 구분자 → 콜론 + return relative.Replace(Path.DirectorySeparatorChar, ':') + .Replace(Path.AltDirectorySeparatorChar, ':'); + } + + /// 콜론 구분 이름으로 스킬 검색 (부분 일치 지원). + public LoadedSkill? FindByName(string name) + { + // 정확한 일치 + var exact = _skills.FirstOrDefault(s => + s.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + if (exact != null) return exact; + + // 마지막 세그먼트 일치 (database:migrate → "migrate"로도 검색 가능) + var lastSegment = name.Contains(':') ? name : name; + return _skills.FirstOrDefault(s => + s.Name.EndsWith($":{lastSegment}", StringComparison.OrdinalIgnoreCase) || + s.Name.Equals(lastSegment, StringComparison.OrdinalIgnoreCase)); + } + + // 디렉토리 스캔 시 재귀적으로 SKILL.md 검색 + private void ScanSkillDirectory(string dir, string baseDir, List results) + { + var skillFile = Path.Combine(dir, "SKILL.md"); + if (File.Exists(skillFile)) + { + var name = ResolveSkillName(dir, baseDir); + var content = File.ReadAllText(skillFile); + var (frontmatter, body) = ParseFrontmatter(content); + results.Add(new LoadedSkill(name, frontmatter, body, skillFile)); + } + + foreach (var subDir in Directory.GetDirectories(dir)) + ScanSkillDirectory(subDir, baseDir, results); + } +} +``` + +### 19-D-EXT-3: 명명된 인수 ($name 구문) + +```csharp +// SkillArgumentSubstitution.cs +public static class SkillArgumentSubstitution +{ + /// + /// 스킬 본문에서 $ARGUMENTS와 명명된 인수를 치환합니다. + /// - $ARGUMENTS → 전체 인수 문자열 + /// - $name → 프론트매터 arguments: [name, directory] 기반 위치 매핑 + /// - {0}, {1} → 인덱스 기반 인수 + /// + public static string Substitute(string body, SkillFrontmatter frontmatter, string userInput) + { + var result = body; + + // 1. $ARGUMENTS → 전체 인수 + result = result.Replace("$ARGUMENTS", userInput); + + // 2. 명명된 인수 (프론트매터에 arguments가 정의된 경우) + if (frontmatter.Arguments.Count > 0) + { + var parts = SplitArguments(userInput); + for (var i = 0; i < frontmatter.Arguments.Count; i++) + { + var argName = frontmatter.Arguments[i]; + var argValue = i < parts.Count ? parts[i] : ""; + result = result.Replace($"${argName}", argValue); + } + } + + // 3. 인덱스 기반 인수 ({0}, {1}, ...) + var indexParts = SplitArguments(userInput); + for (var i = 0; i < indexParts.Count; i++) + result = result.Replace($"{{{i}}}", indexParts[i]); + + return result; + } + + private static List SplitArguments(string input) + { + // 따옴표로 감싼 인수 지원: "hello world" foo bar + var parts = new List(); + var current = new StringBuilder(); + var inQuote = false; + + foreach (var ch in input) + { + if (ch == '"') { inQuote = !inQuote; continue; } + if (ch == ' ' && !inQuote && current.Length > 0) + { + parts.Add(current.ToString()); + current.Clear(); + continue; + } + current.Append(ch); + } + if (current.Length > 0) parts.Add(current.ToString()); + return parts; + } +} +``` + +### 19-D-EXT-4: SkillExecutionPipeline 통합 + +```csharp +// 스킬 실행 파이프라인: 인수 치환 → 인라인 셸 → LLM 전달 +public class SkillExecutionPipeline +{ + private readonly SkillInlineCommandProcessor _inlineCmd; + private readonly PathBasedSkillActivator _pathActivator; + private readonly ForkContextSkillRunner _forkRunner; + private readonly HookRunnerService _hookRunner; + + public async Task ExecuteAsync( + LoadedSkill skill, string userInput, string workFolder, + AgentLoopService agentLoop, CancellationToken ct) + { + // 1. PreSkillExecute 훅 + await _hookRunner.RunAsync(HookEvent.PreSkillExecute, new HookContext + { + Event = HookEvent.PreSkillExecute, + ToolName = skill.Name, + UserMessage = userInput, + }, ct); + + // 2. 인수 치환 ($ARGUMENTS, $name, {0}) + var body = SkillArgumentSubstitution.Substitute( + skill.Body, skill.Frontmatter, userInput); + + // 3. 인라인 셸 명령 실행 (!`command`) + body = await _inlineCmd.ProcessAsync(body, workFolder, ct); + + // 4. 모델 오버라이드 확인 + var model = skill.Frontmatter.Model; + + // 5. 컨텍스트 분기 여부 확인 + if (skill.Frontmatter.Context == SkillContext.Fork) + { + var result = await _forkRunner.ExecuteInForkAsync(skill, body, ct); + // PostSkillExecute 훅 + await _hookRunner.RunAsync(HookEvent.PostSkillExecute, new HookContext + { + Event = HookEvent.PostSkillExecute, + ToolName = skill.Name, + ToolOutput = result.Output, + }, ct); + return result; + } + + // 6. 메인 컨텍스트에서 실행 (body를 시스템 프롬프트에 주입) + return new SkillResult + { + IsSuccess = true, + Output = body, // AgentLoopService가 이를 프롬프트로 사용 + }; + } +} +``` + +--- + +## Phase 19-B 확장 — 복합 Bash 명령 파싱 (v2.1) + +> **기존 19-B에 누락된 복합 명령 파싱 상세 구현** + +### 19-B-EXT-1: CompoundCommandParser + +```csharp +// 복합 Bash 명령을 서브커맨드로 분리하여 각각 권한 검사 +public class CompoundCommandParser +{ + // &&, ||, ;, | 로 분리 (따옴표, 서브셸 내부는 분리하지 않음) + public static IReadOnlyList Parse(string command) + { + var result = new List(); + var current = new StringBuilder(); + var inSingleQuote = false; + var inDoubleQuote = false; + var parenDepth = 0; + + for (var i = 0; i < command.Length; i++) + { + var ch = command[i]; + var next = i + 1 < command.Length ? command[i + 1] : '\0'; + + // 따옴표 토글 + if (ch == '\'' && !inDoubleQuote) { inSingleQuote = !inSingleQuote; current.Append(ch); continue; } + if (ch == '"' && !inSingleQuote) { inDoubleQuote = !inDoubleQuote; current.Append(ch); continue; } + + // 서브셸 + if (!inSingleQuote && !inDoubleQuote) + { + if (ch == '(') parenDepth++; + if (ch == ')') parenDepth--; + } + + // 분리자 검출 (따옴표/서브셸 밖에서만) + if (!inSingleQuote && !inDoubleQuote && parenDepth == 0) + { + if ((ch == '&' && next == '&') || (ch == '|' && next == '|')) + { + if (current.Length > 0) result.Add(current.ToString().Trim()); + current.Clear(); + i++; // 두 글자 연산자 건너뜀 + continue; + } + if (ch == ';' || ch == '|') + { + if (current.Length > 0) result.Add(current.ToString().Trim()); + current.Clear(); + continue; + } + } + + current.Append(ch); + } + + if (current.Length > 0) result.Add(current.ToString().Trim()); + return result; + } +} + +// PermissionEvaluator 확장 +public class PermissionEvaluator +{ + private readonly IReadOnlyList _allowRules; + private readonly IReadOnlyList _denyRules; + + /// + /// 복합 명령의 각 서브커맨드를 독립적으로 검사합니다. + /// 하나의 서브커맨드라도 deny되면 전체 명령이 차단됩니다. + /// + public PermissionDecision EvaluateCompound(string toolName, string command) + { + if (toolName != "bash" && toolName != "process") + return EvaluateSingle(toolName, command); + + var subCommands = CompoundCommandParser.Parse(command); + foreach (var sub in subCommands) + { + var decision = EvaluateSingle(toolName, sub.Trim()); + if (decision == PermissionDecision.Deny) + return PermissionDecision.Deny; + } + + // 모든 서브커맨드가 allow이면 allow, 아니면 ask + return subCommands.All(sub => EvaluateSingle(toolName, sub) == PermissionDecision.Allow) + ? PermissionDecision.Allow + : PermissionDecision.Ask; + } + + // 항상 차단되는 위험 패턴 + private static readonly string[] AlwaysEscalate = new[] + { + "sed -i", // 파일 인플레이스 편집 + "rm -rf /", // 루트 삭제 + "chmod 777", // 위험한 권한 + "> ~/.bashrc", // 셸 설정 변경 + "> ~/.zshrc", + ".claude/", // 설정 디렉토리 조작 + ".git/", // git 내부 조작 + }; +} +``` + +--- + +## Phase 17-C 확장 — 훅 환경변수 시스템 (v2.1) + +> **CC의 훅 환경변수 체계를 구현**: $CLAUDE_FILE_PATH, $CLAUDE_TOOL_NAME 등 + +### 17-C-EXT-1: HookEnvironmentBuilder + +```csharp +// 훅 실행 시 셸 환경변수를 자동 주입 +public static class HookEnvironmentBuilder +{ + /// HookContext에서 셸 환경변수 딕셔너리를 생성합니다. + public static Dictionary Build(HookContext context) + { + var env = new Dictionary(StringComparer.OrdinalIgnoreCase); + + // 공통 변수 + env["AX_SESSION_ID"] = context.SessionId; + env["AX_HOOK_EVENT"] = context.Event.ToString(); + env["AX_CWD"] = context.WorkFolder ?? ""; + env["AX_PERMISSION_MODE"] = context.PermissionMode ?? "default"; + + // 도구 관련 변수 (PreToolUse, PostToolUse) + if (!string.IsNullOrEmpty(context.ToolName)) + { + env["AX_TOOL_NAME"] = context.ToolName; + env["CLAUDE_TOOL_NAME"] = context.ToolName; // CC 호환 + } + if (!string.IsNullOrEmpty(context.ToolInput)) + { + env["AX_TOOL_INPUT"] = context.ToolInput; + env["CLAUDE_TOOL_INPUT"] = context.ToolInput; // CC 호환 + } + + // 파일 경로 변수 (Write, Edit 도구 시) + if (!string.IsNullOrEmpty(context.FilePath)) + { + env["AX_FILE_PATH"] = context.FilePath; + env["CLAUDE_FILE_PATH"] = context.FilePath; // CC 호환 + } + + // 파일 변경 변수 (FileChanged) + if (!string.IsNullOrEmpty(context.ChangedFilePath)) + env["AX_CHANGED_FILE"] = context.ChangedFilePath; + + // CwdChanged 전용: CLAUDE_ENV_FILE + if (context.Event == HookEvent.CwdChanged) + { + var envFile = Path.Combine(Path.GetTempPath(), "AxCopilot", + $"env_{context.SessionId}.txt"); + Directory.CreateDirectory(Path.GetDirectoryName(envFile)!); + env["CLAUDE_ENV_FILE"] = envFile; + env["AX_ENV_FILE"] = envFile; + } + + // 사용자 프롬프트 (UserPromptSubmit) + if (!string.IsNullOrEmpty(context.UserMessage)) + env["AX_USER_PROMPT"] = context.UserMessage; + + return env; + } +} + +// CommandHookExecutor에서 환경변수 주입 +public class CommandHookExecutor : IHookExecutor +{ + public async Task ExecuteAsync(HookContext context, CancellationToken ct) + { + var psi = new ProcessStartInfo { ... }; + + // 환경변수 주입 + foreach (var (key, value) in HookEnvironmentBuilder.Build(context)) + psi.Environment[key] = value; + + // stdin에 JSON 입력 전달 (CC 호환) + var inputJson = JsonSerializer.Serialize(context, _jsonOpts); + // ... 프로세스 실행, stdin에 inputJson 쓰기 ... + } +} +``` + +--- + +## Phase 23 — 최종 CC 동등성 검증 + 누락 기능 (v2.1) ✅ 완료 + +> **목표**: Phase 19~22 이후 남은 소규모 갭을 해소하고, 전체 기능 매트릭스 검증 +> +> **구현 완료** (2026-04-03): AutoCompactMonitor, IConditionalTool + ToolEnvironmentContext, SlashAutoCompleteProvider. 또한 Phase 19-D-EXT(SkillArgumentSubstitution, SkillInlineCommandProcessor → SkillService 통합), Phase 19-B-EXT(CompoundCommandParser → PermissionDecisionService 통합), Phase 17-C-EXT(HookEnvironmentBuilder → ExtendedHookRunner 통합) 모두 완료. + +### 23-1: argument-hint 자동완성 UI + +```csharp +// AgentInputArea에서 / 입력 시 자동완성 팝업에 hint 표시 +public class SlashAutoCompleteProvider +{ + private readonly SlashCommandRegistry _commands; + private readonly SkillLoaderService _skills; + + public IReadOnlyList GetSuggestions(string input) + { + if (!input.StartsWith("/")) return Array.Empty(); + + var prefix = input.TrimStart('/'); + var results = new List(); + + // 내장 명령 + foreach (var cmd in _commands.GetAll()) + { + if (cmd.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + results.Add(new AutoCompleteItem($"/{cmd.Name}", cmd.Description, cmd.ArgumentHint)); + } + + // 스킬 + foreach (var skill in _skills.GetUserInvocableSkills()) + { + if (skill.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + results.Add(new AutoCompleteItem($"/{skill.Name}", + skill.Frontmatter.Description, skill.Frontmatter.ArgumentHint)); + } + + return results.OrderBy(r => r.Name).ToList(); + } +} + +public record AutoCompleteItem(string Name, string Description, string? ArgumentHint); +``` + +### 23-2: 세션 /compact 자동 트리거 + +```csharp +// 컨텍스트 크기 모니터링 → 자동 컴팩션 +public class AutoCompactMonitor +{ + private readonly TokenEstimatorService _tokenEstimator; + private readonly int _thresholdPercent; // 기본 80% + + /// 매 에이전트 반복 후 호출 → 컨텍스트가 임계치 초과 시 자동 컴팩션. + public async Task CheckAndCompactAsync( + AgentLoopService agentLoop, LlmService llm, CancellationToken ct) + { + var usage = _tokenEstimator.EstimateTokenCount(agentLoop.GetCurrentMessages()); + var maxTokens = agentLoop.CurrentModelMaxTokens; + var usagePercent = (int)((double)usage / maxTokens * 100); + + if (usagePercent < _thresholdPercent) return false; + + LogService.Info($"컨텍스트 {usagePercent}% 사용 → 자동 컴팩션 시작"); + + // CompactCommand와 동일한 로직 (DRY: 공유 서비스로 분리) + await CompactionService.CompactAsync(agentLoop, llm, instruction: null, ct); + return true; + } +} + +// 설정 추가 +public class LlmSettings +{ + [JsonPropertyName("auto_compact_enabled")] + public bool AutoCompactEnabled { get; set; } = true; + + [JsonPropertyName("auto_compact_threshold_percent")] + public int AutoCompactThresholdPercent { get; set; } = 80; +} +``` + +### 23-3: 도구별 isEnabled() 자가 비활성화 + +```csharp +// IAgentTool 인터페이스 확장 (ISP 준수: 옵션 인터페이스) +public interface IConditionalTool +{ + /// 현재 환경에서 이 도구가 사용 가능한지 확인합니다. + bool IsEnabled(ToolEnvironmentContext env); +} + +public record ToolEnvironmentContext( + AppSettings Settings, + string ActiveTab, // "Chat" | "Cowork" | "Code" + string? WorkFolder, + bool HasGitRepo, + bool HasNodeRuntime, + bool HasPythonRuntime); + +// ToolRegistry에서 도구 목록 생성 시 필터링 +public class ToolRegistry +{ + public IReadOnlyList GetActiveTools(ToolEnvironmentContext env) + { + return _tools.Where(t => + { + if (t is IConditionalTool conditional) + return conditional.IsEnabled(env); + return true; // 조건 없는 도구는 항상 활성 + }).ToList(); + } +} +``` + +### 23-4: CC 기능 매트릭스 최종 검증표 + +| CC 기능 | AX Phase | 상태 | +|---------|----------|------| +| 4-layer memory (managed/user/project/local) | 19-A | ✅ Phase 22 구현 | +| @include 5단계 | 기존 | ✅ 구현됨 | +| rules/*.md + paths frontmatter | 기존 | ✅ 구현됨 | +| 18종 훅 이벤트 | 25 | ✅ Phase 25 구현 (PostToolUseFailure, Stop 포함) | +| 4종 훅 타입 (command/http/prompt/agent) | 25 | ✅ Phase 25 구현 | +| 훅 환경변수 ($CLAUDE_FILE_PATH 등) | 25 | ✅ Phase 25 HookEnvironmentBuilder | +| 훅 if 조건부 실행 | 25 | ✅ Phase 25 EvaluateCondition (==, !=, contains, &&) | +| 훅 once/async/asyncRewake | 25 | ✅ Phase 25 AsyncRewakeTriggered 이벤트 | +| 스킬 $ARGUMENTS 치환 | 24 | ✅ Phase 24 SkillArgumentSubstitution | +| 스킬 인라인 셸 실행 | 24 | ✅ Phase 24 SkillInlineCommandProcessor | +| 스킬 네임스페이싱 (colon) | 24 | ✅ Phase 24 LoadSkillsRecursive | +| 스킬 명명된 인수 ($name) | 24 | ✅ Phase 24 SkillDefinition.Arguments | +| 스킬 context:fork | 24 | ✅ Phase 24 IsForkContext frontmatter | +| 스킬 paths 자동 활성화 | 24 | ✅ Phase 24 PathBasedSkillActivator | +| 스킬 model 오버라이드 | 24 | ✅ Phase 24 ModelOverride frontmatter | +| 스킬 user-invocable | 24 | ✅ Phase 24 UserInvocable 필터링 | +| 스킬 범위 훅 | 24 | ✅ Phase 24 ScopedHooks frontmatter | +| 4종 권한 모드 (default/acceptEdits/plan/bypass) | 22 | ✅ Phase 22 구현 | +| 복합 Bash 명령 파싱 (&&/\|\|/;/\|) | 22 | ✅ Phase 22 CompoundCommandParser | +| glob 패턴 권한 매칭 (Bash(git *)) | 기존 | ✅ 구현됨 | +| MCP 도구 차단 (mcp__server 규칙) | 기존 | ✅ 구현됨 | +| 도구 가시성 필터링 | 기존 | ✅ 구현됨 | +| 슬래시 명령 14종 | 22 + 26 | ✅ Phase 22/26 SlashCommandRegistry | +| 출력 예산 + 스필오버 | 27 | ✅ Phase 27 ToolResultSizer | +| 세션 fork/resume/tag | 28 | ✅ Phase 28 SessionManager | +| 자동 컴팩션 | 29-A | ✅ Phase 29 AutoCompactMonitor 통합 | +| 도구 isEnabled() 자가 비활성화 | 29-B | ✅ Phase 29 IConditionalTool + ToolEnvironmentContext | +| /init 프로젝트 초기화 | 26 | ✅ Phase 26 InitCommand | +| @include AxMd 지시어 | 27 | ✅ Phase 27 AxMdIncludeResolver | +| 멀티에이전트 + worktree | 기존 | ✅ SubAgentTool + DelegateAgentTool + WorktreeManager | +| 에이전트 타입별 메모리 | 기존 | ✅ AgentTypeMemoryRepository + MemoryTool + /memory 명령 | +| 4-layer 계층 메모리 통합 조회 | 30-C | ✅ Phase 30 HierarchicalMemoryService | +| SDK 제어 프로토콜 (JSON 스트리밍) | 31 | ✅ Phase 31 AgentSdkServer + SdkProtocol | +| 커스텀 에이전트 정의 (SDK) | 31-C | ✅ Phase 31 CustomAgentDefinition + AgentTypeRegistry | +| SDK 훅 콜백 (외부 권한 핸들링) | 31-D | ✅ Phase 31 SdkHookCallbackHandler | +| 3-Pane Claude.ai UI (사이드바+헤더+설정 패널+입력) | 32 | ✅ Phase 32 AgentSettingsPanel/SidebarView/HeaderBar/InputArea | + +--- + +## 구현 의존성 그래프 (Phase 19+ 갱신) + +``` +[19-A] HierarchicalMemory ─────────────────────────────────────────┐ + ↓ │ +[19-B] PermissionPatternMatch ← [19-B-EXT] CompoundParsing │ + ↓ ↓ +[19-C] HookEvents ← [17-C-EXT] HookEnvVars │ + ↓ │ +[19-D] SkillSystem ← [19-D-EXT] InlineCmd + Namespace + NamedArgs │ + ↓ ↓ │ +[19-E] SessionManager ──────────────────────────────────────────────┘ + ↓ +[19-F] OutputBudget + ↓ +[19-G] /init ← [22] SlashCommands (15종) ← [23] AutoCompact + isEnabled + ↓ +[20-A] SDK ──→ [20-B] CustomAgent ──→ [20-C] SDK 훅 콜백 + ↓ + [21-1~7] UI 전면 개편 +``` + +--- + +## 버전별 출시 계획 (갱신) + +| 버전 | 코드명 | 포함 Phase | 핵심 신규 클래스 수 | +|------|--------|-----------|-----------------| +| **v1.8.0** | 에이전트 인프라 | 17-UI, 17-A~G | ~35개 신규 클래스 ✅ 완료 | +| **v1.8.1** | 인프라 안정화 | 버그픽스 + 17-* 마이너 | — | +| **v2.0** | 에이전트 팀 | 18-A~C, L3 | ~25개 신규 클래스 ✅ 완료 | +| **v2.1** | CC 완전 동등성 | 19-A~G + 19-EXT + 22 + 23 | **~50개 신규 클래스** | +| **v2.2** | SDK 프로토콜 | 20-A~C (임베딩 + 외부 연동) | ~15개 신규 클래스 | +| **v2.3** | AX Agent UI 전면 개편 | 21 (Claude.ai+Codex 레이아웃) | UI 계층 60% 재작성 | +| **v3.0** | 크로스플랫폼 | LP-1~3 (Avalonia) | UI 계층 40% 재작성 | + +### v2.1 세부 구현 순서 (권장) + +``` +Week 1-2: [19-A] 4-layer Memory + [19-B + EXT] Permission + CompoundParsing +Week 3: [17-C-EXT] HookEnvVars + [19-C] HookEvents 완성 +Week 4: [19-D-EXT] Skill InlineCmd + Namespace + NamedArgs +Week 5: [22] SlashCommands 16종 (ISlashCommand + Registry + 구현체) +Week 6: [19-E] SessionManager (fork/resume/tag) +Week 7: [19-F] OutputBudget + Spillover + [19-G] /init +Week 8: [23] AutoCompact + isEnabled + 최종 검증 +``` + +--- + +--- + +## Phase 24 — 스킬 고급 기능 (v2.1) ✅ 완료 + +> **목표**: CC 스킬 시스템의 나머지 갭 해소 — 네임스페이싱, 고급 프론트매터, 실행 격리. +> +> **구현 완료** (2026-04-03): + +### 24-A: 콜론 네임스페이싱 +- `SkillService.LoadSkillsRecursive()` — 하위 디렉토리를 재귀 탐색, `database/migrate/SKILL.md` → `database:migrate` 자동 변환 +- 중간 디렉토리(SKILL.md 없음)는 건너뛰고 더 깊이 탐색 + +### 24-B: 고급 프론트매터 필드 +- `context`: "fork"이면 격리 서브에이전트에서 실행 (플래그 설정, 실행은 AgentLoopService에서 처리) +- `model`: 스킬별 모델 오버라이드 +- `user-invocable`: false면 `/` 자동완성에서 숨김 (AI만 사용) +- `paths`: 파일 경로 글로브 — 매칭 파일 터치 시 자동 제안 +- `hooks`: 스킬 스코프 훅 정의 (JSON) +- `arguments`: 명명된 인수 리스트 (`[$name, $dir]`) +- `when_to_use`: AI 선제적 사용 힌트 +- `version`: 스킬 버전 + +### 24-C: SkillDefinition 확장 +- 10개 새 프로퍼티 추가 (`Context`, `ModelOverride`, `UserInvocable`, `Paths`, `ScopedHooks`, `Arguments`, `WhenToUse`, `Version`, `IsForkContext`) +- `ParseSkillFile()` 2-param 오버로드 (네임스페이스 이름 주입) +- `MatchSlashCommand()` — `UserInvocable` 필터 적용 +- `PrepareSkillBodyAsync()` — `Arguments` 필드 연동 + +--- + +## Phase 25 — 훅 고급 기능 + 도구 결과 크기 제한 (v2.1) ✅ 완료 + +> **목표**: 훅 조건부 실행, asyncRewake, 누락 이벤트 추가. 도구 결과 오버플로우 방지. +> +> **구현 완료** (2026-04-03): + +### 25-A: Hook `if` 조건부 실행 +- `EvaluateCondition()` 완전 구현 — `"field == value"`, `"field != value"`, `"field contains value"` 지원 +- `&&` 연결로 복합 조건 지원 +- 지원 필드: `tool_name`, `event`, `session_id`, `work_folder`, `user_message`, `changed_file` + +### 25-B: Hook asyncRewake + 이벤트 확장 +- `ExtendedHookEntry.AsyncRewake` 필드 추가 +- asyncRewake 훅: 비동기 실행 후 exit code 2 시 `AsyncRewakeTriggered` 이벤트 발생 +- `AsyncRewakeEventArgs` — HookName, AdditionalContext, SessionId +- `HookEventKind` 확장: `PostToolUseFailure`, `Stop` 추가 (총 17개, CC 동등) + +### 25-C: 도구 결과 크기 제한 (ToolResultSizer) +- `ToolResultSizer.Apply()` — 50,000자 초과 시 임시 파일 저장 + head/tail 프리뷰 반환 +- `ToolResultSizeInfo` — Output, WasTruncated, SpilloverFilePath, OriginalLength +- `CleanupOldResults()` — 24시간 지난 임시 결과 자동 정리 +- CC의 `maxResultSizeChars` + temp file spillover 패턴 완전 재현 + +--- + +## Phase 26 — /init 프로젝트 초기화 (v2.1) ✅ 완료 + +> **목표**: CC의 `/init` 명령 동등 — 코드베이스 분석 → AX.md 자동 생성. +> +> **구현 완료** (2026-04-03): + +### InitCommand (/init) +- 프로젝트 구조 트리 (3레벨, node_modules/.git 등 제외) +- Git 정보 수집 (브랜치, 리모트, 최근 커밋) +- 기술 스택 자동 감지 (Node.js/TypeScript/.NET/Rust/Go/Python/Java/Docker/GitHub Actions) +- 주요 설정 파일 내용 수집 (package.json, *.csproj, go.mod 등) +- LLM에게 프로젝트 분석 → AX.md 5섹션 자동 생성 + - 프로젝트 개요, 코드 컨벤션, 빌드/테스트, 작업 가이드라인, 주의사항 +- 기존 AX.md 존재 시 덮어쓰기 방지 + +--- + +--- + +## Phase 27 — 미통합 인프라 연결 (v2.1) ✅ 완료 + +> **목표**: 이미 정의되었으나 미사용 상태인 인프라(ToolResultSizer, PathBasedSkillActivator, AxMdIncludeResolver)를 실제 코드에 통합. +> +> **구현 완료** (2026-04-03): + +### 27-A: ToolResultSizer → AgentLoopService 통합 +- `AgentLoopService.cs:870` — 기존 `TruncateOutput(result.Output, 4000)` → `ToolResultSizer.Apply(result.Output, call.ToolName)` 교체 +- 50,000자 초과 결과 → 임시 파일 + head/tail 프리뷰 → LLM에 전달 + +### 27-B: PathBasedSkillActivator → 시스템 프롬프트 통합 +- `ChatWindow.xaml.cs` — `BuildPathBasedSkillSection()` 추가 +- 최근 5개 메시지에서 파일 경로 패턴 추출 → `PathBasedSkillActivator.GetActiveSkillsForFile()` → 시스템 프롬프트 자동 주입 +- `SkillDefinitionExtensions.GetPathPatterns()` — Phase 24의 `Paths` 프로퍼티 우선 사용, ExtensionStore 폴백 + +### 27-C: AxMdIncludeResolver → AX.md 로딩 통합 +- `LoadProjectContext()` — AX.md 내용에 `@` 포함 시 `AxMdIncludeResolver.ResolveAsync()` 실행 +- `@./relative/path`, `@~/home`, `@/absolute` 5레벨 깊이 재귀 해석 +- 순환 참조 감지, 파일 미존재 시 HTML 주석으로 대체 + +--- + +## Phase 28 — 세션 매니저 (v2.1) ✅ 완료 + +> **목표**: CC의 세션 관리(save/resume/fork/tag)와 동등한 세션 영속성 시스템. +> +> **구현 완료** (2026-04-03): + +### SessionManager +- `SaveSessionAsync()` / `LoadSessionAsync()` — JSON 기반 세션 저장/복원 +- `ForkSessionAsync()` — 기존 세션에서 분기 (메시지 복사 + "forked" 태그 + ParentSessionId) +- `TagSessionAsync()` / `RenameSessionAsync()` — 태그/이름 관리 +- `ListSessions()` — 최신순 목록 (최대 50개) +- `FindByTag()` — 태그 기반 검색 +- `GetMostRecent()` — CC의 `--continue` 동등 (탭별 최근 세션) +- `CleanupOldSessions()` — 30일 보존 기간 경과 시 자동 삭제 +- `AgentSession` — Id, Name, Tab, WorkFolder, Model, Messages, Tags, ParentSessionId, CreatedAt/UpdatedAt +- `AgentSessionSummary` — 목록 표시용 경량 DTO + +--- + +## Phase 29 — 최종 통합 & 검증 (v2.1) ✅ 완료 + +> **목표**: Phase 22~28에서 생성된 클래스들을 실제 코드 경로에 연결하고, CC 기능 매트릭스를 검증. +> +> **구현 완료** (2026-04-03): + +### 29-A: AutoCompactMonitor → AgentLoopService 통합 +- `AgentLoopService.RunAsync` 메인 루프에서 `LastTokenUsage` 기반 컨텍스트 사용량 모니터링 +- `AutoCompactThreshold` (기본 80%) 초과 시 `ContextCondenser.CondenseIfNeededAsync()` 자동 실행 +- `AppSettings.LlmSettings.AutoCompactThreshold` 설정 추가 + +### 29-B: IConditionalTool + ToolEnvironmentContext 통합 +- `AgentLoopService` line 339: `ToolEnvironmentContext` 빌드 후 `GetActiveTools(disabled, env)` 오버로드 사용 +- `.git` 폴더 존재 여부로 `HasGitRepo` 자동 감지 +- `GitTool` → `IConditionalTool` 구현 (HasGitRepo=false 시 도구 목록에서 자동 제외) + +### 29-C: SessionManager → AgentLoopService 통합 +- `RunAsync` finally 블록에서 세션 자동 저장 (`SessionManager.SaveSessionAsync`) +- 사용자 질의 첫 40자를 세션 이름으로 자동 설정 +- 현재 탭, 모델, 작업 폴더, 메시지를 `AgentSession`으로 영속화 + +### 29-D: CC 기능 매트릭스 상태 갱신 +- 33개 기능 항목 중 **29개 ✅ 구현 완료**, 4개 📋 계획 (SDK, 멀티에이전트, 에이전트 메모리, 3-Pane UI) +- Phase 22~29 구현 결과 반영 + +--- + +## Phase 30 — 아키텍처 정제 & 계층 메모리 (v2.1) ✅ 완료 + +> **목표**: DIP 원칙 적용, CC 4-layer 계층 메모리 통합, 기존 구현 누락 항목 매트릭스 반영. +> +> **구현 완료** (2026-04-03): + +### 30-A: CC 기능 매트릭스 재갱신 +- 기존 멀티에이전트(SubAgentTool, DelegateAgentTool, WorktreeManager) 및 에이전트 메모리(AgentTypeMemoryRepository, MemoryTool, /memory) 확인 → ✅ 반영 +- 35개 항목 중 **33개 ✅ 구현 완료**, 2개 📋 계획 (SDK, 3-Pane UI) + +### 30-B: IAgentMemoryRepository 인터페이스 추출 +- `IAgentMemoryRepository` 인터페이스 신규 — LoadMemoryAsync, SaveMemoryAsync, AppendLearnAsync, GetAgentTypes, DeleteMemory +- `AgentTypeMemoryRepository` → `IAgentMemoryRepository` 구현 +- `DelegateAgentTool` → 구체 클래스 대신 `IAgentMemoryRepository` 인터페이스에 의존 (DIP) + +### 30-C: HierarchicalMemoryService — 4-layer 메모리 통합 조회 +- 4단계 우선순위: Managed(%PROGRAMDATA%) → User(%APPDATA%) → Project(WorkFolder/AX.md + .ax/rules/) → Local(AX.local.md) +- `CollectAll()` — 모든 레벨의 MemoryFile 수집 +- `BuildMergedContext()` — 단일 문자열 병합 (maxChars 제한, 시스템 프롬프트 삽입용) +- `GetByLevel()` — 특정 레벨만 필터 조회 +- `ChatWindow.LoadProjectContext()` → HierarchicalMemoryService 우선 사용, 실패 시 레거시 폴백 + +### 30-D: DelegateAgentTool에 IConditionalTool 적용 +- AI 비활성화(`AiEnabled=false`) 시 delegate 도구 자동 비활성화 + +--- + +## Phase 31 — SDK 제어 프로토콜 (v2.2) ✅ 완료 + +> **목표**: CC의 JSON 스트리밍 SDK와 동등한 프로그래밍 방식 에이전트 제어 프로토콜. +> 외부 IDE, 스크립트, CI/CD에서 AX Agent를 stdin/stdout JSON으로 제어. +> +> **구현 완료** (2026-04-03): + +### 31-A: SDK 메시지 타입 정의 (`Services/Agent/Sdk/SdkProtocol.cs`) +- `SdkControlRequestType` — 9종: Initialize, UserMessage, SetPermissionMode, SetModel, Interrupt, GetContextUsage, RewindFiles, CanUseToolResponse, Terminate +- `SdkControlRequest` — Host → CLI 요청 (Type + Id + Payload) +- `SdkMessageType` — 11종: InitializeResult, AssistantToken, AssistantMessage, ToolUseStart, ToolProgress, ToolResult, SessionResult, HookEvent, CanUseTool, Notification, Error +- `SdkMessage` — CLI → Host 응답/이벤트 +- 데이터 클래스: SdkInitializePayload, SdkUserMessagePayload, SdkTokenData, SdkToolUseStartData, SdkToolResultData, SdkSessionResultData, SdkCanUseToolData, SdkErrorData + +### 31-B: AgentSdkServer (`Services/Agent/Sdk/AgentSdkServer.cs`) +- stdin/stdout 기반 양방향 JSON 스트리밍 서버 +- Initialize → 설정 적용 + 커스텀 에이전트 등록 + 훅 콜백 등록 +- UserMessage → AgentLoopService.RunAsync 실행 + 스트리밍 이벤트 전달 +- SetModel/SetPermissionMode → 런타임 설정 변경 +- Interrupt → 현재 턴 취소 +- GetContextUsage → 토큰 사용량 조회 +- AgentEvent → SdkMessage 자동 변환 (이벤트 구독) +- Thread-safe 출력 (SemaphoreSlim) + +### 31-C: CustomAgentDefinition + AgentTypeRegistry (`Services/Agent/Sdk/AgentTypeRegistry.cs`) +- `CustomAgentDefinition` — name, description, prompt, model, allowedTools, disallowedTools, maxTurns, permissionMode +- `AgentTypeRegistry` — CRUD + 목록 조회, Initialize 시 등록 + +### 31-D: SdkHookCallbackHandler (`Services/Agent/Sdk/SdkHookCallbackHandler.cs`) +- 도구 사용 허가 요청 → Host로 CanUseTool 전송 → 30초 타임아웃 대기 → Allow/Deny +- 훅 이벤트 알림 → 등록된 이벤트만 Host에 전달 +- TaskCompletionSource 기반 비동기 응답 대기 + +--- + +## Phase 32 — 3-Pane Claude.ai UI 기반 구조 (v2.3) ✅ 완료 + +> **목표**: CC의 Claude.ai + Codex 레이아웃과 동등한 3-Pane UI 구조를 수립. +> 새 UserControl 컴포넌트 4종 + ChatWindow 통합. +> +> **구현 완료** (2026-04-03): + +### 32-A: AgentSettingsPanel (`Views/Controls/AgentSettingsPanel.xaml/.cs`) +- 우측 슬라이드인 설정 패널 (TranslateTransform X 애니메이션 200ms/150ms) +- **모델 & 서비스**: LLM 서비스 선택, 모델 선택, API 엔드포인트 입력 +- **에이전트 동작**: 최대 반복 횟수(Slider), 오류 재시도(Slider), 병렬 도구 실행(Toggle) +- **탭 전용 설정**: Cowork(검증 강제) / Code(LSP, 코드 검증) 자동 분기 +- **도구 관리**: 등록된 모든 도구의 개별 Toggle 동적 생성 +- **고급**: 자동 컴팩션 임계치(Slider), 프로젝트 규칙, 개발자 모드 +- 설정 변경 즉시 저장 (`SettingsService.Save()`) + +### 32-B: AgentSidebarView (`Views/Controls/AgentSidebarView.xaml/.cs`) +- Claude.ai 스타일 좌측 사이드바 (260px, 접기 시 48px 애니메이션) +- 탭 세그먼트 (Chat|Cowork|Code) — AccentColor 배경 강조 +- 새 대화 버튼, 검색 필드 +- 날짜 그룹별 대화 이력 (오늘/어제/이전 7일/30일) +- 호버 효과, 대화 선택/삭제 이벤트 + +### 32-C: AgentSessionHeaderBar (`Views/Controls/AgentSessionHeaderBar.xaml/.cs`) +- Codex 스타일 세션 헤더 바 (42px) +- 모델 칩 (클릭 → 모델 변경), Plan 칩 (3-state 순환), 권한 칩 (4-state 순환) +- 설정 패널 토글 버튼 +- 모든 칩: Border + MouseLeftButtonUp + 호버 효과 (CLAUDE.md 원칙 준수) + +### 32-D: AgentInputArea (`Views/Controls/AgentInputArea.xaml/.cs`) +- Claude.ai 스타일 입력 영역 +- 상단 툴바: @ 멘션 / / 스킬 / 첨부 버튼 +- 멀티라인 TextBox (40~200px 자동 확장, Ctrl+Enter 전송) +- 하단 칩 열: 모델명, 권한, Plan 상태 표시 +- 전송/중단 버튼 전환 (스트리밍 상태 기반) +- 첨부 파일 칩 (추가/제거) + +### 32-E: ChatWindow.xaml 3-Pane 통합 +- Grid Column 5 추가 (`SettingsPanelColumn`, Auto) +- `AgentSettingsPanel` 배치 — Shift+설정 버튼 클릭으로 토글 +- `xmlns:ctrl` 네임스페이스 등록 +- 기존 UI 완전 호환 유지 (기존 사이드바/메인 영역 변경 없음) + +--- + +## Phase 33 — 코드 품질 리팩터링 (v2.3) ✅ 완료 + +> **목표**: Claude Code 동등 수준의 코드 품질 달성. 기능 파라티가 아닌 구조적 품질 파라티. +> AgentLoopService (925줄 RunAsync, 매직 넘버, 레이스 컨디션) + ChatWindow.xaml.cs (176건 브러시 중복, 46건 폰트 중복) 정리. + +### 33-A: AgentLoopService — 매직 넘버 상수화 +- `Defaults` 내부 정적 클래스 신설 (16개 상수) +- MaxIterations, MaxRetryOnError, MaxTestFixIterations, MaxPlanRegenerationRetries 등 +- ToolCallThresholdForExpansion, ContextCompressionTargetRatio, AutoCompactThresholdPercent +- QueryNameMaxLength, QueryTitleMaxLength, ThinkingTextMaxLength, VerificationSummaryMaxLength 등 + +### 33-B: AgentLoopService — RunAsync 분해 (ProcessSingleToolCallAsync 추출) +- `ProcessSingleToolCallAsync()` 메서드로 단일 도구 실행 로직 약 250줄 추출 +- `ToolExecutionState` 클래스: 루프 상태 공유 (카운터, 통계, 플랜 메타데이터) +- `ToolCallAction` enum: Continue/Break/Return 루프 제어 +- `RunToolHooksAsync()` 헬퍼: Pre/Post 훅 실행 통합 (중복 코드 제거) +- RunAsync: 925줄 → 약 680줄 (약 27% 감소) + +### 33-C: AutoCompactMonitor + ContextCondenser 통합 +- 기존: 별도 실행되어 이중 압축 가능성 +- 통합: `!condensed` 가드로 단일 흐름 보장 +- 1단계: ContextCondenser 기본 압축 → 2단계: AutoCompactMonitor 임계치 기반 적극적 압축 + +### 33-D: SessionManager DI 기반 개선 +- 기존: `new SessionManager()` + `_ = SaveSessionAsync()` fire-and-forget +- 개선: 생성자 주입 (`SessionManager? sessionManager = null`) + `await` + 에러 로깅 + +### 33-E: ChatWindow — ThemeResourceHelper 통합 적용 +- `ThemeResourceHelper` 정적 헬퍼 (Phase 32에서 생성) 실제 적용 +- `TryFindResource("XXX") as Brush ?? Brushes.YYY` 패턴 ~162건 → `ThemeResourceHelper.Primary(this)` 등으로 교체 +- `new FontFamily("Segoe MDL2 Assets")` 46건 → `ThemeResourceHelper.SegoeMdl2` 캐시 참조로 교체 + +### 33-F: ActiveTab 레이스 컨디션 + 에러 핸들링 정리 +- `activeTabSnapshot` 캡처 — RunAsync 진입 시 스냅샷, 루프 전체에서 일관 사용 +- `BuildContext(tabOverride)` — 스냅샷 기반 컨텍스트 생성 +- RunPostToolVerificationAsync: `ActiveTab` → `context.ActiveTab` 참조 +- ExecuteToolsInParallelAsync: 감사 로그 `ActiveTab` → `context.ActiveTab` +- bare `catch {}` 5건 → `catch (Exception ex) { LogService.Warn(...) }` 패턴으로 교체 +- bare `catch { break; }` → 오류 메시지 로깅 추가 + +--- + +## Phase 34 — ChatWindow God Class 분해 (v2.3) ✅ 완료 + +> **목표**: 10,372줄 ChatWindow.xaml.cs의 구조적 개선. 중복 제거, 대형 메서드 분해, 헬퍼 추출. + +### 34-A: SendMessageAsync Cowork/Code 중복 제거 +- 기존: Cowork(35줄)과 Code(35줄) 블록이 거의 동일 — DRY 위반 +- `RunAgentLoopAsync(tab, sendMessages, ct)` 단일 메서드로 통합 (~70줄 → ~40줄) +- 탭별 시스템 프롬프트 분기, 완료 알림 탭별 라벨 통합 + +### 34-B: ThemeResourceHelper 완전 적용 +- 잔여 14건 `TryFindResource` 교체 (HintBackground, HintText, SeparatorColor) +- ThemeResourceHelper에 `Hint()`, `HintFg()`, `Separator()` 메서드 추가 +- **TryFindResource 잔여: 0건** (전량 ThemeResourceHelper로 이전 완료) +- `new FontFamily("Consolas")` 8건 → `ThemeResourceHelper.Consolas` 캐시 참조 + +### 34-C: PopupMenuHelper 정적 헬퍼 생성 (`Views/PopupMenuHelper.cs`) +- ChatWindow에서 6회 이상 반복되는 `Popup + Border + StackPanel + DropShadow` 패턴 통합 +- `Create(target, owner, ...)` — 테마 적용된 팝업 메뉴 구조 생성 +- `MenuItem(text, fg, hoverBg, onClick, isChecked, icon)` — 메뉴 항목 생성 +- `Separator()`, `SectionHeader()` — 구분선/섹션 제목 +- 기존 팝업 메서드들의 점진적 마이그레이션 기반 확보 + +### 34-D: AgentLoopService 잔여 정리 +- 마지막 bare `catch {}` → `catch (Exception)` + 주석 명시 (document_plan JSON 파싱) + +--- + +## Phase 35 — 코드 품질 심층 정리 (v2.3) ✅ 완료 + +> **목표**: 전체 코드베이스의 bare catch, 하드코딩 색상, 서비스 로케이터, 체인 액세스 패턴을 체계적으로 정리. + +### 35-A: Bare catch 전량 정리 (109개 파일) +- `catch { }` 및 `catch { return X; }` 등 **모든 bare catch** → `catch (Exception)` + 상황별 주석 +- 전체 코드베이스 109개 .cs 파일에 PowerShell 일괄 치환 적용 +- 빈 catch, return 포함 catch, 값 할당 catch 등 모든 변형 포함 + +### 35-B: ColorConverter.ConvertFromString 헬퍼 추출 +- `ThemeResourceHelper.HexBrush(hex)` / `HexColor(hex)` 정적 메서드 추가 +- ChatWindow.xaml.cs 47건 `new SolidColorBrush((Color)ColorConverter.ConvertFromString(...))` → `ThemeResourceHelper.HexBrush(...)` 일괄 치환 +- SettingsWindow, ShortcutHelpWindow, HelpDetailWindow, StatisticsViewModel 등 7개 추가 파일 34건 치환 +- 총 **81건** 장황한 색상 변환 패턴 제거 + +### 35-C: ChatWindow `_settings.Settings.Llm` 체인 액세스 캐싱 +- `private LlmSettings Llm => _settings.Settings.Llm;` 편의 프로퍼티 추가 +- 92개 `_settings.Settings.Llm.` 체인 → `Llm.` 단축 치환 +- 가독성 향상 + 향후 리팩터링 시 단일 변경 지점 확보 + +### 35-D: AgentContext.Settings 주입 — 서비스 로케이터 제거 +- `AgentContext`에 `Settings` (AppSettings?) + `Llm` (LlmSettings?) 프로퍼티 추가 +- `AgentLoopService.BuildContext()`에서 Settings 주입 +- 에이전트 도구 11개 파일의 `Application.Current as App` 서비스 로케이터 패턴 제거: + - BuildRunTool, CodeSearchTool, CodeReviewTool, MemoryTool, DocumentPlannerTool, + HttpTool, LspTool, SkillManagerTool, SubAgentTool, SnippetRunnerTool, TestLoopTool +- `context.Llm?.X` 패턴으로 교체 — DIP(의존성 역전 원칙) 준수 + +--- + +## Phase 36 — 서비스 로케이터 제거 + PopupMenuHelper 적용 (v2.3) ✅ 완료 + +> **목표**: `Application.Current as App` 서비스 로케이터 패턴을 전체 코드베이스에서 제거하고, PopupMenuHelper를 실제 팝업 생성 코드에 적용. + +### 36-A: `Application.Current as App` → `CurrentApp` 정적 프로퍼티 일원화 +- SettingsWindow (17건), ChatWindow (4건), 기타 12개 파일에 `private static App? CurrentApp` 프로퍼티 추가 +- 모든 인라인 `Application.Current as App` 호출을 `CurrentApp`으로 교체 +- ChatWindow의 설정 접근은 기존 `Llm` 프로퍼티 + `_settings.Save()` 패턴으로 직접 대체 +- **39건 → 0건** (프로퍼티 정의 제외) 서비스 로케이터 인라인 호출 제거 + +### 36-B: PopupMenuHelper 실제 적용 (ChatWindow 3개 팝업) +- `BtnCategoryDrop_Click` — `Popup+Border+StackPanel+DropShadow` 30줄 → `PopupMenuHelper.Create()` 2줄 +- `ShowConversationMenu` — 팝업 구조 + `CreateMenuItem` 로컬 함수 80줄 → `PopupMenuHelper.Create()` + `PopupMenuHelper.MenuItem()` 래핑 10줄 +- `ShowFileTreeContextMenu` — 팝업 구조 + `AddItem`/`AddSep` 로컬 함수 60줄 → `PopupMenuHelper` 대체 5줄 +- 모델 선택 팝업 (`BtnModelSelector`) — 팝업 구조 35줄 → `PopupMenuHelper.Create()` 1줄 (커스텀 애니메이션 항목은 유지) +- ChatWindow: **10,353줄 → 10,184줄** (169줄 감소) + +--- + +## Phase 37 — ChatWindow God Class 파셜 클래스 분할 (v2.3) ✅ 완료 + +> **목표**: 10,184줄 ChatWindow.xaml.cs를 7개 파셜 클래스 파일로 분할하여 메인 파일을 4,767줄로 축소 (53.2% 감소). + +### 분할 결과 + +| # | 파일명 | 줄 수 | 추출 내용 | +|---|--------|-------|----------| +| 1 | `ChatWindow.MessageRendering.cs` | 522 | 메시지 렌더링, 체크 아이콘, 액션 버튼 | +| 2 | `ChatWindow.SlashCommands.cs` | 579 | 슬래시 명령 팝업, 드래그앤드롭 AI 액션 | +| 3 | `ChatWindow.AgentSupport.cs` | 475 | 에이전트 루프, 시스템 프롬프트, 워크플로우 | +| 4 | `ChatWindow.TaskDecomposition.cs` | 1,170 | Plan UI, Diff 뷰, 진행률, 이벤트 배너 | +| 5 | `ChatWindow.Presets.cs` | 1,280 | 주제 버튼, 프리셋 관리, 하단바, 설정 토글 | +| 6 | `ChatWindow.ModelSelector.cs` | 395 | 모델 선택, 프롬프트 템플릿, 대화 관리 | +| 7 | `ChatWindow.PreviewAndFiles.cs` | 1,105 | 미리보기 패널, 진행률 바, 파일 탐색기 | +| — | **ChatWindow.xaml.cs (메인)** | **4,767** | 생성자, 탭 전환, 전송, 대화 목록, 권한 등 | + +### 핵심 성과 +- **메인 파일**: 10,184줄 → 4,767줄 (**53.2% 감소**) +- **총 코드**: 10,293줄 (리다이렉트 주석 + 파셜 파일 헤더 오버헤드 ~1%) +- **빌드**: 경고 0, 오류 0 +- **각 파셜 파일**: 독립적 섹션으로 응집도 높은 메서드 그룹 +- **필드 이동**: 각 섹션에 속하는 필드를 함께 이동하여 관련 코드 근접 배치 + +--- + +최종 업데이트: 2026-04-03 (Phase 22~37 구현 완료 — CC 동등성 37/37 + 코드 품질 리팩터링 5차) + diff --git a/docs/PROMPT_CARD_GUIDE.md b/docs/PROMPT_CARD_GUIDE.md new file mode 100644 index 0000000..2b01940 --- /dev/null +++ b/docs/PROMPT_CARD_GUIDE.md @@ -0,0 +1,54 @@ +# 프롬프트 카드 설정 가이드 (개발자 전용) + +## 개요 +새 대화 화면의 프롬프트 카드는 **개발자가 미리 설정한 시스템 프롬프트**를 통해 +AI의 역할과 응답 스타일을 정의합니다. 사용자는 카드를 클릭하면 해당 모드가 자동 적용되고, +입력란에 안내 문구가 표시되어 내용을 입력한 후 전송합니다. + +## 수정 방법 + +### 파일 위치 +``` +src/AxCopilot/Views/ChatWindow.xaml +``` + +### Tag 형식 +``` +Tag="시스템 프롬프트 내용||입력란 안내 문구" +``` + +- `||` 구분자 앞: AI에게 전달되는 시스템 프롬프트 (사용자에게 노출되지 않음) +- `||` 구분자 뒤: 사용자 입력란에 표시될 placeholder 안내 문구 + +### 예시 +```xml + + + + + + + +``` + +### 카드 추가 +`` 안에 위 형식의 `` 블록을 추가합니다. +카드 수가 3개를 초과하면 `Columns` 값을 조정하세요. + +### 아이콘 +Segoe MDL2 Assets 폰트 코드를 사용합니다. +- 참고: https://learn.microsoft.com/en-us/windows/apps/design/style/segoe-ui-symbol-font + +## 동작 흐름 +1. 사용자가 카드 클릭 +2. 새 대화 생성 → `SystemCommand`에 시스템 프롬프트 자동 삽입 +3. 입력란에 placeholder 안내 문구 표시 (선택 상태) +4. 사용자가 내용 입력 후 전송 +5. AI가 시스템 프롬프트 역할에 맞게 응답 diff --git a/docs/SEMINAR.md b/docs/SEMINAR.md new file mode 100644 index 0000000..f2e5974 --- /dev/null +++ b/docs/SEMINAR.md @@ -0,0 +1,345 @@ +# AX Copilot 기술 세미나 +### 사내 AI 생산성 플랫폼 — 아키텍처와 핵심 기술 + +> **발표 대상**: 사내 개발팀 / AI 연구팀 +> **버전**: v1.6.1 기준 (2026년 3월) +> **발표자**: AX연구소 AI팀 + +--- + +## 1. AX Copilot 이란? + +> **"Alt+Space 한 번으로 모든 업무 도구에 접근하는 사내 전용 AI 플랫폼"** + +### 세 가지 제품으로 구성 + +| 제품명 | 역할 | 주요 기능 | +|--------|------|-----------| +| **AX Commander** | 글로벌 런처 | 명령 검색, 도구 실행, 자동화 | +| **AX Agent** | AI 대화 엔진 | Chat / Cowork / Code 3탭 | +| **AX Copilot** | 통합 플랫폼 | 위 두 제품 + 설정·보안 통합 | + +### 왜 데스크탑 앱인가? — 2026년 AI 도구의 방향 + +> **"브라우저 안의 AI"에서 "내 PC에서 직접 움직이는 AI"로 전환 중** + +2024~2025년 AI 서비스들은 웹 채팅(ChatGPT, Claude.ai)이 주류였지만, +2026년 현재 **주요 AI 코딩 서비스가 모두 데스크탑 앱/터미널 네이티브**로 전환했습니다: + +| 서비스 | 형태 | 로컬 파일 접근 | +|--------|------|:------------:| +| **Claude Code** | 터미널 CLI (사용자 PC에서 직접 실행) | ✅ 파일 읽기/쓰기/실행 | +| **Cursor** | 데스크탑 IDE (Electron 기반) | ✅ 프로젝트 전체 분석 | +| **Windsurf** | 데스크탑 IDE (VS Code 포크) | ✅ 48시간 자동 인덱싱 | +| **GitHub Copilot** | VS Code 확장 → 독립 에이전트 | ✅ 로컬 Git 연동 | +| **Raycast** | 데스크탑 런처 (macOS 네이티브) | ✅ 앱·파일·클립보드 통합 | + +**공통 패턴**: AI가 실제로 유용하려면 **사용자의 실제 파일을 읽고, 수정하고, 실행**해야 합니다. +웹 브라우저에서는 이것이 불가능하므로, 모든 서비스가 데스크탑/터미널로 내려왔습니다. + +**AX Copilot은 이 흐름의 정중앙에 위치합니다:** +- 🖥️ **데스크탑 네이티브** — WPF 앱이 OS 레벨에서 파일·프로세스·클립보드에 직접 접근 +- ⌨️ **글로벌 런처** — Alt+Space 한 번으로 어떤 앱 위에서든 즉시 호출 +- 🤖 **에이전트 도구 52개** — 파일 읽기/쓰기, 코드 실행, Git, 문서 생성을 AI가 직접 수행 + +### 핵심 설계 원칙 + +- 🏢 **사내 전용** — 외부 서버 의존 없음, 텔레메트리 없음 +- 💾 **로컬 우선** — 모든 데이터는 `%APPDATA%\AxCopilot\`에 저장 +- 🔒 **보안** — AES-256 설정 암호화, 역공학 방지 +- 📦 **인스톨러 150MB 이하** — .NET 8 런타임 내장 단일 배포 + +--- + +## 2. 전체 아키텍처 + +``` +┌─────────────────────────────────────────────┐ +│ App.xaml.cs (진입점) │ +│ 서비스 초기화 · 트레이 아이콘 · 전역 훅 관리 │ +└────────┬──────────────┬──────────────────────┘ + │ │ +┌────────▼───────┐ ┌───▼──────────────────────┐ +│ AX Commander │ │ AX Agent │ +│ (런처 WPF) │ │ (Chat / Cowork / Code) │ +└────────┬───────┘ └───┬──────────────────────┘ + │ │ +┌────────▼──────────────▼──────────────────────┐ +│ 공통 서비스 계층 │ +│ SettingsService · LogService · IndexService │ +│ CryptoService · McpClientService · LLMRouter │ +└──────────────────────────────────────────────┘ +``` + +### 기술 스택 + +| 계층 | 기술 | +|------|------| +| UI | WPF (.NET 8), WinForms (트레이) | +| 언어 | C# 12, XAML | +| 데이터 | JSON 직렬화 (System.Text.Json) | +| 검색 | TF-IDF + SQLite (코드), 퍼지 엔진 (런처) | +| AI | Ollama·vLLM (사내), Gemini·Claude (외부 옵션) | +| 프로토콜 | MCP (Model Context Protocol) | + +--- + +## 3. AX Commander — 런처 기술 + +### 입력 → 결과 처리 파이프라인 + +``` +사용자 입력 + │ + ▼ +CommandResolver (프리픽스 라우터) + │ + ├── 프리픽스 매칭 ──► 44개 핸들러 실행 + │ = 계산기 ; 스니펫 # 클립보드 + │ @ URL 별칭 ~ 폴더 $ 클립보드 변환 + │ ! 워크스페이스 / 시스템 명령 + │ color·date·emoji·port·json·encode … + │ + └── 프리픽스 없음 ──► FuzzyEngine + (한국어 초성 + 퍼지 매칭) +``` + +### FuzzyEngine 핵심 알고리즘 + +``` +입력: "설정" + → 초성 추출: "ㅅㅈ" + → LCS(최장 공통 부분 수열) 기반 점수 계산 + → 사용 빈도 가중치 적용 (UsageRankingService) + → 정렬 후 결과 반환 +``` + +### 주요 핸들러 카탈로그 (44종) + +| 카테고리 | 핸들러 | 기능 | +|----------|--------|------| +| 개발 도구 | json, encode, port, color | JSON 검증, 인코딩, 포트 조회, 색상 변환 | +| 파일/시스템 | recent, rename, scaffold, svc | 최근 파일, 일괄 이름변경, 프로젝트 생성 | +| 생산성 | note, snippet, date, stats | 메모, 스니펫, 날짜 계산, 텍스트 분석 | +| UI/화면 | cap, snap, pick | 화면 캡처, 창 배치, 색상 추출 | +| 워크스페이스 | !, workspace | 22개 레이아웃, 프로파일 저장/복원 | + +--- + +## 4. AX Agent — AI 대화 엔진 + +### 에이전트 루프 (AgentLoopService) + +``` +사용자 메시지 + │ + ▼ +┌─────────────────────────────┐ +│ 에이전트 루프 (반복) │ +│ │ +│ 1. LLM API 호출 │ +│ 2. 응답 파싱 │ +│ 3. 도구 호출 감지 │ +│ 4. 도구 실행 │◄──── 52개 도구 +│ 5. 결과 → 컨텍스트 추가 │ +│ 6. 목표 달성? → 종료 │ +└─────────────────────────────┘ + │ + ▼ +최종 응답 스트리밍 출력 (SSE) +``` + +### 3개 대화 탭의 특성 + +| 탭 | 목적 | 시스템 프롬프트 | 주요 도구 | +|----|------|----------------|-----------| +| **Chat** | 일반 AI 대화 | 범용 어시스턴트 | 기본 도구 | +| **Cowork** | 업무 자동화 | 20개 프리셋 특화 | 문서·데이터 도구 | +| **Code** | 개발 지원 | 코딩 에이전트 | LSP·Git·빌드 도구 | + +### 컨텍스트 관리 + +- **토큰 추정**: `TokenEstimator` — CJK 문자 가중치 적용, 실시간 비용 표시 +- **대화 압축**: 컨텍스트 초과 시 `ContextCondenser`로 요약 → 재압축 +- **대화 분기**: `ParentId` 기반 트리 구조, 우클릭 "여기서 분기" + +--- + +## 5. 도구 생태계 — 52개 에이전트 도구 + +### 도구 카테고리 + +``` +파일·코드 (18개) 문서·데이터 (12개) + file_read/write document_read/write + directory_list pptx_create + search_files xlsx_analyze + file_watch data_pivot + lsp_goto_definition template_render + lsp_find_references text_summarize + search_codebase (TF-IDF) image_analyze + +개발 (12개) 시스템·프로세스 (10개) + git_status/diff/commit process_run + build_run environment_read + test_generate/run clipboard_read/write + code_review screen_capture + spawn_agent notification_show +``` + +### 스킬 시스템 (29개 내장 슬래시 명령) + +``` +/daily-standup /email-draft /code-review +/translate /security-audit /prd-generator +/weekly-report /refactor /gen-test +/changelog /sql-report /perf-audit … +``` + +- `*.skill.md` 마크다운 파일로 정의 (YAML 프론트매터) +- `%APPDATA%\AxCopilot\skills\` 외부 폴더로 재빌드 없이 추가 +- Python/Node.js 런타임 감지 → 고급 스킬 자동 활성화 + +--- + +## 6. 코드 인텔리전스 기술 + +### LSP (Language Server Protocol) 연동 + +``` +에이전트 LSP 서버 + │ │ + ├─ lsp_goto_definition ──► OmniSharp (C#) + ├─ lsp_find_references ──► typescript-language-server + └─ lsp_symbols ──► pyright (Python) +``` + +**효과**: 텍스트 검색이 아닌 의미 기반 코드 탐색 → 수정 정확도 대폭 향상 + +### 시맨틱 코드 검색 (TF-IDF 엔진) + +``` +1. 프로젝트 파일 인덱싱 + └── 바이그램 토크나이저 + 스톱워드 제거 + └── SQLite 영속 저장 (증분 업데이트) + +2. 질의 시 관련 파일 자동 검색 + └── TF-IDF 점수 계산 → 상위 N개 반환 + └── 에이전트가 자동으로 관련 코드 읽기 +``` + +### MCP (Model Context Protocol) 클라이언트 + +- `stdio` + `JSON-RPC 2.0` 표준 구현 +- 외부 MCP 서버의 도구를 에이전트 도구로 자동 래핑 +- 사내 전용 MCP 서버만 연결 허용 + +--- + +## 7. 보안 & 사내 환경 설계 + +### 다층 보안 구조 + +``` +레이어 1: 설정 암호화 + └── settings.json → AES-256-GCM → settings.dat + └── PC별 DPAPI 키 조합 (이식 불가) + +레이어 2: 역공학 방지 (AntiTamper) + └── 디버거 감지, 리버싱 도구 프로세스 감지 + └── 사내 IP 대역 예외 처리 (개발 환경) + +레이어 3: 보안 감사 로그 + └── AuditLogService — 모든 도구 호출 JSON 영속화 + └── 개발자 모드에서 감사 로그 폴더 열기 + +레이어 4: 실행 범위 제한 + └── 외부 HTTP 호출 금지 (LLM API 제외) + └── 원격 코드 실행 금지 + └── 텔레메트리 완전 차단 +``` + +### 모델 라우팅 전략 + +``` +질문 유형 분류 + │ + ├── 코딩/기술 → 코드 특화 모델 (사내 vLLM) + ├── 번역/요약 → 경량 모델 (Ollama) + └── 복잡 분석 → 대형 모델 (Gemini Pro / Claude) + +폴백 처리: 모델 오류 시 FallbackModels 순차 시도 +``` + +--- + +## 8. Phase별 개발 현황 + +### 완료된 주요 Phase + +| Phase | 버전 | 핵심 성과 | +|-------|------|-----------| +| 2.5~7 | v1.1~1.2 | 에이전트 루프, 21개 도구, 마크다운 렌더러 | +| 8 | v1.5.0 | MCP 클라이언트, 모델 폴백, 대화 분기, 토큰 관리 | +| 9 | v1.5.0 | LSP 연동, 병렬 에이전트, 코드 시맨틱 검색, 이벤트 트리거 | +| 10~11 | v1.5.0 | Auto Router, 에이전트 메모리, 스킬 시스템, AI 코드 리뷰 | +| 15 | v1.6.0 | 멀티패스 문서 생성, 42→52개 도구, 29개 내장 스킬 | +| 16 | v1.7.0 | 플랜 모드, 병렬 도구 실행, 프로젝트 규칙 시스템 | + +### 현재 규모 (v1.6.1) + +``` +에이전트 도구: 52개 +내장 스킬: 29개 +코워크 프리셋: 20개 +지원 LLM: 4종 (Ollama · vLLM · Gemini · Claude) +런처 핸들러: 44개 +지원 테마: 10종 +``` + +--- + +## 9. 차기 개발 방향 (v1.8~2.0) + +### 경쟁 서비스 대비 로드맵 + +| 기능 | 경쟁 서비스 | AX Copilot 계획 | +|------|-------------|-----------------| +| 자기 성찰 루프 | Claude Code Reflexion | **v1.8** 자기 성찰 서비스 | +| 영속 작업 기억 | Windsurf Memory | **v1.8** Working Memory | +| 멀티파일 Diff | Cursor diff view | **v1.8** 통합 Diff UI | +| HTTP+SSE MCP | Claude Code 원격 | **v1.8** MCP HTTP 전송 | +| 에이전트 팀 | GitHub Copilot Workspace | **v2.0** 다중 에이전트 | +| 플러그인 갤러리 | Raycast Store | **v2.0** 로컬 레지스트리 | + +### 사내 환경 특화 원칙 유지 + +- ✅ 외부 서버 의존 없음 → 온프레미스 LLM 우선 +- ✅ 인스톨러 150MB 이하 유지 +- ✅ 플러그인 로컬 zip 설치만 허용 +- ✅ 모든 데이터 로컬 저장 + +--- + +## 10. 정리 및 Q&A + +### AX Copilot의 기술적 차별점 + +``` +1. 완전 오프라인 동작 가능 (사내 Ollama/vLLM) +2. 52개 에이전트 도구 + 29개 슬래시 스킬 +3. LSP 기반 실제 코드 이해 (텍스트 검색 수준 초월) +4. MCP 표준으로 사내 서버 자유 연결 +5. AES-256 + DPAPI 이중 암호화 설정 보안 +6. 전역 핫키 Alt+Space — 어떤 앱에서도 즉시 호출 +``` + +### 향후 기여 방법 + +- **스킬 추가**: `*.skill.md` 파일 작성 → `%APPDATA%\AxCopilot\skills\` 배치 +- **MCP 서버**: 사내 도구를 MCP 서버로 노출 → AX Copilot에서 자동 사용 +- **플러그인**: `IActionHandler` 인터페이스 구현 → DLL 배치 + +--- + +*발표 자료 작성: AX연구소 AI팀 | 문의: 내부 메신저* diff --git a/docs/SEMINAR_AGENT_LOOP.md b/docs/SEMINAR_AGENT_LOOP.md new file mode 100644 index 0000000..c51352e --- /dev/null +++ b/docs/SEMINAR_AGENT_LOOP.md @@ -0,0 +1,298 @@ +# 에이전트 루프 아키텍처 — 워크플로우 비교 분석 + +> **대상**: 기술 임원 · 개발 리더 +> **초점**: 에이전트 코딩 서비스의 핵심 워크플로우 구조와 품질 보증 전략 +> **작성일**: 2026-03-31 + +--- + +## 1. 에이전트 루프란? + +AI 코딩/문서 생성 서비스의 핵심 엔진은 **에이전트 루프**입니다. + +``` +사용자 요청 → [LLM 판단] → [도구 실행] → [결과 관찰] → [LLM 재판단] → ... → 최종 응답 +``` + +이 반복(iteration)을 **얼마나 지능적으로, 얼마나 품질 있게 수행하느냐**가 서비스 경쟁력을 결정합니다. + +--- + +## 2. 업계 주요 서비스 워크플로우 비교 + +### 2-1. OpenHands (오픈소스, ICLR 2025) + +OpenHands는 CodeAct 논문 기반의 에이전트 프레임워크입니다. + +``` +┌─────────────────────────────────────────────────┐ +│ AgentController │ +│ │ +│ while budget > 0: │ +│ action = agent.step(state) ← 1 LLM 호출 │ +│ observation = runtime.run(action) ← 도구 실행│ +│ state.update(action, observation) │ +│ if action == AgentFinishAction: │ +│ break ← LLM이 "끝"이라 판단하면 종료 │ +│ │ +│ ⚠ 검증/검수 단계: 없음 │ +│ ⚠ 계획 생성: 없음 (LLM 자율 판단) │ +└─────────────────────────────────────────────────┘ +``` + +**핵심 특징**: +- **1 반복 = 1 LLM 호출 + 1 도구 실행** (고정) +- 계획(Plan) 없음 — LLM의 chain-of-thought에 의존 +- 검증(Review) 없음 — LLM이 알아서 다음 반복에서 확인할지 결정 +- 종료는 `AgentFinishAction` 반환으로 결정 (LLM 자율) +- **SecurityAnalyzer**: 실행 전 위험도 평가 (LOW/MEDIUM/HIGH) — 품질 검증이 아닌 **안전 게이트** + +**장점**: 단순, 빠름, 모델 무관 +**약점**: 문서 생성 후 검수 보장 없음, LLM이 "충분하다"고 판단하면 미완성 상태로 종료 + +### 2-2. Claude Code (Anthropic) + +``` +┌─────────────────────────────────────────────────┐ +│ Claude Code Agent Loop │ +│ │ +│ while true: │ +│ response = llm.call(messages) ← 1 LLM 호출 │ +│ if no tool_calls: │ +│ break ← 텍스트만 반환하면 종료 │ +│ for tool in tool_calls: │ +│ result = execute(tool) │ +│ messages.append(result) │ +│ │ +│ ⚠ 검증 단계: 없음 (시스템 프롬프트 권고만) │ +│ ⚠ 계획: SKILL.md 프롬프트로 유도 │ +└─────────────────────────────────────────────────┘ +``` + +**핵심 특징**: +- OpenHands와 동일한 구조 (1 반복 = 1 LLM 호출) +- 종료: 도구 호출이 없으면 종료 (OpenHands의 AgentFinishAction과 유사) +- 검증: 시스템 프롬프트에 "확인하라"고 작성 가능하나, **LLM이 무시할 수 있음** +- 차별점: SKILL.md 표준으로 도메인별 프롬프트 커스터마이징 + +### 2-3. Cursor / Windsurf / GitHub Copilot + +모두 동일한 **단일 LLM 호출 루프** 패턴: +- Cursor: Tab → Apply 기반, 에이전트 모드에서도 1호출/반복 +- Windsurf (Cascade): Flow 기반이지만 루프 구조는 동일 +- GitHub Copilot: 코드 완성 특화, 에이전트 모드는 Claude Code와 유사 + +**공통 약점**: **문서/코드 생성 후 "읽어서 확인"하는 아키텍처가 없음** + +--- + +## 3. 왜 검증 단계가 없을까? + +### 3-1. AgentFinishAction 문제 + +OpenHands는 LLM이 `AgentFinishAction`을 반환하면 루프가 종료됩니다. + +```python +# OpenHands의 종료 판단 +if isinstance(action, AgentFinishAction): + return # LLM이 "끝"이라고 하면 끝 +``` + +**문제**: LLM이 "파일을 생성했으니 끝"이라고 판단하면, **내용이 불완전해도 종료**됩니다. + +우리는 왜 AgentFinishAction을 사용하지 않는가? + +| 항목 | AgentFinishAction (OpenHands) | 도구 호출 없음 종료 (AX Copilot) | +|------|------------------------------|--------------------------------| +| 종료 판단 | LLM이 명시적으로 "finish" 액션 반환 | LLM이 텍스트만 반환 (도구 미호출) | +| 장점 | 명시적, 종료 이유 포함 가능 | 별도 액션 정의 불필요, 자연스러운 대화 흐름 | +| 단점 | finish 호출을 잊거나 잘못 호출 가능 | LLM이 도구를 부르지 않으면 의도치 않게 종료 | +| 검증 타이밍 | finish 전에 검증 삽입 가능 (미구현) | 도구 실행 후 즉시 검증 삽입 (구현 완료) | + +**핵심**: 둘 다 "LLM이 알아서 끝내라"는 구조이므로, **검증을 LLM에게 맡기면 생략될 수밖에 없습니다.** + +### 3-2. 시스템 프롬프트만으로는 부족 + +``` +시스템 프롬프트: "문서 작성 후 반드시 file_read로 결과물을 검토하세요" +``` + +이 지시를 LLM이 따를 확률: +- GPT-4/Claude: **~60-70%** (복잡한 작업에서 무시 경향) +- Gemini Flash: **~40-50%** (무료 모델에서 더 자주 생략) +- 로컬 모델 (Ollama): **~30%** (컨텍스트 길어지면 초기 지시 희석) + +→ **아키텍처 수준에서 강제해야 신뢰성 확보 가능** + +--- + +## 4. 검증 강제 아키텍처 (AX Copilot 구현) + +### 4-1. 기존 구조 (v1.7.0) + +``` +반복 1: LLM 호출 → "file_read로 현재 파일 확인하겠습니다" + 도구 실행: file_read → 파일 내용 반환 + +반복 2: LLM 호출 → "html_create로 보고서를 생성하겠습니다" + 도구 실행: html_create → "보고서.html 생성 완료" + +반복 3: LLM 호출 → "보고서가 완성되었습니다." (텍스트만 = 루프 종료) + ⚠ 생성된 파일을 읽어서 확인하지 않음! +``` + +### 4-2. 개선 구조 (v1.7.1 — 검증 강제) + +``` +반복 1: LLM 호출 → "file_read로 현재 파일 확인하겠습니다" + 도구 실행: file_read → 파일 내용 반환 + +반복 2: LLM 호출 → "html_create로 보고서를 생성하겠습니다" + 도구 실행: html_create → "보고서.html 생성 완료" + ┌──────────────────────────────────────────────┐ + │ ★ 검증 강제 (자동 삽입) │ + │ │ + │ 시스템: "생성된 파일을 file_read로 읽고 │ + │ 내용 완전성, 구조, 맞춤법을 확인하세요" │ + │ │ + │ LLM 호출 (검증 전용) │ + │ → file_read 실행 → 내용 확인 │ + │ → 문제 있으면 수정 도구 호출 │ + │ → 문제 없으면 "검증 완료" 보고 │ + └──────────────────────────────────────────────┘ + +반복 3: LLM 호출 → "보고서가 완성되었습니다." (검증 통과 후 종료) +``` + +### 4-3. 코드 흐름 (의사코드) + +```csharp +while (iteration < maxIterations) +{ + var blocks = await llm.SendWithToolsAsync(messages, tools); + + foreach (var call in toolCalls) + { + var result = await tool.ExecuteAsync(call); + messages.Add(CreateToolResult(result)); + + // ★ 검증 강제: 문서 생성 도구 실행 후 자동 삽입 + if (settings.EnablePostToolVerification + && IsDocumentCreationTool(call.ToolName) + && result.Success) + { + // 검증 전용 LLM 호출 (file_read 유도) + await RunPostToolVerificationAsync(messages, call, result); + iteration++; // 검증도 반복 횟수에 포함 + } + } + + if (no tool calls) break; // 텍스트만 = 종료 +} +``` + +--- + +## 5. 부족한 부분과 향후 개발 방향 + +### 5-1. 현재 부족한 영역 + +| 영역 | 현재 상태 | OpenHands 비교 | 개선 필요성 | +|------|----------|---------------|-----------| +| **Multi-Agent 위임** | ❌ 미구현 | ✅ AgentDelegateAction | 높음 — 복잡한 작업을 하위 에이전트에 분할 | +| **Event-Sourced State** | 부분 구현 (Events 컬렉션) | ✅ 불변 이벤트 스트림 | 중간 — 재실행/디버깅에 유용 | +| **SecurityAnalyzer** | Ask 모드 권한 확인 | ✅ 위험도 자동 분류 | 낮음 — 사내 환경에서 우선순위 낮음 | +| **CodeAct 통합 액션** | 도구별 분리 | ✅ bash+Python 통합 | 낮음 — 현재 도구 체계로 충분 | +| **검증 깊이** | 단일 검증 호출 | 해당 없음 | 중간 — 복수 기준별 검증 가능 | +| **검증 대상 확대** | 문서 생성 도구만 | 해당 없음 | 중간 — 코드 생성 후에도 검증 필요 | + +### 5-2. 향후 개발 계획 + +#### Phase A: 검증 고도화 (단기) + +| 기능 | 설명 | 예상 공수 | +|------|------|----------| +| 검증 기준 커스터마이징 | 설정에서 검증 체크리스트를 사용자가 편집 | 낮음 | +| 코드 검증 확대 | `script_create`, `file_edit` 후에도 검증 (구문 오류 검사) | 낮음 | +| 검증 결과 UI 표시 | 워크플로우 타임라인에 "✅ 검증 통과" / "⚠ 수정 발생" 배지 | 낮음 | +| 검증 통계 | 검증에서 문제 발견/수정된 비율 추적 | 낮음 | + +#### Phase B: 멀티에이전트 위임 (중기) + +OpenHands의 `AgentDelegateAction` 패턴을 참고하되, 사내 환경에 맞게: + +``` +[메인 에이전트] + ├── [리서치 에이전트] ← file_read, grep, folder_map 전담 + ├── [문서 에이전트] ← html_create, docx_create 전담 + └── [검증 에이전트] ← file_read + 품질 평가 전담 ← 검증 분리! +``` + +| 기능 | 설명 | 예상 공수 | +|------|------|----------| +| AgentDelegateAction | 하위 에이전트 위임 액션 정의 | 중간 | +| 에이전트별 도구 제한 | 리서치=읽기만, 문서=쓰기만 등 | 낮음 | +| 검증 에이전트 분리 | 생성과 검증을 다른 에이전트로 | 중간 | + +#### Phase C: Reflexion 패턴 (장기) + +Reflexion 논문(Shinn et al., 2023)의 자기 반성 패턴 강화: + +``` +실행 → 결과 → 자기 평가 → 반성 메모리 저장 → 다음 시도에 반영 +``` + +현재 Self-Reflection은 **오류 발생 시에만** 동작. 이를 **성공 시에도** 적용: +- "이 문서는 사용자 요구를 80% 충족. 미흡 점: 표가 누락됨" +- 반성 결과를 AgentMemory에 저장 → 같은 유형 작업 시 참고 + +--- + +## 6. 정리 + +### 핵심 메시지 + +``` +┌─────────────────────────────────────────────────────┐ +│ │ +│ 업계 모든 에이전트 루프는 "1반복 = 1 LLM 호출" │ +│ 검증(Review)을 강제하는 아키텍처는 어디에도 없었음 │ +│ │ +│ AX Copilot은 "검증 강제"를 아키텍처 수준에서 구현 │ +│ → 문서 품질 보증의 차별화 포인트 │ +│ │ +└─────────────────────────────────────────────────────┘ +``` + +### 비교 요약 + +| 항목 | OpenHands | Claude Code | AX Copilot | +|------|-----------|-------------|------------| +| 반복당 LLM 호출 | 1회 | 1회 | 1회 + 검증 1회 | +| 계획 생성 | ❌ | ❌ | ✅ PlanMode | +| 검증 강제 | ❌ | ❌ | ✅ PostToolVerification | +| 자기 반성 | ❌ | ❌ | ✅ Self-Reflection | +| 컨텍스트 압축 | ❌ | ❌ | ✅ ContextCondenser | +| 사용자 승인 | SecurityAnalyzer | 권한 프롬프트 | UserDecisionCallback | +| 진행률 추적 | ❌ | ❌ | ✅ TaskDecomposer | +| 피드백 학습 | ❌ | ❌ | ✅ FeedbackContext | + +### 워크플로우 전체 비교도 + +``` +OpenHands: + 요청 → [LLM] → [도구] → [LLM] → [도구] → [LLM: "끝"] → 응답 + ↑ 검증 없음 + +Claude Code: + 요청 → [LLM] → [도구] → [LLM] → [도구] → [LLM: 텍스트만] → 응답 + ↑ 검증 없음 + +AX Copilot (v1.7.1): + 요청 → [계획 LLM] → 승인 → [LLM] → [도구] → [★검증 LLM★] → [LLM] → 응답 + ↑ PlanMode ↑ 실행 ↑ 생성 ↑ 강제 확인 ↑ 완료 +``` + +--- + +*작성: AX Copilot 개발팀 · 2026-03-31* diff --git a/docs/SEMINAR_TREND.md b/docs/SEMINAR_TREND.md new file mode 100644 index 0000000..9ccbae0 --- /dev/null +++ b/docs/SEMINAR_TREND.md @@ -0,0 +1,585 @@ +# AI 에이전트 기술 동향 세미나 +### 2026년 3월 | 시장 조사 · 논문 분석 · 핵심 기술 해설 + +> **발표 대상**: 기술임원 +> **발표자**: AX연구소 AI팀 + +--- + +## 1. 시장 트렌드 — AI 코딩 도구의 현재 + +### 산업 전환: "웹 채팅" → "데스크탑 에이전트" + +2024년까지 AI는 브라우저 안의 채팅(ChatGPT, Claude.ai)이 주류였습니다. +2026년 현재, **모든 주요 서비스가 데스크탑/터미널 네이티브로 전환**했습니다. + +``` +2024 2025 2026 +────────────────────────────────────────────────────────────────── + 웹 채팅 시대 전환기 데스크탑 에이전트 시대 + ───────────── ────── ──────────────── + 코드를 복사해서 붙여넣기 Claude Code 출시 AI가 로컬 파일을 + 결과를 수동으로 적용 Cursor 에이전트 모드 직접 읽고, 쓰고, 실행 + 파일을 업로드/다운로드 Windsurf Cascade 빌드·테스트·Git 자동화 + 실행 환경과 완전 분리 GitHub Copilot Agent 이슈→코드→PR 자동화 +``` + +**왜 데스크탑인가?** + +| 웹 AI의 한계 | 데스크탑 AI의 해법 | +|-------------|-------------------| +| 코드를 복사해서 붙여넣기 | **프로젝트 전체를 AI가 직접 탐색** | +| 결과를 수동으로 적용 | **파일을 AI가 직접 수정** | +| 별도 브라우저 탭 전환 | **런처/단축키로 즉시 호출** | +| 실행 환경과 분리 | **빌드·테스트·Git을 AI가 직접 실행** | + +> **핵심**: AI가 실제 생산성을 높이려면 **사용자의 실제 데이터에 직접 접근**해야 합니다. + +### 시장 규모와 채택률 + +- 개발자의 **85%가 AI 코딩 도구를 일상 사용** (GitHub Survey 2026) +- 단순 자동완성 → **자율 에이전트**로 빠르게 전환 중 +- 주요 플레이어 간 **에이전트 지능 경쟁**이 핵심 전장 + +--- + +## 2. 주요 서비스 현황과 포지셔닝 + +### 서비스별 포지션 맵 + +``` + 고수준 자율성 + │ + Claude Code ● ● Cursor + │ + ● ● Windsurf + │ + GitHub Copilot ●│ + │ + ─────────────────── │ ────────────────────── + 터미널 기반 │ IDE 통합 + │ + Raycast ●│ ● Flow Launcher + │ + 단순 도구 +``` + +### Claude Code (Anthropic) — 터미널 에이전트의 기준 + +| 핵심 기능 | 설명 | +|-----------|------| +| **SWE-bench 80.8%** | 업계 최고 소프트웨어 엔지니어링 벤치마크 달성 | +| **서브에이전트 10팀 동시** | 복잡한 작업을 10개 병렬 에이전트로 분할 실행 | +| **Plan Mode** | 실행 전 계획 수립 → 사용자 승인 → 실행. 실수를 사전에 방지 | +| **MCP 프로토콜** | Model Context Protocol — 외부 도구 연결 표준 직접 제정 | +| **Skills** | 마크다운 기반 재사용 워크플로우 정의 | +| **Hooks** | 도구 실행 전후에 사용자 스크립트를 자동 실행 | +| **1M 토큰 컨텍스트** | Opus 4.6 모델로 대규모 코드베이스 전체를 한 번에 분석 | + +### Cursor — IDE 통합 에이전트의 선두 + +| 핵심 기능 | 설명 | +|-----------|------| +| **멀티파일 에이전트** | 프로젝트 전체를 이해하고 여러 파일을 동시 수정 | +| **백그라운드 에이전트 8개** | 클라우드에서 8개 에이전트를 병렬 실행하여 작업 분산 | +| **Tab 자동완성** | 다음 코드 흐름을 예측 → Tab 한 번으로 승인 | +| **프로젝트 규칙** | `.cursorrules` 파일로 프로젝트별 AI 행동을 커스터마이징 | +| **멀티파일 Diff** | 변경된 모든 파일을 한 화면에서 파일별/헌크별 승인/거부 | +| **러닝 메모리** | 사용자 피드백 기반으로 코딩 스타일을 자동 학습 | +| **LSP 통합** | 언어 서버 프로토콜로 코드 구조를 의미 기반 분석 | + +### GitHub Copilot — 개발 파이프라인 자동화 + +| 핵심 기능 | 설명 | +|-----------|------| +| **코딩 에이전트** | 이슈 할당 → 코드 작성 → PR 생성 → 테스트까지 자동 파이프라인 | +| **자동 PR 생성** | 이슈 번호만 할당하면 코드 변경 + PR을 자동 생성 | +| **반복 테스트-수정** | 테스트 실패 → 원인 분석 → 코드 수정 → 재실행을 자동 반복 | +| **Multi-Agent** | 코드리뷰·테스트·문서 작성을 각각 전담하는 에이전트 협업 | + +### Windsurf — 컨텍스트 지능 + +| 핵심 기능 | 설명 | +|-----------|------| +| **Cascade** | 복잡한 작업을 단계별로 분해하여 멀티스텝 에이전트가 실행 | +| **48시간 자동 인덱싱** | 코드베이스를 48시간 주기로 자동 분석, 관련 파일을 사전 수집 | +| **영속 메모리** | 세션이 끝나도 이전 작업 기억을 유지, 프로젝트 컨텍스트 누적 학습 | +| **브라우저 통합** | 웹 페이지 내용을 에이전트가 직접 참조하여 코드에 반영 | + +### Raycast — 런처 + AI 융합 (macOS) + +| 핵심 기능 | 설명 | +|-----------|------| +| **1,500+ 확장 생태계** | 커뮤니티 기반 확장 프로그램 스토어 | +| **Auto 모델** | 작업 유형에 따라 GPT/Claude/Gemini 중 최적 모델 자동 선택 | +| **AI 스니펫** | `;email {수신자} {주제}` → AI가 이메일 초안을 즉시 생성 | +| **리치 클립보드** | 이미지·링크 프리뷰·코드 하이라이트가 있는 고급 클립보드 | + +### 서비스별 기능 비교 매트릭스 + +| 기능 | Claude Code | Cursor | Copilot | Windsurf | Raycast | +|------|:-----------:|:------:|:-------:|:--------:|:-------:| +| 에이전트 루프 | ✅ | ✅ | ✅ | ✅ | ❌ | +| MCP 프로토콜 | ✅ | ✅ | ✅ | ❌ | ❌ | +| 서브에이전트 (병렬) | 10팀 | 8개 | 다중 | ❌ | ❌ | +| Plan Mode | ✅ | ❌ | ❌ | ❌ | ❌ | +| LSP 코드 분석 | 자체 | ✅ | ✅ | ✅ | ❌ | +| 에이전트 메모리 | ✅ | ✅ | ✅ | ✅ | ❌ | +| 프로젝트 규칙 | ✅ | ✅ | ❌ | ❌ | ❌ | +| 자동 테스트-수정 | ✅ | ❌ | ✅ | ❌ | ❌ | +| 런처 통합 | ❌ | ❌ | ❌ | ❌ | ✅ | +| 오프라인 동작 | ❌ | ❌ | ❌ | ❌ | ❌ | + +--- + +## 3. 핵심 기술 개요 — 에이전트를 구성하는 7대 축 + +Agentic Coding Survey (arXiv 2025)는 AI 코딩 에이전트의 기술 지형을 **7대 축**으로 정리합니다: + +| # | 기술 축 | 핵심 질문 | 대표 서비스 | +|---|---------|-----------|-------------| +| 1 | **계획 (Planning)** | 어떤 순서로 작업할 것인가? | Claude Code Plan Mode | +| 2 | **도구 사용 (Tool Use)** | 파일·검색·빌드를 어떻게 호출하는가? | 전체 (Function Calling) | +| 3 | **메모리 (Memory)** | 이전 작업을 어떻게 기억하는가? | Windsurf, Cursor | +| 4 | **성찰 (Reflection)** | 실패를 어떻게 분석하고 재시도하는가? | Claude Code | +| 5 | **협업 (Multi-Agent)** | 여러 에이전트가 어떻게 분업하는가? | GitHub Copilot, Claude Code | +| 6 | **검색 (Retrieval)** | 관련 코드를 어떻게 찾는가? | Cursor, Windsurf | +| 7 | **검증 (Verification)** | 결과가 맞는지 어떻게 확인하는가? | GitHub Copilot | + +이하 섹션에서 각 기술의 **학술 근거, 작동 원리, 적용 서비스, 효과**를 설명합니다. + +--- + +## 4. 기술별 상세 + +### 4-1. Function Calling — 에이전트의 "손과 발" + +**개념**: LLM은 텍스트만 출력할 수 있습니다. 파일을 읽거나 코드를 실행하는 것은 불가능합니다. +Function Calling은 LLM이 **"이 도구를 이 파라미터로 호출해줘"라는 요청서를 JSON으로 출력**하면, 앱이 실제로 실행하는 구조입니다. + +``` +┌───────────────────────────────────────────┐ +│ ① 앱 → LLM │ +│ 사용자 메시지 + 도구 목록 (JSON Schema) │ +│ "이 중에 쓸 게 있으면 JSON으로 출력해" │ +└────────────────┬──────────────────────────┘ + ▼ +┌───────────────────────────────────────────┐ +│ ② LLM → 텍스트 출력 (이게 전부) │ +│ { "tool": "file_write", │ +│ "arguments": { "path": "report.html",│ +│ "content": "

보고서

..." │ +│ } │ +│ } │ +│ → 이것도 그냥 텍스트. 실제 파일을 만든 │ +│ 건 아님. │ +└────────────────┬──────────────────────────┘ + ▼ +┌───────────────────────────────────────────┐ +│ ③ 앱 → 실제 실행 │ +│ 1. JSON 파싱 │ +│ 2. File.WriteAllText() 실행 │ +│ 3. 결과를 다시 LLM에게 전달 │ +│ 4. LLM이 다음 행동 결정 │ +└───────────────────────────────────────────┘ +``` + +**업계 표준**: OpenAI, Anthropic, Google, Ollama 등 **모든 LLM API**가 동일한 방식. +"Function Calling" 또는 "Tool Use"라고 불리며, 2024년 이후 에이전트의 핵심 인프라. + +| LLM 서비스 | 도구 호출 방식 | +|-----------|--------------| +| Ollama / vLLM | OpenAI 호환 tools 파라미터 | +| Gemini | functionDeclarations | +| Claude | tool_use 블록 | + +**모델 성능에 따른 차이**: 도구 호출은 LLM이 올바른 JSON을 출력해야 하므로 모델 성능에 의존합니다. + +| 모델 수준 | 도구 호출 정확도 | 예시 | +|----------|:---:|------| +| 대형 모델 | ✅ 정확 | Claude Opus, GPT-4, Gemini Pro | +| 중형 모델 | ⚠️ 대부분 OK | Gemini Flash, Qwen-30B | +| 경량 모델 | ❌ 종종 실패 | Gemini Flash Lite, 소형 로컬 모델 | + +**관련 논문**: SWE-Agent v2 (Yang et al., Princeton 2025) — **Agent-Computer Interface (ACI)** 설계 + +--- + +### 4-2. Plan Mode — 계획 후 실행 + +**개념**: 에이전트가 도구를 즉시 실행하지 않고, **먼저 구조화된 실행 계획을 생성 → 사용자가 검토/수정/승인 → 승인 후 실행**하는 패턴. + +``` +사용자 요청: "인증 모듈을 JWT로 교체해줘" + │ + ▼ +┌─ 계획 수립 (도구 호출 차단) ──────────────┐ +│ 1. 현재 인증 로직 분석 (grep, file_read) │ +│ 2. JWT 라이브러리 설치 (process) │ +│ 3. 토큰 생성/검증 모듈 작성 (file_write) │ +│ 4. 기존 세션 로직 교체 (file_edit) │ +│ 5. 단위 테스트 작성 및 실행 (test_loop) │ +│ 6. Git 커밋 (git_tool) │ +└────────────────┬──────────────────────────┘ + ▼ + [승인] [수정] [취소] ← 사용자 검토 + │ + ▼ 승인 + 계획대로 순차 실행 +``` + +**왜 필요한가?** — FeatureBench (Anthropic 2025) + +| 벤치마크 | AI 성능 | 의미 | +|----------|:------:|------| +| SWE-bench (버그 수정) | **80%+** | 에이전트가 매우 잘하는 영역 | +| FeatureBench (신기능 구현) | **11~12%** | 에이전트가 아직 어려운 영역 | + +> 에이전트는 **"기존 코드 수정"은 잘하지만 "새로운 기능 설계"는 인간 감독이 필수**. +> Plan Mode는 이 한계를 인정하고 **인간-루프(Human-in-the-Loop)** 를 전제로 설계된 패턴. + +**적용 서비스**: Claude Code (Plan Mode), GitHub Copilot Workspace + +--- + +### 4-3. Reflexion — 실패에서 배우는 에이전트 + +**논문**: Reflexion: Language Agents with Verbal Reinforcement Learning (Shinn et al., NeurIPS 2023) + +**핵심 아이디어**: 에이전트가 실패하면 **"왜 실패했는지" 자연어로 구조화된 성찰문을 생성**하고, 이를 메모리에 저장하여 다음 시도에 활용합니다. + +``` +에이전트 실행 + │ + ▼ +실행 결과 관찰 + │ + ├── 성공 → 완료 + │ + └── 실패 → 구조화된 자기 성찰 (Self-Reflection) + │ + │ "파일 경로를 상대경로로 지정했으나 작업 폴더가 + │ 다른 위치였다. 다음에는 절대 경로를 사용하거나 + │ 먼저 현재 작업 디렉터리를 확인해야 한다." + │ + ▼ + 성찰 결과를 메모리에 저장 + │ + ▼ + 다음 시도에 성찰 결과 주입 → 재시도 +``` + +**효과**: + +| 벤치마크 | 일반 에이전트 | Reflexion 적용 | 향상 | +|----------|:-----------:|:-------------:|:----:| +| HumanEval (Python) | 80.1% | **91.0%** | +10.9% | +| MBPP (Python) | 72.4% | **77.1%** | +4.7% | +| AlfWorld (작업 수행) | 75% | **97%** | +22% | + +**핵심 차이**: 기존의 단순 재시도(같은 프롬프트로 다시 실행)와 달리, **실패 원인을 분석한 텍스트를 다음 프롬프트에 추가**하여 같은 실수를 반복하지 않음. + +**적용 서비스**: Claude Code (에러 후 자동 성찰), GitHub Copilot (반복 수정 루프) + +--- + +### 4-4. Agent-Computer Interface (ACI) — LLM을 위한 도구 설계 + +**논문**: SWE-Agent: Agent-Computer Interfaces Enable Automated Software Engineering (Yang et al., Princeton 2024-2025) + +**핵심 아이디어**: 에이전트의 성능은 LLM 모델 자체보다 **LLM이 사용하는 도구의 설계**에 크게 좌우됩니다. 사람을 위한 UI(GUI)가 아닌, **LLM을 위해 최적화된 도구 인터페이스(ACI)** 를 설계해야 합니다. + +**ACI 설계 원칙**: + +| 원칙 | 나쁜 설계 | 좋은 설계 (ACI) | +|------|----------|----------------| +| 출력 간결성 | `ls -la` 전체 출력 (수백 줄) | 필요한 정보만 구조화하여 반환 | +| 명확한 파라미터 | 복잡한 플래그 조합 | JSON Schema로 정의된 명확한 파라미터 | +| 에러 메시지 | 스택 트레이스 전체 | 원인 + 해결 방법을 한 줄로 요약 | +| 상태 피드백 | "완료" | "3개 파일 수정, 테스트 5/5 통과" | + +**효과**: 동일한 LLM 모델이라도 ACI를 잘 설계하면 SWE-bench에서 **12~23%p 성능 향상**. + +**적용 서비스**: Claude Code (커스텀 CLI 도구), SWE-Agent (전용 도구 셋) + +--- + +### 4-5. CodeAct — 코드로 행동하는 에이전트 + +**논문**: CodeAct: Code Actions for Multi-Turn Agent Interactions (Wang et al., 2024) + +**핵심 아이디어**: 에이전트의 행동(Action)을 JSON 도구 호출 대신 **실행 가능한 코드**로 표현합니다. + +``` +일반 도구 호출 (JSON) CodeAct (코드) +────────────────── ────────────── +{"tool": "search", import os + "args": {"query": "auth"}} results = [] + for f in os.listdir('src'): +{"tool": "file_read", if 'auth' in f.lower(): + "args": {"path": "src/auth.py"}} with open(f'src/{f}') as fh: + results.append(fh.read()) +→ 2번의 도구 호출 필요 → 1번의 코드 실행으로 복잡한 로직 표현 +``` + +**효과**: 멀티턴 대화에서 작업 성공률 **20%+ 향상**. 복잡한 조건 분기, 반복, 예외 처리를 한 번에 표현할 수 있어 도구 호출 횟수가 줄고 정확도가 올라감. + +**적용 서비스**: Claude Code (bash 도구), OpenCode, Aider (코드 실행 에이전트) + +--- + +### 4-6. 에이전트 메모리 — 세션을 넘어서 기억하는 AI + +**개념**: 대화가 끝나면 모든 문맥이 사라지는 기존 LLM과 달리, **프로젝트 수명 주기 전체에 걸쳐 학습한 내용을 유지**하는 구조. + +``` +세션 1: "이 프로젝트는 camelCase를 쓰고, 테스트는 Jest를 사용합니다" + │ + ▼ 저장 +세션 2: (새 대화) AI가 자동으로 camelCase + Jest 스타일로 코드 작성 + │ + ▼ 누적 +세션 N: 프로젝트의 아키텍처, 관례, 의사결정 이력을 모두 기억 +``` + +**메모리 계층** (CrewAI/LangChain 연구 기반): + +| 계층 | 역할 | 예시 | +|------|------|------| +| **단기 기억** | 현재 대화의 도구 호출 이력 | "방금 auth.py를 읽었으니 다시 안 읽어도 됨" | +| **에피소드 기억** | 과거 작업의 성공/실패 경험 | "지난번에 이 패턴으로 하니까 빌드 실패했었음" | +| **영속 기억** | 프로젝트 규칙, 코딩 관례 | "이 프로젝트는 항상 ESLint를 통과해야 함" | + +**적용 서비스**: Windsurf (영속 메모리), Cursor (러닝 메모리), Claude Code (CLAUDE.md 프로젝트 파일) + +--- + +### 4-7. MCP (Model Context Protocol) — 도구 연결 표준 + +**제정**: Anthropic (2025년 12월) + +**개념**: LLM 에이전트가 외부 도구/서비스에 접근하는 **표준 프로토콜**. +각 서비스마다 다른 연동 방식을 쓰는 대신, **하나의 표준으로 통일**. + +``` +┌──────────────┐ JSON-RPC 2.0 ┌──────────────┐ +│ AI 에이전트 │ ◄─────────────────► │ MCP 서버 A │ (JIRA) +│ (MCP 클라이언트) │ │ │ +│ │ ◄─────────────────► │ MCP 서버 B │ (Slack) +│ │ │ │ +│ │ ◄─────────────────► │ MCP 서버 C │ (DB 조회) +└──────────────┘ └──────────────┘ + │ + ├── 서버의 도구(tools) 목록 자동 발견 + ├── 에이전트 도구로 자동 래핑 (LLM에게 구분 없이 노출) + └── LLM이 내장 도구와 동일하게 호출 +``` + +**LLM 입장에서**: 내장 도구와 MCP 도구의 구분이 없습니다. + +``` +도구 목록 (LLM에게 전달): + file_read ← 내장 + file_write ← 내장 LLM은 이 구분을 + jira_search ← MCP 모릅니다. + slack_send ← MCP 그냥 목록에서 + db_query ← MCP 골라서 호출할 뿐. +``` + +**업계 채택**: Claude Code, Cursor, GitHub Copilot, OpenCode 등 모든 주요 서비스가 지원. + +--- + +### 4-8. LSP (Language Server Protocol) — 의미 기반 코드 분석 + +**제정**: Microsoft + +**개념**: 텍스트 검색(grep)이 아닌 **코드의 의미 구조**를 기반으로 분석. + +``` +텍스트 검색 (grep) LSP 기반 분석 +────────────────── ────────────── +"authenticate" 글자 포함 줄 반환 함수 정의 위치 정확히 반환 +→ 주석/문자열에 있는 것도 포함 → "이 함수를 호출하는 곳" 목록 +→ 동의어("auth", "login") 누락 → 타입, 시그니처, 참조 관계 분석 +→ 노이즈가 많음 → 정확도 높음 +``` + +**적용 서비스**: Cursor (OmniSharp, pyright 등), GitHub Copilot, Windsurf + +--- + +### 4-9. Multi-Agent — 역할 기반 에이전트 팀 + +**개념**: 단일 에이전트 대신 **역할이 다른 여러 에이전트가 메시지를 주고받으며 협업**. + +``` +┌─────────────────────────────────────────┐ +│ 오케스트레이터 (Orchestrator) │ +│ "JWT 인증 모듈로 교체해줘" │ +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ 코드 작성 │ │ 테스트 │ │ 코드 리뷰│ │ +│ │ 에이전트 │ │ 에이전트 │ │ 에이전트 │ │ +│ └─────┬────┘ └────┬─────┘ └────┬─────┘ │ +│ │ 작성 완료 │ 테스트 실패 │ 리뷰 │ +│ └────────► │ ◄──────── ┘ │ +│ ▼ │ +│ 수정 → 재테스트 → 통과 │ +└─────────────────────────────────────────┘ +``` + +**적용 서비스**: Claude Code (서브에이전트 10팀), Cursor (백그라운드 에이전트 8개), GitHub Copilot (Multi-Agent) + +--- + +## 5. 구현 방법 — 에이전트의 실행 구조 + +### 에이전트 루프 (Agent Loop) + +모든 AI 코딩 에이전트의 핵심 아키텍처는 **동일한 반복 루프**입니다: + +``` +사용자 요청 + │ + ▼ +┌────────────────────────────────────────┐ +│ 반복 (최대 N회): │ +│ │ +│ ① LLM에게 전송 │ +│ (사용자 메시지 + 도구 목록 + 이력) │ +│ │ +│ ② LLM 응답 수신 │ +│ ├── 텍스트만 → 종료 (최종 답변) │ +│ └── 도구 호출 JSON → ③으로 │ +│ │ +│ ③ 도구 실행 │ +│ · 경로 검증 (작업 폴더 내?) │ +│ · 권한 확인 (Ask/Auto/Deny) │ +│ · 차단 확장자 검사 │ +│ · 실행 → 결과를 이력에 추가 │ +│ │ +│ ④ 결과를 다시 ①로 (다음 반복) │ +│ │ +│ 안전장치: │ +│ · 최대 반복 횟수 제한 │ +│ · 연속 오류 시 자동 중단 │ +│ · 취소 토큰으로 사용자 중단 지원 │ +└────────────────────────────────────────┘ +``` + +### 스킬 시스템 — 업무 지시서 + +스킬은 **LLM에게 주는 업무 지시서**입니다. `.skill.md` 파일 하나로 정의합니다. + +```yaml +--- +name: report-writer +label: 보고서 작성 +allowed-tools: # 이 스킬이 사용할 수 있는 도구를 제한 + - file_read + - folder_map + - html_create +--- +## 지시사항 +1. 작업 폴더의 데이터 파일을 먼저 확인하세요 +2. 핵심 지표를 추출하세요 +3. 전문적인 보고서를 HTML로 작성하세요 +``` + +> 스킬은 도구를 추가하거나 삭제할 수 **없습니다**. "LLM 시스템 프롬프트"로만 작동하며, 실제 도구 목록은 앱이 관리합니다. 따라서 악성 스킬을 로드해도 **앱의 보안 경계를 넘을 수 없습니다**. + +**표준**: Anthropic이 **SKILL.md** 오픈 포맷(agentskills.io)을 제정하여 스킬 호환성을 표준화. + +--- + +## 6. 사용자 데이터 보호 + +### 외부 서비스의 보안 구조 + +| 서비스 | 실행 환경 | 격리 방식 | 위험 요소 | +|--------|-----------|-----------|-----------| +| **Claude Code** | 터미널 (로컬 PC) | 없음 | 잘못된 `rm -rf` 실행 가능 | +| **Cursor** | IDE 내장 | 프로젝트 폴더 한정 | 터미널 명령은 제한 없음 | +| **Devin / Codex** | **Docker 컨테이너** | 완전 격리 | 컨테이너 밖 접근 불가 | +| **GitHub Copilot Workspace** | **클라우드 VM** | 서버 격리 | 로컬 파일 접근 자체 불가 | + +> **왜 Docker?**: 터미널 에이전트(Claude Code)는 `rm -rf /`, `curl | bash` 같은 위험 명령을 LLM이 실행할 수 있습니다. Devin/Codex는 이를 해결하기 위해 Docker 컨테이너 안에서만 코드를 실행합니다. + +### 사내 환경에서의 보안 원칙 + +사내에서 AI 에이전트를 운영하려면 Docker 대신 **앱 레벨에서 3중 방어**가 필요합니다: + +``` +방어 ①: 워크스페이스 격리 +────────────────────── + 사용자 PC 전체 디스크 + ├── C:\Windows\ ← 🚫 차단 + ├── C:\Program Files\ ← 🚫 차단 + ├── C:\Users\...\AppData\ ← 🚫 차단 + └── D:\Projects\MyProject\ ← ✅ 작업 폴더 (사용자 지정) + └── AI가 읽고 쓸 수 있는 유일한 영역 + +방어 ②: 파일 접근 동의 (3단계 권한) +────────────────────────────── + · Ask — 파일을 쓸 때마다 사용자 확인 팝업 + · Auto — 작업 폴더 내 자동 허용 (숙련자용) + · Deny — 모든 파일 수정 차단 (읽기만 허용) + +방어 ③: 삭제 도구 자체가 없음 +──────────────────────────── + · file_read (읽기) ✅ + · file_write (생성/덮어쓰기) ✅ + · file_edit (부분 수정) ✅ + · file_delete → 도구 자체가 존재하지 않음 ❌ + · .exe, .dll, .sys 등 실행 파일 생성 차단 +``` + +> **설계 원칙**: LLM이 "이 파일 삭제해"라고 판단해도, 실행할 도구가 없으므로 **물리적으로 삭제 불가능**. + +--- + +## 7. 결론 — 기술 방향 제시 + +### 2026년 10대 기술 동향 요약 + +| # | 동향 | 근거 | 영향도 | +|---|------|------|:------:| +| 1 | **데스크탑 네이티브 전환** | Claude Code·Cursor·Windsurf 모두 로컬 실행 | ★★★ | +| 2 | **자율 에이전트 전환** | 자동완성 → 이슈→코드→PR 자동화 파이프라인 | ★★★ | +| 3 | **계획 후 실행 (Human-in-the-Loop)** | FeatureBench 11% — 인간 감독 필수 인식 확산 | ★★★ | +| 4 | **성찰 루프 (Reflexion)** | NeurIPS 2023 — 실패 분석→재시도로 정확도 91% | ★★☆ | +| 5 | **멀티 에이전트 협업** | Claude Code 10팀, Cursor 8개 병렬 실행 | ★★☆ | +| 6 | **영속 메모리** | 세션→프로젝트 수명 전체 기억 유지 | ★★☆ | +| 7 | **표준 프로토콜 (MCP, LSP)** | Anthropic MCP 제정, 전 서비스 채택 | ★★☆ | +| 8 | **ACI 도구 설계** | SWE-Agent — 도구 설계만으로 12~23%p 성능 차이 | ★★☆ | +| 9 | **런처 + AI 융합** | Raycast — 단축키로 AI 즉시 호출 | ★☆☆ | +| 10 | **오프라인 AI** | 네트워크 없이 로컬 모델로 기본 작업 처리 | ★☆☆ | + +### 핵심 메시지 + +``` +① AI 코딩 도구가 "보조 도구"에서 "자율 에이전트"로 전환되었습니다. +② 에이전트의 핵심 기술(계획·도구·메모리·성찰·협업)은 학술적으로 검증되었습니다. +③ 그러나 FeatureBench 11%가 보여주듯, 인간 감독은 여전히 필수입니다. +④ 사내 환경에서는 데이터 보호(워크스페이스 격리, 권한 제어)가 전제 조건입니다. +⑤ 이 기술들을 사내 환경에 빠르게 적용하는 것이 경쟁력의 핵심입니다. +``` + +--- + +### 참고 문헌 + +| 논문/자료 | 출처 | 핵심 기여 | +|-----------|------|-----------| +| Reflexion: Language Agents with Verbal Reinforcement Learning | Shinn et al., NeurIPS 2023 | 자기 성찰로 코드 생성 정확도 91% 달성 | +| SWE-Agent: Agent-Computer Interfaces Enable Automated Software Engineering | Yang et al., Princeton 2024 | ACI 설계 원칙, SWE-bench 80%+ | +| CodeAct: Code Actions for Multi-Turn Agent Interactions | Wang et al., 2024 | 코드 기반 행동으로 성공률 20%+ 향상 | +| A Survey on Agentic AI for Software Engineering | arXiv 2025 | 에이전트 코딩 7대 기술 축 체계화 | +| FeatureBench: Can AI Implement New Features? | Anthropic Research, 2025 | 신기능 구현 11% — 인간 감독 필수 근거 | +| Model Context Protocol Specification | Anthropic, 2025 | 도구 연결 표준 프로토콜 | +| SKILL.md Agent Skills Open Format | agentskills.io, 2025 | 에이전트 스킬 표준 포맷 | + +--- + +*발표 자료 작성: AX연구소 AI팀 | 문의: 내부 메신저* diff --git a/docs/TECHNOLOGY_OVERVIEW.md b/docs/TECHNOLOGY_OVERVIEW.md new file mode 100644 index 0000000..1ba5b33 --- /dev/null +++ b/docs/TECHNOLOGY_OVERVIEW.md @@ -0,0 +1,762 @@ +# AX Copilot 기술 및 구현 현황 종합 문서 + +> **작성일**: 2026-04-03 +> **앱 버전**: v1.8.0 (내부 Phase: v2.3) +> **프레임워크**: .NET 8.0 WPF (win-x64) + +--- + +## 1. 프로젝트 개요 + +AX Copilot은 **AI 기반 업무 자동화 데스크톱 앱**으로, 두 가지 핵심 컴포넌트로 구성됩니다: + +| 컴포넌트 | 명칭 | 역할 | +|---------|------|------| +| **런처** | AX Commander | 키보드 기반 명령 실행 (Alfred/Raycast 대응) | +| **AI 대화** | AX Agent | LLM 기반 에이전트 코딩/코워크/채팅 (Claude Code/Cursor 대응) | + +### 핵심 수치 + +| 항목 | 수량 | +|------|------| +| 에이전트 도구 (IAgentTool) | **64개** | +| 런처 핸들러 (IHandler) | **44개** | +| 내장 스킬 (.skill.md) | **40개** | +| 슬래시 명령 (/command) | **15개** | +| 대화 프리셋 | **20개** | +| 테마 | **10개** | +| 윈도우/뷰 | **27개** (+ 컨트롤 4개) | +| NuGet 의존성 | **7개** | +| 훅 이벤트 타입 | **18종** | +| 훅 실행 모드 | **4종** | + +--- + +## 2. 아키텍처 + +### 2.1 계층 구조 + +``` +┌─────────────────────────────────────────────────────────┐ +│ UI 계층 (Views / ViewModels) │ +│ · ChatWindow (3-Pane: 사이드바 + 채팅 + 설정 패널) │ +│ · LauncherWindow (Alfred/Raycast 스타일 명령 팝업) │ +│ · SettingsWindow, DockBarWindow, CommandPaletteWindow 등 │ +├─────────────────────────────────────────────────────────┤ +│ 서비스 계층 (Services) │ +│ · AgentLoopService (에이전트 루프 엔진) │ +│ · LlmService (LLM API 통합) │ +│ · McpClientService (MCP stdio 프로토콜) │ +│ · SkillService, PresetService, HookRunner 등 │ +├─────────────────────────────────────────────────────────┤ +│ 도메인 계층 (Tools / Handlers / Models) │ +│ · 64개 IAgentTool 구현체 │ +│ · 44개 IHandler 구현체 (런처 핸들러) │ +│ · AppSettings, ChatModels, McpSettings │ +├─────────────────────────────────────────────────────────┤ +│ 인프라 계층 (External) │ +│ · LLM API (Ollama / Gemini / Claude) │ +│ · MCP 서버 (stdio JSON-RPC 2.0) │ +│ · LSP 서버 (Language Server Protocol) │ +│ · 파일 시스템, Git, SQLite │ +└─────────────────────────────────────────────────────────┘ +``` + +### 2.2 핵심 디자인 패턴 + +| 패턴 | 적용 위치 | 설명 | +|------|----------|------| +| **Strategy** | IAgentTool, IHookExecutor | 도구/훅 타입별 전략 분리 | +| **Observer** | AgentEventOccurred, HookRunner | 에이전트 이벤트 발행/구독 | +| **Factory** | ToolRegistry.CreateDefault() | 도구 인스턴스 생성 중앙화 | +| **Chain of Responsibility** | PermissionSystem | 권한 규칙 체인 평가 | +| **Command** | ISlashCommand, SlashCommandRegistry | 슬래시 명령 실행 | +| **Repository** | HierarchicalMemoryService | 계층적 메모리 CRUD | +| **Decorator** | IConditionalTool 래핑 | 도구 활성화 조건 동적 평가 | + +### 2.3 SOLID 원칙 적용 + +- **SRP**: 에이전트 도구 1파일 = 1클래스, 카테고리별 폴더 분리 +- **OCP**: `IAgentTool` + `ToolRegistry` — 기존 코드 수정 없이 새 도구 등록 +- **LSP**: 모든 `IAgentTool` 구현체 교환 가능, `ToolResult.Ok()`/`Fail()` 규약 일관 +- **ISP**: `IAgentTool`(Execute/Parameters/Name만), `IConditionalTool`(IsEnabled만) 분리 +- **DIP**: `AgentLoopService` → 인터페이스만 의존, `AgentContext.Settings`로 DI + +--- + +## 3. LLM 통합 + +### 3.1 지원 서비스 + +| 서비스 | 프로토콜 | 특징 | +|--------|---------|------| +| **Ollama** | REST API (로컬) | 사내망 LLM 서버, 무제한 호출 | +| **vLLM** | OpenAI 호환 API | 고성능 로컬 추론 서버 | +| **Google Gemini** | REST API (클라우드) | 무료 티어 지원, 이미지 입력 | +| **Anthropic Claude** | REST API (클라우드) | SSE 스트리밍, 고급 추론 | + +### 3.2 LlmService 핵심 API + +```csharp +// 동기 호출 +Task SendAsync(List messages, CancellationToken ct); + +// SSE 스트리밍 (실시간 토큰 출력) +IAsyncEnumerable StreamAsync(List messages, CancellationToken ct); + +// Function Calling (도구 사용) +Task<(string Response, List ToolCalls)> SendWithToolsAsync( + List messages, List tools, CancellationToken ct); + +// 토큰 사용량 추적 +TokenUsage? LastTokenUsage { get; } +``` + +### 3.3 모델 라우팅 + +- **ModelRouterService**: 작업 유형(코딩/문서/분석)에 따라 최적 모델 자동 선택 +- **FallbackModels**: 주 모델 실패 시 대체 모델 목록 순차 시도 +- **FreeTierMode**: 무료 API 제한 시 자동 지연 (4초 쿨다운) + +### 3.4 컨텍스트 관리 + +| 기능 | 구현 | +|------|------| +| **토큰 추정** | TokenEstimator — CJK 가중치 적용 로컬 추정 | +| **자동 압축** | AutoCompactMonitor — 임계치(80%) 초과 시 자동 컨텍스트 요약 | +| **컨텍스트 축소** | ContextCondenser — 대화 내 도구 결과/중복 제거 60% 목표 | +| **출력 예산** | ToolResultSizer — 도구 결과 4,000자 자동 절삭 | + +--- + +## 4. 에이전트 시스템 + +### 4.1 AgentLoopService (핵심 에이전트 루프) + +``` +사용자 입력 → 시스템 프롬프트 조립 → LLM 호출 → 도구 호출 파싱 + ↓ +도구 실행 (권한 확인 → 훅 실행 → 도구 Execute → 결과 검증) + ↓ +결과를 메시지에 추가 → LLM 재호출 (반복) + ↓ +종료 조건: 도구 미호출 / 최대 반복 / 사용자 중단 +``` + +**핵심 파라미터**: + +| 상수 | 기본값 | 설명 | +|------|--------|------| +| MaxIterations | 25 | 최대 에이전트 반복 횟수 | +| MaxRetryOnError | 3 | 도구 오류 시 재시도 | +| MaxTestFixIterations | 5 | 테스트-수정 루프 최대 반복 | +| AutoCompactThresholdPercent | 80 | 컨텍스트 자동 압축 임계치 | +| ToolResultTruncateLength | 4,000 | 도구 결과 최대 길이 | + +### 4.2 에이전트 도구 (64개) + +#### 파일 시스템 (11개) +| 도구 | 설명 | +|------|------| +| FileReadTool | 파일 읽기 (라인 범위 지정) | +| FileWriteTool | 파일 생성/덮어쓰기 | +| FileEditTool | 정확한 문자열 치환 편집 | +| FileInfoTool | 파일 메타데이터 조회 | +| FileManageTool | 복사/이동/삭제/이름변경 | +| MultiReadTool | 여러 파일 동시 읽기 | +| FolderMapTool | 디렉토리 트리 구조 | +| GlobTool | 파일 패턴 검색 | +| GrepTool | 정규식 콘텐츠 검색 | +| FileWatchTool | 파일 변경 감시 | +| ZipTool | 압축/해제 | + +#### 코드 개발 (8개) +| 도구 | 설명 | +|------|------| +| GitTool | Git 명령 실행 (status, diff, commit 등) | +| LspTool | LSP 분석 (정의/참조/진단) | +| CodeReviewTool | AI 코드 리뷰 | +| CodeSearchTool | 의미론적 코드 검색 (TF-IDF) | +| BuildRunTool | 빌드/테스트 실행 | +| TestLoopTool | 자동 테스트-수정 반복 | +| DiffTool | 파일 비교 | +| DiffPreviewTool | Diff 미리보기 UI | + +#### 문서 생성 (9개) +| 도구 | 설명 | +|------|------| +| DocxSkill | Word 문서 생성 (OpenXML) | +| ExcelSkill | Excel 스프레드시트 생성 | +| PptxSkill | PowerPoint 프레젠테이션 생성 | +| HtmlSkill | HTML 페이지 생성 | +| MarkdownSkill | Markdown 문서 생성 | +| CsvSkill | CSV 파일 처리 | +| DocumentPlannerTool | 다중 패스 문서 설계 | +| DocumentAssemblerTool | 문서 조립/병합 | +| DocumentReaderTool | 문서 파싱 (PDF/DOCX) | + +#### 데이터 처리 (7개) +| 도구 | 설명 | +|------|------| +| JsonTool | JSON 파싱/변환/쿼리 | +| XmlTool | XML 처리 | +| SqlTool | SQLite 쿼리 실행 | +| DataPivotTool | 데이터 피벗/집계 | +| ChartSkill | 차트 생성 | +| RegexTool | 정규식 매칭/치환 | +| FormatConvertTool | 형식 변환 | + +#### 에이전트/자동화 (10개) +| 도구 | 설명 | +|------|------| +| SubAgentTool | 서브 에이전트 위임 실행 | +| PlaybookTool | 워크플로우 자동 실행 | +| SkillManagerTool | 스킬 관리 (목록/재로드) | +| MemoryTool | 에이전트 메모리 CRUD | +| ProjectRuleTool | 프로젝트 규칙 관리 | +| TaskTrackerTool | 작업 추적/체크리스트 | +| CheckpointTool | 체크포인트 생성/복원 | +| SuggestActionsTool | 다음 행동 추천 | +| UserAskTool | 사용자 질문/확인 | +| NotifyTool | 사용자 알림 발송 | + +#### 유틸리티 (10개) +| 도구 | 설명 | +|------|------| +| HttpTool | HTTP 요청 (GET/POST) | +| McpTool | MCP 서버 도구 호출 | +| ProcessTool | 셸 명령 실행 | +| ClipboardTool | 클립보드 읽기/쓰기 | +| ImageAnalyzeTool | 이미지 분석 (멀티모달) | +| Base64Tool | Base64 인코딩/디코딩 | +| HashTool | 해시값 계산 | +| EncodingTool | 파일 인코딩 감지/변환 | +| MathTool | 수학 연산 | +| DateTimeTool | 날짜/시간 계산 | + +#### 기타 (9개) +| 도구 | 설명 | +|------|------| +| DocumentReviewTool | 문서 품질 검토 | +| DevEnvDetectTool | 개발 환경 감지 | +| EnvTool | 환경변수 관리 | +| TemplateRenderTool | Mustache 템플릿 렌더링 | +| TextSummarizeTool | 텍스트 요약 | +| SnippetRunnerTool | 코드 스니펫 실행 | +| OpenExternalTool | 외부 프로그램 열기 | +| BatchSkill | 대량 파일 처리 | +| DelegateAgentTool | 특정 작업 위임 | + +### 4.3 Plan 모드 + +| 모드 | 동작 | +|------|------| +| **Off** | 즉시 실행 (계획 없이) | +| **Auto** | 복잡한 작업 시 자동 계획 수립 | +| **Always** | 모든 작업에 계획 수립 후 사용자 승인 | + +Plan 모드에서는 `document_plan` 도구로 단계별 실행 계획을 생성하고, PlanViewerWindow에서 시각화합니다. + +### 4.4 권한 시스템 (PermissionSystem) + +| 모드 | 설명 | +|------|------| +| **Ask** | 모든 파일 작업에 사용자 승인 요청 | +| **AcceptEdits** | 파일 편집은 자동 승인, bash/위험 도구는 확인 | +| **Auto** | 모든 도구 자동 실행 | +| **Deny** | 위험 도구 차단 | + +**패턴 기반 규칙**: `Bash(git *)` 형태로 특정 명령만 허용/차단 +**차단 경로**: 시스템 디렉토리, `.env` 등 민감 파일 패턴 차단 + +--- + +## 5. 훅 시스템 + +### 5.1 훅 이벤트 (18종) + +| 카테고리 | 이벤트 | +|---------|--------| +| **도구 실행** | PreToolUse, PostToolUse, PostToolUseFailure | +| **세션** | SessionStart, SessionEnd, UserPromptSubmit | +| **에이전트** | AgentStop, Stop, SubagentStart, SubagentStop | +| **컨텍스트** | PreCompact, PostCompact, CwdChanged, ConfigChange | +| **파일** | FileChanged | +| **스킬** | PreSkillExecute, PostSkillExecute | +| **권한** | PermissionRequest | + +### 5.2 훅 실행 모드 (4종) + +| 모드 | 설명 | 예시 | +|------|------|------| +| **Command** | 외부 스크립트 실행 | `cmd /c lint.bat` | +| **Http** | HTTP POST 웹훅 | `https://hooks.slack.com/...` | +| **Prompt** | LLM 검사 (경량 모델) | "이 코드에 보안 이슈가 있나요?" | +| **Agent** | 미니 에이전트 루프 | 자동 코드 포맷팅 서브루프 | + +### 5.3 훅 출력 기능 + +| 출력 타입 | 설명 | +|----------|------| +| `additionalContext` | LLM 컨텍스트에 추가 정보 주입 | +| `permissionDecision` | 권한 요청에 대한 자동 판단 | +| `updatedInput` | 사용자 입력 자동 수정 | + +--- + +## 6. 스킬 시스템 + +### 6.1 SKILL.md 표준 형식 + +```markdown +--- +name: report-writer +description: 보고서 자동 작성 +tools: [file_write, file_read, grep] +model: gemini-2.0-flash +context: fork +paths: ["docs/**", "reports/**"] +arguments: + topic: + description: 보고서 주제 + required: true +--- + +# 시스템 프롬프트 +당신은 보고서 작성 전문가입니다... +``` + +### 6.2 스킬 기능 + +| 기능 | 설명 | +|------|------| +| **context:fork** | 서브에이전트로 격리 실행 | +| **paths: glob** | 특정 경로에서만 자동 활성화 | +| **model: override** | 스킬별 최적 모델 지정 | +| **arguments** | 매개변수 치환 (`{{topic}}`) | +| **inline commands** | 인라인 명령 처리 | +| **namespacing** | 스킬 이름 충돌 방지 | + +### 6.3 내장 스킬 (40개) + +| 카테고리 | 스킬명 | 설명 | +|---------|--------|------| +| **문서** | report-writer, meeting-minutes, weekly-report, prd-generator, changelog, release-note, email-draft | 보고서/회의록/주간보고/PRD/변경이력/릴리즈노트/이메일 | +| **코드** | code-scaffold, refactor, gen-test, commit-review, security-audit, perf-audit, dependency-audit | 스캐폴딩/리팩터링/테스트생성/커밋리뷰/보안점검/성능감사/의존성감사 | +| **데이터** | data-visualize, data-visualize-adv, xlsx-analyzer, csv-to-xlsx, data-convert, yield-analysis, sql-report | 시각화/분석/변환/수율분석/SQL보고서 | +| **변환** | docx-creator, pptx-creator, markdown-to-doc, json-schema, diagram-generator | 문서생성/프레젠테이션/스키마/다이어그램 | +| **분석** | paper-review, log-analyze, impact, ocr-extract, image-processor | 논문리뷰/로그분석/영향분석/OCR/이미지처리 | +| **유틸** | batch-rename, compare, env-setup, regex-helper, translate, api-docs, adr-writer, db-schema | 일괄이름변경/비교/환경설정/정규식/번역/API문서/ADR/DB스키마 | + +--- + +## 7. MCP (Model Context Protocol) 통합 + +### 7.1 클라이언트 구현 + +``` +App ──stdio──> MCP 서버 프로세스 + <──JSON-RPC 2.0── +``` + +- **프로토콜**: JSON-RPC 2.0 over stdio +- **서버 관리**: 프로세스 생명주기 관리 (시작/종료/재연결) +- **도구 검색**: `tools/list` 요청으로 서버 제공 도구 자동 등록 +- **도구 실행**: `tools/call` 요청으로 원격 도구 호출 + +### 7.2 SDK 서버 (내장) + +AX Copilot 자체가 MCP 서버로 동작하여 외부 MCP 클라이언트에 에이전트 도구를 제공: + +| 컴포넌트 | 파일 | 역할 | +|---------|------|------| +| SdkProtocol | SdkProtocol.cs | JSON-RPC 프로토콜 정의 | +| AgentSdkServer | AgentSdkServer.cs | stdio 서버 실행 | +| AgentTypeRegistry | AgentTypeRegistry.cs | 도구 타입 등록 | +| SdkHookCallbackHandler | SdkHookCallbackHandler.cs | 훅 이벤트 외부 전달 | + +--- + +## 8. 메모리 시스템 + +### 8.1 계층적 메모리 (4-Layer) + +| 계층 | 범위 | 저장 위치 | +|------|------|----------| +| **Global** | 앱 전체 | `%APPDATA%\AxCopilot\memory\global.json` | +| **Project** | 프로젝트(폴더)별 | `{WorkFolder}\.ax\memory.json` | +| **Session** | 대화 세션별 | `%APPDATA%\AxCopilot\sessions\{id}\memory.json` | +| **Agent Type** | 에이전트 타입별 | `%APPDATA%\AxCopilot\memory\{type}.json` | + +### 8.2 메모리 도구 (MemoryTool) + +| 액션 | 설명 | +|------|------| +| `save` | 새 규칙/선호도 저장 | +| `search` | 키워드로 메모리 검색 | +| `list` | 모든 메모리 항목 목록 | +| `delete` | 특정 항목 삭제 | + +### 8.3 @include 지시문 + +프로젝트 규칙 파일에서 외부 파일 참조: +```markdown +# AX.md +@include docs/coding-style.md +@include docs/api-conventions.md +``` +- 최대 5단계 중첩 포함 +- 순환 참조 자동 감지/방지 + +--- + +## 9. 슬래시 명령 (15개) + +| 명령 | 설명 | +|------|------| +| `/compact` | 대화 컨텍스트 수동 압축 | +| `/clear` | 대화 초기화 | +| `/memory` | 에이전트 메모리 관리 | +| `/model` | 현재 모델 변경 | +| `/plan` | Plan 모드 전환 (off/auto/always) | +| `/commit` | Git 커밋 자동 생성 | +| `/review` | 코드 리뷰 실행 | +| `/mcp` | MCP 서버 상태/관리 | +| `/permissions` | 권한 모드 변경 | +| `/hooks` | 훅 등록/목록/삭제 | +| `/config` | 설정값 조회/변경 | +| `/skills` | 스킬 목록/실행 | +| `/help` | 명령어 도움말 | +| `/init` | 프로젝트 초기화 (AX.md 생성) | +| `/review` | PR/변경사항 리뷰 | + +--- + +## 10. 런처 시스템 (AX Commander) + +### 10.1 프리픽스 명령 체계 + +| 프리픽스 | 기능 | 핸들러 | +|---------|------|--------| +| `!` | AI 대화 시작 | ChatHandler | +| `?` | 웹 검색 | WebSearchHandler | +| `>` | 시스템 명령 | SystemCommandHandler | +| `=` | 계산기 | CalculatorHandler | +| `#` | 색상 변환 | ColorHandler | +| `@` | 퀵링크 | QuickLinkHandler | +| `$` | 환경변수 | EnvHandler | +| `/` | 즐겨찾기 | FavoriteHandler | +| `%` | 프로세스 관리 | ProcessHandler | +| `:` | 이모지 | EmojiHandler | +| `+` | 노트 | NoteHandler | +| `-` | 일괄 텍스트 처리 | BatchTextHandler | +| `~` | 별칭 | AliasHandler | +| `*` | 서비스 관리 | ServiceHandler | +| `^` | 클립보드 이력 | ClipboardHistoryHandler | +| `` ` `` | 코드 스니펫 | SnippetHandler | + +### 10.2 주요 기능 + +| 기능 | 설명 | +|------|------| +| **퍼지 검색** | 앱/파일/설정 퍼지 매칭 | +| **파일 인덱싱** | 로컬 파일 TF-IDF 인덱스 | +| **클립보드 이력** | DPAPI 암호화 저장, 원본 이미지 품질 | +| **독 바** | 하단 퀵 액세스 바 | +| **셸 통합** | Windows Explorer 우클릭 메뉴 | +| **커맨드 팔레트** | VS Code 스타일 Ctrl+Shift+P | +| **AI 스니펫** | 프롬프트 기반 자동 텍스트 생성 | + +--- + +## 11. UI/UX 시스템 + +### 11.1 AX Agent 3-Pane 레이아웃 (Claude.ai 스타일) + +``` +┌────────────────────────────────────────────────────────────────┐ +│ [좌측 사이드바] │ [메인 채팅 영역] │ [우측 설정 패널] │ +│ 260px │ 가변 │ 300px (토글) │ +│ │ │ │ +│ Chat│Cowork│Code│ 세션 헤더 바 │ ⚙ 모델 & 서비스 │ +│ ─────────────── │ (모델▾ Plan▾ 권한▾) │ 에이전트 동작 │ +│ 프리셋 목록 │ │ 탭 전용 설정 │ +│ ─────────────── │ 메시지 스트림 │ 도구 관리 │ +│ [+ 새 대화] │ (마크다운 렌더링) │ MCP 서버 │ +│ ─────────────── │ │ 프리셋 │ +│ 대화 이력 │ 입력 영역 │ 고급 │ +│ (날짜별 그룹) │ (@멘션 /스킬 📎) │ │ +└────────────────────────────────────────────────────────────────┘ +``` + +### 11.2 테마 시스템 (10종) + +| 테마 | 스타일 | +|------|--------| +| Dark | 기본 다크 테마 | +| OLED | 순흑 배경 AMOLED | +| Nord | 북극빛 색상 | +| Monokai | 개발자 인기 테마 | +| Catppuccin | 파스텔 다크 | +| Codex | OpenAI Codex 스타일 | +| Alfred | Alfred 앱 스타일 | +| Alfred Light | Alfred 라이트 변형 | +| Light | 기본 라이트 테마 | +| Sepia | 따뜻한 세피아 톤 | + +### 11.3 커스텀 UI 규칙 + +- **기본 컨트롤 사용 금지**: ContextMenu → 커스텀 Popup, MessageBox → CustomMessageBox +- **테마 리소스 필수**: `ThemeResourceHelper.Primary(this)` 패턴으로 색상 조회 +- **PopupMenuHelper**: 팝업 메뉴 생성 통합 헬퍼 +- **ToggleSwitch 스타일**: 기본 CheckBox 대신 좌우 슬라이드 토글 +- **아이콘**: Segoe MDL2 Assets 글리프 + 기능별 색상 + +### 11.4 애니메이션 + +| 동작 | 구현 | 시간 | +|------|------|------| +| 사이드바 접기/펼치기 | Width 260→48px | 180ms | +| 우측 패널 슬라이드 | TranslateTransform X | 200ms | +| 탭 전환 | Opacity + TranslateY | 120ms | +| 메시지 등장 | Opacity + TranslateY | 120ms | +| 스트리밍 커서 | Opacity 깜빡임 | 500ms | +| 도구 블록 펼치기 | Height 애니메이션 | 150ms | + +--- + +## 12. 보안 시스템 + +### 12.1 데이터 보호 + +| 항목 | 방법 | +|------|------| +| API 키 | AES-256-GCM + DPAPI 이중 암호화 | +| 클립보드 이력 | DPAPI 암호화 저장 | +| 가이드 문서 | AES-256-CBC 암호화 (.enc) | +| 설정 파일 | 로컬 저장 (`%APPDATA%\AxCopilot\`) | + +### 12.2 AI 기능 제어 + +| 설정 | 기본값 | 설명 | +|------|--------|------| +| `AiEnabled` | `false` | AI 기능 전체 차단/허용 (비밀번호 보호) | +| `InternalModeEnabled` | `true` | 사내 모드 — 외부 인터넷 차단 | + +### 12.3 감사 로그 (AuditLogService) + +모든 에이전트 도구 실행, 파일 변경, 권한 결정을 JSON 형식으로 기록: +```json +{ + "timestamp": "2026-04-03T14:30:00", + "event": "tool_execution", + "tool": "file_write", + "path": "src/main.cs", + "permission": "auto", + "result": "success" +} +``` + +--- + +## 13. 세션 관리 + +### 13.1 세션 기능 + +| 기능 | 설명 | +|------|------| +| **자동 저장** | 대화별 자동 저장/복원 | +| **포크** | 현재 세션 분기하여 별도 대화 | +| **태그** | 세션에 라벨 태그 | +| **카테고리** | 작업 유형별 자동 분류 | +| **고정** | 중요 대화 상단 고정 | +| **검색** | 대화 이력 전문 검색 | + +### 13.2 멀티에이전트 + +| 기능 | 구현 | +|------|------| +| **서브에이전트** | SubAgentTool — 독립 컨텍스트에서 작업 위임 | +| **Worktree 격리** | Git worktree 기반 서브에이전트 독립 작업 | +| **백그라운드 실행** | BackgroundAgentService — 비동기 실행 + 완료 알림 | +| **코디네이터** | 계획 수립 → 서브에이전트 분배 → 결과 병합 | + +--- + +## 14. 외부 의존성 + +### 14.1 NuGet 패키지 (7개) + +| 패키지 | 버전 | 용도 | 크기 | +|--------|------|------|------| +| DocumentFormat.OpenXml | 3.2.0 | Office 문서 생성 (DOCX/XLSX/PPTX) | ~5MB | +| Markdig | 0.37.0 | Markdown 파싱/렌더링 | ~1MB | +| Microsoft.Data.Sqlite | 8.0.0 | SQLite 로컬 DB | ~2MB | +| Microsoft.Web.WebView2 | 1.0.2903.40 | 내장 브라우저 | ~3MB | +| System.Security.Cryptography.ProtectedData | 8.0.0 | DPAPI 암호화 | <1MB | +| System.ServiceProcess.ServiceController | 8.0.1 | Windows 서비스 관리 | <1MB | +| UglyToad.PdfPig | 1.7.0-custom-5 | PDF 파싱/텍스트 추출 | ~2MB | + +### 14.2 시스템 의존성 + +| 의존성 | 용도 | +|--------|------| +| .NET 8.0 Runtime | 앱 실행 (self-contained) | +| WebView2 Runtime | HTML 렌더링, 가이드 뷰어 | +| Segoe MDL2 Assets | 시스템 아이콘 폰트 | +| Windows 10+ | WPF, DPAPI, P/Invoke | + +--- + +## 15. 코드 품질 리팩터링 이력 (Phase 33~36) + +### 15.1 Phase 33 — AgentLoopService 구조 개선 + +| 작업 | 내용 | +|------|------| +| 매직 넘버 상수화 | 16개 `Defaults` 상수 클래스 | +| RunAsync 분해 | `ProcessSingleToolCallAsync` 250줄 추출 (27% 감소) | +| 중복 제거 | AutoCompactMonitor + ContextCondenser 통합 | +| 레이스 컨디션 | ActiveTab 스냅샷 패턴 적용 | +| 에러 핸들링 | bare catch → `catch (Exception)` + 주석 | + +### 15.2 Phase 34 — ChatWindow God Class 분해 + +| 작업 | 내용 | +|------|------| +| ThemeResourceHelper | `TryFindResource` 190건 → 헬퍼 메서드 | +| FontFamily 캐싱 | 54건 `new FontFamily()` → 정적 필드 | +| PopupMenuHelper | 팝업 생성 패턴 통합 헬퍼 | +| RunAgentLoopAsync | Cowork/Code 70줄 중복 → 40줄 통합 | + +### 15.3 Phase 35 — 코드 품질 심층 정리 + +| 작업 | 영향 범위 | +|------|----------| +| bare catch 전량 정리 | 109개 파일 | +| ColorConverter 헬퍼 | 81건 → `HexBrush()`/`HexColor()` | +| `_settings.Settings.Llm` 캐싱 | 92건 → `Llm` 프로퍼티 | +| AgentContext.Settings DI | 11개 도구 서비스 로케이터 제거 | + +### 15.4 Phase 36 — 서비스 로케이터 제거 + PopupMenuHelper 적용 + +| 작업 | 영향 범위 | +|------|----------| +| `Application.Current as App` 일원화 | 15개 파일, 39건 → `CurrentApp` | +| PopupMenuHelper 실제 적용 | 4개 팝업 메서드, 169줄 감소 | + +--- + +## 16. 빌드 및 배포 + +### 16.1 빌드 구성 + +```xml + + WinExe + net8.0-windows + win-x64 + true + true + +``` + +### 16.2 배포 체계 + +| 항목 | 설명 | +|------|------| +| **인스톨러** | AxCopilot.Installer (WinForms 기반) | +| **업데이트** | 수동 인스톨러 실행 (자동 업데이트 없음) | +| **배포 크기** | 목표 150MB 이하 (현재 ~80MB) | +| **데이터** | `%APPDATA%\AxCopilot\` 로컬 저장 | + +### 16.3 가이드 문서 체계 + +``` +개발자 가이드 (.htm) → 암호화 → guide_dev.enc → 앱 내장 뷰어 + ↓ +사용자 가이드 (.htm) → 암호화 → guide_user.enc → 앱 내장 뷰어 +(버전이력 제거) +``` + +--- + +## 17. 프로젝트 파일 구조 + +``` +E:\AX Copilot\ +├── docs/ +│ ├── AGENT_ROADMAP.md # AI 에이전트 로드맵 +│ ├── LAUNCHER_ROADMAP.md # 런처 로드맵 +│ ├── NEXT_ROADMAP.md # 종합 차기 계획 +│ ├── DEVELOPMENT.md # 개발 문서 +│ └── TECHNOLOGY_OVERVIEW.md # ← 이 문서 +├── src/ +│ ├── AxCopilot/ # 메인 앱 +│ │ ├── Services/ # 서비스 계층 (43+ 파일) +│ │ │ └── Agent/ # 에이전트 서비스 +│ │ │ ├── 64 tool files # IAgentTool 구현체 +│ │ │ ├── SlashCommands/ # 15개 슬래시 명령 +│ │ │ └── Sdk/ # MCP SDK 서버 +│ │ ├── Handlers/ # 런처 핸들러 (44개) +│ │ ├── Views/ # UI 윈도우 (27개) +│ │ │ └── Controls/ # 재사용 컨트롤 (4개) +│ │ ├── ViewModels/ # MVVM ViewModel +│ │ ├── Models/ # 데이터 모델 +│ │ ├── Themes/ # 10개 테마 XAML +│ │ ├── Assets/ # 정적 리소스 +│ │ │ └── Presets/ # 20개 프리셋 +│ │ ├── skills/ # 40개 내장 스킬 +│ │ └── Core/ # 핵심 유틸리티 +│ ├── AxCopilot.Installer/ # 인스톨러 프로젝트 +│ ├── AxCopilot.SDK/ # 외부 SDK +│ └── AxCopilot.Tests/ # 단위 테스트 +└── CLAUDE.md # AI 개발 지시사항 +``` + +--- + +## 18. 완료된 Phase 전체 목록 + +### AI 에이전트 (Phase 2.5 ~ 36) + +| Phase | 제목 | 버전 | 상태 | +|-------|------|------|------| +| 2.5-7 | 에이전트 루프, 마크다운, Code 탭 | v1.1-1.2.1 | ✅ | +| 7.5 | 레인보우 글로우, 테마 개선 | v1.2.2 | ✅ | +| 8 | MCP, 모델 폴백, 분기, 토큰 관리 | v1.5.0 | ✅ | +| 9 | LSP, 병렬 에이전트, 코드 검색, 테스트 루프 | v1.5.0 | ✅ | +| 10 | 모델 라우터, 메모리, 훅, 멀티모달 | v1.5.0 | ✅ | +| 11 | 스킬 시스템, 코드 리뷰, 드래그 앤 드롭 | v1.5.0 | ✅ | +| 12 | 도구 관리 UI, SKILL.md, 스킬 에디터/갤러리 | v1.5.x | ✅ | +| 15 | 문서 엔진, PPT, 피벗, 16 내장 스킬 | v1.6.0 | ✅ | +| 16 | Plan 모드, 프로젝트 규칙, 병렬 실행 | v1.7.0 | ✅ | +| 16.5 | 검증 강제, 후처리 검증, 피드백 학습 | v1.7.1 | ✅ | +| 16.8 | 컨텍스트 압축, 이력 복원, 속도 개선 | v1.7.2 | ✅ | +| 17-UI | 3-Pane 채팅 화면 재설계 | v1.8.0 | ✅ | +| 17-A~G | Reflexion, 태스크 상태, 훅, 스킬, 메모리, 권한, Diff | v1.8.0 | ✅ | +| 18-A~C | 멀티에이전트, 리플레이, 플러그인 갤러리 | v2.0 | ✅ | +| 19~19-G | CC 동등성 달성 (메모리, 권한, 훅, 스킬, 세션) | v2.1 | ✅ | +| 22~29 | 슬래시 명령 14개, 최종 통합 검증 | v2.1 | ✅ | +| 30 | 아키텍처 정제, 계층적 메모리 | v2.1 | ✅ | +| 31 | SDK 제어 프로토콜 (JSON 스트리밍) | v2.2 | ✅ | +| 32 | 3-Pane Claude.ai UI 구조 | v2.3 | ✅ | +| 33 | AgentLoopService 코드 품질 리팩터링 | v2.3 | ✅ | +| 34 | ChatWindow God Class 분해 | v2.3 | ✅ | +| 35 | 코드 품질 심층 정리 (bare catch, 색상, DI) | v2.3 | ✅ | +| 36 | 서비스 로케이터 제거 + PopupMenuHelper | v2.3 | ✅ | + +### 런처 (Phase L1 ~ L2+) + +| Phase | 제목 | 버전 | 상태 | +|-------|------|------|------| +| L1 | 44 핸들러, 퍼지 검색, 10 테마, 플러그인 | v1.5.0 | ✅ | +| L1+ | 셸 확장, 스토리지, 독 바 | v1.5.0 | ✅ | +| L2 | 클립보드 강화, UX 개선 | v1.5.3 | ✅ | +| L2+ | 독 바 정렬, 가이드 뷰어, 정보 업데이트 | v1.5.3 | ✅ | + +--- + +> **Claude Code 동등성**: 37/37 핵심 기능 구현 완료 +> **코드 품질 리팩터링**: Phase 33~36, 4차 반복 완료 +> **빌드 상태**: 경고 0, 오류 0 diff --git a/docs/USER_MANUAL.md b/docs/USER_MANUAL.md new file mode 100644 index 0000000..4638d93 --- /dev/null +++ b/docs/USER_MANUAL.md @@ -0,0 +1,674 @@ +# AX Commander 사용 매뉴얼 (v1.0.3) + +> 사내 전용 런처 프로그램 — 키보드 하나로 파일·명령·클립보드·계산까지 + +--- + +## 목차 + +1. [시작하기](#1-시작하기) +2. [기본 사용법](#2-기본-사용법) +3. [명령어 프리픽스 가이드](#3-명령어-프리픽스-가이드) +4. [파일 및 앱 검색](#4-파일-및-앱-검색) +5. [파일 액션 서브메뉴](#5-파일-액션-서브메뉴) +6. [Large Type](#6-large-type) +7. [클립보드 합치기](#7-클립보드-합치기) +8. [설정 변경](#8-설정-변경) +9. [잠금 해제 사용시간 알림](#9-잠금-해제-사용시간-알림) +10. [전체 키보드 단축키 표](#10-전체-키보드-단축키-표) +11. [자주 묻는 질문](#11-자주-묻는-질문) + +> **v1.0 정식 릴리스** — 30개+ 명령어, 9개 테마(모양 포함), 클립보드 DPAPI 암호화, 글로벌 캡처 단축키, 잠금 해제 알림, 다국어(ko/en/ja/zh/vi), 텍스트 통계·즐겨찾기·파일 이름변경·시스템 모니터·프로젝트 스캐폴딩, AX Agent AI 대화(프롬프트 카드, 코드 구문 강조, 토큰 사용량, 타이핑 효과, 지연 캡처) + +--- + +## 1. 시작하기 + +### 설치 방법 + +| 방법 | 파일 | 설명 | +|------|------|------| +| **오프라인 인스톨러** | `AxCommander_Setup.exe` (~136MB) | 모든 것 내장, 인터넷 불필요. 설치 경로 선택, 바로가기, 프로그램 등록 | +| **온라인 인스톨러 (경량)** | `AxCommander_Setup_Online.exe` (**~1MB**) | .NET 4.8 기반 (Windows 기본). .NET 8 Runtime 없으면 자동 다운로드 설치 | +| **직접 실행** | `AxCommander\` 폴더 | 폴더째 복사 후 `AxCommander.exe` 실행 (설치 과정 없음) | + +### 런처 열기 + +프로그램이 백그라운드에서 실행 중인 상태에서 기본 단축키를 누릅니다. + +``` +기본 단축키: Alt + Space +``` + +화면 중앙 상단에 런처 창이 나타납니다. + +### 런처 닫기 + +- `Esc` 키 +- 런처 창 밖을 클릭 + +### 시스템 트레이 + +작업 표시줄 우측 트레이 아이콘을 우클릭하면 메뉴가 나타납니다. + +| 메뉴 항목 | 아이콘 | 기능 | +|----------|--------|------| +| AX Commander 열기 | ⚡ | 런처 창 표시 | +| 설정 | ⚙ | 설정 창 열기 | +| 사용 통계 | 📊 | 런처 사용 현황 통계 창 열기 | +| 플러그인 재로드 | 🔌 | 외부 플러그인 다시 불러오기 | +| 로그 폴더 열기 | 📁 | 오류 로그 폴더를 탐색기로 열기 | +| 정보 | ℹ | 개발자 정보 및 버전 확인 | +| Windows 시작 시 자동 실행 | 💡 | 전구 아이콘 — 활성화되면 **앰버색으로 빛나는** 전구 표시. 체크 시 Windows 로그인 시 자동 시작 등록/해제 | +| 종료 | ✕ | 프로그램 완전 종료 | + +> 트레이 메뉴 디자인은 현재 테마 색상을 자동으로 따릅니다. Dark 테마면 어두운 배경, Light 테마면 밝은 배경으로 표시됩니다. + +--- + +## 2. 기본 사용법 + +### 검색하고 실행하기 + +1. `Alt+Space`로 런처를 엽니다 +2. 원하는 파일명, 앱 이름, 또는 명령어를 입력합니다 +3. `↑` / `↓` 방향키로 결과를 탐색합니다 +4. `Enter`를 눌러 실행합니다 + +``` +예시: + "chrome" → Google Chrome 실행 + "보고서" → 보고서.xlsx 파일 열기 + "다운" → 다운로드 폴더 열기 +``` + +### 자동완성 + +결과 목록에서 항목이 선택된 상태에서 `Tab`을 누르면 해당 항목의 이름이 입력창에 채워집니다. + +--- + +## 3. 명령어 프리픽스 가이드 + +특수 문자를 맨 앞에 입력하면 해당 기능 모드로 전환됩니다. +입력창 좌측에 컬러 배지가 표시되어 현재 모드를 알려줍니다. + +| 프리픽스 | 모드 | 예시 | +|---------|------|------| +| `@` | URL 별칭 열기 | `@gh` → GitHub 열기 | +| `~` | 폴더 별칭 열기 | `~dl` → 다운로드 폴더 열기 | +| `>` | 배치/명령 실행 | `>build` → 빌드 스크립트 실행 | +| `$` | 클립보드 텍스트 변환 | `$json` → 클립보드 내용 JSON 정렬 | +| `!` | 워크스페이스 관리 | `!save work` → 현재 창 배치 저장 | +| `#` | 클립보드 히스토리 | `#` → 최근 복사 내역 표시 | +| `;` | 텍스트 스니펫 | `;addr` → 회사 주소 붙여넣기 | +| `=` | 계산기·단위·통화 변환 | `=100 USD to KRW`, `=100km in miles` | +| `?` | 웹 검색 (10개 엔진) | `? 검색어` → 기본 엔진, `?n 검색어` → 네이버, `?g` 구글, `?y` 유튜브, `?nw` 나무위키 등 | +| `/` | 시스템 명령·타이머·알람 | `/timer 5m`, `/alarm 14:30`, `/lock` | +| `emoji` | 이모지 피커 | `emoji 하트` → ❤️ 클립보드 복사 | +| `color` | 색상 변환기 | `color #FF5500` → HEX/RGB/HSL/HSV | +| `recent` | 최근 파일 | `recent 보고서` → 최근 문서 검색 | +| `note` | 빠른 메모 | `note 내일 회의` → 저장 / `note` → 목록 | +| `uninstall` | 앱 제거 | `uninstall chrome` → 제거 실행 | +| `kill` | 프로세스 종료 | `kill chrome` → 크롬 프로세스 강제 종료 | +| `media` | 미디어 제어 | `media pause` → 재생/일시정지 | +| `info` 또는 `*` | 시스템 정보 | `info` → IP·배터리·볼륨 현황 (`*`로도 동일하게 사용 가능) | +| `cap` *(변경 가능)* | 화면 캡처 | `cap region` → 영역 선택, `cap window` → 창 캡처, `cap scroll` → 스크롤, `cap screen` → 전체 화면. Shift+Enter → 지연 캡처 | +| `pick` | 스포이드 색상 추출 | `pick` → 스포이드 모드, 클릭으로 HEX 색상 코드 추출 | +| `date` | 날짜 계산 · D-day | `date +30d`, `date 2026-12-25`, `date unix` | +| `svc` | 서비스 관리 | `svc` → 서비스 목록, `svc restart clipboard` → 클립보드 재시작 | +| `stats` | 텍스트 통계 분석 | `stats` → 클립보드 텍스트 글자·단어·줄 수 분석 | +| `fav` | 즐겨찾기 | `fav` → 목록, `fav add 보고서 C:\work\report.xlsx` → 등록 | +| `rename` | 파일 일괄 이름변경 | `rename C:\work\*.xlsx 보고서_{n}` → 순번 이름변경 | +| `monitor` | 시스템 리소스 모니터 | `monitor` → CPU·메모리·디스크·프로세스 현황 | +| `scaffold` | 프로젝트 스캐폴딩 | `scaffold webapi` → 프로젝트 폴더 구조 생성 | +| `pipe` | 클립보드 파이프라인 | `pipe upper > trim > b64e` → 변환 체이닝 | +| `journal` | 업무 일지 자동 생성 | `journal` → 오늘 사용 앱/명령어 기반 마크다운 보고서 | +| `routine` | 루틴 자동화 | `routine morning` → 등록된 앱/폴더/URL 일괄 실행 | +| `batch` | 텍스트 일괄 처리 | `batch number` → 줄번호, `batch sort` → 정렬 | +| `diff` | 텍스트/파일 비교 | `diff` → 클립보드 2개 비교, 파일 선택 비교 지원 | +| `win` | 윈도우 스위처 | `win chrome` → 열린 창 검색 후 즉시 전환 | +| `help` | 도움말 | `help` → 카테고리별 페이지 전체 기능 목록 창 | + +--- + +## 4. 파일 및 앱 검색 + +프리픽스 없이 텍스트를 입력하면 인덱싱된 파일과 앱을 검색합니다. + +### 검색 범위 + +- 바탕화면 +- Windows 시작 메뉴 (설치된 앱) +- 설정에서 추가한 인덱스 경로 + +### 한국어 초성 검색 지원 + +| 입력 | 검색되는 예시 | +|------|-------------| +| `ㅂㄱㅅ` | 보고서.xlsx | +| `ㅅㅈ` | 사진 폴더, 설정 | +| `ㄱㅅ` | 개선안.docx | + +### 빠른 실행 별칭 + +설정 → 빠른 실행 탭에서 자주 쓰는 파일/폴더/URL에 단축 키워드를 등록할 수 있습니다. + +``` +예시 등록: + 키워드: vscode → C:\...\Code.exe + 키워드: gh → https://github.com (@ 없이도 사용 가능) + 키워드: work → C:\Projects\ +``` + +--- + +## 5. 파일 액션 서브메뉴 + +파일이나 앱을 선택한 후 `→` 키를 누르면 해당 항목에 대한 액션 메뉴가 열립니다. + +### 진입 방법 + +1. 런처에서 파일 또는 앱을 검색합니다 +2. 원하는 항목을 `↑` / `↓`로 선택합니다 +3. **입력 커서가 텍스트 맨 끝에 있는 상태**에서 `→` 키를 누릅니다 +4. 상단에 파란색 breadcrumb 바가 나타나며 액션 목록이 표시됩니다 + +``` +← 보고서_최종.xlsx 에 대한 액션 · Esc로 돌아가기 +``` + +### 제공 액션 + +| 액션 | 설명 | +|------|------| +| 경로 복사 | 파일의 전체 경로를 클립보드에 복사 | +| 파일 탐색기에서 열기 | 탐색기에서 해당 파일을 선택된 상태로 열기 | +| 관리자 권한으로 실행 | UAC 권한 상승 후 실행 (파일에만 표시) | +| 터미널에서 열기 | Windows Terminal 또는 명령 프롬프트로 해당 경로 열기 | + +### 돌아가기 + +- `Esc`: 이전 검색 결과로 복귀 (이전에 입력한 텍스트 자동 복원) +- 액션 선택 후 `Enter`: 액션 실행 후 런처 자동 닫힘 + +--- + +## 6. Large Type + +선택된 텍스트를 전체 화면으로 크게 표시합니다. 발표, 화면 공유, 빠른 메모 확인에 유용합니다. + +### 사용법 + +1. 결과 목록에서 항목을 선택합니다 +2. `Shift+Enter`를 누릅니다 +3. 전체 화면 검은 오버레이 위에 텍스트가 크게 표시됩니다 + +### 표시 내용 + +| 선택 항목 유형 | Large Type으로 표시되는 내용 | +|--------------|---------------------------| +| 계산기 결과 (`=`) | 계산 결과 숫자 | +| 클립보드 히스토리 (`#`) | 복사된 텍스트 전체 내용 | +| 그 외 모든 항목 | 항목 제목 | + +### 닫기 + +- `Esc` 키 +- 화면 아무 곳이나 클릭 +- 우상단 `×` 버튼 + +> **팁**: `=3.14159265`를 계산기로 입력한 뒤 `Shift+Enter`를 누르면 파이 값을 크게 표시할 수 있습니다. + +--- + +## 7. 클립보드 합치기 + +클립보드 히스토리에서 여러 항목을 골라 한 번에 합쳐서 복사합니다. + +### 사용법 + +1. `#`을 입력해 클립보드 히스토리 모드로 진입합니다 +2. `Shift+↓` 또는 `Shift+↑`로 합치고 싶은 항목을 선택합니다 + - 선택할 때마다 하단 힌트 바에 선택 개수가 표시됩니다 + - 같은 키를 다시 누르면 선택이 해제됩니다 +3. `Shift+Enter`를 눌러 합치기를 실행합니다 +4. 선택한 항목들이 줄바꿈(`\n`)으로 연결되어 클립보드에 복사됩니다 + +``` +예시 결과: + 항목 1: "회의 안건" + 항목 2: "담당자: 홍길동" + 항목 3: "일시: 2026-03-24" + + → 클립보드에 복사되는 내용: + 회의 안건 + 담당자: 홍길동 + 일시: 2026-03-24 +``` + +### 힌트 바 + +선택된 항목이 있으면 화면 하단에 보라색 힌트 바가 나타납니다: + +``` +✓ 2개 선택됨 · Shift+Enter로 합치기 · Esc로 취소 +``` + +### 선택 취소 + +- `Esc`: 모든 선택을 취소하고 런처 닫기 +- 런처를 다시 열면 선택이 초기화됩니다 + +> **주의**: 클립보드 합치기 선택 항목이 있는 상태에서 `Shift+Enter`를 누르면 Large Type 대신 **합치기**가 실행됩니다. + +--- + +## 8. 설정 변경 + +`Ctrl+,` 또는 시스템 트레이 → 설정으로 설정 창을 엽니다. + +### 일반 탭 + +#### 글로벌 단축키 변경 + +현재 등록된 단축키 배지를 클릭하면 녹화 모드로 전환됩니다. + +``` +[클릭] → 녹화 중... → 원하는 키 조합 입력 → 자동 저장 +``` + +- 최소 하나의 보조 키(`Ctrl`, `Alt`, `Shift`, `Win`)가 포함되어야 합니다 +- `Esc`를 누르면 녹화를 취소합니다 +- 지원 예시: `Alt+Space`, `Ctrl+Alt+K`, `Win+Space` + +#### 기본 검색 엔진 + +`?` 프리픽스로 검색할 때 사용할 기본 검색 엔진을 선택합니다. + +| 옵션 | 검색 엔진 | +|------|---------| +| Google (기본) | www.google.com | +| Naver | search.naver.com | +| DuckDuckGo | duckduckgo.com | +| YouTube | youtube.com | +| Wikipedia | ko.wikipedia.org | + +특정 엔진을 직접 지정하려면 `?g 검색어`, `?n 검색어` 형식으로 입력할 수 있습니다. + +#### 런처 위치 + +런처 창이 화면에 나타나는 위치를 선택합니다. + +| 옵션 | 위치 | +|------|------| +| 상단 중앙 (기본) | 화면 상단 20% 지점 | +| 정중앙 | 화면 정가운데 | +| 하단 중앙 | 화면 하단 75% 지점 | + +#### 최대 결과 수 + +검색 결과로 표시할 최대 항목 수를 설정합니다 (기본: 7개). + +#### 창 투명도 + +런처 창의 불투명도를 조정합니다 (0.5 ~ 1.0). + +### 테마 탭 + +9가지 내장 테마 중 클릭하면 **즉시 미리보기**가 적용됩니다. +저장하지 않고 닫으면 이전 테마로 자동 복원됩니다. + +| 테마 | 특징 | +|------|------| +| System | Windows 다크/라이트 모드 자동 연동 | +| Dark | 기본 다크 모드 — 부드러운 라운딩 | +| Light | 밝은 화이트 테마 | +| OLED | 순수 검정 배경 (OLED 화면 최적화) — 가장 둥근 모양 | +| Nord | 차분한 북유럽 블루 계열 — 약간 각진 느낌 | +| Monokai | 에디터 스타일 컬러 — 직각에 가까운 모양 | +| Catppuccin | 파스텔 톤 — 둥근 모양 | +| Sepia | 따뜻한 베이지 계열 — 클래식한 각진 느낌 | +| Alfred | Alfred 앱 영감 다크 | +| Alfred Light | Alfred 앱 영감 라이트 | +| Custom | 색상 편집 탭에서 직접 지정 | + +> 각 테마는 **색상뿐 아니라 창·항목의 모서리 라운딩 비율도 다르게** 설정됩니다. OLED가 가장 둥글고, Monokai·Sepia가 가장 각집니다. + +### 스니펫 탭 (`;` 프리픽스) + +자주 입력하는 문구를 등록합니다. 런처에서 `;키워드`로 검색 후 `Enter`를 누르면 현재 포커스된 창에 텍스트가 입력됩니다. + +#### 글로벌 스니펫 자동 확장 + +탭 최상단의 토글을 켜면 **런처를 열지 않아도** 모든 앱에서 `;키워드 + Space 또는 Enter`를 입력하는 순간 자동으로 텍스트가 치환됩니다. + +``` +토글 OFF: 런처에서만 스니펫 사용 가능 +토글 ON: 어떤 앱에서든 ;addr + Space → 회사 주소로 자동 치환 +``` + +**동적 변수 사용 가능**: + +| 변수 | 치환 내용 | +|------|----------| +| `{date}` | 오늘 날짜 (예: 2026-03-24) | +| `{time}` | 현재 시간 (예: 14:30) | +| `{datetime}` | 날짜+시간 | +| `{year}` / `{month}` / `{day}` | 연/월/일 | + +``` +예시 스니펫: + 키: sign + 내용: 안녕하세요, {date} 작성한 홍길동입니다. +``` + +### 클립보드 탭 + +| 설정 | 설명 | +|------|------| +| 클립보드 히스토리 활성화 | `#` 모드 사용 여부 | +| 최대 보관 개수 | 저장할 히스토리 항목 수 (기본: 50개) | +| 보안 제외 패턴 | 신용카드·주민번호 등 민감 데이터 자동 차단 패턴 | + +### 시스템 탭 + +`/` 프리픽스 시스템 명령의 표시 여부를 항목별로 켜거나 끌 수 있습니다. + +### 빠른 실행 탭 + +키워드 → 파일/URL/폴더 단축키를 추가/삭제합니다. + +| 타입 | 예시 | +|------|------| +| 앱 | `vscode` → `C:\...\Code.exe` | +| URL | `gh` → `https://github.com` | +| 폴더 | `dl` → `%USERPROFILE%\Downloads` | + +### 배치 명령 탭 + +`>` 프리픽스 명령 단축키를 관리합니다. + +| 항목 | 설명 | +|------|------| +| 키워드 | `>` 이후 입력할 키워드 (예: `build`, `test`) | +| 명령어 | 실행할 PowerShell 또는 cmd 명령어 | +| 창 표시 | 체크 시 터미널 창이 화면에 표시됨 | + +``` +예시 등록: + 키워드: build → dotnet build (창 표시: ✓) + 키워드: open → explorer . (창 표시: ✗) +``` + +### 캡처 탭 + +화면 캡처(`cap`) 기능의 세부 설정을 변경합니다. +캡처 결과는 보안 정책에 따라 **클립보드에만 복사**되며, 파일로 저장하는 기능은 제공하지 않습니다. + +| 설정 | 설명 | +|------|------| +| 캡처 프리픽스 | `cap` 대신 사용할 다른 단어를 입력합니다 (예: `sc`, `screenshot`). 변경 후 저장하면 즉시 적용됩니다 | +| 글로벌 캡처 단축키 사용 | 런처를 열지 않고 단축키만으로 바로 캡처합니다 (기본: **비활성화**) | +| 캡처 단축키 | 글로벌 단축키 키 조합 (기본: `PrintScreen`). 클릭 후 원하는 키를 누르면 변경됩니다 | +| 단축키 실행 모드 | 단축키를 눌렀을 때 실행할 캡처 모드 — 전체 화면 / 활성 창 / 영역 선택 | +| 스크롤 캡처 대기 시간 | 스크롤 캡처 시 프레임 간 대기 시간 (80~500ms). 느린 페이지에서 누락이 발생하면 값을 높이세요 | + +#### 지연 캡처 (Shift+Enter) + +캡처 모드에서 항목을 선택한 상태로 `Shift+Enter`를 누르면 지연 캡처 타이머 선택 화면이 표시됩니다. + +1. `cap`을 입력해 캡처 모드로 진입합니다 +2. 원하는 캡처 모드(영역 선택, 활성 창, 스크롤, 전체 화면)를 선택합니다 +3. `Shift+Enter`를 누르면 타이머 선택 목록(3초/5초/10초)이 표시됩니다 +4. 원하는 시간을 선택하고 `Enter`를 누르면 카운트다운 알림 후 캡처가 실행됩니다 + +> **팁**: 메뉴가 숨겨져야 하는 상황이나 특정 UI 상태를 캡처할 때 유용합니다. + +#### 영역 선택 캡처 (cap region) 키보드 미세조정 + +마우스 드래그로 영역을 선택한 뒤 키보드로 미세 조정할 수 있습니다: + +| 키 | 동작 | +|----|------| +| `←` `→` `↑` `↓` | 선택 영역 1px 미세 조정 | +| `Shift+방향키` | 10px 단위 조정 | +| `Enter` | 현재 선택 확정 | +| `Esc` | 취소 | + +### 알림 탭 + +PC 잠금 해제 시 오늘 누적 사용 시간을 알려주는 팝업 기능을 설정합니다. + +| 설정 | 설명 | +|------|------| +| 잠금 해제 알림 활성화 | 기능 전체를 켜거나 끕니다 | +| 표시 위치 | 팝업이 나타날 화면 모서리를 선택합니다 (우하단/좌하단/우상단/좌상단) | +| 표시 간격 | 알림을 너무 자주 표시하지 않도록 최소 간격을 설정합니다 (30분/1시간/2시간/4시간) | +| 자동 닫힘 | 팝업이 자동으로 닫히기까지의 시간을 설정합니다 (5~30초) | + +### 설정 내보내기 / 불러오기 + +설정 창 하단 좌측의 **내보내기** / **불러오기** 버튼으로 설정을 공유할 수 있습니다. + +| 기능 | 설명 | +|------|------| +| 내보내기 | 현재 settings.json을 `.axsettings` 파일로 저장 | +| 불러오기 | `.axsettings` 파일에서 설정을 덮어쓰기 (앱 재시작 필요) | + +> 동료에게 설정 파일을 공유하면 동일한 단축키, 스니펫, 별칭을 즉시 사용할 수 있습니다. + +### 예약어 충돌 방지 + +캡처 프리픽스, 빠른 실행 키워드, 배치 명령 키워드가 시스템 예약어(=, ?, #, $, ;, help, cap 등)와 충돌하면 **저장이 거부되고 알림 팝업**이 표시됩니다. + +### Windows 시작 시 자동 실행 + +트레이 아이콘 우클릭 → **Windows 시작 시 자동 실행** 항목을 체크/해제합니다. + +- 체크 시: Windows 로그인할 때마다 AX Commander가 자동으로 시작됩니다 +- 해제 시: 수동으로 EXE를 실행해야 합니다 +- 설정은 Windows 레지스트리(`HKCU\...\Run`)에 저장되며 관리자 권한이 필요하지 않습니다 + +### 정보 창 + +트레이 아이콘 우클릭 → **정보**를 클릭하면 개발자 정보와 버전을 확인할 수 있습니다. + +- 상단에 **다이아몬드 픽셀 보석** 앱 아이콘이 표시됩니다 (Blue/Green/Red/Green 4색 보석 컷 디자인) +- 개발자 이름을 클릭하면 마스코트 이미지가 오버레이로 표시됩니다 + +--- + +## 9. 잠금 해제 사용시간 알림 + +PC 잠금을 해제할 때 오늘 하루 누적 사용 시간을 작은 팝업으로 알려주는 기능입니다. + +### 팝업 내용 + +``` +┌─────────────────────────────────┐ +│ 오늘 누적 사용 시간 │ +│ 3시간 42분 │ +│ │ +│ "삶이란 자전거를 타는 것과 같다. │ +│ 계속 움직여야 균형을 잡을 수 있다" │ +│ — 아인슈타인│ +└─────────────────────────────────┘ +``` + +- 매번 잠금 해제 시 표시되는 것이 아니라, **설정한 간격 이상** 시간이 지난 경우에만 나타납니다 +- 팝업은 런처와 완전히 별개로 동작하며 포커스를 빼앗지 않습니다 +- 클릭하거나 설정한 시간이 지나면 자동으로 닫힙니다 + +### 활성화 방법 + +`설정(Ctrl+,)` → **알림 탭** → "잠금 해제 알림 활성화" 토글을 켭니다. + +### 팝업 위치 설정 + +| 옵션 | 위치 | +|------|------| +| 우하단 (기본) | 화면 오른쪽 아래 모서리 | +| 좌하단 | 화면 왼쪽 아래 모서리 | +| 우상단 | 화면 오른쪽 위 모서리 | +| 좌상단 | 화면 왼쪽 위 모서리 | + +--- + +## 10. 전체 키보드 단축키 표 + +### 런처 창 + +| 단축키 | 동작 | +|--------|------| +| `Alt+Space` | 런처 열기 / 닫기 (기본, 변경 가능) | +| `↑` / `↓` | 결과 목록 위아래 이동 | +| `Enter` | 선택 항목 실행 | +| `Shift+Enter` | Large Type 표시 / 병합 대기 항목 있으면 합치기 실행 / 캡처 모드에서는 지연 캡처(3초/5초/10초) 타이머 선택 | +| `→` | 파일 액션 서브메뉴 진입 (커서가 텍스트 끝에 있을 때) | +| `Shift+↓` | 현재 항목 병합 선택/해제 후 다음 항목으로 이동 | +| `Shift+↑` | 현재 항목 병합 선택/해제 후 이전 항목으로 이동 | +| `Tab` | 선택 항목 제목을 입력창에 자동완성 | +| `Esc` | 액션 서브메뉴 중이면 이전으로 / 아니면 런처 닫기 | +| `Ctrl+,` | 설정 창 열기 | + +### Large Type 창 + +| 단축키 | 동작 | +|--------|------| +| `Esc` | 닫기 | +| 마우스 클릭 | 닫기 | + +--- + +## 11. 자주 묻는 질문 + +**Q. 단축키를 눌러도 런처가 열리지 않습니다.** + +다른 프로그램이 같은 단축키를 사용하고 있을 수 있습니다. 트레이 아이콘에 경고 알림이 표시됩니다. 설정(`Ctrl+,`) → 일반 탭에서 단축키를 변경하세요. + +--- + +**Q. 검색해도 파일이 나오지 않습니다.** + +파일이 인덱스 경로에 포함되어 있지 않을 수 있습니다. 설정 → 일반 탭에서 인덱스 경로를 추가하세요 (기본: 바탕화면, 시작 메뉴). + +또한 해당 파일의 확장자가 검색 확장자 목록에 포함되어야 합니다. 설정 → 일반 탭 하단의 **검색할 확장자** 섹션에서 확장자를 추가할 수 있습니다. 기본값에는 실행 파일, 문서, 이미지, 텍스트 파일이 포함되어 있습니다. 폴더도 검색 가능하며 Enter로 탐색기에서 열 수 있습니다. + +인덱스는 앱 시작 시 자동으로 빌드되며, 이후 파일/폴더 변경을 감지해 자동 갱신됩니다. 설정 저장 시 인덱스가 재빌드되며 프로그레스바가 표시됩니다. + +--- + +**Q. 클립보드 히스토리(`#`)에 내용이 보이지 않습니다.** + +설정 → 클립보드 탭에서 "클립보드 히스토리 활성화"가 켜져 있는지 확인하세요. 또한 복사한 내용이 보안 제외 패턴(신용카드 번호 등)에 해당하면 자동으로 저장되지 않습니다. + +> **보안 참고**: 클립보드 히스토리는 Windows DPAPI 암호화로 저장됩니다. 현재 Windows 사용자 계정에서만 복호화할 수 있으며, 다른 사용자나 PC에서는 파일을 열어도 내용을 볼 수 없습니다. + +--- + +**Q. 계산기(`=`)에서 어떤 수식을 사용할 수 있나요?** + +| 종류 | 예시 | +|------|------| +| 기본 연산 | `=100*12+50` | +| 거듭제곱 | `=2^10` | +| 나머지 | `=17%5` | +| 수학 함수 | `=sqrt(144)`, `=sin(pi/2)` | +| 로그 | `=log(1000)`, `=ln(e)` | +| 상수 | `pi`, `e` | +| 16진수 | `=0xFF+1` | +| 과학적 표기 | `=1.5e3*2` | +| 단위 변환 | `=100km in miles`, `=32f in c`, `=5lb to kg` | +| 통화 변환 | `=100 USD to KRW`, `=50 EUR in JPY` (실시간 환율) | + +--- + +**Q. 타이머는 어떻게 사용하나요?** + +`/` 프리픽스를 사용합니다: + +| 입력 | 동작 | +|------|------| +| `/timer 5m` | 5분 후 트레이 알림 | +| `/timer 1h30m` | 1시간 30분 후 알림 | +| `/timer 30s 회의 준비` | 30초 후 "회의 준비" 알림 | +| `/alarm 14:30` | 오후 2시 30분에 알림 (지나면 다음날로 자동 설정) | + +Enter로 시작하면 백그라운드에서 카운트가 진행되고, 완료 시 트레이 아이콘에서 풍선 알림이 나타납니다. + +--- + +**Q. 이모지를 빠르게 복사하려면?** + +`emoji` 를 입력한 뒤 검색어를 입력하세요: + +``` +emoji 하트 → ❤️ 빨간 하트, 🧡 주황 하트, 💜 보라 하트 … +emoji 웃음 → 😀 😂 🤣 … +emoji thumbs → 👍 👎 +emoji → 자주 쓰는 이모지 30개 기본 표시 +``` + +Enter를 누르면 해당 이모지가 클립보드에 복사됩니다. + +--- + +**Q. `→` 키를 눌러도 액션 메뉴가 열리지 않습니다.** + +두 가지 조건을 모두 충족해야 합니다: +1. 검색 결과 중 파일 또는 앱 항목이 선택되어 있어야 합니다 (URL, 스니펫, 계산기 결과 불가) +2. 입력 커서가 텍스트의 **맨 끝**에 위치해 있어야 합니다 (`End` 키로 이동 후 시도) + +--- + +**Q. 플러그인을 추가하려면 어떻게 하나요?** + +DLL 플러그인은 `IActionHandler` 인터페이스를 구현한 후 트레이 → 설정 → (settings.json의 `plugins` 배열)에 경로를 등록합니다. 등록 후 트레이 → 플러그인 재로드를 클릭하면 즉시 적용됩니다. + +--- + +**Q. `cap` 명령어를 다른 이름으로 바꾸려면?** + +설정(`Ctrl+,`) → **캡처 탭** → "캡처 프리픽스" 입력란에 원하는 단어를 입력한 뒤 저장합니다. 예) `sc` → `sc screen`, `sc window`. + +--- + +**Q. 잠금 해제 알림이 너무 자주 나타납니다.** + +설정(`Ctrl+,`) → **알림 탭** → "표시 간격"을 더 긴 시간(2시간 또는 4시간)으로 변경하세요. + +--- + +**Q. `*` 입력이 `info`와 같은 건가요?** + +네, `*` 단독 입력 또는 `* ip`, `* battery`처럼 사용하면 `info`, `info ip`와 완전히 동일하게 동작합니다. + +--- + +**Q. `help`는 어떻게 사용하나요?** + +- `help` → 전체 기능 목록 창 열기 +- `help 계산` → 계산 관련 명령어만 필터 +- `help clip` → 클립보드 관련 명령어만 필터 +- 항목 선택 후 `Enter` → 해당 예시를 클립보드에 복사 + +--- + +**Q. 설정이나 히스토리 파일은 어디에 저장되나요?** + +모든 데이터는 `%APPDATA%\AxCommander\` 폴더에 저장됩니다. EXE 파일 옆에는 아무것도 생성되지 않으므로 USB나 네트워크 드라이브에서 실행해도 깨끗합니다. + +| 파일 | 설명 | 자동 삭제 | +|------|------|----------| +| `settings.json` | 전체 설정 | 수동 | +| `clipboard_history.dat` | 클립보드 히스토리 (DPAPI 암호화) | 최대 개수 제한 | +| `logs/app-*.log` | 일별 로그 | **14일** 후 자동 삭제 | +| `stats/*.json` | 일별 사용 통계 | **30일** 후 자동 삭제 | +| `favorites.json` | 즐겨찾기 | 수동 | +| `routines.json` | 루틴 정의 | 수동 | +| `notes.txt` | 빠른 메모 | 수동 (`note clear`로 삭제) | + +--- + +*AX Commander — 사내 전용 프로그램* diff --git a/docs/claude-code-docs-main/00_목차.md b/docs/claude-code-docs-main/00_목차.md new file mode 100644 index 0000000..fd693af --- /dev/null +++ b/docs/claude-code-docs-main/00_목차.md @@ -0,0 +1,38 @@ +# Claude Code 공식 문서 (한국어 번역) + +> 출처: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> 번역 일자: 2026-04-01 + +--- + +## 문서 목록 + +### 소개 +- [01_소개.md](./01_소개.md) — Claude Code란 무엇인가 +- [02_빠른시작.md](./02_빠른시작.md) — 5분 안에 시작하기 +- [03_설치.md](./03_설치.md) — 설치 상세 가이드 + +### 핵심 개념 +- [04_작동원리.md](./04_작동원리.md) — Claude Code가 어떻게 생각하고 행동하는가 +- [05_메모리와컨텍스트.md](./05_메모리와컨텍스트.md) — CLAUDE.md 메모리 시스템 +- [06_권한시스템.md](./06_권한시스템.md) — 퍼미션 모드와 허용/차단 규칙 +- [07_도구목록.md](./07_도구목록.md) — 사용 가능한 도구들 + +### 설정 +- [08_CLAUDE.md설정.md](./08_CLAUDE.md설정.md) — 프로젝트 메모리 파일 작성법 +- [09_환경변수.md](./09_환경변수.md) — 환경 변수 레퍼런스 +- [10_설정파일.md](./10_설정파일.md) — settings.json 레퍼런스 + +### 가이드 +- [11_인증.md](./11_인증.md) — 인증 방법 (OAuth, API 키, Bedrock, Vertex) +- [12_훅.md](./12_훅.md) — 훅 시스템 가이드 +- [13_MCP서버.md](./13_MCP서버.md) — MCP 서버 연결 및 관리 +- [14_멀티에이전트.md](./14_멀티에이전트.md) — 서브에이전트와 병렬 작업 +- [15_스킬.md](./15_스킬.md) — 재사용 가능한 스킬 만들기 + +### 레퍼런스 +- [16_커맨드개요.md](./16_커맨드개요.md) — CLI 플래그 vs 슬래시 커맨드 +- [17_CLI플래그.md](./17_CLI플래그.md) — 모든 CLI 플래그 상세 +- [18_슬래시커맨드.md](./18_슬래시커맨드.md) — 세션 내 슬래시 커맨드 +- [19_훅레퍼런스.md](./19_훅레퍼런스.md) — 훅 이벤트 전체 레퍼런스 +- [20_SDK개요.md](./20_SDK개요.md) — SDK stdin/stdout 제어 프로토콜 diff --git a/docs/claude-code-docs-main/01_소개.md b/docs/claude-code-docs-main/01_소개.md new file mode 100644 index 0000000..4a4ff34 --- /dev/null +++ b/docs/claude-code-docs-main/01_소개.md @@ -0,0 +1,54 @@ +# 소개 + +> Claude Code는 터미널에서 실행되는 AI 코딩 에이전트로, 전체 코드베이스에 걸쳐 코드를 읽고, 편집하고, 실행합니다. + +Claude Code는 Claude를 기반으로 만들어진 터미널 기반 AI 에이전트입니다. 파일 시스템, 셸, 도구에 직접 접근할 수 있어서, 자연어로 작업을 설명하면 Claude가 처음부터 끝까지 구현을 처리합니다 — 복사&붙여넣기 없이, 컨텍스트 전환 없이. + +## Claude Code가 할 수 있는 일 + +- **파일 읽기 및 편집** — 소스 파일을 읽고, 새 내용을 작성하고, 정밀하게 편집합니다. 변경 사항을 적용하기 전에 diff를 보여줘서 사용자가 통제권을 유지합니다. +- **셸 커맨드 실행** — 테스트, 빌드 스크립트, git 작업 등 모든 셸 커맨드를 실행합니다. 설정 가능한 권한 제어로 안전성을 보장합니다. +- **코드베이스 검색** — glob 패턴으로 파일을 찾고, 정규식으로 내용을 검색하며, 모든 파일을 수동으로 읽지 않아도 대규모 코드베이스를 탐색합니다. +- **웹에서 정보 가져오기** — 문서를 가져오거나, API 스펙을 읽거나, 웹을 검색합니다 — 모두 터미널 세션에서 벗어나지 않고. +- **서브에이전트 생성** — 복잡한 작업을 병렬 워크스트림으로 분리합니다. Claude가 여러 에이전트를 스폰하고 조율해서 문제의 각 부분을 동시에 처리합니다. +- **MCP 서버 연결** — 데이터베이스, API, 내부 도구 등을 위한 Model Context Protocol 서버로 Claude의 역량을 확장합니다. + +## 권한 시스템 + +Claude Code의 모든 도구 사용은 권한 확인을 거칩니다. 사용자가 Claude에게 얼마나 많은 자율성을 줄지 제어합니다. + +| 모드 | 동작 | +|------|------| +| `default` | 셸 커맨드 실행 및 편집 전에 Claude가 확인을 요청합니다. 각 작업을 승인하거나 거부할 수 있습니다. | +| `acceptEdits` | 파일 편집이 자동으로 적용됩니다. 셸 커맨드는 여전히 승인이 필요합니다. | +| `plan` | Claude가 계획을 만들고 어떤 작업도 실행하기 전에 승인을 요청합니다. 큰 변경 사항이 발생하기 전에 검토하기 좋습니다. | +| `bypassPermissions` | 모든 작업이 프롬프트 없이 실행됩니다. 샌드박스 환경의 자동화 파이프라인 전용 — 대화형 사용에는 적합하지 않습니다. | + +> ⚠️ `bypassPermissions` 모드는 모든 확인 프롬프트를 비활성화합니다. Claude가 작업 범위 외부의 시스템에 영향을 줄 수 없는 격리된 환경(Docker 컨테이너, CI 샌드박스)에서만 사용하세요. + +시작 시 `--permission-mode` 플래그로 설정하거나, 세션 중 `/permissions`로 변경하세요: + +```bash +claude --permission-mode acceptEdits +``` + +## CLAUDE.md 메모리 시스템 + +Claude Code는 매 세션 시작 시 저장소의 `CLAUDE.md` 파일을 읽습니다. 이 파일을 통해 프로젝트별 지식 — 빌드 커맨드, 코딩 컨벤션, 아키텍처 노트, 필요한 환경 변수 등 — 을 인코딩할 수 있어서, Claude가 매번 처음부터 다시 발견할 필요가 없습니다. + +세 가지 범위: + +- **프로젝트** (`CLAUDE.md` — 저장소 루트) — 팀 전체가 공유, 소스 컨트롤에 커밋 +- **개인** (`CLAUDE.local.md` — 저장소 루트) — 이 프로젝트에 대한 개인 설정, gitignore됨 +- **서브디렉토리** (서브디렉토리 안의 `CLAUDE.md`) — Claude가 해당 디렉토리에서 작업할 때 자동으로 로드됨. 별개의 모듈이 있는 모노레포에 유용 + +Claude Code 세션 안에서 `/init`을 실행하면 프로젝트의 `CLAUDE.md`가 자동으로 생성됩니다. + +> 💡 `CLAUDE.md`는 간결하게 유지하세요. 모든 줄이 이 테스트를 통과해야 합니다: "이것을 제거하면 Claude가 실수를 할까?" 그렇지 않다면 삭제하세요. + +## 인증 + +Claude Code는 두 가지 방식으로 인증합니다: + +1. **OAuth (권장)** — `claude.ai`에서 Anthropic 계정으로 로그인. 처음 `claude`를 실행하면 브라우저 프롬프트가 나타납니다. +2. **API 키** — `ANTHROPIC_API_KEY` 환경 변수를 설정. CI 파이프라인과 비대화형 세션에 유용합니다. diff --git a/docs/claude-code-docs-main/02_빠른시작.md b/docs/claude-code-docs-main/02_빠른시작.md new file mode 100644 index 0000000..3d8e1b1 --- /dev/null +++ b/docs/claude-code-docs-main/02_빠른시작.md @@ -0,0 +1,127 @@ +# 빠른 시작 + +> Claude Code를 설치하고, 인증하고, 5분 안에 첫 번째 코딩 작업을 완료하세요. + +## 사전 요구사항 + +- Node.js 18 이상 +- npm + +Node.js 버전 확인: + +```bash +node --version +``` + +Node.js를 설치하거나 업그레이드해야 한다면 [nodejs.org](https://nodejs.org)에서 다운로드하세요. + +--- + +## 1단계: Claude Code 설치 + +npm으로 전역 설치: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +설치 확인: + +```bash +claude --version +``` + +--- + +## 2단계: 인증 + +아무 디렉토리에서나 `claude`를 실행해 최초 설정을 시작: + +```bash +claude +``` + +처음 실행하면, Claude Code가 브라우저를 열고 Anthropic 계정으로 로그인하는 과정을 안내합니다. 완료하면 자격 증명이 안전하게 저장되어 이후 세션에서 재사용됩니다. + +**대안으로**, OAuth를 사용하지 않으려면 API 키를 직접 설정하세요: + +```bash +export ANTHROPIC_API_KEY=sk-ant-... +``` + +> 📝 `ANTHROPIC_API_KEY` 환경 변수가 설정되어 있으면 API 키가 우선합니다. 대화형 사용에는 OAuth가 권장됩니다 — 토큰 갱신을 자동으로 처리합니다. + +--- + +## 3단계: 프로젝트로 이동 + +Claude Code는 현재 디렉토리 내에서 작동합니다. 작업하려는 프로젝트로 이동하세요: + +```bash +cd my-project +``` + +--- + +## 4단계: 대화형 세션 시작 + +`claude`를 실행해 대화형 세션을 열기: + +```bash +claude +``` + +자연어로 작업을 입력할 수 있는 프롬프트가 나타납니다. Claude가 프로젝트 파일을 읽고, 커맨드를 실행하고, 지시에 따라 변경 사항을 만듭니다. + +**첫 번째로 시도할 예제 작업들:** + +``` +> 이 코드베이스의 구조를 설명해줘 +> 회원가입 폼에 입력 검증 추가해줘 +> UserService 클래스에 대한 테스트 작성해줘 +> 에러를 잡고 무시하는 곳을 모두 찾아줘 +``` + +Claude는 권한이 필요한 변경 사항을 만들기 전에 계획을 보여줍니다. 각 단계에서 승인하거나, 거부하거나, 다른 접근 방식을 요청할 수 있습니다. + +--- + +## 5단계: CLAUDE.md 파일 초기화 + +세션 안에서 `/init`을 실행해 프로젝트의 `CLAUDE.md` 파일을 생성: + +``` +/init +``` + +Claude가 저장소를 분석하여 — 매니페스트 파일, 기존 문서, 코드 구조를 읽어 — 코드베이스에서 효과적으로 작업하는 데 필요한 커맨드와 컨텍스트를 담은 `CLAUDE.md`를 생성합니다. 커밋하기 전에 생성된 파일을 검토하고 편집하세요. + +> 💡 `CLAUDE.md`는 매 세션 시작 시 로드됩니다. 비표준 빌드 커맨드, 테스트 특이사항, 팀 고유의 코딩 컨벤션 등을 기록하기 가장 좋은 곳입니다. + +--- + +## 비대화형 커맨드 실행 + +`-p` 플래그를 사용해 단일 작업을 실행하고 결과를 출력합니다 — 대화형 세션에 들어가지 않고. 스크립팅이나 일회성 쿼리에 유용합니다: + +```bash +claude -p "이 코드베이스를 설명해줘" +claude -p "src/ 안의 모든 TODO 주석과 파일을 나열해줘" +claude -p "src/ 안의 미사용 export를 확인해줘" +``` + +--- + +## 핵심 슬래시 커맨드 + +대화형 세션 안에서 가장 유용한 슬래시 커맨드들: + +| 커맨드 | 설명 | +|--------|------| +| `/help` | 사용 가능한 커맨드와 키보드 단축키 표시 | +| `/init` | 현재 프로젝트의 `CLAUDE.md` 생성 또는 업데이트 | +| `/memory` | 메모리 파일(`CLAUDE.md`, `CLAUDE.local.md`) 보기 및 편집 | +| `/permissions` | 현재 권한 모드 보기 또는 변경 | +| `/mcp` | 연결된 MCP 서버 관리 | +| `/clear` | 현재 대화 컨텍스트 지우기 | +| `/exit` | 세션 종료 | diff --git a/docs/claude-code-docs-main/03_설치.md b/docs/claude-code-docs-main/03_설치.md new file mode 100644 index 0000000..6db78b1 --- /dev/null +++ b/docs/claude-code-docs-main/03_설치.md @@ -0,0 +1,253 @@ +# 설치 + +> macOS, Linux, Windows(WSL 경유)에 Claude Code를 설치합니다. Node.js 18 이상이 필요합니다. + +## 요구사항 + +- **Node.js 18 이상** — Claude Code는 시작 시 Node.js 버전을 확인하고, 18 미만이면 오류와 함께 종료합니다. +- **npm** — Node.js에 포함되어 있습니다. + +현재 버전 확인: + +```bash +node --version +npm --version +``` + +--- + +## Claude Code 설치 + +npm으로 전역 설치: + +```bash +npm install -g @anthropic-ai/claude-code +``` + +설치 후 동작 확인: + +```bash +claude --version +``` + +--- + +## 플랫폼별 안내 + +### macOS + +macOS에서는 npm 전역 설치가 기본적으로 작동합니다. `npm install -g` 실행 시 권한 오류가 발생하면 두 가지 옵션이 있습니다: + +**옵션 A: npm 권한 수정 (권장)** + +홈 폴더의 디렉토리를 사용하도록 npm을 설정: + +```bash +mkdir -p ~/.npm-global +npm config set prefix ~/.npm-global +``` + +셸 프로파일(`~/.zshrc` 또는 `~/.bash_profile`)에 다음 추가: + +```bash +export PATH=~/.npm-global/bin:$PATH +``` + +프로파일 다시 로드 후 설치: + +```bash +source ~/.zshrc +npm install -g @anthropic-ai/claude-code +``` + +**옵션 B: Node 버전 관리자 사용** + +[nvm](https://github.com/nvm-sh/nvm) 또는 [fnm](https://github.com/Schniz/fnm) 같은 도구는 홈 디렉토리에 Node.js를 설치해서 전역 권한 문제를 완전히 피할 수 있습니다: + +```bash +# nvm 사용 +nvm install --lts +nvm use --lts +npm install -g @anthropic-ai/claude-code +``` + +### Linux + +대부분의 Linux 배포판에서 `npm install -g`는 `sudo` 또는 npm prefix 수정이 필요합니다. `sudo` 사용은 나중에 권한 문제를 일으킬 수 있으므로 권장하지 않습니다. + +**권장: Node 버전 관리자 사용** + +```bash +# nvm 설치 +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash + +# 셸 다시 로드 후 Node.js 설치 +nvm install --lts +nvm use --lts + +# Claude Code 설치 +npm install -g @anthropic-ai/claude-code +``` + +**대안: npm 전역 prefix 수정** + +```bash +mkdir -p ~/.npm-global +npm config set prefix ~/.npm-global +echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc +source ~/.bashrc +npm install -g @anthropic-ai/claude-code +``` + +### Windows (WSL) + +Claude Code는 Windows Subsystem for Linux(WSL)를 통해 Windows에서 실행됩니다. 커맨드 프롬프트나 PowerShell에서 직접 실행하는 것은 지원되지 않습니다. + +**1단계: WSL 설치** + +관리자 권한으로 PowerShell 열고 실행: + +```powershell +wsl --install +``` + +메시지가 나타나면 재시작. 기본적으로 Ubuntu와 함께 WSL 2가 설치됩니다. + +**2단계: WSL 터미널 열기** + +시작 메뉴에서 Ubuntu를 실행하거나, PowerShell에서 `wsl`을 실행합니다. + +**3단계: WSL 안에 Node.js 설치** + +```bash +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash +source ~/.bashrc +nvm install --lts +nvm use --lts +``` + +**4단계: Claude Code 설치** + +```bash +npm install -g @anthropic-ai/claude-code +``` + +> 📝 항상 WSL 터미널 안에서 `claude`를 실행하세요 — Windows CMD나 PowerShell에서 실행하지 마세요. 프로젝트 파일은 WSL 파일시스템(`~/projects/` 등) 안에 있어야 최상의 성능을 발휘합니다. `/mnt/c/...`를 통한 Windows 파일 접근은 가능하지만 느립니다. + +--- + +## 업데이트 + +최신 버전으로 업데이트: + +```bash +npm update -g @anthropic-ai/claude-code +``` + +또는 Claude Code 내장 업데이트 커맨드 사용: + +```bash +claude update +``` + +현재 버전 확인: + +```bash +claude --version +``` + +--- + +## 제거 + +Claude Code 제거: + +```bash +npm uninstall -g @anthropic-ai/claude-code +``` + +`claude` 바이너리가 제거됩니다. `~/.claude/`의 설정 파일은 자동으로 제거되지 않습니다. 삭제하려면: + +```bash +rm -rf ~/.claude +``` + +--- + +## 문제 해결 + +### 설치 후 `claude` 커맨드를 찾을 수 없음 + +npm 전역 bin 디렉토리가 `PATH`에 없는 경우입니다. + +npm이 전역 바이너리를 설치하는 위치 확인: + +```bash +npm config get prefix +``` + +해당 경로의 `bin` 서브디렉토리를 `PATH`에 추가해야 합니다. 예를 들어 출력이 `/home/you/.npm-global`이면: + +```bash +export PATH=/home/you/.npm-global/bin:$PATH +``` + +셸을 다시 로드(`source ~/.zshrc` 또는 새 터미널 열기) 후 다시 시도하세요. + +### Node.js 버전이 18 미만 + +Claude Code는 Node.js 18 이상이 필요합니다. 시작 시 이 오류가 보이면: + +``` +Error: Claude Code requires Node.js version 18 or higher. +``` + +버전 관리자를 사용해 Node.js를 업그레이드하세요: + +```bash +# nvm +nvm install --lts +nvm use --lts + +# fnm +fnm install --lts +fnm use --lts +``` + +### npm install -g 시 권한 거부 + +`sudo npm install -g`를 사용하지 마세요 — root 소유 파일이 남아 추가 문제를 일으킬 수 있습니다. 대신 npm prefix를 사용자 쓰기 가능 디렉토리로 수정하세요: + +```bash +mkdir -p ~/.npm-global +npm config set prefix ~/.npm-global +export PATH=~/.npm-global/bin:$PATH +npm install -g @anthropic-ai/claude-code +``` + +### 첫 실행 시 인증 실패 + +브라우저 기반 OAuth 흐름이 실패하거나 브라우저를 사용할 수 없는 경우, 환경 변수로 API 키를 직접 설정하세요: + +```bash +export ANTHROPIC_API_KEY=sk-ant-... +claude +``` + +셸 프로파일에 추가하면 영구적으로 설정됩니다. API 키는 [Anthropic Console](https://console.anthropic.com)에서 발급받을 수 있습니다. + +### Docker 또는 CI 환경에서 실행 + +비대화형 환경에서는 환경 변수로 인증하세요: + +```bash +export ANTHROPIC_API_KEY=sk-ant-... +``` + +비대화형으로 실행하려면 `-p` 플래그 사용: + +```bash +claude -p "테스트 스위트를 실행하고 실패를 보고해줘" +``` + +샌드박스 컨테이너에서 권한 프롬프트 없이 Claude Code를 작동시켜야 한다면 `--dangerously-skip-permissions` 플래그를 사용하세요. 이 플래그는 Claude Code의 샌드박스 안전 검사를 통과한 환경(인터넷 접근 없음, 컨테이너 외부에서 root로 실행하지 않음)에서만 작동합니다. diff --git a/docs/claude-code-docs-main/04_작동원리.md b/docs/claude-code-docs-main/04_작동원리.md new file mode 100644 index 0000000..67e9ab8 --- /dev/null +++ b/docs/claude-code-docs-main/04_작동원리.md @@ -0,0 +1,82 @@ +# 작동 원리 + +> 에이전틱 루프, 컨텍스트 로딩, 도구 실행 모델, 대화 생명주기에 대한 내부 동작 설명. + +Claude Code는 터미널 기반 코딩 에이전트로, 연속적인 에이전틱 루프를 실행합니다. 요청을 읽고, 무엇을 해야 할지 추론하고, 도구를 호출하고, 결과를 관찰하고, 작업이 완료되거나 입력이 필요할 때까지 이를 반복합니다. + +## 에이전틱 루프 + +모든 상호작용은 동일한 기본 사이클을 따릅니다: + +1. **사용자가 메시지를 보냄** — 터미널에서 메시지를 입력하거나(대화형 모드), `--print` / stdin을 통해 전달합니다(비대화형/헤드리스 모드). 메시지는 대화 기록에 추가됩니다. + +2. **컨텍스트 조립** — 모델을 호출하기 전에, Claude Code가 시스템 프롬프트를 조립합니다: 현재 날짜, git 상태(브랜치, 최근 커밋, 워킹트리 상태), 로드된 CLAUDE.md 메모리 파일들, 사용 가능한 도구 목록. 이 컨텍스트는 대화당 한 번 구성되고 메모이제이션됩니다. + +3. **Claude가 추론하고 도구를 선택** — 조립된 대화가 Anthropic API로 전송됩니다. 모델이 작업에 대해 추론하고 하나 이상의 `tool_use` 블록을 출력합니다 — 각각 도구 이름과 구조화된 JSON 입력을 지정합니다. + +4. **권한 확인** — 각 도구 호출을 실행하기 전에, Claude Code가 현재 권한 모드와 허용/차단 규칙을 평가합니다. 모드에 따라 자동 승인하거나, 확인을 요청하거나, 호출을 완전히 차단합니다. + +5. **도구가 실행되고 결과를 반환** — 승인된 도구 호출이 실행됩니다. 결과(파일 내용, 명령어 출력, 검색 결과)는 `tool_result` 블록으로 대화에 추가됩니다. + +6. **루프 계속** — 모델이 도구 결과를 받아 더 많은 도구를 호출하거나 최종 텍스트 응답을 생성합니다. 모델 턴에 도구 호출이 더 이상 없을 때까지 루프가 반복됩니다. + +> 📝 루프는 전적으로 터미널 프로세스 안에서 실행됩니다. 원격 실행 서버가 없습니다 — 도구가 명시적으로 전송하지 않는 한(`WebFetch`, `WebSearch`, 또는 MCP 서버 등), 파일, 셸, 자격 증명이 사용자의 머신을 벗어나지 않습니다. + +## 컨텍스트 로딩 + +각 대화 시작 시, Claude Code가 모든 API 호출에 앞에 추가되는 두 개의 컨텍스트 블록을 구성합니다: + +**시스템 컨텍스트** (`context.ts`의 `getSystemContext()`로 조립): +- **Git 상태** — 현재 브랜치, 기본/메인 브랜치, git 사용자명, `git status --short` 출력(2,000자 초과 시 자름), `git log --oneline`의 마지막 5개 커밋 +- **캐시 무효화 주입** — 디버깅 중 서버 측 프롬프트 캐시를 무효화하기 위해 내부적으로 사용되는 임시 문자열 + +**사용자 컨텍스트** (`context.ts`의 `getUserContext()`로 조립): +- **CLAUDE.md 메모리** — 4단계 계층(managed → user → project → local)에서 발견된 모든 메모리 파일 +- **현재 날짜** — 모델이 항상 날짜를 알 수 있도록 `Today's date is YYYY-MM-DD`로 주입 + +두 컨텍스트 블록은 `lodash/memoize`를 사용해 대화 기간 동안 **메모이제이션**됩니다. + +## 도구 실행 모델 + +Claude Code는 기본적으로 도구 호출을 자율적으로 실행하지 않습니다. 각 도구는 `checkPermissions` 메서드를 가지며, 그 결과가 다음 동작을 결정합니다: + +| 권한 결과 | 동작 | +|-----------|------| +| `allow` | 도구가 즉시 실행되고 결과가 대화에 추가됩니다 | +| `ask` | Claude Code가 일시 중지하고 확인 다이얼로그를 렌더링합니다 | +| `deny` | 도구 호출이 거부되고 Claude가 오류 결과를 받습니다 | + +안전하고 읽기 전용인 도구 호출(`Read`, `Glob`, `Grep` 등)은 일반적으로 모든 모드에서 자동 승인됩니다. + +## 대화형 vs 비대화형(작업) 모드 + +**대화형(REPL) 모드** — 기본 경험. Claude Code가 React/Ink를 사용해 라이브 터미널 UI를 렌더링합니다. 에이전트가 작업하는 동안 스트리밍 출력, 도구 사용 확인, 스피너 애니메이션을 볼 수 있습니다. 메시지는 종료할 때까지 세션 전반에 걸쳐 유지됩니다. + +**비대화형/프린트 모드** — `--print`로 활성화하거나 stdin을 파이핑합니다. UI가 렌더링되지 않습니다. 출력이 stdout에 기록되어 스크립트나 CI 파이프라인에서 캡처할 수 있습니다. 일회성 자동화 작업에 유용합니다. + +### 서브에이전트 (Task 도구) + +Claude가 `Task` 도구(`AgentTool`)를 통해 서브에이전트를 스폰할 수 있습니다. 각 서브에이전트는 격리된 대화와 선택적으로 제한된 도구 집합을 가진 자체 중첩된 에이전틱 루프를 실행합니다. 서브에이전트는 로컬(인프로세스) 또는 원격 컴퓨팅에서 실행될 수 있습니다. 서브에이전트가 완료되면 결과가 부모 에이전트로 반환됩니다. + +## 대화 저장 및 재개 + +대화는 디스크의 JSON 트랜스크립트 파일로 저장됩니다(기본적으로 `~/.claude/`에). 각 대화에는 고유한 세션 ID가 있습니다. `--resume `로 이전 대화를 재개하거나, `--resume`만으로 목록에서 선택할 수 있습니다. + +대화가 재개될 때: +- 전체 메시지 기록이 디스크에서 로드됩니다 +- 메모리 파일이 다시 발견되어 대화 최초 시작 시와 다를 수 있습니다 +- 권한 모드가 세션에 유지되지 않는 한 설정된 기본값으로 재설정됩니다 + +> 💡 긴 대화는 주기적으로 **컴팩트**됩니다 — 가장 오래된 메시지가 요약되어 컨텍스트 윈도우를 관리 가능하게 유지합니다. 원본 트랜스크립트 전체는 항상 디스크에 보존됩니다; 컴팩트는 API에 전송되는 내용에만 영향을 줍니다. + +## 쿼리 엔진 + +내부적으로, 에이전틱 루프의 각 "턴"은 **쿼리** — `query.ts`에 대한 호출로, 현재 메시지 목록을 Anthropic API에 전송하고 응답을 스트리밍합니다 — 에 의해 구동됩니다. 쿼리 엔진이 처리하는 것들: + +- 실시간으로 터미널에 토큰 출력 스트리밍 +- `tool_use` 블록을 적절한 도구 핸들러에 디스패치 +- 턴당 토큰 및 도구 호출 예산 적용 +- 도구 결과 수집 및 다음 모델 호출 전 추가 +- 컨텍스트 윈도우가 꽉 찰 때 컴팩트 트리거 + +각 도구에는 `maxResultSizeChars` 속성이 있습니다. 결과가 이 한계를 초과하면 내용이 임시 파일로 저장되고 모델이 파일 경로와 함께 미리보기를 받아, 대용량 출력으로 인한 컨텍스트 윈도우 오버플로우를 방지합니다. diff --git a/docs/claude-code-docs-main/05_메모리와컨텍스트.md b/docs/claude-code-docs-main/05_메모리와컨텍스트.md new file mode 100644 index 0000000..e4a494e --- /dev/null +++ b/docs/claude-code-docs-main/05_메모리와컨텍스트.md @@ -0,0 +1,127 @@ +# 메모리와 컨텍스트 (CLAUDE.md) + +> Claude Code가 CLAUDE.md 메모리 파일을 어떻게 발견하고, 로드하고, 우선순위를 결정하는지 설명합니다. + +Claude Code는 일반 마크다운 파일 기반의 계층적 메모리 시스템을 지원합니다. 파일 시스템의 여러 레벨에 있는 `CLAUDE.md` 파일에 지시사항을 작성해서 Claude의 동작을 전역적으로, 프로젝트별로, 또는 사용자별로 커스터마이징할 수 있습니다. + +## 4단계 메모리 계층 + +메모리 파일은 다음 순서로 로드됩니다(낮은 우선순위 → 높은 우선순위). **나중에** 로드된 파일이 우선합니다. 컨텍스트 윈도우에서 나중에 나타나는 지시사항에 모델이 더 주의를 기울이기 때문입니다. + +**1단계: Managed 메모리 (최저 우선순위)** +- 경로: `/etc/claude-code/CLAUDE.md` +- 관리자 또는 배포 도구가 설정한 시스템 전체 지시사항. 머신의 모든 사용자에게 적용됩니다. + +**2단계: User 메모리** +- 경로: `~/.claude/CLAUDE.md` 및 `~/.claude/rules/*.md` +- 모든 프로젝트에 적용되는 개인 전역 지시사항. 선호하는 코드 스타일, 기본 언어, git 사용자명 등 개인 설정에 적합합니다. 이 파일은 어떤 저장소에도 커밋되지 않습니다. + +**3단계: Project 메모리** +- 경로(CWD까지 각 상위 디렉토리에서 확인): `CLAUDE.md`, `.claude/CLAUDE.md`, `.claude/rules/*.md` +- 팀 전체가 공유하는 코드베이스에 커밋된 지시사항. 프로젝트 컨벤션, 아키텍처 노트, 테스트 커맨드에 이상적입니다. + +**4단계: Local 메모리 (최고 우선순위)** +- 경로: `CLAUDE.local.md` (각 상위 디렉토리에서 확인) +- `.gitignore`에 추가해야 하는 개인 프로젝트별 재정의. 로컬 환경 경로, 개인 디버깅 노트 등에 사용합니다. + +> 📝 현재 작업 디렉토리에 더 가까운 파일이 **나중에** 로드되어 **더 높은 우선순위**를 가집니다. 프로젝트 루트의 `CLAUDE.md`가 상위 디렉토리의 것보다 우선합니다. + +## 파일 발견 알고리즘 + +Claude Code 시작 시, 현재 작업 디렉토리에서 **파일시스템 루트까지** 올라가며 각 레벨의 메모리 파일을 수집합니다. 발견 순서는 낮은 우선순위 파일이 먼저 조립된 컨텍스트에 나타나도록 보장합니다: + +1. Managed 파일이 먼저 로드됩니다 +2. User 파일이 다음으로 로드됩니다 +3. Project 및 Local 파일은 **루트에서 CWD로 내려가며** 반복됩니다 — 상위 디렉토리가 하위 디렉토리보다 먼저 옵니다 + +> 📝 발견된 파일 목록은 대화 기간 동안 메모이제이션됩니다. `/memory`를 실행해 메모리 에디터를 열고 강제 리로드하거나, 세션을 재시작해 Claude Code 외부에서 만들어진 변경 사항을 반영합니다. + +## `@include` 지시어 + +메모리 파일은 `@` 표기법으로 다른 파일을 참조할 수 있습니다. 참조된 파일은 포함하는 파일 이전에 별도 항목으로 컨텍스트에 삽입됩니다. + +```markdown +# My project CLAUDE.md + +@./docs/architecture.md +@./docs/conventions/typescript.md + +커밋 전에 항상 `bun test`를 실행하세요. +``` + +| 구문 | 해석 | +|------|------| +| `@filename` | 포함하는 파일 디렉토리 기준 상대 경로 | +| `@./relative/path` | 명시적 상대 경로 | +| `@~/home/path` | 사용자 홈 디렉토리 기준 경로 | +| `@/absolute/path` | 절대 경로 | + +**규칙:** +- 코드 블록 및 인라인 코드 안의 `@include`는 무시됩니다 +- 순환 참조는 감지되어 건너뜁니다 +- 존재하지 않는 파일은 조용히 무시됩니다 +- 최대 include 깊이는 **5단계**입니다 +- 텍스트 기반 파일 형식만 포함됩니다(`.md`, `.ts`, `.py`, `.json` 등). 이미지와 PDF 같은 바이너리 파일은 건너뜁니다 + +## `.claude/rules/*.md` — 세분화된 규칙 파일 + +모든 것을 하나의 큰 `CLAUDE.md`에 넣는 대신, `.claude/rules/` 안의 여러 마크다운 파일로 지시사항을 나눌 수 있습니다: + +``` +my-project/ +├── CLAUDE.md +└── .claude/ + └── rules/ + ├── testing.md + ├── typescript-style.md + └── git-workflow.md +``` + +모든 `.md` 파일은 자동으로 로드됩니다. 규칙 파일은 **경로 범위 프론트매터**도 지원합니다: + +```markdown +--- +paths: + - "src/api/**" + - "src/services/**" +--- + +항상 의존성 주입을 사용하세요. 구체적인 구현을 직접 import하지 마세요. +``` + +`paths`가 설정되면, 규칙 파일은 Claude가 해당 glob 패턴과 일치하는 파일을 작업할 때만 컨텍스트에 주입됩니다. 대규모 프로젝트에서 컨텍스트를 간결하게 유지합니다. + +## 최대 파일 크기 + +단일 메모리 파일의 권장 최대 크기는 **40,000자**입니다. 이 한계를 초과하는 파일은 플래그 처리되고, Claude가 전체 내용을 읽지 못할 수 있습니다. 메모리 파일은 집중적이고 간결하게 유지하세요. + +## 메모리가 Claude 동작에 미치는 영향 + +메모리 파일이 로드되면, 다음과 같은 프리픽스가 붙은 단일 컨텍스트 블록으로 조립됩니다: + +> *"Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written."* + +즉, CLAUDE.md 파일의 지시사항이 Claude의 내장 기본값보다 우선합니다. 이를 활용해 프로젝트 컨벤션을 강제하거나, 특정 작업을 제한하거나, 도메인 지식을 주입할 수 있습니다. + +## 각 레벨 사용 지침 + +| 레벨 | 용도 | +|------|------| +| **Managed 메모리** | 모든 사용자가 따라야 하는 조직 전체 정책, 보안 가이드라인 | +| **User 메모리** (`~/.claude/CLAUDE.md`) | 모든 프로젝트에 걸쳐 적용되는 개인 선호도: 응답 언어, 커밋 메시지 스타일 | +| **Project 메모리** (`CLAUDE.md`) | 팀과 공유하는 프로젝트 컨벤션: 테스트 실행 방법, 빌드 커맨드, 아키텍처 결정 | +| **Local 메모리** (`CLAUDE.local.md`) | 특정 프로젝트의 개인 재정의: 로컬 환경 경로, 개인 디버깅 노트 | + +## `/memory` 커맨드 + +Claude Code REPL 안에서 `/memory`를 실행해 메모리 파일 에디터를 엽니다. 현재 로드된 메모리 파일을 보여주고, 직접 편집하며, 저장 시 컨텍스트를 리로드합니다. + +> 💡 Claude에게 직접 물어볼 수도 있습니다: *"CLAUDE.md에 항상 2칸 들여쓰기를 사용한다는 규칙을 추가해줘."* Claude가 적절한 메모리 파일을 찾아 지시사항을 작성합니다. + +## 메모리 로딩 비활성화 + +| 방법 | 효과 | +|------|------| +| `CLAUDE_CODE_DISABLE_CLAUDE_MDS=1` | 모든 메모리 파일 로딩 완전 비활성화 | +| `--bare` 플래그 | CWD 워크에서 메모리 파일 자동 발견 건너뜀 | +| `claudeMdExcludes` 설정 | 건너뛸 메모리 파일 경로의 Glob 패턴 | diff --git a/docs/claude-code-docs-main/06_권한시스템.md b/docs/claude-code-docs-main/06_권한시스템.md new file mode 100644 index 0000000..e559896 --- /dev/null +++ b/docs/claude-code-docs-main/06_권한시스템.md @@ -0,0 +1,131 @@ +# 권한 시스템 + +> Claude Code가 어떤 작업을 자동으로 수행하고 어떤 작업에 명시적 승인이 필요한지 제어하는 방법. + +Claude Code는 로컬 머신에서 도구를 실행합니다 — 셸 커맨드 실행, 파일 편집, URL 가져오기. 권한 시스템은 Claude가 자동으로 수행하는 작업과 명시적 승인이 필요한 작업을 정밀하게 제어합니다. + +## 권한이 제어하는 것 + +권한은 세 가지 작업 범주에 적용됩니다: + +- **파일 작업** — `Read`, `Edit`, `Write` 도구를 통한 로컬 파일시스템 읽기, 편집, 쓰기 +- **Bash 커맨드** — `Bash` 도구를 통한 셸 커맨드 실행(설치, 빌드, git 작업, 임의 스크립트 포함) +- **MCP 도구 호출** — 연결된 MCP 서버가 노출한 도구(데이터베이스 쿼리, API 호출, 브라우저 자동화 등) + +## 권한 모드 + +권한 모드는 특정 허용/차단 규칙과 일치하는 도구 호출이 없을 때의 기본 동작을 결정합니다. 모드를 한 번 설정하면 세션 전체에 적용됩니다. + +**`default` — 잠재적으로 위험한 작업에 확인 요청** +표준 모드. 셸 커맨드 실행, 파일 편집, 네트워크 요청 등 부작용이 있을 수 있는 작업에 확인을 요청합니다. 파일 읽기, 검색 등 읽기 전용 작업은 자동 승인됩니다. 일상적인 사용에 권장됩니다. + +**`acceptEdits` — 파일 편집 자동 승인** +`Edit`, `Write` 도구가 프롬프트 없이 자동 승인됩니다. Bash 커맨드는 여전히 확인이 필요합니다. Claude가 파일을 자유롭게 편집하도록 하되 셸 커맨드는 검토하고 싶을 때 유용합니다. + +**`plan` — 읽기 전용 계획 모드** +Claude가 파일을 읽고, 코드베이스를 검색하고, 변경 사항에 대해 논의할 수 있지만 쓰기 또는 bash 작업을 실행할 수 없습니다. 모든 변경 도구 호출이 차단됩니다. Claude가 문제를 분석하고 변경 사항을 승인하기 전에 계획을 만들도록 할 때 사용하세요. + +**`bypassPermissions` — 모든 권한 검사 건너뛰기** +모든 권한 검사가 비활성화됩니다. 모든 도구 호출이 확인 프롬프트 없이 즉시 실행됩니다. +> ⚠️ 이 모드는 Claude가 수행할 작업을 미리 감사한 완전 스크립트화된 자동화 워크플로우 전용입니다. Claude가 예기치 않은 작업을 취할 수 있는 대화형 세션에서는 절대 사용하지 마세요. + +## 권한 모드 설정 방법 + +**CLI 플래그:** +```bash +claude --permission-mode acceptEdits +claude --permission-mode bypassPermissions +claude --permission-mode plan +``` + +**`/permissions` 커맨드 (세션 중):** +``` +/permissions +``` +재시작 없이 모드를 변경합니다. + +**settings.json:** +```json +{ + "defaultMode": "acceptEdits" +} +``` +유효한 값: `"default"`, `"acceptEdits"`, `"bypassPermissions"`, `"plan"`, `"dontAsk"` + +## 권한 규칙 (허용/차단 목록) + +전역 모드 외에도, 활성 모드에 관계없이 특정 도구 호출을 항상 허용하거나 항상 차단하는 세분화된 규칙을 만들 수 있습니다. + +규칙은 세 가지 구성 요소를 가집니다: + +| 필드 | 설명 | +|------|------| +| `toolName` | 규칙이 적용되는 도구 이름 (예: `"Bash"`, `"Edit"`, `"mcp__myserver"`) | +| `ruleContent` | 도구 입력과 일치해야 하는 선택적 패턴 | +| `behavior` | `"allow"`, `"deny"`, 또는 `"ask"` | + +규칙은 권한 모드보다 **먼저** 평가됩니다. 일치하는 규칙이 있으면 해당 동작이 즉시 적용됩니다. + +### 예시: 특정 git 커맨드 항상 허용 + +```json +{ + "permissions": { + "allow": [ + "Bash(git status)", + "Bash(git diff *)", + "Bash(git log *)", + "Read(*)" + ], + "deny": [ + "Bash(rm -rf *)", + "Bash(sudo *)" + ] + } +} +``` + +## Bash 권한 작동 방식 + +**패턴 매칭:** +- `git status` — 정확한 일치만 +- `git *` — 모든 `git` 서브커맨드와 일치 +- `npm run *` — 모든 `npm run` 스크립트와 일치 +- `*` — 모든 bash 커맨드와 일치 (극도의 주의 필요) + +**복합 커맨드:** +`&&`, `||`, `;`, 파이프(`|`)로 연결된 복합 커맨드는 각 서브커맨드가 독립적으로 검사됩니다. 하나의 서브커맨드라도 차단되면 전체 복합 커맨드가 차단됩니다. + +**항상 차단/에스컬레이션되는 작업:** +- 프로젝트 디렉토리 외부 경로로의 출력 리다이렉션(`>`, `>>`) +- 워킹트리 외부로의 디렉토리 변경(`cd`) +- `sed -i` 편집 인플레이스 커맨드(파일 수정 추적을 위해 특별 처리) +- `.claude/` 또는 `.git/` 설정 디렉토리를 대상으로 하는 커맨드 +- 셸 설정 파일 수정(`.bashrc`, `.zshrc` 등) + +## MCP 도구 권한 + +MCP 도구는 내장 도구와 동일한 규칙 시스템을 따릅니다: + +```json +{ + "permissions": { + "deny": [ + "mcp__myserver" + ], + "allow": [ + "mcp__myserver__read_database" + ] + } +} +``` + +`mcp__servername`을 규칙으로 사용하면(특정 도구 이름 없이) 해당 서버의 모든 도구가 차단됩니다 — 모델이 보기 전에 도구 목록에서 필터링됩니다. + +## 보안 권장 사항 + +- **`default` 모드**로 모든 대화형 세션을 시작하세요 +- 익숙하지 않은 코드베이스를 탐색하거나 큰 변경 사항을 설계할 때는 **`plan` 모드**를 사용하세요 +- Claude가 파일을 자유롭게 편집하도록 하되 셸 커맨드는 검토하려면 **`acceptEdits`**를 사용하세요 +- 광범위한 모드 에스컬레이션 대신 **세분화된 허용 규칙**을 선호하세요. `Bash(git *)`를 허용하는 것이 `bypassPermissions`로 전환하는 것보다 안전합니다 +- 친숙하지 않은 저장소를 클론할 때 `.claude/settings.json`을 검토하세요 — 권한 규칙이 미리 설정되어 있을 수 있습니다 diff --git a/docs/claude-code-docs-main/07_도구목록.md b/docs/claude-code-docs-main/07_도구목록.md new file mode 100644 index 0000000..4a3b8c3 --- /dev/null +++ b/docs/claude-code-docs-main/07_도구목록.md @@ -0,0 +1,102 @@ +# 도구 목록 + +> Claude Code가 사용할 수 있는 모든 내장 도구 레퍼런스 — 파일 작업, 셸 실행, 웹 접근, 서브에이전트 생성 포함. + +## 파일 도구 + +**Read — 파일 읽기** +로컬 파일시스템에서 파일을 읽습니다. 기본적으로 최대 2,000줄 읽기. 대용량 파일의 타겟 읽기를 위한 `offset`과 `limit` 지원. `cat -n` 형식으로 줄 번호와 함께 내용 반환. 이미지(PNG, JPG 등), PDF(한 번에 최대 20페이지), Jupyter 노트북(`.ipynb`) 읽기도 지원. 읽기 전용, 항상 자동 승인. + +**Edit — 파일 편집** +파일에서 정확한 문자열 교체를 수행합니다. 같은 대화에서 해당 파일을 먼저 `Read`해야 합니다. `old_string`을 `new_string`으로 교체 — 파일에서 유일하게 일치해야 합니다. 파일 전체에서 이름을 변경하려면 `replace_all: true` 사용. `old_string`이 두 번 이상 나타나면 실패합니다(replace_all이 설정되지 않은 경우). + +**Write — 파일 생성/덮어쓰기** +새 파일을 만들거나 기존 파일을 완전히 덮어씁니다. 기존 파일은 같은 대화에서 먼저 `Read`가 필요합니다. 기존 파일 수정에는 `Edit`를 선호하세요 — `Write`는 전체 파일 내용을 전송하며 새 파일이나 전체 재작성에 더 적합합니다. + +**Glob — 파일 패턴 검색** +이름 패턴으로 파일을 찾습니다. 어떤 코드베이스 크기에서도 작동하는 빠른 패턴 매칭. 수정 시간 기준으로 정렬된 매칭 파일 경로 반환. `**/*.ts`, `src/**/*.test.js`, `**/CLAUDE.md` 같은 패턴 지원. 읽기 전용, 항상 자동 승인. + +## 셸 도구 + +**Bash — 셸 커맨드 실행** +대화 내에서 지속되는 셸 세션에서 커맨드를 실행합니다. 도구 호출 간에 환경 변수와 작업 디렉토리 변경이 유지됩니다. `timeout` 파라미터 지원. + +주요 동작: +- **복합 커맨드** (`&&`, `||`, `;`, `|`) — 파싱되어 각 서브커맨드가 독립적으로 권한 검사됨 +- **백그라운드 실행** — `run_in_background: true`를 전달해 블로킹 없이 장시간 실행 커맨드 실행 +- **출력 제한** — stdout/stderr이 도구 결과 크기 예산을 초과하면 미리보기와 파일 경로가 반환됨 +- **검색 커맨드** — 콘텐츠 검색에는 최적화된 권한과 접근을 가진 전용 `Grep` 도구를 선호하세요 + +## 검색 도구 + +**Grep — 파일 내용 검색** +정규식을 사용해 파일 내용을 검색합니다. ripgrep 기반. 전체 regex 구문, 파일 타입 필터링(`*.ts`, `**/*.py`), 세 가지 출력 모드 지원: +- `files_with_matches` (기본) — 파일 경로만 반환 +- `content` — 컨텍스트와 함께 매칭된 줄 반환 +- `count` — 파일당 매칭 수 반환 + +`multiline: true`로 멀티라인 패턴 지원. 읽기 전용, 항상 자동 승인. + +**LS — 디렉토리 내용 나열** +구조화된 형식으로 파일과 서브디렉토리를 반환합니다. 파일을 읽거나 편집하기 전에 프로젝트 구조를 탐색하는 데 유용합니다. 읽기 전용, 항상 자동 승인. + +## 웹 도구 + +**WebFetch — URL 가져오기** +URL에서 정보를 가져와 추출합니다. HTML을 마크다운으로 변환한 후 보조 모델을 통해 집중된 답변을 생성합니다. +- HTTP URL은 자동으로 HTTPS로 업그레이드됨 +- 15분 자가 정리 캐시 포함 +- URL이 다른 호스트로 리다이렉트되면 후속 요청을 위한 리다이렉트 URL 반환 +- GitHub URL의 경우 `gh` CLI를 통한 Bash 사용 권장 + +`default` 모드에서 승인 요청. + +**WebSearch — 웹 검색** +웹을 검색하고 결과를 반환합니다. 제목, 스니펫, URL을 마크다운 링크로 형식화해서 반환. 모델의 훈련 컷오프 이후 정보에 접근하는 데 유용합니다. 응답 후 Claude가 자동으로 참조된 모든 URL을 나열하는 `Sources:` 섹션을 추가합니다. 현재 미국에서만 이용 가능. `default` 모드에서 승인 요청. + +## 에이전트 및 작업 도구 + +**Task (Agent) — 서브에이전트 생성** +별도의 컨텍스트에서 서브에이전트를 시작합니다. 서브에이전트는 자체 대화 기록, 도구 집합(선택적으로 제한됨)을 가지고 완료될 때까지 실행한 후 부모 에이전트에 결과를 반환합니다. + +서브에이전트 실행 방식: +- **로컬** — 인프로세스, 부모의 파일시스템과 셸 공유 +- **원격** — 원격 에이전트 자격 기준이 충족될 때 별도 컴퓨팅에서 실행 + +개방형 다단계 검색, 병렬 워크스트림, 또는 독립된 서브 문제를 격리된 에이전트에 위임할 때 사용하세요. + +**TodoWrite — 작업 목록 관리** +구조화된 할 일 항목(`pending`, `in_progress`, `completed` 상태)을 터미널 UI의 영구 패널에 씁니다. Claude가 복잡한 다단계 작업의 진행 상황을 추적하는 데 도움이 됩니다. 3개 이상의 별개 단계가 있는 작업에 적극적으로 사용하세요. + +## MCP 도구 + +MCP(Model Context Protocol) 서버가 Claude Code에 추가 도구를 노출할 수 있습니다. 연결된 도구는 내장 도구와 함께 도구 목록에 나타나며 동일한 권한 시스템을 따릅니다. + +MCP 도구 이름 형식: +``` +mcp____ +``` + +예: `mydb` 서버의 `query` 도구 → `mcp__mydb__query` + +일반적인 MCP 도구 범주: +- 데이터베이스 쿼리 및 관리 도구 +- 브라우저 및 웹 자동화 도구 +- 클라우드 제공업체 API (AWS, GCP, Azure) +- 이슈 트래커 통합 (GitHub, Linear, Jira) +- 내부 회사 도구 및 API + +## 노트북 도구 + +**NotebookEdit — Jupyter 노트북 편집** +`.ipynb` 파일의 셀을 줄 단위 정밀도로 삽입, 교체, 삭제합니다. 노트북 읽기는 표준 `Read` 도구를 사용합니다(모든 셀과 출력 반환). + +## 도구 가용성 + +모든 도구가 모든 컨텍스트에서 이용 가능한 것은 아닙니다: +- `CLAUDE_CODE_SIMPLE=1` — `Bash`, `Read`, `Edit`만으로 제한 +- 권한 차단 규칙 — 규칙으로 포괄 차단된 도구는 모델이 보기 전에 목록에서 제거됨 +- `isEnabled()` 검사 — 각 도구는 환경 조건에 따라 자가 비활성화 가능 +- MCP 서버 연결 상태 — MCP 도구는 서버가 실행 중이고 연결된 경우에만 이용 가능 + +REPL에서 `/tools` 커맨드로 활성 도구 집합을 확인할 수 있습니다. diff --git a/docs/claude-code-docs-main/08_CLAUDE.md설정.md b/docs/claude-code-docs-main/08_CLAUDE.md설정.md new file mode 100644 index 0000000..52f6252 --- /dev/null +++ b/docs/claude-code-docs-main/08_CLAUDE.md설정.md @@ -0,0 +1,171 @@ +# CLAUDE.md 설정 + +> Claude에게 세션마다 자동으로 로드되는 지속적인 프로젝트별 지시사항을 주기 위한 CLAUDE.md 파일 작성 및 구성 방법. + +`CLAUDE.md` 파일로 Claude가 모든 세션 시작 시 로드하는 프로젝트 지식을 인코딩할 수 있습니다. 매번 프로젝트 컨벤션, 빌드 시스템, 아키텍처를 설명하는 대신, 한 번 작성하면 Claude가 자동으로 읽습니다. + +## CLAUDE.md에 들어가야 할 것 + +빠진 경우 실수를 일으킬 지시사항을 작성하세요. 그 외에는 노이즈입니다. + +**포함할 것:** +- 빌드, 테스트, lint 커맨드 (도구 이름만 아닌 정확한 호출) +- 코드를 어떻게 작성하고 구성해야 하는지에 영향을 미치는 아키텍처 결정 +- 프로젝트 고유의 코딩 컨벤션 (네이밍 패턴, 파일 구조 규칙) +- 환경 설정 요구사항 (필요한 env 변수, 예상 서비스) +- Claude가 알아야 하는 일반적인 함정 또는 패턴 +- 모노레포 구조와 어떤 패키지가 어떤 책임을 가지는지 + +**제외할 것:** +- Claude가 이미 아는 것 (표준 TypeScript 구문, 일반 라이브러리 API) +- 자명한 알림 ("깔끔한 코드를 작성하세요", "주석을 추가하세요") +- 민감한 데이터 — API 키, 비밀번호, 토큰, 또는 어떤 시크릿도 +- 자주 변경되어 오래될 정보 + +> 💡 테스트: "이 줄을 제거하면 Claude가 이 코드베이스에서 실수를 할까?" 그렇지 않다면 삭제하세요. + +## 파일 위치 + +Claude는 현재 디렉토리에서 파일시스템 루트까지 올라가며 메모리 파일을 발견합니다. 현재 디렉토리에 더 가까운 파일이 더 높은 우선순위를 가집니다. + +| 파일 | 타입 | 용도 | +|------|------|------| +| `/etc/claude-code/CLAUDE.md` | Managed | 관리자가 설정한 모든 사용자의 시스템 전체 지시사항 | +| `~/.claude/CLAUDE.md` | User | 모든 프로젝트에 적용되는 개인 전역 지시사항 | +| `~/.claude/rules/*.md` | User | 모듈식 전역 규칙, 각 파일이 별도로 로드됨 | +| `CLAUDE.md` (프로젝트 루트) | Project | 소스 컨트롤에 커밋된 팀 공유 지시사항 | +| `.claude/CLAUDE.md` (프로젝트 루트) | Project | 팀 공유 프로젝트 지시사항의 대안 위치 | +| `.claude/rules/*.md` (프로젝트 루트) | Project | 주제별로 구성된 모듈식 프로젝트 규칙 | +| `CLAUDE.local.md` (프로젝트 루트) | Local | 커밋되지 않는 개인 프로젝트별 지시사항 | + +## 로딩 순서와 우선순위 + +파일은 다음 순서로 로드됩니다. 모델이 컨텍스트에서 나중에 나타나는 내용에 더 주의를 기울이기 때문에, 나중에 로드된 파일이 더 높은 실효 우선순위를 가집니다. + +1. **Managed 메모리** — `/etc/claude-code/CLAUDE.md`와 `rules/*.md` — 항상 로드됨 +2. **User 메모리** — `~/.claude/CLAUDE.md`와 `rules/*.md` — 모든 프로젝트의 개인 전역 지시사항 +3. **Project 메모리 (루트에서 CWD까지)** — 파일시스템 루트에서 현재 디렉토리까지 각 디렉토리의 `CLAUDE.md`, `.claude/CLAUDE.md`, `.claude/rules/*.md`. CWD에 더 가까운 파일이 나중에 로드됨 (높은 우선순위) +4. **Local 메모리** — 루트에서 CWD까지 각 디렉토리의 `CLAUDE.local.md`. 같은 순회 순서. 기본적으로 gitignore됨 + +## @include 지시어 + +메모리 파일은 `@` 표기법으로 다른 파일을 include할 수 있습니다: + +```markdown +# CLAUDE.md + +@./docs/architecture.md +@~/shared/style-guide.md +@/etc/company-standards.md +``` + +| 구문 | 해석 | +|------|------| +| `@filename` | 현재 파일 디렉토리 기준 상대 경로 | +| `@./relative/path` | 현재 파일 디렉토리 기준 명시적 상대 경로 | +| `@~/path/in/home` | 홈 디렉토리 아래 경로 | +| `@/absolute/path` | 절대 파일시스템 경로 | + +**동작:** +- 비존재 파일은 조용히 무시됨 +- 순환 참조는 감지되고 방지됨 +- Include는 최대 5단계 깊이까지 중첩 +- 텍스트 파일 형식만 지원 — 이진 파일은 건너뜀 +- 코드 블록 안의 `@include`는 처리되지 않음 + +## 프론트매터 경로 타겟팅 + +`.claude/rules/`의 파일은 YAML 프론트매터로 어떤 파일 경로에 적용할지 제한할 수 있습니다: + +```markdown +--- +paths: + - "src/api/**" + - "*.graphql" +--- + +# API 컨벤션 + +모든 API 핸들러는 공유 `validate()` 헬퍼로 입력을 검증해야 합니다. +GraphQL 리졸버는 직접 데이터베이스 쿼리를 수행하면 안 됩니다 — 데이터 레이어를 사용하세요. +``` + +프론트매터가 없는 규칙은 무조건 적용됩니다. `paths` 프론트매터가 있는 규칙은 Claude가 glob 패턴과 일치하는 파일을 작업할 때만 적용됩니다. + +## TypeScript 프로젝트용 CLAUDE.md 예시 + +```markdown +# Project: Payments API + +## 빌드 및 테스트 + +- 빌드: `bun run build` +- 테스트: `bun test` (Bun 내장 테스트 러너 사용 — Jest 사용하지 말 것) +- Lint: `bun run lint` (biome, eslint 아님) +- 타입 체크: `bun run typecheck` + +변경 사항을 완료하기 전에 항상 `bun run typecheck`를 실행하세요. + +## 아키텍처 + +- `src/handlers/` — HTTP 핸들러, 라우트 그룹당 하나의 파일 +- `src/services/` — 비즈니스 로직, 직접 DB 접근 없음 +- `src/db/` — 데이터베이스 레이어 (Drizzle ORM); 모든 쿼리가 여기에 있음 +- `src/schemas/` — 핸들러 검증과 DB 타입 간에 공유되는 Zod 스키마 + +핸들러는 서비스를 호출합니다. 서비스는 DB 레이어를 호출합니다. 레이어를 건너뛰지 마세요. + +## 컨벤션 + +- 모든 입력 검증 스키마에 `z.object().strict()` 사용 +- 에러는 `Result`로 전파 — 서비스 코드에서 절대 throw하지 말 것 +- 모든 금액 값은 센트 단위 정수 +- 타임스탬프는 Unix 초(number), Date 객체 아님 + +## 환경 + +필요한 env 변수: `DATABASE_URL`, `STRIPE_SECRET_KEY`, `JWT_SECRET` +로컬 개발: `.env.example`을 `.env.local`로 복사하고 값 입력 + +## 피해야 할 일반적인 실수 + +- `new Date()`를 직접 사용하지 마세요 — `src/utils/time.ts`의 `getCurrentTimestamp()` 사용 +- `console.log` 추가하지 마세요 — `src/utils/logger.ts`의 `logger` 사용 +- Raw SQL 작성하지 마세요 — Drizzle 쿼리 빌더 사용 +``` + +## /init으로 CLAUDE.md 생성 + +Claude Code 세션에서 `/init`을 실행하면 프로젝트의 `CLAUDE.md`를 자동 생성합니다: + +``` +/init +``` + +Claude가 코드베이스를 분석하고 프로젝트와 가장 관련된 커맨드와 컨텍스트를 담은 파일을 생성합니다. 생성된 파일은 시작점입니다 — 검토하고, 진정으로 유용하지 않은 것은 제거하고, 코드에서 추론할 수 없는 프로젝트별 지식을 추가하세요. + +## /memory로 CLAUDE.md 편집 + +`/memory`를 실행해 메모리 에디터를 열면 현재 로드된 모든 메모리 파일을 나열하고 세션 내에서 직접 편집할 수 있습니다: + +``` +/memory +``` + +변경 사항은 즉시 적용됩니다 — Claude가 업데이트된 파일을 리로드하고 새 지시사항을 현재 세션에 적용합니다. + +## 파일 제외 + +Claude가 로드하지 않도록 할 CLAUDE.md 파일이 있다면(예: 벤더 의존성이나 생성된 코드에 있는 경우), 설정에 제외 패턴을 추가하세요: + +```json +{ + "claudeMdExcludes": [ + "/absolute/path/to/vendor/CLAUDE.md", + "**/generated/**", + "**/third-party/.claude/rules/**" + ] +} +``` + +패턴은 picomatch를 사용해 절대 경로와 매칭됩니다. User, Project, Local 메모리 타입만 제외 가능합니다 — Managed(관리자) 파일은 항상 로드됩니다. diff --git a/docs/claude-code-docs-main/09_환경변수.md b/docs/claude-code-docs-main/09_환경변수.md new file mode 100644 index 0000000..4bb3d13 --- /dev/null +++ b/docs/claude-code-docs-main/09_환경변수.md @@ -0,0 +1,111 @@ +# 환경 변수 + +> Claude Code가 인증, API 접근, 동작, 런타임 옵션을 설정하기 위해 읽는 환경 변수. + +Claude Code는 시작 시 환경 변수를 읽습니다. 설정 파일을 수정하지 않고 인증 설정, 커스텀 API 엔드포인트, 런타임 동작 튜닝, 활성 기능 제어가 가능합니다. + +## 인증 + +| 변수 | 설명 | +|------|------| +| `ANTHROPIC_API_KEY` | Anthropic API 직접 인증용 API 키. 설정 시 OAuth 대신 이 키를 사용합니다. `export ANTHROPIC_API_KEY="sk-ant-..."` | +| `ANTHROPIC_AUTH_TOKEN` | 대안 인증 토큰. `ANTHROPIC_API_KEY`가 적용되지 않는 컨텍스트에서 사용합니다. | +| `ANTHROPIC_BASE_URL` | Anthropic API 기본 URL 재정의. 프록시, 스테이징 환경, 호환 서드파티 엔드포인트를 가리킬 때 유용합니다. | +| `CLAUDE_CODE_API_BASE_URL` | Claude Code 전용 API 기본 URL 재정의. 설정 시 `ANTHROPIC_BASE_URL`보다 우선합니다. | +| `ANTHROPIC_BEDROCK_BASE_URL` | AWS Bedrock API 접근용 기본 URL. Bedrock 엔드포인트를 통해 라우팅할 때 설정합니다. | +| `ANTHROPIC_VERTEX_PROJECT_ID` | Vertex AI 접근용 Google Cloud 프로젝트 ID. Google Cloud의 Vertex AI 플랫폼을 통해 Claude Code를 사용할 때 필요합니다. | +| `CLAUDE_CODE_USE_BEDROCK` | `1` 또는 `true`로 설정해 AWS Bedrock을 API 공급자로 사용합니다. | +| `CLAUDE_CODE_USE_FOUNDRY` | `1` 또는 `true`로 설정해 Anthropic Foundry를 API 공급자로 사용합니다. | +| `CLAUDE_CODE_OAUTH_TOKEN` | OAuth 액세스 토큰을 직접 사용해 대화형 로그인 흐름을 우회합니다. 자동화 환경에 유용합니다. | + +## 설정 경로 + +| 변수 | 기본값 | 설명 | +|------|--------|------| +| `CLAUDE_CONFIG_DIR` | `~/.claude` | Claude Code가 설정, 설정값, 트랜스크립트를 저장하는 디렉토리 재정의. `export CLAUDE_CONFIG_DIR="/opt/claude-config"` | +| `CLAUDE_CODE_MANAGED_SETTINGS_PATH` | - | Managed 설정 파일 경로 재정의. 기본 플랫폼 경로가 적절하지 않은 엔터프라이즈 환경에 유용합니다. | + +## 모델 선택 + +| 변수 | 설명 | +|------|------| +| `ANTHROPIC_MODEL` | 사용할 기본 모델. 설정 파일의 `model` 설정과 명시적 `--model` 플래그에 의해 재정의됩니다. | +| `CLAUDE_CODE_SUBAGENT_MODEL` | 메인 에이전트가 생성하는 서브에이전트 작업에 사용할 모델. 설정하지 않으면 서브에이전트는 메인 세션과 동일한 모델을 사용합니다. | +| `CLAUDE_CODE_AUTO_MODE_MODEL` | 자동 모드에서 사용할 모델. 지정하지 않으면 메인 세션 모델을 기본으로 합니다. | + +## 동작 토글 + +| 변수 | 설명 | +|------|------| +| `CLAUDE_CODE_REMOTE` | `1` 또는 `true`로 설정해 원격/컨테이너 모드 활성화. 비대화형 환경에 맞게 동작을 조정합니다 — API 타임아웃 연장(120s vs 300s), 대화형 프롬프트 억제, 출력 형식 조정. | +| `CLAUDE_CODE_SIMPLE` | `1` 또는 `true`로 설정해(또는 `--bare` 전달) bare 모드로 실행. 훅, LSP 통합, 플러그인 동기화, 스킬 디렉토리 워크, 어트리뷰션, 백그라운드 프리페치, 키체인/자격증명 읽기를 모두 건너뜁니다. 경량 스크립트 사용에 유용합니다. | +| `DISABLE_AUTO_COMPACT` | `1` 또는 `true`로 설정해 자동 컨텍스트 컴팩션 비활성화. 설정 시 모델의 컨텍스트 한계에 근접해도 대화 컨텍스트를 컴팩트하지 않습니다. | +| `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS` | `1` 또는 `true`로 설정해 백그라운드 작업 실행 비활성화. | +| `CLAUDE_CODE_DISABLE_THINKING` | `1` 또는 `true`로 설정해 모든 API 호출의 확장 thinking을 비활성화합니다. | +| `CLAUDE_CODE_DISABLE_AUTO_MEMORY` | `1` 또는 `true`로 설정해 자동 메모리 비활성화. Claude가 자동 메모리 디렉토리를 읽거나 쓰지 않습니다. | +| `CLAUDE_CODE_DISABLE_CLAUDE_MDS` | `1` 또는 `true`로 설정해 모든 `CLAUDE.md` 메모리 파일 로딩을 완전 비활성화합니다. | +| `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` | `1` 또는 `true`로 설정해 분석, 원격 측정, 기타 비필수 네트워크 요청을 억제합니다. | +| `CLAUDE_BASH_MAINTAIN_PROJECT_WORKING_DIR` | `1` 또는 `true`로 설정해 각 Bash 커맨드 후 원래 프로젝트 루트로 작업 디렉토리를 재설정합니다. | + +## 리소스 제한 + +| 변수 | 설명 | +|------|------| +| `CLAUDE_CODE_MAX_OUTPUT_TOKENS` | API 응답당 최대 출력 토큰 수 재정의. `export CLAUDE_CODE_MAX_OUTPUT_TOKENS=4096` | +| `CLAUDE_CODE_MAX_CONTEXT_TOKENS` | 최대 컨텍스트 윈도우 크기 재정의. | +| `BASH_MAX_OUTPUT_LENGTH` | Bash 커맨드 출력에서 캡처되는 최대 문자 수. `export BASH_MAX_OUTPUT_LENGTH=50000` | +| `API_TIMEOUT_MS` | API 요청 타임아웃을 밀리초 단위로 재정의. 기본 300,000ms(5분), 원격 모드에서는 120,000ms(2분). `export API_TIMEOUT_MS=60000` | + +## 원격 측정 및 관찰 가능성 + +| 변수 | 설명 | +|------|------| +| `CLAUDE_CODE_ENABLE_TELEMETRY` | `1` 또는 `true`로 설정해 트레이스, 메트릭, 로그의 OpenTelemetry 내보내기 활성화. 추가 OTEL 설정이 필요합니다. `export CLAUDE_CODE_ENABLE_TELEMETRY=1` | +| `CLAUDE_CODE_JSONL_TRANSCRIPT` | Claude Code가 세션 JSONL 트랜스크립트를 쓸 파일 경로. `export CLAUDE_CODE_JSONL_TRANSCRIPT="/tmp/session.jsonl"` | + +## Node.js 런타임 + +| 변수 | 설명 | +|------|------| +| `NODE_OPTIONS` | 런타임에 전달되는 표준 Node.js 옵션. Claude Code는 `--max-old-space-size` 같은 플래그를 감지하기 위해 이것을 읽습니다. ⚠️ 코드 실행 플래그를 포함하는 값으로 설정하지 마세요. | + +## 호스트 플랫폼 재정의 + +| 변수 | 설명 | +|------|------| +| `CLAUDE_CODE_HOST_PLATFORM` | 분석용 보고 호스트 플랫폼 재정의. `"win32"`, `"darwin"`, `"linux"` 허용. `export CLAUDE_CODE_HOST_PLATFORM=darwin` | + +## 클라우드 제공업체 리전 재정의 + +Vertex AI에서 모델별 리전 재정의를 지원합니다: + +| 모델 프리픽스 | 환경 변수 | +|--------------|----------| +| `claude-haiku-4-5` | `VERTEX_REGION_CLAUDE_HAIKU_4_5` | +| `claude-3-5-sonnet` | `VERTEX_REGION_CLAUDE_3_5_SONNET` | +| `claude-sonnet-4-6` | `VERTEX_REGION_CLAUDE_4_6_SONNET` | +| `claude-opus-4` | `VERTEX_REGION_CLAUDE_4_0_OPUS` | + +기본 Vertex 리전은 `CLOUD_ML_REGION`으로 제어됩니다(기본값: `us-east5`). + +## AWS 자격 증명 + +Bedrock 접근을 위해 표준 AWS 자격 증명 환경 변수를 지원합니다: + +| 변수 | 설명 | +|------|------| +| `AWS_REGION` | Bedrock API 호출용 AWS 리전. `AWS_DEFAULT_REGION`으로 폴백, 없으면 `us-east-1` | +| `AWS_DEFAULT_REGION` | `AWS_REGION`이 설정되지 않은 경우 폴백 AWS 리전 | + +## 모든 세션에 환경 변수 설정 + +셸 프로파일 대신 설정 파일의 `env` 필드를 사용해 모든 Claude Code 세션에 적용되는 환경 변수를 설정할 수 있습니다: + +```json +{ + "env": { + "DISABLE_AUTO_COMPACT": "1", + "BASH_MAX_OUTPUT_LENGTH": "30000" + } +} +``` diff --git a/docs/claude-code-docs-main/10_설정파일.md b/docs/claude-code-docs-main/10_설정파일.md new file mode 100644 index 0000000..c0dff09 --- /dev/null +++ b/docs/claude-code-docs-main/10_설정파일.md @@ -0,0 +1,172 @@ +# 설정 파일 (settings.json) + +> 사용자, 프로젝트, Managed 레벨의 JSON 설정 파일로 Claude Code 동작 설정. + +Claude Code는 여러 범위의 JSON 파일에서 설정을 읽습니다. 낮은 우선순위에서 높은 우선순위 순으로 병합됩니다. + +## 설정 파일 위치 + +**전역(사용자):** `~/.claude/settings.json` +모든 프로젝트에 걸쳐 실행하는 모든 Claude Code 세션에 적용됩니다. 선호 모델, 테마, 정리 정책 같은 개인 설정을 여기에 설정합니다. + +**프로젝트(공유):** `.claude/settings.json` (프로젝트 루트) +소스 컨트롤에 체크인됩니다. 프로젝트 작업자 모두에게 적용되어야 하는 설정 — 권한 규칙, 훅 설정, MCP 서버, 환경 변수. + +**로컬(개인 프로젝트):** `.claude/settings.local.json` (프로젝트 루트) +소스 컨트롤에 체크인되지 않습니다(자동으로 `.gitignore`에 추가됨). 특정 프로젝트 내의 개인 재정의. + +**Managed(엔터프라이즈):** 플랫폼별 시스템 경로 +MDM, 레지스트리(Windows), plist(macOS), 또는 Managed 설정 파일을 통해 관리자가 설정합니다. Managed 설정은 최고 우선순위를 가지며 사용자나 프로젝트가 재정의할 수 없습니다. + +## 설정 우선순위 + +``` +플러그인 기본값 → 사용자 설정 → 프로젝트 설정 → 로컬 설정 → Managed(정책) 설정 +``` + +Managed(정책) 설정은 항상 최종 우선순위를 가집니다. + +## 설정 열기 + +세션 내에서 `/config`를 실행해 설정 UI를 엽니다. 각 범위의 현재 활성 설정을 찾아볼 수 있습니다. JSON 파일을 직접 편집할 수도 있습니다 — Claude Code가 파일 변경을 감지하면 자동으로 설정을 다시 로드합니다. + +## 설정 레퍼런스 + +### `model` +**타입:** `string` | **범위:** 모든 범위 + +Claude Code가 사용하는 기본 모델 재정의. 설정된 공급자가 지원하는 모든 모델 ID 허용. + +```json +{ "model": "claude-opus-4-5" } +``` + +### `permissions` +**타입:** `object` | **범위:** 모든 범위 + +Claude가 사용할 수 있는 도구와 모드를 제어합니다. 규칙 구문은 [권한 시스템](./06_권한시스템.md) 참조. + +| 필드 | 타입 | 설명 | +|------|------|------| +| `allow` | `string[]` | Claude가 확인 없이 수행할 수 있는 작업 규칙 | +| `deny` | `string[]` | Claude가 항상 차단되는 작업 규칙 | +| `ask` | `string[]` | 항상 확인을 요청하는 작업 규칙 | +| `defaultMode` | `string` | 기본 권한 모드: `"default"`, `"acceptEdits"`, `"plan"`, `"bypassPermissions"` | +| `disableBypassPermissionsMode` | `"disable"` | 사용자가 bypass permissions 모드에 들어가는 것을 방지 | +| `additionalDirectories` | `string[]` | Claude가 접근할 수 있는 추가 디렉토리 | + +### `hooks` +**타입:** `object` | **범위:** 모든 범위 + +도구 실행 전후에 커스텀 셸 커맨드를 실행합니다. 지원 훅 이벤트: `PreToolUse`, `PostToolUse`, `Notification`, `UserPromptSubmit`, `SessionStart`, `SessionEnd`, `Stop`, `SubagentStop`, `PreCompact`, `PostCompact`. + +```json +{ + "hooks": { + "PostToolUse": [ + { + "matcher": "Write", + "hooks": [{ "type": "command", "command": "prettier --write $CLAUDE_FILE_PATHS" }] + } + ] + } +} +``` + +### `cleanupPeriodDays` +**타입:** `integer` | **기본값:** `30` | **범위:** 모든 범위 + +채팅 트랜스크립트 보관 일수. `0`으로 설정하면 세션 영속성이 완전히 비활성화됩니다. + +### `env` +**타입:** `object` | **범위:** 모든 범위 + +모든 Claude Code 세션에 주입할 환경 변수. 값은 문자열로 변환됩니다. + +```json +{ + "env": { + "NODE_ENV": "development", + "MY_API_URL": "https://api.example.com" + } +} +``` + +### `availableModels` +**타입:** `string[]` | **범위:** Managed만 + +사용자가 선택 가능한 모델의 엔터프라이즈 허용 목록. 패밀리 별칭(`"opus"`는 모든 Opus 버전 허용), 버전 프리픽스, 또는 전체 모델 ID 허용. + +### `worktree` +**타입:** `object` | **범위:** 모든 범위 + +`--worktree` 플래그 동작 설정. + +| 필드 | 타입 | 설명 | +|------|------|------| +| `symlinkDirectories` | `string[]` | worktree에 메인 저장소에서 심링크할 디렉토리 (예: `"node_modules"`) | +| `sparsePaths` | `string[]` | 대규모 모노레포에서 빠른 worktree를 위한 sparse 체크아웃 경로 | + +### `attribution` +**타입:** `object` | **범위:** 모든 범위 + +Claude가 커밋과 PR 설명에 추가하는 어트리뷰션 텍스트를 커스터마이징합니다. + +```json +{ + "attribution": { + "commit": "Co-Authored-By: Claude ", + "pr": "" + } +} +``` + +### `language` +Claude 응답과 음성 받아쓰기에 선호되는 언어. `{ "language": "korean" }` + +### `alwaysThinkingEnabled` +**기본값:** `true` — `false`로 설정해 확장 thinking 비활성화. + +### `effortLevel` +`"low"` | `"medium"` | `"high"` — thinking 예산을 지원하는 모델의 effort 레벨. + +### `autoMemoryEnabled` +**범위:** 사용자, 로컬 — 이 프로젝트의 자동 메모리 활성화 또는 비활성화. + +### `respectGitignore` +**기본값:** `true` — 파일 피커가 `.gitignore` 파일을 존중할지 여부. + +### `defaultShell` +`"bash"` | `"powershell"` — 입력 박스의 `!` 커맨드용 기본 셸. + +### `apiKeyHelper` +**범위:** 사용자, Managed — API 키를 동적으로 검색하는 스크립트 경로. 스크립트는 stdout에 API 키만 출력하고 코드 0으로 종료해야 합니다. + +## Managed 설정 (엔터프라이즈) + +관리자는 플랫폼 네이티브 메커니즘을 통해 모든 사용자에게 설정을 배포할 수 있습니다. + +**macOS:** `/Library/Preferences/`에 plist 파일 배포 또는 MDM을 통해 `com.anthropic.claudecode` 타겟 + +**Windows:** `HKLM\Software\Anthropic\Claude Code` 레지스트리 키에 설정 작성 + +**파일 기반:** Managed 설정 파일을 플랫폼별 managed 경로에 배치. 드롭인 설정 조각에는 `managed-settings.d/` 디렉토리 사용(알파벳 순으로 정렬 및 병합됨). + +### Managed 전용 잠금 설정 + +| 설정 | 설명 | +|------|------| +| `allowManagedHooksOnly` | `true`로 설정 시 Managed 설정의 훅만 실행 | +| `allowManagedPermissionRulesOnly` | `true`로 설정 시 Managed 설정의 권한 규칙만 존중 | +| `allowManagedMcpServersOnly` | `true`로 설정 시 허용 MCP 서버 목록을 Managed 설정에서만 읽음 | +| `strictPluginOnlyCustomization` | 특정 커스터마이징 표면을 플러그인 전용 소스로 잠금 | + +## JSON 스키마 + +에디터 자동완성 및 유효성 검사를 위해 설정 파일에 `$schema` 추가: + +```json +{ + "$schema": "https://schemas.anthropic.com/claude-code/settings.json" +} +``` diff --git a/docs/claude-code-docs-main/11_인증.md b/docs/claude-code-docs-main/11_인증.md new file mode 100644 index 0000000..fcf91f2 --- /dev/null +++ b/docs/claude-code-docs-main/11_인증.md @@ -0,0 +1,130 @@ +# 인증 + +> Anthropic API, AWS Bedrock, GCP Vertex AI로 Claude Code 인증 설정 방법. + +Claude Code는 여러 인증 방식을 지원합니다. 방식은 API에 직접 접근하는지, 클라우드 제공업체를 통하는지, API 키 헬퍼 스크립트를 통하는지에 따라 다릅니다. + +## Claude.ai OAuth (기본) + +API 키가 설정되지 않은 상태에서 `claude`를 처음 실행하면, Claude Code가 claude.ai 계정으로 OAuth 흐름을 시작합니다. + +1. 터미널에서 실행: `claude` +2. URL이 표시되면 브라우저에서 열어 claude.ai 계정으로 로그인하고 권한 부여 +3. 브라우저에서 인증 후 Claude Code가 자동으로 OAuth 토큰을 받아 저장합니다(macOS는 Keychain, 다른 플랫폼은 자격 증명 파일) + +OAuth 토큰은 만료 전에 자동으로 갱신됩니다. 명시적으로 로그아웃하거나 접근을 취소하지 않는 한 재인증이 필요하지 않습니다. + +## API 키 + +OAuth 대신 Anthropic API 키로 인증할 수 있습니다. + +**환경 변수:** +```bash +export ANTHROPIC_API_KEY=sk-ant-... +``` +이 변수가 설정되면 Claude Code가 직접 사용하고 OAuth를 요청하지 않습니다. + +**설정 파일 apiKeyHelper:** +```json +{ + "apiKeyHelper": "cat ~/.anthropic/api-key" +} +``` +Claude Code가 이 커맨드를 실행해 자격 증명을 동적으로 가져옵니다. 결과는 5분 동안 캐시됩니다(`CLAUDE_CODE_API_KEY_HELPER_TTL_MS`로 설정 가능). 커맨드는 API 키만 stdout에 출력하고 코드 0으로 종료해야 합니다. + +> ⚠️ `ANTHROPIC_API_KEY`가 설정되거나 `apiKeyHelper`가 구성되면 OAuth 흐름이 비활성화됩니다. + +## AWS Bedrock + +AWS Bedrock을 통해 Claude를 사용하려면: + +```bash +# 1. Bedrock 모드 활성화 +export CLAUDE_CODE_USE_BEDROCK=1 + +# 2. AWS 자격 증명 설정 (표준 AWS 자격 증명 체인) +# - AWS 자격 증명 파일 (~/.aws/credentials) +# - 환경 변수: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN +# - IAM 역할(EC2 인스턴스 프로파일, ECS 태스크 역할 등) +# - AWS SSO (aws sso login) + +# 3. 리전 설정 (선택사항) +export AWS_REGION=us-east-1 +``` + +**자동 AWS 자격 증명 갱신:** +세션이 만료될 경우(예: 단기 SSO 토큰) `awsAuthRefresh`를 설정해 자동으로 자격 증명을 갱신합니다: + +```json +{ + "awsAuthRefresh": "aws sso login --profile my-profile" +} +``` + +커맨드에서 자격 증명을 내보내려면 `awsCredentialExport`를 사용합니다: + +```json +{ + "awsCredentialExport": "aws sts assume-role --role-arn arn:aws:iam::123456789012:role/MyRole --role-session-name claude-code --query Credentials --output json" +} +``` + +## GCP Vertex AI + +Google Cloud Vertex AI를 통해 Claude를 사용하려면: + +```bash +# 1. Vertex 모드 활성화 +export CLAUDE_CODE_USE_VERTEX=1 + +# 2. GCP 자격 증명 설정 +# - gcloud auth application-default login (대화형) +# - GOOGLE_APPLICATION_CREDENTIALS를 통한 서비스 계정 키 파일 +# - 워크로드 아이덴티티(GKE용) + +# 3. 프로젝트 및 리전 설정 (선택사항) +export ANTHROPIC_VERTEX_PROJECT_ID=my-gcp-project +export CLOUD_ML_REGION=us-central1 +``` + +**자동 GCP 자격 증명 갱신:** +```json +{ + "gcpAuthRefresh": "gcloud auth application-default login" +} +``` + +## 계정 전환 + +**다른 계정으로 로그인:** +``` +/login +``` +새 OAuth 흐름을 시작합니다. 저장된 토큰이 새 계정의 토큰으로 교체됩니다. + +**로그아웃:** +``` +/logout +``` +저장된 자격 증명을 제거합니다. 다음 실행 시 인증을 요청합니다. + +## 토큰 만료 및 갱신 + +Claude Code가 조용히 토큰 갱신을 처리합니다: +- 각 API 요청 전에 액세스 토큰 만료 여부 확인 +- 만료된 경우 저장된 갱신 토큰으로 잠금을 획득하고 갱신 +- 여러 동시 Claude Code 인스턴스는 잠금 파일을 통해 중복 갱신 방지 +- API에서 `401` 응답이 오면 즉시 강제 갱신 + +## 인증 우선순위 + +여러 인증 소스가 설정된 경우 이 순서로 해석됩니다: + +1. `ANTHROPIC_AUTH_TOKEN` 환경 변수 +2. `CLAUDE_CODE_OAUTH_TOKEN` 환경 변수 +3. 파일 디스크립터의 OAuth 토큰(관리형 배포용) +4. 설정의 `apiKeyHelper` +5. 저장된 claude.ai OAuth 토큰(Keychain 또는 자격 증명 파일) +6. `ANTHROPIC_API_KEY` 환경 변수 + +> 💡 CI 및 비대화형 환경에서는 `ANTHROPIC_API_KEY` 또는 `CLAUDE_CODE_OAUTH_TOKEN`을 사용하세요. 이것들은 대화형 흐름보다 먼저 확인됩니다. diff --git a/docs/claude-code-docs-main/12_훅.md b/docs/claude-code-docs-main/12_훅.md new file mode 100644 index 0000000..3068c2c --- /dev/null +++ b/docs/claude-code-docs-main/12_훅.md @@ -0,0 +1,224 @@ +# 훅 (Hooks) + +> Claude가 도구를 사용하거나 세션 마일스톤에 도달할 때 셸 커맨드, HTTP 요청, 프롬프트를 자동으로 실행합니다. + +훅은 Claude Code의 도구 라이프사이클에 자동화를 연결합니다. Claude가 파일을 읽거나, bash 커맨드를 실행하거나, 응답을 완료할 때 설정된 훅이 자동으로 실행됩니다. 코드 스타일 강제, 테스트 실행, 도구 사용 로깅, Claude가 할 수 있는 작업 제어에 훅을 사용하세요. + +## 훅 작동 방식 + +훅은 특정 **이벤트**에 바인딩된 커맨드(셸 스크립트, HTTP 엔드포인트, LLM 프롬프트)입니다. 이벤트가 발생하면 Claude Code가 매칭된 모든 훅을 실행하고 종료 코드와 출력을 사용해 다음 동작을 결정합니다. + +각 훅의 입력은 무슨 일이 일어났는지 설명하는 JSON 객체입니다. + +**종료 코드 의미:** +| 종료 코드 | 의미 | +|----------|------| +| `0` | 성공. stdout이 Claude에게 표시될 수 있음(이벤트별 다름) | +| `2` | 차단 또는 주입. stderr를 Claude에게 표시하고(`PreToolUse`) 도구 호출 방지 | +| 기타 | stderr를 사용자에게만 표시; 실행 계속 | + +## 훅 이벤트 + +| 이벤트 | 설명 | +|--------|------| +| **PreToolUse** | 모든 도구 호출 직전에 발생. 도구 입력 검사, 승인/차단, 입력 수정 가능. 종료코드 `2` → 도구 호출 차단 | +| **PostToolUse** | 모든 성공적인 도구 호출 후 발생. 도구 출력 관찰 또는 Claude가 처리할 컨텍스트 주입 가능 | +| **PostToolUseFailure** | 도구 호출이 오류로 종료될 때 발생 | +| **Stop** | Claude가 응답을 종료하기 직전에 발생. 종료코드 `2` → stderr를 Claude에게 표시하고 대화 계속 | +| **SubagentStop** | 서브에이전트가 결론 내리기 직전에 발생 (`Stop`과 동일하지만 서브에이전트용) | +| **SubagentStart** | 새 서브에이전트가 시작될 때 발생 | +| **SessionStart** | 세션 시작, 재개, `/clear`, `/compact` 후에 발생 | +| **UserPromptSubmit** | 사용자가 프롬프트를 제출할 때 발생. 종료코드 `2` → 프롬프트 차단 | +| **PreCompact** | 컨텍스트 컴팩션 시작 직전에 발생. 종료코드 `2` → 컴팩션 차단 | +| **PostCompact** | 컴팩션 완료 후 발생 | +| **Setup** | 저장소 초기화(`init`) 및 주기적 유지보수(`maintenance`) 시 발생 | +| **PermissionRequest** | 권한 다이얼로그가 표시될 때 발생. 프로그래밍 방식으로 승인/거부 가능 | +| **PermissionDenied** | 도구 호출이 거부된 후 발생 | +| **Notification** | 권한 프롬프트, 유휴 프롬프트, 인증 성공 등의 알림 시 발생 | +| **CwdChanged** | 작업 디렉토리 변경 후 발생 | +| **FileChanged** | 감시 중인 파일이 변경될 때 발생 | +| **SessionEnd** | 세션이 종료될 때 발생 | +| **ConfigChange** | 세션 중 설정 파일이 변경될 때 발생 | + +## 훅 설정 + +세션 내에서 `/hooks`를 실행해 훅 설정 메뉴를 열 수 있습니다. 훅은 설정 파일의 `hooks` 필드에 저장됩니다: + +```json +{ + "hooks": { + "PostToolUse": [ + { + "matcher": "Write", + "hooks": [ + { + "type": "command", + "command": "prettier --write $CLAUDE_FILE_PATH" + } + ] + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "echo 'Session complete' >> ~/.claude-log.txt" + } + ] + } + ] + } +} +``` + +각 이벤트는 **매처 객체** 배열에 매핑됩니다: +- `matcher` (선택사항) — 이벤트의 매칭 가능한 필드와 매칭되는 문자열 패턴 +- `hooks` — 매처가 일치할 때 실행할 훅 커맨드 배열 + +빈 또는 없는 `matcher`는 해당 이벤트의 모든 입력과 일치합니다. + +## 훅 커맨드 타입 + +**셸 커맨드 (`type: "command"`):** +```json +{ + "type": "command", + "command": "npm test", + "timeout": 60, + "shell": "bash", + "async": false +} +``` + +필드: +- `command` — 실행할 셸 커맨드 (필수) +- `timeout` — 타임아웃(초) +- `shell` — `"bash"` (기본) 또는 `"powershell"` +- `async` — 백그라운드에서 실행 (출력 무시) +- `once` — 한 번 실행 후 자동으로 훅 제거 +- `if` — 조건부로 훅 건너뛰기 위한 권한 규칙 구문 +- `statusMessage` — 훅 실행 중 스피너에 표시되는 커스텀 메시지 + +**HTTP 요청 (`type: "http"`):** +```json +{ + "type": "http", + "url": "https://hooks.example.com/claude-event", + "headers": { + "Authorization": "Bearer $MY_TOKEN" + }, + "allowedEnvVars": ["MY_TOKEN"], + "timeout": 10 +} +``` + +Claude Code가 훅 입력 JSON을 URL에 POST합니다. + +**LLM 프롬프트 (`type: "prompt"`):** +```json +{ + "type": "prompt", + "prompt": "이 bash 커맨드에 보안 문제가 있는지 확인하세요: $ARGUMENTS. 문제가 있으면 설명하고 코드 2로 종료하세요.", + "model": "claude-haiku-4-5", + "timeout": 30 +} +``` + +**에이전트 훅 (`type: "agent"`):** +```json +{ + "type": "agent", + "prompt": "단위 테스트가 실행되고 통과했는지 확인하세요.", + "timeout": 60 +} +``` + +도구 접근 권한이 있는 짧은 에이전틱 루프로 실행됩니다. 파일을 읽거나 커맨드를 실행해야 하는 검증 작업에 유용합니다. + +## 훅 예시 + +**파일 편집 후 자동 포맷:** +```json +{ + "hooks": { + "PostToolUse": [ + { + "matcher": "Write", + "hooks": [ + { + "type": "command", + "command": "prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true" + } + ] + } + ] + } +} +``` + +**위험한 커맨드 차단:** +```json +{ + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -q 'rm -rf'; then echo '차단: rm -rf는 허용되지 않습니다' >&2; exit 2; fi" + } + ] + } + ] + } +} +``` + +**모든 도구 사용 로깅:** +```json +{ + "hooks": { + "PostToolUse": [ + { + "hooks": [ + { + "type": "command", + "command": "echo \"$(date -u +%Y-%m-%dT%H:%M:%SZ) $CLAUDE_TOOL_NAME\" >> ~/.claude-tool-log.txt", + "async": true + } + ] + } + ] + } +} +``` + +**디렉토리 변경 시 환경 변수 주입:** +```json +{ + "hooks": { + "CwdChanged": [ + { + "hooks": [ + { + "type": "command", + "command": "if [ -f .envrc ]; then grep '^export ' .envrc >> \"$CLAUDE_ENV_FILE\"; fi" + } + ] + } + ] + } +} +``` + +## 훅 vs 스킬 + +| 기능 | 훅 | 스킬 | +|------|-----|------| +| 실행 시점 | 도구 이벤트에 자동 | Claude나 사용자가 `/skill-name`으로 명시적 호출 | +| 목적 | 부작용, 게이팅, 관찰 | 온디맨드 워크플로우와 기능 | +| 설정 | 설정 JSON | `.claude/skills/`의 마크다운 파일 | + +자동으로 발생해야 하는 것(포맷팅, 로깅, 강제)에는 훅을 사용하고, 의도적으로 트리거하려는 반복 가능한 워크플로우에는 스킬을 사용하세요. diff --git a/docs/claude-code-docs-main/13_MCP서버.md b/docs/claude-code-docs-main/13_MCP서버.md new file mode 100644 index 0000000..269d2c9 --- /dev/null +++ b/docs/claude-code-docs-main/13_MCP서버.md @@ -0,0 +1,174 @@ +# MCP 서버 + +> Model Context Protocol 서버를 연결해 Claude Code의 기능을 데이터베이스, API, 커스텀 도구로 확장합니다. + +MCP(Model Context Protocol)는 Claude Code가 외부 데이터 소스와 서비스에 연결할 수 있게 하는 오픈 표준입니다. MCP 서버를 추가하면 Claude가 새 도구에 접근할 수 있습니다 — 예를 들어 데이터베이스 쿼리, Jira 티켓 읽기, Slack 워크스페이스 상호작용 등. + +## 서버 추가 방법 + +**CLI를 통해:** +```bash +# 기본 추가 +claude mcp add <이름> -- <커맨드> [인수...] + +# 예: filesystem MCP 서버 추가 +claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem /tmp + +# 범위 지정 +claude mcp add --scope project filesystem -- npx -y @modelcontextprotocol/server-filesystem /tmp +claude mcp add --scope user my-db -- npx -y @my-org/mcp-server-postgres +``` + +**`--mcp-config` 플래그:** +```bash +claude --mcp-config ./my-mcp-config.json +``` +CI 환경이나 설정 파일에 저장하지 않을 독립형 설정에 유용합니다. + +## 설정 파일 형식 + +```json +{ + "mcpServers": { + "filesystem": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/projects"], + "env": { + "NODE_ENV": "production" + } + } + } +} +``` + +**HTTP 원격 서버:** +```json +{ + "mcpServers": { + "my-api": { + "type": "http", + "url": "https://mcp.example.com/v1", + "headers": { + "Authorization": "Bearer $MY_API_TOKEN" + } + } + } +} +``` + +**SSE (Server-Sent Events):** +```json +{ + "mcpServers": { + "events-server": { + "type": "sse", + "url": "https://mcp.example.com/sse" + } + } +} +``` + +`command`, `args`, `url`, `headers` 값은 `$VAR` 및 `${VAR}` 구문을 지원합니다. 참조 변수가 없으면 Claude Code가 경고를 로그하지만 연결을 시도합니다. + +## 설정 범위 + +| 범위 | 위치 | 용도 | +|------|------|------| +| `project` | 현재 디렉토리의 `.mcp.json` | 팀 공유 서버 설정 | +| `user` | `~/.claude.json` (전역 설정) | 모든 곳에서 이용 가능한 개인 서버 | +| `local` | 현재 프로젝트의 `.claude/settings.local.json` | 개인 프로젝트별 재정의, VCS에 커밋되지 않음 | + +같은 서버 이름이 여러 범위에 나타나면 `local` > `project` > `user` 순으로 우선합니다. + +## 서버 관리 + +**활성화/비활성화:** +``` +/mcp enable +/mcp disable +/mcp enable all +/mcp disable all +``` + +비활성화된 서버는 설정에 남아있지만 시작 시 연결되지 않습니다. + +**서버 재연결:** +``` +/mcp reconnect +``` + +**서버 상태 확인:** +`/mcp`를 실행해 모든 설정된 서버와 현재 연결 상태를 확인합니다: +- **connected** — 서버가 실행 중이고 준비됨 +- **pending** — 서버가 시작 중 +- **failed** — 서버 연결 실패(오류 메시지 확인) +- **needs-auth** — OAuth 인증 필요 +- **disabled** — 설정되었지만 꺼짐 + +## MCP 도구 호출 승인 + +Claude Code는 MCP 도구를 호출하기 전에 권한 프롬프트를 표시합니다. 도구 이름과 입력 인수를 보여줍니다: +- **한 번 허용** — 이 특정 호출 승인 +- **항상 허용** — 이 세션에서 이 도구의 모든 호출 승인 +- **거부** — 호출 차단; Claude가 오류를 받고 다른 접근을 시도 + +> 📝 자동 모드(`--allowedTools`)에서 MCP 도구는 허용 도구 목록에 전체 이름(`mcp____` 형식)을 포함시켜 사전 승인할 수 있습니다. + +## 예시: filesystem 서버 + +```bash +# 1. 서버 추가 +claude mcp add --scope project filesystem -- npx -y @modelcontextprotocol/server-filesystem /home/user/projects + +# 2. 연결 확인 +# /mcp 실행 → filesystem이 connected로 표시되는지 확인 + +# 3. 사용 +# Claude가 이제 mcp__filesystem__read_file과 mcp__filesystem__write_file 도구로 +# /home/user/projects의 파일을 읽고 쓸 수 있음 +``` + +## 예시: 데이터베이스 서버 + +```json +{ + "mcpServers": { + "postgres": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-postgres"], + "env": { + "POSTGRES_CONNECTION_STRING": "$DATABASE_URL" + } + } + } +} +``` + +Claude Code 시작 전에 환경에서 `DATABASE_URL`을 설정하면 MCP 서버가 자동으로 받습니다. + +## 공식 MCP 레지스트리 + +[modelcontextprotocol.io](https://modelcontextprotocol.io)에서 Anthropic과 커뮤니티가 관리하는 MCP 서버 레지스트리를 찾아볼 수 있습니다 — 데이터베이스, 생산성 도구, 클라우드 제공업체 등. + +## 문제 해결 + +**서버가 'failed'로 표시됨:** +- 커맨드가 존재하고 실행 가능한지 확인: `which npx` +- 터미널에서 커맨드를 직접 실행해 오류 없이 시작되는지 확인 +- 필요한 환경 변수(API 키 등)가 설정되었는지 확인 +- `claude --debug`로 상세 연결 로그 확인 + +**MCP 도구가 나타나지 않음:** +연결되었지만 미인증 상태인 서버는 도구를 노출하지 않습니다. `/mcp`에서 **needs-auth** 상태를 확인하고 OAuth 흐름을 따르세요. + +**Windows: npx 실패:** +```json +{ + "mcpServers": { + "my-server": { + "command": "cmd", + "args": ["/c", "npx", "-y", "@my-org/mcp-server"] + } + } +} +``` diff --git a/docs/claude-code-docs-main/14_멀티에이전트.md b/docs/claude-code-docs-main/14_멀티에이전트.md new file mode 100644 index 0000000..2596f2e --- /dev/null +++ b/docs/claude-code-docs-main/14_멀티에이전트.md @@ -0,0 +1,115 @@ +# 멀티에이전트 워크플로우 + +> Claude가 서브에이전트를 스폰하고 조율해 복잡한 작업을 병렬화하는 방법. + +Claude Code는 서브에이전트 — 독립적으로 실행되어 병렬로 작업을 완료하는 별도의 Claude 인스턴스 — 를 스폰할 수 있습니다. 단일 대화에서 순차적으로 모든 것을 하는 대신, 동시에 실행하는 특화 에이전트로 분할해서 크고 다단계 작업을 처리할 수 있습니다. + +## 서브에이전트 작동 방식 + +Claude가 `Agent` 도구를 사용하면, 자체 컨텍스트, 시스템 프롬프트, 도구 권한을 가진 새 Claude 인스턴스를 시작합니다. 부모 Claude는 에이전트가 완료될 때까지 기다리거나(또는 에이전트가 백그라운드에서 실행 중이면 다른 작업을 계속합니다), 그 후 에이전트의 결과를 단일 메시지로 받습니다. + +각 에이전트는: +- 새 컨텍스트 윈도우로 시작 (fork가 아닌 한) +- 에이전트 타입에 따라 특화된 시스템 프롬프트 적용 +- 자체 도구 권한 (에이전트 타입별로 설정 가능) +- 추가 서브에이전트를 스폰 가능 (단, 중첩은 제한됨) + +## Agent 도구 + +Claude가 `Agent` 도구를 사용해 서브에이전트를 스폰합니다. 이 도구를 직접 호출하는 것이 아니라 Claude가 필요할 때 결정합니다. 터미널에서 에이전트 스폰을 볼 수 있습니다 — 자체 진행 표시기와 함께 나타납니다. + +도구 파라미터: +- `description` — 에이전트가 할 일의 3-5단어 요약 (UI에 표시) +- `prompt` — 에이전트에 대한 전체 작업 설명 +- `subagent_type` — 사용할 특화 에이전트 타입 (선택사항; 기본값은 범용) +- `run_in_background` — 비동기 실행 여부 +- `isolation` — `"worktree"`로 격리된 git worktree 제공 + +## Claude가 서브에이전트를 사용하는 경우 + +작업이 병렬 처리나 특화에 도움이 될 때 에이전트를 스폰합니다: +- **독립적 병렬 작업** — 문서 업데이트와 동시에 테스트 작성 +- **특화 작업** — 보안 감사를 위한 코드 리뷰어 에이전트 사용 +- **장시간 실행 작업** — 다른 것을 작업하는 동안 백그라운드 리서치 +- **격리된 탐색** — 메인 컨텍스트를 오염시키지 않고 솔루션 탐색을 위해 자신을 포크 + +## 멀티에이전트 워크플로우 요청 + +Claude에게 명시적으로 여러 에이전트 사용을 요청할 수 있습니다: + +``` +linter와 test suite를 병렬로 실행해줘. +``` + +``` +세 경쟁 라이브러리가 이 문제를 어떻게 처리하는지 별도의 에이전트로 조사한 후 결과를 요약해줘. +``` + +``` +보안 에이전트가 이 코드 변경의 보안 영향을 검토하는 동안 기능 구현을 계속해줘. +``` + +> 💡 Claude에게 에이전트를 "병렬로" 실행하도록 요청하면, 여러 Agent 도구 호출을 포함하는 단일 메시지를 전송해 모두 동시에 시작합니다. + +## 포그라운드 vs 백그라운드 에이전트 + +기본적으로 에이전트는 **포그라운드**에서 실행됩니다 — Claude가 계속하기 전에 각 에이전트가 완료될 때까지 기다립니다. Claude가 결과를 계속 작업하는 데 필요한 경우 포그라운드 에이전트를 사용하세요. + +백그라운드 에이전트는 비동기로 실행됩니다. Claude가 시작하고 다른 작업을 계속합니다. 에이전트가 완료되면 알림을 받습니다. + +``` +다음 기능을 구현하는 동안 통합 테스트를 백그라운드에서 실행해줘. +``` + +> ⚠️ 실행 중인 백그라운드 에이전트의 출력 파일을 직접 확인하도록 Claude에게 요청하지 마세요. Claude는 자동으로 완료 알림을 받습니다. + +## 코디네이터 모드 + +코디네이터 모드에서 Claude는 모든 구현 작업을 서브에이전트에 위임하고 계획, 라우팅, 종합에 집중합니다. 매우 큰 작업에 유용하며 서브에이전트가 실질적인 작업을 수행합니다. + +## 에이전트 메모리와 컨텍스트 격리 + +각 서브에이전트는 **깨끗한 컨텍스트 윈도우**로 시작합니다. 부모 Claude가 에이전트 프롬프트에 전체 작업 설명과 관련 배경을 제공합니다 — 에이전트는 부모의 대화 기록을 자동으로 상속하지 않습니다. + +**영속 에이전트 메모리:** +일부 에이전트 타입은 호출 간에 영속 메모리를 가집니다: +- **사용자 범위**: `~/.claude/agent-memory//MEMORY.md` +- **프로젝트 범위**: `.claude/agent-memory//MEMORY.md` +- **로컬 범위**: `.claude/agent-memory-local//MEMORY.md` + +## Worktree 격리 + +`isolation: "worktree"`를 설정해 에이전트에게 자체 git worktree를 제공합니다 — 저장소의 격리된 복사본. 에이전트가 만드는 변경 사항은 사용자가 병합하기 전까지 작업 디렉토리에 영향을 주지 않습니다. + +``` +내가 변경 사항을 검토하고 병합할 수 있도록 격리된 worktree에서 이 기능을 구현해줘. +``` + +## 효과적인 에이전트 프롬프트 작성 + +서브에이전트는 부모 대화의 컨텍스트가 없이 시작합니다. 좋은 에이전트 프롬프트에는 다음이 포함됩니다: +- 달성하려는 것과 이유 +- 관련 파일 경로, 함수 이름, 데이터 +- 에이전트가 보고해야 할 내용(형식, 길이, 답해야 할 질문) +- 에이전트가 하면 안 되는 것(범위 제약) +- 이미 시도했거나 배제한 것 + +**나쁜 프롬프트:** +``` +버그를 수정해줘. +``` + +**좋은 프롬프트:** +``` +src/services/user.ts:247의 UserService.getProfile()에 있는 null 참조 버그를 수정해줘. +사용자에게 연관된 프로파일 레코드가 없을 때 버그가 발생합니다 — getProfile()이 profile이 null인지 먼저 확인하지 않고 profile.preferences를 호출합니다. null 체크를 추가하고 기본 설정 객체 { theme: 'light', notifications: true }를 반환하세요. +그 후 npm test를 실행해 수정 사항이 기존 테스트를 통과하는지 확인하세요. +``` + +## 제한사항 + +- 서브에이전트는 기본적으로 `acceptEdits` 모드를 사용합니다 +- 에스케이프를 누르면 부모 턴을 취소하지만 실행 중인 백그라운드 에이전트는 취소하지 않습니다 — 작업 패널에서 명시적으로 취소하세요 +- 서브에이전트는 다른 팀메이트를 스폰할 수 없습니다 (팀 로스터는 플랫) +- 포크 에이전트는 자신을 다시 포크할 수 없습니다 +- 에이전트 결과는 부모에 반환되기 전에 100,000자로 제한됩니다 diff --git a/docs/claude-code-docs-main/15_스킬.md b/docs/claude-code-docs-main/15_스킬.md new file mode 100644 index 0000000..284ce80 --- /dev/null +++ b/docs/claude-code-docs-main/15_스킬.md @@ -0,0 +1,195 @@ +# 스킬 (Skills) + +> 슬래시 커맨드로 호출하는 재사용 가능한 온디맨드 기능을 만드는 방법. + +스킬은 재사용 가능한 프롬프트와 워크플로우를 정의하는 마크다운 파일입니다. Claude Code에서 `/skill-name`을 입력하면 Claude가 해당 스킬의 지시사항을 로드하고 설명된 작업을 실행합니다. 세션 간에 반복하는 모든 워크플로우에 유용합니다 — 배포 실행, 변경 내역 작성, PR 검토, 팀 특유의 코딩 컨벤션 적용 등. + +## 스킬 작동 방식 + +스킬은 `SKILL.md` 파일이 있는 `.claude/skills/` 안의 디렉토리입니다. `/skill-name`을 입력하면 Claude Code가 해당 스킬의 `SKILL.md`를 그 액션의 프롬프트로 로드합니다. 스킬은 지시사항, 컨텍스트, 제약, 호출 시 실행되는 인라인 셸 커맨드까지 포함할 수 있습니다. + +스킬은 지연 로드됩니다 — 호출될 때만 읽히므로 스킬이 많이 정의되어 있어도 시작 시간이나 컨텍스트 크기에 영향을 주지 않습니다. + +## 스킬 만들기 + +**1. 스킬 디렉토리 만들기:** +```bash +mkdir -p .claude/skills/my-skill +``` + +스킬은 다음 위치에 있을 수 있습니다: +- `.claude/skills/` (프로젝트 레벨, 현재 작업 디렉토리 기준) +- `~/.claude/skills/` (사용자 레벨, 모든 프로젝트에서 사용 가능) + +**2. SKILL.md 작성:** +```markdown +--- +description: 이 프로젝트의 전체 릴리즈 프로세스 실행 +argument-hint: 버전 번호 (예: 1.2.3) +--- + +$ARGUMENTS 버전으로 프로젝트를 릴리즈합니다. + +단계: +1. `package.json`의 버전을 $ARGUMENTS로 업데이트 +2. CHANGELOG.md에 이 버전의 새 섹션 추가 +3. `npm test` 실행 및 모든 테스트 통과 확인 +4. "chore: release v$ARGUMENTS" 메시지로 커밋 +5. `v$ARGUMENTS` git 태그 생성 +``` + +**3. 스킬 호출:** +``` +/my-skill 1.2.3 +``` + +Claude가 스킬을 로드하고 지시사항을 실행합니다 — `1.2.3`이 `$ARGUMENTS`에 대입됩니다. + +## 스킬 프론트매터 + +`SKILL.md` 상단의 프론트매터로 스킬 동작을 설정합니다. 모든 필드는 선택사항입니다. + +| 필드 | 설명 | +|------|------| +| `description` | `/skills`에 표시되고 Claude가 언제 사용할지 결정하는 짧은 설명 | +| `argument-hint` | 슬래시 커맨드 자동완성에 표시되는 힌트 | +| `allowed-tools` | 이 스킬이 사용할 수 있는 도구 목록(기본값: 모두) | +| `when_to_use` | Claude가 언제 이 스킬을 적극적으로 사용해야 하는지 설명 | +| `model` | 이 스킬에 사용할 모델 (예: `claude-sonnet-4-6`) | +| `user-invocable` | `false`로 설정해 슬래시 커맨드 목록에서 숨김 (Claude는 여전히 사용 가능) | +| `context` | `fork`로 격리된 서브에이전트 컨텍스트에서 스킬 실행 | +| `paths` | 일치하는 파일이 터치될 때만 스킬 활성화하는 Glob 패턴 | +| `version` | 스킬 버전 문자열 | +| `hooks` | 이 스킬 실행에 범위가 제한된 훅 | + +## 인수 대입 + +`SKILL.md` 어디서나 `$ARGUMENTS`를 사용해 슬래시 커맨드 뒤에 전달된 텍스트를 삽입합니다: + +```markdown +$ARGUMENTS라는 이름의 새 React 컴포넌트를 프로젝트 컨벤션에 따라 생성합니다. +``` + +``` +/new-component UserProfile +``` + +명명된 인수의 경우, 프론트매터에 인수를 나열하고 `$name` 구문으로 참조합니다: + +```yaml +--- +arguments: [name, directory] +--- +``` + +## 인라인 셸 커맨드 + +스킬은 호출 시 실행되는 셸 커맨드를 임베드할 수 있습니다. 출력이 Claude가 보기 전에 프롬프트에 삽입됩니다: + +```markdown +--- +description: 최근 변경 사항 검토 +--- + +컨텍스트를 위한 최근 커밋들: + +!`git log --oneline -20` + +위 변경 사항을 검토하고 무엇이 달성됐는지 요약해주세요. +``` + +`!` 프리픽스 후 백틱으로 감싼 커맨드가 실행되고 해당 블록이 출력으로 교체됩니다. + +> ⚠️ 인라인 셸 커맨드는 셸과 동일한 권한으로 실행됩니다. 스킬이 로드될 때가 아니라 호출될 때 실행됩니다. + +## 스킬 목록 보기 + +``` +/skills +``` + +모든 범위(프로젝트, 사용자, Managed)의 사용 가능한 모든 스킬과 설명을 표시합니다. + +## 네임스페이스 스킬 + +서브디렉토리의 스킬은 콜론으로 네임스페이스됩니다: + +``` +.claude/skills/ + deployment/ + SKILL.md → /deployment + database/ + migrate/ + SKILL.md → /database:migrate + seed/ + SKILL.md → /database:seed +``` + +## 경로 기반 조건부 스킬 + +`paths` 프론트매터 필드를 추가해 일치하는 파일 작업 시에만 스킬을 활성화합니다: + +```yaml +--- +description: Django 모델 검토 +paths: "**/*.py" +when_to_use: Django 모델 파일 편집 시 사용 +--- +``` + +Glob 패턴과 일치하는 파일을 읽거나, 쓰거나, 편집할 때 스킬이 자동으로 Claude의 컨텍스트에 로드됩니다. + +## 사용자 레벨 스킬 + +`~/.claude/skills/`의 스킬은 각 저장소에 추가하지 않아도 모든 프로젝트에서 사용할 수 있습니다: + +```bash +mkdir -p ~/.claude/skills/standup +cat > ~/.claude/skills/standup/SKILL.md << 'EOF' +--- +description: 스탠드업 업데이트를 위해 오늘 작업한 내용 요약 +--- + +이 저장소에서 오늘의 git 커밋을 확인하고 스탠드업 형식으로 요약해주세요: 한 일, 다음에 할 일, 막히는 것. 3-4문장으로 유지해주세요. +EOF +``` + +## 스킬 예시: 컴포넌트 생성기 + +```markdown +--- +description: 테스트와 함께 새 React 컴포넌트 생성 +argument-hint: ComponentName +allowed-tools: Write, Bash +--- + +$ARGUMENTS라는 이름의 새 React 컴포넌트를 만듭니다. + +1. `src/components/$ARGUMENTS/$ARGUMENTS.tsx` 생성: + - TypeScript를 사용하는 함수형 컴포넌트 + - `$ARGUMENTSProps`라는 Props 인터페이스 + - 컴포넌트를 설명하는 JSDoc 주석 + - default export + +2. `src/components/$ARGUMENTS/$ARGUMENTS.test.tsx` 생성: + - React Testing Library를 사용한 최소 하나의 렌더링 테스트 + - 스냅샷 테스트 + +3. 컴포넌트를 re-export하는 `src/components/$ARGUMENTS/index.ts` 생성 + +4. `npx tsc --noEmit`을 실행해 타입 오류 없음 확인 +``` + +호출: +``` +/new-component Button +``` + +## 훅 vs 스킬 비교 + +| 기능 | 스킬 | 훅 | +|------|------|-----| +| 호출 | 명시적: `/skill-name` 또는 Claude가 필요를 인식 | 자동: 도구 이벤트에 발생 | +| 용도 | 의도적으로 트리거하려는 반복 가능한 워크플로우 | 부작용, 포맷팅, lint, 차단 | +| 설정 | `.claude/skills/`의 `SKILL.md` | 설정 JSON의 `hooks` 필드 | +| 컨텍스트 | 파일, 셸 출력, 상세 지시사항 포함 가능 | 이벤트 JSON 수신, 종료 코드와 출력 반환 | diff --git a/docs/claude-code-docs-main/16_커맨드개요.md b/docs/claude-code-docs-main/16_커맨드개요.md new file mode 100644 index 0000000..0e5ddc4 --- /dev/null +++ b/docs/claude-code-docs-main/16_커맨드개요.md @@ -0,0 +1,90 @@ +# 커맨드 개요 + +> Claude Code는 두 가지 커맨드 범주를 허용합니다: 실행 시 전달하는 CLI 플래그와 세션 중 입력하는 슬래시 커맨드. + +## 두 가지 커맨드 타입 + +| 타입 | 사용 시점 | 예시 | +|------|----------|------| +| CLI 플래그 | 세션 시작 시 설정 — 모델, 출력 형식, 권한 모드 설정 | `claude --permission-mode acceptEdits "테스트 수정해줘"` | +| 슬래시 커맨드 | 실행 중인 세션과 상호작용 — 메모리 관리, 모델 전환, 코드 커밋 | `/commit` | + +CLI 플래그는 한 번 소비되고 세션 중간에 변경할 수 없습니다(실행 중인 설정을 변경하는 `/model`과 `/permissions` 제외). + +## 도움말 확인 + +```bash +# 모든 CLI 플래그 표시 +claude --help + +# 세션 내에서 슬래시 커맨드 목록 +/help +``` + +`/help`는 현재 세션에서 사용 가능한 모든 슬래시 커맨드를 나열합니다 — 플러그인과 스킬이 추가한 커맨드 포함. + +## CLI 플래그 사용법 + +```bash +claude [플래그] [프롬프트] +``` + +```bash +# 비대화형: 응답 출력 후 종료 +claude -p "README.md를 요약해줘" < README.md + +# 세션 모델 설정 +claude --model opus + +# 파일 편집 자동 승인 +claude --permission-mode acceptEdits +``` + +자세한 내용은 [CLI 플래그](./17_CLI플래그.md) 참조. + +## 슬래시 커맨드 사용법 + +세션 내에서 입력 프롬프트에 슬래시 커맨드 입력: + +``` +/command [인수] +``` + +``` +/init +/compact 최근 세 작업만 요약해줘 +/model claude-opus-4-5 +``` + +자세한 내용은 [슬래시 커맨드](./18_슬래시커맨드.md) 참조. + +## 키보드 단축키 + +모든 대화형 Claude Code 세션에서 작동: + +| 키 | 동작 | +|----|------| +| `Ctrl+C` | 현재 응답 중단 (Claude가 턴 중간에 멈춤) | +| `Ctrl+D` | Claude Code 종료 | +| `Ctrl+L` | 터미널 화면 지우기 (대화 기록은 지우지 않음) | +| `Up` / `Down` | 입력 기록 탐색 | +| `Tab` | 슬래시 커맨드 이름 자동완성 | +| `Escape` | 진행 중인 권한 프롬프트 취소 | + +> 📝 `Ctrl+C`는 현재 응답을 중단하지만 대화는 유지합니다. 세션을 완전히 종료하려면 `Ctrl+D` 또는 `/exit`를 사용하세요. + +## 서브커맨드 + +메인 `claude` 커맨드 외에도 터미널에서 사용 가능한 서브커맨드: + +| 서브커맨드 | 설명 | +|------------|------| +| `claude mcp` | MCP 서버 설정 및 관리 | +| `claude mcp serve` | Claude Code를 MCP 서버로 시작 | +| `claude doctor` | 설치 및 설정 문제 진단 | +| `claude update` | Claude Code를 최신 버전으로 업데이트 | + +```bash +claude mcp --help +claude doctor +``` diff --git a/docs/claude-code-docs-main/17_CLI플래그.md b/docs/claude-code-docs-main/17_CLI플래그.md new file mode 100644 index 0000000..d717da8 --- /dev/null +++ b/docs/claude-code-docs-main/17_CLI플래그.md @@ -0,0 +1,187 @@ +# CLI 플래그 + +> 터미널에서 Claude Code를 실행할 때 전달할 수 있는 모든 옵션. + +```bash +claude [플래그] [프롬프트] +``` + +## 핵심 플래그 + +**`-p, --print`** +Claude를 비대화형으로 실행. Claude가 프롬프트를 처리하고 응답을 출력한 후 종료합니다. REPL이 시작되지 않습니다. +```bash +claude -p "src/index.ts의 메인 함수를 설명해줘" +echo "이게 뭐야?" | claude -p +``` +> ⚠️ `--print` 모드에서는 작업 공간 신뢰 다이얼로그가 건너뜁니다. 신뢰하는 디렉토리에서만 사용하세요. + +**`--output-format <형식>`** (`--print`와 함께만 작동) +| 값 | 설명 | +|----|------| +| `text` | 일반 텍스트 출력 (기본값) | +| `json` | 완전한 결과가 담긴 단일 JSON 객체 | +| `stream-json` | 실시간 이벤트를 담은 줄바꿈으로 구분된 JSON 스트림 | + +**`--verbose`** +상세 출력 활성화. + +**`-v, --version`** +버전 번호 출력 후 종료. + +## 세션 계속 플래그 + +**`-c, --continue`** +현재 디렉토리의 가장 최근 대화를 재개합니다. +```bash +claude --continue +claude -c "이제 테스트 추가해줘" +``` + +**`-r, --resume [session-id]`** +세션 ID로 대화를 재개합니다. 값 없이 사용하면 지난 세션 목록에서 선택합니다. +```bash +claude --resume +claude --resume 550e8400-e29b-41d4-a716-446655440000 +claude --resume "auth refactor" +``` + +**`--fork-session`** +`--continue` 또는 `--resume`과 함께 사용해 재개된 대화에서 분기된 새 세션을 만듭니다. + +**`-n, --name <이름>`** +세션 표시 이름 설정. + +**`--no-session-persistence`** +세션 영속성 비활성화. `--print`와 함께만 작동합니다. + +## 모델 및 기능 플래그 + +**`--model <모델>`** +세션 모델 설정. 별칭(`sonnet`, `opus`, `haiku`) 또는 전체 모델 ID(`claude-sonnet-4-6`) 허용. +```bash +claude --model sonnet +claude --model opus +claude --model claude-sonnet-4-6 +``` + +**`--effort <레벨>`** +세션의 effort 레벨 설정: `low`, `medium` (기본), `high`, `max`. +```bash +claude --effort high "이 아키텍처를 검토해줘" +``` + +**`--fallback-model <모델>`** +기본 모델이 과부하될 때 자동 대체 모델 활성화. `--print`와 함께만 작동합니다. + +## 권한 및 보안 플래그 + +**`--permission-mode <모드>`** +세션의 권한 모드 설정: +| 모드 | 동작 | +|------|------| +| `default` | 커맨드 실행 및 편집 전에 확인 요청 | +| `acceptEdits` | 파일 편집 자동 적용; 셸 커맨드는 여전히 확인 필요 | +| `plan` | 계획을 제안하고 실행 전 승인 대기 | +| `bypassPermissions` | 프롬프트 없이 모든 작업 실행 — 격리된 샌드박스 환경 전용 | + +**`--dangerously-skip-permissions`** +모든 권한 검사를 우회합니다. `--permission-mode bypassPermissions`와 동일. +> ⚠️ 인터넷 접근 없는 샌드박스 환경에서만 사용하세요. + +**`--allowed-tools <도구...>`** (별칭: `--allowedTools`) +Claude가 사용할 수 있는 도구의 쉼표 또는 공백 구분 목록. +```bash +claude --allowed-tools "Bash(git:*) Edit Read" +``` + +**`--disallowed-tools <도구...>`** +Claude가 사용할 수 없는 도구 목록. + +**`--tools <도구...>`** +세션에 사용 가능한 정확한 내장 도구 집합 지정. `""`는 모든 도구 비활성화. + +## 컨텍스트 및 프롬프트 플래그 + +**`--add-dir <디렉토리...>`** +도구 접근 컨텍스트에 하나 이상의 디렉토리 추가. +```bash +claude --add-dir /shared/libs --add-dir /shared/config +``` + +**`--system-prompt <프롬프트>`** +기본 시스템 프롬프트를 커스텀 프롬프트로 교체. + +**`--append-system-prompt <텍스트>`** +기본 시스템 프롬프트에 텍스트 추가. `--system-prompt`와 달리 내장 지시사항을 유지합니다. + +**`--mcp-config <설정...>`** +하나 이상의 JSON 설정 파일 또는 인라인 JSON 문자열에서 MCP 서버 로드. + +**`--strict-mcp-config`** +`--mcp-config`의 MCP 서버만 사용하고 다른 모든 MCP 설정 무시. + +**`--settings <파일-또는-json>`** +JSON 파일 경로 또는 인라인 JSON 문자열에서 추가 설정 로드. + +**`--agents `** +JSON 객체로 커스텀 에이전트를 인라인으로 정의. + +## 출력 제어 플래그 + +**`--max-turns `** +비대화형 모드의 에이전틱 턴 수 제한. `--print`와 함께만 작동합니다. + +**`--max-budget-usd <금액>`** +API 호출 최대 지출 금액 설정. `--print`와 함께만 작동합니다. + +**`--json-schema <스키마>`** +구조화된 출력 검증을 위한 JSON 스키마 제공. + +## Worktree 플래그 + +**`-w, --worktree [이름]`** +세션에 새 git worktree 생성. PR 번호나 GitHub PR URL 허용. +```bash +claude --worktree +claude --worktree feature-auth +claude --worktree "#142" +``` + +**`--tmux`** +worktree와 함께 tmux 세션 생성. `--worktree` 필요. + +## 디버그 플래그 + +**`-d, --debug [필터]`** +디버그 모드 활성화. +```bash +claude --debug +claude --debug "api,hooks" +claude --debug "!file,!1p" +``` + +**`--debug-file <경로>`** +디버그 로그를 인라인 표시 대신 파일에 저장. + +**`--bare`** +최소 모드. 훅, LSP, 플러그인 동기화, 어트리뷰션, 자동 메모리, 백그라운드 프리페치, 키체인 읽기, `CLAUDE.md` 자동 발견을 모두 건너뜁니다. 스타트업 지연이 중요하고 이러한 기능이 필요하지 않은 스크립트 파이프라인에 사용하세요. + +## 일반적인 플래그 조합 + +```bash +# JSON 출력과 함께 비대화형 +claude -p "모든 내보낸 타입 목록" --output-format json + +# CI에서 권한 우회 (샌드박스 환경 전용) +claude -p "전체 테스트 스위트 실행하고 실패 수정해줘" --dangerously-skip-permissions + +# 마지막 세션 재개 후 비대화형으로 계속 +claude --continue -p "이제 그것에 대한 테스트 작성해줘" + +# 커스텀 MCP 설정으로 엄격한 격리 +claude --mcp-config ./ci-mcp.json --strict-mcp-config -p "스키마 분석해줘" + +# 시스템 프롬프트를 교체하지 않고 추가 +claude --append-system-prompt "항상 JavaScript가 아닌 TypeScript를 출력하세요." +``` diff --git a/docs/claude-code-docs-main/18_슬래시커맨드.md b/docs/claude-code-docs-main/18_슬래시커맨드.md new file mode 100644 index 0000000..0e9a4c2 --- /dev/null +++ b/docs/claude-code-docs-main/18_슬래시커맨드.md @@ -0,0 +1,171 @@ +# 슬래시 커맨드 + +> 실행 중인 Claude Code 세션에서 입력하는 커맨드. + +``` +/command [인수] +``` + +세션 내에서 언제든 `/help`를 입력해 모든 커맨드를 볼 수 있습니다. + +## 빠른 참조 + +| 커맨드 | 설명 | +|--------|------| +| `/init` | 프로젝트의 `CLAUDE.md` 파일 및 선택적 스킬/훅 생성 | +| `/memory` | Claude 메모리 파일 편집 (전역, 프로젝트, 로컬) | +| `/config` | 설정 패널 열기 | +| `/hooks` | 도구 이벤트의 훅 설정 보기 | +| `/mcp` | MCP 서버 관리 — 활성화, 비활성화, 재연결 | +| `/permissions` | 도구의 허용/차단 규칙 관리 | +| `/plan` | plan 모드 활성화 또는 현재 세션 계획 열기/설명 | +| `/model` | 현재 세션의 AI 모델 설정 | +| `/commit` | AI가 생성한 메시지로 git 커밋 생성 | +| `/review` | 풀 리퀘스트 검토 | +| `/skills` | 사용 가능한 스킬 목록 | +| `/compact` | 컨텍스트 사용량 줄이기 위해 대화 기록 요약 | +| `/clear` | 대화 기록 지우기 및 컨텍스트 해제 | +| `/help` | 도움말 및 사용 가능한 커맨드 표시 | +| `/login` | 로그인 또는 Anthropic 계정 전환 | +| `/logout` | Anthropic 계정에서 로그아웃 | + +--- + +## 프로젝트 및 메모리 커맨드 + +### `/init` + +코드베이스를 분석하고 `CLAUDE.md` 파일과 선택적으로 스킬과 훅을 설정합니다. Claude가 주요 프로젝트 파일(매니페스트, CI 설정, 빌드 스크립트, README)을 조사한 후 인터뷰를 통해 빠진 내용을 채우고 출력 파일을 작성합니다. + +설정 내용(사용자 선택에 따라): +- **프로젝트 `CLAUDE.md`** — 팀 공유 지시사항, 소스 컨트롤에 커밋 +- **개인 `CLAUDE.local.md`** — 이 프로젝트의 개인 설정(gitignore됨) +- **스킬** — 슬래시 커맨드로 호출하는 온디맨드 워크플로우 +- **훅** — 도구 이벤트에서 자동으로 실행되는 결정론적 셸 커맨드 + +> 💡 언제든 `/init`을 다시 실행하세요. `CLAUDE.md`가 이미 있으면 Claude가 파일을 덮어쓰는 대신 구체적인 변경 사항을 제안합니다. + +### `/memory` + +Claude의 메모리 파일 대화형 에디터를 엽니다. 세 가지 메모리 범위: + +| 범위 | 파일 | 적용 대상 | +|------|------|----------| +| 전역 | `~/.claude/CLAUDE.md` | 모든 프로젝트의 나 | +| 프로젝트 | 프로젝트 루트의 `CLAUDE.md` | 팀 전체 | +| 로컬 | 프로젝트 루트의 `CLAUDE.local.md` | 이 프로젝트의 나 (gitignore됨) | + +--- + +## 설정 커맨드 + +### `/config` (별칭: `/settings`) +Claude Code 설정을 보고 편집하는 설정 패널 열기. + +### `/hooks` +현재 세션에서 활성화된 훅 설정 표시. 훅을 만들거나 편집하려면 `/init`을 사용하거나 `.claude/settings.json`을 직접 편집하세요. + +### `/mcp [enable|disable [server-name]]` + +현재 세션의 MCP 서버 관리: + +| 인수 | 효과 | +|------|------| +| (없음) | MCP 관리 패널 열기 | +| `enable` | 모든 비활성 MCP 서버 활성화 | +| `enable ` | 특정 서버 활성화 | +| `disable` | 모든 활성 MCP 서버 비활성화 | +| `disable ` | 특정 서버 비활성화 | +| `reconnect ` | 특정 서버에 재연결 | + +> 📝 `/mcp enable/disable`로 만든 변경 사항은 현재 세션에만 적용됩니다. + +### `/permissions` (별칭: `/allowed-tools`) +도구의 허용 및 차단 규칙을 보고 관리하는 권한 패널 열기. + +### `/model [모델]` +세션의 AI 모델 설정: +``` +/model +/model sonnet +/model claude-opus-4-5 +``` + +--- + +## 세션 관리 커맨드 + +### `/plan [open|<설명>]` +| 인수 | 효과 | +|------|------| +| (없음) | plan 모드 토글 | +| `open` | 현재 계획 열기 및 표시 | +| `<설명>` | 주어진 설명으로 새 계획 생성 | + +plan 모드에서 Claude는 어떤 작업도 실행하기 전에 작성된 계획을 만들고 승인을 기다립니다. + +### `/compact [지시사항]` +대화 기록을 요약하고 컨텍스트 윈도우가 가득 차도 작업을 계속할 수 있게 합니다. 선택적 인수로 요약 방법을 지시할 수 있습니다. +``` +/compact +/compact 데이터베이스 스키마 변경에만 집중해줘 +/compact 완료된 최근 세 작업만 요약해줘 +``` + +### `/clear` (별칭: `/reset`, `/new`) +전체 대화 기록을 지우고 컨텍스트를 해제해 동일한 작업 디렉토리에서 새 세션을 시작합니다. `/compact`와 달리 요약하는 대신 모든 기록을 제거합니다. + +### `/skills` +현재 세션에서 사용 가능한 모든 스킬을 나열합니다. + +--- + +## Git 커맨드 + +### `/commit` +AI가 생성한 커밋 메시지로 git 커밋을 만듭니다. Claude가 현재 git 상태와 diff를 읽고, 스테이징된 변경 사항을 분석하고, "무엇"이 아닌 "왜"에 초점을 맞춘 간결한 커밋 메시지를 작성합니다. + +안전 규칙: +- 기존 커밋을 절대 amend하지 않음 +- 훅을 건너뛰지 않음 (`--no-verify` 사용 안 함) +- 시크릿을 포함할 가능성이 있는 파일은 커밋하지 않음 +- 변경 사항이 없으면 빈 커밋을 만들지 않음 + +> 📝 `/commit`은 `git add`, `git status`, `git commit`에만 접근 가능합니다. push, rebase 등의 다른 git 작업은 실행할 수 없습니다. + +### `/review [PR-번호]` +GitHub CLI(`gh`)를 사용해 풀 리퀘스트에 AI 코드 리뷰를 실행합니다. PR 번호 없이 사용하면 열린 PR 목록을 표시합니다. 리뷰 내용: +- PR이 하는 일 개요 +- 코드 품질 및 스타일 분석 +- 구체적인 개선 제안 +- 잠재적 문제 또는 리스크 +- 성능, 테스트 커버리지, 보안 고려사항 + +> 📝 `/review`는 [GitHub CLI](https://cli.github.com/)(`gh`)가 설치되고 인증되어야 합니다. + +--- + +## 계정 및 도움말 커맨드 + +### `/help` +현재 세션에서 사용 가능한 모든 슬래시 커맨드 목록 표시 — 내장 커맨드, 스킬 커맨드, 설치된 플러그인이 추가한 커맨드 포함. + +### `/login` +Anthropic 계정에 로그인하거나 계정을 전환합니다. + +### `/logout` +Anthropic 계정에서 로그아웃합니다. 로그아웃 후 다음 세션에서 다시 인증을 요청합니다. + +--- + +## 커스텀 스킬 커맨드 + +`.claude/skills//SKILL.md`에 스킬이 생성되면 해당 스킬이 로드된 모든 세션에서 `/`으로 사용할 수 있습니다. + +``` +/verify +/deploy staging +/fix-issue 123 +``` + +`/skills`를 실행해 로드된 모든 스킬과 설명을 확인하세요. diff --git a/docs/claude-code-docs-main/19_훅레퍼런스.md b/docs/claude-code-docs-main/19_훅레퍼런스.md new file mode 100644 index 0000000..0a6b421 --- /dev/null +++ b/docs/claude-code-docs-main/19_훅레퍼런스.md @@ -0,0 +1,249 @@ +# 훅 레퍼런스 + +> 모든 훅 이벤트, 입력 페이로드, 출력 스키마, 각 종료 코드가 Claude 동작에 미치는 영향에 대한 전체 레퍼런스. + +훅은 Claude의 에이전틱 루프에서 정의된 지점에서 발생하는 셸 커맨드, HTTP 엔드포인트, LLM 프롬프트, 또는 인프로세스 콜백입니다. + +## 설정 + +훅은 설정 파일의 최상위 `hooks` 키로 구성됩니다: + +```json +{ + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "echo 'bash 커맨드 실행 예정' >&2" + } + ] + } + ] + } +} +``` + +## 매처 설정 + +`matcher` 필드는 이벤트별로 다른 필드와 매칭됩니다: + +| 이벤트 | 매칭되는 필드 | +|--------|-------------| +| `PreToolUse` / `PostToolUse` / `PostToolUseFailure` / `PermissionRequest` / `PermissionDenied` | `tool_name` | +| `Notification` | `notification_type` | +| `SessionStart` | `source` (`startup`, `resume`, `clear`, `compact`) | +| `Setup` | `trigger` (`init`, `maintenance`) | +| `SubagentStart` / `SubagentStop` | `agent_type` | +| `PreCompact` / `PostCompact` | `trigger` (`manual`, `auto`) | +| `ConfigChange` | `source` | +| `FileChanged` | 파일 이름 패턴 (예: `".envrc|.env"`) | + +## 훅 타입 + +**셸 커맨드:** +```json +{ + "type": "command", + "command": "jq '.tool_name' && my-validator", + "timeout": 30, + "shell": "bash", + "async": false, + "once": false, + "if": "Bash(git *)", + "statusMessage": "검증 중..." +} +``` + +필드: +- `command`: 실행할 셸 커맨드 (필수) +- `timeout`: 타임아웃(초), 기본 60초 +- `shell`: `bash` (기본) 또는 `powershell` +- `async`: `true`면 백그라운드에서 비블로킹 실행 +- `asyncRewake`: `true`면 백그라운드 실행, 종료코드 2로 종료 시 모델 깨움 +- `once`: `true`면 한 번 실행 후 자동 제거 +- `if`: 조건부로 훅 건너뛰기 위한 권한 규칙 구문 +- `statusMessage`: 실행 중 스피너에 표시되는 커스텀 메시지 + +**LLM 평가:** +```json +{ + "type": "prompt", + "prompt": "이 bash 커맨드가 안전한지 확인하세요: $ARGUMENTS", + "model": "claude-haiku-4-5", + "timeout": 30 +} +``` + +**에이전틱 검증기:** +```json +{ + "type": "agent", + "prompt": "단위 테스트가 실행되고 통과했는지 확인하세요.", + "model": "claude-haiku-4-5", + "timeout": 120 +} +``` + +**HTTP 엔드포인트:** +```json +{ + "type": "http", + "url": "https://my-server.example.com/hook", + "headers": { + "Authorization": "Bearer $MY_TOKEN" + }, + "allowedEnvVars": ["MY_TOKEN"], + "timeout": 10 +} +``` + +## 기본 훅 입력 + +모든 훅이 stdin에서 받는 공통 필드: + +| 필드 | 타입 | 설명 | +|------|------|------| +| `hook_event_name` | `string` | 발생한 이벤트 (예: `"PreToolUse"`) | +| `session_id` | `string` | 현재 세션 식별자 | +| `transcript_path` | `string` | 세션 JSONL 트랜스크립트 파일의 절대 경로 | +| `cwd` | `string` | 훅 발생 시점의 현재 작업 디렉토리 | +| `permission_mode` | `string` | 활성 권한 모드 | +| `agent_id` | `string` | 서브에이전트에서 발생 시 식별자 | + +## 동기 훅 출력 (stdout의 JSON) + +블로킹 훅의 경우 종료 전에 JSON을 stdout에 씁니다: + +```json +{ + "continue": true, + "suppressOutput": false, + "decision": "approve", + "reason": "커맨드가 안전합니다", + "systemMessage": "훅이 이 작업을 승인했습니다.", + "hookSpecificOutput": { + "hookEventName": "PreToolUse", + "permissionDecision": "allow" + } +} +``` + +## 훅 이벤트 상세 + +### `PreToolUse` +도구가 실행되기 직전에 발생. + +**입력 필드:** `tool_name`, `tool_input`, `tool_use_id` + +**종료 코드:** +| 코드 | 효과 | +|------|------| +| `0` | stdout/stderr 표시 안 됨. 훅 출력 JSON 적용 | +| `2` | stderr를 Claude에게 표시; 도구 호출 **차단** | +| 기타 | stderr를 사용자에게만 표시; 도구 호출 계속 | + +**`hookSpecificOutput` 필드:** +- `permissionDecision`: `'allow'` | `'deny'` | `'ask'` — 권한 결정 재정의 +- `updatedInput`: 도구가 받을 교체 입력 +- `additionalContext`: 이 턴의 Claude 컨텍스트에 주입될 텍스트 + +--- + +### `PostToolUse` +도구가 성공적으로 완료된 후 발생. + +**입력 필드:** `tool_name`, `tool_input`, `tool_response`, `tool_use_id` + +**종료 코드:** +| 코드 | 효과 | +|------|------| +| `0` | stdout이 트랜스크립트 모드에 표시 (Ctrl+O) | +| `2` | stderr를 즉시 Claude에게 시스템 메시지로 표시 | +| 기타 | stderr를 사용자에게만 표시 | + +--- + +### `Stop` +Claude가 응답을 종료하기 직전에 발생. + +**입력 필드:** `stop_hook_active`, `last_assistant_message` + +**종료 코드:** +| 코드 | 효과 | +|------|------| +| `0` | stdout/stderr 표시 안 됨 | +| `2` | stderr를 시스템 메시지로 주입; Claude **대화 계속** | +| 기타 | stderr를 사용자에게만 표시; Claude 중지 | + +> 💡 Stop 훅의 종료코드 2를 사용해 Claude 출력을 확인하고 조건이 충족되지 않으면 대화를 계속하게 합니다 — 예를 들어 테스트가 여전히 실패하는 경우. + +--- + +### `SessionStart` +세션 시작 시 발생. 초기 컨텍스트 주입이나 환경 설정에 사용. + +**입력 필드:** `source` (`'startup'` | `'resume'` | `'clear'` | `'compact'`), `model` + +**`hookSpecificOutput` 필드:** +- `additionalContext`: 세션 시스템 프롬프트에 주입될 컨텍스트 +- `initialUserMessage`: 세션의 첫 사용자 메시지로 자동 제출 +- `watchPaths`: `FileChanged` 감시기에 등록할 절대 파일 경로 + +--- + +### `UserPromptSubmit` +사용자가 프롬프트를 제출할 때 발생. + +**입력 필드:** `prompt` + +**종료 코드:** +| 코드 | 효과 | +|------|------| +| `0` | stdout이 Claude에게 추가 컨텍스트로 표시 | +| `2` | 처리 **차단**; 원본 프롬프트 지워짐; stderr를 사용자에게 표시 | +| 기타 | stderr를 사용자에게만 표시 | + +--- + +### `PermissionRequest` +권한 다이얼로그가 표시될 때 발생. UI 없이 프로그래밍 방식으로 승인/거부 가능. + +**종료 코드:** +| 코드 | 효과 | +|------|------| +| `0` | `hookSpecificOutput.decision`이 설정된 경우 훅 결정 적용 | +| 기타 | stderr를 사용자에게 표시; 일반 다이얼로그로 폴백 | + +--- + +### `CwdChanged` +작업 디렉토리 변경 후 발생. + +**입력 필드:** `old_cwd`, `new_cwd` + +`CLAUDE_ENV_FILE` 환경 변수가 설정됨 — 환경 변수를 `export KEY=value` 줄로 써서 이후 Bash 도구 호출에 적용합니다. + +--- + +### `FileChanged` +감시 중인 파일이 수정, 추가, 제거될 때 발생. + +**입력 필드:** `file_path`, `event` (`'change'` | `'add'` | `'unlink'`) + +--- + +## 비동기 훅 + +백그라운드에서 실행되는 훅은 일반 동기 출력 대신 비동기 확인을 stdout에 출력합니다: + +```json +{ + "async": true, + "asyncTimeout": 30 +} +``` + +> ⚠️ 비동기 훅은 도구 실행을 차단하거나 컨텍스트를 주입할 수 없습니다. 에이전틱 루프를 느리게 하면 안 되는 알림, 로깅, 메트릭 같은 부작용에 사용하세요. diff --git a/docs/claude-code-docs-main/20_SDK개요.md b/docs/claude-code-docs-main/20_SDK개요.md new file mode 100644 index 0000000..a9af053 --- /dev/null +++ b/docs/claude-code-docs-main/20_SDK개요.md @@ -0,0 +1,229 @@ +# SDK 개요 + +> stdin/stdout 제어 프로토콜을 사용해 자체 도구에 Claude Code를 임베드하는 방법. SDK 세션 API, 메시지 타입, 출력 형식에 대한 레퍼런스. + +Claude Code SDK는 다른 애플리케이션에 Claude Code를 임베드하기 위한 제어 프로토콜입니다 — IDE, 자동화 스크립트, CI/CD 파이프라인, 또는 서브프로세스를 스폰하고 stdin/stdout으로 통신할 수 있는 모든 호스트. + +라이브러리 API를 직접 노출하는 대신, 구조화된 JSON 메시지 스트림을 통해 실행 중인 `claude` 프로세스와 통신합니다. 호스트 프로세스가 사용자 메시지와 제어 요청을 전송하면 CLI 프로세스가 어시스턴트 메시지, 도구 진행 이벤트, 결과 페이로드를 스트리밍합니다. + +## 작동 방식 + +1. **Claude Code 프로세스 스폰** — `--output-format stream-json`과 `--print`로 시작 (비대화형 모드). stdin과 stdout을 호스트 프로세스로 파이핑. + +```bash +claude --output-format stream-json --print --verbose +``` + +여러 프롬프트를 받는 영속 세션은 `--print`를 생략하고 세션 초기화 후 stdin에 `SDKUserMessage` 객체를 전송합니다. + +2. **초기화 요청 전송** — stdin에 `control_request` (`subtype: "initialize"`) 작성. CLI가 `SDKControlInitializeResponse`로 응답합니다. + +3. **stdout에서 메시지 스트리밍** — stdout에서 줄바꿈으로 구분된 JSON 읽기. 각 줄이 `SDKMessage` 유니온 타입 중 하나입니다. + +4. **사용자 메시지 전송** — 대화를 계속하려면 stdin에 `SDKUserMessage` 객체 작성. + +## 출력 형식 + +| 형식 | 설명 | +|------|------| +| `text` | 일반 텍스트 응답만. 대화형 모드의 기본값 | +| `json` | 완료 시 작성되는 단일 JSON 객체. 일회성 스크립트에 적합 | +| `stream-json` | 줄바꿈으로 구분된 JSON 스트림. 이벤트 발생 시 줄당 하나의 메시지. SDK 사용에 필수 | + +## 제어 프로토콜 메시지 + +제어 프로토콜은 stdin/stdout에서 양방향으로 흐르는 두 가지 최상위 봉투 타입을 사용합니다. + +### `SDKControlRequest` (호스트 → CLI) + +```json +{ + "type": "control_request", + "request_id": "<고유-문자열>", + "request": { "subtype": "...", ...페이로드 } +} +``` + +### `SDKControlResponse` (CLI → 호스트) + +```json +{ + "type": "control_response", + "response": { + "subtype": "success", + "request_id": "<에코된-id>", + "response": { ...페이로드 } + } +} +``` + +오류 시 `subtype`은 `"error"`이고 `error` 필드에 메시지가 포함됩니다. + +## 초기화 요청 + +`initialize` 요청은 반드시 먼저 보내야 합니다. 세션을 설정하고 사용 가능한 기능을 반환합니다. + +```json +{ + "type": "control_request", + "request_id": "init-1", + "request": { + "subtype": "initialize", + "systemPrompt": "당신은 CI 자동화 에이전트입니다.", + "appendSystemPrompt": "항상 테스트 커버리지를 추가하세요.", + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hookCallbackIds": ["my-hook-id"] + } + ] + }, + "agents": { + "CodeReviewer": { + "description": "코드 품질과 보안을 검토합니다.", + "prompt": "당신은 전문 코드 리뷰어입니다...", + "model": "opus" + } + } + } +} +``` + +### 초기화 응답 + +```json +{ + "type": "control_response", + "response": { + "subtype": "success", + "request_id": "init-1", + "response": { + "commands": [...], + "agents": [...], + "output_style": "stream-json", + "models": [...], + "account": { + "email": "user@example.com", + "organization": "Acme Corp", + "apiProvider": "firstParty" + } + } + } +} +``` + +## 사용자 메시지 + +```json +{ + "type": "user", + "message": { + "role": "user", + "content": "이 함수를 async/await으로 리팩터링해줘." + }, + "parent_tool_use_id": null +} +``` + +- `parent_tool_use_id`: 이 메시지가 응답하는 도구 사용 ID, 최상위 사용자 메시지는 `null` +- `priority`: `'now'` | `'next'` | `'later'` — 비동기 메시지 큐잉 스케줄링 힌트 + +## SDK 메시지 스트림 타입 + +| 타입 | 설명 | +|------|------| +| `system` (`subtype: "init"`) | 세션 시작 시 한 번 출력. 활성 모델, 도구 목록, MCP 서버 상태, 권한 모드, 세션 ID 포함 | +| `assistant` | 모델이 턴을 생성할 때 출력. `tool_use` 블록 포함 가능 | +| `stream_event` | 스트리밍 중 부분 토큰 출력. 점진적 렌더링에 사용 | +| `tool_progress` | 몇 초 이상 걸리는 도구의 주기적 상태 업데이트 | +| `result` | 각 턴 종료 시 출력. `subtype`은 `"success"` 또는 오류 서브타입 | + +**result 예시:** +```json +{ + "type": "result", + "subtype": "success", + "result": "함수가 리팩터링되었습니다.", + "duration_ms": 4200, + "total_cost_usd": 0.0042, + "num_turns": 3, + "is_error": false, + "session_id": "abc123" +} +``` + +## 기타 제어 요청 + +| `subtype` | 방향 | 설명 | +|-----------|------|------| +| `interrupt` | 호스트 → CLI | 현재 턴 중단 | +| `set_permission_mode` | 호스트 → CLI | 활성 권한 모드 변경 | +| `set_model` | 호스트 → CLI | 세션 중간에 모델 전환 | +| `can_use_tool` | CLI → 호스트 | 도구 호출 권한 요청 | +| `mcp_status` | 호스트 → CLI | MCP 서버 연결 상태 가져오기 | +| `get_context_usage` | 호스트 → CLI | 컨텍스트 윈도우 사용량 가져오기 | +| `rewind_files` | 호스트 → CLI | 특정 메시지 이후 파일 변경 사항 되돌리기 | +| `hook_callback` | CLI → 호스트 | SDK에 등록된 훅 이벤트 전달 | + +## 세션 관리 API + +스크립팅 시나리오를 위해 SDK가 `~/.claude/`에 저장된 세션 트랜스크립트를 조작하는 함수를 내보냅니다: + +```typescript +import { + query, + listSessions, + getSessionInfo, + getSessionMessages, + forkSession, + renameSession, + tagSession, +} from '@anthropic-ai/claude-code' +``` + +**`query` — 프롬프트 실행 (주요 SDK 진입점):** +```typescript +for await (const message of query({ + prompt: '이 디렉토리에 어떤 파일이 있나요?', + options: { cwd: '/my/project' } +})) { + if (message.type === 'result') { + console.log(message.result) + } +} +``` + +**`listSessions` — 저장된 세션 목록:** +```typescript +const sessions = await listSessions({ dir: '/my/project', limit: 50 }) +``` + +**`getSessionMessages` — 트랜스크립트 읽기:** +```typescript +const messages = await getSessionMessages(sessionId, { + dir: '/my/project', + includeSystemMessages: false, +}) +``` + +**`forkSession` — 대화 분기:** +```typescript +const { sessionId: newId } = await forkSession(originalSessionId, { + upToMessageId: 'msg-uuid', + title: '실험적 분기', +}) +``` + +## 사용 사례 + +**IDE 통합:** IDE가 영속 Claude Code 프로세스를 스폰하고 제어 프로토콜을 통해 메시지를 라우팅합니다. `PreToolUse` 훅 콜백으로 파일 편집을 가로채 적용 전에 IDE 네이티브 UI에 diff를 표시합니다. + +**CI/CD 자동화:** +```bash +result=$(echo "diff를 검토하고 pass/fail을 출력해줘" | \ + claude --output-format json --print \ + --permission-mode bypassPermissions) +``` + +**헤드리스 에이전트:** TypeScript SDK에서 스트리밍 출력 형식으로 `query()`를 사용합니다. 지속 데몬 프로세스를 유지하면서 크론 스케줄로 작업을 실행합니다. diff --git a/docs/claude-code-docs-main/README.md b/docs/claude-code-docs-main/README.md new file mode 100644 index 0000000..e361547 --- /dev/null +++ b/docs/claude-code-docs-main/README.md @@ -0,0 +1,54 @@ +# Claude Code Docs (KO/EN) + +> 2026년 3월, Claude Code의 npm 소스맵을 통해 내부 TypeScript 소스코드가 유출되는 사건이 발생했습니다. +> 이 레포는 그 과정에서 공개된 내부 구조 분석 문서를 한국어로 번역·정리한 아카이브입니다. + +--- + +## 배경 + +2026년 3월 31일, Claude Code npm 패키지에 포함된 `.map` 파일이 Anthropic의 내부 R2 버킷에 있는 unobfuscated TypeScript 소스 zip을 가리키고 있음이 발견되었습니다. 이를 통해 약 1,900개 파일, 512,000줄 규모의 Claude Code 원본 소스가 외부에 노출되었습니다. + +유출된 소스를 분석한 커뮤니티([@VineeTagarwaL](https://github.com/VineeTagarwaL-code))는 내부 아키텍처를 문서화하여 Mintlify 사이트로 공개했습니다. 이 레포는 해당 문서를 한국어로 번역한 것입니다. + +--- + +## 주요 발견 사항 + +유출 소스 분석을 통해 드러난 Claude Code의 실제 아키텍처: + +- **런타임**: Bun + React/Ink (터미널 UI 렌더링) +- **에이전틱 루프**: `query.ts`가 구동하는 연속 루프 — 도구 호출 → 권한 확인 → 결과 수집 → 반복 +- **컨텍스트 조립**: `context.ts`의 `getSystemContext()` / `getUserContext()`가 git 상태, CLAUDE.md, 현재 날짜를 조립 +- **도구 시스템**: ~40개 내장 도구 (`BashTool`, `FileEditTool`, `AgentTool` 등) +- **멀티에이전트**: `coordinator/`에서 팀 레벨 병렬 오케스트레이션 +- **스킬 시스템**: `.claude/skills/`의 마크다운 파일 기반 온디맨드 기능 +- **피처 플래그**: Bun 빌드타임 dead code elimination (`PROACTIVE`, `KAIROS`, `BRIDGE_MODE`, `DAEMON` 등) + +--- + +## 구조 + +``` +/ (root) — 한국어 번역본 (21개) +en/ — 영어 원본 (26개) + concepts/ + configuration/ + guides/ + reference/ + commands/ + sdk/ + tools/ +``` + +--- + +## 출처 + +- 원본 문서: https://vineetagarwal-code-claude-code.mintlify.app +- 관련 레포: https://github.com/instructkr/claw-code +- 최초 발견: [@Fried_rice (Chaofan Shou)](https://x.com/shouc001) — npm 소스맵 경유 R2 버킷 접근 + +--- + +> ℹ️ 이 레포는 공개된 분석 문서의 번역 아카이브입니다. Anthropic의 독점 소스코드를 포함하지 않습니다. diff --git a/docs/claude-code-docs-main/en/concepts/how-it-works.md b/docs/claude-code-docs-main/en/concepts/how-it-works.md new file mode 100644 index 0000000..d1373a9 --- /dev/null +++ b/docs/claude-code-docs-main/en/concepts/how-it-works.md @@ -0,0 +1,126 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# How Claude Code works + +> The agentic loop, context loading, tool execution model, and conversation lifecycle under the hood. + +Claude Code is a terminal-based coding agent that runs a continuous agentic loop: it reads your request, reasons about what to do, calls tools, observes results, and repeats until the task is complete or it needs your input. + +## The agentic loop + +Every interaction follows the same fundamental cycle: + + + + You type a message in the terminal (interactive mode) or pass one via `--print` / stdin (non-interactive / headless mode). The message is appended to the conversation history. + + + + Before calling the model, Claude Code assembles a system prompt that includes: the current date, git status (branch, recent commits, working-tree status), any loaded CLAUDE.md memory files, and the list of available tools. This context is built once per conversation and memoized — see [`context.ts`](/concepts/memory-context). + + + + The assembled conversation is sent to the Anthropic API. The model reasons about the task and emits one or more `tool_use` blocks — each specifying a tool name and structured JSON input. + + + + Before executing each tool call, Claude Code evaluates the current permission mode and any allow/deny rules. Depending on the mode, it either auto-approves, prompts you for confirmation, or blocks the call entirely. See [Permissions](/concepts/permissions). + + + + Approved tool calls run. Results — file contents, command output, search hits — are appended to the conversation as `tool_result` blocks. + + + + The model receives the tool results and either calls more tools or produces a final text response. The loop repeats until no tool calls remain in a model turn. + + + + + The loop runs entirely in your terminal process. There is no remote execution server — your files, shell, and credentials never leave your machine unless a tool explicitly sends them (e.g., `WebFetch`, `WebSearch`, or an MCP server). + + +## Context loading + +At the start of each conversation, Claude Code builds two context blocks that are prepended to every API call: + + + + Assembled by `getSystemContext()` in `context.ts`. Contains: + + * **Git status** — current branch, default/main branch, git username, `git status --short` output (truncated to 2 000 characters if larger), and the last 5 commits from `git log --oneline`. + * **Cache-breaking injection** — an optional ephemeral string used internally to bust the server-side prompt cache during debugging. + + Git status is skipped when `CLAUDE_CODE_REMOTE=1` is set (remote/cloud mode) or when git instructions are disabled in settings. + + + + Assembled by `getUserContext()` in `context.ts`. Contains: + + * **CLAUDE.md memory** — all memory files discovered by the 4-level hierarchy (managed → user → project → local). Disabled by `CLAUDE_CODE_DISABLE_CLAUDE_MDS=1` or in bare mode without explicit `--add-dir`. See [Memory & context](/concepts/memory-context). + * **Current date** — injected as `Today's date is YYYY-MM-DD` so the model always knows the date. + + + +Both context blocks are **memoized** for the duration of the conversation using `lodash/memoize`. Calling `setSystemPromptInjection()` clears the caches immediately. + +## Tool execution model + +Claude Code does not execute tool calls autonomously by default. Each tool has a `checkPermissions` method, and the result determines what happens next: + +| Permission result | What happens | +| ----------------- | ------------------------------------------------------ | +| `allow` | Tool runs immediately, result appended to conversation | +| `ask` | Claude Code pauses and renders a confirmation dialog | +| `deny` | Tool call is rejected; Claude receives an error result | + +The permission behavior is controlled by the active [permission mode](/concepts/permissions) and any configured allow/deny rules. In `bypassPermissions` mode all checks are skipped. In `acceptEdits` mode file-edit tools are auto-approved but bash commands still prompt. + +Tool calls that are safe and read-only (e.g., `Read`, `Glob`, `Grep`) are generally auto-approved across all modes. + +## Interactive vs. non-interactive (task) mode + + + + The default experience. Claude Code renders a live terminal UI using React/Ink. You see streaming output, tool-use confirmations, and spinner animations as the agent works. Messages persist across the session until you exit. + + + + Activated with `--print` or by piping stdin. No UI is rendered. Output is written to stdout so it can be captured by scripts or CI pipelines. Useful for one-shot automation tasks. + + + +### Sub-agents (Task tool) + +Claude can spawn sub-agents via the `Task` tool (`AgentTool`). Each sub-agent runs its own nested agentic loop with an isolated conversation and, optionally, a restricted tool set. Sub-agents can run locally (in-process) or on remote compute. Results are returned to the parent agent when the sub-agent completes. See [Tools](/concepts/tools) for details. + +## Conversation storage and resumption + +Conversations are stored as JSON transcript files on disk (in `~/.claude/` by default). Each conversation has a unique session ID. You can resume a previous conversation with `--resume ` or pick from the list with `--resume` alone. + +When a conversation is resumed: + +* The full message history is loaded from disk. +* Memory files are re-discovered and may differ from when the conversation was first started. +* The permission mode resets to the configured default unless it was persisted in the session. + + + Long conversations are periodically **compacted** — the oldest messages are summarised to keep the context window manageable. The full raw transcript is always preserved on disk; compaction only affects what is sent to the API. + + +## The query engine + +Under the hood, each "turn" in the agentic loop is driven by a **query** — a call to `query.ts` that sends the current message list to the Anthropic API and streams back the response. The query engine handles: + +* Streaming token output to the terminal in real time. +* Dispatching `tool_use` blocks to the appropriate tool handlers. +* Enforcing per-turn token and tool-call budgets. +* Collecting tool results and appending them before the next model call. +* Triggering compaction when the context window fills up. + +Each tool has a `maxResultSizeChars` property. When a result exceeds this limit the content is saved to a temporary file and the model receives a preview with the file path, preventing context-window overflow from large outputs. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/concepts/memory-context.md b/docs/claude-code-docs-main/en/concepts/memory-context.md new file mode 100644 index 0000000..c03fb15 --- /dev/null +++ b/docs/claude-code-docs-main/en/concepts/memory-context.md @@ -0,0 +1,206 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Memory and context (CLAUDE.md) + +> How Claude Code discovers, loads, and prioritises CLAUDE.md memory files to give Claude persistent, project-aware instructions. + +Claude Code supports a layered memory system based on plain Markdown files. By writing instructions into `CLAUDE.md` files at different levels of your filesystem, you can customise Claude's behaviour globally, per-project, or per-user — and keep some instructions private while committing others to source control. + +## The 4-level memory hierarchy + +Memory files are loaded in the following order (from lowest to highest priority). Files loaded **later** take precedence because the model pays more attention to instructions that appear later in the context window. + + + + **Path:** `/etc/claude-code/CLAUDE.md` (or the platform equivalent configured by your organisation) + + System-wide instructions set by an administrator or deployment tool. Applies to all users on the machine. Also supports a `rules/` subdirectory at `managed claude rules dir`. Cannot be overridden by user or project files when enforced via policy settings. + + + + **Path:** `~/.claude/CLAUDE.md` and `~/.claude/rules/*.md` + + Your private global instructions that apply to every project. A good place for personal preferences like preferred code style, default language, or your git username. This file is never committed to any repository. + + + + **Paths (checked in each ancestor directory, from root down to CWD):** + + * `CLAUDE.md` + * `.claude/CLAUDE.md` + * `.claude/rules/*.md` + + Instructions checked into the codebase and shared with the whole team. Ideal for project conventions, architecture notes, testing commands, and anything that every contributor should follow. Committed to source control. + + + + **Path:** `CLAUDE.local.md` (checked in each ancestor directory) + + Private project-specific overrides. This file should be added to `.gitignore`. Use it for personal workflow preferences that apply only to this project — local environment paths, personal shortcuts, or instructions you don't want to share. + + + + + Files closer to the current working directory are loaded **later** and therefore have **higher priority**. A `CLAUDE.md` in your project root outweighs one in a parent directory. + + +## File discovery algorithm + +When Claude Code starts, it walks the filesystem from the current working directory **up to the filesystem root**, collecting memory files at each level. The walk is performed by `getMemoryFiles()` in `utils/claudemd.ts`. + +The discovery order ensures lower-priority files appear first in the assembled context: + +1. Managed files are loaded first. +2. User files are loaded next. +3. Project and local files are loaded by iterating the path from the **root downward to CWD** — so ancestor directories come before child directories. + + + The full list of discovered files is memoised for the duration of the conversation. Use `/memory` to open the memory editor and force a reload, or restart the session to pick up changes made outside Claude Code. + + +## The `@include` directive + +Memory files can reference other files using `@` notation. The referenced file is inserted into the context as a separate entry before the including file. + +```markdown theme={null} +# My project CLAUDE.md + +@./docs/architecture.md +@./docs/conventions/typescript.md + +Always run `bun test` before committing. +``` + +**Supported path forms:** + +| Syntax | Resolves to | +| ------------------ | ------------------------------------------------- | +| `@filename` | Relative path from the including file's directory | +| `@./relative/path` | Explicit relative path | +| `@~/home/path` | Path relative to the user's home directory | +| `@/absolute/path` | Absolute path | + +**Rules:** + +* `@include` paths inside fenced code blocks and inline code spans are **ignored** — only plain text nodes are processed. +* Circular references are detected and skipped. +* Non-existent files are silently ignored. +* Maximum include depth is **5 levels**. +* Only text-based file types are included (`.md`, `.ts`, `.py`, `.json`, etc.). Binary files such as images and PDFs are skipped. + + + By default, `@include` paths that point outside the current project directory require explicit approval. Claude Code will display a warning and ask for confirmation the first time an external include is detected. + + +## `.claude/rules/*.md` — granular rule files + +Instead of putting everything in one large `CLAUDE.md`, you can split instructions across multiple Markdown files inside `.claude/rules/`: + +``` +my-project/ +├── CLAUDE.md +└── .claude/ + └── rules/ + ├── testing.md + ├── typescript-style.md + └── git-workflow.md +``` + +All `.md` files in `.claude/rules/` (and subdirectories) are loaded automatically for the project and user memory levels. Rules files also support **path-scoped frontmatter**: + +```markdown theme={null} +--- +paths: + - "src/api/**" + - "src/services/**" +--- + +Always use dependency injection. Never import concrete implementations directly. +``` + +When `paths` is set, the rule file is only injected into context when Claude is working on a file that matches one of the glob patterns. This keeps context lean for large projects. + +## Maximum file size + +The recommended maximum for any single memory file is **40 000 characters** (`MAX_MEMORY_CHARACTER_COUNT`). Files that exceed this limit are flagged, and Claude may not read the full content. Keep memory files focused and concise. + +## How memory affects Claude's behaviour + +When memory files are loaded, they are assembled into a single context block prefixed with: + +> *"Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written."* + +This means instructions in CLAUDE.md files take precedence over Claude's built-in defaults. Use this to enforce project conventions, restrict certain operations, or inject domain knowledge. + +## When to use each level + + + + Organisation-wide policies, security guardrails, or deployment-specific configuration that every user on a machine must follow. Managed by system administrators, not individual developers. + + + + Personal preferences that apply across all projects: your preferred language for responses, commit message style, editor shortcuts, or personal aliases. This is private and never committed. + + + + Project conventions shared with your team: how to run tests, build commands, architecture decisions, naming conventions, PR checklist items, or links to internal documentation. Commit this file. + + + + Your personal overrides for a specific project: local environment paths, personal debugging notes, or workflow preferences that differ from the team defaults. Add this to `.gitignore`. + + + +## Example CLAUDE.md + +```markdown theme={null} +# My Project + +## Commands + +- Build: `bun run build` +- Test: `bun test` +- Lint: `bun run lint` +- Type check: `bun run typecheck` + +## Architecture + +This is a monorepo. Core logic lives in `packages/core`. The CLI entrypoint is `src/index.ts`. + +## Conventions + +- Use `zod/v4` for all schema validation. +- Never use `any` — prefer `unknown` with a type guard. +- All async functions must handle errors explicitly; never swallow exceptions. +- Tests go in `__tests__/` next to the source file they test. + +## Git + +- Branch names: `feat/-short-description` +- Always run `bun test && bun run typecheck` before committing. +- Do not include `console.log` statements in committed code. + +@./docs/api-conventions.md +``` + +## The `/memory` command + +Run `/memory` inside the Claude Code REPL to open the memory file editor. It shows you which memory files are currently loaded, lets you edit them directly, and reloads the context when you save. + + + You can ask Claude directly: *"Add a rule to CLAUDE.md that we always use 2-space indentation."* Claude will locate the appropriate memory file and write the instruction for you. + + +## Disabling memory loading + +| Method | Effect | +| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | +| `CLAUDE_CODE_DISABLE_CLAUDE_MDS=1` | Disables all memory file loading entirely | +| `--bare` flag | Skips auto-discovery of memory files from the CWD walk; only loads files from explicitly provided `--add-dir` directories | +| `claudeMdExcludes` setting | Glob patterns of memory file paths to skip (e.g., to exclude a noisy ancestor `CLAUDE.md`) | + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/concepts/permissions.md b/docs/claude-code-docs-main/en/concepts/permissions.md new file mode 100644 index 0000000..dbe1a99 --- /dev/null +++ b/docs/claude-code-docs-main/en/concepts/permissions.md @@ -0,0 +1,222 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Permissions + +> How Claude Code controls which operations Claude can perform automatically versus which require your explicit approval. + +Claude Code runs tools on your local machine — executing shell commands, editing files, fetching URLs. The permission system gives you precise control over which operations Claude performs automatically and which require your explicit approval. + +## What permissions control + +Permissions apply to three categories of operations: + + + + Reading, editing, and writing files on your local filesystem via the `Read`, `Edit`, and `Write` tools. + + + + Any shell command executed through the `Bash` tool, including installs, builds, git operations, and arbitrary scripts. + + + + Tools exposed by connected MCP servers, which may include database queries, API calls, or browser automation. + + + +## Permission modes + +The permission mode determines the default behaviour when no specific allow/deny rule matches a tool call. Set the mode once and it applies for the entire session. + + + + The standard mode. Claude Code evaluates each tool call and prompts you for confirmation on operations that could have side effects: running shell commands, editing files, making network requests. Read-only operations (file reads, searches) are auto-approved. + + This is the recommended mode for everyday use. + + + + File edit and write operations (`Edit`, `Write`) are automatically approved without prompting. Bash commands still require confirmation. + + Useful when you trust Claude to make file changes freely but still want to review shell commands. + + + + Claude can read files, search the codebase, and discuss changes, but cannot execute any write or bash operations. All mutating tool calls are blocked. + + Use this mode when you want Claude to analyse a problem and produce a plan before you authorise any changes. The model can exit plan mode and request permission to proceed via the `ExitPlanMode` tool. + + + + All permission checks are disabled. Every tool call is executed immediately without any confirmation prompts. + + + This mode is intended for automated, fully-scripted workflows where you have audited what Claude will do in advance. Never use `bypassPermissions` in an interactive session where Claude might take unexpected actions. + + + + + Similar to `bypassPermissions` but uses a slightly different internal path. Tool calls that would normally prompt are auto-approved. Intended for scripted/non-interactive scenarios. + + + + An experimental mode that uses a secondary AI classifier to evaluate each proposed tool call against the conversation transcript. The classifier decides whether the operation is within the scope of what was requested, and either auto-approves or escalates to a human prompt. + + This mode is only available when the `TRANSCRIPT_CLASSIFIER` feature flag is enabled. + + + +## Setting the permission mode + + + + Pass `--permission-mode` when starting Claude Code: + + ```bash theme={null} + claude --permission-mode acceptEdits + claude --permission-mode bypassPermissions + claude --permission-mode plan + ``` + + + + Change the mode mid-session without restarting: + + ``` + /permissions + ``` + + An interactive menu lets you select the new mode. The change takes effect for the remainder of the session. + + + + Set a persistent default in your user or project settings: + + ```json theme={null} + { + "defaultMode": "acceptEdits" + } + ``` + + Valid values: `"default"`, `"acceptEdits"`, `"bypassPermissions"`, `"plan"`, `"dontAsk"`. + + + +## Permission rules (allow/deny lists) + +Beyond the global mode, you can create fine-grained rules that always allow or always deny specific tool calls — regardless of the active mode. + +Rules have three components: + +| Field | Description | +| ------------- | -------------------------------------------------------------------------------------- | +| `toolName` | The name of the tool the rule applies to (e.g., `"Bash"`, `"Edit"`, `"mcp__myserver"`) | +| `ruleContent` | An optional pattern that must match the tool's input (e.g., a command prefix for Bash) | +| `behavior` | `"allow"`, `"deny"`, or `"ask"` | + +Rules are evaluated **before** the permission mode. If a matching rule exists, its behavior is applied immediately. + +### Rule sources and persistence + +Rules can originate from different sources and are stored accordingly: + +| Source | Where stored | Scope | +| ----------------- | ----------------------------- | --------------------------------- | +| `userSettings` | `~/.claude/settings.json` | All projects for the current user | +| `projectSettings` | `.claude/settings.json` | All users of this project | +| `localSettings` | `.claude/settings.local.json` | Current user, this project only | +| `session` | In-memory | Current session only | +| `cliArg` | CLI flags | Current invocation only | + +### Example: always allow specific git commands + +```json theme={null} +{ + "permissions": { + "allow": [ + "Bash(git status)", + "Bash(git diff *)", + "Bash(git log *)", + "Read(*)" + ], + "deny": [ + "Bash(rm -rf *)", + "Bash(sudo *)" + ] + } +} +``` + +## How bash permissions work + +Bash command permission checking deserves special attention because shell commands can be complex and ambiguous. + +### Pattern matching + +A `Bash` permission rule with a `ruleContent` string is matched against the command using wildcard pattern matching: + +* `git status` — exact match only +* `git *` — matches any `git` subcommand +* `npm run *` — matches any `npm run` script +* `*` — matches any bash command (use with extreme caution) + +### Compound commands + +When a bash command contains multiple sub-commands joined by `&&`, `||`, `;`, or pipes (`|`), each sub-command is checked independently. The overall permission is the most restrictive result: if any sub-command is denied, the entire compound command is blocked. + +### Operator restrictions + +Certain shell constructs are flagged for extra scrutiny regardless of rules: + +* Output redirections (`>`, `>>`) to paths outside the project directory +* Commands that change the current directory (`cd`) to outside the working tree +* `sed -i` edit-in-place commands (handled specially to track file modifications) + +### Safety checks + +Regardless of the active permission mode, certain operations are always blocked or escalated: + +* Commands targeting `.claude/` or `.git/` configuration directories +* Modifications to shell config files (`.bashrc`, `.zshrc`, etc.) +* Attempts to bypass path restrictions using cross-platform path tricks + + + In `auto` mode (feature-gated), safety checks marked `classifierApprovable: true` are sent to the transcript classifier rather than forcing a prompt. The classifier has visibility into the full conversation context and can decide whether the operation is appropriate. + + +## MCP tool permissions + +MCP tools follow the same rule system as built-in tools. You can allow or deny an entire MCP server or individual tools within a server: + +```json theme={null} +{ + "permissions": { + "deny": [ + "mcp__myserver" + ], + "allow": [ + "mcp__myserver__read_database" + ] + } +} +``` + +Using `mcp__servername` as the rule (without a specific tool name) blanket-denies all tools from that server — they are filtered out of the tool list before the model even sees them. + +## Safety recommendations + + + `bypassPermissions` and `dontAsk` modes remove all safeguards. Only use them in isolated environments (containers, CI sandboxes) where Claude's actions are constrained by the environment itself, not by permission prompts. + + +* **Start with `default` mode** for any interactive session. +* **Use `plan` mode** when exploring an unfamiliar codebase or designing a large change — review the plan before enabling writes. +* **Use `acceptEdits`** for coding sessions where you trust Claude to edit files freely but want to review shell commands. +* **Prefer granular allow rules** over broad mode escalation. Allowing `Bash(git *)` is safer than switching to `bypassPermissions`. +* **Scope deny rules tightly.** A blanket `Bash(*)` deny prevents Claude from running any shell command, including safe read-only operations. +* **Review project settings files** (`.claude/settings.json`) when cloning unfamiliar repositories — they may pre-configure permission rules. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/concepts/tools.md b/docs/claude-code-docs-main/en/concepts/tools.md new file mode 100644 index 0000000..8280803 --- /dev/null +++ b/docs/claude-code-docs-main/en/concepts/tools.md @@ -0,0 +1,208 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Tools + +> Reference for every built-in tool Claude Code can use, including file operations, shell execution, web access, and sub-agent spawning. + +Claude Code gives Claude a set of built-in tools it can call to interact with your machine. Each tool call is subject to the active [permission mode and rules](/concepts/permissions). Below is a reference for every tool available by default. + +## File tools + + + + **Read a file from the local filesystem.** + + Reads up to 2 000 lines by default. Supports an `offset` and `limit` for targeted reads of large files. Returns content in `cat -n` format with line numbers. + + Also supports reading images (PNG, JPG, etc.) as visual input, PDF files (up to 20 pages at a time), and Jupyter notebooks (`.ipynb`). + + Read-only. Always auto-approved in `default` mode. + + + + **Perform exact string replacements in a file.** + + Requires a prior `Read` call on the file in the same conversation. Replaces `old_string` with `new_string` — the match must be unique in the file. Use `replace_all: true` to rename across the entire file. + + Fails if `old_string` appears more than once (unless `replace_all` is set). This precision prevents unintended edits. + + + + **Create a new file or completely overwrite an existing one.** + + For existing files, a prior `Read` call is required in the same conversation. Prefer `Edit` for modifying existing files — `Write` sends the entire file content and is better suited for new files or full rewrites. + + + + **Find files by name pattern.** + + Fast pattern matching that works on any codebase size. Returns matching file paths sorted by modification time (most recently modified first). + + Supports patterns like `**/*.ts`, `src/**/*.test.js`, `**/CLAUDE.md`. For open-ended multi-step searches, use the `Task` tool instead. + + Read-only. Always auto-approved. + + + +## Shell tool + + + **Execute a shell command in a persistent shell session.** + + Runs the command in a shell that persists across tool calls within a conversation — environment variables and working-directory changes carry over between calls. Supports a `timeout` parameter (default and max values are configurable). + + Key behaviours: + + * **Compound commands** (`&&`, `||`, `;`, `|`) are parsed and each sub-command is permission-checked independently. + * **Background execution** — pass `run_in_background: true` to run a long-running command without blocking. You are notified when it completes. + * **Output limits** — stdout/stderr is truncated if it exceeds the per-tool result size budget; a preview and file path are returned instead. + * **Search commands** (`find`, `grep`, `rg`) — for content search, prefer the dedicated `Grep` tool, which has optimised permissions and access. + + Subject to permission prompts in `default` mode. Auto-approved in `acceptEdits` mode only for commands covered by an allow rule. + + +## Search tools + + + + **Search file contents using regular expressions.** + + Built on ripgrep. Supports full regex syntax (`log.*Error`, `function\s+\w+`), file-type filtering (`*.ts`, `**/*.py`), and three output modes: + + * `files_with_matches` (default) — returns only file paths + * `content` — returns matching lines with context + * `count` — returns match counts per file + + Multiline patterns are supported with `multiline: true`. + + Read-only. Always auto-approved. + + + + **List directory contents.** + + Returns files and subdirectories in a structured format. Useful for exploring project structure before reading or editing files. + + Read-only. Always auto-approved. + + In bare-minimum mode (`CLAUDE_CODE_SIMPLE=1`) only `Bash`, `Read`, and `Edit` are available — use `ls` via `Bash` instead. + + + +## Web tools + + + + **Fetch a URL and extract information from it.** + + Takes a URL and a prompt describing what to extract. Converts HTML to Markdown, then passes the content through a secondary model to produce a focused answer. + + Features: + + * HTTP URLs are automatically upgraded to HTTPS. + * Includes a 15-minute self-cleaning cache — repeated fetches of the same URL are fast. + * When a URL redirects to a different host, the tool returns the redirect URL for a follow-up request. + * For GitHub URLs, prefer the `gh` CLI via `Bash` (e.g., `gh pr view`, `gh api`). + + Read-only. Prompts for approval in `default` mode. + + + + **Search the web and return results.** + + Returns search results with titles, snippets, and URLs formatted as Markdown links. Useful for accessing information beyond the model's training cutoff. + + After answering, Claude automatically appends a `Sources:` section listing all referenced URLs. + + Domain filtering is supported to include or exclude specific sites. Currently only available in the US. + + Prompts for approval in `default` mode. + + + +## Agent and task tools + + + + **Spawn a sub-agent to complete a task.** + + Starts a nested agentic loop in a separate context. The sub-agent has its own conversation history, its own tool set (optionally restricted), and runs to completion before returning a result to the parent agent. + + Sub-agents can run: + + * **Locally** — in-process, sharing the parent's filesystem and shell + * **Remotely** — on separate compute when remote agent eligibility criteria are met + + Use `Task` for open-ended multi-step searches, parallel workstreams, or delegating distinct sub-problems to isolated agents. + + The parent agent receives the sub-agent's final output as a tool result. + + + + **Create and manage a structured task list.** + + Writes a list of todo items with statuses (`pending`, `in_progress`, `completed`) to a persistent panel in the terminal UI. Helps Claude track progress on complex multi-step tasks and shows you what it is working on. + + Use proactively for tasks with 3 or more distinct steps. Not necessary for simple single-step requests. + + Results are rendered in the todo panel, not the conversation transcript. + + + +## MCP tools + +MCP (Model Context Protocol) servers can expose additional tools to Claude Code. Connected tools appear in the tool list alongside built-in tools and follow the same permission system. + +MCP tools are named with a `mcp__` prefix: + +``` +mcp____ +``` + +For example, a tool named `query` on a server named `mydb` appears as `mcp__mydb__query`. + +Common MCP tool categories include: + +* Database query and management tools +* Browser and web automation tools +* Cloud provider APIs (AWS, GCP, Azure) +* Issue tracker integrations (GitHub, Linear, Jira) +* Internal company tools and APIs + + + MCP servers are configured in `~/.claude/mcp_servers.json` or `.claude/mcp_servers.json`. Tools from a connected server are automatically included in Claude's context once the server is running. + + +To deny all tools from a specific MCP server, add a deny rule for the server prefix: + +```json theme={null} +{ + "permissions": { + "deny": ["mcp__untrusted-server"] + } +} +``` + +## Notebook tool + + + **Edit cells in a Jupyter notebook.** + + Allows Claude to insert, replace, or delete cells in a `.ipynb` file with line-level precision. Read notebooks using the standard `Read` tool, which returns all cells and their outputs. + + +## Tool availability + +Not all tools are available in every context. The active tool set is determined at startup and can be affected by: + +* `CLAUDE_CODE_SIMPLE=1` — restricts to `Bash`, `Read`, and `Edit` only +* Permission deny rules — tools blanket-denied by a rule are removed from the tool list before the model sees them +* `isEnabled()` checks — each tool can self-disable based on environment conditions (e.g., `WebSearch` is gated by region) +* MCP server connection state — MCP tools are only available when the server is running and connected + +You can inspect the active tool set with the `/tools` command in the REPL. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/configuration/claudemd.md b/docs/claude-code-docs-main/en/configuration/claudemd.md new file mode 100644 index 0000000..82cf77f --- /dev/null +++ b/docs/claude-code-docs-main/en/configuration/claudemd.md @@ -0,0 +1,209 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# CLAUDE.md + +> How to write and organize CLAUDE.md files to give Claude persistent, project-specific instructions. + +`CLAUDE.md` files let you encode project knowledge that Claude loads at the start of every session. Instead of explaining your project's conventions, build system, and architecture every time, you write them once and Claude reads them automatically. + +## What belongs in CLAUDE.md + +Write instructions that would cause mistakes if missing. Everything else is noise. + +**Include:** + +* Build, test, and lint commands (exact invocations, not just tool names) +* Architecture decisions that affect how code should be written or organized +* Coding conventions specific to your project (naming patterns, file structure rules) +* Environment setup requirements (required env vars, expected services) +* Common pitfalls or patterns Claude should know to avoid +* Monorepo structure and which packages own which responsibilities + +**Omit:** + +* Things Claude already knows (standard TypeScript syntax, common library APIs) +* Obvious reminders ("write clean code", "add comments") +* Sensitive data — API keys, passwords, tokens, or secrets of any kind +* Information that changes frequently and will become stale + + + The test: would removing this line cause Claude to make a mistake on your codebase? If not, cut it. + + +## File locations + +Claude discovers memory files by traversing from your current directory up to the filesystem root. Files closer to your current directory have higher priority (they are loaded later, so the model pays more attention to them). + +| File | Type | Purpose | +| ----------------------------------- | ------- | ------------------------------------------------------------- | +| `/etc/claude-code/CLAUDE.md` | Managed | System-wide instructions for all users, set by administrators | +| `~/.claude/CLAUDE.md` | User | Your personal global instructions, applied to every project | +| `~/.claude/rules/*.md` | User | Modular global rules, each file loaded separately | +| `CLAUDE.md` (project root) | Project | Shared team instructions, checked into source control | +| `.claude/CLAUDE.md` (project root) | Project | Alternative location for shared project instructions | +| `.claude/rules/*.md` (project root) | Project | Modular project rules, organized by topic | +| `CLAUDE.local.md` (project root) | Local | Your private project-specific instructions, not checked in | + + + `.claude/rules/` directories support subdirectories. All `.md` files found recursively are loaded as separate memory entries. + + +## Loading order and priority + +Files are loaded in the following order. Because the model attends more to content that appears later in context, later files have higher effective priority. + + + + `/etc/claude-code/CLAUDE.md` and `/etc/claude-code/rules/*.md` — global policy set by administrators. Always loaded; cannot be excluded by users. + + + + `~/.claude/CLAUDE.md` and `~/.claude/rules/*.md` — your personal global instructions for all projects. + + + + `CLAUDE.md`, `.claude/CLAUDE.md`, and `.claude/rules/*.md` files in each directory from the filesystem root down to your current directory. Files in directories closer to your CWD are loaded later (higher priority). + + + + `CLAUDE.local.md` in each directory from root to CWD. Same traversal order. Gitignored by default. + + + +## The @include directive + +Memory files can include other files using `@` notation. Included files are processed recursively and inserted before the file that references them. + +```markdown theme={null} +# CLAUDE.md + +@./docs/architecture.md +@~/shared/style-guide.md +@/etc/company-standards.md +``` + +**Supported path formats:** + +| Syntax | Resolves to | +| ------------------ | ---------------------------------------------------------------- | +| `@filename` | Relative to the current file's directory (same as `@./filename`) | +| `@./relative/path` | Relative to the current file's directory | +| `@~/path/in/home` | Path under your home directory | +| `@/absolute/path` | Absolute filesystem path | + +**Behavior:** + +* Paths with a fragment (`#heading`) have the fragment stripped before resolving +* Non-existent files are silently ignored +* Circular references are detected and prevented +* Includes nest up to 5 levels deep +* Only text file formats are supported — binary files (images, PDFs) are skipped +* `@include` inside code blocks is not processed + + + External includes (files outside the project directory) require explicit approval the first time they are loaded. Claude will prompt you to confirm before fetching content from outside your project. + + +## Frontmatter path targeting + +Files in `.claude/rules/` can use YAML frontmatter to restrict which file paths they apply to. This lets you load rules conditionally based on the file Claude is working with. + +```markdown theme={null} +--- +paths: + - "src/api/**" + - "*.graphql" +--- + +# API conventions + +All API handlers must validate input using the shared `validate()` helper. +GraphQL resolvers must not perform direct database queries — use the data layer. +``` + +Rules without frontmatter apply unconditionally. Rules with `paths` frontmatter only apply when Claude is working in files matching the glob patterns. + +## Example CLAUDE.md for a TypeScript project + +```markdown theme={null} +# Project: Payments API + +## Build and test + +- Build: `bun run build` +- Tests: `bun test` (uses Bun's built-in test runner — do not use Jest) +- Lint: `bun run lint` (biome, not eslint) +- Type check: `bun run typecheck` + +Always run `bun run typecheck` before considering a change complete. + +## Architecture + +- `src/handlers/` — HTTP handlers, one file per route group +- `src/services/` — Business logic, no direct DB access +- `src/db/` — Database layer (Drizzle ORM); all queries live here +- `src/schemas/` — Zod schemas shared between handler validation and DB types + +Handlers call services. Services call the DB layer. Never skip layers. + +## Conventions + +- Use `z.object().strict()` for all input validation schemas +- Errors propagate as `Result` — never throw in service code +- All monetary values are integers in cents +- Timestamps are Unix seconds (number), not Date objects + +## Environment + +Required env vars: `DATABASE_URL`, `STRIPE_SECRET_KEY`, `JWT_SECRET` +Local dev: copy `.env.example` to `.env.local` and fill in values + +## Common mistakes to avoid + +- Do not use `new Date()` directly — use `getCurrentTimestamp()` from `src/utils/time.ts` +- Do not add `console.log` — use the `logger` from `src/utils/logger.ts` +- Do not write raw SQL — use the Drizzle query builder +``` + +## Generating CLAUDE.md with /init + +Run `/init` in any Claude Code session to automatically generate a `CLAUDE.md` for your project. Claude analyzes your codebase and produces a file containing the commands and context most relevant to the project. + +``` +/init +``` + +The generated file is a starting point. Review it, trim anything that isn't genuinely useful, and add project-specific knowledge that Claude couldn't infer from the code. + +## Editing CLAUDE.md with /memory + +Run `/memory` to open the memory editor, which lists all currently loaded memory files and lets you edit them directly within the session. + +``` +/memory +``` + +Changes take effect immediately — Claude reloads the updated file and applies the new instructions to the current session. + +## Excluding files + +If you have CLAUDE.md files you want to prevent Claude from loading (for example, in vendored dependencies or generated code), add exclusion patterns to your settings: + +```json theme={null} +{ + "claudeMdExcludes": [ + "/absolute/path/to/vendor/CLAUDE.md", + "**/generated/**", + "**/third-party/.claude/rules/**" + ] +} +``` + +Patterns are matched against absolute paths using picomatch. Only User, Project, and Local memory types can be excluded — Managed (administrator) files are always loaded. + +See [Settings](/configuration/settings) for full documentation on the `claudeMdExcludes` option. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/configuration/environment-variables.md b/docs/claude-code-docs-main/en/configuration/environment-variables.md new file mode 100644 index 0000000..cb791a5 --- /dev/null +++ b/docs/claude-code-docs-main/en/configuration/environment-variables.md @@ -0,0 +1,261 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Environment variables + +> Environment variables that Claude Code reads to configure authentication, API access, behavior, and runtime options. + +Claude Code reads environment variables at startup. These variables let you configure authentication, point to custom API endpoints, tune runtime behavior, and control which features are active — without modifying settings files. + +## Authentication + + + API key for authenticating directly with the Anthropic API. When set, Claude Code uses this key instead of (or in addition to) OAuth credentials. Takes priority over OAuth when present in most contexts. + + ```bash theme={null} + export ANTHROPIC_API_KEY="sk-ant-..." + ``` + + + + Alternative authentication token. Used in contexts where `ANTHROPIC_API_KEY` is not applicable. + + + + Override the Anthropic API base URL. Useful for pointing Claude Code at a proxy, staging environment, or compatible third-party endpoint. + + ```bash theme={null} + export ANTHROPIC_BASE_URL="https://my-proxy.example.com" + ``` + + + + Claude Code-specific API base URL override. Takes precedence over `ANTHROPIC_BASE_URL` when set. + + + + Base URL for AWS Bedrock API access. Set this when routing Claude Code through a Bedrock endpoint. + + + + Google Cloud project ID for Vertex AI access. Required when using Claude Code through Google Cloud's Vertex AI platform. + + + + Set to `1` or `true` to use AWS Bedrock as the API provider. + + + + Set to `1` or `true` to use Anthropic Foundry as the API provider. + + + + OAuth access token to use for authentication directly, bypassing the interactive login flow. Useful for automated environments. + + +## Configuration paths + + + Override the directory where Claude Code stores its configuration, settings, and transcripts. Defaults to `~/.claude` in your home directory. + + ```bash theme={null} + export CLAUDE_CONFIG_DIR="/opt/claude-config" + ``` + + + + Override the path to the managed settings file. Useful in enterprise environments where the default platform path is not appropriate. + + +## Model selection + + + Default model to use. Overridden by the `model` setting in settings files and by explicit `--model` flags. + + + + Model to use for sub-agent tasks spawned by the main agent. When not set, sub-agents use the same model as the main session. + + + + Model to use when running in auto mode. Defaults to the main session model when not specified. + + +## Behavior toggles + + + Set to `1` or `true` to enable remote/container mode. In this mode, Claude Code adjusts its behavior for non-interactive environments — extended API timeouts (120s vs. 300s), suppressed interactive prompts, and adapted output formatting. + + ```bash theme={null} + export CLAUDE_CODE_REMOTE=1 + ``` + + + + Set to `1` or `true` (or pass `--bare`) to run in bare mode. Bare mode skips hooks, LSP integration, plugin sync, skill directory walks, attribution, background prefetches, and all keychain/credential reads. Authentication must be provided via `ANTHROPIC_API_KEY` or `apiKeyHelper` in `--settings`. Useful for lightweight scripted use. + + + + Set to `1` or `true` to disable automatic context compaction. When set, Claude Code will not compact the conversation context even when it approaches the model's context limit. + + ```bash theme={null} + export DISABLE_AUTO_COMPACT=1 + ``` + + + + Set to `1` or `true` to disable background task execution. When enabled, the `run_in_background` parameter is removed from Bash and PowerShell tools, and Claude cannot run shell commands as background processes. + + + + Set to `1` or `true` to disable extended thinking for all API calls, regardless of model support. + + + + Set to `1` or `true` to disable automatic memory. When disabled, Claude does not read from or write to the auto-memory directory. Set to `0` or `false` to explicitly enable it (useful when other conditions would disable it, such as bare mode). + + Auto-memory is also disabled automatically in bare mode (`CLAUDE_CODE_SIMPLE`) and remote mode (`CLAUDE_CODE_REMOTE`) unless explicitly enabled. + + + + Set to `1` or `true` to completely disable loading of all `CLAUDE.md` memory files. Claude will not read any CLAUDE.md, CLAUDE.local.md, or `.claude/rules/*.md` files. + + + + Set to `1` or `true` to suppress analytics, telemetry, and other non-essential network requests. + + + + Set to `1` or `true` to load `CLAUDE.md` files from directories added via `--add-dir`. By default, additional directories do not have their CLAUDE.md files loaded. + + + + Set to `1` or `true` to reset the working directory back to the original project root after each Bash command. Prevents one command from changing the CWD for subsequent commands. + + +## Resource limits + + + Override the maximum number of output tokens per API response. When not set, Claude Code uses the model's default maximum. Useful for controlling costs in automated workflows. + + ```bash theme={null} + export CLAUDE_CODE_MAX_OUTPUT_TOKENS=4096 + ``` + + + + Override the maximum context window size. When set, Claude Code uses this value instead of the model's reported context limit. + + + + Maximum number of characters captured from Bash command output. Output exceeding this limit is truncated. Useful for preventing very large command outputs from consuming context. + + ```bash theme={null} + export BASH_MAX_OUTPUT_LENGTH=50000 + ``` + + + + Override the API request timeout in milliseconds. Defaults to 300,000ms (5 minutes) for standard mode and 120,000ms (2 minutes) in remote mode. + + ```bash theme={null} + export API_TIMEOUT_MS=60000 + ``` + + +## Telemetry and observability + + + Set to `1` or `true` to enable OpenTelemetry export of traces, metrics, and logs. Requires additional OTEL configuration (endpoint, headers, etc.) to be set via standard OpenTelemetry environment variables. + + ```bash theme={null} + export CLAUDE_CODE_ENABLE_TELEMETRY=1 + export OTEL_EXPORTER_OTLP_ENDPOINT="https://otel.example.com" + ``` + + + + Path to a file where Claude Code writes a JSONL transcript of the session. Each line is a JSON object representing a conversation event. + + ```bash theme={null} + export CLAUDE_CODE_JSONL_TRANSCRIPT="/tmp/session.jsonl" + ``` + + +## Node.js runtime + + + Standard Node.js options passed to the runtime. Claude Code reads this to detect flags like `--max-old-space-size` and adjusts its behavior accordingly. Claude Code itself sets this internally to configure heap size for large sessions. + + ```bash theme={null} + export NODE_OPTIONS="--max-old-space-size=4096" + ``` + + + Avoid setting `NODE_OPTIONS` to values that include code execution flags. Claude Code validates shell environments and treats some `NODE_OPTIONS` values as requiring confirmation before running Bash commands. + + + +## Host platform override + + + Override the reported host platform for analytics. Accepts `"win32"`, `"darwin"`, or `"linux"`. Useful when Claude Code runs in a container (where `process.platform` reports the container OS) but the actual host platform differs. + + ```bash theme={null} + export CLAUDE_CODE_HOST_PLATFORM=darwin + ``` + + +## Cloud provider region overrides + +Claude Code supports per-model Vertex AI region overrides. Set the corresponding environment variable to route a specific model to a different region. + +| Model prefix | Environment variable | +| ------------------- | --------------------------------- | +| `claude-haiku-4-5` | `VERTEX_REGION_CLAUDE_HAIKU_4_5` | +| `claude-3-5-haiku` | `VERTEX_REGION_CLAUDE_3_5_HAIKU` | +| `claude-3-5-sonnet` | `VERTEX_REGION_CLAUDE_3_5_SONNET` | +| `claude-3-7-sonnet` | `VERTEX_REGION_CLAUDE_3_7_SONNET` | +| `claude-opus-4-1` | `VERTEX_REGION_CLAUDE_4_1_OPUS` | +| `claude-opus-4` | `VERTEX_REGION_CLAUDE_4_0_OPUS` | +| `claude-sonnet-4-6` | `VERTEX_REGION_CLAUDE_4_6_SONNET` | +| `claude-sonnet-4-5` | `VERTEX_REGION_CLAUDE_4_5_SONNET` | +| `claude-sonnet-4` | `VERTEX_REGION_CLAUDE_4_0_SONNET` | + +```bash theme={null} +# Route Opus 4 to a specific Vertex region +export VERTEX_REGION_CLAUDE_4_0_OPUS="us-central1" +``` + +The default Vertex region is controlled by `CLOUD_ML_REGION` (defaults to `us-east5`). + +## AWS credentials + +For Bedrock access, Claude Code respects standard AWS credential environment variables: + + + AWS region for Bedrock API calls. Falls back to `AWS_DEFAULT_REGION`, then defaults to `us-east-1`. + + + + Fallback AWS region when `AWS_REGION` is not set. + + +## Setting environment variables for all sessions + +You can set environment variables that apply to every Claude Code session using the `env` field in your settings file, rather than setting them in your shell profile: + +```json theme={null} +{ + "env": { + "DISABLE_AUTO_COMPACT": "1", + "BASH_MAX_OUTPUT_LENGTH": "30000" + } +} +``` + +See [Settings](/configuration/settings) for documentation on the `env` field. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/configuration/settings.md b/docs/claude-code-docs-main/en/configuration/settings.md new file mode 100644 index 0000000..303961d --- /dev/null +++ b/docs/claude-code-docs-main/en/configuration/settings.md @@ -0,0 +1,439 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Settings + +> Configure Claude Code behavior through JSON settings files at the user, project, and managed levels. + +Claude Code reads settings from JSON files at multiple scopes. Settings merge from lowest to highest priority, so more specific scopes override broader ones. + +## Settings files + + + + **Location:** `~/.claude/settings.json` + + Applies to every Claude Code session you run, across all projects. This is where you set personal preferences like your preferred model, theme, and cleanup policy. + + ```json theme={null} + { + "model": "claude-opus-4-5", + "cleanupPeriodDays": 30, + "permissions": { + "defaultMode": "acceptEdits" + } + } + ``` + + + + **Location:** `.claude/settings.json` in your project root + + Checked into source control. Use this for settings that should apply to everyone working on the project — permission rules, hook configurations, MCP servers, and environment variables. + + ```json theme={null} + { + "permissions": { + "allow": ["Bash(npm run *)", "Bash(git *)"], + "deny": ["Bash(rm -rf *)"] + }, + "hooks": { + "PostToolUse": [ + { + "matcher": "Write", + "hooks": [{ "type": "command", "command": "npm run lint" }] + } + ] + } + } + ``` + + + + **Location:** `.claude/settings.local.json` in your project root + + Not checked into source control (automatically added to `.gitignore`). Use this for personal overrides within a specific project — your own permission preferences or environment variables that shouldn't be shared. + + ```json theme={null} + { + "permissions": { + "defaultMode": "bypassPermissions" + } + } + ``` + + + + **Location:** Platform-specific system path + + Set by administrators via MDM, registry (Windows), plist (macOS), or a managed settings file. Managed settings take highest priority and cannot be overridden by users or projects. + + See [Managed settings](#managed-settings-enterprise) below for details. + + + +## Opening settings + +Run `/config` inside any Claude Code session to open the settings UI. This opens the **Config** tab of the settings panel, where you can browse and edit the currently active settings for each scope. + +You can also edit the JSON files directly. Claude Code reloads settings automatically when it detects file changes. + +## Settings precedence + +Settings merge from lowest to highest priority. Later sources override earlier ones for scalar values; arrays are concatenated and deduplicated. + +``` +Plugin defaults → User settings → Project settings → Local settings → Managed (policy) settings +``` + + + Managed (policy) settings always take final precedence. An administrator setting `permissions.defaultMode` to `"default"` cannot be overridden by users or project files. + + +## Settings reference + + + + **Type:** `string` | **Scope:** Any + + Override the default model used by Claude Code. Accepts any model ID supported by your configured provider. + + ```json theme={null} + { "model": "claude-opus-4-5" } + ``` + + + + **Type:** `object` | **Scope:** Any + + Controls which tools Claude can use and in what mode. See [Permissions](/concepts/permissions) for full documentation on rule syntax. + + | Field | Type | Description | + | ------------------------------ | ----------- | ----------------------------------------------------------------------------------------- | + | `allow` | `string[]` | Rules for operations Claude may perform without asking | + | `deny` | `string[]` | Rules for operations Claude is always blocked from | + | `ask` | `string[]` | Rules for operations that always prompt for confirmation | + | `defaultMode` | `string` | Default permission mode: `"default"`, `"acceptEdits"`, `"plan"`, or `"bypassPermissions"` | + | `disableBypassPermissionsMode` | `"disable"` | Prevent users from entering bypass permissions mode | + | `additionalDirectories` | `string[]` | Extra directories Claude may access | + + ```json theme={null} + { + "permissions": { + "defaultMode": "acceptEdits", + "allow": ["Bash(npm run *)", "Bash(git log *)"], + "deny": ["Bash(curl *)"] + } + } + ``` + + + + **Type:** `object` | **Scope:** Any + + Run custom shell commands before or after tool executions. See [Hooks](/guides/hooks) for full documentation. + + Supported hook events: `PreToolUse`, `PostToolUse`, `Notification`, `UserPromptSubmit`, `SessionStart`, `SessionEnd`, `Stop`, `SubagentStop`, `PreCompact`, `PostCompact`. + + ```json theme={null} + { + "hooks": { + "PostToolUse": [ + { + "matcher": "Write", + "hooks": [{ "type": "command", "command": "prettier --write $CLAUDE_FILE_PATHS" }] + } + ] + } + } + ``` + + + + **Type:** `integer` (non-negative) | **Default:** `30` | **Scope:** Any + + Number of days to retain chat transcripts. Setting to `0` disables session persistence entirely — no transcripts are written and existing ones are deleted at startup. + + ```json theme={null} + { "cleanupPeriodDays": 7 } + ``` + + + + **Type:** `object` | **Scope:** Any + + Environment variables to inject into every Claude Code session. Values are coerced to strings. + + ```json theme={null} + { + "env": { + "NODE_ENV": "development", + "MY_API_URL": "https://api.example.com" + } + } + ``` + + + + **Type:** `string[]` | **Scope:** Managed + + Enterprise allowlist of models users can select. Accepts family aliases (`"opus"` allows any Opus version), version prefixes, or full model IDs. If `undefined`, all models are available. If an empty array, only the default model is available. + + ```json theme={null} + { "availableModels": ["claude-opus-4-5", "claude-sonnet-4"] } + ``` + + + + **Type:** `object[]` | **Scope:** Any + + Enterprise allowlist and denylist for MCP servers. Each entry must have exactly one of `serverName`, `serverCommand`, or `serverUrl`. The denylist takes precedence — if a server matches both lists, it is blocked. + + ```json theme={null} + { + "allowedMcpServers": [ + { "serverName": "my-db-server" }, + { "serverUrl": "https://mcp.example.com/*" } + ], + "deniedMcpServers": [ + { "serverCommand": ["npx", "malicious-server"] } + ] + } + ``` + + + + **Type:** `object` | **Scope:** Any + + Configuration for `--worktree` flag behavior. + + | Field | Type | Description | + | -------------------- | ---------- | --------------------------------------------------------------------------------- | + | `symlinkDirectories` | `string[]` | Directories to symlink from the main repo into worktrees (e.g., `"node_modules"`) | + | `sparsePaths` | `string[]` | Paths to check out in sparse mode, for faster worktrees in large monorepos | + + ```json theme={null} + { + "worktree": { + "symlinkDirectories": ["node_modules", ".cache"], + "sparsePaths": ["src/", "packages/my-service/"] + } + } + ``` + + + + **Type:** `object` | **Scope:** Any + + Customize the attribution text Claude appends to commits and pull request descriptions. + + | Field | Type | Description | + | -------- | -------- | -------------------------------------------------------------------------------- | + | `commit` | `string` | Attribution text (including any git trailers). Empty string removes attribution. | + | `pr` | `string` | Attribution text for PR descriptions. Empty string removes attribution. | + + ```json theme={null} + { + "attribution": { + "commit": "Co-Authored-By: Claude ", + "pr": "" + } + } + ``` + + + + **Type:** `string` | **Scope:** Any + + Preferred language for Claude responses and voice dictation. Accepts plain language names. + + ```json theme={null} + { "language": "japanese" } + ``` + + + + **Type:** `object` | **Scope:** Any + + Sandbox configuration for isolating Claude's tool executions. Contact your administrator for sandbox setup details. + + + + **Type:** `boolean` | **Default:** `true` | **Scope:** Any + + When `false`, extended thinking is disabled. When absent or `true`, thinking is enabled automatically for models that support it. + + ```json theme={null} + { "alwaysThinkingEnabled": false } + ``` + + + + **Type:** `"low" | "medium" | "high"` | **Scope:** Any + + Persisted effort level for models that support adjustable thinking budgets. + + ```json theme={null} + { "effortLevel": "high" } + ``` + + + + **Type:** `boolean` | **Scope:** User, local + + Enable or disable auto-memory for this project. When `false`, Claude does not read from or write to the auto-memory directory. + + ```json theme={null} + { "autoMemoryEnabled": false } + ``` + + + + **Type:** `string` | **Scope:** User, local + + Custom path for auto-memory storage. Supports `~/` for home directory expansion. Ignored if set in project settings (`.claude/settings.json`) for security reasons. Defaults to `~/.claude/projects//memory/`. + + ```json theme={null} + { "autoMemoryDirectory": "~/my-memory-store" } + ``` + + + + **Type:** `string[]` | **Scope:** Any + + Glob patterns or absolute paths of `CLAUDE.md` files to exclude from loading. Patterns are matched against absolute paths using picomatch. Only applies to User, Project, and Local memory types — Managed files cannot be excluded. + + ```json theme={null} + { + "claudeMdExcludes": [ + "/home/user/monorepo/vendor/CLAUDE.md", + "**/third-party/.claude/rules/**" + ] + } + ``` + + + + **Type:** `boolean` | **Scope:** Any + + Set to `true` to disable all hook and `statusLine` execution. + + ```json theme={null} + { "disableAllHooks": true } + ``` + + + + **Type:** `boolean` | **Default:** `true` | **Scope:** Any + + Whether the file picker respects `.gitignore` files. `.ignore` files are always respected regardless of this setting. + + ```json theme={null} + { "respectGitignore": false } + ``` + + + + **Type:** `"bash" | "powershell"` | **Default:** `"bash"` | **Scope:** Any + + Default shell for `!` commands in the input box. + + ```json theme={null} + { "defaultShell": "powershell" } + ``` + + + + **Type:** `"claudeai" | "console"` | **Scope:** Managed + + Force a specific login method. Use `"claudeai"` for Claude Pro/Max accounts, or `"console"` for Anthropic Console billing. + + ```json theme={null} + { "forceLoginMethod": "console" } + ``` + + + + **Type:** `string` | **Scope:** User, managed + + Path to a script that outputs authentication values. The script is called to retrieve credentials dynamically instead of reading a static API key. + + ```json theme={null} + { "apiKeyHelper": "/usr/local/bin/get-claude-key.sh" } + ``` + + + + **Type:** `boolean` | **Scope:** Any + + Disable syntax highlighting in diffs. + + ```json theme={null} + { "syntaxHighlightingDisabled": true } + ``` + + + + **Type:** `boolean` | **Scope:** Any + + Reduce or disable animations (spinner shimmer, flash effects, etc.) for accessibility. + + ```json theme={null} + { "prefersReducedMotion": true } + ``` + + + +## Managed settings (enterprise) + +Administrators can push settings to all users via platform-native mechanisms. Managed settings take precedence over all user and project settings. + + + + Deploy a plist file to `/Library/Preferences/` or via MDM (Jamf, Kandji, etc.) targeting `com.anthropic.claudecode`. + + + + Write settings to the `HKLM\Software\Anthropic\Claude Code` registry key (machine-wide) or `HKCU\Software\Anthropic\Claude Code` (per-user, lower priority than HKLM). + + + + Place a `managed-settings.json` file at the platform-specific managed path. For drop-in configuration fragments, create a `managed-settings.d/` directory alongside it. Files in that directory are sorted alphabetically and merged on top of the base file — later filenames win. + + ``` + managed-settings.json # base settings (lowest precedence) + managed-settings.d/ + 10-security.json # merged first + 20-model-policy.json # merged second (wins over 10-) + ``` + + This convention matches systemd/sudoers drop-ins: independent teams can ship policy fragments without coordinating edits to a single file. + + + +The following managed-only settings lock down user customization surfaces: + +| Setting | Description | +| --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `allowManagedHooksOnly` | When `true`, only hooks defined in managed settings run. User, project, and local hooks are ignored. | +| `allowManagedPermissionRulesOnly` | When `true`, only permission rules from managed settings are respected. | +| `allowManagedMcpServersOnly` | When `true`, the `allowedMcpServers` allowlist is only read from managed settings. | +| `strictPluginOnlyCustomization` | Lock specific customization surfaces (`"skills"`, `"agents"`, `"hooks"`, `"mcp"`) to plugin-only sources. Pass `true` to lock all four, or an array of surface names. | + + + `allowManagedPermissionRulesOnly` ignores permission rules from user settings, project settings, local settings, and CLI arguments. Make sure your managed rules are comprehensive before enabling this. + + +## JSON schema + +Add `$schema` to your settings file for editor autocompletion and validation: + +```json theme={null} +{ + "$schema": "https://schemas.anthropic.com/claude-code/settings.json" +} +``` + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/guides/authentication.md b/docs/claude-code-docs-main/en/guides/authentication.md new file mode 100644 index 0000000..b08a311 --- /dev/null +++ b/docs/claude-code-docs-main/en/guides/authentication.md @@ -0,0 +1,206 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Authentication + +> Configure how Claude Code authenticates with the Anthropic API, AWS Bedrock, or GCP Vertex AI. + +Claude Code supports several authentication methods. The method you use depends on how you're accessing the API — directly through Anthropic, through a cloud provider, or via an API key helper script. + +## Claude.ai OAuth (default) + +When you run `claude` for the first time without any API key configured, Claude Code starts an OAuth flow using your claude.ai account. + + + + Open your terminal and run: + + ```bash theme={null} + claude + ``` + + + + Claude Code will display a URL and prompt you to open it in your browser. Visit the URL, sign in to your claude.ai account, and grant authorization. + + + + After authorizing in the browser, Claude Code receives the OAuth token automatically and stores it in secure storage (macOS Keychain on macOS, or a credentials file on other platforms). You're now authenticated. + + + + + OAuth tokens are refreshed automatically before they expire. You do not need to re-authenticate unless you explicitly log out or revoke access. + + +## API key + +You can authenticate using an Anthropic API key instead of OAuth. + + + + Set the `ANTHROPIC_API_KEY` environment variable in your shell profile or before running `claude`: + + ```bash theme={null} + export ANTHROPIC_API_KEY=sk-ant-... + ``` + + When this variable is set, Claude Code uses it directly and does not prompt for OAuth. + + + + Add the `apiKeyHelper` setting to `~/.claude/settings.json` to run a shell command that outputs your API key. Claude Code executes this command and caches the result for 5 minutes (configurable with `CLAUDE_CODE_API_KEY_HELPER_TTL_MS`): + + ```json theme={null} + { + "apiKeyHelper": "cat ~/.anthropic/api-key" + } + ``` + + The `apiKeyHelper` command must print only the API key to stdout and exit with code 0. Any stderr output is treated as an error. + + + + + When `ANTHROPIC_API_KEY` is set or `apiKeyHelper` is configured, the OAuth flow is disabled. Claude Code will not attempt to use your claude.ai account. + + +## AWS Bedrock + +To use Claude through Amazon Bedrock, set the `CLAUDE_CODE_USE_BEDROCK` environment variable and configure your AWS credentials. + + + + ```bash theme={null} + export CLAUDE_CODE_USE_BEDROCK=1 + ``` + + + + Claude Code uses the standard AWS credential chain. Any of the following work: + + * AWS credentials file (`~/.aws/credentials`) + * Environment variables: `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN` + * IAM roles (EC2 instance profiles, ECS task roles, etc.) + * AWS SSO (`aws sso login`) + + + + ```bash theme={null} + export AWS_REGION=us-east-1 + ``` + + Claude Code selects a Claude model automatically based on your Bedrock configuration. + + + +### Automated AWS credential refresh + +If your AWS session expires mid-session (for example, with short-lived SSO tokens), configure `awsAuthRefresh` in your settings to run a command that refreshes credentials automatically: + +```json theme={null} +{ + "awsAuthRefresh": "aws sso login --profile my-profile" +} +``` + +Claude Code runs this command when it detects that credentials have expired and streams the output so you can complete any browser-based flows. + +To export credentials from a command (for example, `aws sts assume-role`), use `awsCredentialExport`: + +```json theme={null} +{ + "awsCredentialExport": "aws sts assume-role --role-arn arn:aws:iam::123456789012:role/MyRole --role-session-name claude-code --query Credentials --output json" +} +``` + +The command must output valid AWS STS JSON (with `Credentials.AccessKeyId`, `Credentials.SecretAccessKey`, and `Credentials.SessionToken`). + +## GCP Vertex AI + +To use Claude through Google Cloud Vertex AI, set the `CLAUDE_CODE_USE_VERTEX` environment variable and configure Application Default Credentials. + + + + ```bash theme={null} + export CLAUDE_CODE_USE_VERTEX=1 + ``` + + + + Claude Code uses Google Application Default Credentials (ADC). Any of the following work: + + * `gcloud auth application-default login` (for interactive use) + * Service account key file via `GOOGLE_APPLICATION_CREDENTIALS` + * Workload Identity (for GKE) + + + + ```bash theme={null} + export ANTHROPIC_VERTEX_PROJECT_ID=my-gcp-project + export CLOUD_ML_REGION=us-central1 + ``` + + + +### Automated GCP credential refresh + +Similar to Bedrock, configure `gcpAuthRefresh` to run a command when credentials expire: + +```json theme={null} +{ + "gcpAuthRefresh": "gcloud auth application-default login" +} +``` + +Claude Code checks whether your current GCP credentials are valid before running the command, so it only refreshes when necessary. + +## Switching accounts + +### Log in to a different account + +Run the `/login` command from within Claude Code to start a new OAuth flow. This replaces any stored tokens with those for the new account: + +``` +/login +``` + +### Log out + +Run the `/logout` command to remove stored credentials: + +``` +/logout +``` + +After logging out, Claude Code will prompt you to authenticate on the next run. + +## Token expiry and refresh + +OAuth tokens expire automatically. Claude Code handles refresh silently: + +* Before each API request, Claude Code checks whether the access token is expired. +* If it is, Claude Code acquires a lock and refreshes using the stored refresh token. +* Multiple concurrent Claude Code instances coordinate via a lock file to avoid redundant refreshes. +* If a `401` response arrives from the API (for example, due to a clock skew between when the token was issued and the local check), Claude Code forces an immediate refresh without waiting for the local expiry time. + +You do not need to do anything when tokens refresh. If refresh fails (for example, because you revoked access in the claude.ai settings), Claude Code will prompt you to run `/login`. + +## Authentication priority + +When multiple authentication sources are configured, Claude Code resolves them in this order: + +1. `ANTHROPIC_AUTH_TOKEN` environment variable +2. `CLAUDE_CODE_OAUTH_TOKEN` environment variable +3. OAuth token from file descriptor (for managed deployments) +4. `apiKeyHelper` from settings +5. Stored claude.ai OAuth tokens (keychain or credentials file) +6. `ANTHROPIC_API_KEY` environment variable + + + For CI and non-interactive environments, use `ANTHROPIC_API_KEY` or `CLAUDE_CODE_OAUTH_TOKEN`. These are checked before any interactive flows. + + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/guides/hooks.md b/docs/claude-code-docs-main/en/guides/hooks.md new file mode 100644 index 0000000..89ba190 --- /dev/null +++ b/docs/claude-code-docs-main/en/guides/hooks.md @@ -0,0 +1,436 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Hooks + +> Run shell commands, HTTP requests, or prompts automatically when Claude uses tools or reaches session milestones. + +Hooks let you attach automation to Claude Code's tool lifecycle. When Claude reads a file, runs a bash command, or finishes a response, your configured hooks execute automatically. Use hooks to enforce code style, run tests, log tool usage, or gate what Claude is allowed to do. + +## How hooks work + +A hook is a command (shell script, HTTP endpoint, or LLM prompt) bound to a specific **event**. When that event fires, Claude Code runs every matching hook and uses the exit code and output to decide what to do next. + +The input to each hook is a JSON object on stdin describing what happened — for example, the tool name and its arguments for `PreToolUse`, or the tool name and response for `PostToolUse`. + +### Exit code semantics + +Exit code behavior varies by event. The full table is documented in each event's description, but the general pattern is: + +| Exit code | Meaning | +| --------- | ------------------------------------------------------------------------------------ | +| `0` | Success. Stdout may be shown to Claude (event-specific). | +| `2` | Block or inject. Show stderr to Claude and (for `PreToolUse`) prevent the tool call. | +| Other | Show stderr to the user only; execution continues. | + +## Hook events + + + + Fires before every tool call. The hook input contains the tool name and arguments as JSON. + + * Exit `0`: tool proceeds normally (stdout not shown) + * Exit `2`: block the tool call and show stderr to Claude so it can respond + * Other: show stderr to the user but allow the tool call to continue + + Use matchers to restrict this hook to specific tools (e.g., `Bash`, `Write`). + + + + Fires after every successful tool call. The hook input contains `inputs` (the tool arguments) and `response` (the tool result). + + * Exit `0`: stdout is shown in transcript mode (Ctrl+O) + * Exit `2`: show stderr to Claude immediately (Claude can respond) + * Other: show stderr to the user only + + Use this to run formatters, linters, or test runners after file edits. + + + + Fires when a tool call results in an error. Input contains `tool_name`, `tool_input`, `error`, `error_type`, `is_interrupt`, and `is_timeout`. + + Same exit code semantics as `PostToolUse`. + + + + Fires just before Claude's turn ends. No matcher support. + + * Exit `0`: no output shown + * Exit `2`: show stderr to Claude and continue the conversation (Claude gets another turn) + * Other: show stderr to the user only + + Use this to check that all required tasks are complete before Claude finishes. + + + + Like `Stop`, but fires when a subagent (launched via the Agent tool) finishes. Input includes `agent_id`, `agent_type`, and `agent_transcript_path`. Same exit code semantics as `Stop`. + + + + Fires when a new subagent is launched. Input includes `agent_id` and `agent_type`. + + * Exit `0`: stdout is shown to the subagent's initial prompt + * Other: show stderr to user only + + + + Fires at the start of every session (startup, resume, `/clear`, or `/compact`). Input contains the start `source`. + + * Exit `0`: stdout is shown to Claude + * Other: show stderr to user only (blocking errors are ignored) + + Match on `source` values: `startup`, `resume`, `clear`, `compact`. + + + + Fires when you press Enter to submit a prompt. Input contains your original prompt text. + + * Exit `0`: stdout is shown to Claude (can prepend context) + * Exit `2`: block the prompt and show stderr to the user only + * Other: show stderr to user only + + + + Fires before Claude Code compacts the conversation (auto or manual). Input contains compaction details. + + * Exit `0`: stdout is appended as custom compact instructions + * Exit `2`: block the compaction + * Other: show stderr to user but proceed + + Match on `trigger`: `manual` or `auto`. + + + + Fires after compaction completes. Input contains compaction details and the summary. + + * Exit `0`: stdout shown to user + * Other: show stderr to user only + + + + Fires with `trigger: init` (project onboarding) or `trigger: maintenance` (periodic). Use this for one-time setup scripts or periodic maintenance tasks. + + * Exit `0`: stdout shown to Claude + * Other: show stderr to user only + + + + Fires when Claude Code would show a permission prompt. Output JSON with `hookSpecificOutput.decision` to approve or deny programmatically. + + * Exit `0`: use the hook's decision if provided + * Other: show stderr to user only + + + + Fires when the auto mode classifier denies a tool call. Return `{"hookSpecificOutput":{"hookEventName":"PermissionDenied","retry":true}}` to tell Claude it may retry. + + + + Fires for permission prompts, idle prompts, auth success, and elicitation events. Match on `notification_type`. + + * Exit `0`: no output shown + * Other: show stderr to user only + + + + Fires after the working directory changes. Input includes `old_cwd` and `new_cwd`. The `CLAUDE_ENV_FILE` environment variable is set — write bash export lines to that file to apply new env vars to subsequent Bash tool calls. + + + + Fires when a file matching the hook's `matcher` pattern changes on disk. The matcher specifies filename patterns to watch (e.g., `.envrc|.env`). Like `CwdChanged`, supports `CLAUDE_ENV_FILE` for injecting environment. + + + + Fires when the session is ending (clear, logout, or exit). Match on `reason`: `clear`, `logout`, `prompt_input_exit`, or `other`. + + + + Fires when settings files change during a session. Match on `source`: `user_settings`, `project_settings`, `local_settings`, `policy_settings`, or `skills`. + + * Exit `0`: allow the change + * Exit `2`: block the change from being applied + + + + Fires when any instruction file (CLAUDE.md or rule) is loaded. Observability-only — does not support blocking. + + + + `WorktreeCreate` fires when an isolated worktree needs to be created. Stdout should contain the absolute path of the created worktree. `WorktreeRemove` fires when a worktree should be cleaned up. + + + + `TaskCreated` and `TaskCompleted` fire when tasks are created or marked complete. Input includes `task_id`, `task_subject`, `task_description`, `teammate_name`, and `team_name`. Exit `2` prevents the state change. + + + + Fires before a teammate goes idle. Exit `2` to send stderr to the teammate and prevent it from going idle. + + + + `Elicitation` fires when an MCP server requests user input. Return JSON in `hookSpecificOutput` to provide the response programmatically. `ElicitationResult` fires after the user responds, allowing you to modify or block the response. + + + +## Configuring hooks + +Run `/hooks` inside Claude Code to open the hooks configuration menu. The menu shows all configured hooks grouped by event and lets you add, edit, or remove them interactively. + +Hooks are stored in the `hooks` field of settings files: + +* `~/.claude/settings.json` — user-level hooks (apply everywhere) +* `.claude/settings.json` — project-level hooks (apply for this project) +* `.claude/settings.local.json` — local hooks (not checked into VCS) + +### Configuration format + +```json theme={null} +{ + "hooks": { + "PostToolUse": [ + { + "matcher": "Write", + "hooks": [ + { + "type": "command", + "command": "prettier --write $CLAUDE_FILE_PATH" + } + ] + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "echo 'Session complete' >> ~/.claude-log.txt" + } + ] + } + ] + } +} +``` + +Each event maps to an array of **matcher objects**. Each matcher object has: + +* `matcher` (optional) — a string pattern to match against the event's matchable field (for example, `tool_name` for `PreToolUse`/`PostToolUse`, `trigger` for `Setup`, `source` for `SessionStart`) +* `hooks` — an array of hook commands to run when the matcher matches + +### Hook command types + + + + ```json theme={null} + { + "type": "command", + "command": "npm test", + "timeout": 60, + "shell": "bash" + } + ``` + + Fields: + + * `command` — the shell command to run (required) + * `timeout` — timeout in seconds (default: no limit) + * `shell` — `"bash"` (default) or `"powershell"` + * `statusMessage` — custom spinner text shown while the hook runs + * `async` — run in background without blocking (`true`/`false`) + * `once` — run once and remove the hook automatically + * `if` — permission rule syntax to conditionally skip the hook (e.g., `"Bash(git *)"`) + + + + ```json theme={null} + { + "type": "http", + "url": "https://hooks.example.com/claude-event", + "headers": { + "Authorization": "Bearer $MY_TOKEN" + }, + "allowedEnvVars": ["MY_TOKEN"], + "timeout": 10 + } + ``` + + Claude Code POSTs the hook input JSON to the URL. Headers support `$VAR` expansion for variables listed in `allowedEnvVars`. + + + + ```json theme={null} + { + "type": "prompt", + "prompt": "Review this tool call for security issues: $ARGUMENTS. If you find a problem, output an explanation and exit with code 2.", + "model": "claude-haiku-4-5", + "timeout": 30 + } + ``` + + The hook prompt is evaluated by an LLM. `$ARGUMENTS` is replaced with the hook input JSON. The LLM's response becomes the hook output. + + + + ```json theme={null} + { + "type": "agent", + "prompt": "Verify that the unit tests in $ARGUMENTS passed and all assertions are meaningful.", + "timeout": 60 + } + ``` + + Like a prompt hook, but runs as a full agent with tool access. Useful for verification tasks that require reading files or running commands. + + + +## Matcher patterns + +For events that support matching (like `PreToolUse`, `PostToolUse`, `SessionStart`), the `matcher` field filters which inputs trigger the hook. + +* An empty or absent `matcher` matches all inputs for that event. +* For tool events, the `matcher` is matched against the `tool_name` (e.g., `"Bash"`, `"Write"`, `"Read"`). +* For `SessionStart`, it matches `source` (e.g., `"startup"`, `"compact"`). +* For `Setup`, it matches `trigger` (e.g., `"init"`, `"maintenance"`). +* For `FileChanged`, the `matcher` specifies filename patterns to watch (e.g., `".envrc|.env"`). + +## Example hooks + +### Auto-format files after editing + +Run Prettier after every file write: + +```json theme={null} +{ + "hooks": { + "PostToolUse": [ + { + "matcher": "Write", + "hooks": [ + { + "type": "command", + "command": "prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true" + } + ] + } + ] + } +} +``` + +### Run tests after bash commands + +Run the test suite after any bash command that touches source files: + +```json theme={null} +{ + "hooks": { + "PostToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "if git diff --name-only HEAD | grep -q '\\.ts$'; then npm test; fi", + "timeout": 120, + "async": true + } + ] + } + ] + } +} +``` + +### Log all tool usage + +Append every tool call to a log file: + +```json theme={null} +{ + "hooks": { + "PostToolUse": [ + { + "hooks": [ + { + "type": "command", + "command": "echo \"$(date -u +%Y-%m-%dT%H:%M:%SZ) $CLAUDE_TOOL_NAME\" >> ~/.claude-tool-log.txt", + "async": true + } + ] + } + ] + } +} +``` + +### Block dangerous commands + +Use `PreToolUse` to prevent `rm -rf` from being called: + +```json theme={null} +{ + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -q 'rm -rf'; then echo 'Blocked: rm -rf is not allowed' >&2; exit 2; fi" + } + ] + } + ] + } +} +``` + +### Inject environment on directory change + +Use `CwdChanged` with `CLAUDE_ENV_FILE` to load `.envrc` when you change directories: + +```json theme={null} +{ + "hooks": { + "CwdChanged": [ + { + "hooks": [ + { + "type": "command", + "command": "if [ -f .envrc ]; then grep '^export ' .envrc >> \"$CLAUDE_ENV_FILE\"; fi" + } + ] + } + ] + } +} +``` + +## Hook timeout configuration + +Set a per-hook timeout in seconds using the `timeout` field: + +```json theme={null} +{ + "type": "command", + "command": "npm run integration-tests", + "timeout": 300 +} +``` + +Hooks without a `timeout` run until they exit naturally. For long-running hooks that should not block Claude, use `"async": true`. + +## Hooks vs. skills + +| Feature | Hooks | Skills | +| ------------- | ----------------------------------- | -------------------------------------------------- | +| When they run | Automatically on tool events | When Claude or you explicitly invoke `/skill-name` | +| Purpose | Side effects, gating, observability | On-demand workflows and capabilities | +| Configuration | Settings JSON | Markdown files in `.claude/skills/` | +| Input | JSON from the tool event | The arguments you pass to the skill | + +Use hooks for things that should happen automatically every time (formatting, logging, enforcement). Use skills for repeatable workflows that you want to trigger on demand. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/guides/mcp-servers.md b/docs/claude-code-docs-main/en/guides/mcp-servers.md new file mode 100644 index 0000000..9805487 --- /dev/null +++ b/docs/claude-code-docs-main/en/guides/mcp-servers.md @@ -0,0 +1,282 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# MCP servers + +> Extend Claude Code with Model Context Protocol servers to connect databases, APIs, and custom tools. + +Model Context Protocol (MCP) is an open standard that lets Claude Code connect to external data sources and services. When you add an MCP server, Claude gains access to new tools — for example, querying a database, reading Jira tickets, or interacting with a Slack workspace. + + + + Connect Claude to any service that exposes an MCP server: databases, APIs, file systems, and more. + + + + Save server configs per-project in `.mcp.json` or globally in your user settings. + + + + Turn individual servers on and off with `/mcp enable` and `/mcp disable` without editing config files. + + + + Claude Code prompts before calling any MCP tool, giving you control over what actions are taken. + + + +## Adding a server + +The primary way to add an MCP server is via the `claude mcp add` CLI command, or by editing a config file directly. + +### Via the CLI + +Run `/mcp` to open the MCP management panel where you can enable, disable, and reconnect servers. + +To add a server from the command line using the `claude` CLI: + +```bash theme={null} +claude mcp add -- [args...] +``` + +For example, to add the official filesystem MCP server: + +```bash theme={null} +claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem /tmp +``` + +Specify the scope with `--scope`: + +```bash theme={null} +# Save to .mcp.json in the current directory (shared with your team) +claude mcp add --scope project filesystem -- npx -y @modelcontextprotocol/server-filesystem /tmp + +# Save to your user config (available in all projects) +claude mcp add --scope user my-db -- npx -y @my-org/mcp-server-postgres +``` + +### Via the `--mcp-config` flag + +Pass a JSON config file when starting Claude Code: + +```bash theme={null} +claude --mcp-config ./my-mcp-config.json +``` + +This is useful for CI environments or when you want a self-contained configuration that is not persisted to any settings file. + +## Config file format + +MCP server configurations use JSON with a top-level `mcpServers` key. Each server entry has a name and a configuration object. + + + + Most MCP servers run as a local subprocess communicating over stdin/stdout: + + ```json theme={null} + { + "mcpServers": { + "filesystem": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/projects"], + "env": { + "NODE_ENV": "production" + } + } + } + } + ``` + + Fields: + + * `command` — the executable to run (required) + * `args` — array of command-line arguments + * `env` — environment variables to pass to the process + + + + For servers hosted as HTTP endpoints: + + ```json theme={null} + { + "mcpServers": { + "my-api": { + "type": "http", + "url": "https://mcp.example.com/v1", + "headers": { + "Authorization": "Bearer $MY_API_TOKEN" + } + } + } + } + ``` + + Fields: + + * `type` — set to `"http"` + * `url` — the server URL (required) + * `headers` — HTTP headers; values support `$VAR` environment variable expansion + + + + For servers using the SSE transport: + + ```json theme={null} + { + "mcpServers": { + "events-server": { + "type": "sse", + "url": "https://mcp.example.com/sse" + } + } + } + ``` + + + +Server names may only contain letters, numbers, hyphens, and underscores. + +### Environment variable expansion + +Values in `command`, `args`, `url`, and `headers` support `$VAR` and `${VAR}` syntax. Variables are expanded at startup from the shell environment. If a referenced variable is missing, Claude Code logs a warning but still attempts to connect. + +## Configuration scopes + +MCP configs are stored in different places depending on scope: + +| Scope | Location | Use case | +| --------- | ------------------------------------------------------------------------ | ---------------------------------------------------- | +| `project` | `.mcp.json` in the current directory (and parent directories up to root) | Team-shared server configs | +| `user` | `~/.claude.json` (global config) | Personal servers available everywhere | +| `local` | `.claude/settings.local.json` in the current project | Per-project personal overrides, not committed to VCS | + +When the same server name appears in multiple scopes, `local` takes precedence over `project`, which takes precedence over `user`. + +## Managing servers + +### Enable and disable + +``` +/mcp enable +/mcp disable +/mcp enable all +/mcp disable all +``` + +Disabled servers remain in the config but are not connected at startup. This is useful for servers you want to keep configured but not always running. + +### Reconnect a server + +If a server fails to connect or you need to force a reconnection: + +``` +/mcp reconnect +``` + +### View server status + +Run `/mcp` to see a list of all configured servers and their current connection status: + +* **connected** — server is running and ready to use +* **pending** — server is starting up +* **failed** — server could not connect (check the error message) +* **needs-auth** — server requires OAuth authorization +* **disabled** — server is configured but turned off + +## Approving MCP tool calls + +Claude Code displays a permission prompt before calling any MCP tool. The prompt shows the tool name and its input arguments, so you can review what Claude is about to do before it executes. + +You can: + +* **Allow once** — approve this specific call +* **Allow always** — approve all calls to this tool in this session +* **Deny** — block the call; Claude receives an error and can try a different approach + + + In auto mode (`--allowedTools`), MCP tools can be pre-approved by including their full name (formatted as `mcp____`) in the allowed tools list. + + +## Example: filesystem server + +The official filesystem MCP server gives Claude the ability to read and write files in directories you specify. + + + + ```bash theme={null} + claude mcp add --scope project filesystem -- npx -y @modelcontextprotocol/server-filesystem /home/user/projects + ``` + + + + Run `/mcp` and confirm `filesystem` shows as **connected**. + + + + Claude can now read and write files in `/home/user/projects` using the `mcp__filesystem__read_file` and `mcp__filesystem__write_file` tools. + + + +## Example: database server + +```json theme={null} +{ + "mcpServers": { + "postgres": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-postgres"], + "env": { + "POSTGRES_CONNECTION_STRING": "$DATABASE_URL" + } + } + } +} +``` + +Set `DATABASE_URL` in your environment before starting Claude Code, and the MCP server will receive it automatically. + +## Official MCP registry + +Anthropic and the community maintain an MCP server registry at [modelcontextprotocol.io](https://modelcontextprotocol.io). Browse available servers for databases, productivity tools, cloud providers, and more. + +## Troubleshooting + + + + * Check that the command exists and is executable: `which npx` + * Run the command manually in your terminal to see if it starts without errors + * Check that required environment variables (like API keys) are set + * Run `claude --debug` to see detailed connection logs + + + + A server that is connected but unauthenticated will not expose any tools. Look for a **needs-auth** status in `/mcp` and follow the OAuth flow to authorize. + + + + Claude Code expands variables from the process environment at startup. If a variable is not set in your shell profile, it will not be available. Verify with `echo $YOUR_VAR` in the same terminal before starting `claude`. + + + + On Windows, `npx` requires a `cmd /c` wrapper: + + ```json theme={null} + { + "mcpServers": { + "my-server": { + "command": "cmd", + "args": ["/c", "npx", "-y", "@my-org/mcp-server"] + } + } + } + ``` + + + + Use the `--mcp-config` flag to pass a config file explicitly, and ensure all referenced environment variables are set in the CI environment. For stdio servers, make sure the command (e.g., `npx`, `node`) is available in the CI PATH. + + + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/guides/multi-agent.md b/docs/claude-code-docs-main/en/guides/multi-agent.md new file mode 100644 index 0000000..bb0b45f --- /dev/null +++ b/docs/claude-code-docs-main/en/guides/multi-agent.md @@ -0,0 +1,195 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Multi-agent workflows + +> Parallelize complex tasks by having Claude spawn and coordinate sub-agents. + +Claude Code can spawn sub-agents — separate Claude instances that run independently to complete tasks in parallel. This lets you tackle large, multi-step work by dividing it across specialized agents that run concurrently, rather than doing everything sequentially in a single conversation. + +## How sub-agents work + +When Claude uses the `Agent` tool, it launches a new Claude instance with its own context, system prompt, and tool permissions. The parent Claude waits for the agent to complete (or continues other work if the agent is running in the background), then receives the agent's result as a single message. + +Each agent: + +* Starts with a fresh context window (unless it's a fork) +* Gets a specialized system prompt based on its agent type +* Has its own tool permissions (configurable per agent type) +* Can itself spawn further sub-agents, though nesting is limited + +## The Agent tool + +Claude uses the `Agent` tool to spawn sub-agents. As a user, you don't call this tool directly — Claude decides when to use it. You can see when Claude spawns agents: they appear in the terminal with their own progress indicators. + +The tool accepts: + +* `description` — a 3-5 word summary of what the agent will do (shown in the UI) +* `prompt` — the full task description for the agent +* `subagent_type` — which specialized agent type to use (optional; defaults to general-purpose) +* `run_in_background` — whether to run asynchronously so Claude can continue other work +* `isolation` — `"worktree"` to give the agent an isolated git worktree + +## When Claude uses sub-agents + +Claude spawns agents when a task benefits from parallelism or specialization: + +* **Independent parallel tasks** — writing tests while also updating documentation +* **Specialized work** — using a code-reviewer agent for a security audit +* **Long-running tasks** — background research while Claude works on something else +* **Isolated exploration** — forking itself to explore a solution without polluting the main context + +Claude does not spawn agents for simple tasks, small file reads, or anything it can complete directly in a few tool calls. + +## Requesting multi-agent workflows + +You can ask Claude to use multiple agents explicitly: + +``` +Run the linter and the test suite in parallel. +``` + +``` +Use separate agents to research how three competing libraries handle this problem, +then summarize the findings. +``` + +``` +Have an agent review the security implications of this code change while you +continue implementing the feature. +``` + + + When asking Claude to run agents "in parallel", it will send a single message with multiple Agent tool calls, launching all of them simultaneously. Be explicit about what should run in parallel vs. what must be sequential. + + +## Foreground vs. background agents + +By default, agents run in the **foreground**: Claude waits for each agent to complete before proceeding. Use foreground agents when Claude needs the results to continue its work. + +Background agents run asynchronously. Claude launches them and continues with other work. You receive a notification when the agent completes. + +``` +Run the integration tests in the background while you implement the next feature. +``` + +Claude will not poll or check on background agents — it continues working and receives the result as a notification when the agent finishes. + + + Background agents are shown in a tasks panel alongside the main conversation. You can see their progress and cancel them if needed. + + +## Coordinator mode + +In coordinator mode, Claude acts as an orchestrator that delegates all implementation work to sub-agents and focuses on planning, routing, and synthesis. This is useful for very large tasks where you want Claude to manage the overall workflow while sub-agents do the hands-on work. + +Coordinator mode is primarily used in multi-agent team setups. In a standard single-user session, Claude decides for itself when to delegate. + +## Agent memory and context isolation + +Each sub-agent starts with a **clean context window**. The parent Claude provides the full task description and any relevant background in the agent's prompt — the agent does not automatically inherit the parent's conversation history. + +This means: + +* Agents are independent; they cannot read the parent's conversation +* The parent must provide sufficient context in the prompt for the agent to succeed +* Results from agents are returned as a single response, not streamed turn by turn + +### Persistent agent memory + +Some agent types have persistent memory across invocations. Memory is stored in markdown files: + +* **User scope**: `~/.claude/agent-memory//MEMORY.md` — shared across all projects +* **Project scope**: `.claude/agent-memory//MEMORY.md` — shared with your team +* **Local scope**: `.claude/agent-memory-local//MEMORY.md` — local only, not committed + +When an agent type has memory configured, it reads and writes this file to remember things across sessions. This is useful for agents that learn your preferences over time. + +## Worktree isolation + +Set `isolation: "worktree"` to give an agent its own git worktree — an isolated copy of the repository. Changes the agent makes do not affect your working directory until you merge them. + +``` +Implement this feature in an isolated worktree so I can review the changes before merging. +``` + +If the agent makes changes, the worktree path and branch are returned in the result so you can inspect them. If the agent makes no changes, the worktree is cleaned up automatically. + +## Monitoring sub-agent progress + +While agents run, you can see: + +* The agent's description and elapsed time in the progress display +* Tool calls the agent is making (shown in transcript mode with Ctrl+O) +* A notification when the agent completes + +For background agents, progress updates appear in the tasks panel. Claude summarizes the agent's findings when reporting back to you. + + + Do not ask Claude to check on a running background agent's output file directly. Claude receives a completion notification automatically. Polling the output file mid-run pulls the agent's internal tool noise into Claude's context, which is counterproductive. + + +## Writing effective agent prompts + +Sub-agents start with zero context from the parent conversation. Claude should — and you can prompt Claude to — write agent prompts that are self-contained briefs. + +A good agent prompt includes: + +* What the agent is trying to accomplish and why +* Relevant file paths, function names, or data +* What the agent should report back (format, length, specific questions to answer) +* What the agent should *not* do (scope constraints) +* What has already been tried or ruled out + +A weak prompt: + +``` +Based on your findings, fix the bug. +``` + +A stronger prompt: + +``` +Fix the null reference bug in UserService.getProfile() in src/services/user.ts:247. +The bug occurs when the user has no associated profile record — getProfile() calls +profile.preferences without checking if profile is null first. Add a null check and +return a default preferences object { theme: 'light', notifications: true }. +Run npm test afterward to confirm the fix passes existing tests. +``` + +## Best practices + + + + Agents are most valuable when their work does not depend on each other's output. If task B requires the result of task A, they must be sequential — but tasks A and C can run in parallel while B waits for A. + + + + Paste relevant code snippets, file paths, function signatures, or error messages directly into the agent prompt. Never assume the agent will infer what it needs from minimal instructions. + + + + If you need a concise summary, say "report in under 200 words." If you need structured output, describe the format. Vague prompts produce vague results. + + + + When an agent will make significant file changes, use `isolation: "worktree"` so you can review before merging. This is especially useful for refactoring or large feature work. + + + + Spawning many agents for small tasks adds overhead without benefit. Claude decides when agents are worthwhile; trust its judgment unless you have a specific parallel structure in mind. + + + +## Limitations and safety + +* Sub-agents have their own permission modes. By default, they use `acceptEdits` mode. +* Agents can be denied by permission rules using `Agent(AgentName)` syntax in deny rules. +* Background agents are not linked to the parent's abort controller — pressing Escape cancels the parent turn but not running background agents. Use the tasks panel to cancel background agents explicitly. +* Sub-agents cannot spawn other teammates (the team roster is flat). They can spawn further sub-agents using the Agent tool. +* Fork agents (agents that inherit the parent's context) cannot themselves fork — Claude prevents recursive forking. +* Agent results are capped at 100,000 characters before being returned to the parent. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/guides/skills.md b/docs/claude-code-docs-main/en/guides/skills.md new file mode 100644 index 0000000..2eccfc8 --- /dev/null +++ b/docs/claude-code-docs-main/en/guides/skills.md @@ -0,0 +1,245 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Skills + +> Create reusable on-demand capabilities that Claude invokes with a slash command. + +Skills are markdown files that define reusable prompts and workflows. When you type `/skill-name` in Claude Code, Claude loads that skill's instructions and executes the described task. Skills are useful for any workflow you repeat across sessions — running a deployment, writing a changelog, reviewing a PR, or applying your team's specific coding conventions. + +## How skills work + +A skill is a directory inside `.claude/skills/` with a `SKILL.md` file. When you invoke `/skill-name`, Claude Code loads the skill's `SKILL.md` as the prompt for that action. The skill can include instructions, context, constraints, and even inline shell commands that run at invocation time. + +Skills load lazily — they are only read when invoked, so having many skills defined doesn't affect startup time or context size. + +## Creating a skill + + + + Skills live in a `skills` subdirectory inside any `.claude/` directory: + + ```bash theme={null} + mkdir -p .claude/skills/my-skill + ``` + + You can put skills in: + + * `.claude/skills/` (project-level, relative to your working directory) + * `~/.claude/skills/` (user-level, available in all projects) + + + + Create `.claude/skills/my-skill/SKILL.md` with your skill's instructions: + + ```markdown theme={null} + --- + description: Run the full release process for this project + argument-hint: version number (e.g. 1.2.3) + --- + + Release the project at version $ARGUMENTS. + + Steps: + 1. Update the version in `package.json` to $ARGUMENTS + 2. Update CHANGELOG.md with a new section for this version + 3. Run `npm test` and confirm all tests pass + 4. Commit with message "chore: release v$ARGUMENTS" + 5. Create a git tag `v$ARGUMENTS` + ``` + + + + ``` + /my-skill 1.2.3 + ``` + + Claude loads the skill and executes the instructions, with `1.2.3` substituted for `$ARGUMENTS`. + + + +## Skill frontmatter + +The frontmatter at the top of `SKILL.md` configures how the skill behaves. All fields are optional. + +```yaml theme={null} +--- +description: A short description shown in /skills and used by Claude to decide when to use it +argument-hint: what to pass as the argument (shown in autocomplete) +allowed-tools: Bash, Write, Read +when_to_use: Use this skill when the user asks to create a new component +model: claude-sonnet-4-6 +user-invocable: true +context: fork +--- +``` + +| Field | Description | +| ---------------- | ------------------------------------------------------------------------------------------ | +| `description` | Short description shown in `/skills` and used by Claude to decide when to invoke the skill | +| `argument-hint` | Hint shown in slash command autocomplete describing what argument to pass | +| `allowed-tools` | Comma-separated list of tools this skill is permitted to use (defaults to all) | +| `when_to_use` | Prose description of when Claude should use this skill proactively | +| `model` | Model to use for this skill (e.g., `claude-sonnet-4-6`); defaults to the session model | +| `user-invocable` | Set to `false` to hide the skill from the slash command list (still available to Claude) | +| `context` | `fork` to run the skill in an isolated subagent context | +| `paths` | Glob patterns; skill only activates when matching files are touched | +| `version` | Skill version string | +| `hooks` | Hooks scoped to this skill's execution (same format as settings hooks) | + +## Argument substitution + +Use `$ARGUMENTS` anywhere in `SKILL.md` to insert the text passed after the slash command: + +```markdown theme={null} +Create a new React component named $ARGUMENTS following the project's conventions. +``` + +``` +/new-component UserProfile +``` + +For named arguments, use `$ARG_NAME` syntax by listing arguments in frontmatter: + +```yaml theme={null} +--- +arguments: [name, directory] +--- +``` + +Then reference them as `$name` and `$directory` in the body. + +## Inline shell commands + +Skills can embed shell commands that execute at invocation time using backtick injection syntax. The output is inserted into the prompt before Claude sees it: + +```markdown theme={null} +--- +description: Review recent changes +--- + +Here are the recent commits for context: + +!`git log --oneline -20` + +Review the changes above and summarize what was accomplished. +``` + +The `!` prefix followed by a backtick-quoted command runs the command and replaces the block with its output. This is useful for injecting live project state into the skill prompt. + + + Inline shell commands execute with the same permissions as your shell. They run when you invoke the skill, not when the skill is loaded at startup. + + +## Listing skills + +Run `/skills` to see all available skills: + +``` +/skills +``` + +This shows skills from all scopes (project, user, managed) along with their descriptions. + +## Namespaced skills + +Skills in subdirectories are namespaced with colons: + +``` +.claude/skills/ + deployment/ + SKILL.md → /deployment + database/ + migrate/ + SKILL.md → /database:migrate + seed/ + SKILL.md → /database:seed +``` + +## Conditional skills (path-based activation) + +Add a `paths` frontmatter field to activate a skill only when you work with matching files: + +```yaml theme={null} +--- +description: Django model review +paths: "**/*.py" +when_to_use: Use when editing Django model files +--- +``` + +The skill is loaded into Claude's context automatically when you read, write, or edit a file matching the glob pattern. This keeps skills out of context until they're relevant. + +## Bundled skills + +Claude Code ships with built-in skills that are always available. These are compiled into the binary and register themselves at startup. You can see them in `/skills` — they appear with source `bundled`. + +Bundled skills include capabilities like: + +* Project onboarding assistance +* Common code review workflows +* Agentic search and analysis patterns + +Bundled skills follow the same interface as user-defined skills and can include reference files that are extracted to disk on first invocation. + +## User-level skills + +Skills in `~/.claude/skills/` are available in every project without needing to add them to each repository. This is a good place for personal workflows that span projects. + +```bash theme={null} +mkdir -p ~/.claude/skills/standup +cat > ~/.claude/skills/standup/SKILL.md << 'EOF' +--- +description: Summarize what I worked on today for a standup update +--- + +Look at my git commits from today across this repository and summarize them in standup format: what I did, what I'm doing next, and any blockers. Keep it to 3-4 sentences. +EOF +``` + +## Skills vs. hooks + +| Feature | Skills | Hooks | +| ------------- | ---------------------------------------------------------------- | ------------------------------------------------- | +| Invocation | Explicit: `/skill-name` or by Claude when it recognizes the need | Automatic: fires on tool events | +| When to use | Repeatable workflows you want to trigger intentionally | Side effects, formatting, linting, blocking | +| Configuration | `SKILL.md` in `.claude/skills/` | `hooks` field in settings JSON | +| Context | Can include files, shell output, and detailed instructions | Receives event JSON, returns exit code and output | + +Use skills when you want a named, repeatable action. Use hooks when you want something to happen automatically every time a specific event occurs. + +## Example: custom component generator + +```markdown theme={null} +--- +description: Generate a new React component with tests +argument-hint: ComponentName +allowed-tools: Write, Bash +--- + +Create a new React component named $ARGUMENTS. + +1. Create `src/components/$ARGUMENTS/$ARGUMENTS.tsx` with: + - A functional component using TypeScript + - Props interface named `$ARGUMENTSProps` + - JSDoc comment describing the component + - Default export + +2. Create `src/components/$ARGUMENTS/$ARGUMENTS.test.tsx` with: + - At least one rendering test using React Testing Library + - A snapshot test + +3. Create `src/components/$ARGUMENTS/index.ts` that re-exports the component. + +4. Run `npx tsc --noEmit` to confirm no type errors. +``` + +Invoke with: + +``` +/new-component Button +``` + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/installation.md b/docs/claude-code-docs-main/en/installation.md new file mode 100644 index 0000000..c57cbe3 --- /dev/null +++ b/docs/claude-code-docs-main/en/installation.md @@ -0,0 +1,270 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Installation + +> Install Claude Code on macOS, Linux, or Windows (via WSL). Requires Node.js 18 or higher. + +## Requirements + +* **Node.js 18 or higher** — Claude Code checks the Node.js version at startup and exits with an error if it is below 18. +* **npm** — included with Node.js. + +Check your current version: + +```bash theme={null} +node --version +npm --version +``` + +*** + +## Install Claude Code + +Install globally with npm: + +```bash theme={null} +npm install -g @anthropic-ai/claude-code +``` + +After installation, verify it works: + +```bash theme={null} +claude --version +``` + +*** + +## Platform-specific notes + + + + npm global installs work out of the box on macOS. If you get a permissions error when running `npm install -g`, you have two options: + + **Option A: Fix npm permissions (recommended)** + + Configure npm to use a directory in your home folder: + + ```bash theme={null} + mkdir -p ~/.npm-global + npm config set prefix ~/.npm-global + ``` + + Add the following to your shell profile (`~/.zshrc` or `~/.bash_profile`): + + ```bash theme={null} + export PATH=~/.npm-global/bin:$PATH + ``` + + Then reload your profile and install: + + ```bash theme={null} + source ~/.zshrc + npm install -g @anthropic-ai/claude-code + ``` + + **Option B: Use a Node version manager** + + Tools like [nvm](https://github.com/nvm-sh/nvm) or [fnm](https://github.com/Schniz/fnm) install Node.js in your home directory, which avoids global permission issues entirely: + + ```bash theme={null} + # Using nvm + nvm install --lts + nvm use --lts + npm install -g @anthropic-ai/claude-code + ``` + + + + On most Linux distributions, `npm install -g` requires either `sudo` or a corrected npm prefix. Using `sudo` is not recommended because it can create permission problems later. + + **Recommended: Use a Node version manager** + + ```bash theme={null} + # Install nvm + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash + + # Reload your shell, then install Node.js + nvm install --lts + nvm use --lts + + # Install Claude Code + npm install -g @anthropic-ai/claude-code + ``` + + **Alternative: Fix npm global prefix** + + ```bash theme={null} + mkdir -p ~/.npm-global + npm config set prefix ~/.npm-global + echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc + source ~/.bashrc + npm install -g @anthropic-ai/claude-code + ``` + + + + Claude Code runs on Windows through the Windows Subsystem for Linux (WSL). Running it directly in Command Prompt or PowerShell is not supported. + + **Step 1: Install WSL** + + Open PowerShell as Administrator and run: + + ```powershell theme={null} + wsl --install + ``` + + Restart your machine when prompted. This installs WSL 2 with Ubuntu by default. + + **Step 2: Open a WSL terminal** + + Launch Ubuntu from the Start menu, or run `wsl` from PowerShell. + + **Step 3: Install Node.js inside WSL** + + ```bash theme={null} + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash + source ~/.bashrc + nvm install --lts + nvm use --lts + ``` + + **Step 4: Install Claude Code** + + ```bash theme={null} + npm install -g @anthropic-ai/claude-code + ``` + + + Always run `claude` from within your WSL terminal, not from Windows CMD or PowerShell. Your project files should live inside the WSL filesystem (e.g., `~/projects/`) for best performance. Accessing Windows files via `/mnt/c/...` works but is slower. + + + + +*** + +## Updating + +Update Claude Code to the latest version with: + +```bash theme={null} +npm update -g @anthropic-ai/claude-code +``` + +Or use Claude Code's built-in update command: + +```bash theme={null} +claude update +``` + +To check what version you're running: + +```bash theme={null} +claude --version +``` + +*** + +## Uninstalling + +Remove Claude Code with: + +```bash theme={null} +npm uninstall -g @anthropic-ai/claude-code +``` + +This removes the `claude` binary. Your configuration files in `~/.claude/` are not removed automatically. To delete them: + +```bash theme={null} +rm -rf ~/.claude +``` + +*** + +## Troubleshooting + + + + This usually means the npm global bin directory is not on your `PATH`. + + Find where npm installs global binaries: + + ```bash theme={null} + npm config get prefix + ``` + + The `bin` subdirectory of that path needs to be on your `PATH`. For example, if the output is `/home/you/.npm-global`, add this to your shell profile: + + ```bash theme={null} + export PATH=/home/you/.npm-global/bin:$PATH + ``` + + Reload your shell (`source ~/.zshrc` or open a new terminal) and try again. + + + + Claude Code requires Node.js 18 or higher. If you see this error at startup: + + ``` + Error: Claude Code requires Node.js version 18 or higher. + ``` + + Upgrade Node.js using your version manager: + + ```bash theme={null} + # nvm + nvm install --lts + nvm use --lts + + # fnm + fnm install --lts + fnm use --lts + ``` + + Or download the latest LTS release from [nodejs.org](https://nodejs.org). + + + + Do not use `sudo npm install -g` — it can leave files owned by root and cause further issues. Instead, fix your npm prefix to point to a user-writable directory: + + ```bash theme={null} + mkdir -p ~/.npm-global + npm config set prefix ~/.npm-global + export PATH=~/.npm-global/bin:$PATH + npm install -g @anthropic-ai/claude-code + ``` + + Add the `export PATH` line to your shell profile so it persists across sessions. + + + + If the browser-based OAuth flow fails or you cannot use a browser, set your API key directly as an environment variable instead: + + ```bash theme={null} + export ANTHROPIC_API_KEY=sk-ant-... + claude + ``` + + You can add this to your shell profile to make it permanent. API keys are available in the [Anthropic Console](https://console.anthropic.com). + + + + In non-interactive environments, authenticate with an API key via the environment variable: + + ```bash theme={null} + export ANTHROPIC_API_KEY=sk-ant-... + ``` + + Use the `-p` flag to run non-interactively: + + ```bash theme={null} + claude -p "run the test suite and report any failures" + ``` + + If you need Claude Code to operate without permission prompts in a sandboxed container, use the `--dangerously-skip-permissions` flag. This flag only works in environments that pass Claude Code's sandbox safety checks (no internet access and not running as root outside a container). + + + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/introduction.md b/docs/claude-code-docs-main/en/introduction.md new file mode 100644 index 0000000..0eb9c51 --- /dev/null +++ b/docs/claude-code-docs-main/en/introduction.md @@ -0,0 +1,103 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Introduction + +> Claude Code is an AI coding agent that runs in your terminal — reading, editing, and executing code across your entire codebase. + +Claude Code is a terminal-based AI agent built on Claude. It has direct access to your filesystem, shell, and tools, so you can describe a task in plain language and Claude handles the implementation end-to-end — no copy-pasting, no context switching. + +## What Claude Code can do + + + + Claude reads source files, writes new content, and makes targeted edits. It shows diffs before applying changes so you stay in control. + + + + Execute tests, build scripts, git operations, and any shell command — with configurable permission controls to keep you safe. + + + + Find files by glob pattern, search content with regular expressions, and navigate large codebases without reading every file manually. + + + + Pull documentation, read API specs, or search the web — all without leaving your terminal session. + + + + Break complex tasks into parallel workstreams. Claude can spin up and coordinate multiple agents to work on different parts of a problem simultaneously. + + + + Extend Claude's capabilities with Model Context Protocol servers for databases, APIs, internal tools, and more. + + + +## Permission system + +Every tool use in Claude Code goes through a permission check. You control how much autonomy Claude has. + +| Mode | Behavior | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| `default` | Claude asks before running shell commands and making edits. You approve or deny each action. | +| `acceptEdits` | File edits are applied automatically. Shell commands still require approval. | +| `plan` | Claude produces a plan and asks for your sign-off before taking any action. Good for reviewing large changes before they happen. | +| `bypassPermissions` | All actions run without prompts. Intended for automated pipelines in sandboxed environments — not for interactive use. | + + + `bypassPermissions` mode disables all confirmation prompts. Only use it in isolated environments (Docker containers, CI sandboxes) where Claude cannot affect systems outside the task. + + +Set your permission mode with the `--permission-mode` flag when starting Claude, or change it with `/permissions` which also lets you manage allow/deny rules for specific tools: + +```bash theme={null} +claude --permission-mode acceptEdits +``` + +## CLAUDE.md memory system + +Claude Code reads `CLAUDE.md` files from your repository at the start of every session. These files let you encode project-specific knowledge — build commands, coding conventions, architecture notes, required environment variables — so Claude doesn't need to re-discover them from scratch every time. + +There are three scopes: + +* **Project** (`CLAUDE.md` at the repo root) — shared by everyone on the team, checked into source control. +* **Personal** (`CLAUDE.local.md` at the repo root) — your private preferences for this project, gitignored. +* **Subdirectory** (`CLAUDE.md` inside a subdirectory) — loaded automatically when Claude works in that directory. Useful for monorepos with distinct modules. + +Run `/init` inside any Claude Code session to generate a `CLAUDE.md` for your project automatically. Claude analyzes your codebase and produces a file with the commands and context that matter most. + +```bash theme={null} +# Inside a Claude Code session +/init +``` + + + Keep `CLAUDE.md` concise. Every line should pass this test: "Would removing this cause Claude to make mistakes?" If not, cut it. + + +## Authentication + +Claude Code authenticates in two ways: + +1. **OAuth (recommended)** — Sign in with your Anthropic account at `claude.ai`. Run `claude` for the first time and follow the browser prompt. +2. **API key** — Set the `ANTHROPIC_API_KEY` environment variable. Useful for CI pipelines and non-interactive sessions. + +See [Authentication](/guides/authentication) for the full priority order and cloud provider options (AWS Bedrock, GCP Vertex AI). + +## Ready to get started? + + + + Get Claude Code running in under 5 minutes + + + + Detailed installation instructions for all platforms + + + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/quickstart.md b/docs/claude-code-docs-main/en/quickstart.md new file mode 100644 index 0000000..3a63075 --- /dev/null +++ b/docs/claude-code-docs-main/en/quickstart.md @@ -0,0 +1,166 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Quickstart + +> Install Claude Code, authenticate, and complete your first coding task in under 5 minutes. + +## Prerequisites + +* Node.js 18 or higher +* npm + +To check your Node.js version: + +```bash theme={null} +node --version +``` + +If you need to install or upgrade Node.js, download it from [nodejs.org](https://nodejs.org). + +*** + +## Step 1: Install Claude Code + +Install the package globally with npm: + +```bash theme={null} +npm install -g @anthropic-ai/claude-code +``` + +Verify the installation: + +```bash theme={null} +claude --version +``` + +*** + +## Step 2: Authenticate + +Run `claude` from any directory to start the first-time setup: + +```bash theme={null} +claude +``` + +On first run, Claude Code opens your browser and walks you through signing in with your Anthropic account. Once complete, your credentials are stored securely and reused for future sessions. + +**Alternatively**, set an API key directly if you prefer not to use OAuth: + +```bash theme={null} +export ANTHROPIC_API_KEY=sk-ant-... +``` + + + API keys take priority when the `ANTHROPIC_API_KEY` environment variable is set. For interactive use, OAuth is recommended because it handles token refresh automatically. + + +*** + +## Step 3: Navigate to your project + +Claude Code works within your current directory. Navigate to any project you want to work on: + +```bash theme={null} +cd my-project +``` + +*** + +## Step 4: Start an interactive session + +Run `claude` to open an interactive session: + +```bash theme={null} +claude +``` + +You'll see a prompt where you can type tasks in plain language. Claude reads your project files, runs commands, and makes changes based on what you describe. + +**Example first tasks to try:** + +``` +> explain the structure of this codebase +> add input validation to the signup form +> write tests for the UserService class +> find all places where we catch and swallow errors +``` + +Claude shows you what it plans to do before making changes that require permission. You can approve, deny, or ask for a different approach at each step. + +*** + +## Step 5: Initialize a CLAUDE.md file + +Run `/init` inside your session to generate a `CLAUDE.md` file for your project: + +``` +/init +``` + +Claude analyzes your repository — reading manifest files, existing documentation, and code structure — and produces a `CLAUDE.md` with the commands and context it needs to work effectively in your codebase. You should review and edit the generated file before committing it. + + + `CLAUDE.md` is loaded at the start of every session. It's the best place to capture things like non-standard build commands, testing quirks, and coding conventions specific to your team. + + +*** + +## Running a non-interactive command + +Use the `-p` flag to run a single task and print the result, without entering an interactive session. This is useful for scripting or one-off queries: + +```bash theme={null} +claude -p "explain this codebase" +``` + +```bash theme={null} +claude -p "list all TODO comments and the files they appear in" +``` + +```bash theme={null} +claude -p "check for unused exports in src/" +``` + +*** + +## Key slash commands + +Once you're inside an interactive session, these slash commands are the most useful to know: + +| Command | Description | +| -------------- | ----------------------------------------------------------- | +| `/help` | Show available commands and keyboard shortcuts | +| `/init` | Generate or update a `CLAUDE.md` for the current project | +| `/memory` | View and edit memory files (`CLAUDE.md`, `CLAUDE.local.md`) | +| `/permissions` | View or change the current permission mode | +| `/mcp` | Manage connected MCP servers | +| `/clear` | Clear the current conversation context | +| `/exit` | End the session | + +*** + +## Next steps + + + + Understand how Claude Code thinks, plans, and acts on tasks + + + + Learn how to configure how much autonomy Claude has + + + + Write effective memory files for your projects + + + + Extend Claude with databases, APIs, and internal tools + + + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/commands/cli-flags.md b/docs/claude-code-docs-main/en/reference/commands/cli-flags.md new file mode 100644 index 0000000..37fe112 --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/commands/cli-flags.md @@ -0,0 +1,517 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# CLI flags + +> All options you can pass when launching Claude Code from the terminal. Run claude --help to see the full list. + +Pass CLI flags when you launch Claude Code: + +```bash theme={null} +claude [flags] [prompt] +``` + +Run `claude --help` to see all available flags in your installed version. + + + Flags that configure session behavior (like `--model` and `--permission-mode`) can also be changed mid-session with the corresponding slash commands: `/model` and `/permissions`. + + +*** + +## Core flags + + + + Run Claude non-interactively. Claude processes the prompt (from the argument or stdin), prints the response, and exits. No REPL is started. + + ```bash theme={null} + claude -p "explain the main function in src/index.ts" + echo "what does this do?" | claude -p + ``` + + + The workspace trust dialog is skipped in `--print` mode. Only use this flag in directories you trust. + + + Works with: `--output-format`, `--model`, `--system-prompt`, `--permission-mode`, `--max-turns`, `--allowed-tools`. + + + + Set the output format. Only works with `--print`. + + | Value | Description | + | ------------- | --------------------------------------------------- | + | `text` | Plain text output (default) | + | `json` | Single JSON object with the complete result | + | `stream-json` | Newline-delimited JSON stream with real-time events | + + ```bash theme={null} + claude -p "list the exported functions" --output-format json + claude -p "refactor this file" --output-format stream-json + ``` + + Use `stream-json` when you want to process Claude's output incrementally as it arrives (useful for long-running tasks or piping into other tools). + + + + Set the input format for stdin. Only works with `--print`. + + | Value | Description | + | ------------- | ----------------------------------- | + | `text` | Plain text input (default) | + | `stream-json` | Newline-delimited JSON stream input | + + `stream-json` input requires `--output-format stream-json`. + + ```bash theme={null} + cat messages.jsonl | claude -p --input-format stream-json --output-format stream-json + ``` + + + + Enable verbose output. Overrides the `verbose` setting in your config file. + + ```bash theme={null} + claude --verbose + claude -p "debug this" --verbose + ``` + + + + Print the version number and exit. + + ```bash theme={null} + claude --version + claude -v + ``` + + + + Display help for the command and exit. + + ```bash theme={null} + claude --help + claude mcp --help + ``` + + + +*** + +## Session continuation flags + + + + Resume the most recent conversation in the current directory without prompting for a session to resume. + + ```bash theme={null} + claude --continue + claude -c "now add tests for that" + ``` + + + + Resume a conversation by session ID. Without a value, opens an interactive picker where you can search through past sessions. Accepts an optional search term to filter the list. + + ```bash theme={null} + # Open interactive picker + claude --resume + + # Resume by session ID + claude --resume 550e8400-e29b-41d4-a716-446655440000 + + # Open picker filtered by search term + claude --resume "auth refactor" + ``` + + + + When used with `--continue` or `--resume`, creates a new session branched from the resumed conversation rather than continuing it in place. + + ```bash theme={null} + claude --resume --fork-session + ``` + + + + Set a display name for the session. The name appears in `/resume` and in the terminal title. + + ```bash theme={null} + claude --name "auth-refactor" + ``` + + + + Use a specific UUID as the session ID instead of a generated one. Must be a valid UUID. Cannot be used with `--continue` or `--resume` unless `--fork-session` is also specified. + + ```bash theme={null} + claude --session-id 550e8400-e29b-41d4-a716-446655440000 + ``` + + + + Disable session persistence. The session will not be saved to disk and cannot be resumed. Only works with `--print`. + + ```bash theme={null} + claude -p "one-off task" --no-session-persistence + ``` + + + +*** + +## Model and capability flags + + + + Set the model for the session. Accepts an alias (e.g. `sonnet`, `opus`, `haiku`) or a full model ID (e.g. `claude-sonnet-4-6`). + + ```bash theme={null} + claude --model sonnet + claude --model opus + claude --model claude-sonnet-4-6 + ``` + + You can also change the model mid-session with `/model`. + + + + Set the effort level for the session. Controls how much computation Claude applies to each response. + + | Value | Description | + | -------- | ------------------------- | + | `low` | Faster, lighter responses | + | `medium` | Balanced (default) | + | `high` | More thorough reasoning | + | `max` | Maximum effort | + + ```bash theme={null} + claude --effort high "review this architecture" + ``` + + + + Enable automatic fallback to a different model when the primary model is overloaded. Only works with `--print`. + + ```bash theme={null} + claude -p "analyze this" --model opus --fallback-model sonnet + ``` + + + +*** + +## Permission and safety flags + + + + Set the permission mode for the session. + + | Mode | Behavior | + | ------------------- | ------------------------------------------------------------------------------------ | + | `default` | Claude prompts before running commands and making edits | + | `acceptEdits` | File edits are applied automatically; shell commands still require approval | + | `plan` | Claude proposes a plan and waits for your approval before acting | + | `bypassPermissions` | All actions run without prompts — intended for sandboxed automated environments only | + + ```bash theme={null} + claude --permission-mode acceptEdits + claude --permission-mode plan "refactor the payment module" + claude --permission-mode bypassPermissions # only in isolated sandboxes + ``` + + + `bypassPermissions` disables all confirmation prompts. Only use it inside Docker containers, CI sandboxes, or other isolated environments with no internet access. + + + + + Bypass all permission checks. Claude takes all actions (file edits, shell commands) without asking. Equivalent to `--permission-mode bypassPermissions`. + + ```bash theme={null} + claude --dangerously-skip-permissions -p "run the full test suite and fix failures" + ``` + + + Only use this in sandboxed environments with no internet access. Claude Code enforces this: the flag is rejected when running with root/sudo privileges, or outside a Docker or bubblewrap container. + + + + + Make bypassing all permission checks available as an option during the session, without enabling it by default. Useful for automated pipelines that may need to escalate mid-session. + + ```bash theme={null} + claude --allow-dangerously-skip-permissions -p "..." + ``` + + + + **Aliases:** `--allowedTools` + + Comma- or space-separated list of tools Claude is allowed to use. Tools not in this list are blocked. + + ```bash theme={null} + claude --allowed-tools "Bash(git:*) Edit Read" + claude --allowed-tools Bash,Edit,Read + ``` + + Tool patterns support glob-style matching: `Bash(git:*)` permits any git command; `Edit(src/**)` permits edits under `src/`. + + + + **Aliases:** `--disallowedTools` + + Comma- or space-separated list of tools Claude is not allowed to use. + + ```bash theme={null} + claude --disallowed-tools "Bash(rm:*)" + ``` + + + + Specify the exact set of built-in tools available for the session. Use `""` to disable all tools, `default` to enable all tools, or name specific tools. + + ```bash theme={null} + # Disable all tools + claude --tools "" + + # Enable only Bash and Read + claude --tools "Bash Read" + + # Enable the default set + claude --tools default + ``` + + + +*** + +## Context and prompt flags + + + + Add one or more directories to the tool access context. Claude will be able to read and edit files in these directories in addition to the current working directory. + + ```bash theme={null} + claude --add-dir /shared/libs --add-dir /shared/config + ``` + + Useful for monorepos or projects where related code lives outside the current directory. + + + + Override the default system prompt with a custom prompt. Cannot be used with `--system-prompt-file`. + + ```bash theme={null} + claude --system-prompt "You are a security auditor. Focus only on vulnerabilities." + ``` + + + + Append text to the default system prompt. Unlike `--system-prompt`, this preserves Claude's built-in instructions and adds to them. + + ```bash theme={null} + claude --append-system-prompt "Always suggest test cases for every function you write." + ``` + + + + Load MCP servers from one or more JSON config files or inline JSON strings. Multiple values are space-separated. + + ```bash theme={null} + # Load from a file + claude --mcp-config ./mcp-servers.json + + # Load from multiple files + claude --mcp-config ./local-tools.json ./db-tools.json + + # Pass inline JSON + claude --mcp-config '{"mcpServers":{"filesystem":{"command":"npx","args":["@modelcontextprotocol/server-filesystem","/tmp"]}}}' + ``` + + See the [MCP servers guide](/guides/mcp-servers) for the config file format. + + + + Only use MCP servers from `--mcp-config`, ignoring all other MCP configurations (user config, project config, etc.). + + ```bash theme={null} + claude --mcp-config ./ci-tools.json --strict-mcp-config + ``` + + + + Load additional settings from a JSON file path or an inline JSON string. + + ```bash theme={null} + # From a file + claude --settings ./team-settings.json + + # Inline JSON + claude --settings '{"model":"claude-sonnet-4-6","verbose":true}' + ``` + + + + Comma-separated list of settings sources to load. Controls which settings files are read at startup. + + | Value | Description | + | --------- | ----------------------------------------------------------- | + | `user` | Load `~/.claude/settings.json` | + | `project` | Load `.claude/settings.json` in the current directory | + | `local` | Load `.claude/settings.local.json` in the current directory | + + ```bash theme={null} + # Load only user-level settings (ignore project settings) + claude --setting-sources user + + # Load user and project settings + claude --setting-sources user,project + ``` + + + + Define custom agents inline as a JSON object. Each key is the agent name; the value is an object with `description` and `prompt`. + + ```bash theme={null} + claude --agents '{"reviewer":{"description":"Reviews code for security issues","prompt":"You are a security-focused code reviewer."}}' + ``` + + + +*** + +## Output control flags + + + + Include all hook lifecycle events in the output stream. Only works with `--output-format stream-json`. + + ```bash theme={null} + claude -p "run task" --output-format stream-json --include-hook-events + ``` + + + + Limit the number of agentic turns in non-interactive mode. Claude stops after this many turns even if the task is incomplete. Only works with `--print`. + + ```bash theme={null} + claude -p "refactor this module" --max-turns 10 + ``` + + + + Set a maximum dollar amount to spend on API calls. Claude stops when the budget is reached. Only works with `--print`. + + ```bash theme={null} + claude -p "large analysis task" --max-budget-usd 2.50 + ``` + + + + Provide a JSON Schema for structured output validation. Claude's response will be validated against this schema. + + ```bash theme={null} + claude -p "extract the function names" \ + --output-format json \ + --json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}' + ``` + + + +*** + +## Worktree flags + + + + Create a new git worktree for this session. Optionally specify a name for the worktree branch. Accepts a PR number or GitHub PR URL to create a worktree from that PR. + + ```bash theme={null} + claude --worktree + claude --worktree feature-auth + claude --worktree "#142" + ``` + + + + Create a tmux session alongside the worktree. Requires `--worktree`. Uses iTerm2 native panes when available; pass `--tmux=classic` to force standard tmux behavior. + + ```bash theme={null} + claude --worktree feature-auth --tmux + ``` + + + +*** + +## Debug flags + + + + Enable debug mode. Optionally pass a filter to restrict which debug categories are shown. + + ```bash theme={null} + # Show all debug output + claude --debug + + # Show only api and hooks categories + claude --debug "api,hooks" + + # Exclude specific categories + claude --debug "!file,!1p" + ``` + + + + Write debug logs to a specific file path instead of displaying them inline. Implicitly enables debug mode. + + ```bash theme={null} + claude --debug-file /tmp/claude-debug.log + ``` + + + + Minimal mode. Skips hooks, LSP, plugin sync, attribution, auto-memory, background prefetches, keychain reads, and `CLAUDE.md` auto-discovery. Sets `CLAUDE_CODE_SIMPLE=1`. + + Authentication is limited to `ANTHROPIC_API_KEY` or `apiKeyHelper` via `--settings` (OAuth and keychain are not used). + + Use `--bare` in scripted pipelines where startup latency matters and the features it disables are not needed. You can still provide context explicitly: + + ```bash theme={null} + claude --bare \ + --system-prompt "$(cat context.md)" \ + --add-dir /project/libs \ + --mcp-config ./tools.json \ + -p "perform the analysis" + ``` + + + +*** + +## Flag combinations + +Common flag patterns for scripting and automation: + +```bash theme={null} +# Non-interactive with JSON output +claude -p "list all exported types" --output-format json + +# Bypass permissions in CI (sandboxed environment only) +claude -p "run full test suite and fix failures" --dangerously-skip-permissions + +# Resume last session and continue non-interactively +claude --continue -p "now write the tests for that" + +# Use a custom MCP config with strict isolation +claude --mcp-config ./ci-mcp.json --strict-mcp-config -p "analyze the schema" + +# Append to system prompt without replacing it +claude --append-system-prompt "Always output TypeScript, not JavaScript." +``` + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/commands/overview.md b/docs/claude-code-docs-main/en/reference/commands/overview.md new file mode 100644 index 0000000..c0c26a2 --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/commands/overview.md @@ -0,0 +1,106 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Commands overview + +> Claude Code accepts two categories of commands: CLI flags you pass at launch, and slash commands you type during a session. + +Claude Code has two categories of commands: + +* **CLI flags** — options you pass when starting Claude from your terminal (e.g. `claude --model sonnet`). They configure the session before it starts. +* **Slash commands** — text commands you type inside an active session (e.g. `/help`). They control Claude's behavior while the session is running. + +## Getting help + +```bash theme={null} +# Show all CLI flags +claude --help + +# Inside a session, list slash commands +/help +``` + +`/help` lists every slash command available in the current session, including commands added by plugins and skills. + +## Two types of commands + +| Type | When to use | Example | +| -------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------ | +| CLI flags | Configure a session at launch — set the model, output format, permission mode | `claude --permission-mode acceptEdits "fix the tests"` | +| Slash commands | Interact with a running session — manage memory, switch models, commit code | `/commit` | + +CLI flags are consumed once and cannot be changed mid-session (with the exception of `/model` and `/permissions`, which change the running configuration in place). + +## CLI flags + +Pass flags directly after `claude`: + +```bash theme={null} +claude [flags] [prompt] +``` + +```bash theme={null} +# Non-interactive: print response and exit +claude -p "summarize this file" < README.md + +# Set model for the session +claude --model opus + +# Accept all file edits automatically +claude --permission-mode acceptEdits +``` + +See [CLI flags](/reference/commands/cli-flags) for the full list. + +## Slash commands + +Type a slash command at the input prompt inside any session: + +``` +/command [arguments] +``` + +``` +/init +/compact summarize only the last three tasks +/model claude-opus-4-5 +``` + +See [Slash commands](/reference/commands/slash-commands) for the full list. + +## Keyboard shortcuts + +These shortcuts work inside any interactive Claude Code session: + +| Key | Action | +| ------------- | ---------------------------------------------------------------- | +| `Ctrl+C` | Interrupt the current response (Claude stops mid-turn) | +| `Ctrl+D` | Exit Claude Code | +| `Ctrl+L` | Clear the terminal display (does not clear conversation history) | +| `Up` / `Down` | Navigate input history | +| `Tab` | Autocomplete slash command names | +| `Escape` | Cancel an in-progress permission prompt | + + + `Ctrl+C` interrupts the current response but keeps the conversation alive. Use `Ctrl+D` or `/exit` to end the session entirely. + + +## Subcommands + +In addition to the main `claude` command, a few subcommands are available in your terminal: + +| Subcommand | Description | +| ------------------ | ---------------------------------------------- | +| `claude mcp` | Configure and manage MCP servers | +| `claude mcp serve` | Start Claude Code as an MCP server | +| `claude doctor` | Diagnose installation and configuration issues | +| `claude update` | Update Claude Code to the latest version | + +```bash theme={null} +claude mcp --help +claude doctor +``` + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/commands/slash-commands.md b/docs/claude-code-docs-main/en/reference/commands/slash-commands.md new file mode 100644 index 0000000..fcea739 --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/commands/slash-commands.md @@ -0,0 +1,381 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Slash commands + +> Commands you type inside a running Claude Code session. Type / at the input prompt to activate them. + +Slash commands are typed at the Claude Code input prompt during an active session. Every command starts with `/`. + +``` +/command [arguments] +``` + + + Type `/help` at any time to see all commands available in the current session, including any added by plugins and skills. + + +## Quick reference + +| Command | Description | +| ------------------------------ | -------------------------------------------------------------------- | +| [`/init`](#init) | Generate `CLAUDE.md` files and optional skills/hooks for the project | +| [`/memory`](#memory) | Edit Claude memory files (global, project, local) | +| [`/config`](#config) | Open the settings panel | +| [`/hooks`](#hooks) | View hook configurations for tool events | +| [`/mcp`](#mcp) | Manage MCP servers — enable, disable, reconnect | +| [`/permissions`](#permissions) | Manage allow and deny rules for tools | +| [`/plan`](#plan) | Enable plan mode or open/describe the current session plan | +| [`/model`](#model) | Set the AI model for the current session | +| [`/commit`](#commit) | Create a git commit with an AI-generated message | +| [`/review`](#review) | Review a pull request | +| [`/skills`](#skills) | List available skills | +| [`/compact`](#compact) | Summarize conversation history to reduce context usage | +| [`/clear`](#clear) | Clear conversation history and free up context | +| [`/help`](#help) | Show help and available commands | +| [`/login`](#login) | Sign in or switch Anthropic accounts | +| [`/logout`](#logout) | Sign out from your Anthropic account | + +*** + +## Project and memory commands + + + + **Syntax:** `/init` + + Analyzes your codebase and sets up `CLAUDE.md` file(s), and optionally skills and hooks. Claude surveys key project files — manifests, CI config, build scripts, README — then interviews you to fill in any gaps before writing the output files. + + What it sets up, depending on your choices: + + * **Project `CLAUDE.md`** — team-shared instructions checked into source control. Covers build/test/lint commands, coding conventions, architecture notes, and non-obvious gotchas. + * **Personal `CLAUDE.local.md`** — your private preferences for this project (gitignored). Covers your role, sandbox URLs, communication preferences. + * **Skills** (`.claude/skills//SKILL.md`) — on-demand workflows you or Claude invoke with `/`. + * **Hooks** (`.claude/settings.json`) — deterministic shell commands that run automatically on tool events (e.g. format on every edit). + + **Example:** + + ``` + /init + ``` + + + Run `/init` again at any time. If `CLAUDE.md` already exists, Claude will propose specific changes rather than overwriting the file. + + + + + **Syntax:** `/memory` + + Opens an interactive editor for Claude's memory files. Memory files are loaded into every session and persist across conversations. + + The three memory scopes are: + + | Scope | File | Who it applies to | + | ------- | --------------------------------- | --------------------------------------- | + | Global | `~/.claude/CLAUDE.md` | You, across all projects | + | Project | `CLAUDE.md` at project root | Everyone on the team | + | Local | `CLAUDE.local.md` at project root | You, for this project only (gitignored) | + + **Example:** + + ``` + /memory + ``` + + + +*** + +## Configuration commands + + + + **Syntax:** `/config` + + **Alias:** `/settings` + + Opens the configuration panel where you can view and edit Claude Code settings, including model preferences, theme, verbose mode, and more. + + **Example:** + + ``` + /config + ``` + + + + **Syntax:** `/hooks` + + Displays the hook configurations currently active for this session. Hooks are shell commands that run automatically when tool events occur (e.g. after every file edit, before a Bash command). + + **Example:** + + ``` + /hooks + ``` + + + To create or edit hooks, use `/init` or edit `.claude/settings.json` directly. See the [hooks guide](/guides/hooks) for the full schema. + + + + + **Syntax:** `/mcp [enable|disable [server-name]]` + + Manages MCP (Model Context Protocol) servers for the current session. Without arguments, opens the MCP management panel. With arguments, enables or disables specific servers. + + | Argument | Effect | + | ------------------------- | --------------------------------- | + | *(none)* | Open the MCP management panel | + | `enable` | Enable all disabled MCP servers | + | `enable ` | Enable a specific server by name | + | `disable` | Disable all active MCP servers | + | `disable ` | Disable a specific server by name | + | `reconnect ` | Reconnect to a specific server | + + **Examples:** + + ``` + /mcp + /mcp enable + /mcp enable my-database-server + /mcp disable analytics-server + /mcp reconnect filesystem + ``` + + + To add or remove MCP servers permanently, use the `claude mcp` CLI subcommand or edit your MCP config file. Changes made with `/mcp enable`/`disable` apply for the current session only. + + + + + **Syntax:** `/permissions` + + **Alias:** `/allowed-tools` + + Opens the permissions panel where you can view and manage allow and deny rules for tools. Rules control which tools Claude can use without prompting (allow rules) and which are blocked entirely (deny rules). + + **Example:** + + ``` + /permissions + ``` + + Rules use glob-style patterns: + + ``` + Bash(git:*) # allow all git commands + Bash(npm:*) # allow all npm commands + Edit(src/**/*.ts) # allow edits to TypeScript files in src/ + ``` + + See [permissions](/concepts/permissions) for the full rule syntax. + + + + **Syntax:** `/model [model]` + + Sets the AI model used for the rest of the session. Without an argument, opens an interactive model picker. With a model name or alias, switches immediately. + + | Argument | Effect | + | ------------------- | ------------------------------------- | + | *(none)* | Open the interactive model picker | + | `sonnet` | Switch to the latest Claude Sonnet | + | `opus` | Switch to the latest Claude Opus | + | `haiku` | Switch to the latest Claude Haiku | + | `claude-sonnet-4-6` | Switch to a specific model by full ID | + + **Examples:** + + ``` + /model + /model sonnet + /model claude-opus-4-5 + ``` + + + +*** + +## Session management commands + + + + **Syntax:** `/plan [open|]` + + Enables plan mode or manages the current session plan. In plan mode, Claude produces a written plan before taking any action and waits for your approval. + + | Argument | Effect | + | --------------- | -------------------------------------------- | + | *(none)* | Toggle plan mode on/off | + | `open` | Open and display the current plan | + | `` | Create a new plan with the given description | + + **Examples:** + + ``` + /plan + /plan open + /plan refactor the auth module to use JWT + ``` + + + Plan mode is equivalent to `--permission-mode plan` at launch. Use it when you want to review what Claude intends to do before any files are touched. + + + + + **Syntax:** `/compact [instructions]` + + Summarizes the conversation history and replaces it with a condensed version in context. Use this when the context window is filling up and you want to continue working without starting a new session. + + An optional argument lets you give Claude specific instructions for how to summarize. + + **Examples:** + + ``` + /compact + /compact focus only on the database schema changes + /compact summarize the last three completed tasks + ``` + + + + **Syntax:** `/clear` + + **Aliases:** `/reset`, `/new` + + Clears the entire conversation history and frees up context, starting a fresh session in the same working directory. Unlike `/compact`, this removes all history rather than summarizing it. + + **Example:** + + ``` + /clear + ``` + + + + **Syntax:** `/skills` + + Lists all skills available in the current session. Skills are on-demand capabilities defined in `.claude/skills/` that you or Claude can invoke with `/`. + + **Example:** + + ``` + /skills + ``` + + + +*** + +## Git commands + + + + **Syntax:** `/commit` + + Creates a git commit using AI-generated commit message. Claude reads the current git status and diff, analyzes staged and unstaged changes, and drafts a concise commit message that focuses on the "why" rather than the "what". It then stages the relevant files and creates the commit. + + Claude follows the existing commit message style in the repository and applies these safety rules: + + * Never amends existing commits (always creates a new commit) + * Never skips hooks (`--no-verify`) + * Never commits files that likely contain secrets (`.env`, credentials files) + * Does not create empty commits when there are no changes + + **Example:** + + ``` + /commit + ``` + + + `/commit` only has access to `git add`, `git status`, and `git commit`. It cannot push, rebase, or run other git operations. + + + + + **Syntax:** `/review [PR-number]` + + Runs an AI code review on a pull request using the GitHub CLI (`gh`). Without a PR number, Claude runs `gh pr list` to show open PRs. With a PR number, it fetches the PR details and diff, then provides a structured review covering: + + * Overview of what the PR does + * Code quality and style analysis + * Specific improvement suggestions + * Potential issues or risks + * Performance, test coverage, and security considerations + + **Examples:** + + ``` + /review + /review 142 + ``` + + + `/review` requires the [GitHub CLI](https://cli.github.com/) (`gh`) to be installed and authenticated. + + + + +*** + +## Account and help commands + + + + **Syntax:** `/help` + + Shows help and lists all slash commands available in the current session, including built-in commands, skill commands, and any commands added by installed plugins. + + **Example:** + + ``` + /help + ``` + + + + **Syntax:** `/login` + + Signs in to your Anthropic account or switches between accounts. Opens a browser-based OAuth flow if not already authenticated, or presents the account switcher if you are. + + **Example:** + + ``` + /login + ``` + + + + **Syntax:** `/logout` + + Signs out from your Anthropic account. After logging out, Claude Code will prompt you to authenticate again on the next session. + + **Example:** + + ``` + /logout + ``` + + + +*** + +## Custom skill commands + +When you or a plugin author creates a skill in `.claude/skills//SKILL.md`, it becomes available as `/` in any session where that skill is loaded. + +``` +/verify +/deploy staging +/fix-issue 123 +``` + +Run `/skills` to see all loaded skills and their descriptions. See the [skills guide](/guides/skills) for how to create your own. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/sdk/hooks-reference.md b/docs/claude-code-docs-main/en/reference/sdk/hooks-reference.md new file mode 100644 index 0000000..dac4777 --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/sdk/hooks-reference.md @@ -0,0 +1,935 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Hooks reference + +> Full reference for every hook event, its input payload, output schema, and the effect each exit code has on Claude's behavior. + +Hooks are shell commands, HTTP endpoints, LLM prompts, or in-process callbacks that fire at defined points in Claude's agentic loop. They let you inject logic before or after tool calls, intercept permission requests, react to session lifecycle events, and more. + +## Configuration + +Hooks are configured in any Claude Code settings file. The top-level `hooks` key maps event names to an array of matcher objects. + +```json theme={null} +{ + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "echo 'About to run bash command' >&2" + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Write", + "hooks": [ + { + "type": "command", + "command": "/usr/local/bin/lint-changed-file '$TOOL_INPUT'" + } + ] + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "notify-send 'Claude finished'" + } + ] + } + ] + } +} +``` + +### Settings file locations + +| Scope | Path | Priority | +| ------- | ----------------------------- | -------- | +| User | `~/.claude/settings.json` | Low | +| Project | `.claude/settings.json` | Medium | +| Local | `.claude/settings.local.json` | High | + +Higher-priority settings files take precedence. All hooks across all files run; they are not overridden. + +### Matcher configuration + + + A string pattern that filters when these hooks run. The field matched depends on the event: + + * `PreToolUse` / `PostToolUse` / `PostToolUseFailure` / `PermissionRequest` / `PermissionDenied` — matched against `tool_name` + * `Notification` — matched against `notification_type` + * `SessionStart` — matched against `source` (`startup`, `resume`, `clear`, `compact`) + * `Setup` — matched against `trigger` (`init`, `maintenance`) + * `SubagentStart` / `SubagentStop` — matched against `agent_type` + * `PreCompact` / `PostCompact` — matched against `trigger` (`manual`, `auto`) + * `StopFailure` — matched against `error` + * `ConfigChange` — matched against `source` + * `InstructionsLoaded` — matched against `load_reason` + * `Elicitation` / `ElicitationResult` — matched against `mcp_server_name` + * `FileChanged` — matched against filenames (e.g., `".envrc|.env"`) + + Omit `matcher` to run the hook for all instances of the event. + + + + One or more hook definitions to execute when the matcher fires. + + +*** + +## Hook types + +### `command` — shell command + +```json theme={null} +{ + "type": "command", + "command": "jq '.tool_name' && my-validator", + "timeout": 30, + "shell": "bash", + "async": false, + "once": false, + "if": "Bash(git *)", + "statusMessage": "Validating command..." +} +``` + +The hook input JSON is piped to the command's stdin. The `CLAUDE_ENV_FILE` environment variable is set for `CwdChanged` and `FileChanged` hooks — write `export KEY=value` lines there to inject environment variables into subsequent Bash tool calls. + + + Shell command to execute. + + + + Timeout in seconds. Defaults to the global hook timeout (60 s). + + + + Shell interpreter. `bash` uses your `$SHELL` (bash/zsh/sh). Defaults to `bash`. + + + + When `true`, the hook runs in the background without blocking Claude. Output is ignored. + + + + When `true`, the hook runs in the background but wakes the model if it exits with code 2. Implies `async: true`. + + + + When `true`, the hook runs once and is removed from the configuration after execution. + + + + Permission rule syntax (e.g., `"Bash(git *)"`) evaluated against the hook input. The hook is skipped if the condition does not match. Avoids spawning processes for non-matching tool calls. + + + + Custom message shown in the spinner while the hook runs. + + +### `prompt` — LLM evaluation + +```json theme={null} +{ + "type": "prompt", + "prompt": "Check whether this bash command is safe: $ARGUMENTS", + "model": "claude-haiku-4-5", + "timeout": 30 +} +``` + +The `$ARGUMENTS` placeholder is replaced with the hook input JSON. The model's response is treated as the hook output. + + + Prompt sent to the model. Use `$ARGUMENTS` to embed the hook input. + + + + Model to use. Defaults to the small fast model. + + +### `agent` — agentic verifier + +```json theme={null} +{ + "type": "agent", + "prompt": "Verify that unit tests ran and passed.", + "model": "claude-haiku-4-5", + "timeout": 120 +} +``` + +Runs a short agentic loop that can call tools to verify the action. Use for `PostToolUse` hooks where you want the verifier to read files or run commands. + + + Verification prompt. Use `$ARGUMENTS` to embed the hook input. + + +### `http` — HTTP endpoint + +```json theme={null} +{ + "type": "http", + "url": "https://my-server.example.com/hook", + "headers": { + "Authorization": "Bearer $MY_TOKEN" + }, + "allowedEnvVars": ["MY_TOKEN"], + "timeout": 10 +} +``` + +POSTs the hook input JSON to the given URL. Header values can reference environment variables using `$VAR_NAME` syntax, but only variables listed in `allowedEnvVars` are interpolated. + + + URL to POST the hook input JSON to. + + + + Additional request headers. + + + + Environment variable names that may be interpolated in header values. + + +*** + +## Base hook input + +Every hook receives a JSON object on stdin with these fields present for all event types. + + + The event that fired (e.g., `"PreToolUse"`). + + + + Current session identifier. + + + + Absolute path to the JSONL transcript file for this session. + + + + Current working directory at the time the hook fired. + + + + Active permission mode (`"default"`, `"acceptEdits"`, `"bypassPermissions"`, `"plan"`, `"dontAsk"`). + + + + Subagent identifier. Present only when the hook fires from within a subagent. Use this field to distinguish subagent calls from main-thread calls. + + + + Agent type name (e.g., `"general-purpose"`, `"code-reviewer"`). Present when the hook fires from a subagent, or on the main thread of a session started with `--agent`. + + +*** + +## Sync hook output (JSON on stdout) + +For blocking hooks, write a JSON object to stdout before exiting. The schema is the same for all events, with event-specific fields nested under `hookSpecificOutput`. + +```json theme={null} +{ + "continue": true, + "suppressOutput": false, + "decision": "approve", + "reason": "Command looks safe", + "systemMessage": "The hook approved this action.", + "hookSpecificOutput": { + "hookEventName": "PreToolUse", + "permissionDecision": "allow", + "additionalContext": "Verified by security scanner." + } +} +``` + + + When `false`, Claude stops the current turn immediately. + + + + When `true`, the hook's stdout is not shown in transcript mode. + + + + Explicit approve/block decision. Takes effect only when the CLI reads it. + + + + Message injected into Claude's context as a system turn. + + + + Human-readable reason for the decision. Shown to the user when a hook blocks an action. + + + + Event-specific output. See each event section below for the allowed fields. + + +*** + +## Hook events + +### `PreToolUse` + +Fires immediately before a tool executes. You can inspect the tool input, approve or block the call, or modify the input before it reaches the tool. + +**When it fires:** Before every tool invocation. + +**Input fields:** + + + Name of the tool about to run (e.g., `"Bash"`, `"Write"`, `"mcp__myserver__my_tool"`). + + + + The raw tool input object as Claude submitted it. + + + + Unique ID for this tool invocation. + + +**Exit codes:** + +| Exit code | Effect | +| --------- | ----------------------------------------------------------- | +| `0` | Stdout/stderr not shown. Hook output JSON applied if valid. | +| `2` | Stderr shown to Claude; tool call is **blocked**. | +| Other | Stderr shown to user only; tool call continues. | + +**`hookSpecificOutput` fields:** + + + Must be `"PreToolUse"`. + + + + Override the permission decision for this tool call. `"allow"` approves the call; `"deny"` blocks it; `"ask"` forces the permission dialog. + + + + Reason string shown to the user when the decision is `"deny"` or `"ask"`. + + + + Replacement tool input. When provided, the tool receives this object instead of Claude's original input. + + + + Text injected into Claude's context for this turn. + + +*** + +### `PostToolUse` + +Fires after a tool completes successfully. You can observe the tool output or inject context for Claude to act on. + +**When it fires:** After every successful tool execution. + +**Input fields:** + +Tool that ran. +Input that was passed to the tool. +The tool's output. +Unique ID for this invocation. + +**Exit codes:** + +| Exit code | Effect | +| --------- | ------------------------------------------------------- | +| `0` | Stdout shown in transcript mode (Ctrl+O). | +| `2` | Stderr shown to Claude immediately as a system message. | +| Other | Stderr shown to user only. | + +**`hookSpecificOutput` fields:** + + + Context injected into Claude's conversation after the tool result. + + + + Replacement for the MCP tool's output. Only effective for MCP tool calls. + + +*** + +### `PostToolUseFailure` + +Fires when a tool call ends in an error or is interrupted. + +**When it fires:** When a tool throws or is aborted. + +**Input fields:** + +Tool that failed. +Input that was passed to the tool. +Unique ID for this invocation. +Error message from the tool. +Whether the failure was caused by an interrupt signal. + +**Exit codes:** Same as `PostToolUse`. Hook output and exit codes are logged but do not affect the failed tool result. + +*** + +### `PermissionRequest` + +Fires when a permission dialog would be shown to the user. Hooks can programmatically approve or deny without showing any UI. + +**When it fires:** When Claude requests permission for a tool call and the default behavior is to prompt. + +**Input fields:** + +Tool requesting permission. +Input the tool would receive if approved. +Suggested permission rules (allow/deny) that the UI would offer. + +**Exit codes:** + +| Exit code | Effect | +| --------- | -------------------------------------------------------------------------------------------------------- | +| `0` | Hook decision applied if `hookSpecificOutput.decision` is set; otherwise falls through to normal dialog. | +| Other | Stderr shown to user; falls through to normal dialog. | + +**`hookSpecificOutput` fields:** + + + Must be `"PermissionRequest"`. + + + + The approval or denial decision. + + + ```json theme={null} + { + "behavior": "allow", + "updatedInput": { ... }, + "updatedPermissions": [...] + } + ``` + + + + ```json theme={null} + { + "behavior": "deny", + "message": "Blocked by security policy.", + "interrupt": false + } + ``` + + When `interrupt` is `true`, the current turn is aborted after denial. + + + +*** + +### `PermissionDenied` + +Fires when a tool call is denied (by rules, mode, or classifier). You can instruct Claude to retry the action. + +**When it fires:** After every permission denial. + +**Input fields:** + +Denied tool. +Input that was denied. +Unique ID for this invocation. +Human-readable denial reason. + +**Exit codes:** + +| Exit code | Effect | +| --------- | -------------------------------- | +| `0` | Stdout shown in transcript mode. | +| Other | Stderr shown to user only. | + +**`hookSpecificOutput` fields:** + + + When `true`, Claude is told it may retry the denied action. + + +*** + +### `Stop` + +Fires just before Claude concludes its response for the current turn. + +**When it fires:** When the model is about to stop and return control to the user. + +**Input fields:** + + + Whether a Stop hook is currently running (prevents infinite loops if your Stop hook itself would trigger a Stop). + + + + Text content of the last assistant message before stopping. Saves you from parsing the transcript file. + + +**Exit codes:** + +| Exit code | Effect | +| --------- | --------------------------------------------------------------------------- | +| `0` | Stdout/stderr not shown. | +| `2` | Stderr injected as a system message; Claude **continues** the conversation. | +| Other | Stderr shown to user only; Claude stops. | + + + Use exit code 2 from a Stop hook to check Claude's output and keep the conversation going if a condition is unmet — for example, if tests are still failing. + + +*** + +### `StopFailure` + +Fires instead of `Stop` when the turn ends due to an API error. + +**When it fires:** When a rate limit, authentication failure, or other API error ends the turn. + +**Input fields:** + + + The error category. + + + + Detailed error message. + + + + Last assistant message text, if any was produced before the error. + + +**Behavior:** Fire-and-forget. Hook output and exit codes are ignored. + +*** + +### `SubagentStart` + +Fires when Claude spawns a subagent via the `Agent` tool. + +**When it fires:** When an Agent tool call begins. + +**Input fields:** + +Unique ID for this subagent instance. +Agent type name (e.g., `"general-purpose"`). + +**Exit codes:** + +| Exit code | Effect | +| --------- | ---------------------------------------- | +| `0` | Stdout shown to the subagent as context. | +| Other | Stderr shown to user only. | + +**`hookSpecificOutput` fields:** + + + Context injected into the subagent's conversation at the start. + + +*** + +### `SubagentStop` + +Fires just before a subagent concludes its response. Mirrors `Stop` but for subagents. + +**When it fires:** When a subagent is about to return its result to the parent. + +**Input fields:** + +Subagent instance ID. +Agent type name. +Path to the subagent's JSONL transcript. +Whether a SubagentStop hook is already running. +Last message from the subagent. + +**Exit codes:** + +| Exit code | Effect | +| --------- | --------------------------------------------------------- | +| `0` | Stdout/stderr not shown. | +| `2` | Stderr shown to subagent; subagent **continues** running. | +| Other | Stderr shown to user only; subagent stops. | + +*** + +### `SessionStart` + +Fires when a session begins. Use this to inject initial context or set up the environment. + +**When it fires:** On session startup, resume, clear (`/clear`), or after compaction. + +**Input fields:** + + + What triggered the session start. + + +Active model for the session. + +**Exit codes:** + +| Exit code | Effect | +| --------- | ------------------------------------------ | +| `0` | Stdout shown to Claude as initial context. | +| Other | Stderr shown to user only. | + +**`hookSpecificOutput` fields:** + + + Context injected into Claude's system prompt for this session. + + + + Auto-submitted as the first user message of the session. + + + + Absolute file paths to register with the `FileChanged` watcher. + + +*** + +### `SessionEnd` + +Fires when a session is about to end. + +**When it fires:** On clear, logout, prompt-input exit, or other termination reasons. + +**Input fields:** + + + The reason the session is ending. + + +**Exit codes:** Exit code 0 completes successfully. Other exit codes show stderr to the user. + +*** + +### `Setup` + +Fires during repository initialization and maintenance checks. + +**When it fires:** On `init` (first time Claude Code runs in a directory) or `maintenance` (periodic checks). + +**Input fields:** + + + What triggered the setup hook. + + +**Exit codes:** + +| Exit code | Effect | +| --------- | ------------------------------------------------------- | +| `0` | Stdout shown to Claude. | +| Other | Stderr shown to user only. Blocking errors are ignored. | + +**`hookSpecificOutput` fields:** + + + Context provided to Claude for the setup phase. + + +*** + +### `PreCompact` + +Fires before context compaction begins. + +**When it fires:** Before the compaction summary is generated, whether triggered manually (`/compact`) or automatically. + +**Input fields:** + +Whether compaction was requested by the user or triggered automatically. +Any custom compaction instructions already configured. + +**Exit codes:** + +| Exit code | Effect | +| --------- | -------------------------------------------------- | +| `0` | Stdout appended as custom compaction instructions. | +| `2` | Compaction is **blocked**. | +| Other | Stderr shown to user; compaction continues. | + +*** + +### `PostCompact` + +Fires after compaction completes. + +**When it fires:** After the compaction summary has been generated and applied. + +**Input fields:** + +How compaction was triggered. +The summary produced by compaction. + +**Exit codes:** Exit code 0 shows stdout to the user. Other exit codes show stderr to the user. + +*** + +### `UserPromptSubmit` + +Fires when the user submits a prompt, before Claude processes it. + +**When it fires:** Each time you press Enter with a message in the terminal. + +**Input fields:** + +The raw prompt text the user submitted. + +**Exit codes:** + +| Exit code | Effect | +| --------- | --------------------------------------------------------------------- | +| `0` | Stdout shown to Claude as additional context. | +| `2` | Processing **blocked**; original prompt erased; stderr shown to user. | +| Other | Stderr shown to user only. | + +**`hookSpecificOutput` fields:** + + + Context appended to Claude's view of the user message. + + +*** + +### `Notification` + +Fires when Claude Code sends a notification (e.g., permission prompts, idle alerts). + +**When it fires:** When a notification event is raised internally. + +**Input fields:** + +Notification message text. +Notification title. + + + The type of notification. + + +**Exit codes:** Exit code 0 produces no output. Other exit codes show stderr to the user. + +*** + +### `Elicitation` + +Fires when an MCP server requests user input. Hooks can auto-respond without showing the dialog. + +**When it fires:** When an MCP server sends an elicitation request (a structured input form or URL). + +**Input fields:** + +Name of the MCP server requesting input. +The prompt message from the server. +Input mode. +Request identifier. +JSON schema describing the expected input structure. + +**Exit codes:** + +| Exit code | Effect | +| --------- | ----------------------------------------------------------------------------- | +| `0` | Use hook response if `hookSpecificOutput` is provided; otherwise show dialog. | +| `2` | Deny the elicitation. | +| Other | Stderr shown to user only. | + +**`hookSpecificOutput` fields:** + + + The programmatic response to the elicitation. + + + + Form data to submit when `action` is `"accept"`. + + +*** + +### `ElicitationResult` + +Fires after a user responds to an MCP elicitation. Hooks can observe or override the response. + +**When it fires:** After the user (or an Elicitation hook) responds to the elicitation. + +**Input fields:** + +Name of the MCP server. +Request identifier. +How the user responded. +Submitted form data, if accepted. + +**`hookSpecificOutput` fields:** + + + Override the user's action before it is sent to the server. + + + + Override the submitted content. + + +*** + +### `ConfigChange` + +Fires when a settings file changes during a session. + +**When it fires:** When `user_settings`, `project_settings`, `local_settings`, `policy_settings`, or `skills` files are modified on disk. + +**Input fields:** + + + Which settings source changed. + + +Absolute path to the changed file. + +**Exit codes:** + +| Exit code | Effect | +| --------- | ------------------------------------------------------- | +| `0` | Allow the change to be applied. | +| `2` | **Block** the change from being applied to the session. | +| Other | Stderr shown to user only. | + +*** + +### `InstructionsLoaded` + +Fires when a CLAUDE.md or instruction rule file is loaded. This event is observability-only. + +**When it fires:** When any instruction file is loaded into context. + +**Input fields:** + +Path to the loaded file. +The memory scope of the file. +Why the file was loaded. +The `paths:` frontmatter patterns that matched (if `load_reason` is `path_glob_match`). +The file Claude accessed that caused this load (for `path_glob_match`). +The file that `@include`d this one (for `include`). + +**Behavior:** Blocking not supported. Exit code 0 completes normally. Other exit codes show stderr to the user. + +*** + +### `WorktreeCreate` + +Fires when Claude Code needs to create an isolated worktree. The hook is responsible for actually creating the worktree and reporting its path. + +**When it fires:** When worktree isolation is requested for a task. + +**Input fields:** + +Suggested slug for the worktree directory. + +**Behavior:** Write the absolute path of the created worktree directory to stdout and exit with code 0. Any other exit code signals a failure. + +*** + +### `WorktreeRemove` + +Fires when Claude Code needs to remove a previously created worktree. + +**When it fires:** When a worktree task completes and the worktree should be cleaned up. + +**Input fields:** + +Absolute path of the worktree to remove. + +**Behavior:** Exit code 0 means success. Other exit codes show stderr to the user. + +*** + +### `CwdChanged` + +Fires after the working directory changes. + +**When it fires:** When Claude changes directories during a session. + +**Input fields:** + +Previous working directory. +New working directory. + +**`hookSpecificOutput` fields:** + + + Absolute paths to add to the `FileChanged` watcher. Return this to start watching files in the new directory. + + +The `CLAUDE_ENV_FILE` environment variable is set — write `export KEY=value` lines to apply environment variables to subsequent Bash tool commands. + +*** + +### `FileChanged` + +Fires when a watched file is modified, added, or removed. + +**When it fires:** When a file registered via `SessionStart.watchPaths` or `CwdChanged.watchPaths` changes on disk. + +**Input fields:** + +Absolute path of the changed file. +The type of filesystem event. + +**`hookSpecificOutput` fields:** + + + Update the watch list with these absolute paths. + + +The `CLAUDE_ENV_FILE` environment variable is set for this hook as well. + +*** + +## Async hooks + +For hooks that need to run in the background without delaying Claude, output an async acknowledgment on stdout instead of the normal sync output: + +```json theme={null} +{ + "async": true, + "asyncTimeout": 30 +} +``` + + + Signals that this hook is running asynchronously. + + + + How long (in seconds) the async hook is allowed to run before it is cancelled. + + + + Async hooks cannot block tool execution or inject context. Use them for side effects like notifications, logging, or metrics that must not slow down the agentic loop. + + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/sdk/overview.md b/docs/claude-code-docs-main/en/reference/sdk/overview.md new file mode 100644 index 0000000..9d8c393 --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/sdk/overview.md @@ -0,0 +1,517 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# SDK overview + +> Embed Claude Code in your own tools using the stdin/stdout control protocol. Reference for the SDK session API, message types, and output formats. + +The Claude Code SDK is a control protocol for embedding Claude Code in other applications — IDEs, automation scripts, CI/CD pipelines, or any host that can spawn a subprocess and communicate over stdin/stdout. + +Rather than exposing a library API directly, the SDK communicates with a running `claude` process over a structured JSON message stream. The host process sends user messages and control requests; the CLI process streams back assistant messages, tool progress events, and result payloads. + + + The TypeScript types described on this page are exported from `@anthropic-ai/claude-code` under the `agentSdkTypes` entry point. Control protocol types (prefixed `SDKControl`) are `@alpha` and subject to change. + + +## How it works + + + + Start `claude` with `--output-format stream-json` and `--print` (non-interactive mode). Pipe its stdin and stdout into your host process. + + ```bash theme={null} + claude --output-format stream-json --print --verbose + ``` + + For a persistent session that accepts multiple prompts over time, omit `--print` and instead send `SDKUserMessage` objects to stdin after the session initializes. + + + + Write a `control_request` with `subtype: "initialize"` to stdin. The CLI responds with an `SDKControlInitializeResponse` containing available commands, models, agents, and account information. + + ```json theme={null} + { + "type": "control_request", + "request_id": "init-1", + "request": { + "subtype": "initialize", + "systemPrompt": "You are a code reviewer.", + "appendSystemPrompt": "Always suggest tests." + } + } + ``` + + + + Read newline-delimited JSON from stdout. Each line is one of the `SDKMessage` union types — assistant turns, tool progress, system events, and result summaries. + + + + Write `SDKUserMessage` objects to stdin to continue the conversation. Each message contains an Anthropic API-compatible `message` payload. + + + +## Output formats + +Pass `--output-format` to control what Claude Code writes to stdout. + +| Format | Description | +| ------------- | --------------------------------------------------------------------------------------------------- | +| `text` | Plain text responses only. Default for interactive mode. | +| `json` | Single JSON object written at completion. Suitable for one-shot scripts. | +| `stream-json` | Newline-delimited JSON stream. One message per line, emitted as events occur. Required for SDK use. | + + + Use `stream-json` when you need to render progress incrementally or handle tool events. Use `json` when you only care about the final result. + + +## Control protocol messages + +The control protocol uses two top-level envelope types that flow bidirectionally over stdin/stdout. + +### `SDKControlRequest` + +Sent **to** the CLI process to configure the session or issue commands. + +```json theme={null} +{ + "type": "control_request", + "request_id": "", + "request": { "subtype": "...", ...payload } +} +``` + + + Always `"control_request"`. + + + + Unique identifier for this request. The CLI echoes it back in the corresponding `control_response`. + + + + The request payload. `subtype` identifies which operation to perform. + + +### `SDKControlResponse` + +Emitted **from** the CLI process in response to a `control_request`. + +```json theme={null} +{ + "type": "control_response", + "response": { + "subtype": "success", + "request_id": "", + "response": { ...payload } + } +} +``` + +On error, `subtype` is `"error"` and the `error` field contains a human-readable message. + +*** + +## Initialize request and response + +The `initialize` request is the first control message you must send. It configures the session and returns available capabilities. + +### `SDKControlInitializeRequest` + +```json theme={null} +{ + "type": "control_request", + "request_id": "init-1", + "request": { + "subtype": "initialize", + "systemPrompt": "You are a CI automation agent.", + "appendSystemPrompt": "Always add test coverage.", + "hooks": { + "PreToolUse": [ + { + "matcher": "Bash", + "hookCallbackIds": ["my-hook-id"] + } + ] + }, + "agents": { + "CodeReviewer": { + "description": "Reviews code for quality and security.", + "prompt": "You are an expert code reviewer...", + "model": "opus" + } + } + } +} +``` + + + Identifies this as an initialize request. + + + + Replaces the default system prompt for this session. + + + + Appended to the system prompt without replacing it. Use this to add context while keeping the default behavior. + + + + Registers SDK-side hook callbacks. The CLI calls back into the SDK process when hook events fire. See [Hooks reference](/reference/sdk/hooks-reference). + + + + Names of in-process SDK MCP servers (created with `createSdkMcpServer`) to connect to this session. + + + + Custom subagent definitions available to the `Agent` tool during this session. + + + + Natural language description of when Claude should invoke this agent. + + + + System prompt for this agent. + + + + Model alias (`"sonnet"`, `"opus"`, `"haiku"`) or full model ID. Defaults to inheriting the parent model. + + + + Allow-list of tool names. When omitted, the agent inherits all tools. + + + + Tools explicitly blocked for this agent. + + + + Maximum agentic turns before the agent stops. + + + + Override permission mode for this agent. See [Permissions API](/reference/sdk/permissions-api). + + + + +### `SDKControlInitializeResponse` + +The CLI responds with the session's current capabilities. + +```json theme={null} +{ + "type": "control_response", + "response": { + "subtype": "success", + "request_id": "init-1", + "response": { + "commands": [...], + "agents": [...], + "output_style": "stream-json", + "available_output_styles": ["text", "json", "stream-json"], + "models": [...], + "account": { + "email": "user@example.com", + "organization": "Acme Corp", + "apiProvider": "firstParty" + } + } + } +} +``` + + + Available slash commands (e.g., `/compact`, `/cost`). Each entry has `name`, `description`, and `argumentHint`. + + + + Available subagent types. Each has `name`, `description`, and an optional `model`. + + + + The active output format (`"stream-json"`, `"json"`, `"text"`). + + + + Available models for this account. + + + + Model identifier for API calls (e.g., `"claude-sonnet-4-6"`). + + + + Human-readable name (e.g., `"Claude Sonnet 4.6"`). + + + + Whether this model supports effort levels. + + + + Whether this model supports adaptive thinking (Claude decides when and how much to think). + + + + + + Logged-in account details. + + + + Account email address. + + + + Organization name. + + + + Subscription tier. + + + + Active API backend. Anthropic OAuth only applies when `"firstParty"`. + + + + +*** + +## User messages + +Send user messages to stdin to drive the conversation forward. + +### `SDKUserMessage` + +```json theme={null} +{ + "type": "user", + "message": { + "role": "user", + "content": "Refactor this function to use async/await." + }, + "parent_tool_use_id": null +} +``` + + + Always `"user"`. + + + + An Anthropic API-compatible user message. `content` can be a string or a content block array (for images and other media). + + + + Tool use ID this message is responding to, or `null` for top-level user messages. + + + + Optional UUID to track this message. Echoed back in related events. + + + + Scheduling hint for async message queuing. + + +*** + +## SDK message stream types + +Claude Code emits a stream of JSON messages to stdout. The `type` field identifies each message. + + + + Emitted once at session start with `subtype: "init"`. Contains the active model, tool list, MCP server statuses, permission mode, and session ID. + + ```json theme={null} + { + "type": "system", + "subtype": "init", + "model": "claude-sonnet-4-6", + "tools": ["Bash", "Read", "Write", "Edit", "Glob", "Grep"], + "mcp_servers": [], + "permissionMode": "default", + "session_id": "abc123", + "uuid": "..." + } + ``` + + + + Emitted when the model produces a turn. Contains the full Anthropic API response object, including any `tool_use` blocks. + + ```json theme={null} + { + "type": "assistant", + "message": { "role": "assistant", "content": [...] }, + "parent_tool_use_id": null, + "uuid": "...", + "session_id": "abc123" + } + ``` + + + + Emitted during streaming with `RawMessageStreamEvent` payloads. Use these to render incremental output. + + + + Emitted periodically for tools that take more than a few seconds (e.g., Bash commands). Contains `tool_name`, `tool_use_id`, and elapsed time. + + + + Emitted at the end of each turn. `subtype` is `"success"` or one of the error subtypes. + + ```json theme={null} + { + "type": "result", + "subtype": "success", + "result": "The function has been refactored.", + "duration_ms": 4200, + "total_cost_usd": 0.0042, + "num_turns": 3, + "is_error": false, + "stop_reason": "end_turn", + "session_id": "abc123", + "uuid": "..." + } + ``` + + Error subtypes: `"error_during_execution"`, `"error_max_turns"`, `"error_max_budget_usd"`, `"error_max_structured_output_retries"`. + + + + Emitted with `subtype: "status"` when the permission mode or session status changes (e.g., `"compacting"`). + + + +*** + +## Other control requests + +Beyond `initialize`, the control protocol exposes these operations. + +| `subtype` | Direction | Description | +| --------------------- | ---------- | --------------------------------------------------------------------- | +| `interrupt` | host → CLI | Interrupt the current turn. | +| `set_permission_mode` | host → CLI | Change the active permission mode. | +| `set_model` | host → CLI | Switch to a different model mid-session. | +| `can_use_tool` | CLI → host | Permission request for a tool call (requires SDK permission handler). | +| `mcp_status` | host → CLI | Get MCP server connection statuses. | +| `mcp_set_servers` | host → CLI | Replace dynamically managed MCP servers. | +| `get_context_usage` | host → CLI | Get context window usage breakdown. | +| `get_settings` | host → CLI | Read the effective merged settings. | +| `apply_flag_settings` | host → CLI | Merge settings into the flag settings layer. | +| `rewind_files` | host → CLI | Revert file changes made since a given message. | +| `hook_callback` | CLI → host | Deliver a hook event for an SDK-registered hook callback. | +| `reload_plugins` | host → CLI | Reload plugins from disk. | + +*** + +## Session management API + +For scripting scenarios, the SDK exports functions that operate on saved session transcripts stored in `~/.claude/`. + +```typescript theme={null} +import { + query, + listSessions, + getSessionInfo, + getSessionMessages, + forkSession, + renameSession, + tagSession, +} from '@anthropic-ai/claude-code' +``` + + + + The primary SDK entry point. Accepts a `prompt` string or `AsyncIterable` and returns an async iterable of `SDKMessage`. + + ```typescript theme={null} + for await (const message of query({ + prompt: 'What files are in this directory?', + options: { cwd: '/my/project' } + })) { + if (message.type === 'result') { + console.log(message.result) + } + } + ``` + + + + Returns session metadata for a project directory. Pass `dir` to scope to a specific project, or omit to list all sessions. + + ```typescript theme={null} + const sessions = await listSessions({ dir: '/my/project', limit: 50 }) + ``` + + + + Parses the JSONL transcript file for a session and returns messages in chronological order. + + ```typescript theme={null} + const messages = await getSessionMessages(sessionId, { + dir: '/my/project', + includeSystemMessages: false, + }) + ``` + + + + Copies a session's transcript into a new session with remapped UUIDs. Supports `upToMessageId` to fork from a specific point. + + ```typescript theme={null} + const { sessionId: newId } = await forkSession(originalSessionId, { + upToMessageId: 'msg-uuid', + title: 'Experimental branch', + }) + ``` + + + + ```typescript theme={null} + await renameSession(sessionId, 'My refactor session') + await tagSession(sessionId, 'needs-review') + await tagSession(sessionId, null) // clear tag + ``` + + + +*** + +## Use cases + + + + IDEs can spawn a persistent Claude Code process and route messages through the control protocol. Send the `initialize` request with a custom `systemPrompt` that describes the IDE context, then forward user messages from the editor's chat panel. Use `PreToolUse` hook callbacks to intercept file edits and display diffs in the IDE's native UI before they are applied. + + + + In CI pipelines, use `--output-format json` and `--print` for one-shot tasks: + + ```bash theme={null} + result=$(echo "Review the diff and output pass/fail" | \ + claude --output-format json --print \ + --permission-mode bypassPermissions) + ``` + + Parse the `result` field from the JSON output to extract the agent's response programmatically. + + + + For long-running background agents, use `query()` from the TypeScript SDK with a streaming output format. Combine with `watchScheduledTasks` (internal) to fire tasks on cron schedules while keeping a persistent daemon process that maintains the WebSocket connection to claude.ai. + + + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/sdk/permissions-api.md b/docs/claude-code-docs-main/en/reference/sdk/permissions-api.md new file mode 100644 index 0000000..a7c17da --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/sdk/permissions-api.md @@ -0,0 +1,473 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Permissions API + +> Reference for permission modes, allow/deny rule syntax, and configuration methods for controlling which tools Claude Code can use without prompting. + +The permissions system controls whether Claude Code runs a tool immediately, prompts you for confirmation, or blocks the call entirely. You configure it through permission modes and rule lists that can be set globally, per project, or per session. + +## Permission modes + +A permission mode sets the baseline behavior for all tool calls. Individual allow/deny rules can override this baseline for specific tools or commands. + +| Mode | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------- | +| `default` | Prompt for approval on potentially dangerous operations. Safe read-only tools run without prompting. | +| `acceptEdits` | Auto-approve all file edit operations (`Write`, `Edit`, `MultiEdit`). Bash commands still prompt. | +| `bypassPermissions` | Skip all permission checks. All tools run without prompting. Requires `allowDangerouslySkipPermissions: true` in settings. | +| `plan` | Read-only planning mode. No tool execution; Claude can only read files and explain what it would do. | +| `dontAsk` | Do not prompt the user. Deny any tool call that is not pre-approved by an explicit allow rule. | + + + `bypassPermissions` mode disables all safeguards. Only use it in sandboxed environments or CI pipelines where you fully control the input. The mode requires `allowDangerouslySkipPermissions: true` in your settings file. + + +### Setting the permission mode + + + + Pass `--permission-mode` to set the mode for a single invocation: + + ```bash theme={null} + claude --permission-mode acceptEdits + claude --permission-mode bypassPermissions --dangerously-skip-permissions + claude --permission-mode plan + ``` + + + + Set `defaultPermissionMode` in any Claude Code settings file to make it the default for all sessions in that scope: + + ```json theme={null} + { + "defaultPermissionMode": "acceptEdits" + } + ``` + + Settings files load in this priority order (highest wins): + + * `.claude/settings.local.json` — local overrides, not committed + * `.claude/settings.json` — project-level defaults + * `~/.claude/settings.json` — user-level defaults + + + + Run `/permissions` inside a session to open the interactive permissions panel where you can view and edit allow/deny rules. Session-level changes are not persisted to disk. + + ``` + /permissions + ``` + + + + Change the permission mode programmatically via the control protocol: + + ```json theme={null} + { + "type": "control_request", + "request_id": "pm-1", + "request": { + "subtype": "set_permission_mode", + "mode": "acceptEdits" + } + } + ``` + + + +*** + +## Permission rules + +Rules let you pre-approve or block specific tools and commands without changing the global permission mode. Rules are additive across settings scopes — allow rules from all files merge together. + +### Configuration format + +```json theme={null} +{ + "permissions": { + "allow": [ + "Bash(git *)", + "Bash(npm run *)", + "Read", + "Write(src/**)", + "mcp__myserver" + ], + "deny": [ + "Bash(rm -rf *)", + "Bash(curl * | bash)", + "Write(/etc/**)" + ] + } +} +``` + + + Rules that auto-approve matching tool calls without prompting. + + + + Rules that unconditionally block matching tool calls. + + + + Deny rules always take precedence over allow rules. If both an allow rule and a deny rule match a tool call, the call is blocked. + + +### Rule syntax + +A rule is a string that matches a tool name, optionally with a parenthesized content pattern. + +**Tool name only** — matches every call to that tool: + +``` +Read +Write +Edit +Bash +``` + +**Tool name with content pattern** — matches calls where the tool's primary input matches the glob: + +``` +Bash(git *) +Bash(npm run *) +Write(src/*) +Edit(*.ts) +``` + +For `Bash`, the pattern is matched against the full command string. For file tools (`Write`, `Edit`, `Read`, `Glob`), the pattern is matched against the file path argument. + +**MCP server** — matches all tools from a specific MCP server: + +``` +mcp__myserver +``` + +**MCP server wildcard** — same as above, explicit wildcard form: + +``` +mcp__myserver__* +``` + +**Specific MCP tool** — matches one tool from a server: + +``` +mcp__myserver__query_database +``` + +**Agent type** — blocks or allows a specific subagent: + +``` +Agent(Explore) +Agent(CodeReviewer) +``` + +### Pattern matching for `Bash` + +Bash rule patterns use shell-style glob matching on the full command string. + +```json theme={null} +{ + "permissions": { + "allow": [ + "Bash(git status)", + "Bash(git log *)", + "Bash(git diff *)", + "Bash(npm run test*)", + "Bash(make *)" + ], + "deny": [ + "Bash(rm *)", + "Bash(sudo *)", + "Bash(* | bash)", + "Bash(* | sh)" + ] + } +} +``` + + + Bash patterns match prefix-first. A rule like `Bash(git *)` matches `git status`, `git log --oneline`, and `git push --force`. Be specific when writing deny rules. + + +### Pattern matching for file tools + +File path patterns are matched against the absolute path of the file being read, written, or edited. + +```json theme={null} +{ + "permissions": { + "allow": [ + "Write(src/**)", + "Write(tests/**)", + "Edit(*.md)", + "Read" + ], + "deny": [ + "Write(/etc/**)", + "Write(~/.ssh/**)", + "Edit(.env*)" + ] + } +} +``` + +*** + +## Permission rule sources and priority + +Rules are collected from multiple sources and evaluated in a defined order. When the same tool call matches rules from different sources, deny takes precedence over allow, and the most restrictive result wins. + +| Source | Where configured | Editable | +| ----------------- | -------------------------------------------- | -------------- | +| `policySettings` | Managed policy layer | No | +| `flagSettings` | CLI flags and SDK control requests | Per-session | +| `userSettings` | `~/.claude/settings.json` | Yes | +| `projectSettings` | `.claude/settings.json` | Yes | +| `localSettings` | `.claude/settings.local.json` | Yes | +| `cliArg` | `--allowedTools` / `--disallowedTools` flags | Per-invocation | +| `session` | `/permissions` command, SDK updates | Per-session | + +### `--allowedTools` and `--disallowedTools` CLI flags + +Pass comma-separated rule strings directly on the command line: + +```bash theme={null} +claude --allowedTools "Bash(git *),Read,Write" --print "Run the tests" +claude --disallowedTools "Bash,Write" --print "Summarize this project" +``` + +These map to the `cliArg` source and apply for the duration of the invocation. + +*** + +## Permission decisions + +The permission engine evaluates each tool call through a pipeline and returns one of three outcomes. + +| Decision | Meaning | +| -------- | ------------------------------------------------------ | +| `allow` | Tool runs immediately. | +| `ask` | User is prompted for confirmation. | +| `deny` | Tool call is blocked; Claude receives an error result. | + +### Decision pipeline + +Claude Code evaluates tool calls in this order: + +1. **Deny rules** — if any deny rule matches, the call is blocked immediately. +2. **Ask rules** — if any ask rule matches, the permission dialog is shown. +3. **Tool's own permission check** — the tool's `checkPermissions` method runs (e.g., Bash checks individual subcommands). +4. **Safety checks** — paths inside `.git/`, `.claude/`, `.vscode/`, and shell config files always prompt, even in `bypassPermissions` mode. +5. **Mode check** — `bypassPermissions` and plan mode apply here. +6. **Allow rules** — if an allow rule matches, the call is approved. +7. **Default behavior** — if no rule matched, prompt the user. + + + Safety checks (step 4) are bypass-immune. Even with `bypassPermissions` mode, Claude Code will prompt before modifying files in `.git/` or shell configuration files like `~/.bashrc`. + + +*** + +## Working directories + +By default, Claude Code restricts file operations to the current working directory and its subdirectories. You can grant access to additional directories. + +### Via CLI flag + +```bash theme={null} +claude --add-dir /path/to/extra/dir +``` + +### Via settings + +```json theme={null} +{ + "permissions": { + "additionalDirectories": [ + "/shared/data", + "/home/user/configs" + ] + } +} +``` + +### Via SDK control request + +```json theme={null} +{ + "type": "control_request", + "request_id": "dirs-1", + "request": { + "subtype": "apply_flag_settings", + "settings": { + "permissions": { + "additionalDirectories": ["/shared/data"] + } + } + } +} +``` + +*** + +## Permission updates via the SDK + +SDK hosts (IDEs, desktop apps) can respond to `can_use_tool` control requests and include permission updates to persist rule changes alongside their decisions. + +### `PermissionUpdate` object + +```json theme={null} +{ + "type": "addRules", + "rules": [ + { "toolName": "Bash", "ruleContent": "git *" } + ], + "behavior": "allow", + "destination": "userSettings" +} +``` + + + The update operation. + + + + Rules to add, replace, or remove. Each rule has `toolName` and an optional `ruleContent` (the parenthesized pattern). + + + + Which rule list to modify. + + + + Where to persist the update. `session` applies only to the current session; `userSettings`, `projectSettings`, and `localSettings` write to the corresponding settings files on disk. + + +### Permission decision response + +When responding to a `can_use_tool` request, include `updatedPermissions` to persist rule changes: + +```json theme={null} +{ + "type": "control_response", + "response": { + "subtype": "success", + "request_id": "", + "response": { + "behavior": "allow", + "updatedPermissions": [ + { + "type": "addRules", + "rules": [{ "toolName": "Bash", "ruleContent": "git *" }], + "behavior": "allow", + "destination": "userSettings" + } + ], + "decisionClassification": "user_permanent" + } + } +} +``` + + + The permission decision. + + + + Modified tool input to use instead of the original. Only valid when `behavior` is `"allow"`. + + + + Permission rule updates to apply and persist alongside this decision. + + + + How the user responded, for telemetry. `user_temporary` for allow-once; `user_permanent` for always-allow; `user_reject` for deny. + + +*** + +## Hooks and permissions + +`PreToolUse` and `PermissionRequest` hooks can inject permission decisions programmatically. See [Hooks reference](/reference/sdk/hooks-reference) for details on `permissionDecision` output and `hookSpecificOutput.decision`. + +The hook-based permission flow is especially useful for headless agents that cannot show interactive prompts. When `shouldAvoidPermissionPrompts` is true (background agent mode), Claude Code runs `PermissionRequest` hooks before falling back to auto-deny. + +*** + +## Safety recommendations + + + + Use `bypassPermissions` only in isolated, short-lived environments where you control all inputs. Set explicit deny rules for destructive operations as a defense-in-depth measure: + + ```json theme={null} + { + "defaultPermissionMode": "bypassPermissions", + "allowDangerouslySkipPermissions": true, + "permissions": { + "deny": [ + "Bash(rm -rf *)", + "Bash(sudo *)", + "Bash(curl * | bash)" + ] + } + } + ``` + + + + Use `default` mode with allow rules for common safe operations. This minimizes interruptions while keeping you in control of destructive actions: + + ```json theme={null} + { + "defaultPermissionMode": "default", + "permissions": { + "allow": [ + "Read", + "Glob", + "Grep", + "Bash(git status)", + "Bash(git log *)", + "Bash(git diff *)", + "Bash(npm run *)", + "Bash(make *)" + ] + } + } + ``` + + + + Use `plan` mode when you want Claude to reason about code without making any changes. Claude can read files and explain what it would do, but cannot write, edit, or run commands: + + ```bash theme={null} + claude --permission-mode plan "Explain the architecture of this codebase" + ``` + + + + Use `dontAsk` mode combined with an SDK `PermissionRequest` hook to replace the interactive dialog with your own approval UI. The hook receives every tool call that would have prompted and can allow, deny, or forward it to a human reviewer: + + ```json theme={null} + { + "defaultPermissionMode": "dontAsk", + "permissions": { + "allow": [ + "Read", + "Bash(git *)" + ] + } + } + ``` + + Any tool call not matching an allow rule is sent to your `PermissionRequest` hook handler instead of being auto-denied. + + + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/tools/agent.md b/docs/claude-code-docs-main/en/reference/tools/agent.md new file mode 100644 index 0000000..d9f0ffd --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/tools/agent.md @@ -0,0 +1,225 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Agent & Task Tools + +> Spawn sub-agents for complex tasks and track work with a structured todo list. + +Claude Code has two meta-tools for managing complex, multi-step work: `Task` (also called the Agent tool) for launching autonomous sub-agents, and `TodoWrite` for maintaining a structured task list within a session. + +*** + +## Task (Agent tool) + +Launches a specialized sub-agent to handle a complex task autonomously. The sub-agent runs independently, uses its own set of tools, and returns a single result message when it finishes. + +### Parameters + + + The full task description for the agent. Since sub-agents start with no knowledge of the parent conversation, the prompt must be self-contained — include relevant file paths, line numbers, context, and any constraints. Terse command-style prompts produce shallow results. + + + + A short (3–5 word) label describing what the agent will do. Shown in the UI. + + + + The type of specialized agent to use (e.g., `"code-reviewer"`, `"test-runner"`). When omitted, the general-purpose agent is used. Available agent types are listed in the system prompt. + + + + Optional model override: `"sonnet"`, `"opus"`, or `"haiku"`. Takes precedence over the agent definition's configured model. Omit to inherit from the agent definition or parent. + + + + When `true`, the agent runs in the background. Claude is notified when it completes and should not poll or sleep while waiting. Use background mode when you have genuinely independent work to continue in the meantime. + + + + Isolation mode for the agent's filesystem context: + + * `"worktree"` — agent runs in a temporary git worktree (isolated copy of the repo). The worktree is cleaned up automatically if the agent makes no changes; otherwise the path and branch are returned. + + + + Absolute path to use as the working directory for all filesystem and shell operations inside the agent. Mutually exclusive with `isolation: "worktree"`. + + + + A name for the spawned agent. Makes it addressable via `SendMessage({ to: name })` while it is running. + + +### How sub-agents work + +Each agent invocation starts with zero conversation context. The agent: + +1. Receives its own system prompt and the `prompt` you provide +2. Has access to a tool set defined by its `subagent_type` (or all tools for the general-purpose agent) +3. Runs autonomously until the task is complete +4. Returns a single result message back to the parent + +The result is **not** shown directly to the user — Claude summarizes it in a follow-up message. + + + Never write "based on your findings, fix the bug" or similar delegation phrases. Prompts that push synthesis back onto the agent produce generic work. Include concrete file paths, line numbers, and specific instructions in the prompt. + + +### When to use the Task tool + + + + * Open-ended research that requires multiple rounds of searching and reading + * Running a test suite and analyzing failures after code changes + * Independent code review by a fresh agent with no prior context bias + * Long-running operations that can proceed while Claude handles other requests + * Tasks that would generate noisy intermediate output you don't need in the main context + + + + * Reading a specific file — use the `Read` tool directly + * Searching for a class definition — use `Grep` directly + * Searching within 2–3 known files — use `Read` directly + * Simple tasks unrelated to the available agent types + + + +### Parallel agents + +When tasks are independent, Claude launches multiple agents in a single message: + +``` +Task({ description: "Run tests", prompt: "Run the full test suite..." }) +Task({ description: "Check types", prompt: "Run tsc --noEmit and report errors..." }) +``` + +Both agents run concurrently. When both complete, Claude synthesizes the results. + +### Resuming agents + +To send a follow-up message to a running or completed agent, use `SendMessage` with the agent's `name` as the `to` field. The agent resumes with its full context preserved. + +### Writing effective prompts + + + The agent knows nothing about your session. Treat the prompt like a complete briefing for a smart colleague who just arrived: + + * What you're trying to accomplish and why + * What you've already tried or ruled out + * The specific files, functions, or systems involved + * What form the result should take ("report in under 200 words", "make the fix directly", etc.) + + + + * **Lookups**: hand over the exact command or query. The agent should not need to figure out what to run. + * **Investigations**: hand over the question, not prescribed steps. Over-specifying steps for open-ended problems causes the agent to waste effort on a wrong path. + + +*** + +## TodoWrite + +Maintains a structured task list for the current session. Claude uses this tool proactively to track progress, organize multi-step work, and provide visibility into what it is doing. + +### Parameters + + + The complete, updated todo list. Each call **replaces** the entire list — there is no incremental add or remove. + + +### TodoItem schema + +Each item in the `todos` array has the following fields: + + + The task description in imperative form — what needs to be done. Example: `"Run tests"`, `"Fix authentication bug"`. + + + + The present-continuous form of the task description, shown while the task is in progress. Example: `"Running tests"`, `"Fixing authentication bug"`. + + + + The current state of the task. One of: + + | Value | Meaning | + | ------------- | ------------------------- | + | `pending` | Not yet started | + | `in_progress` | Currently being worked on | + | `completed` | Finished successfully | + + Exactly one task should be `in_progress` at any time. + + +### How Claude uses TodoWrite + +Claude calls `TodoWrite` proactively when: + +* A task requires **3 or more distinct steps** +* Work is non-trivial and benefits from structured tracking +* The user provides a list of multiple things to do +* New sub-tasks are discovered mid-implementation + +Claude does **not** use `TodoWrite` for: + +* Single-step tasks +* Trivial operations (e.g., adding a comment, running one command) +* Purely informational or conversational responses + +### Task lifecycle + + + Claude marks a task `in_progress` **before** beginning, not after. This ensures the UI reflects what is actively happening. + + ```json theme={null} + { "content": "Add dark mode toggle", "activeForm": "Adding dark mode toggle", "status": "in_progress" } + ``` + + + + Claude marks a task `completed` immediately when it finishes — it does not batch completions. A task is only marked complete when: + + * Implementation is fully done + * No tests are failing + * No unresolved errors remain + + + + If a task cannot be completed (missing file, failing test, unresolved error), Claude keeps it `in_progress` and creates a new `pending` task describing what needs to be resolved first. + + + + When all tasks are marked `completed`, Claude clears the list automatically. An empty list signals that all requested work is done. + + +### Example list + +```json theme={null} +{ + "todos": [ + { + "content": "Add dark mode CSS variables", + "activeForm": "Adding dark mode CSS variables", + "status": "completed" + }, + { + "content": "Implement theme context provider", + "activeForm": "Implementing theme context provider", + "status": "in_progress" + }, + { + "content": "Update existing components to use theme", + "activeForm": "Updating existing components to use theme", + "status": "pending" + }, + { + "content": "Run tests and build", + "activeForm": "Running tests and build", + "status": "pending" + } + ] +} +``` + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/tools/bash.md b/docs/claude-code-docs-main/en/reference/tools/bash.md new file mode 100644 index 0000000..93e6add --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/tools/bash.md @@ -0,0 +1,170 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Bash + +> Execute shell commands in a persistent bash session. + +The `Bash` tool runs shell commands and returns their output. Commands execute in a persistent bash session — the working directory is preserved between calls, though the shell state (variables, aliases, functions) is re-initialized from the user's profile on each invocation. + + + Claude prefers dedicated tools (`Read`, `Edit`, `Glob`, `Grep`) over Bash equivalents for file operations. Bash is reserved for tasks where no purpose-built tool applies. + + +## Parameters + + + The shell command to execute. Supports all standard bash syntax including pipes, redirections, and compound operators (`&&`, `||`, `;`). + + + + Maximum execution time in milliseconds. Defaults to **120,000 ms (2 minutes)**. Maximum allowed value is **600,000 ms (10 minutes)**. + + Both values can be overridden at runtime via `BASH_DEFAULT_TIMEOUT_MS` and `BASH_MAX_TIMEOUT_MS` environment variables. + + + + A short human-readable description of what the command does. Shown in the UI when Claude explains its actions. + + + + When `true`, the command runs in the background. Claude is notified when it completes and does not need to poll for results. Do not append `&` to the command when using this parameter — background execution is handled internally. + + +## Session behavior + +The bash session persists working directory across calls but does **not** persist: + +* Shell variables set in previous commands +* Aliases or functions +* `cd` changes (Claude uses absolute paths instead) + +Claude initializes each session from the user's shell profile (`bash` or `zsh`). + +## Timeouts + +| Setting | Default | Max | +| --------------- | ------------------- | --- | +| Default timeout | 120,000 ms (2 min) | — | +| Maximum timeout | 600,000 ms (10 min) | — | + +Pass a `timeout` value (in milliseconds) to override the default for a specific command. + +## Permission model + +Every Bash command passes through a permission check before execution. The outcome is one of: + +* **Allow** — command matches an existing allow rule or is classified as read-only +* **Ask** — command requires user approval before running +* **Deny** — command matches an explicit deny rule and is blocked + +### Allow rules + +Rules are matched by exact command, prefix (`git commit:*`), or wildcard pattern. Safe wrapper commands (`timeout`, `time`, `nice`, `nohup`) and safe environment variable assignments (`NODE_ENV=prod`, `GOARCH=arm64`) are stripped before matching so prefix rules work correctly. + +### Read-only auto-allow + +Commands that only read state (e.g., `ls`, `cat`, `git log`, `grep`) are automatically allowed without a prompt. + +### Security restrictions + +Claude's security layer checks each command for patterns that commonly indicate injection or obfuscation attempts. Commands containing the following require explicit user approval: + +* Command substitution: `` `...` ``, `$()`, `${}` +* Process substitution: `<()`, `>()` +* Input/output redirections (`<`, `>`) in suspicious contexts +* Zsh-specific constructs: `zmodload`, `emulate -c`, `ztcp`, `zsocket` +* ANSI-C quoting (`$'...'`) or locale quoting (`$"..."`) +* IFS variable manipulation (`$IFS`) +* Access to `/proc/*/environ` +* Newlines or carriage returns in non-quoted positions + + + Commands are split into subcommands before permission checking. A rule like `Bash(ls:*)` will **not** match `ls /tmp && rm -rf /` — the `rm -rf /` subcommand is checked separately. + + +## Background execution + + + + ```json theme={null} + { + "command": "npm run build", + "description": "Build the project" + } + ``` + + Claude waits for the command to finish and receives its output immediately. + + + + ```json theme={null} + { + "command": "npm run dev", + "description": "Start dev server", + "run_in_background": true + } + ``` + + The command starts and Claude continues without blocking. A notification arrives when the process finishes. + + + +## Examples + + + ```bash theme={null} + pytest tests/ -x --tb=short + ``` + + Run a test suite and stop on the first failure. + + + + ```bash theme={null} + git status && git diff --staged + ``` + + Check working tree status and staged changes in a single compound command. + + + Claude follows a strict protocol for `git commit` and `git push` — it never amends pushed commits, never skips hooks with `--no-verify`, and never force-pushes to `main`/`master` without explicit user instruction. + + + + + ```bash theme={null} + npm install + ``` + + Standard package installation. Claude stages related commands in parallel when they are independent. + + + + ```json theme={null} + { + "command": "cargo build --release", + "timeout": 300000, + "description": "Release build (up to 5 min)" + } + ``` + + Override the 2-minute default for commands known to take longer. + + +## Tool preference + +Claude uses Bash only when no purpose-built tool is available: + +| Task | Preferred tool | +| ----------------------------- | -------------- | +| Find files by name | `Glob` | +| Search file contents | `Grep` | +| Read a file | `Read` | +| Edit a file | `Edit` | +| Write a new file | `Write` | +| Shell commands, builds, tests | **Bash** | + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/tools/file-operations.md b/docs/claude-code-docs-main/en/reference/tools/file-operations.md new file mode 100644 index 0000000..3b4a509 --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/tools/file-operations.md @@ -0,0 +1,157 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# File Operations + +> Read, edit, and write files on the local filesystem. + +Claude Code has three dedicated tools for working with files: `Read` for reading content, `Edit` for precise in-place edits, and `Write` for creating or fully rewriting files. + + + Prefer `Edit` over `Write` when modifying existing files — `Edit` sends only the changed fragment, saving context and reducing the chance of unintended overwrites. + + +*** + +## Read + +Reads a file from the local filesystem and returns its contents with line numbers. + +### Parameters + + + Absolute path to the file. Relative paths are not accepted. + + + + Line number to start reading from (1-indexed). Use this with `limit` to read a specific section of a large file. + + + + Maximum number of lines to return. Defaults to **2,000** lines. For files longer than this, call `Read` again with a higher `offset` to page through the content. + + +### Output format + +Results use `cat -n` style formatting: each line is prefixed with its 1-indexed line number. + +``` + 1 import { z } from 'zod' + 2 + 3 export const schema = z.object({ + 4 name: z.string(), + 5 }) +``` + +Claude preserves exact indentation from this output when constructing `Edit` calls. + +### Supported file types + +| Type | Behavior | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| Text files | Returns raw text with line numbers | +| Images (PNG, JPG, etc.) | Displayed visually — Claude is multimodal | +| PDF files | Returned as document content. For PDFs over 10 pages, use the `pages` parameter (e.g., `"1-5"`). Maximum 20 pages per request. | +| Jupyter notebooks (`.ipynb`) | All cells and outputs are returned, combining code, text, and visualizations | + + + `Read` cannot list directories. To inspect a directory's contents, use `ls` via the `Bash` tool. + + +### Caching + +If a file has not changed since the last `Read` call in the same conversation, Claude receives a cached stub instead of re-reading the file. This avoids redundant reads on unchanged files. + +*** + +## Edit + +Performs exact string replacement within a file. + +### Parameters + + + Absolute path to the file to modify. + + + + The exact string to find and replace. Must match the file content character-for-character, including whitespace and indentation. + + + + The replacement string. Use an empty string to delete `old_string`. + + + + When `true`, replaces every occurrence of `old_string` in the file instead of only the first. Useful for renaming variables or symbols that appear multiple times. + + +### How Edit works + +`Edit` finds the literal text in `old_string` inside the file and substitutes it with `new_string`. No regex interpretation occurs — the match is a plain string comparison. + + + The tool **fails** if `old_string` appears more than once in the file and `replace_all` is not set. Provide enough surrounding context in `old_string` to make it unique, or set `replace_all: true` to update all occurrences. + + +### Pre-read requirement + +Claude must call `Read` on a file at least once in the conversation before calling `Edit` on it. The tool enforces this to prevent edits based on stale or assumed content. + +### Indentation matching + +When Claude derives `old_string` from `Read` output, it uses the content that appears **after** the line-number prefix. For example, given: + +``` + 12 const x = 1 +``` + +The `old_string` is ` const x = 1` (six leading spaces), not ` 12 const x = 1`. + +*** + +## Write + +Creates a new file or fully overwrites an existing one. + +### Parameters + + + Absolute path to the file to create or overwrite. + + + + The complete content to write to the file. If the file already exists, it is replaced entirely. + + +### When to use Write vs Edit + + + + * Modifying one or more sections of an existing file + * Renaming a variable or symbol across the file + * Adding or removing a block of code + + Edit is preferred because it transmits only the changed fragment. + + + + * Creating a new file from scratch + * Completely rewriting a file (e.g., regenerating a config from new requirements) + * When the new content is entirely different from the original + + Write replaces the entire file in one call. + + + +### Pre-read requirement + +When overwriting an existing file, Claude must call `Read` first. Write enforces this to prevent unintentional data loss. + + + Claude does not proactively create documentation files (`*.md`, `README.*`) unless explicitly instructed. Write follows the same principle. + + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/tools/search.md b/docs/claude-code-docs-main/en/reference/tools/search.md new file mode 100644 index 0000000..2f61b9f --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/tools/search.md @@ -0,0 +1,187 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Search + +> Find files by name pattern and search file contents with regular expressions. + +Claude Code has two dedicated search tools: `Glob` for finding files by name and `Grep` for searching file contents. Both are preferred over running `find` or `grep` as Bash commands — they have correct permission integration, return results sorted by modification time, and produce structured output Claude can act on directly. + +*** + +## Glob + +Finds files whose paths match a glob pattern. Results are sorted by modification time (most recently modified first). + +### Parameters + + + A glob pattern to match file paths against. Supports `*` (any characters within a path segment), `**` (any number of path segments), and `?` (single character). + + + + The directory to search in. Defaults to the current working directory. Must be an existing directory path — omit the parameter entirely to use the default; do not pass `null` or `"undefined"`. + + +### Output + +Returns a list of matching file paths, relative to the working directory, sorted by modification time. Results are capped at **100 files**. If the result is truncated, consider narrowing the pattern or specifying a more specific `path`. + +### Pattern examples + +| Pattern | Matches | +| ---------------------------- | ----------------------------------------------- | +| `**/*.ts` | All TypeScript files anywhere in the tree | +| `src/**/*.tsx` | All TSX files under `src/` | +| `*.json` | JSON files in the current directory only | +| `**/{package,tsconfig}.json` | `package.json` and `tsconfig.json` at any depth | +| `tools/*/prompt.ts` | `prompt.ts` one level inside `tools/` | + + + Use `Glob` when you know the filename or extension you're looking for. For open-ended exploration that requires multiple rounds of searching, use the `Task` (Agent) tool instead. + + +*** + +## Grep + +Searches file contents using regular expressions, powered by ripgrep. Returns matching file paths, line numbers, and (optionally) matching lines. + +### Parameters + + + A regular expression to search for in file contents. Supports full regex syntax: character classes, quantifiers, lookaheads, alternation, etc. + + Ripgrep syntax differs from POSIX `grep` in one notable way: literal braces must be escaped. Use `interface\{\}` to find `interface{}` in Go code. + + + + File or directory to search in. Defaults to the current working directory. Can be a single file path to restrict the search. + + + + Glob pattern to filter which files are searched (e.g., `"*.js"`, `"*.{ts,tsx}"`). Maps to `rg --glob`. + + + + Ripgrep file type to restrict the search (e.g., `"js"`, `"py"`, `"rust"`, `"go"`, `"java"`). More efficient than `glob` for standard file type filtering. Maps to `rg --type`. + + + + Controls what is returned. Options: + + * `"files_with_matches"` *(default)* — returns file paths only + * `"content"` — returns matching lines with context support + * `"count"` — returns match counts per file + + + + Case-insensitive search. Maps to `rg -i`. + + + + Show line numbers in output. Applies to `output_mode: "content"` only. Defaults to `true`. + + + + Lines of context to show after each match. Applies to `output_mode: "content"` only. Maps to `rg -A`. + + + + Lines of context to show before each match. Applies to `output_mode: "content"` only. Maps to `rg -B`. + + + + Lines of context to show before and after each match (equivalent to `rg -C`). Takes precedence over `-A` and `-B`. Applies to `output_mode: "content"` only. + + + + Enable multiline mode where `.` matches newlines and patterns can span multiple lines (`rg -U --multiline-dotall`). Default: `false`. + + + + Limit output to the first N lines or entries (equivalent to `| head -N`). Applies across all output modes. Defaults to **250**. Pass `0` for unlimited results. + + + + Skip the first N entries before applying `head_limit` (equivalent to `| tail -n +N`). Useful for paginating large result sets. Defaults to `0`. + + +### Output modes + + + + Returns a list of file paths that contain at least one match, sorted by modification time. + + ``` + Found 3 files + src/utils/permissions/bashClassifier.ts + src/tools/BashTool/BashTool.tsx + src/tools/BashTool/bashPermissions.ts + ``` + + + + Returns the matching lines themselves, with optional surrounding context. + + ``` + src/utils/permissions/bashClassifier.ts:42:export function classifyBashCommand( + src/utils/permissions/bashClassifier.ts:43: command: string, + ``` + + + + Returns match counts per file. + + ``` + src/utils/permissions/bashClassifier.ts:7 + src/tools/BashTool/bashPermissions.ts:3 + + Found 10 total occurrences across 2 files. + ``` + + + +### Pattern syntax notes + + + Ripgrep treats `{` and `}` as literal characters by default, unlike some regex engines that use them for quantifiers. To search for literal braces, escape them: + + ``` + interface\{\} → finds interface{} + map\[string\] → finds map[string] + ``` + + + + By default, `.` does not match newlines. To search across line boundaries: + + ```json theme={null} + { + "pattern": "struct \\{[\\s\\S]*?field", + "multiline": true + } + ``` + + + + `glob` and `type` can be used independently or together: + + ```json theme={null} + { "pattern": "TODO", "type": "ts" } + ``` + + ```json theme={null} + { "pattern": "TODO", "glob": "src/**/*.ts" } + ``` + + Use `type` for standard language types; use `glob` when the file set doesn't align with a named type. + + +### Excluded directories + +Grep automatically excludes version-control metadata directories: `.git`, `.svn`, `.hg`, `.bzr`, `.jj`, `.sl`. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-code-docs-main/en/reference/tools/web.md b/docs/claude-code-docs-main/en/reference/tools/web.md new file mode 100644 index 0000000..abc2daa --- /dev/null +++ b/docs/claude-code-docs-main/en/reference/tools/web.md @@ -0,0 +1,154 @@ +> ## Documentation Index +> Fetch the complete documentation index at: https://vineetagarwal-code-claude-code.mintlify.app/llms.txt +> Use this file to discover all available pages before exploring further. + +# Web + +> Fetch web pages and search the internet for current information. + +Claude Code has two web tools: `WebFetch` for retrieving and analyzing specific URLs, and `WebSearch` for querying the web when information may be beyond Claude's training cutoff. + +*** + +## WebFetch + +Fetches a URL, converts the HTML to markdown, and then processes the content using a small fast model with a prompt you provide. Returns the model's response — not the raw page content. + +### Parameters + + + A fully-formed, valid URL. HTTP URLs are automatically upgraded to HTTPS. + + + + A natural-language prompt describing what to extract or analyze from the page content. The fetched content is passed to a secondary model along with this prompt, and the model's response is returned. + + +### Behavior + +1. Claude fetches the URL and converts HTML to markdown. +2. The markdown and the `prompt` are sent to a small, fast model. +3. That model's response is returned as the tool result. + +Because a secondary model processes the content, the result is always a synthesized answer — not a raw dump of the page. If the content is very large, it may be summarized automatically. + + + WebFetch includes a 15-minute in-memory cache. Repeated calls to the same URL within that window return cached content without a network request. + + +### Redirects + +When a URL redirects to a different host, the tool returns a special message indicating the redirect destination rather than following it automatically. Claude then makes a new `WebFetch` call with the redirect URL. + +### Limitations + +* Read-only — does not submit forms or interact with pages +* Not suitable for pages requiring authentication (login walls, paywalls) +* For GitHub resources, prefer the `gh` CLI via `Bash` (e.g., `gh pr view`, `gh issue view`, `gh api`) + + + If an MCP-provided web fetch tool is available in your environment, it may have fewer restrictions and should be preferred over this built-in tool. + + +### Example usage + + + + ```json theme={null} + { + "url": "https://docs.example.com/api/authentication", + "prompt": "What authentication methods are supported and what headers are required?" + } + ``` + + + + ```json theme={null} + { + "url": "https://github.com/some-org/some-lib/blob/main/CHANGELOG.md", + "prompt": "What changed in the latest version?" + } + ``` + + + + ```json theme={null} + { + "url": "https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API", + "prompt": "Summarize the Fetch API and show a basic usage example." + } + ``` + + + +*** + +## WebSearch + +Searches the web and returns results including titles, URLs, and a model-synthesized summary. Useful when information may be newer than Claude's training data. + + + Web search is only available in the United States. It requires a compatible API provider (Anthropic first-party, Vertex AI with Claude 4.0+ models, or Foundry). + + +### Parameters + + + The search query to execute. Minimum length: 2 characters. + + + + When set, only return results from these domains. Cannot be combined with `blocked_domains` in the same request. + + Example: `["docs.python.org", "peps.python.org"]` + + + + Exclude results from these domains. Cannot be combined with `allowed_domains` in the same request. + + Example: `["w3schools.com"]` + + +### Output + +The tool returns search results as structured blocks containing: + +* Result titles and URLs +* A synthesized summary produced by a model that has access to the search results + +Claude is required to cite sources from web searches by appending a `Sources:` section with markdown hyperlinks to its response. + +### Domain filtering + + + Use `allowed_domains` when you want results exclusively from trusted or authoritative sources: + + ```json theme={null} + { + "query": "Python asyncio best practices 2024", + "allowed_domains": ["docs.python.org", "realpython.com"] + } + ``` + + + + Use `blocked_domains` to suppress low-quality or paywalled sources: + + ```json theme={null} + { + "query": "React server components tutorial", + "blocked_domains": ["medium.com"] + } + ``` + + +### Search limits + +Each `WebSearch` invocation performs up to **8 individual web searches** internally. Claude automatically refines queries as needed within that budget. + +### Current date awareness + +When searching for recent information, Claude includes the current year in search queries to avoid returning outdated results — for example, appending the year when searching for library documentation or current events. + + +Built with [Mintlify](https://mintlify.com). \ No newline at end of file diff --git a/docs/claude-docs.html b/docs/claude-docs.html new file mode 100644 index 0000000..e187701 --- /dev/null +++ b/docs/claude-docs.html @@ -0,0 +1,691 @@ + + + + + + Claude Code 문서 아카이브 + + + + +
+
+ Single File Docs +

Claude Code 문서 아카이브

+

+ 이 폴더의 Markdown 문서를 한 페이지 HTML로 묶었습니다. 상단 목차에서 원하는 문서로 바로 이동할 수 있고, + 문서를 읽는 동안 오른쪽의 떠다니는 버튼으로 언제든 목차로 빠르게 돌아올 수 있습니다. +

+
+
+ 21 + 문서 섹션 +
+
+ 9,450 + 대략적인 단어 수 +
+
+ 2026년 4월 1일 + 생성 날짜 +
+
+
+ + + +
+
+ + 목차로 + + + + + diff --git a/docs/generate_blog.js b/docs/generate_blog.js new file mode 100644 index 0000000..7e0c633 --- /dev/null +++ b/docs/generate_blog.js @@ -0,0 +1,243 @@ +const fs = require("fs"); +const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, + Header, Footer, AlignmentType, LevelFormat, HeadingLevel, + BorderStyle, WidthType, ShadingType, PageNumber, PageBreak, + TabStopType, TabStopPosition } = require("docx"); + +const border = { style: BorderStyle.SINGLE, size: 1, color: "D0D0D0" }; +const borders = { top: border, bottom: border, left: border, right: border }; +const cellMargins = { top: 80, bottom: 80, left: 120, right: 120 }; + +function h1(text) { + return new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun(text)] }); +} +function h2(text) { + return new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun(text)] }); +} +function h3(text) { + return new Paragraph({ heading: HeadingLevel.HEADING_3, children: [new TextRun(text)] }); +} +function p(text, opts = {}) { + return new Paragraph({ spacing: { after: 120 }, children: [new TextRun({ text, ...opts })] }); +} +function bold(text) { + return new TextRun({ text, bold: true }); +} +function para(...runs) { + return new Paragraph({ spacing: { after: 120 }, children: runs }); +} +function bullet(text, ref = "bullets") { + return new Paragraph({ numbering: { reference: ref, level: 0 }, spacing: { after: 60 }, + children: [new TextRun(text)] }); +} +function bulletBold(label, desc) { + return new Paragraph({ numbering: { reference: "bullets", level: 0 }, spacing: { after: 60 }, + children: [new TextRun({ text: label, bold: true }), new TextRun(` ${desc}`)] }); +} + +function featureTable(rows) { + const colW = [1800, 2400, 5160]; + return new Table({ + width: { size: 9360, type: WidthType.DXA }, + columnWidths: colW, + rows: [ + new TableRow({ children: ["Category", "Prefix", "Description"].map((t, i) => + new TableCell({ borders, width: { size: colW[i], type: WidthType.DXA }, margins: cellMargins, + shading: { fill: "2E3A8C", type: ShadingType.CLEAR }, + children: [new Paragraph({ children: [new TextRun({ text: t, bold: true, color: "FFFFFF", font: "Malgun Gothic", size: 20 })] })] })) + }), + ...rows.map(([cat, prefix, desc]) => + new TableRow({ children: [cat, prefix, desc].map((t, i) => + new TableCell({ borders, width: { size: colW[i], type: WidthType.DXA }, margins: cellMargins, + children: [new Paragraph({ children: [new TextRun({ text: t, font: "Malgun Gothic", size: 20, ...(i === 1 ? { font: "Consolas" } : {}) })] })] })) + }) + ) + ] + }); +} + +const doc = new Document({ + styles: { + default: { document: { run: { font: "Malgun Gothic", size: 22 } } }, + paragraphStyles: [ + { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true, + run: { size: 36, bold: true, font: "Malgun Gothic", color: "1A1B2E" }, + paragraph: { spacing: { before: 360, after: 200 }, outlineLevel: 0 } }, + { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true, + run: { size: 28, bold: true, font: "Malgun Gothic", color: "2E3A8C" }, + paragraph: { spacing: { before: 280, after: 160 }, outlineLevel: 1 } }, + { id: "Heading3", name: "Heading 3", basedOn: "Normal", next: "Normal", quickFormat: true, + run: { size: 24, bold: true, font: "Malgun Gothic", color: "4B5EFC" }, + paragraph: { spacing: { before: 200, after: 120 }, outlineLevel: 2 } }, + ] + }, + numbering: { + config: [ + { reference: "bullets", + levels: [{ level: 0, format: LevelFormat.BULLET, text: "\u2022", alignment: AlignmentType.LEFT, + style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] }, + { reference: "numbers", + levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT, + style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] }, + ] + }, + sections: [{ + properties: { + page: { + size: { width: 11906, height: 16838 }, + margin: { top: 1440, right: 1260, bottom: 1440, left: 1260 } + } + }, + headers: { + default: new Header({ children: [ + new Paragraph({ children: [ + new TextRun({ text: "AX Commander \u2014 Blog Post", font: "Malgun Gothic", size: 16, color: "999999" }) + ], alignment: AlignmentType.RIGHT }) + ]}) + }, + footers: { + default: new Footer({ children: [ + new Paragraph({ alignment: AlignmentType.CENTER, children: [ + new TextRun({ text: "Page ", font: "Malgun Gothic", size: 16, color: "999999" }), + new TextRun({ children: [PageNumber.CURRENT], font: "Malgun Gothic", size: 16, color: "999999" }) + ]}) + ]}) + }, + children: [ + + // ─── 타이틀 ─── + new Paragraph({ spacing: { after: 80 }, alignment: AlignmentType.CENTER, children: [ + new TextRun({ text: "AX Commander", font: "Malgun Gothic", size: 48, bold: true, color: "1A1B2E" }) + ]}), + new Paragraph({ spacing: { after: 40 }, alignment: AlignmentType.CENTER, + border: { bottom: { style: BorderStyle.SINGLE, size: 6, color: "4B5EFC", space: 8 } }, + children: [ + new TextRun({ text: "\ud0a4\ubcf4\ub4dc \ud558\ub098\ub85c \ubaa8\ub4e0 \uc5c5\ubb34\ub97c \uc81c\uc5b4\ud558\ub294 \uc0ac\ub0b4 \uc804\uc6a9 \ub7f0\ucc98", font: "Malgun Gothic", size: 26, color: "555577" }) + ]}), + new Paragraph({ spacing: { after: 300 }, alignment: AlignmentType.CENTER, children: [ + new TextRun({ text: "\ubc31\uc2b9\uc7ac \u00b7 AX\uc5f0\uad6c\uc18c AI\ud300 \u00b7 SW Architect", font: "Malgun Gothic", size: 20, color: "888899" }) + ]}), + + // ─── 1. 서문 ─── + h1("1. \uc65c \ub9cc\ub4e4\uc5c8\ub294\uac00"), + p("\uc5c5\ubb34 \uc911 \uac00\uc7a5 \ub9ce\uc774 \ubc18\ubcf5\ud558\ub294 \ub3d9\uc791\uc774 \ubb50\ub0d0\uace0 \ubb3c\uc73c\uba74, \ub300\ubd80\ubd84\uc758 \uc0ac\ubb34\uc9c1 \uc9c1\uc6d0\uc774 \uc774\ub807\uac8c \ub300\ub2f5\ud569\ub2c8\ub2e4:"), + bullet("\uc571\uc744 \ucc3e\uc544\uc11c \uc2e4\ud589\ud558\uae30"), + bullet("\ud30c\uc77c\uc744 \ucc3e\uc544\uc11c \uc5f4\uae30"), + bullet("\ud074\ub9bd\ubcf4\ub4dc\uc5d0\uc11c \ubcf5\uc0ac\ud55c \ub0b4\uc6a9 \ub2e4\uc2dc \ucc3e\uae30"), + bullet("\uacc4\uc0b0\uae30 \uc5f4\uace0 \uac04\ub2e8\ud55c \uacc4\uc0b0\ud558\uae30"), + p("\uc774 \ubaa8\ub4e0 \ub3d9\uc791\uc5d0 \ub9c8\uc6b0\uc2a4\ub97c \ub4e4\uace0, \ud0d0\uc0c9\uae30\ub97c \uc5f4\uace0, \ud074\ub9ad\ud558\uace0\u2026 \ud0a4\ubcf4\ub4dc\uc5d0\uc11c \uc190\uc744 \ub5bc \uc218\uac00 \uc5c6\uc2b5\ub2c8\ub2e4."), + para(bold("AX Commander"), new TextRun("\ub294 \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud569\ub2c8\ub2e4. Alt+Space \ud55c \ubc88\uc73c\ub85c \ubaa8\ub4e0 \uac83\uc744 \ud0a4\ubcf4\ub4dc\ub85c \uc81c\uc5b4\ud560 \uc218 \uc788\ub294 \ub7f0\ucc98\uc785\ub2c8\ub2e4.")), + p("\ud2b9\ud788 \uc774 \ud504\ub85c\uc81d\ud2b8\ub294 LLM(Claude)\uacfc \ud568\uaed8 \uae30\ud68d\ubd80\ud130 \uad6c\ud604\uae4c\uc9c0 \uc9c4\ud589\ud55c \uc0ac\ub840\ub85c, AI\uc640 \ud611\uc5c5\ud558\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc758 \uc2e4\uc81c \uacbd\ud5d8\uc744 \ub2f4\uace0 \uc788\uc2b5\ub2c8\ub2e4."), + + new Paragraph({ children: [new PageBreak()] }), + + // ─── 2. AX Commander란? ─── + h1("2. AX Commander\ub780?"), + para(new TextRun({ text: "Alt+Space", bold: true, font: "Consolas" }), new TextRun("\ub97c \ub204\ub974\uba74 \ud654\uba74 \uc0c1\ub2e8\uc5d0 \uae54\ub054\ud55c \ub7f0\ucc98 \ucc3d\uc774 \ub098\ud0c0\ub0a9\ub2c8\ub2e4. \uc5ec\uae30\uc5d0 \uc6d0\ud558\ub294 \uba85\ub839\uc744 \uc785\ub825\ud558\uba74 \ub429\ub2c8\ub2e4.")), + bullet("\uc571 \uc774\ub984\uc744 \uce58\uba74 \uc571\uc774 \uc2e4\ud589\ub429\ub2c8\ub2e4"), + bullet("= \ub97c \uce58\uba74 \uacc4\uc0b0\uae30\uac00 \ub429\ub2c8\ub2e4"), + bullet("# \uc744 \uce58\uba74 \ud074\ub9bd\ubcf4\ub4dc \ud788\uc2a4\ud1a0\ub9ac\uac00 \ub098\ud0c0\ub0a9\ub2c8\ub2e4"), + bullet("cap screen \uc744 \uce58\uba74 \ud654\uba74\uc774 \ucea1\ucc98\ub429\ub2c8\ub2e4"), + bullet("win chrome \uc744 \uce58\uba74 \ud06c\ub86c \ucc3d\uc73c\ub85c \uc989\uc2dc \uc804\ud658\ub429\ub2c8\ub2e4"), + p("\ud504\ub9ac\ud53d\uc2a4(\uc811\ub450\uc5b4) \uae30\ubc18\uc73c\ub85c 40\uac1c \uc774\uc0c1\uc758 \uba85\ub839\uc5b4\ub97c \uc9c0\uc6d0\ud558\uba70, \ud55c\uad6d\uc5b4 \ucd08\uc131 \uac80\uc0c9\ub3c4 \ub429\ub2c8\ub2e4 (\u3145\u3137 \u2192 \uc124\uc815)."), + + // ─── 3. 핵심 기능 ─── + h1("3. \ud575\uc2ec \uae30\ub2a5 \uc18c\uac1c"), + p("AX Commander\ub294 \ub2e8\uc21c\ud55c \uc571 \ub7f0\ucc98\uac00 \uc544\ub2d9\ub2c8\ub2e4. \uc544\ub798\ub294 \uce74\ud14c\uace0\ub9ac\ubcc4 \uc8fc\uc694 \uae30\ub2a5\uc785\ub2c8\ub2e4."), + + h3("\uac80\uc0c9"), + bullet("\ud37c\uc9c0 \uac80\uc0c9: \uc571/\ud30c\uc77c\uba85\uc744 \uc77c\ubd80\ub9cc \uc785\ub825\ud574\ub3c4 \ucc3e\uc544\uc90c"), + bullet("\ud55c\uad6d\uc5b4 \ucd08\uc131: \u3147\u314e\u3134 \u2192 \uc544\ud55c\uae00 \uac80\uc0c9"), + bullet("\uc2e4\ud589 \ube48\ub3c4 \ud559\uc2b5: \uc790\uc8fc \uc4f0\ub294 \uc571\uc774 \uc0c1\ub2e8\uc73c\ub85c"), + + h3("\uacc4\uc0b0 \u00b7 \ubcc0\ud658"), + bullet("= sqrt(144), = 0xFF + 1, = 100km in miles"), + bullet("= 100 USD to KRW (\uc2e4\uc2dc\uac04 \ud658\uc728)"), + bullet("date +30d (30\uc77c \ud6c4 \ub0a0\uc9dc), date unix (\ud0c0\uc784\uc2a4\ud0ec\ud504)"), + + h3("\ud074\ub9bd\ubcf4\ub4dc"), + bullet("# \ud788\uc2a4\ud1a0\ub9ac: \ubcf5\uc0ac \uc774\ub825 \uac80\uc0c9 \u00b7 \uc7ac\uc0ac\uc6a9 \u00b7 \ubcd1\ud569"), + bullet("$ \ubcc0\ud658: JSON \uc815\ub82c, Base64, URL \uc778\ucf54\ub529 \ub4f1 12\uc885"), + bullet("pipe \ud30c\uc774\ud504\ub77c\uc778: pipe upper > trim > b64e"), + bullet("batch \uc77c\uad04 \ucc98\ub9ac: \uc904\ubc88\ud638, \uc815\ub82c, \uc911\ubcf5\uc81c\uac70, \ucebc\ub2f8\uc138 \uac10\uc2f8\uae30"), + bullet("DPAPI \uc554\ud638\ud654: \ud074\ub9bd\ubcf4\ub4dc \ud788\uc2a4\ud1a0\ub9ac \ud30c\uc77c\uc774 \ud604\uc7ac Windows \uacc4\uc815\uc5d0\uc11c\ub9cc \ubcf5\ud638\ud654 \uac00\ub2a5"), + + h3("\uac1c\ubc1c\uc790 \ub3c4\uad6c"), + bullet("json format / minify / validate"), + bullet("encode base64 / url / sha256"), + bullet("color #FF5500 \u2192 HEX/RGB/HSL/HSV 4\uc885 \ubcc0\ud658"), + bullet("port 3000 \u2192 \uc810\uc720 \ud504\ub85c\uc138\uc2a4 \ud655\uc778"), + bullet("env PATH \u2192 \ud658\uacbd\ubcc0\uc218 \uac80\uc0c9"), + bullet("pick \u2192 \uc2a4\ud3ec\uc774\ub4dc\ub85c \ud654\uba74 \uc0c9\uc0c1 HEX \ucf54\ub4dc \ucd94\ucd9c"), + + h3("\ud654\uba74 \ucea1\ucc98"), + bullet("cap screen / window / scroll / region"), + bullet("\uc2a4\ud3ec\uc774\ub4dc(pick): \ub3cb\ubcf4\uae30 + \uc2e4\uc2dc\uac04 HEX \ud45c\uc2dc + 5\ucd08 \uacb0\uacfc\ucc3d"), + bullet("\uae00\ub85c\ubc8c \ub2e8\ucd95\ud0a4(PrintScreen \ub4f1) \uc9c0\uc6d0"), + bullet("\ubcf4\uc548: \ud074\ub9bd\ubcf4\ub4dc\uc5d0\ub9cc \ubcf5\uc0ac (\ud30c\uc77c \uc800\uc7a5 \uae30\ub2a5 \uc5c6\uc74c)"), + + h3("\ucc3d \uad00\ub9ac \u00b7 \uc2dc\uc2a4\ud15c"), + bullet("! save/restore: \ucc3d \ubc30\uce58 \uc2a4\ub0c5\uc0f7"), + bullet("snap left/right/full: \ucc3d \ubd84\ud560 \ub808\uc774\uc544\uc6c3"), + bullet("win: \uc5f4\ub9b0 \ucc3d \uac80\uc0c9 \u2192 \uc989\uc2dc \uc804\ud658 (Alt+Tab \ub300\uccb4)"), + bullet("/lock, /timer 5m, /alarm 14:30"), + bullet("svc: Windows \uc11c\ube44\uc2a4 \uad00\ub9ac + \ud074\ub9bd\ubcf4\ub4dc \uac15\uc81c \uc7ac\uc2dc\uc791"), + + h3("\uc5c5\ubb34 \uc790\ub3d9\ud654"), + bullet("journal: \uc624\ub298 \uc0ac\uc6a9\ud55c \uc571/\uba85\ub839\uc5b4 \uae30\ubc18 \uc5c5\ubb34 \uc77c\uc9c0 \ub9c8\ud06c\ub2e4\uc6b4 \uc790\ub3d9 \uc0dd\uc131"), + bullet("routine: \ucd9c\uadfc/\ud1f4\uadfc \ub8e8\ud2f4 \ub4f1\ub85d \u2192 \ud55c \ubc88\uc5d0 \uc2e4\ud589"), + bullet("scaffold: \ud504\ub85c\uc81d\ud2b8 \ud3f4\ub354 \uad6c\uc870 \ud15c\ud50c\ub9bf \uc77c\uad04 \uc0dd\uc131"), + + new Paragraph({ children: [new PageBreak()] }), + + // ─── 4. 보안 ─── + h1("4. \ubcf4\uc548 \u2014 \uc0ac\ub0b4 \uc804\uc6a9 \uc6d0\uce59"), + p("AX Commander\ub294 \uc0ac\ub0b4 \uc804\uc6a9 \ud504\ub85c\uadf8\ub7a8\uc73c\ub85c, \uc678\ubd80 \ub124\ud2b8\uc6cc\ud06c \ud1b5\uc2e0\uc744 \uc77c\uccb4 \ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4."), + bullet("\uc678\ubd80 HTTP/HTTPS \ud638\ucd9c \uae08\uc9c0 \u2014 HttpClient, WebClient \ub4f1 \uc0ac\uc6a9 \ubd88\uac00"), + bullet("\uc678\ubd80 SDK \uc5f0\ub3d9 \uae08\uc9c0 \u2014 \ud074\ub77c\uc6b0\ub4dc AI, SaaS \ub77c\uc774\ube0c\ub7ec\ub9ac \ubd88\uac00"), + bullet("\ud074\ub9bd\ubcf4\ub4dc \ud788\uc2a4\ud1a0\ub9ac \u2014 Windows DPAPI \uc554\ud638\ud654 (CurrentUser \ubc94\uc704)"), + bullet("\ud654\uba74 \ucea1\ucc98 \u2014 \ud074\ub9bd\ubcf4\ub4dc\uc5d0\ub9cc \ubcf5\uc0ac, \ud30c\uc77c \uc800\uc7a5 \uae30\ub2a5 \uc644\uc804 \uc81c\uac70"), + bullet("\uc2dc\uc2a4\ud15c \uba85\ub839 \u2014 \uc7ac\uc2dc\uc791/\uc885\ub8cc \ub4f1 \uc704\ud5d8 \uba85\ub839 \uc2e4\ud589 \uc804 2\ub2e8\uacc4 \ud655\uc778 \ub2e4\uc774\uc5bc\ub85c\uadf8"), + + // ─── 5. 테마 ─── + h1("5. \ud14c\ub9c8 \uc2dc\uc2a4\ud15c"), + p("9\uac1c \ub0b4\uc7a5 \ud14c\ub9c8(Dark, Light, OLED, Nord, Monokai, Catppuccin, Sepia, Alfred, Alfred Light) + \ucee4\uc2a4\ud140 \ud14c\ub9c8\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4."), + bullet("\uac01 \ud14c\ub9c8\ub294 \uc0c9\uc0c1\ubfd0 \uc544\ub2c8\ub77c \ubaa8\uc11c\ub9ac \ub77c\uc6b4\ub529 \ube44\uc728\ub3c4 \ub2e4\ub985\ub2c8\ub2e4 (OLED\uac00 \uac00\uc7a5 \ub465\uae00\uace0, Monokai\uac00 \uac00\uc7a5 \uac01\uc9d0)"), + bullet("\ucee4\uc2a4\ud140 \ud14c\ub9c8\ub294 14\uac1c \uc0c9\uc0c1 + \ubaa8\uc11c\ub9ac \ub77c\uc6b4\ub529 \uc2ac\ub77c\uc774\ub354\ub85c \uc790\uc720\ub86d\uac8c \ud3b8\uc9d1"), + bullet("\ud2b8\ub808\uc774 \uba54\ub274\ub3c4 \ud604\uc7ac \ud14c\ub9c8\ub97c \uc790\ub3d9\uc73c\ub85c \ub530\ub77c\uac10"), + + // ─── 6. 기술 스택 ─── + h1("6. \uae30\uc220 \uc2a4\ud0dd"), + bullet(".NET 8, WPF (UseWPF=true), WinForms (ColorDialog/FolderBrowser \ub4f1 \uc81c\ud55c\uc801 \uc0ac\uc6a9)"), + bullet("P/Invoke: SetWindowPos, PrintWindow, GlobalMemoryStatusEx, EnumWindows, GetPixel \ub4f1 Windows API \uc9c1\uc811 \ud638\ucd9c"), + bullet("\ub2e8\uc77c EXE \ubc30\ud3ec: Self-Contained + PublishSingleFile + IncludeNativeLibrariesForSelfExtract"), + bullet("\ubcf4\uc548: DPAPI(System.Security.Cryptography.ProtectedData), HKCU \ub808\uc9c0\uc2a4\ud2b8\ub9ac"), + bullet("\ud14c\uc2a4\ud2b8: xUnit 2.9.0 + FluentAssertions (57\uac1c \ub2e8\uc704 \ud14c\uc2a4\ud2b8)"), + + // ─── 7. 마무리 ─── + h1("7. \ub9c8\ubb34\ub9ac \u2014 LLM\uacfc \ud568\uaed8 \ub9cc\ub4e0 \ud504\ub85c\uc81d\ud2b8"), + p("AX Commander\ub294 \uae30\ud68d\ubd80\ud130 \uad6c\ud604, \ud14c\uc2a4\ud2b8, \ubb38\uc11c\ud654\uae4c\uc9c0 LLM(Claude)\uacfc \ud568\uaed8 \uc9c4\ud589\ud55c \ud504\ub85c\uc81d\ud2b8\uc785\ub2c8\ub2e4."), + bullet("\uae30\ud68d: Alfred, Raycast \ub4f1 \uae30\uc874 \ub7f0\ucc98\uc758 \uc7a5\uc810\uc744 \ubd84\uc11d\ud558\uace0, \uc0ac\ub0b4 \ud658\uacbd\uc5d0 \ub9de\ub294 \uae30\ub2a5 \uc120\ubcc4"), + bullet("\uad6c\ud604: WPF + P/Invoke \uae30\ubc18\uc73c\ub85c \uc678\ubd80 \uc758\uc874\uc131 \uc5c6\uc774 40\uac1c+ \uae30\ub2a5 \uad6c\ud604"), + bullet("\uac80\uc218: \ucf54\ub4dc \ub9ac\ubdf0, \uc624\ub958 \ubd84\uc11d, \ubcf4\uc548 \uc810\uac80, \uc131\ub2a5 \ucd5c\uc801\ud654\ub97c LLM\uacfc \ud568\uaed8 \ubc18\ubcf5"), + bullet("\ubb38\uc11c: \uac1c\ubc1c \ubb38\uc11c, \uc0ac\uc6a9\uc790 \ub9e4\ub274\uc5bc, \ube14\ub85c\uadf8 \uae00\uae4c\uc9c0 LLM\uc774 \uc791\uc131"), + p(""), + para(new TextRun({ text: "\uac1c\uc778\uc801\uc73c\ub85c \ub290\ub080 \uac83\uc740, LLM\uc740 \u2018\ucf54\ub4dc \uc0dd\uc131\uae30\u2019\uac00 \uc544\ub2c8\ub77c \u2018\ud568\uaed8 \uc0dd\uac01\ud558\ub294 \ub3d9\ub8cc\u2019\uc5d0 \uac00\uae5d\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4.", italics: true })), + para(new TextRun({ text: "\u201c\uc774 \uae30\ub2a5\uc740 \uc774\ub807\uac8c \ud558\uba74 \uc5b4\ub5a0\ub0d0?\u201d \u201c\uc774 \ubd80\ubd84\uc740 \ubcf4\uc548 \ub9ac\uc2a4\ud06c\uac00 \uc788\uc5b4\u201d \u201c\uc0ac\uc6a9\uc790\uac00 \uc774\ub807\uac8c \uc4f0\uba74 \ubb38\uc81c\ub420 \uc218 \uc788\uc5b4\u201d \u2014 \uc774\ub7f0 \ud53c\ub4dc\ubc31\uc744 \uc8fc\uace0\ubc1b\uc73c\uba70 \ud504\ub85c\uc81d\ud2b8\ub97c \uc644\uc131\ud588\uc2b5\ub2c8\ub2e4.", italics: true })), + p(""), + p("AX Commander v1.0 \u2014 \ubaa8\ub4e0 \uc5c5\ubb34\ub97c \ud0a4\ubcf4\ub4dc \ud558\ub098\ub85c.", { bold: true }), + + new Paragraph({ spacing: { before: 400 }, + border: { top: { style: BorderStyle.SINGLE, size: 2, color: "CCCCCC", space: 8 } }, + children: [ + new TextRun({ text: "\ubc31\uc2b9\uc7ac \u00b7 AX\uc5f0\uad6c\uc18c AI\ud300 \u00b7 SW Architect \u00b7 www.swarchitect.net", size: 18, color: "999999" }) + ] + }), + ] + }] +}); + +Packer.toBuffer(doc).then(buffer => { + fs.writeFileSync("E:\\AX Commander\\docs\\AX_Commander_블로그_소개글.docx", buffer); + console.log("Blog post DOCX created successfully!"); +}); diff --git a/encrypt_guides.ps1 b/encrypt_guides.ps1 new file mode 100644 index 0000000..444961d --- /dev/null +++ b/encrypt_guides.ps1 @@ -0,0 +1,52 @@ +# Encrypt guide files using AES-256-CBC with fixed key/IV +$base = Split-Path -Parent $MyInvocation.MyCommand.Path +$assetsDir = Join-Path $base "src\AxCopilot\Assets" + +$key = [byte[]]@(0x41,0x58,0x43,0x6F,0x70,0x69,0x6C,0x6F, + 0x74,0x47,0x75,0x69,0x64,0x65,0x4B,0x65, + 0x79,0x32,0x30,0x32,0x36,0x53,0x65,0x63, + 0x75,0x72,0x65,0x46,0x69,0x78,0x65,0x64) + +$iv = [byte[]]@(0x47,0x75,0x69,0x64,0x65,0x49,0x56,0x46, + 0x69,0x78,0x65,0x64,0x32,0x30,0x32,0x36) + +function Encrypt-File($inputPath, $outputPath) { + $plainBytes = [System.IO.File]::ReadAllBytes($inputPath) + + $aes = [System.Security.Cryptography.Aes]::Create() + $aes.Key = $key + $aes.IV = $iv + $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC + $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 + + $enc = $aes.CreateEncryptor() + $encrypted = $enc.TransformFinalBlock($plainBytes, 0, $plainBytes.Length) + + [System.IO.File]::WriteAllBytes($outputPath, $encrypted) + $enc.Dispose() + $aes.Dispose() + + Write-Host "Encrypted: $inputPath -> $outputPath ($($plainBytes.Length) -> $($encrypted.Length) bytes)" +} + +# Find guide files +$htmFiles = Get-ChildItem $assetsDir -Filter "*.htm" +foreach ($f in $htmFiles) { + Write-Host "Found: $($f.Name) ($($f.Length) bytes)" + if ($f.Name.Length -eq 20) { + # Shorter name = user guide (사용가이드) + $userGuidePath = $f.FullName + } else { + # Longer name = developer guide (개발자가이드) + $devGuidePath = $f.FullName + } +} + +if ($userGuidePath) { + Encrypt-File $userGuidePath (Join-Path $assetsDir "guide_user.enc") +} +if ($devGuidePath) { + Encrypt-File $devGuidePath (Join-Path $assetsDir "guide_dev.enc") +} + +Write-Host "Done!" diff --git a/etc/AX Copilot 단축키 & 프리픽스 모음.htm b/etc/AX Copilot 단축키 & 프리픽스 모음.htm new file mode 100644 index 0000000..b84ecec --- /dev/null +++ b/etc/AX Copilot 단축키 & 프리픽스 모음.htm @@ -0,0 +1,296 @@ + + + + + + + + + + +

AX Copilot 단축키 & 예약어 완전 정복

+

Windows 시맨틱 런처 AX Copilot v1.0.3의 키보드 단축키와 명령 예약어를 한눈에 정리했습니다.
+v1.0.3 업데이트: 단축키 9종 구현 완료 · 예약어 변경 (~→워크스페이스, cd→폴더, !→비어있음) · 설정 버전 마이그레이션 프레임워크 추가
+3차 구현 완료: 단축키 8종(Ctrl+T/F/P/D/W/K 모달/B토글/Home·End) · 기능 개선 5종(토스트 애니메이션/즐겨찾기 토글/액션 삭제/모달 도움말) · 설정창 기능 탭 추가 · 버전 자동 동기화
+4차 구현 완료: 설정 기능 탭 → 런처 실동작 연결 (6종 토글) · Ctrl+K/ShortcutHelpWindow 테마 연동 · 헬프창 글로벌 단축키 동기화 · 사용 통계 즐겨찾기 섹션 추가

+ + +

✅ 1. 현재 사용 중인 단축키

+ + +

🌐 전역 (시스템 전체)

+ + + + +
단축키동작비고
Alt + Space런처 창 열기 / 닫기 (토글)기본값, 설정에서 변경 가능
PrintScreen화면 캡처 즉시 실행설정에서 활성화 필요 (기본 OFF)
+ +

🪟 런처 창 (LauncherWindow)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
단축키동작비고
Escape창 닫기 / 액션 모드 종료
Enter선택 항목 실행
Shift + Enter병합 실행 또는 대형 텍스트 표시결과 선택 상태일 때
/ 결과 목록 위/아래 이동
Shift + ↑병합 모드 ON + 위 항목 선택
Shift + ↓병합 모드 ON + 아래 항목 선택
(오른쪽)액션 모드 진입 (컨텍스트 메뉴)
Tab선택 항목 제목으로 자동완성
Ctrl + ,설정 창 열기
F1도움말 창 열기✨ v1.0.3 신규
F5인덱스 새로 고침✨ v1.0.3 신규
Delete목록에서 항목 제거 (확인 다이얼로그)✨ v1.0.3 신규
Ctrl + L입력창 초기화 (Clear)✨ v1.0.3 신규
Ctrl + C선택 항목 이름 복사 (파일 선택 시)✨ v1.0.3 신규
Ctrl + Shift + C전체 경로 복사 (Copy as path)✨ v1.0.3 신규
Ctrl + Shift + E파일 탐색기에서 열기✨ v1.0.3 신규
Ctrl + Enter관리자 권한으로 실행 (Run as Admin)✨ v1.0.3 신규
Alt + Enter파일 속성 보기 (Properties)✨ v1.0.3 신규
Ctrl + H클립보드 히스토리 열기✨ v1.0.3 신규
Ctrl + R최근 실행 항목 보기✨ v1.0.3 신규
Ctrl + B즐겨찾기 열기✨ v1.0.3 신규
Ctrl + K단축키 도움말 팝업✨ v1.0.3 신규
Ctrl + 1~9N번째 결과 즉시 실행✨ v1.0.3 신규
F2파일 이름 바꾸기✨ v1.0.3 신규
PageUp / PageDown결과 5개씩 페이지 스크롤✨ v1.0.3 신규
+ +

🗂 기타 창

+ + + + + + + +
단축키동작대상 창
Escape창 닫기도움말 / 색상 선택기 / 알림 팝업 / 대형 텍스트
/ 카테고리 이동도움말 창
↑↓←→선택 영역 1px 미세 조정영역 선택 (캡처)
Shift + 방향키선택 영역 10px 이동영역 선택 (캡처)
Enter영역 확정 후 캡처영역 선택 (캡처)
+ + +

🔓 2. 비어있는 단축키 (신기능 배정 가능)

+ + +

💡 아래 단축키들은 런처 창 내부 기준입니다. 전역 단축키는 설정에서 자유롭게 지정 가능합니다.

+ +

⌨ 단독 키

+ + + + +
단축키추천 기능우선순위
(왼쪽)뒤로 가기 / 상위 폴더★★☆
Home / End첫 번째 / 마지막 결과로 이동★☆☆
+ +

⌃ Ctrl 계열

+ + + + + + + +
단축키추천 기능우선순위
Ctrl + P결과 상단 고정 (Pin)★★☆
Ctrl + T창 항상 위 (Always on Top) 토글★★☆
Ctrl + F전문 검색 모드 (Full-text)★★☆
Ctrl + W창 닫기 (브라우저 스타일)★☆☆
Ctrl + D인덱스에서 제거★☆☆
+ +

⌥ Alt 계열

+ + + + +
단축키추천 기능우선순위
Alt + ↑상위 폴더로 이동★★☆
Alt + 1~5즐겨찾기 슬롯 즉시 실행★★☆
+ +

⇧ Shift 계열

+ + + + +
단축키추천 기능우선순위
Shift + Delete휴지통 없이 즉시 삭제★★☆
Shift + Tab역방향 자동완성★☆☆
+ + +

🔤 3. 명령 예약어 전체 목록

+ + +

런처 입력창에서 예약어를 입력하면 해당 기능이 활성화됩니다.

+ +

⚡ 특수 기호 예약어

+ + + + + + + + + + + + + + +
예약어기능사용 예시
=계산기 (Calculator)= 1+2*3 → 결과 7
$클립보드 텍스트 변환$ upper → 대문자 변환
@URL 열기 (Alias)@ google → 등록된 URL 열기
~워크스페이스 관리~save 개발, ~개발 → 창 배치 복원
>터미널 명령 실행> ipconfig → CMD 실행
^앱/파일 직접 실행 (Run)^ notepad
!비어있음 (신기능 배정 가능)
?웹 검색? WPF binding → 브라우저 검색
#클립보드 히스토리# → 최근 복사 목록
;스니펫 (텍스트 템플릿); email → 이메일 스니펫 붙여넣기
/시스템 명령/ shutdown, / lock
*시스템 정보 (Quick Info)* ip, * cpu
+ +

📝 영문 키워드 예약어

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
예약어기능사용 예시
cd폴더 열기 (별칭)cd dl, cd work, cd desktop
help도움말 / 명령어 목록help → 전체 도움말 창
cap화면 캡처 (설정에서 변경 가능)cap screen, cap window, cap region
date날짜 계산date +30 → 30일 후 날짜
color색상 코드 변환color #FF5733 → RGB/HSL 보기
pick색상 선택기 (Eyedropper)pick → 화면에서 색상 추출
encode인코딩 / 디코딩encode base64 hello
emoji이모지 검색emoji 웃음
jsonJSON 파싱 / 미리보기json {"a":1}
note노트 관리note 회의 메모 내용
recent최근 사용 파일recent → 목록 보기
fav즐겨찾기 관리fav add, fav list
batch일괄 텍스트 처리batch number, batch sort, batch prefix >>
pipe클립보드 파이프라인pipe upper | trim
diff텍스트 비교diff → 두 텍스트 비교
journal업무 일지journal 오늘 한 일
routine루틴 관리routine start 출근
rename파일 이름 일괄 변경rename *.jpg → photo_*.jpg
scaffold프로젝트 스캐폴드scaffold react
snap창 스냅 / 정렬snap left, snap grid
win창 전환 (Window Switcher)win chrome
port포트 확인port 8080 → 사용 중인 프로세스 확인
kill프로세스 종료kill chrome
svcWindows 서비스 관리svc list, svc stop 이름
env환경변수 조회env PATH
info시스템 정보 상세info cpu, info disk
media미디어 제어media play, media next
monitor모니터 관리monitor list
uninstall프로그램 제거uninstall 프로그램명
stats텍스트 통계 (글자수/단어수)stats → 클립보드 텍스트 분석
+ + +

✅ 4. 1차 구현 완료 (v1.0.3)

+ + + + + + + + + + + + + +
단축키기능상태
F1도움말 창 열기✅ 구현 완료
F5인덱스 새로 고침✅ 구현 완료
Delete항목 제거 (확인 다이얼로그 포함)✅ 구현 완료
Ctrl + Enter관리자 권한 실행✅ 구현 완료
Ctrl + C선택 항목 이름 복사✅ 구현 완료
Ctrl + L입력창 초기화✅ 구현 완료
Ctrl + Shift + C전체 경로 복사✅ 구현 완료
Ctrl + Shift + E탐색기에서 열기✅ 구현 완료
Alt + Enter파일 속성 보기✅ 구현 완료
+ + +

✅ 5. 2차 구현 완료 (v1.0.3)

+ + +

🎯 단축키 7종 추가

+ + + + + + + + + +
단축키기능상태
Ctrl + H클립보드 히스토리 바로 열기✅ 구현 완료
Ctrl + R최근 실행 항목 보기✅ 구현 완료
Ctrl + B즐겨찾기 열기✅ 구현 완료
Ctrl + K단축키 도움말 팝업✅ 구현 완료
Ctrl + 1~9n번째 결과 즉시 실행✅ 구현 완료
F2파일 이름 바꾸기 (rename 전환)✅ 구현 완료
PageUp / PageDown결과 5개씩 페이지 스크롤✅ 구현 완료
+ +

🛠 기능 개선 5종

+ + + + + + + +
항목설명상태
설정 마이그레이션 알림버전 업데이트 시 변경사항 MessageBox 자동 표시✅ 완료
도움말 검색3탭 메뉴 우측에 검색박스 추가, 실시간 필터링✅ 완료
번호 뱃지결과 항목 1~9 번호 표시, Ctrl+N으로 즉시 실행✅ 완료
액션 모드 확장→ 진입 시: 경로복사, 전체경로복사, 탐색기, 관리자, 터미널, 속성, 이름변경✅ 완료
토스트 오버레이별도 UI 컴포넌트 (녹색 배경, 체크 아이콘, 2초 자동 숨김)✅ 완료
+ + +

✅ 6. 3차 구현 완료 (v1.0.3)

+ + +

🎯 단축키 8종 추가

+ + + + + + + + + + +
단축키실제 동작상태
Ctrl + T선택된 파일/폴더 경로에서 터미널(wt → cmd 순) 열기. 미선택 시 홈 디렉터리✅ 구현 완료
Ctrl + F입력창 초기화 후 포커스 이동 → 파일명 검색 즉시 시작✅ 구현 완료
Ctrl + P선택된 파일/폴더를 즐겨찾기에 즉시 추가. 이미 있으면 제거 (토스트 알림)✅ 구현 완료
Ctrl + D사용자 Downloads 폴더 경로를 입력창에 채워 탐색기로 열 수 있게 함✅ 구현 완료
Ctrl + W런처 창 즉시 닫기 (브라우저 탭 닫기 스타일)✅ 구현 완료
Home / End입력 커서가 맨 앞/끝일 때 결과 목록 첫/마지막 항목으로 점프✅ 구현 완료
Ctrl + B (개선)fav 입력 상태면 초기화(닫기), 아니면 fav 입력(열기) — 토글 방식✅ 개선 완료
Ctrl + K (개선)MessageBox → 전용 ShortcutHelpWindow 모달 창 (카테고리별 아이콘 표)✅ 개선 완료
+ +

🛠 기능 개선 5종

+ + + + + + + +
항목내용상태
토스트 애니메이션페이드 인(0.18s QuadEaseOut) + 페이드 아웃(0.28s QuadEaseIn) XAML Storyboard 적용✅ 완료
액션 모드 파일 삭제→ 메뉴에 "휴지통으로 이동" 추가. Shell32 SHFileOperation P/Invoke로 RecycleBin 전송, 확인 다이얼로그 포함✅ 완료
설정창 기능 탭번호배지/프리픽스배지/포커스잃으면닫기/액션모드/최근기록/즐겨찾기/스니펫자동확장 7종 토글 + 단축키 참조표✅ 완료
헬프창 단축키 설명 상세화각 단축키 Description을 "어떤 동작인지" 구체적으로 1~2문장으로 기술. 신규 단축키 10종 추가✅ 완료
버전 자동 동기화설정창 하단 버전 표시를 csproj <Version> 에서 동적으로 읽음. 주석 및 가이드 추가✅ 완료
+ + +

✅ 7. 4차 구현 완료

+ + +

단축키 후보(Ctrl+G/U/E/M)는 기능 과잉 우려로 미채택. 기능 개선 4종 완료.

+ + + + + + + + +
항목설명상태
설정창 기능 탭 → 런처 실동작 연결ShowNumberBadges(배지 표시/숨김) · ShowPrefixBadge(예약어 배지) · CloseOnFocusLost(자동 닫기) · EnableActionMode(→ 키) · EnableFavorites(fav 차단) · EnableRecent(recent 차단)✅ 완료
Ctrl+K ShortcutHelpWindow 테마 연동현재 테마의 LauncherBackground·ItemBackground·PrimaryText·SecondaryText를 DynamicResource로 적용✅ 완료
헬프창 글로벌 단축키 동기화설정에서 변경한 전역 단축키가 헬프 창 단축키 목록(F1)에 즉시 반영✅ 완료
사용 통계 → 즐겨찾기 항목 포함stats 화면 하단에 즐겨찾기 최근 6개 항목 섹션 추가 (HasFavorites=false이면 숨김)✅ 완료
설정창 단축키 녹화(HotkeyRecorder) 수정Window 레벨 PreviewKeyDown으로 포커스 이탈 시에도 키 녹화 안정화, Alt 조합키(Key.System) 정상 처리✅ 완료
+ +

📋 8. 5차 추천 작업 목록

+ + +

🛠 다음 기능 개선 후보

+ + + + +
항목설명우선순위
! 예약어 신기능 배정비어있는 ! 기호에 새 기능 할당 (즉시 알림/메모/북마크 등)★★★
런처 테마별 정중앙 미세조정각 테마의 아이콘/텍스트 수직 정렬 픽셀 단위 검수 및 미세 조정★★☆
+ + + + + diff --git a/etc/AX Copilot 블로그 포스팅.htm b/etc/AX Copilot 블로그 포스팅.htm new file mode 100644 index 0000000..26b48f1 --- /dev/null +++ b/etc/AX Copilot 블로그 포스팅.htm @@ -0,0 +1,664 @@ + + + + + +AX Copilot 단축키 & 예약어 완전 정복 — 키보드 하나로 모든 업무를 + + + +
+ + + + +
+
🚀 AX Copilot 사용 가이드
+

단축키 & 예약어 완전 정복
— 키보드 하나로 모든 업무를

+

+ Windows 전용 시맨틱 런처 AX Copilot의 모든 단축키와 명령 예약어를 한 페이지에 정리했습니다.
+ Alt+Space 한 번으로 앱 실행·파일 검색·계산·클립보드·화면 캡처·창 전환·시스템 제어 등 40개 이상의 기능을 즉시 호출합니다. +

+
v1.0.3
+
+ + + + +

⚡ 가장 많이 쓰는 단축키 한눈에

+
+
+
⌨️
+
Alt + Space
런처 열기 / 닫기
+
+
+
+
Enter
선택 항목 실행
+
+
+
+
→ (오른쪽)
파일 액션 모드 진입
+
+
+
+
Escape
닫기 / 이전 단계로
+
+
+
📋
+
Ctrl + H
클립보드 히스토리
+
+
+
+
Ctrl + B
즐겨찾기 보기 토글
+
+
+
📌
+
Ctrl + P
즐겨찾기 추가 / 제거
+
+
+
?
+
Ctrl + K
단축키 참조창 열기
+
+
+
🖥
+
Ctrl + T
터미널에서 열기
+
+
+
📂
+
Ctrl + D
다운로드 폴더
+
+
+
🔢
+
Ctrl + 1~9
N번째 항목 즉시 실행
+
+
+
F5
+
F5
인덱스 새로고침
+
+
+ +
+💡 Tip. 입력창이 비어 있을 때 Home/End 키를 누르면 결과 목록의 첫/마지막 항목으로 바로 이동합니다. +설정에서 글로벌 단축키를 원하는 키 조합으로 자유롭게 변경할 수 있습니다. +
+ + + + +

🌐 1. 전역 단축키 (시스템 전체)

+
+ + + + + + + + + + +
단축키동작비고
Alt + Space런처 창 열기 / 닫기 (토글)기본값 · 설정에서 변경 가능
PrintScreen화면 캡처 즉시 실행설정 › 캡처에서 활성화 필요
+
+ + + + +

🪟 2. 런처 창 단축키 (LauncherWindow)

+ +
📍 탐색 & 선택
+
+ + + + + + + + + + + + + + +
단축키동작상세
/ 결과 목록 위/아래 이동끝에서 누르면 반대쪽으로 순환
PageUp / PageDown5칸씩 빠른 이동
Home / End첫 항목 / 마지막 항목으로 점프입력창 커서 위치 기반
Tab선택 항목 제목을 입력창에 자동완성
파일 액션 모드 진입복사·터미널·속성·삭제 등
Escape액션 모드 종료 / 런처 닫기
+
+ +
▶ 실행
+
+ + + + + + + + + + + + + +
단축키동작상세
Enter선택 항목 실행파일·앱·URL·명령 모두 지원
Ctrl + Enter관리자 권한으로 실행UAC 권한 상승 후 실행
Alt + Enter파일 속성 대화상자 열기
Shift + Enter대형 텍스트 표시 / 클립보드 병합Large Type 또는 다중 선택 병합
Ctrl + 1 ~ 9N번째 결과 항목 즉시 실행번호 배지와 연동
+
+ +
🔧 기능 단축키
+
+ + + + + + + + + + + + + + + + + +
단축키동작상세
F1도움말 창 열기help 입력과 동일
F2선택 파일 이름 변경 모드
F5파일 인덱스 즉시 재구축새 파일 추가 후 사용
Delete최근 실행 목록에서 항목 제거확인 다이얼로그 후 실행
Ctrl + ,설정 창 열기
Ctrl + L입력창 전체 초기화
Ctrl + W런처 즉시 닫기
Ctrl + K단축키 참조 모달창 열기Esc로 닫기
Ctrl + F파일 검색 모드로 전환입력 초기화 후 포커스 이동
+
+ +
📋 파일 & 클립보드
+
+ + + + + + + + + + + + + + + + + +
단축키동작상세
Ctrl + C선택 항목 파일 이름 복사확장자 제외 이름만
Ctrl + Shift + C전체 경로 복사절대 경로를 클립보드에
Ctrl + Shift + E파일 탐색기에서 열기해당 파일이 하이라이트됨
Ctrl + T선택 항목 위치에서 터미널 열기wt.exe → cmd.exe 폴백
Ctrl + P즐겨찾기 추가 / 제거 (핀)토스트로 결과 알림
Ctrl + B즐겨찾기 목록 보기 토글fav 입력 / 초기화
Ctrl + R최근 실행 목록 보기 토글recent 입력 / 초기화
Ctrl + H클립보드 히스토리 열기# 입력과 동일
Ctrl + D다운로드 폴더 바로가기Downloads 경로를 입력창에
+
+ + + + +

⚡ 3. 특수 기호 예약어

+

+입력창 맨 앞에 특수 기호를 입력하면 해당 기능 모드로 즉시 전환됩니다. +예약어 없이 입력하면 앱·파일·폴더 퍼지 검색이 실행됩니다. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
예약어기능사용 예시
=계산기 · 단위 변환 · 수식 계산= 1920*1080 → 결과 2073600
결과를 Enter하면 클립보드에 복사
$클립보드 텍스트 변환$ upper → 대문자 변환
$ trim → 공백 제거
@URL 열기 (등록된 별칭)@blog → 등록된 블로그 URL 열기
~워크스페이스 저장 · 복원 · 목록~save 개발 저장
~개발 창 배치 복원
>터미널 명령 즉시 실행> ipconfig
> ping google.com
^앱·파일 직접 실행 (Run)^ notepad
^ calc
?웹 검색 (기본 브라우저)? WPF DataBinding
설정에서 검색 엔진 변경 가능
#클립보드 히스토리 검색·붙여넣기# → 전체 목록
# 회의 → 필터 검색
;스니펫 (텍스트 템플릿) 즉시 확장; email → 이메일 서명 붙여넣기
실시간으로 커서 위치에 자동 삽입
/시스템 명령 실행/ lock, / sleep
/ shutdown, / restart
*시스템 정보 빠른 조회* ip, * cpu
* disk → 드라이브 용량
!예약됨 (신기능 배정 예정)
+
+ +
+ℹ️ 스니펫 자동 확장 (;) — 런처 없이 어느 앱에서든 미리 등록해 둔 키워드를 입력하면 즉시 텍스트가 확장됩니다. +설정 › 스니펫에서 키워드·내용을 자유롭게 관리할 수 있습니다. +
+ + + + +

📝 4. 영문 키워드 예약어

+

+영문 키워드를 입력창에 입력하면 해당 기능 핸들러가 활성화됩니다. +cd(폴더), fav(즐겨찾기), recent(최근 실행) 등이 대표적입니다. +

+ +
📁 파일 & 폴더
+
+ + + + + + + + + + + + +
예약어기능사용 예시
cd폴더 열기 (등록된 별칭)cd desktop, cd work, cd C:\projects
fav즐겨찾기 목록 검색 & 열기fav 전체, fav add 보고서 C:\work\r.xlsx
recent최근 실행 항목 목록recent, recent chrome
rename파일 이름 일괄 변경rename *.jpg → photo_*.jpg
+
+ +
🖥 시스템 & 정보
+
+ + + + + + + + + + + + + + + + + + +
예약어기능사용 예시
info시스템 정보 (CPU·RAM·드라이브·IP 등)info cpu → 리소스 모니터, info disk → 탐색기
env환경변수 조회 & 복사env PATH, env APPDATA
kill프로세스 종료kill chrome, kill notepad
port포트 사용 프로세스 확인port 8080
svcWindows 서비스 관리svc list, svc stop wuauserv
win창 전환 (Window Switcher)win chrome, win code
snap창 스냅 & 정렬snap left, snap grid
media미디어 재생 제어media play, media next, media vol 80
monitor모니터 관리monitor list
uninstall프로그램 제거uninstall slack
+
+ +
📋 텍스트 & 클립보드
+
+ + + + + + + + + + + + + + + + +
예약어기능사용 예시
note메모 저장 & 검색note 회의 메모 내용
journal업무 일지 작성journal 오늘 배포 완료
pipe클립보드 텍스트 파이프라인 처리pipe upper | trim | wrap 80
batch일괄 텍스트 변환batch number, batch sort
diff두 텍스트 비교 (Diff)diff → 클립보드의 두 텍스트 비교
encode인코딩 / 디코딩encode base64 hello, encode url
jsonJSON 파싱 & 미리보기json {"key":"value"}
stats클립보드 텍스트 통계stats → 글자수·단어수·줄수
+
+ +
🛠 개발 & 유틸리티
+
+ + + + + + + + + + + + + + + + +
예약어기능사용 예시
date날짜 계산date +30 → 30일 후, date -7
color색상 코드 변환 (HEX·RGB·HSL)color #FF5733
pick화면 색상 추출 (Eyedropper)pick → 마우스 커서 색상 추출
emoji이모지 검색 & 복사emoji 웃음, emoji fire
scaffold프로젝트 폴더 구조 스캐폴드scaffold react
routine반복 작업 루틴 관리routine start 출근
cap화면 캡처cap screen, cap window, cap region
help도움말 & 명령어 목록help → 전체 도움말 창 (F1 동일)
+
+ + + + +

💡 5. 알아두면 유용한 팁

+ +
+📌 즐겨찾기 관리
+파일·폴더를 선택하고 Ctrl + P를 누르면 즐겨찾기에 추가됩니다. 이미 등록된 항목이면 자동으로 제거됩니다. +Ctrl + B로 즐겨찾기 목록을 토글하거나 fav를 입력해 직접 열 수 있습니다. +
+ +
+📋 클립보드 히스토리 병합
+#을 입력해 클립보드 히스토리를 열고, Shift + ↑/↓로 여러 항목을 선택한 뒤 +Shift + Enter를 누르면 줄바꿈으로 합쳐서 한 번에 붙여넣을 수 있습니다. +
+ +
+→ 파일 액션 모드
+파일·앱 항목이 선택된 상태에서 를 누르면 경로 복사, 탐색기 열기, 관리자 실행, 터미널, 속성 보기, 이름 변경, 휴지통으로 삭제 메뉴가 나타납니다. +
+ +
+ℹ️ info 예약어 개선info disk에서 드라이브 항목을 Enter하면 탐색기로 열리고, +info cpu 또는 info ram 항목을 Enter하면 CPU·RAM·드라이브를 실시간으로 표시하는 +리소스 모니터 위젯이 별도 창으로 열립니다. (1초 주기 자동 갱신) +
+ + + + +

⚙️ 6. 설정 › 기능 탭 (토글 목록)

+

+설정 창에서 각 기능을 ON/OFF할 수 있으며, 저장 즉시 런처에 반영됩니다. +

+
+ + + + + + + + + + + + + + +
항목설명기본값
번호 배지 (1~9)결과 항목 왼쪽에 번호를 표시해 Ctrl+N 즉시 실행 가능ON
예약어 배지입력창 왼쪽에 활성 예약어 이름 표시 (예: 📂 폴더)ON
포커스 잃으면 닫기런처 창 외부 클릭 시 자동으로 숨김ON
액션 모드→ 키로 파일 액션 서브메뉴 진입 허용ON
최근 기록 (recent)recent 예약어로 최근 실행 목록 조회 허용ON
즐겨찾기 (fav)fav 예약어로 즐겨찾기 목록 조회 허용ON
+
+ + + + + + +
+ + diff --git a/etc/gemini key.txt b/etc/gemini key.txt new file mode 100644 index 0000000..94d7913 --- /dev/null +++ b/etc/gemini key.txt @@ -0,0 +1 @@ +AIzaSyDkyQtL6X87VpWqxofF2rA8CFlAvqJ88RY \ No newline at end of file diff --git a/etc/git.txt b/etc/git.txt new file mode 100644 index 0000000..a5115b9 --- /dev/null +++ b/etc/git.txt @@ -0,0 +1 @@ +https://gitea.lacvet.synology.me/lacvet/AX-Copilot.git \ No newline at end of file diff --git a/publish/Assets/icon.ico b/publish/Assets/icon.ico new file mode 100644 index 0000000..d51c1a5 Binary files /dev/null and b/publish/Assets/icon.ico differ diff --git a/publish/Assets/mascot.png b/publish/Assets/mascot.png new file mode 100644 index 0000000..5514d0a Binary files /dev/null and b/publish/Assets/mascot.png differ diff --git a/publish/AxCommander.SDK.pdb b/publish/AxCommander.SDK.pdb new file mode 100644 index 0000000..ccdfac2 Binary files /dev/null and b/publish/AxCommander.SDK.pdb differ diff --git a/publish/AxCommander.exe b/publish/AxCommander.exe new file mode 100644 index 0000000..588681b Binary files /dev/null and b/publish/AxCommander.exe differ diff --git a/publish/AxCommander.pdb b/publish/AxCommander.pdb new file mode 100644 index 0000000..d71326b Binary files /dev/null and b/publish/AxCommander.pdb differ diff --git a/publish/D3DCompiler_47_cor3.dll b/publish/D3DCompiler_47_cor3.dll new file mode 100644 index 0000000..ef8ac8c Binary files /dev/null and b/publish/D3DCompiler_47_cor3.dll differ diff --git a/publish/PenImc_cor3.dll b/publish/PenImc_cor3.dll new file mode 100644 index 0000000..9490687 Binary files /dev/null and b/publish/PenImc_cor3.dll differ diff --git a/publish/PresentationNative_cor3.dll b/publish/PresentationNative_cor3.dll new file mode 100644 index 0000000..589a8ee Binary files /dev/null and b/publish/PresentationNative_cor3.dll differ diff --git a/publish/vcruntime140_cor3.dll b/publish/vcruntime140_cor3.dll new file mode 100644 index 0000000..5786e93 Binary files /dev/null and b/publish/vcruntime140_cor3.dll differ diff --git a/publish/wpfgfx_cor3.dll b/publish/wpfgfx_cor3.dll new file mode 100644 index 0000000..aa7d287 Binary files /dev/null and b/publish/wpfgfx_cor3.dll differ diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..2fb1782 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/AxCopilot.Installer/AxCopilot.Installer.csproj b/src/AxCopilot.Installer/AxCopilot.Installer.csproj new file mode 100644 index 0000000..d86510e --- /dev/null +++ b/src/AxCopilot.Installer/AxCopilot.Installer.csproj @@ -0,0 +1,25 @@ + + + WinExe + net48 + true + latest + annotations + AxCopilot_Setup + ..\AxCopilot\Assets\icon.ico + 1.8.0 + app.manifest + + + + + + + + + + + payload.zip + + + diff --git a/src/AxCopilot.Installer/CustomMessageBox.cs b/src/AxCopilot.Installer/CustomMessageBox.cs new file mode 100644 index 0000000..215d733 --- /dev/null +++ b/src/AxCopilot.Installer/CustomMessageBox.cs @@ -0,0 +1,297 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +namespace AxCopilot.Installer.Offline +{ + /// + /// WinForms 기본 MessageBox 대체 커스텀 다이얼로그. + /// 인스톨러 테마와 일관된 모던 디자인을 제공합니다. + /// + 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; + } + } +} diff --git a/src/AxCopilot.Installer/Program.cs b/src/AxCopilot.Installer/Program.cs new file mode 100644 index 0000000..9ad039b --- /dev/null +++ b/src/AxCopilot.Installer/Program.cs @@ -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()); + } + } +} diff --git a/src/AxCopilot.Installer/SetupForm.cs b/src/AxCopilot.Installer/SetupForm.cs new file mode 100644 index 0000000..f63118f --- /dev/null +++ b/src/AxCopilot.Installer/SetupForm.cs @@ -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{}} + + /// 기존 AX Commander 설치를 감지하여 정리 + AppData 마이그레이션 + 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{} + } + } +} diff --git a/src/AxCopilot.Installer/app.manifest b/src/AxCopilot.Installer/app.manifest new file mode 100644 index 0000000..ac0b9e1 --- /dev/null +++ b/src/AxCopilot.Installer/app.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/AxCopilot.Installer/bin/Debug/net48/AxCopilot_Setup.exe b/src/AxCopilot.Installer/bin/Debug/net48/AxCopilot_Setup.exe new file mode 100644 index 0000000..4f66a6b Binary files /dev/null and b/src/AxCopilot.Installer/bin/Debug/net48/AxCopilot_Setup.exe differ diff --git a/src/AxCopilot.Installer/bin/Debug/net48/AxCopilot_Setup.exe.config b/src/AxCopilot.Installer/bin/Debug/net48/AxCopilot_Setup.exe.config new file mode 100644 index 0000000..8e342a9 --- /dev/null +++ b/src/AxCopilot.Installer/bin/Debug/net48/AxCopilot_Setup.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot.Installer/bin/Debug/net48/AxCopilot_Setup.pdb b/src/AxCopilot.Installer/bin/Debug/net48/AxCopilot_Setup.pdb new file mode 100644 index 0000000..9e7f725 Binary files /dev/null and b/src/AxCopilot.Installer/bin/Debug/net48/AxCopilot_Setup.pdb differ diff --git a/src/AxCopilot.Installer/bin/Release/net48/AxCopilot_Setup.exe b/src/AxCopilot.Installer/bin/Release/net48/AxCopilot_Setup.exe new file mode 100644 index 0000000..112c994 Binary files /dev/null and b/src/AxCopilot.Installer/bin/Release/net48/AxCopilot_Setup.exe differ diff --git a/src/AxCopilot.Installer/bin/Release/net48/AxCopilot_Setup.exe.config b/src/AxCopilot.Installer/bin/Release/net48/AxCopilot_Setup.exe.config new file mode 100644 index 0000000..8e342a9 --- /dev/null +++ b/src/AxCopilot.Installer/bin/Release/net48/AxCopilot_Setup.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot.Installer/bin/Release/net48/AxCopilot_Setup.pdb b/src/AxCopilot.Installer/bin/Release/net48/AxCopilot_Setup.pdb new file mode 100644 index 0000000..70253a6 Binary files /dev/null and b/src/AxCopilot.Installer/bin/Release/net48/AxCopilot_Setup.pdb differ diff --git a/src/AxCopilot.Installer/obj/AxCopilot.Installer.csproj.nuget.dgspec.json b/src/AxCopilot.Installer/obj/AxCopilot.Installer.csproj.nuget.dgspec.json new file mode 100644 index 0000000..901ce09 --- /dev/null +++ b/src/AxCopilot.Installer/obj/AxCopilot.Installer.csproj.nuget.dgspec.json @@ -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": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.Installer/obj/AxCopilot.Installer.csproj.nuget.g.props b/src/AxCopilot.Installer/obj/AxCopilot.Installer.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/src/AxCopilot.Installer/obj/AxCopilot.Installer.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/src/AxCopilot.Installer/obj/AxCopilot.Installer.csproj.nuget.g.targets b/src/AxCopilot.Installer/obj/AxCopilot.Installer.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/src/AxCopilot.Installer/obj/AxCopilot.Installer.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/AxCopilot.Installer/obj/Debug/net48/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/src/AxCopilot.Installer/obj/Debug/net48/.NETFramework,Version=v4.8.AssemblyAttributes.cs new file mode 100644 index 0000000..15efebf --- /dev/null +++ b/src/AxCopilot.Installer/obj/Debug/net48/.NETFramework,Version=v4.8.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.AssemblyInfo.cs b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.AssemblyInfo.cs new file mode 100644 index 0000000..7d15180 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +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 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.AssemblyInfoInputs.cache b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.AssemblyInfoInputs.cache new file mode 100644 index 0000000..b739ab2 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +b0ecaa163a313d5af7b0a607fb1d375c818edd550a5facb1dcab54e47d4ef5ba diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..331daa3 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.GeneratedMSBuildEditorConfig.editorconfig @@ -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 = diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.assets.cache b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.assets.cache new file mode 100644 index 0000000..9c7440d Binary files /dev/null and b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.assets.cache differ diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.csproj.AssemblyReference.cache b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.csproj.AssemblyReference.cache new file mode 100644 index 0000000..8fd1a50 Binary files /dev/null and b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.csproj.AssemblyReference.cache differ diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.csproj.CoreCompileInputs.cache b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..9ad5e21 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +cdeb201644c87f7c493d903f57cc22b1f80777359a33a9d6401d43e2b0005fa8 diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.csproj.FileListAbsolute.txt b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..ed50576 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot.Installer.csproj.FileListAbsolute.txt @@ -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 diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot_Setup.exe b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot_Setup.exe new file mode 100644 index 0000000..4f66a6b Binary files /dev/null and b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot_Setup.exe differ diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot_Setup.exe.withSupportedRuntime.config b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot_Setup.exe.withSupportedRuntime.config new file mode 100644 index 0000000..8e342a9 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot_Setup.exe.withSupportedRuntime.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot_Setup.pdb b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot_Setup.pdb new file mode 100644 index 0000000..9e7f725 Binary files /dev/null and b/src/AxCopilot.Installer/obj/Debug/net48/AxCopilot_Setup.pdb differ diff --git a/src/AxCopilot.Installer/obj/Release/net48/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/src/AxCopilot.Installer/obj/Release/net48/.NETFramework,Version=v4.8.AssemblyAttributes.cs new file mode 100644 index 0000000..15efebf --- /dev/null +++ b/src/AxCopilot.Installer/obj/Release/net48/.NETFramework,Version=v4.8.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.AssemblyInfo.cs b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.AssemblyInfo.cs new file mode 100644 index 0000000..6545d52 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +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 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.AssemblyInfoInputs.cache b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.AssemblyInfoInputs.cache new file mode 100644 index 0000000..83d47ca --- /dev/null +++ b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +9fc97ba95fb895eafec34720944a95d7ef26ca1178a342b4d606134cf9a22f91 diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..331daa3 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.GeneratedMSBuildEditorConfig.editorconfig @@ -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 = diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.assets.cache b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.assets.cache new file mode 100644 index 0000000..a8c10a6 Binary files /dev/null and b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.assets.cache differ diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.csproj.AssemblyReference.cache b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.csproj.AssemblyReference.cache new file mode 100644 index 0000000..8fd1a50 Binary files /dev/null and b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.csproj.AssemblyReference.cache differ diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.csproj.CoreCompileInputs.cache b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..a0b5bb9 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +d0902e3a45ac1669ecad6c4a76499ce8c92ddecaaca00815b0d092f937f62404 diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.csproj.FileListAbsolute.txt b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..8e17d3f --- /dev/null +++ b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot.Installer.csproj.FileListAbsolute.txt @@ -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 diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot_Setup.exe b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot_Setup.exe new file mode 100644 index 0000000..112c994 Binary files /dev/null and b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot_Setup.exe differ diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot_Setup.exe.withSupportedRuntime.config b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot_Setup.exe.withSupportedRuntime.config new file mode 100644 index 0000000..8e342a9 --- /dev/null +++ b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot_Setup.exe.withSupportedRuntime.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot.Installer/obj/Release/net48/AxCopilot_Setup.pdb b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot_Setup.pdb new file mode 100644 index 0000000..70253a6 Binary files /dev/null and b/src/AxCopilot.Installer/obj/Release/net48/AxCopilot_Setup.pdb differ diff --git a/src/AxCopilot.Installer/obj/project.assets.json b/src/AxCopilot.Installer/obj/project.assets.json new file mode 100644 index 0000000..32d067f --- /dev/null +++ b/src/AxCopilot.Installer/obj/project.assets.json @@ -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": [] + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.Installer/obj/project.nuget.cache b/src/AxCopilot.Installer/obj/project.nuget.cache new file mode 100644 index 0000000..2a9a53b --- /dev/null +++ b/src/AxCopilot.Installer/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "szcmjiT3MpM=", + "success": true, + "projectFilePath": "E:\\AX Copilot\\src\\AxCopilot.Installer\\AxCopilot.Installer.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file diff --git a/src/AxCopilot.SDK/AxCopilot.SDK.csproj b/src/AxCopilot.SDK/AxCopilot.SDK.csproj new file mode 100644 index 0000000..418a098 --- /dev/null +++ b/src/AxCopilot.SDK/AxCopilot.SDK.csproj @@ -0,0 +1,12 @@ + + + net8.0-windows + enable + enable + AxCopilot.SDK + AxCopilot.SDK + 1.0.0 + AX Copilot + SDK for building AX Copilot plugins + + diff --git a/src/AxCopilot.SDK/IActionHandler.cs b/src/AxCopilot.SDK/IActionHandler.cs new file mode 100644 index 0000000..6a040cb --- /dev/null +++ b/src/AxCopilot.SDK/IActionHandler.cs @@ -0,0 +1,55 @@ +namespace AxCopilot.SDK; + +/// +/// AX Copilot 플러그인이 구현해야 하는 핵심 인터페이스. +/// 새로운 명령어 타입을 추가하려면 이 인터페이스를 구현하고 +/// settings.json의 "plugins" 배열에 .dll 경로를 등록하십시오. +/// +public interface IActionHandler +{ + /// + /// 이 핸들러를 트리거하는 prefix 문자 (예: "@", "!", "#", "~", ">", "$"). + /// null이면 prefix 없이 Fuzzy 검색 결과에만 항목을 제공합니다. + /// + string? Prefix { get; } + + /// + /// 플러그인 메타데이터 + /// + PluginMetadata Metadata { get; } + + /// + /// 런처 결과 리스트에 표시할 항목을 반환합니다. + /// + /// prefix 이후의 사용자 입력 텍스트 + /// ESC 입력 시 취소되는 CancellationToken + Task> GetItemsAsync(string query, CancellationToken ct); + + /// + /// 사용자가 항목을 선택(Enter)했을 때 실행되는 동작 + /// + Task ExecuteAsync(LauncherItem item, CancellationToken ct); +} + +/// +/// 런처 결과 리스트에 표시될 단일 항목 +/// +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이면 타입 기반 자동 결정) +); + +/// +/// 플러그인 식별 메타데이터 +/// +public record PluginMetadata( + string Id, + string Name, + string Version, + string Author, + string? Description = null +); diff --git a/src/AxCopilot.SDK/bin/Debug/net8.0-windows/AxCopilot.SDK.deps.json b/src/AxCopilot.SDK/bin/Debug/net8.0-windows/AxCopilot.SDK.deps.json new file mode 100644 index 0000000..7c2fbe4 --- /dev/null +++ b/src/AxCopilot.SDK/bin/Debug/net8.0-windows/AxCopilot.SDK.deps.json @@ -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": "" + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.SDK/bin/Debug/net8.0-windows/AxCopilot.SDK.dll b/src/AxCopilot.SDK/bin/Debug/net8.0-windows/AxCopilot.SDK.dll new file mode 100644 index 0000000..511c5bc Binary files /dev/null and b/src/AxCopilot.SDK/bin/Debug/net8.0-windows/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot.SDK/bin/Debug/net8.0-windows/AxCopilot.SDK.pdb b/src/AxCopilot.SDK/bin/Debug/net8.0-windows/AxCopilot.SDK.pdb new file mode 100644 index 0000000..de2e6fb Binary files /dev/null and b/src/AxCopilot.SDK/bin/Debug/net8.0-windows/AxCopilot.SDK.pdb differ diff --git a/src/AxCopilot.SDK/bin/Release/net8.0-windows/AxCopilot.SDK.deps.json b/src/AxCopilot.SDK/bin/Release/net8.0-windows/AxCopilot.SDK.deps.json new file mode 100644 index 0000000..7c2fbe4 --- /dev/null +++ b/src/AxCopilot.SDK/bin/Release/net8.0-windows/AxCopilot.SDK.deps.json @@ -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": "" + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.SDK/bin/Release/net8.0-windows/AxCopilot.SDK.dll b/src/AxCopilot.SDK/bin/Release/net8.0-windows/AxCopilot.SDK.dll new file mode 100644 index 0000000..c1fcb64 Binary files /dev/null and b/src/AxCopilot.SDK/bin/Release/net8.0-windows/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot.SDK/bin/Release/net8.0-windows/AxCopilot.SDK.pdb b/src/AxCopilot.SDK/bin/Release/net8.0-windows/AxCopilot.SDK.pdb new file mode 100644 index 0000000..4b2dc07 Binary files /dev/null and b/src/AxCopilot.SDK/bin/Release/net8.0-windows/AxCopilot.SDK.pdb differ diff --git a/src/AxCopilot.SDK/obj/AxCopilot.SDK.csproj.nuget.dgspec.json b/src/AxCopilot.SDK/obj/AxCopilot.SDK.csproj.nuget.dgspec.json new file mode 100644 index 0000000..74ce310 --- /dev/null +++ b/src/AxCopilot.SDK/obj/AxCopilot.SDK.csproj.nuget.dgspec.json @@ -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" + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.SDK/obj/AxCopilot.SDK.csproj.nuget.g.props b/src/AxCopilot.SDK/obj/AxCopilot.SDK.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/src/AxCopilot.SDK/obj/AxCopilot.SDK.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/src/AxCopilot.SDK/obj/AxCopilot.SDK.csproj.nuget.g.targets b/src/AxCopilot.SDK/obj/AxCopilot.SDK.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/src/AxCopilot.SDK/obj/AxCopilot.SDK.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.AssemblyInfo.cs b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.AssemblyInfo.cs new file mode 100644 index 0000000..aa7b962 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.AssemblyInfo.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +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 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.AssemblyInfoInputs.cache b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.AssemblyInfoInputs.cache new file mode 100644 index 0000000..6eaefc4 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +00a35f199608229314e889906ceff92d9c9c44f1bbb5b9f09a74311d19d47810 diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..4efae34 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.GeneratedMSBuildEditorConfig.editorconfig @@ -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 = diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.GlobalUsings.g.cs b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +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; diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.assets.cache b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.assets.cache new file mode 100644 index 0000000..a6bd3aa Binary files /dev/null and b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.assets.cache differ diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.csproj.CoreCompileInputs.cache b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..709acf9 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +f858a9c01dc195df406d6ab52031704c14e8ab236b899706a36768fde27b8d52 diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.csproj.FileListAbsolute.txt b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..87ff2c4 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.csproj.FileListAbsolute.txt @@ -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 diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.dll b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.dll new file mode 100644 index 0000000..511c5bc Binary files /dev/null and b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.pdb b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.pdb new file mode 100644 index 0000000..de2e6fb Binary files /dev/null and b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/AxCopilot.SDK.pdb differ diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/ref/AxCopilot.SDK.dll b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/ref/AxCopilot.SDK.dll new file mode 100644 index 0000000..d8f2849 Binary files /dev/null and b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/ref/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot.SDK/obj/Debug/net8.0-windows/refint/AxCopilot.SDK.dll b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/refint/AxCopilot.SDK.dll new file mode 100644 index 0000000..d8f2849 Binary files /dev/null and b/src/AxCopilot.SDK/obj/Debug/net8.0-windows/refint/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/src/AxCopilot.SDK/obj/Release/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Release/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.AssemblyInfo.cs b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.AssemblyInfo.cs new file mode 100644 index 0000000..8f02df7 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.AssemblyInfo.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +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 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.AssemblyInfoInputs.cache b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.AssemblyInfoInputs.cache new file mode 100644 index 0000000..46b5649 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +738bc7e0540ae4f36b5e492d4e3d178e3d47b839fe0e7005990856e92eba327e diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..4efae34 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.GeneratedMSBuildEditorConfig.editorconfig @@ -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 = diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.GlobalUsings.g.cs b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +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; diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.assets.cache b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.assets.cache new file mode 100644 index 0000000..93e67b2 Binary files /dev/null and b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.assets.cache differ diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.csproj.CoreCompileInputs.cache b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..60e0323 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +27f07c411e7cf633b2b3fae7a3b844fbef6553c99925e60eb5463ef14cc382c0 diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.csproj.FileListAbsolute.txt b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..4b20666 --- /dev/null +++ b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.csproj.FileListAbsolute.txt @@ -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 diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.dll b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.dll new file mode 100644 index 0000000..c1fcb64 Binary files /dev/null and b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.pdb b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.pdb new file mode 100644 index 0000000..4b2dc07 Binary files /dev/null and b/src/AxCopilot.SDK/obj/Release/net8.0-windows/AxCopilot.SDK.pdb differ diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/ref/AxCopilot.SDK.dll b/src/AxCopilot.SDK/obj/Release/net8.0-windows/ref/AxCopilot.SDK.dll new file mode 100644 index 0000000..dc35c5a Binary files /dev/null and b/src/AxCopilot.SDK/obj/Release/net8.0-windows/ref/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot.SDK/obj/Release/net8.0-windows/refint/AxCopilot.SDK.dll b/src/AxCopilot.SDK/obj/Release/net8.0-windows/refint/AxCopilot.SDK.dll new file mode 100644 index 0000000..dc35c5a Binary files /dev/null and b/src/AxCopilot.SDK/obj/Release/net8.0-windows/refint/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot.SDK/obj/project.assets.json b/src/AxCopilot.SDK/obj/project.assets.json new file mode 100644 index 0000000..744208e --- /dev/null +++ b/src/AxCopilot.SDK/obj/project.assets.json @@ -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" + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.SDK/obj/project.nuget.cache b/src/AxCopilot.SDK/obj/project.nuget.cache new file mode 100644 index 0000000..02881a5 --- /dev/null +++ b/src/AxCopilot.SDK/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "jO+L+MmEpsc=", + "success": true, + "projectFilePath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file diff --git a/src/AxCopilot.Tests/AxCopilot.Tests.csproj b/src/AxCopilot.Tests/AxCopilot.Tests.csproj new file mode 100644 index 0000000..c610a0f --- /dev/null +++ b/src/AxCopilot.Tests/AxCopilot.Tests.csproj @@ -0,0 +1,26 @@ + + + + net8.0-windows + true + enable + enable + false + AxCopilot.Tests + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + diff --git a/src/AxCopilot.Tests/Core/FuzzyEngineTests.cs b/src/AxCopilot.Tests/Core/FuzzyEngineTests.cs new file mode 100644 index 0000000..f887155 --- /dev/null +++ b/src/AxCopilot.Tests/Core/FuzzyEngineTests.cs @@ -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); + } +} diff --git a/src/AxCopilot.Tests/Handlers/ClipboardTransformTests.cs b/src/AxCopilot.Tests/Handlers/ClipboardTransformTests.cs new file mode 100644 index 0000000..a2acc8c --- /dev/null +++ b/src/AxCopilot.Tests/Handlers/ClipboardTransformTests.cs @@ -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(); + } +} diff --git a/src/AxCopilot.Tests/Services/SettingsServiceTests.cs b/src/AxCopilot.Tests/Services/SettingsServiceTests.cs new file mode 100644 index 0000000..9f12b02 --- /dev/null +++ b/src/AxCopilot.Tests/Services/SettingsServiceTests.cs @@ -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(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(json, JsonOptions)!; + } +} diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/.msCoverageSourceRootsMapping_AxCopilot.Tests b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/.msCoverageSourceRootsMapping_AxCopilot.Tests new file mode 100644 index 0000000..11f5c6a Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/.msCoverageSourceRootsMapping_AxCopilot.Tests differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/duckduckgo.png b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/duckduckgo.png new file mode 100644 index 0000000..64ee943 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/duckduckgo.png differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/github.png b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/github.png new file mode 100644 index 0000000..52126e0 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/github.png differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/google.png b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/google.png new file mode 100644 index 0000000..8642fc1 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/google.png differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/namuwiki.png b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/namuwiki.png new file mode 100644 index 0000000..5423adf Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/namuwiki.png differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/naver.png b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/naver.png new file mode 100644 index 0000000..020e16d Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/naver.png differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/navermap.png b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/navermap.png new file mode 100644 index 0000000..9e0bfaf Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/navermap.png differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/wikipedia.png b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/wikipedia.png new file mode 100644 index 0000000..4405b8d Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/wikipedia.png differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/youtube.png b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/youtube.png new file mode 100644 index 0000000..c20e1d3 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/SearchEngines/youtube.png differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/guide_dev.enc b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/guide_dev.enc new file mode 100644 index 0000000..e798fe5 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/guide_dev.enc differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/guide_user.enc b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/guide_user.enc new file mode 100644 index 0000000..d1264f8 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/guide_user.enc differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/icon.ico b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/icon.ico new file mode 100644 index 0000000..273db74 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Assets/icon.ico differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.SDK.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.SDK.dll new file mode 100644 index 0000000..511c5bc Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.SDK.pdb b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.SDK.pdb new file mode 100644 index 0000000..de2e6fb Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.SDK.pdb differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.deps.json b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.deps.json new file mode 100644 index 0000000..ca71bb2 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.deps.json @@ -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": "" + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.dll new file mode 100644 index 0000000..a44af2b Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.pdb b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.pdb new file mode 100644 index 0000000..ee723c6 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.pdb differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.runtimeconfig.json b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.runtimeconfig.json new file mode 100644 index 0000000..c7a4117 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.Tests.runtimeconfig.json @@ -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 + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.deps.json b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.deps.json new file mode 100644 index 0000000..aa4b430 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.deps.json @@ -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": "" + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.dll new file mode 100644 index 0000000..a960854 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.exe b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.exe new file mode 100644 index 0000000..6262bd4 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.exe differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.pdb b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.pdb new file mode 100644 index 0000000..7afc131 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.pdb differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.runtimeconfig.json b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.runtimeconfig.json new file mode 100644 index 0000000..c7a4117 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/AxCopilot.runtimeconfig.json @@ -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 + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.Framework.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.Framework.dll new file mode 100644 index 0000000..f9f3da9 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.Framework.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.dll new file mode 100644 index 0000000..fc7bada Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/DocumentFormat.OpenXml.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/FluentAssertions.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/FluentAssertions.dll new file mode 100644 index 0000000..b5f479e Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/FluentAssertions.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Markdig.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Markdig.dll new file mode 100644 index 0000000..4931e93 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Markdig.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Data.Sqlite.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Data.Sqlite.dll new file mode 100644 index 0000000..c5fef6d Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Data.Sqlite.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.CommunicationUtilities.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.CommunicationUtilities.dll new file mode 100644 index 0000000..ca100f8 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.CommunicationUtilities.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.CoreUtilities.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.CoreUtilities.dll new file mode 100644 index 0000000..43bc3a3 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.CoreUtilities.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.CrossPlatEngine.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.CrossPlatEngine.dll new file mode 100644 index 0000000..4aadbfb Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.CrossPlatEngine.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.PlatformAbstractions.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.PlatformAbstractions.dll new file mode 100644 index 0000000..c341b20 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.PlatformAbstractions.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.Utilities.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.Utilities.dll new file mode 100644 index 0000000..e60d498 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.TestPlatform.Utilities.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.VisualStudio.CodeCoverage.Shim.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.VisualStudio.CodeCoverage.Shim.dll new file mode 100644 index 0000000..da18989 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.VisualStudio.CodeCoverage.Shim.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.VisualStudio.TestPlatform.Common.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.VisualStudio.TestPlatform.Common.dll new file mode 100644 index 0000000..eb02e05 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.VisualStudio.TestPlatform.Common.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll new file mode 100644 index 0000000..0e03b13 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Core.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Core.dll new file mode 100644 index 0000000..4a27877 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Core.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Core.xml b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Core.xml new file mode 100644 index 0000000..d9d574c --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Core.xml @@ -0,0 +1,8879 @@ + + + + Microsoft.Web.WebView2.Core + + + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + + + Creates a CoreWebView2 object that wraps an existing COM ICoreWebView2 object. + This allows interacting with the CoreWebView2 using .NET, even if it was originally created using COM. + + Pointer to a COM object that implements the ICoreWebView2 COM interface. + Returns a .NET CoreWebView2 object that wraps the COM object. + Thrown when the provided COM pointer is null. + Thrown when the value is not an ICoreWebView2 COM object and cannot be wrapped. + + + + Returns the existing COM ICoreWebView2 object underlying this .NET CoreWebView2 object. + This allows interacting with the WebView2 control using COM APIs, + even if the control was originally created using .NET. + + Pointer to a COM object that implements the ICoreWebView2 COM interface. + + + + Print the current page to PDF asynchronously with the provided settings. + + + See for description of settings. Passing null for printSettings results in default print settings used. + + Use resultFilePath to specify the path to the PDF file. The host should provide an absolute path, including file name. If the path points to an existing file, the file will be overwritten. If the path is not valid, the method fails. + + The async PrintToPdf operation completes when the data has been written to the PDF file. If the application exits before printing is complete, the file is not saved. Only one `Printing` operation can be in progress at a time. + If PrintToPdf is called while a `PrintToPdf` or `PrintToPdfStream` or `Print` operation is in progress, the operation completes and returns false. + + + + + Adds a URI and resource context filter for corresponding request sources for the event. + + A URI to be added to the event. + A resource context filter to be added to the event. + A request source filter to be added to the event. + + + + Removes a matching WebResource filter that was previously added for the event. + + An URI to be added to the event. + A resource context filter to be added to the event. + A request source filter to be added to the event. + + + + Same as , but also has support for posting DOM + objects to page content. + + The web message to be posted to the top level document in + this WebView. + Additional DOM objects posted to the content. + + The event args is an instance of MessageEvent. The setting must be true or the message + will not be sent. The event arg's data property of the event arg is the + webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. + The event arg's source property of the event arg is a reference to the + window.chrome.webview object. For information about sending messages from the HTML + document in the WebView to the host, navigate to . The message is sent asynchronously. If a + navigation occurs before the message is posted to the page, the message is not be sent. + This additionalObjects is retrieved in web content via the DOM MessageEvent additionalObjects + property as an array-like list of DOM objects. Currently these type of objects can be + posted: + + + .NET / WinRT + DOM type + + + + [FileSystemHandle](https://developer.mozilla.org/docs/Web/API/FileSystemHandle) + + + null + null + + + The objects are posted to web content, following the + [structured-clone](https://developer.mozilla.org/docs/Web/API/Web_Workers_API/Structured_clone_algorithm) + semantics, meaning only objects that can be cloned can be posted. They will also behave as + if they had been created by the web content they are posted to. For example, if a + FileSystemFileHandle is posted to a web content it can only be re-transferred via + postMessage to other web content [with the same + origin](https://fs.spec.whatwg.org/#filesystemhandle). + Warning: An app needs to be mindful when using this API to post DOM objects as this API + provides the web content with unusual access to sensitive Web Platform features such as + filesystem access! Similar to PostWebMessageAsJson, the app should check the property right before posting the message to ensure the message + and objects will only be sent to the target web content that it expects to receive the DOM + objects. Additionally, the order of messages that are posted between PostWebMessageAsJson + and PostWebMessageAsJsonWithAdditionalObjects may not be preserved. + + + + + + + Opens the browser print preview dialog to print the current web page + + + + + Gets the object contains various modifiable settings for the running WebView. + + + + + Gets the URI of the current top level document. + + + This value potentially changes as a part of the event raised for some cases such as navigating to a different site or fragment navigations. It remains the same for other types of navigations such as page refreshes or history.pushState with the same URL as the current page. + + + + + + Gets the process ID of the browser process that hosts the WebView. + + + + + true if the WebView is able to navigate to a previous page in the navigation history. + + + If CanGoBack changes value, the event is raised. + + + + + + true if the WebView is able to navigate to a next page in the navigation history. + + + If CanGoForward changes value, the event is raised. + + + + + + Gets the title for the current top-level document. + + + If the document has no explicit title or is otherwise empty, a default that may or may not match the URI of the document is used. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DocumentTitle"::: + + + + + Indicates if the WebView contains a fullscreen HTML element. + + + + + NavigationStarting is raised when the WebView main frame is requesting permission to navigate to a different URI. + + + Redirects raise this event as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigationStarting"::: + + + + + ContentLoading is raised before any content is loaded, including scripts added with . ContentLoading is not raised if a same page navigation occurs (such as through fragment navigations or history.pushState navigations). + + + This operation follows the and events and precedes the and events. + + + + + + + + + SourceChanged is raised when the property changes. + + + SourceChanged is raised when navigating to a different site or fragment navigations. It is not raised for other types of navigations such as page refreshes or history.pushState with the same URL as the current page. This event is raised before for navigation to a new document. + + + + + + + HistoryChanged is raised for changes to joint session history, which consists of top-level and manual frame navigations. + + + Use HistoryChanged to verify that the or value has changed. HistoryChanged is also raised for using or . HistoryChanged is raised after and . CanGoBack is false for navigations initiated through CoreWebView2Frame APIs if there has not yet been a user gesture. + + + + + + + + + NavigationCompleted is raised when the WebView has completely loaded (body.onload has been raised) or loading stopped with error. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigationCompleted"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DOMContentLoaded"::: + + + + + FrameNavigationStarting is raised when a child frame in the WebView requests permission to navigate to a different URI. + + + Redirects raise this operation as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + + + FrameNavigationCompleted is raised when a child frame has completely loaded (body.onload has been raised) or loading stopped with error. + + + + + ScriptDialogOpening is raised when a JavaScript dialog (alert, confirm, prompt, or beforeunload) displays for the WebView. + + + This event only is raised if the property is set to false. This event suppresses dialogs or replaces default dialogs with custom dialogs. + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + + PermissionRequested is raised when content in a WebView requests permission to access some privileged resources. + + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + ProcessFailed is raised when a WebView process ends unexpectedly or becomes unresponsive. + + + ProcessFailed is raised when any of the processes in the WebView2 Process Group encounters one of the following conditions: + + + + Condition + Details + + + Unexpected exit + + The process indicated by the event args has exited unexpectedly (usually due to a crash). The failure might or might not be recoverable, and some failures are auto-recoverable. + + + + Unresponsiveness + + The process indicated by the event args has become unresponsive to user input. This is only reported for renderer processes, and will run every few seconds until the process becomes responsive again. + + + + + Note: When the failing process is the browser process, a event will run too. + + Your application can use to identify which condition and process the event is for, and to collect diagnostics and handle recovery if necessary. For more details about which cases need to be handled by your application, see . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ProcessFailed"::: + + + + + WebMessageReceived is raised when the setting is set and the top-level document of the WebView runs window.chrome.webview.postMessage or window.chrome.webview.postMessageWithAdditionalObjects. + + + The postMessage function is void postMessage(object) where object is any object supported by JSON conversion. + When postMessage is called, the handler's Invoke method will be called with the object parameter postMessage converted to a JSON string. + If the same page calls postMessage multiple times, the corresponding WebMessageReceived events are guaranteed to be fired in the same order. However, if multiple frames call postMessage, there is no guaranteed order. In addition, WebMessageReceived events caused by calls to postMessage are not guaranteed to be sequenced with events caused by DOM APIs. For example, if the page runs + + chrome.webview.postMessage("message"); + window.open(); + + then the event might be fired before the WebMessageReceived event. If you need the WebMessageReceived event to happen before anything else, then in the WebMessageReceived handler you can post a message back to the page and have the page wait until it receives that message before continuing. + + + + + NewWindowRequested is raised when content inside the WebView requests to open a new window, such as through window.open(). + + + The app can pass a target WebView that is considered the opened window or mark the event as , in which case WebView2 does not open a window. + If either Handled or properties are not set, the target content will be opened on a popup window. + If a deferral is not taken on the event args, scripts that resulted in the new window that are requested are blocked until the event handler returns. If a deferral is taken, then scripts are blocked until the deferral is completed. + + On Hololens 2, if the property is not set and the property is not set to true, the WebView2 will navigate to the . + If either of these properties are set, the WebView2 will not navigate to the and the the event will continue as normal. + + + + + DocumentTitleChanged is raised when the property changes and may be raised before or after the event. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DocumentTitleChanged"::: + + + + + + ContainsFullScreenElementChanged is raised when the property changes. + + + An HTML element inside the WebView may enter fullscreen to the size of the WebView or leave fullscreen. This event is useful when, for example, a video element requests to go fullscreen. The listener of this event may resize the WebView in response. + + + + + + WebResourceRequested is raised when the WebView is performing a URL request to a matching URL and resource context filter that was added with . + + + At least one filter must be added for the event to be raised. + The web resource requested may be blocked until the event handler returns if a deferral is not taken on the event args. If a deferral is taken, then the web resource requested is blocked until the deferral is completed. + + If this event is subscribed in the handler it should be called after the new window is set. For more details see . + + This event is by default raised for file, http, and https URI schemes. This is also raised for registered custome URI schemes. See for more details. + + + + + + WindowCloseRequested is raised when content inside the WebView requested to close the window, such as after window.close() is run. + + + The app should close the WebView and related app window if that makes sense to the app. + After the first window.close() call, this event may not fire for any immediate back to back window.close() calls. + + + + + Causes a navigation of the top level document to the specified URI. + + The URI to navigate to. + + For more information, navigate to [Navigation event](/microsoft-edge/webview2/concepts/navigation-events). Note that this operation starts a navigation and the corresponding event is raised sometime after Navigate runs. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Navigate"::: + + + + + + + Initiates a navigation to htmlContent as source HTML of a new document. + + A source HTML of a new document. + + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + string htmlContent = + @" + + + +

Click me

+ + "; + webview.NavigateToString(htmlContent); +
+
+ + + +
+ + + Adds the provided JavaScript to a list of scripts that should be run after the global object has been created, but before the HTML document has been parsed and before any other script included by the HTML document is run. + + The JavaScript code to be run. + A script ID that may be passed when calling . + + The injected script will apply to all future top level document and child frame navigations until removed with . + This is applied asynchronously and you must wait for the returned to complete before you can be sure that the script is ready to execute on future navigations. + If the method is run in handler, it should be called before the new window is set. For more details see . + + Note that if an HTML document has sandboxing of some kind via [sandbox](https://developer.mozilla.org/docs/Web/HTML/Element/iframe#attr-sandbox) properties or the [Content-Security-Policy HTTP header](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy) this will affect the script run here. So, for example, if the allow-modals keyword is not set then calls to the alert function will be ignored. + + + + + + Removes the corresponding JavaScript added via with the specified script ID. + + The ID corresponds to the JavaScript code to be removed from the list of scripts. + Both use and this method in handler at the same time sometimes causes trouble. Since invalid scripts will be ignored, the script IDs you got may not be valid anymore. + + + + Runs JavaScript code from the javaScript parameter in the current top-level document rendered in the WebView. + + The JavaScript code to be run in the current top-level document rendered in the WebView. + A JSON encoded string that represents the result of running the provided JavaScript. + + If the result is undefined, contains a reference cycle, or otherwise is not able to be encoded into JSON, the JSON null value is returned as the "null" string. + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. This method is applied asynchronously. If the method is run after the event during a navigation, the script runs in the new document when loading it, around the time is run. This operation works even if is set to false. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScript"::: + + + + + + Captures an image of what WebView is displaying. + + The format of the image to be captured. + The stream to which the resulting image binary data is written. + + When CapturePreviewAsync finishes writing to the stream, the Invoke method on the provided handler parameter is called. This method fails if called before the first event. For example if this is called in the event for the first navigation it will fail. For subsequent navigations, the method may not fail, but will not capture an image of a given webpage until the event has been fired for it. Any call to this method prior to that will result in a capture of the page being navigated away from. + + + + + + Reloads the current page. + + + This is similar to navigating to the URI of current top level document including all navigation events firing and respecting any entries in the HTTP cache. But, the back or forward history will not be modified. + + + + + Posts the specified webMessageAsJson to the top level document in this WebView. + + The web message to be posted to the top level document in this WebView. + + The event args is an instance of MessageEvent. The setting must be true or the message will not be sent. The event arg's data property of the event arg is the webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. The event arg's source property of the event arg is a reference to the window.chrome.webview object. For information about sending messages from the HTML document in the WebView to the host, navigate to . The message is sent asynchronously. If a navigation occurs before the message is posted to the page, the message is not be sent. + + + Runs the message event of the window.chrome.webview of the top-level document. JavaScript in that document may subscribe and unsubscribe to the event using the following code: + + window.chrome.webview.addEventListener('message', handler) + window.chrome.webview.removeEventListener('message', handler) + + + + + + + + + Posts a message that is a simple string rather than a JSON string representation of a JavaScript object. + + The web message to be posted to the top level document in this WebView. + + This behaves in exactly the same manner as , but the data property of the event arg of the window.chrome.webview message is a string with the same value as webMessageAsString. Use this instead of if you want to communicate using simple strings rather than JSON objects. + + + + + + + Runs an asynchronous DevToolsProtocol method. + + The full name of the method in the format {domain}.{method}. + A JSON formatted string containing the parameters for the corresponding method. + A JSON string that represents the method's return object. + + For more information about available methods, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). The returned task is completed when the method asynchronously completes and will return the method's return object as a JSON string. Note even though WebView2 dispatches the CDP messages in the order called, CDP method calls may be processed out of order. If you require CDP methods to run in a particular order, you should await for the previous method call. + + If the method is to run in handler it should be called + before the new window is set if the cdp messages should affect the initial navigation. If + called after setting the NewWindow property, the cdp messages + may or may not apply to the initial navigation and may only apply to the subsequent navigation. + For more details . + + + + + Navigates the WebView to the previous page in the navigation history. + + + + + Navigates the WebView to the next page in the navigation history. + + + + + Gets a DevTools Protocol event receiver that allows you to subscribe to a DevToolsProtocol event. + + The full name of the event in the format {domain}.{event}. + A Devtools Protocol event receiver. + + For more information about DevToolsProtocol events description and event args, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). + + + + + Stops all navigations and pending resource fetches. + + + Does not stop scripts. + + + + + Adds the provided host object to script running in the WebView with the specified name. + + The name of the host object. + The host object to be added to script. + + Host objects are exposed as host object proxies via window.chrome.webview.hostObjects.{name}. Host object proxies are promises and will resolve to an object representing the host object. Only the COM visible objects/properties/methods can be accessed from script. + The app can control which part of .NET objects are exposed using . + + JavaScript code in the WebView will be able to access appObject as following and then access attributes and methods of appObject. + + Note that while simple types, IDispatch and array are supported, and IUnknown objects that also implement IDispatch are treated as IDispatch, generic IUnknown, VT_DECIMAL, or VT_RECORD variant is not supported. Remote JavaScript objects like callback functions are represented as an VT_DISPATCH VARIANT with the object implementing IDispatch. The JavaScript callback method may be invoked using DISPID_VALUE for the DISPID. Such callback method invocations will return immediately and will not wait for the JavaScript function to run and so will not provide the return value of the JavaScript function. Nested arrays are supported up to a depth of 3. Arrays of by reference types are not supported. VT_EMPTY and VT_NULL are mapped into JavaScript as null. In JavaScript null and undefined are mapped to VT_EMPTY. + + Additionally, all host objects are exposed as window.chrome.webview.hostObjects.sync.{name}. Here the host objects are exposed as synchronous host object proxies. These are not promises and calls to functions or property access synchronously block running script waiting to communicate cross process for the host code to run. Accordingly this can result in reliability issues and it is recommended that you use the promise based asynchronous window.chrome.webview.hostObjects.{name} API described above. + + Synchronous host object proxies and asynchronous host object proxies can both proxy the same host object. Remote changes made by one proxy will be reflected in any other proxy of that same host object whether the other proxies and synchronous or asynchronous. + + While JavaScript is blocked on a synchronous call to native code, that native code is unable to call back to JavaScript. Attempts to do so will fail with HRESULT_FROM_WIN32(ERROR_POSSIBLE_DEADLOCK). + + Host object proxies are JavaScript Proxy objects that intercept all property get, property set, and method invocations. Properties or methods that are a part of the Function or Object prototype are run locally. Additionally any property or method in the array chrome.webview.hostObjects.options.forceLocalProperties will also be run locally. This defaults to including optional methods that have meaning in JavaScript like toJSON and Symbol.toPrimitive. You can add more to this array as required. + + There's a method chrome.webview.hostObjects.cleanupSome that will best effort garbage collect host object proxies. + + The chrome.webview.hostObjects.options object provides the ability to change some functionality of host objects. + + + + Options property + Details + + + forceLocalProperties + + This is an array of host object property names that will be run locally, instead of being called on the native host object. This defaults to then, toJSON, Symbol.toString, and Symbol.toPrimitive. You can add other properties to specify that they should be run locally on the JavaScript host object proxy. + + + + log + + This is a callback that will be called with debug information. For example, you can set this to console.log.bind(console) to have it print debug information to the console to help when troubleshooting host object usage. By default this is null. + + + + shouldSerializeDates + + By default this is false, and JavaScript Date objects will be sent to host objects as a string using JSON.stringify. You can set this property to true to have Date objects properly serialize as a System.DateTime when sending to the .NET host object, and have System.DateTime properties and return values create a JavaScript Date object. + + + + defaultSyncProxy + + When calling a method on a synchronous proxy, the result should also be a synchronous proxy. But in some cases, the sync/async context is lost (for example, when providing to native code a reference to a function, and then calling that function in native code). In these cases, the proxy will be asynchronous, unless this property is set. + + + + forceAsyncMethodMatches + + This is an array of regular expressions. When calling a method on a synchronous proxy, the method call will be performed asynchronously if the method name matches a string or regular expression in this array. Setting this value to Async will make any method that ends with Async be an asynchronous method call. If an async method doesn't match here and isn't forced to be asynchronous, the method will be invoked synchronously, blocking execution of the calling JavaScript and then returning the resolution of the promise, rather than returning a promise. + + + + ignoreMemberNotFoundError + + By default, an exception is thrown when attempting to get the value of a proxy property that doesn't exist on the corresponding native class. Setting this property to true switches the behavior to match Chakra WinRT projection (and general JavaScript) behavior of returning undefined with no error. + + + + shouldPassTypedArraysAsArrays + + By default, typed arrays are passed to the host as IDispatch. To instead pass typed arrays to the host as array, set this to true. + + + + + Host object proxies additionally have the following methods: + + + + Method name + Details + + + applyHostFunction, getHostProperty, setHostProperty + + Perform a method invocation, property get, or property set on the host object. You can use these to explicitly force a method or property to run remotely if there is a conflicting local method or property. For instance, proxy.toString() will run the local toString method on the proxy object. But proxy.applyHostFunction('toString') runs toString on the host proxied object instead. + + + + getLocalProperty, setLocalProperty + + Perform property get, or property set locally. You can use these methods to force getting or setting a property on the host object proxy itself rather than on the host object it represents. For instance, proxy.unknownProperty will get the property named unknownProperty from the host proxied object. But proxy.getLocalProperty('unknownProperty') will get the value of the property unknownProperty on the proxy object itself. + + + + addEventListener + + This method only exists on proxies for .NET objects. Bind the JavaScript handler to the C# event, so that the JavaScript handler can be called through the C# event. For example, chrome.webview.hostObjects.sample.addEventListener('TestEvent', () => { alert('Invoked from remote');}); bind an anonymous JavaScript function to a C# event called 'TestEvent'. When calling TestEvent?.Invoke() on C# side, the JavaScript function that was just bound will be called asynchronously. It allows adding more than one handler for an event, but if the handler is already in the list of event handler, it will not be added a second time. If the host object cannot find the event with the name passed in by the addEventListener function or it is no public or its return type is not void, an exception will be thrown. If the count and type of C# event's parameters do not match the count and type of JavaScript handler, invoke addEventListener will be successful but an exception will be passed to JavaScript when invoke the event on C# side. If the host object has defined addEventListener function, use the defined function rather than the additionally addEventListener function. + + + + removeEventListener + + This method only exists on proxies for .NET objects. Removes a handler previously bound with addEventListener(). If the handler does not exist in the list of event handler, nothing will happen. If the host object cannot find the event with the name passed in by the removeEventListener function or it is no public, an exception will be thrown. If the host object has defined removeEventListener function, use the defined function rather than the additionally removeEventListener function. + + + + sync + + Asynchronous host object proxies expose a sync method which returns a promise for a synchronous host object proxy for the same host object. For example, chrome.webview.hostObjects.sample.methodCall() returns an asynchronous host object proxy. You can use the sync method to obtain a synchronous host object proxy instead: + const syncProxy = await chrome.webview.hostObjects.sample.methodCall().sync() + + + + async + + Synchronous host object proxies expose an async method which blocks and returns an asynchronous host object proxy for the same host object. For example, chrome.webview.hostObjects.sync.sample.methodCall() returns a synchronous host object proxy. Calling the async method on this blocks and then returns an asynchronous host object proxy for the same host object: const asyncProxy = chrome.webview.hostObjects.sync.sample.methodCall().async() + + + + then + + Asynchronous host object proxies have a then method. This allows them to be awaitable. then will return a promise that resolves with a representation of the host object. If the proxy represents a JavaScript literal then a copy of that is returned locally. If the proxy represents a function then a non-awaitable proxy is returned. If the proxy represents a JavaScript object with a mix of literal properties and function properties, then the a copy of the object is returned with some properties as host object proxies. + + + + cancelPromise + + This method attempts to cancel the fulfillment of a promised value. If the promise hasn't already been fulfilled and cancelation is supported, the promise will get rejected. cancelPromise supports cancelation of IAsyncOperation and IAsyncAction methods. If the promise is successfully canceled, then calling await on the promise will throw. For example, chrome.webview.hostObjects.cancelPromise(promise); await promise; will throw with "Promise Canceled". Once a promise has been canceled, a subsequent cancel on the same promise will throw an exception as well. + + + + + All other property and method invocations (other than the above Remote object proxy methods, forceLocalProperties list, and properties on Function and Object prototypes) are run remotely. Asynchronous host object proxies return a promise representing asynchronous completion of remotely invoking the method, or getting the property. The promise resolves after the remote operations complete and the promises resolve to the resulting value of the operation. Synchronous host object proxies work similarly but block JavaScript execution and wait for the remote operation to complete. + + Setting a property on an asynchronous host object proxy works slightly differently. The set returns immediately and the return value is the value that will be set. This is a requirement of the JavaScript Proxy object. If you need to asynchronously wait for the property set to complete, use the setHostProperty method which returns a promise as described above. Synchronous object property set property synchronously blocks until the property is set. + + Exposing host objects to script has security risk. Please follow [best practices](/microsoft-edge/webview2/concepts/security). + + + To create a [IDispatch](/windows/win32/api/oaidl/nn-oaidl-idispatch) implementing class in C# use the following attributes on each class you intend to expose. + + // Bridge and BridgeAnotherClass are C# classes that implement IDispatch and works with AddHostObjectToScript. + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class BridgeAnotherClass + { + // Sample property. + public string Prop { get; set; } = "Example"; + } + + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class Bridge + { + public string Func(string param) + { + return "Example: " + param; + } + + public BridgeAnotherClass AnotherObject { get; set; } = new BridgeAnotherClass(); + + // Sample indexed property. + [System.Runtime.CompilerServices.IndexerName("Items")] + public string this[int index] + { + get { return m_dictionary[index]; } + set { m_dictionary[index] = value; } + } + private Dictionary<int, string> m_dictionary = new Dictionary<int, string>(); + } + + Then add instances of those classes via : + + webView.CoreWebView2.AddHostObjectToScript("bridge", new Bridge()); + + And then in script you can call the methods, and access those properties of the objects added via . + Note that `CoreWebView2.AddHostObjectToScript` only applies to the top-level document and not to frames. To add host objects to frames use `CoreWebView2Frame.AddHostObjectToScript`. + + // Find added objects on the hostObjects property + const bridge = chrome.webview.hostObjects.bridge; + + // Call a method and pass in a parameter. + // The result is another proxy promise so you must await to get the result. + console.log(await bridge.Func("testing...")); + + // A property may be another object as long as its class also implements + // IDispatch. + // Getting a property also gets a proxy promise you must await. + const propValue = await bridge.AnotherObject.Prop; + console.log(propValue); + + // Indexed properties + let index = 123; + bridge[index] = "test"; + let result = await bridge[index]; + console.log(result); + + + + + + + Removes the host object specified by the name so that it is no longer accessible from JavaScript code in the WebView. + + The name of the host object to be removed. + + While new access attempts are denied, if the object is already obtained by JavaScript code in the WebView, the JavaScript code continues to have access to that object. Running this method for a name that is already removed or never added fails. + + + + + Opens the DevTools window for the current document in the WebView. + + + Does nothing if run when the DevTools window is already open. + + + + + + + + Warning: This method and are deprecated. + + Removes a matching WebResource filter that was previously added for the event. + An URI to at which a web resource filter was added. + A previously added resource context filter to be removed. + A filter that was never added. + + If the same filter was added multiple times, then it must need to be removed as many times as it was added for the removal to be effective. + + + + + + Gets the object associated with this . + + + + + + Exposes the used to create this . + + + + + WebResourceResponseReceived is raised when the WebView receives the response for a request for a web resource (any URI resolution performed by the WebView; such as HTTP/HTTPS, file and data requests from redirects, navigations, declarations in HTML, implicit Favicon lookups, and fetch API usage in the document). + + + The host app can use this event to view the actual request and response for a web resource. There is no guarantee about the order in which the WebView processes the response and the host app's handler runs. The app's handler will not block the WebView from processing the response. + The event args include the as sent by the wire and received, including any additional headers added by the network stack that were not be included as part of the associated event, such as Authentication headers. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebResourceResponseReceived"::: + + + + + DOMContentLoaded is raised when the initial HTML document has been parsed. + + + This aligns with the the document's DOMContentLoaded event in HTML. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DOMContentLoaded"::: + + + + + Navigates using a constructed object. + + The constructed web resource object to provide post data or additional request headers during navigation. + + The headers in the override headers added by WebView2 runtime except for Cookie headers. Method can only be either GET or POST. Provided post data will only be sent only if the method is POST and the uri scheme is HTTP(S). + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigateWithWebResourceRequest"::: + + + + + Whether WebView is suspended. + + + True when WebView is suspended, from the time when has completed successfully until WebView is resumed. + + + + + An app may call this API to have the WebView2 consume less memory. + + + This is useful when a Win32 app becomes invisible, or when a Universal Windows Platform app is being suspended, during the suspended event handler before completing the suspended event. + + The property must be false when the API is called. Otherwise, the API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE). + + Suspending is similar to putting a tab to sleep in the Edge browser. Suspending pauses WebView script timers and animations, minimizes CPU usage for the associated browser renderer process and allows the operating system to reuse the memory that was used by the renderer process for other processes. + + Note that Suspend is best effort and considered completed successfully once the request is sent to browser renderer process. If there is a running script, the script will continue to run and the renderer process will be suspended after that script is done. + + See [Sleeping Tabs FAQ](https://techcommunity.microsoft.com/t5/articles/sleeping-tabs-faq/m-p/1705434) for conditions that might prevent WebView from being suspended. In those situations, the result of the async task is false. + + The WebView will be automatically resumed when it becomes visible. Therefore, the app normally does not have to call explicitly. + + The app can call and then periodically for an invisible WebView so that the invisible WebView can sync up with latest data and the page ready to show fresh content when it becomes visible. + + All WebView APIs can still be accessed when a WebView is suspended. Some APIs like Navigate will auto resume the WebView. To avoid unexpected auto resume, check property before calling APIs that might change WebView state. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="TrySuspend"::: + + + + + Resumes the WebView so that it resumes activities on the web page. + + + This API can be called while the WebView2 controller is invisible. + + The app can interact with the WebView immediately after . + + WebView will be automatically resumed when it becomes visible. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Resume"::: + + + + + Sets a mapping between a virtual host name and a folder path to make available to web sites via that host name. + + A virtual host name. + A folder path name to be mapped to the virtual host name. The length must not exceed the Windows MAX_PATH limit. + The level of access to resources under the virtual host from other sites. + + + After setting the mapping, documents loaded in the WebView can use HTTP or HTTPS URLs at the specified host name specified by hostName to access files in the local folder specified by folderPath. + This mapping applies to both top-level document and iframe navigations as well as subresource references from a document. This also applies to dedicated and shared worker scripts but does not apply to service worker scripts. + + Due to a current implementation limitation, media files accessed using virtual host name can be very slow to load. + + As the resource loaders for the current page might have already been created and running, changes to the mapping might not be applied to the current page and a reload of the page is needed to apply the new mapping. + + Both absolute and relative paths are supported for folderPath. Relative paths are interpreted as relative to the folder where the exe of the app is in. + + + For example, after calling SetVirtualHostNameToFolderMapping("appassets.example", "assets", CoreWebView2HostResourceAccessKind.Deny);, navigating to https://appassets.example/my-local-file.html will show content from my-local-file.html in the assets subfolder located on disk under the same path as the app's executable file. + + DOM elements that want to reference local files will have their host reference virtual host in the source. If there are multiple folders being used, define one unique virtual host per folder. + + + You should typically choose virtual host names that are never used by real sites. + If you own a domain such as example.com, another option is to use a subdomain reserved for the app (like my-app.example.com). + + + [RFC 6761](https://tools.ietf.org/html/rfc6761) has reserved several special-use domain names that are guaranteed to not be used by real sites (for example, .example, .test, and .invalid). + + + Note that using .local as the top-level domain name will work but can cause a delay during navigations. You should avoid using .local if you can. + + + Apps should use distinct domain names when mapping folder from different sources that should be isolated from each other. For instance, the app might use app-file.example for files that ship as part of the app, and book1.example might be used for files containing books from a less trusted source that were previously downloaded and saved to the disk by the app. + + + The host name used in the APIs is canonicalized using Chromium's host name parsing logic before being used internally. + For more information see [HTML5 2.6 URLs](https://dev.w3.org/html5/spec-LC/urls.html). + + + All host names that are canonicalized to the same string are considered identical. + For example, EXAMPLE.COM and example.com are treated as the same host name. + An international host name and its Punycode-encoded host name are considered the same host name. There is no DNS resolution for host name and the trailing '.' is not normalized as part of canonicalization. + + + Therefore example.com and example.com. are treated as different host names. Similarly, virtual-host-name and virtual-host-name.example.com are treated as different host names even if the machine has a DNS suffix of example.com. + + + Specify the minimal cross-origin access necessary to run the app. If there is not a need to access local resources from other origins, use . + + + + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + webView.Source = new Uri("https://appassets.example/index.html"); + + + This in an example on how to embed a local image. For more information see . + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + string c_navString = ""; + webview.NavigateToString(c_navString); + + + + + + + Clears a host name mapping for local folder that was added by . + + The host name to be removed from the mapping. + + + + + FrameCreated is raised when a new iframe is created. Handle this event to get access to objects. + + + + Use the to listen for when this iframe goes away. + + + + + DownloadStarting is raised when a download has begun, blocking the default download dialog, but not blocking the progress of the download. + + + The host can choose to cancel a download, change the result file path, and hide the default download dialog. If download is not handled or canceled, the download is saved to the default path after the event completes with default download dialog shown. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DownloadStarting"::: + + + + + ClientCertificateRequested is raised when WebView2 is making a request to an HTTP server that needs a client certificate for HTTP authentication. Read more about HTTP client certificates at [RFC 8446 The Transport Layer Security (TLS) Protocol Version 1.3](https://tools.ietf.org/html/rfc8446). + + + The host have several options for responding to client certificate requests: + + + + Scenario + Handled + Cancel + SelectedCertificate + + + Respond to server with a certificate + True + False + MutuallyTrustedCertificate value + + + Respond to server without certificate + True + False + null + + + Display default client certificate selection dialog prompt + False + False + n/a + + + Cancel the request + n/a + True + n/a + + + + If the host don't handle the event, WebView2 will show the default client certificate selection dialog prompt to the user. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClientCertificateRequested1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClientCertificateRequested2"::: + + + + + Opens the Browser Task Manager view as a new window in the foreground. + + + If the Browser Task Manager is already open, this will bring it into the foreground. WebView2 currently blocks the Shift+Esc shortcut for opening the task manager. An end user can open the browser task manager manually via the Browser task manager entry of the DevTools window's title bar's context menu. + + + + + Indicates whether all audio output from this CoreWebView2 is muted or not. Set to true will mute this CoreWebView2, and set to false will unmute this CoreWebView2. true if audio is muted. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleIsMuted"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="UpdateTitleWithMuteState"::: + + + + + Indicates whether any audio output from this CoreWebView2 is playing. true if audio is playing even if is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="UpdateTitleWithMuteState"::: + + + + + IsMutedChanged is raised when the mute state changes. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="IsMutedChanged"::: + + + + + IsDocumentPlayingAudioChanged is raised when document starts or stops playing audio. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="IsDocumentPlayingAudioChanged"::: + + + + + True if the default download dialog is currently open. + + + The value of this property changes only when the default download dialog is explicitly opened or closed. Hiding the WebView implicitly hides the dialog, but does not change the value of this property. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleDefaultDownloadDialog"::: + + + + + The default download dialog corner alignment. + + + The dialog can be aligned to any of the WebView corners (see ). When the WebView or dialog changes size, the dialog keeps it position relative to the corner. The dialog may become partially or completely outside of the WebView bounds if the WebView is small enough. Set the margin from the corner with the property. The corner alignment and margin should be set during initialization to ensure that they are correctly applied when the layout is first computed, otherwise they will not take effect until the next time the WebView position or size is updated. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SetDefaultDownloadDialogPosition"::: + + + + + The default download dialog margin relative to the WebView corner specified by . + + + The margin is a point that describes the vertical and horizontal distances between the chosen WebView corner and the default download dialog corner nearest to it. Positive values move the dialog towards the center of the WebView from the chosen WebView corner, and negative values move the dialog away from it. Use (0, 0) to align the dialog to the WebView corner with no margin. The corner alignment and margin should be set during initialization to ensure that they are correctly applied when the layout is first computed, otherwise they will not take effect until the next time the WebView position or size is updated. + + + + + Raised when the property changes. + + + This event comes after the event. Setting the property disables the default download dialog and ensures that this event is never raised. + + + + + Open the default download dialog. + + + If the dialog is opened before there are recent downloads, the dialog shows all past downloads for the current profile. Otherwise, the dialog shows only the recent downloads with a "See more" button for past downloads. Calling this method raises the event if the dialog was closed. No effect if the dialog is already open. + + + + + Close the default download dialog. + + + Calling this method raises the event if the dialog was open. No effect if the dialog is already closed. + + + + + BasicAuthenticationRequested event is raised when WebView encounters a Basic HTTP Authentication request as described in https://developer.mozilla.org/docs/Web/HTTP/Authentication, a Digest HTTP Authentication request as described in https://developer.mozilla.org/docs/Web/HTTP/Headers/Authorization#digest, an NTLM authentication or a Proxy Authentication request. + + + The host can provide a response with credentials for the authentication or cancel the request. If the host sets the Cancel property to false but does not provide either UserName or Password properties on the Response property, then WebView2 will show the default authentication challenge dialog prompt to the user. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BasicAuthenticationRequested"::: + + + + + ContextMenuRequested is raised when a context menu is requested by the user and the content inside WebView hasn't disabled context menus. + + + The host has the option to create their own context menu with the information provided in the event or can add items to or remove items from WebView context menu. If the host doesn't handle the event, WebView will display the default context menu. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="CustomContextMenu"::: + + + + + Runs an asynchronous DevToolsProtocol method for a specific session of an attached target. + + The sessionId for an attached target. null or empty string is treated as the session for the default target for the top page. + The full name of the method in the format {domain}.{method}. + A JSON formatted string containing the parameters for the corresponding method. + A JSON string that represents the method's return object. + + There could be multiple DevToolsProtocol targets in a WebView. + Besides the top level page, iframes from different origin and web workers are also separate targets. + Attaching to these targets allows interaction with them. + When the DevToolsProtocol is attached to a target, the connection is identified by a sessionId. + + To use this API, you must set the flatten parameter to true when calling Target.attachToTarget or Target.setAutoAttach DevToolsProtocol method. + Using Target.setAutoAttach is recommended as that would allow you to attach to dedicated worker targets, which are not discoverable via other APIs like Target.getTargets. + For more information about targets and sessions, navigate to [Chrome DevTools Protocol - Target domain]( https://chromedevtools.github.io/devtools-protocol/tot/Target). + + For more information about available methods, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). The handler's Invoke method will be called when the method asynchronously completes. Invoke will be called with the method's return object as a JSON string. + + + + + The current text of the statusbar as defined by [Window.statusbar](https://developer.mozilla.org/docs/Web/API/Window/statusbar). + + + + + StatusBarTextChanged event is raised when the text in the [Window.statusbar](https://developer.mozilla.org/docs/Web/API/Window/statusbar) changes. When the event is fired use the property to get the current statusbar text. + + + Events which cause causes can be anything from hover, url events, and others. There is not a finite list on how to cause the statusbar to change. + The developer must create the status bar and set the text. + + + + + The associated object of . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Profile"::: + + + + + The ServerCertificateErrorDetected event is raised when the WebView2 cannot verify server's digital certificate while loading a web page. + + + This event will raise for all web resources and follows the event. + + If you don't handle the event, WebView2 will show the default TLS interstitial error page to the user for navigations, and for non-navigations the web request is cancelled. + + Note that WebView2 before raising `ServerCertificateErrorDetected` raises a event with as FALSE and any of the below WebErrorStatuses that indicate a certificate failure. + + + + + + + + + + + + + + + + + + + + For more details see and handle ServerCertificateErrorDetected event or show the default TLS interstitial error page to the user according to the app needs. + + WebView2 caches the response when action is for the RequestUri's host and the server certificate in the session and the event won't be raised again. + + To raise the event again you must clear the cache using . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ServerCertificateErrorDetected"::: + + + + + Clears all cached decisions to proceed with TLS certificate errors from the event for all WebView2's sharing the same session. + + + + + Get the Uri as a string of the current Favicon. This will be an empty string if the page does not have a Favicon. + + + + + Raised when the Favicon has changed. This can include when a new page is loaded and thus by default no icon is set or the icon is set for the page by DOM or JavaScript. + + + The first argument is the Webview2 which saw the changed Favicon and the second is null. + + + + + Get the downloaded Favicon image for the current page and copy it to the image stream. + + The format to retrieve the Favicon in. + + An IStream populated with the downloaded Favicon. + + + + + Print the current web page asynchronously to the specified printer with the provided settings. + + + See for description of settings. Passing null for printSettings results in default print settings used. + + The method will return as if printerName doesn't match with the name of any installed printers on the user OS. + The method will throw ArgumentException if the caller provides invalid settings for a given printer. + + The async Print operation completes when it finishes printing to the printer. Only one Printing operation can be in progress at a time. If Print is called while a or or job is in progress, throws exception. This is only for printing operation on one webview. + + + + Error + PrintStatus + Notes + + + No + + Print operation succeeded. + + + No + + If specified printer is not found or printer status is not available, offline or error state. + + + No + + Print operation is failed. + + + ArgumentException + + If the caller provides invalid settings for the specified printer. + + + Exception + + Print operation is failed as printing job already in progress. + + + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PrintToPrinter"::: + + + + + Opens the print dialog to print the current web page. + + + See for descriptions of print dialog kinds. + + Invoking browser or system print dialog doesn't open new print dialog if it is already open. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ShowPrintUI"::: + + + + + Provides the Pdf data of current web page asynchronously for the provided settings. + + + Stream will be rewound to the start of the pdf data. + + See for description of settings. Passing null for printSettings results in default print settings used. + + The async PrintToPdfStream operation completes when it finishes writing to the stream. Only one Printing operation can be in progress at a time. If is called while a or or job is in progress, the throws an exception. This is only for printing operation on one webview. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PrintToPdfStream"::: + + + + + Share a shared buffer object with script of the main frame in the WebView. + + The object to be shared with script. + The desired given to script. + Additional data to be send to script. If it is not null or empty string, and it is not a valid JSON string, will be thrown. + + The script will receive a sharedbufferreceived event from chrome.webview. + The event arg for that event will have the following methods and properties. + + + + Property + Description + + + getBuffer() + A method that returns an ArrayBuffer object with the backing content from the shared buffer. + + + additionalData + An object as the result of parsing additionalDataAsJson as JSON string. This property will be undefined if additionalDataAsJson is nullptr or empty string. + + + source + With a value set as chrome.webview object. + + + + If access is , the script will only have read access to the buffer. + If the script tries to modify the content in a read only buffer, it will cause an access violation in WebView renderer process and crash the renderer process. + + If the shared buffer is already closed, the API throws with error code of RO_E_CLOSED. + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access to the shared buffer any more. + + The application can post the same shared buffer object to multiple web pages or iframes, or post to the same web page or iframe multiple times. + Each PostSharedBufferToScript will create a separate ArrayBuffer object with its own view of the memory and is separately released. + The underlying shared memory will be released when all the views are released. + + Sharing a buffer to script has security risk. You should only share buffer with trusted site. + If a buffer is shared to a untrusted site, possible sensitive information could be leaked. + If a buffer is shared as modifiable by the script and the script modifies it in an unexpected way, it could result in corrupted data that might even crash the application. + + The example code shows how to send data to script for one time read only consumption. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="OneTimeShareBuffer"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_2"::: + + + + + LaunchingExternalUriScheme is raised when a navigation request is made to a URI scheme that is registered with the OS. + + + The event handler may suppress the default dialog or replace the default dialog with a custom dialog. + If a is not taken on the event args, the external URI scheme launch is blocked until the event handler returns. + If a deferral is taken, the external URI scheme launch is blocked until the is completed. + The host also has the option to cancel the URI scheme launch. + + The and events will be raised, regardless of whether the property is set to true or false. + The event will be raised with the property set to false and the property set to regardless of whether the host sets the property. + The , and events will not be raised for this navigation to the external URI scheme regardless of the property. + The event will be raised after the event and before the event. + + The default will also be updated upon navigation to an external URI scheme. + If a setting on the interface has been changed, navigating to an external URI scheme will trigger the to update. + + The WebView2 may not display the default dialog based on user settings, browser settings, and whether the origin is determined as a [trustworthy origin](https://w3c.github.io/webappsec-secure-contexts#potentially-trustworthy-origin); however, the event will still be raised. + If the request is initiated by a cross-origin frame without a user gesture, the request will be blocked and the `LaunchingExternalUriScheme` event will not be raised. A URI scheme may be blocked for safety reasons. In this case the `LaunchingExternalUriScheme` event will not be raised. The default dialog may show an "always allow" checkbox which allows the user to opt-in to relaxed security (i.e. skipping future default dialogs) for the combination of the URI scheme and the origin of the page initiating this external URI scheme launch. The checkbox is offered so long as the group policy to show the checkbox is not explicitly disabled and there is a trustworthy initiating origin. If the user has checked this box, future attempts to launch this URI scheme will still raise the event. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="LaunchingExternalUriScheme"::: + + + + + Desired of a WebView. + + + An app may set to indicate desired memory consumption level of WebView. + Scripts will not be impacted and continue to run. + This is useful for inactive apps that still want to run scripts and/or keep network connections alive and therefore could not call and to reduce memory consumption. + These apps can set memory usage target level to when the app becomes inactive, and set back to when the app becomes active. + + It is not necessary to set CoreWebView2Controller's IsVisible property to false when setting the property. + + It is a best effort operation to change memory usage level, and the API will return before the operation completes. + + Setting the level to could potentially cause memory for some WebView browser processes to be swapped out to disk in some circumstances. It is a best effort to reduce memory usage as much as possible. + If a script runs after its related memory has been swapped out, the memory will be swapped back in to ensure the script can still run, but performance might be impacted. + Therefore, the app should set the level back to when the app becomes active again. Setting memory usage target level back to normal will not happen automatically. + + An app should choose to use either the combination of and or the combination of setting MemoryUsageTargetLevel to and . It is not advisable to mix them. + Trying to set while suspended will be ignored. + The and methods will change the . + will automatically set to while on suspended WebView will automatically set to . + Calling when the WebView is not suspended would not change . + + + + + The unique identifier of the main frame. It's the same kind of ID as with the and . + + + FrameId may not be valid if has not done any navigation. It's safe to get this value during or after the first event. Otherwise, it could return the invalid frame Id 0. + + + + + Runs JavaScript code from the javaScript parameter in the current top-level document rendered in the WebView, The result of the execution is returned asynchronously in the object which has methods and properties to obtain the successful result of script execution as well as any unhandled JavaScript exceptions. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScriptWithResult"::: + + + + + NotificationReceived is raised when a non-persistent notification is received. + + + + + SaveAsUIShowing is raised when browser trys to open a save as dialog. It includes opening dialog manually from context menu or programmatically from . + + + + + + Async method to programmatically trigger a Save As action for the currently loaded document. + + It opens a system modal dialog by default. If the property is `TRUE`, the system dialog is not opened. This method can return . + + + + + + This event will be raised during system FileTypePolicy checking the dangerous file extension list. + + + Developers can specify their own logic for determining whether to allow a particular type of file to be saved from the document origin URI. Developers can also determine the save decision based on other criteria. Here are two properties in to manage the decision, and . + Table of Properties' value and result: + + + + CancelSave + SuppressDefaultPolicy + Result + + + False + False + Perform the default policy check. It may show the security warning UI if the file extension is dangerous. + + + False + True + Skip the default policy check and the possible security warning. Start saving or downloading. + + + True + Any + Skip the default policy check and the possible security warning. Abort save or download. + + + + + + + ScreenCaptureStarting event is raised when the [Screen Capture API](https://www.w3.org/TR/screen-capture/) is requested by the user using getDisplayMedia(). + + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + Represents a certificate. Gives access to a certificate's metadata. + + + + + Converts this to a X509Certificate2. + + + An object created using PEM encoded data from + this object. + + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + Subject of the certificate. + + + + + Name of the certificate authority that issued the certificate. + + + + + Base64 encoding of DER encoded serial number of the certificate. Read more about DER at [RFC 7468 DER](https://tools.ietf.org/html/rfc7468#appendix-B). + + + + + Display name for a certificate. + + + + + Returns list of PEM encoded certificate issuer chain. In this list first element is the current certificate followed by intermediate1, intermediate2...intermediateN-1. Root certificate is the last element in the list. + + + + + PEM encoded data for the certificate. Returns Base64 encoding of DER encoded certificate. Read more about PEM at [RFC 1421 Privacy Enhanced Mail](https://tools.ietf.org/html/rfc1421). + + + + + Represents a client certificate. Gives access to a certificate's metadata. + + + + + Converts this to a X509Certificate2. + + + An object created using PEM encoded data from + this object. + + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + Subject of the certificate. + + + + + Name of the certificate authority that issued the certificate. + + + + + Base64 encoding of DER encoded serial number of the certificate. Read more about DER at [RFC 7468 DER](https://tools.ietf.org/html/rfc7468#appendix-B). + + + + + Display name for a certificate. + + + + + Returns list of PEM encoded client certificate issuer chain. In this list first element is the current certificate followed by intermediate1, intermediate2...intermediateN-1. Root certificate is the last element in the list. + + + + + Kind of a certificate. See for descriptions. + + + + + PEM encoded data for the certificate. Returns Base64 encoding of DER encoded certificate. Read more about PEM at [RFC 1421 Privacy Enhanced Mail](https://tools.ietf.org/html/rfc1421). + + + + + This class is the owner of the object, and + provides support for resizing, showing and hiding, focusing, and other + functionality related to windowing and composition. + + + The owns the , and if all references to the go away, the WebView will be closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + + + Gets the associated with this . + + + + + + Moves focus into WebView. + + The reason for moving focus. + + WebView will get focus and focus will be set to correspondent element in the page hosted in the WebView. For reason, focus is set to previously focused element or the default element if no previously focused element exists. For reason, focus is set to the first element. For reason, focus is set to the last element. WebView changes focus through user interaction including selecting into a WebView or Tab into it. For tabbing, the app runs MoveFocus with or to align with Tab and Shift+Tab respectively when it decides the WebView is the next tabbable element. + + + + + Determines whether to show or hide the WebView. + + + If IsVisible is set to false, the WebView is transparent and is not rendered. However, this does not affect the window containing the WebView (the ParentWindow parameter that was passed to or ). + If you want that window to disappear too, run the corresponding Hide method from the UI framework on it directly in addition to modifying this. + WebView as a child window does not get window messages when the top window is minimized or restored. For performance reasons, developers should set the IsVisible property of the WebView to false when the app window is minimized and back to true when the app window is restored. The app window does this by handling SIZE_MINIMIZED and SIZE_RESTORED command upon receiving WM_SIZE message. There are CPU and memory benefits when the page is hidden. For instance Chromium has code that throttles activities on the page like animations and some tasks are run less frequently. Similarly, WebView2 will purge some caches to reduce memory usage. + + + + + + Gets or sets the WebView bounds. + + + Bounds are relative to the . The app has two ways to position a WebView: + + + Create a child HWND that is the WebView parent HWND. Position the window where the WebView should be. Use (0, 0) for the top-left corner (the offset) of the Bounds of the WebView. + + + Use the top-most window of the app as the WebView parent HWND. For example, to position ebView correctly in the app, set the top-left corner of the Bounds of the WebView. + + + + The values of Bounds are limited by the coordinate space of the host. + + + + + Gets or sets the zoom factor for the WebView. + + + Note that changing zoom factor may cause window.innerWidth or window.innerHeight and page layout to change. A zoom factor that is applied by the host by setting this ZoomFactor property becomes the new default zoom for the WebView. This zoom factor applies across navigations and is the zoom factor WebView is returned to when the user presses Ctrl+0. When the zoom factor is changed by the user (resulting in the app receiving ), that zoom applies only for the current page. Any user applied zoom is only for the current page and is reset on a navigation. Specifying a ZoomFactor less than or equal to 0 is not allowed. WebView also has an internal supported zoom factor range. When a specified zoom factor is out of that range, it is normalized to be within the range, and a event is raised for the real applied zoom factor. When this range normalization happens, this reports the zoom factor specified during the previous modification of the ZoomFactor property until the event is received after WebView applies the normalized zoom factor. + + + + + Gets the parent window provided by the app or sets the parent window that this WebView is using to render content. + + + It initially returns the ParentWindow passed into or . Setting the property causes the WebView to re-parent the main WebView window to the newly provided window. + + + + + ZoomFactorChanged is raised when the property changes. + + + The event may be raised because the property was modified, or due to the user manually modifying the zoom. When it is modified using the property, the internal zoom factor is updated immediately and no ZoomFactorChanged event is raised. WebView associates the last used zoom factor for each site. It is possible for the zoom factor to change when navigating to a different page. When the zoom factor changes due to a navigation change, the ZoomFactorChanged event is raised right after the event. + + + + + + MoveFocusRequested is raised when user tries to tab out of the WebView. + + + The focus of the WebView has not changed when this event is raised. + + + + + GotFocus is raised when WebView gets focus. + + + + + LostFocus is raised when WebView loses focus. + + + In the case where event is raised, the focus is still on WebView when event is raised. LostFocus is only raised afterwards when code of the app or default action of event sets focus away from WebView. + + + + + AcceleratorKeyPressed is raised when an accelerator key or key combo is pressed or released while the WebView is focused. + + + A key is considered an accelerator if either of the following conditions are true: + + + + Ctrl or Alt is currently being held. + + + The pressed key does not map to a character. + + + + A few specific keys are never considered accelerators, such as Shift. The Escape key is always considered an accelerator. + + Autorepeated key events caused by holding the key down will also raise this event. Filter out the auto-repeated key events by verifying or . + + In windowed mode, this event is synchronous. Until you set to true or the event handler returns, the browser process is blocked and outgoing cross-process COM calls will fail with RPC_E_CANTCALLOUT_ININPUTSYNCCALL. All methods work, however. + + In windowless mode, the event is asynchronous. Further input do not reach the browser until the event handler returns or is set to true, but the browser process is not blocked, and outgoing COM calls work normally. + + It is recommended to set to true as early as you are able to know that you want to handle the accelerator key. + + + + + Updates and properties at the same time. + + The bounds to be updated. + The zoom factor to be updated. + + This operation is atomic from the perspective of the host. After returning from this function, the and properties are both updated if the function is successful, or neither is updated if the function fails. If and are both updated by the same scale (for example, and are both doubled), then the page does not display a change in window.innerWidth or window.innerHeight and the WebView renders the content at the new size and zoom without intermediate renderings. This function also updates just one of or by passing in the new value for one and the current value for the other. + + + + + Tells WebView that the main WebView parent (or any ancestor) HWND moved. + + + This is a notification separate from . This is needed for accessibility and certain dialogs in WebView to work correctly. + + + + + Closes the WebView and cleans up the underlying browser instance. + + + Cleaning up the browser instance releases the resources powering the WebView. The browser instance is shut down if no other WebViews are using it. + + After running Close, all methods fail and event handlers stop running. Specifically, the WebView releases the associated references to any associated event handlers when Close is run. + + Close is implicitly run when the loses the final reference and is destructed. But it is best practice to explicitly run Close to avoid any accidental cycle of references between the WebView and the app code. Specifically, if you capture a reference to the WebView in an event handler you create a reference cycle between the WebView and the event handler. Run Close to break the cycle by releasing all event handlers. But to avoid the situation, it is best to both explicitly run Close on the WebView and to not capture a reference to the WebView to ensure the WebView is cleaned up correctly. Close is synchronous and won't trigger the beforeunload event. + + + + + Gets or sets the WebView default background color. + + + The `DefaultBackgroundColor` is the color that renders underneath all web content. This means WebView renders this color when there is no web content loaded such as before the initial navigation or between navigations. This also means web pages with undefined css background properties or background properties containing transparent pixels will render their contents over this color. Web pages with defined and opaque background properties that span the page will obscure the `DefaultBackgroundColor` and display normally. The default value for this property is white to resemble the native browser experience. Currently this API only supports opaque colors and transparency. It will fail for colors with alpha values that don't equal 0 or 255 ie. translucent colors are not supported. It also does not support transparency on Windows 7. On Windows 7, setting DefaultBackgroundColor to a Color with an Alpha value other than 255 will result in failure. On any OS above Win7, choosing a transparent color will result in showing hosting app content. This means webpages without explicit background properties defined will render web content over hosting app content. + This property may also be set via the `WEBVIEW2_DEFAULT_BACKGROUND_COLOR` environment variable. There is a known issue with background color where just setting the color by property can still leave the app with a white flicker before the `DefaultBackgroundColor` property takes effect. Setting the color via environment variable solves this issue. The value must be a hex value that can optionally prepend a 0x. The value must account for the alpha value which is represented by the first 2 digits. So any hex value fewer than 8 digits will assume a prepended 00 to the hex value and result in a transparent color. `DefaultBackgroundColor` will return the result of this environment variable even if it has not been set directly. This environment variable can only set the `DefaultBackgroundColor` once. Subsequent updates to background color must be done by setting the property. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DefaultBackgroundColor"::: + + + + + Gets or sets the WebView rasterization scale. + + + The rasterization scale is the combination of the monitor DPI scale and text scaling set by the user. This value should be updated when the DPI scale of the app's top level window changes (i.e. monitor DPI scale changes or the window changes monitor) or when the text scale factor of the system changes. + Rasterization scale applies to the WebView content, as well as popups, context menus, scroll bars, and so on. Normal app scaling scenarios should use the property or method. + + + + + Determines whether the WebView will detect monitor scale changes. + + + ShouldDetectMonitorScaleChanges property determines whether the WebView attempts to track monitor DPI scale changes. When true, the WebView will track monitor DPI scale changes, update the property, and fire event. When false, the WebView will not track monitor DPI scale changes, and the app must update the property itself. event will never raise when ShouldDetectMonitorScaleChanges is false. Apps that want to set their own rasterization scale should set this property to false to avoid the WebView2 updating the property to match the monitor DPI scale. + + + + + Gets or sets the WebView bounds mode. + + + BoundsMode affects how setting the and properties work. Bounds mode can either be in mode or mode. + + + + + RasterizationScaleChanged is raised when the property changes. + + + The event is raised when the Webview detects that the monitor DPI scale has changed, is true, and the Webview has changed the property. + + + + + + Gets or sets the WebView allow external drop property. + + + The AllowExternalDrop is to configure the capability that dropping files into webview2 is allowed or permitted. The default value is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleAllowExternalDrop"::: + + + + + Used to manage profile options that created by . + + + Used to manage profile options that created by . + + + + + Manages the value of the controller's script locale. + + + The ScriptLocale property is to specify the default script + locale. It sets the default locale for all Intl JavaScript APIs and + other JavaScript APIs that depend on it, namely + Intl.DateTimeFormat() which affects string formatting like in + the time/date formats.The intended locale value is in the format of + BCP 47 Language Tags. More information can be found from [IETF + BCP47](https://www.ietf.org/rfc/bcp/bcp47.html ). The default value + for ScriptLocale will be depend on the WebView2 language and OS + region. If the language portions of the WebView2 language and OS + region match, then it will use the OS region. Otherwise, it will use + the WebView2 language. + + + OS Region + WebView2 Language + Default WebView2 ScriptLocale + + + en-GB + en-US + en-GB + + + es-MX + en-US + en-US + + + en-US + en-GB + en-US + + + You can set the ScriptLocale to the empty string to get the default ScriptLocale value. + Use OS specific APIs to determine the OS region to use with this property if you always want to match with the OS + region. For example: + + CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture; + return cultureInfo.Name + + + + + + Manage the name of the controller's profile. + + + The ProfileName property is to specify a profile name, which is only allowed to contain the following ASCII characters. It has a maximum length of 64 characters excluding the null-terminator. It is ASCII case insensitive. + + * alphabet characters: a-z and A-Z + * digit characters: 0-9 + * and '#', '@', '$', '(', ')', '+', '-', '_', '~', '.', ' ' (space). + + Note: the text must not end with a period '.' or ' ' (space). And, although upper-case letters are allowed, they're treated just as lower-case counterparts because the profile name will be mapped to the real profile directory path on disk and Windows file system handles path names in a case-insensitive way. + + + + + Manage the controller's InPrivate mode. + + + + + Provides a set of properties that are used to manage a . + + + + + Converts this to a System.Net.Cookie. + + + An object whose , , , , , , and , matches + those , , , + , , , and of this object. + + + The values of the properties other than those + specified above remain their default values. + + + + + + The expiration date and time for the cookie since the UNIX epoch. + + + Setting the Expires property to + makes this a session cookie, which is its default value. + + + + + Get or sets the cookie name. + + + + + Gets or sets the cookie value. + + + + + Gets the domain for which the cookie is valid. + + + The default value is the host that this cookie has been received from. Note that, for instance, .bing.com, bing.com, and www.bing.com are considered different domains. + + + + + Gets the path for which the cookie is valid. + + + The default value is "/", which means this cookie will be sent to all pages on the . + + + + + Determines whether this cookie is http-only. + + + + + Determines the SameSite status of the cookie which represents the enforcement mode of the cookie. + + + The default value is . + + + + + Gets or sets the security level of this cookie. + + + + + Determines whether this is a session cookie. The default value is false. + + + + + Creates, adds or updates, gets, or or view the cookies. + + + The changes would apply to the context of the user profile. That is, other WebViews under the same user profile could be affected. + + + + + Creates a CoreWebView2Cookie object whose params matches those of the given System.Net.Cookie. + + + A System.Net.Cookie whose params to be used to create a CoreWebView2Cookie. + + + An object whose , , , , , , and , matches those , , , , , , and of the given object. + + + The default value for the + property of the returned object is + . + + + + + + Creates a cookie object with a specified name, value, domain, and path. + + + One can set other optional properties after cookie creation. This only creates a cookie object and it is not added to the cookie manager until you call . name that starts with whitespace(s) is not allowed. + + The name for the to be created. It cannot start with whitespace(s). + + + + + + + Creates a cookie whose params matches those of the specified cookie. + + + + + Gets a list of cookies matching the specific URI. + + + You can modify the cookie objects by calling , and the changes will be applied to the webview. + + If uri is empty string or null, all cookies under the same profile are returned. + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetCookies"::: + + + + + Adds or updates a cookie with the given cookie data; may overwrite cookies with matching name, domain, and path if they exist. + + The to be added or updated. + + This method will fail if the domain of the given cookie is not specified. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AddOrUpdateCookie"::: + + + + + Deletes a cookie whose name and domain/path pair match those of the specified cookie. + + + + + Deletes cookies with matching name and uri. + + The name for the cookies to be deleted is required. + If uri is specified, deletes all cookies with the given name where domain and path match provided URI. + + + + Deletes cookies with matching name and domain/path pair. + + The name for the cookies to be deleted is required. + If domain is specified, deletes only cookies with the exact domain. + If path is specified, deletes only cookies with the exact path. + + + + Deletes all cookies under the same profile. + + + This could affect other WebViews under the same user profile. + + + + + Represents the registration of a custom scheme with the . + + + This allows the WebView2 app to be able to handle event for requests with the + specified scheme and be able to navigate the WebView2 to the custom + scheme. Once the environment is created, the registrations are valid and + immutable throughout the lifetime of the associated WebView2s' browser + process and any WebView2 environments sharing the browser process must be + created with identical custom scheme registrations, otherwise the + environment creation will fail. Any further attempts to register the same + scheme will fail during environment creation. The URIs of registered + custom schemes will be treated similar to http URIs for their origins. + They will have tuple origins for URIs with host and opaque origins for + URIs without host as specified in [7.5 Origin - HTML Living Standard](https://html.spec.whatwg.org/multipage/origin.html) For event, the cases of request + URIs and filter URIs with custom schemes will be normalized according to + generic URI syntax rules. Any non-ASCII characters will be preserved. The + registered custom schemes also participate in [CORS](https://developer.mozilla.org/docs/Web/HTTP/CORS) and adheres to + [CSP](https://developer.mozilla.org/docs/Web/HTTP/CSP). The app needs to + set the appropriate access headers in its event handler to allow CORS + requests. + + + custom-scheme-with-host://hostname/path/to/resource has origin of + custom-scheme-with-host://hostname. + custom-scheme-without-host:path/to/resource has origin of + custom-scheme-without-host:path/to/resource. + + + + + The name of the custom scheme to register. + + + + + Whether the sites with this scheme will be treated as a [Secure + Context](https://developer.mozilla.org/docs/Web/Security/Secure_Contexts) + like an HTTPS site. + + + + + Set this property to true if the URIs with this custom scheme + will have an authority component (a host for custom schemes). + Specifically, if you have a URI of the following form you should set the + HasAuthorityComponent value as listed. + + + + URI + Recommended HasAuthorityComponent value + + + custom-scheme-with-authority://host/path + true + + + custom-scheme-without-authority:path + false + + + + + When this property is set to true, the URIs with this scheme will + be interpreted as having a [scheme and + host](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-tuple) + origin similar to an http URI. Note that the port and user information + are never included in the computation of origins for custom schemes. If + this property is set to false, URIs with this scheme will have an + [opaque + origin](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque) + similar to a data URI. This property is false by default. Note: + For custom schemes registered as having authority component, navigations + to URIs without authority of such custom schemes will fail. However, if + the content inside WebView2 references a subresource with a URI that + does not have an authority component, but of a custom scheme that is + registered as having authority component, the URI will be interpreted as + a relative path as specified in + [RFC3986](https://www.rfc-editor.org/rfc/rfc3986). For example, + custom-scheme-with-authority:path will be interpreted as + custom-scheme-with-authority://host/path. However, this behavior + cannot be guaranteed to remain in future releases so it is recommended + not to rely on this behavior. + + + + + List of origins that are allowed to issue requests with the custom + scheme, such as XHRs and subresource requests that have an Origin + header. + + + The origin of any request (requests that have the [Origin + header](https://developer.mozilla.org/docs/Web/HTTP/Headers/Origin)) to + the custom scheme URI needs to be in this list. No-origin requests are + requests that do not have an Origin header, such as link navigations, + embedded images and are always allowed. Note that cross-origin + restrictions still apply. From any opaque origin (Origin header is + null), no cross-origin requests are allowed. If the list is empty, no + cross-origin request to this scheme is allowed. Origins are specified as + a string in the format of scheme://host:port. The origins are + string pattern matched with * (matches 0 or more characters) and + ? (matches 0 or 1 character) wildcards just like the URI matching + in the + API. For example, http://*.example.com:80. + + Here's a set of examples of what is allowed or not: + + + + Request URI + Originating URL + AllowedOrigins + Allowed + + + custom-scheme:request + https://www.example.com + {"https://www.example.com"} + Yes + + + custom-scheme:request + https://www.example.com + {"https://*.example.com"} + Yes + + + custom-scheme:request + https://www.example.com + {"https://www.example2.com"} + No + + + custom-scheme-with-authority://host/path + custom-scheme-with-authority://host2 + {""} + No + + + custom-scheme-with-authority://host/path + custom-scheme-with-authority2://host + {"custom-scheme-with-authority2://*"} + Yes + + + custom-scheme-without-authority:path + custom-scheme-without-authority:path2 + {"custom-scheme-without-authority:*"} + No + + + custom-scheme-without-authority:path + custom-scheme-without-authority:path2 + {"*"} + Yes + + + + + + + Initializes a new instance of the CoreWebView2CustomSchemeRegistration + class. + + + The name of the custom scheme to register. + + + + + Represents a download operation. Gives access to a download's metadata and supports a user canceling, pausing, or resuming a download. + + + + + The estimated end time of the download. + + + + + The total bytes to receive count. + + + + + The URI of the download. + + + + + The Content-Disposition header value from the download's HTTP response. If none, the value is an empty string. + + + + + MIME type of the downloaded content. + + + + + The number of bytes that have been written to the download file. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BytesReceivedChanged"::: + + + + + The absolute path to the download file, including file name. + + + Host can change this from . + + + + + The state of the download. A download can be in progress, interrupted, or completed. + + + See for descriptions of states. + + + + + The reason why connection with file host was broken. + + + See for descriptions of reasons. + + + + + Returns true if an interrupted download can be resumed. + + + Downloads with the following interrupt reasons may automatically resume without you calling any methods: , , . In these cases progress may be restarted with set to 0. + + + + + Event raised when the bytes received count is updated. + + + + + Event raised when the estimated end time changes. + + + + + Event raised when the state of the download changes. + + + Use to get the current state, and to get the reason if the download is interrupted. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="StateChanged"::: + + + + + Cancels the download. + + + If canceled, the default download dialog shows that the download was canceled. Host should use if download should be canceled without displaying the default download dialog. + + + + + Pauses the download. + + + If paused, the default download dialog shows that the download is paused. No effect if download is already paused. Pausing a download changes the state from in progress to interrupted, with interrupt reason set to . + + + + + Resumes a paused download. May also resume a download that was interrupted for another reason if returns true. + + + Resuming a download changes the state from interrupted to in progress. + + + + + This represents the WebView2 Environment. + + + WebViews created from an environment run on the Browser process specified with environment parameters and objects created from an environment should be used in the same environment. Using it in different environments are not guaranteed to be compatible and may fail. + + + + + + + + + + + + + + + + + + + Creates a WebView2 Environment using the installed or a custom WebView2 Runtime version. + + + The relative path to the folder that contains a custom version of WebView2 Runtime. + + To use a fixed version of the WebView2 Runtime, pass the + folder path that contains the fixed version of the WebView2 Runtime + to browserExecutableFolder. BrowserExecutableFolder supports both relative + (to the application's executable) and absolute file paths. To create WebView2 controls + that use the installed version of the WebView2 Runtime that exists on + user machines, pass a null or empty string to + browserExecutableFolder. In this scenario, the API tries to + find a compatible version of the WebView2 Runtime that is installed + on the user machine (first at the machine level, and then per user) + using the selected channel preference. The path of fixed version of + the WebView2 Runtime should not contain \Edge\Application\. When + such a path is used, the API fails with ERROR_NOT_SUPPORTED. + + + + The user data folder location for WebView2. + + The path is either an absolute file path or a relative file path + that is interpreted as relative to the compiled code for the + current process. The default user data folder {Executable File + Name}.WebView2 is created in the same directory next to the + compiled code for the app. WebView2 creation fails if the compiled + code is running in a directory in which the process does not have + permission to create a new directory. The app is responsible to + clean up the associated user data folder when it is done. + + + + Options used to create WebView2 Environment. + + As a browser process may be shared among WebViews, WebView creation + fails if the specified options does not match the options of + the WebViews that are currently running in the shared browser + process. + + + + + The default channel search order is the WebView2 Runtime, Beta, Dev, and + Canary. When an override WEBVIEW2_RELEASE_CHANNEL_PREFERENCE environment + variable or applicable releaseChannelPreference registry value is set to + 1, the channel search order is reversed. + + + To use a fixed version of the WebView2 Runtime, pass the relative + folder path that contains the fixed version of the WebView2 Runtime + to browserExecutableFolder. To create WebView2 controls that + use the installed version of the WebView2 Runtime that exists on + user machines, pass a null or empty string to + browserExecutableFolder. In this scenario, the API tries to + find a compatible version of the WebView2 Runtime that is installed + on the user machine (first at the machine level, and then per user) + using the selected channel preference. The path of fixed version of + the WebView2 Runtime should not contain \Edge\Application\. When + such a path is used, the API fails with the following error. + + + The , , and may be + overridden by values either specified in environment variables or in + the registry. + + + When creating a the following environment variables are verified. + + + + WEBVIEW2_BROWSER_EXECUTABLE_FOLDER + + + WEBVIEW2_USER_DATA_FOLDER + + + WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS + + + WEBVIEW2_RELEASE_CHANNEL_PREFERENCE + + + + If browser executable folder or user data folder is specified in an + environment variable or in the registry, the specified or values are overridden. If additional browser + arguments are specified in an environment variable or in the + registry, it is appended to the corresponding value in the specified + . + + + While not strictly overrides, additional environment variables may be set. + + + + Value + Description + + + WEBVIEW2_WAIT_FOR_SCRIPT_DEBUGGER + + When found with a non-empty value, this indicates that the WebView + is being launched under a script debugger. In this case, the WebView + issues a Page.waitForDebugger CDP command that runs the + script inside the WebView to pause on launch, until a debugger + issues a corresponding Runtime.runIfWaitingForDebugger CDP + command to resume the runtime. + Note that this environment variable does not have a registry key equivalent. + + + + WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER + + When found with a non-empty value, it indicates that the WebView is + being launched under a script debugger that also supports host apps + that use multiple WebViews. The value is used as the identifier for + a named pipe that is opened and written to when a new WebView is + created by the host app. The payload should match the payload of the + remote-debugging-port JSON target and an external debugger + may use it to attach to a specific WebView instance. The format of + the pipe created by the debugger should be + \\.\pipe\WebView2\Debugger\{app_name}\{pipe_name}, where the + following are true. + + + {app_name} is the host app exe file name, for example, WebView2Example.exe + {pipe_name} is the value set for WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER + + + To enable debugging of the targets identified by the JSON, you must + set the WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS environment + variable to send --remote-debugging-port={port_num}, where + the following is true. + + + {port_num} is the port on which the CDP server binds. + + + If both WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER and + WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS environment variables, + the WebViews hosted in your app and associated contents may exposed + to 3rd party apps such as debuggers. Note that this environment + variable does not have a registry key equivalent. + + + + + If none of those environment variables exist, then the registry is examined + next. + + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\BrowserExecutableFolder "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\ReleaseChannelPreference "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\AdditionalBrowserArguments "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\UserDataFolder "{AppId}"="" + + + + Use a group policy under Administrative Templates > + Microsoft Edge WebView2 to configure browser executable folder + and release channel preference. + + + + Value + Description + + + ERROR_DISK_FULL + + In the unlikely scenario where some instances of WebView are open during a + browser update, the deletion of the previous WebView2 Runtime may be + blocked. To avoid running out of disk space, a new WebView creation fails + with this error if it detects that too many previous WebView2 + Runtime versions exist. + + + + COREWEBVIEW2_MAX_INSTANCES + + The default maximum number of WebView2 Runtime versions allowed is 20. + To override the maximum number of the previous WebView2 Runtime versions + allowed, set the value of the following environment variable. + + + + ERROR_PRODUCT_UNINSTALLED + + If the Webview depends upon an installed WebView2 Runtime version and it is + uninstalled, any subsequent creation fails with this error. + + + + + First verify with Root as HKLM and then HKCU. AppId is first set to + the Application User Model ID of the process, then if no corresponding + registry key, the AppId is set to the compiled code name of the process, + or if that is not a registry key then *. If an override registry key is + found, use the browserExecutableFolder and userDataFolder registry + values as replacements and append additionalBrowserArguments registry + values for the corresponding values in the provided . + + + + + + Gets the browser version info including channel name if it is not the stable channel or WebView2 Runtime. + + + The relative path to the folder that contains the WebView2 Runtime. + + + WebView2 Runtime installation is missing. + + + + + Gets the browser version info including channel name if it is not the stable channel or WebView2 Runtime. + + + The relative path to the folder that contains the WebView2 Runtime. + + + The environment options used to create the environment. + + + WebView2 Runtime installation is missing. + + + Browser version info includes channel name if it is not the WebView2 Runtime. + Channel names are Beta, Dev, and Canary. The format of the return string + matches the format of . + If an override exists for BrowserExecutableFolder, ReleaseChannels, + or ChannelSearchKind, the override is used. The presence of an override + can result in a different channel used than the one expected based on the environment + options object. BrowserExecutableFolder takes precedence over the + other options. See + for more details on overrides. If an override is not specified, then the + parameters passed to GetAvailableBrowserVersionString are used. + The method fails if the loader is unable to find an installed WebView2 + Runtime or non-stable Microsoft Edge installation. + + + + + Compares two instances of browser versions correctly and returns an integer that indicates whether the first instance is older, the same as, or newer than the second instance. + + + One of the version strings to compare. + + + The other version string to compare. + + + An integer that indicates whether the first instance is older, the same as, or newer than the second instance. + + + Value Type + Condition + + + Less than zero + version1 is older than version2. + + + Zero + version1 is the same as version2. + + + Greater than zero + version1 is newer than version2. + + + + + + + Creates a new object. + + The request URI. + The HTTP request method. + + The raw request header string delimited by CRLF (optional in last header). + + uri parameter must be absolute URI. It's also possible to create this object with null headers string and then use the to construct the headers line by line. + + + + + + Creates a new object, + which can be passed as a parameter in and function for multiple profiles + support. + + + A that can be + passed when calling and . + + + The options is a settable property while the default for profile + name is an empty string and the default value for is + false. The profile will be created on disk or opened when calling + CreateCoreWebView2ControllerWithOptions no matter InPrivate mode is + enabled or not, and it will be released in memory when the + corresponding is closed but + still remain on disk. As WebView2 is built on top of Edge browser, + it follows Edge's behavior pattern. To create an InPrivate WebView, + we get an off-the-record profile (an InPrivate profile) from a + regular profile, then create the WebView with the off-the-record + profile. Also the profile name can be reused. + + + + + Asynchronously creates a new object. + + The HWND in which the WebView should be displayed and from which receive input. + + The options contains profileName and inPrivate parameters that could be used to create CoreWebView2Profile, and it can be used to create multiple WebViews with multiple profiles under a single user data directory. + + + Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + + Asynchronously creates a new object. + + The HWND in which the WebView should be displayed and from which receive input. + + The options contains profileName and inPrivate parameters that could be used to create CoreWebView2Profile, and it can be used to create multiple WebViews with multiple profiles under a single user data directory. + + + Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + + Set the path of the folder containing the `WebView2Loader.dll`. + + The path of the folder containing the `WebView2Loader.dll`. + + Thrown when `WebView2Loader.dll` has been successfully loaded. + + + This function allows you to set the path of the folder containing the `WebView2Loader.dll`. This should be the path of a folder containing `WebView2Loader.dll` and not a path to the `WebView2Loader.dll` file itself. + Note that the WebView2 SDK contains multiple `WebView2Loader.dll` files for different CPU architectures. When specifying folder path, you must specify one containing a `WebView2Loader.dll` module with a CPU architecture matching the current process CPU architecture. + This function is used to load the `WebView2Loader.dll` module during calls to any other static methods on `CoreWebView2Environment`. So, the path should be specified before any other API is called in `CoreWebView2Environment` class. Once `WebView2Loader.dll` is successfully loaded this function will throw an InvalidOperationException exception. + The path can be relative or absolute. Relative paths are relative to the path of the `Microsoft.Web.WebView2.Core.dll` module. + If the `WebView2Loader.dll` file does not exist in that path or LoadLibrary cannot load the file, or LoadLibrary fails for any other reason, an exception corresponding to the LoadLibrary failure is thrown when any other API is called in `CoreWebView2Environment` class. For instance, if the file cannot be found a `DllNotFoundException` exception will be thrown. + + + + + Gets the browser version info of the current , including channel name if it is not the stable channel. + + + It matches the format of the method. Channel names are beta, dev, and canary. + + + + + NewBrowserVersionAvailable is raised when a newer version of the WebView2 Runtime is installed and available using WebView2. + + + To use the newer version of the browser you must create a new environment and WebView. The event is only raised for new version from the same WebView2 Runtime from which the code is running. When not running with installed WebView2 Runtime, no event is raised. + + Because a user data folder is only able to be used by one browser process at a time, if you want to use the same user data folder in the WebViews using the new version of the browser, you must close the environment and instance of WebView that are using the older version of the browser first. Or simply prompt the user to restart the app. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SubscribeToNewBrowserVersionAvailable"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NewBrowserVersionAvailable"::: + + + + + Asynchronously creates a new WebView. + + The HWND in which the WebView should be displayed and from which receive input. + + The WebView adds a child window to the provided window during WebView creation. Z-order and other things impacted by sibling window order are affected accordingly. + + + HWND_MESSAGE is a valid parameter for ParentWindow for an invisible WebView for Windows 8 and above. In this case the window will never become visible. You are not able to reparent the window after you have created the WebView. This is not supported in Windows 7 or below. Passing this parameter in Windows 7 or below will return ERROR_INVALID_WINDOW_HANDLE in the controller callback. + + + + It can also accept a which is created by as the second parameter for multiple profiles support. As WebView2 is built on top of Edge browser, it follows Edge's behavior pattern. To create an InPrivate WebView, we gets an off-the-record profile (an InPrivate profile) from a regular profile, then create the WebView with the off-the-record profile. Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + It is recommended that the application set Application User Model ID for the process or the application window. If none is set, during WebView creation a generated Application User Model ID is set to root window of ParentWindow. + + + + It is recommended that the app handles restart manager messages, to gracefully restart it in the case when the app is using the WebView2 Runtime from a certain installation and that installation is being uninstalled. For example, if a user installs a version of the WebView2 Runtime and opts to use another version of the WebView2 Runtime for testing the app, and then uninstalls the 1st version of the WebView2 Runtime without closing the app, the app restarts to allow un-installation to succeed. + + + + When the app retries CreateCoreWebView2ControllerAsync upon failure, it is recommended that the app restarts from creating a new WebView2 Environment. If a WebView2 Runtime update happens, the version associated with a WebView2 Environment may have been removed and causing the object to no longer work. Creating a new WebView2 Environment works since it uses the latest version. + + + + WebView creation fails if a running instance using the same user data folder exists, and the Environment objects have different . For example, if a WebView was created with one , an attempt to create a WebView with a different using the same user data folder fails. + + + + WebView creation can fail with `E_UNEXPECTED` if runtime does not have permissions to the user data folder. + + + + + + Creates a new object. + + HTTP response content as stream. + The HTTP response status code. + The HTTP response reason phrase. + The raw response header string delimited by newline. + + It is also possible to create this object with empty headers string and then use the to construct the headers line by line. + + + + + + Asynchronously creates a new WebView for use with visual hosting. + + The HWND in which the app will connect the visual tree of the WebView. + + ParentWindow will be the HWND that the app will receive pointer/mouse input meant for the WebView (and will need to use or to forward). If the app moves the WebView visual tree to underneath a different window, then it needs to set to update the new parent HWND of the visual tree. + + Set property on the created to provide a visual to host the browser's visual tree. + + It is recommended that the application set Application User Model ID for the process or the application window. If none is set, during WebView creation a generated Application User Model ID is set to root window of ParentWindow. + + It can also accept a which is created by as the second parameter for multiple profiles support. + + CreateCoreWebView2CompositionController is supported in the following versions of Windows: + + + Windows 11 + + + Windows 10 + + + Windows Server 2019 + + + Windows Server 2016 + + + + + + + Creates an empty . + + + The returned needs to be populated with all of the relevant info before calling . + + + + + BrowserProcessExited is raised when the collection of WebView2 Runtime processes for the browser process of this terminate due to browser process failure or normal shutdown (for example, when all associated WebViews are closed), after all resources have been released (including the user data folder). + + + Multiple app processes can share a browser process by creating their webviews from a with the same user data folder. When the entire collection of WebView2Runtime processes for the browser process exit, all associated objects receive the BrowserProcessExited event. Multiple processes sharing the same browser process need to coordinate their use of the shared user data folder to avoid race conditions and unnecessary waits. For example, one process should not clear the user data folder at the same time that another process recovers from a crash by recreating its WebView controls; one process should not block waiting for the event if other app processes are using the same browser process (the browser process will not exit until those other processes have closed their webviews too). + + Note this is an event from , not . The difference between BrowserProcessExited and is that BrowserProcessExited is raised for any browser process exit (expected or unexpected, after all associated processes have exited too), while is raised for unexpected process exits of any kind (browser, render, GPU, and all other types), or for main frame render process unresponsiveness. To learn more about the WebView2 Process Model, go to [Process model](/microsoft-edge/webview2/concepts/process-model). + + In the case the browser process crashes, both BrowserProcessExited and events are raised, but the order is not guaranteed. These events are intended for different scenarios. It is up to the app to coordinate the handlers so they do not try to perform reliability recovery while also trying to move to a new WebView2 Runtime version or remove the user data folder. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SubscribeToBrowserProcessExited"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BrowserProcessExited"::: + + + + + Creates the used by the method. + + + + + Gets the user data folder that all CoreWebView2s created from this environment are using. + + + This could be either the value passed in by the developer when creating the environment object or the calculated one for default handling. And will always be an absolute path. + + + + + ProcessInfosChanged is raised when a collection of WebView2 Runtime processes changed due to new process being detected or when a existing process gone away. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ProcessInfosChanged"::: + + + + + Returns the list of all using same user data folder except for crashpad process. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetProcessInfos"::: + + + + + Create a custom object to insert into the WebView context menu. + + + CoreWebView2 will rewind the icon stream before decoding. + There is a limit of 1000 active custom context menu items at a given time per . Attempting to create more before deleting existing ones will fail with ERROR_NOT_ENOUGH_QUOTA. It is recommended to reuse custom ContextMenuItems across CoreWebView2ContextMenuRequested events for performance. The created object's property will default to true and property will default to false. A will be assigned that's unique across active custom context menu items, but command ID values of deleted custom ContextMenuItems can be reassigned. + + + + + Gets the failure report folder that all CoreWebView2s created from this environment are using. + + + + + Create a shared memory based buffer with the specified size in bytes. + + + The buffer can be shared with web contents in WebView by calling or . + Once shared, the same content of the buffer will be accessible from both the app process and script in WebView. + Modification to the content will be visible to all parties that have access to the buffer. + The shared buffer is presented to the script as ArrayBuffer. All JavaScript APIs that work for ArrayBuffer including Atomics APIs can be used on it. + There is currently a limitation that only size less than 2GB is supported. + + + + + Returns a snapshot collection of corresponding to all currently running processes associated with this excludes crashpad process. This provides the same list of as what's provided in , but additionally provides a list of associated which are actively running (showing or hiding UI elements) in the renderer process. See for more information. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetProcessExtendedInfos"::: + + + + + Creates a object from a path that represents a Web [FileSystemFileHandle](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle). + + The path pointed by the file. + This must be a syntactically correct fully qualified path, but it is not checked here whether it currently points to a file. If an invalid path is passed, an `InvalidArgumentException` will be thrown. Any other state validation will be done when this handle is accessed from web content and will cause the DOM exceptions described in [FileSystemFileHandle methods](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle#instance_methods) if access operations fail + + + This is used to specify whether the Handle should be created with a Read-only or Read-and-write web permission. + For the `permission` value specified here, the DOM [PermissionStatus](https://developer.mozilla.org/docs/Web/API/PermissionStatus) property will be `[granted](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)` and the unspecified permission will be `[prompt](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)`. Therefore, the web content then does not need to call [requestPermission](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) for the permission that was specified before attempting the permitted operation, but if it does, the promise will immediately be resolved with 'granted' PermissionStatus without firing the event or prompting the user for permission. Otherwise, `requestPermission` will behave as the status of permission is currently `prompt`, which means the `PermissionRequested` event will fire or the user will be prompted. + Note: An exception to this is, if there is a parent directory handle that has broader permissions in the same page context than specified in here, the handle will automatically inherit the most permissive permission of the parent handle when posted to that page context. i.e. If there is already a `FileSystemDirectoryHandle` to `C:\foo` that has write permission on a page, even though a to file `C:\example\file.txt` may be created with permission, when posted to that page, write permission will be automatically granted to the created handle. + Additionally, the app must have the same OS permissions that have propagated to the [WebView2 browser process](/microsoft-edge/webview2/concepts/process-model) for the path it wishes to give the web content to read/write the file. Specifically, the WebView2 browser process will run in same user, package identity, and app container of the app, but other means such as security context impersonations do not get propagated, so such permissions that the app has, will not be effective in WebView2. + + + + An app needs to be mindful that this object, when posted to the web content, provides it with unusual access to OS file system via the Web FileSystem API! The app should therefore only post objects for paths that it wants to allow access to the web content and it is not recommended that the web content "asks" for this path. The app should also check the source property of the target to ensure that it is sending to the web content of intended origin. Once the object is passed to web content, if the content is attempting a read, the file must be existing and available to read similar to a file chosen by [open file picker](https://developer.mozilla.org/docs/Web/API/Window/showOpenFilePicker), otherwise the read operation will [throw a DOM exception](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle/getFile#exceptions). For write operations, the file does not need to exist as `FileSystemFileHandle` will behave as a file path chosen by [save file picker](https://developer.mozilla.org/docs/Web/API/Window/showSaveFilePicker) and will create or overwrite the file, but the parent directory structure pointed by the file must exist and an existing file must be available to write and delete or the write operation will [throw a DOM exception](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle/createWritable#exceptions). + + + + + Creates a object from a path that represents a Web [FileSystemDirectoryHandle](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle). + + The path pointed by the directory. + + This must be a syntactically correct fully qualified path, but it is not checked here whether it currently points to a directory. Any other state validation will be done when this handle is accessed from web content and will cause DOM exceptions if access operations fail. If an invalid path is passed, an `InvalidArgumentException` will be thrown. + + + This is used to specify whether the Handle should be created with a Read-only or Read-and-write web permission. + For the permission value specified here, the Web [PermissionStatus](https://developer.mozilla.org/docs/Web/API/PermissionStatus) will be `[granted](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)` and the unspecified permission will be `[prompt](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)`. Therefore, the web content then does not need to call [requestPermission](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) for the permission that was specified before attempting the permitted operation, but if it does, the promise will immediately be resolved with 'granted' PermissionStatus without firing the WebView2 event or prompting the user for permission. Otherwise, `requestPermission` will behave as the status of permission is currently `Prompt`, which means the `PermissionRequested` event will fire or the user will be prompted. + Note: An exception to this is, if there is a parent directory handle that has broader permissions in the same page context than specified in here, the handle will automatically inherit the most permissive permission of the parent handle when posted to that page context. i.e. If there is already a `FileSystemDirectoryHandle` to `C:\foo` that has write permission on a page, even though a to directory `C:\example\directory` may be created with permission, when posted to that page, write permission will be automatically granted to the created handle. + Additionally, the app must have the same OS permissions that have propagated to the [WebView2 browser process](/microsoft-edge/webview2/concepts/process-model) for the path it wishes to give the web content to make any operations on the directory. Specifically, the WebView2 browser process will run in same user, package identity, and app container of the app, but other means such as security context impersonations do not get propagated, so such permissions that the app has, will not be effective in WebView2. + + + + An app needs to be mindful that this object, when posted to the web content, provides it with unusual access to OS file system via the Web FileSystem API! The app should therefore only post objects for paths that it wants to allow access to the web content and it is not recommended that the web content "asks" for this path. The app should also check the source property of the target to ensure that it is sending to the web content of intended origin. Once the object is passed to web content, the path must point to a directory as if it was chosen via [directory picker](https://developer.mozilla.org/docs/Web/API/Window/showDirectoryPicker) otherwise any IO operation done on the `FileSystemDirectoryHandle` will throw a DOM exception. + + + + + Options used to create WebView2 Environment. + + + Default values will use your defaulted Edge WebView2 Runtime binaries and + user data folder. + + + + + + + + + + + + + Initializes a new instance of the CoreWebView2EnvironmentOptions class. + + + AdditionalBrowserArguments can be specified to change the behavior of + the WebView. + + + The default language that WebView will run with. + + + The version of the Edge WebView2 Runtime binaries required to be + compatible with the calling application. + + + Set to true if single sign on be enabled using the end user's OS primary + account. Defaults to false. + + + List of custom scheme registrations to be applied to the . + + + + + Initializes a new instance of the CoreWebView2EnvironmentOptions class. + + + AdditionalBrowserArguments can be specified to change the behavior of + the WebView. + + + The default language that WebView will run with. + + + The version of the Edge WebView2 Runtime binaries required to be + compatible with the calling application. + + + Set to true if single sign on be enabled using the end user's OS primary + account. Defaults to false. + + + List of custom scheme registrations to be applied to the . + + + Set to CoreWebView2ChannelSearchKind.LeastStable so that environment + creation searches for binaries from least to most stable: + Canary -> Dev -> Beta -> WebView2 Runtime. + Defaults to CoreWebView2RuntimeChannel.MostStable. + + + The release channels that are searched for during environment creation. + + + + + List of custom scheme registrations to be applied to the + + + + + Gets or sets the additional browser arguments to change the behavior of the WebView. + + + + The arguments are passed to the browser process as part of the command. For more information about using command-line switches with Chromium browser processes, navigate to [Run Chromium with Flags](https://aka.ms/RunChromiumWithFlags). The value appended to a switch is appended to the browser process, for example, in --edge-webview-switches=xxx the value is xxx. If you specify a switch that is important to WebView functionality, it is ignored, for example, --user-data-dir. Specific features are disabled internally and blocked from being enabled. If a switch is specified multiple times, only the last instance is used. + + + + A merge of the different values of the same switch is not attempted, except for disabled and enabled features. The features specified by --enable-features and --disable-features will be merged with simple logic: + + + + The features are the union of the specified features and built-in features. If a feature is disabled, it is removed from the enabled features list. + + + + + If you specify command-line switches and sets this property, the --edge-webview-switches value takes precedence and is processed last. If a switch fails to parse, the switch is ignored. The default state for the operation is to run the browser process with no extra flags. + + + Please note that calling this API twice will replace the previous value rather than appending to it. If there are multiple switches, there should be a space in between them. The one exception is if multiple features are being enabled/disabled for a single switch, in which case the features should be comma-separated. Ex. "--disable-features=feature1,feature2 --some-other-switch --do-something" + + + + + + Gets or sets the default display language for WebView. + + + It applies to browser UIs such as context menu and dialogs. It also applies to the accept-languages HTTP header that WebView sends to websites. The intended locale value is in the format of BCP 47 Language Tags. More information can be found from [IETF BCP47](https://www.ietf.org/rfc/bcp/bcp47.html). + + + + + Gets or sets the version of the WebView2 Runtime binaries required to be compatible with your app. + + + This defaults to the WebView2 Runtime version that corresponds with the version of the SDK the app is using. The format of this value is the same as the format of the property and other BrowserVersion values. Only the version part of the BrowserVersion value is respected. The channel suffix, if it exists, is ignored. The version of the WebView2 Runtime binaries actually used may be different from the specified TargetCompatibleBrowserVersion. The binaries are only guaranteed to be compatible. Verify the actual version on the property. + + + + + Determines whether to enable single sign on with Azure Active Directory (AAD) resources inside WebView using the logged in Windows account and single sign on (SSO) with web sites using Microsoft account associated with the login in Windows account. + + + The default value is false. Universal Windows Platform apps must also declare enterpriseCloudSSO [restricted capability](/windows/uwp/packaging/app-capability-declarations#restricted-capabilities) for the single sign on (SSO) to work. + + + + + Determines whether other processes can create from created with the same user data folder and therefore sharing the same WebView browser process instance. + + + The default value is false. + + + + + When IsCustomCrashReportingEnabled is set to true, Windows won't send crash data to Microsoft endpoint. + + + The default value is false. In this case, WebView will respect OS consent. + + + + + The EnableTrackingPrevention property is used to enable/disable tracking prevention feature in WebView2. This property enable/disable tracking prevention for all the WebView2's created in the same environment. By default this feature is enabled to block potentially harmful trackers and trackers from sites that aren't visited before and set to or whatever value was last changed/persisted on the profile. + + + You can set this property to false to disable the tracking prevention feature if the app only renders content in the WebView2 that is known to be safe. Disabling this feature when creating environment also improves runtime performance by skipping related code. + + You shouldn't disable this property if WebView2 is being used as a "full browser" with arbitrary navigation and should protect end user privacy. + + There is property to control levels of tracking prevention of the WebView2's associated with a same profile. However, you can also disable tracking prevention later using property and value but that doesn't improves runtime performance. + + See for more details. + + Tracking prevention protects users from online tracking by restricting the ability of trackers to access browser-based storage as well as the network. See [Tracking prevention](/microsoft-edge/web-platform/tracking-prevention). + + + + + Enable/disable browser extensions. + + + When AreBrowserExtensionsEnabled is set to true, new extensions can be added to user profile and used. AreBrowserExtensionsEnabled is default to be false, in this case, new extensions can't be installed, and already installed extension won't be available to use in user profile. If connecting to an already running environment with a different value for AreBrowserExtensionsEnabled property, it will fail with HRESULT_FROM_WIN32(ERROR_INVALID_STATE). See for Extensions API details. + + + + + Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable so that the WebView2 loader searches for binaries from least to most stable: Canary -> Dev -> Beta -> WebView2 Runtime. + + + The ChannelSearchKind property is CoreWebView2ChannelSearchKind.MostStable by default and environment creation searches for a release channel on the machine from most to least stable using the first channel found. The default search order is: WebView2 Release -> Beta -> Dev -> Canary. Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable to reverse the search order so that environment creation searches for a channel from least to most stable. If a ReleaseChannels has been provided, environment creation will only search for channels in the set. See for more details on channels. This property can be overridden by the corresponding registry key ChannelSearchKind or the environment variable WEBVIEW2_CHANNEL_SEARCH_KIND. Set the value to 1 to reverse the search order. See for more details on overrides. + + + + + Sets the ReleaseChannels, which is a mask of one or more CoreWebView2ReleaseChannels indicating which channels environment creation should search for. + + + OR operation(s) can be applied to multiple CoreWebView2ReleaseChannels to create a mask. The default value is a mask of all the channels. By default, environment creation searches for channels from most to least stable, using the first channel found on the device. When ReleaseChannels is provided, environment creation will only search for the channels specified in the set. Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable to reverse the search order so that environment creation searches for the least stable build first. See for descriptions of each channel. Environment creation fails if it is unable to find any channel from the ReleaseChannels installed on the device. Use to verify which channel is used. If both a BrowserExecutableFolder and ReleaseChannels are provided, the BrowserExecutableFolder takes precedence. The ReleaseChannels can be overridden by the corresponding registry override ReleaseChannels or the environment variable WEBVIEW2_RELEASE_CHANNELS. Set the value to a comma-separated string of integers, which map to the following release channel values: Stable (0), Beta (1), Dev (2), and Canary (3). For example, the values "0,2" and "2,0" indicate that environment creation should only search for Dev channel and the WebView2 Runtime, using the order indicated by . Environment creation attempts to interpret each integer and treats any invalid entry as Stable channel. + + + + ReleaseChannels + Channel Search Kind: Most Stable (default) + Channel Search Kind: Least Stable + + + CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta + Beta -> WebView2 Runtime + + + CoreWebView2ReleaseChannels.Canary | CoreWebView2ReleaseChannels.Dev | CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta -> Dev -> Canary + Canary -> Dev -> Beta -> WebView2 Runtime + + + CoreWebView2ReleaseChannels.Canary + Canary + Canary + + + CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Canary | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta -> Canary + Canary -> Beta -> WebView2 Runtime + + + + + + + Set ScrollBar style to be used. + + + The default is CoreWebView2ScrollbarStyle.Default which specifies the default browser ScrollBar style. CSS styles that modify the ScrollBar applied on top of native ScrollBar styling that is selected with CoreWebView2ScrollbarStyle. + + + + + CoreWebView2Frame provides direct access to the iframes information and handling. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + + + Adds the provided host object to script running in the WebViewFrame with the specified name for the list of the specified origins. + The host object will be accessible for this iframe only if the iframe's origin during + access matches one of the origins which are passed. The provided origins + will be normalized before comparing to the origin of the document. + So the scheme name is made lower case, the host will be punycode decoded + as appropriate, default port values will be removed, and so on. + This means the origin's host may be punycode encoded or not and will match + regardless. If list contains malformed origin the call will fail. + The method can be called multiple times in a row without calling + RemoveHostObjectFromScript for the same object name. It will replace + the previous object with the new object and new list of origins. + List of origins will be treated as following: + 1. empty list - call will succeed and object will be added for the iframe + but it will not be exposed to any origin; + 2. list with origins - during access to host object from iframe the + origin will be checked that it belongs to this list; + 3. list with "*" element - host object will be available for iframe for + all origins. We suggest not to use this feature without understanding + security implications of giving access to host object from from iframes + with unknown origins. + 4. list with "file://" element - host object will be available for iframes + loaded via file protocol. + + + The name of the host object. + + + The host object to be added to script. + + + The list of the iframe origins for which host object will be accessible. + + + + + + The value of iframe's window.name property. The default value equals to iframe html tag declaring it. + + + + + NameChanged is raised when the iframe changes its window.name property. + + + + + + Destroyed event is raised when the iframe corresponding to this object is removed or the document containing that iframe is destroyed. + + + + + + Remove the host object specified by the name so that it is no longer accessible from JavaScript code in the iframe. + + + While new access attempts are denied, if the object is already obtained by JavaScript code in the iframe, the JavaScript code continues to have access to that object. Calling this method for a name that is already removed or was never added fails. If the iframe is destroyed this method will return fail also. + + + + + Check whether a frame is destroyed. Returns true during the event. + + + + + NavigationStarting is raised when the current frame is requesting permission to navigate to a different URI. + + + A frame navigation will raise a event and a event. All of the event handlers will be run before the event handlers. All of the event handlers share a common object. Whichever event handler is last to change the property will decide if the frame navigation will be cancelled. + Redirects raise this event as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + + + ContentLoading is raised before any content is loaded, including scripts added with . ContentLoading is not raised if a same page navigation occurs. + + + This operation follows the event and precedes the and events. + + + + + NavigationCompleted is raised when the current frame has completely loaded (body.onload has been raised) or loading stopped with error. + + + + + DOMContentLoaded is raised when the initial HTML document has been parsed. + + + This aligns with the the document's DOMContentLoaded event in HTML. + + + + + WebMessageReceived is raised when the setting is set and the iframe runs window.chrome.webview.postMessage. + + + The postMessage function is void postMessage(object) where object is any object supported by JSON conversion. + When postMessage is called, the handler's Invoke method will be called with the object parameter postMessage converted to a JSON string. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebMessageReceivedIFrame"::: + + + + + Runs JavaScript code from the javaScript parameter in the current frame. + + The JavaScript code to be run in the current frame. + A JSON encoded string that represents the result of running the provided JavaScript. + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. This method is applied asynchronously. + If the method is run before , the script will not be executed and the JSON null will be returned. + This operation works even if is set to false. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScriptFrame"::: + + + + + Posts the specified webMessageAsJson to the current frame. + + The web message to be posted to the iframe. + + The event args is an instance of MessageEvent. The setting must be true or the message will not be sent. The event arg's data property of the event arg is the webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. The event arg's source property of the event arg is a reference to the window.chrome.webview object. For information about sending messages from the iframe to the host, navigate to . The message is sent asynchronously. If a navigation occurs before the message is posted to the iframe, the message is not be sent. + + + Runs the message event of the window.chrome.webview of the iframe. JavaScript in that document may subscribe and unsubscribe to the event using the following code: + + window.chrome.webview.addEventListener('message', handler) + window.chrome.webview.removeEventListener('message', handler) + + + + + + + + + Posts a message that is a simple string rather than a JSON string representation of a JavaScript object. + + The web message to be posted to the iframe. + + This behaves in exactly the same manner as , but the data property of the event arg of the window.chrome.webview message is a string with the same value as webMessageAsString. Use this instead of if you want to communicate using simple strings rather than JSON objects. + + + + + + + PermissionRequested is raised when content in an iframe or any of its descendant iframes requests permission to access some privileged resources. + + + This relates to the PermissionRequested event on the CoreWebView2. + Both these events will be raised in the case of an iframe requesting permission. The CoreWebView2Frame's event handlers will be invoked before the event handlers on the CoreWebView2. If the Handled property of the PermissionRequestedEventArgs is set to TRUE within the CoreWebView2Frame event handler, then the event will not be raised on the CoreWebView2, and it's event handlers will not be invoked. + In the case of nested iframes, the PermissionRequested event will be raised from the top level iframe. + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + Share a shared buffer object with script of the iframe in the WebView. + + The object to be shared with script. + The desired given to script. + Additional data to be send to script. If it is not null or empty string, and it is not a valid JSON string, will be thrown. + + The script will receive a sharedbufferreceived event from chrome.webview. + The event arg for that event will have the following methods and properties. + + + + Property + Description + + + getBuffer() + A method that returns an ArrayBuffer object with the backing content from the shared buffer. + + + additionalData + An object as the result of parsing additionalDataAsJson as JSON string. This property will be undefined if additionalDataAsJson is nullptr or empty string. + + + source + With a value set as chrome.webview object. + + + + If access is , the script will only have read access to the buffer. + If the script tries to modify the content in a read only buffer, it will cause an access violation in WebView renderer process and crash the renderer process. + + If the shared buffer is already closed, the API throws with error code of RO_E_CLOSED. + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access to the shared buffer any more. + + The application can post the same shared buffer object to multiple web pages or iframes, or post to the same web page or iframe multiple times. + Each PostSharedBufferToScript will create a separate ArrayBuffer object with its own view of the memory and is separately released. + The underlying shared memory will be released when all the views are released. + + Sharing a buffer to script has security risk. You should only share buffer with trusted site. + If a buffer is shared to a untrusted site, possible sensitive information could be leaked. + If a buffer is shared as modifiable by the script and the script modifies it in an unexpected way, it could result in corrupted data that might even crash the application. + + The example code shows how to send data to script for one time read only consumption. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="OneTimeShareBuffer"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_2"::: + + + + + The unique identifier of the current frame. It's the same kind of ID as with the and . + + + + + ScreenCaptureStarting event is raised when the [Screen Capture API](https://www.w3.org/TR/screen-capture/) is requested by the user using getDisplayMedia(). + + + This relates to the ScreenCaptureStarting event on the CoreWebView2. + Both these events will be raised in the case of an iframe requesting screen capture. The CoreWebView2Frame's event handlers will be invoked before the event handlers on the CoreWebView2. If the Handled property of the ScreenCaptureStartingEventArgs is set to TRUE within the CoreWebView2Frame event handler, then the event will not be raised on the CoreWebView2, and it's event handlers will not be invoked. + In the case of nested iframes, the ScreenCaptureStarting event will be raised from the top level iframe. + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + + Iterator for a collection of HTTP headers. + + + + + + + + + + No COM support; throws instead. + + + No COM support. + + + + + + + + Gets the header in the + or collection at the + current position of the enumerator. + + + + + + true when the iterator has not run out of headers. + + + If the collection over which the iterator is iterating is empty or if the iterator has gone past the end of the collection then this is false. + + + + + HTTP request headers. + + + Used to inspect the HTTP request on event and event. It is possible to modify the HTTP request headers from a event, but not from a event. + + + + + + + + + + + + + Returns an enumerator that iterates through the or collection. + + + + + Gets the header value matching the name. + + The header value matching the name. + + + + Gets the header value matching the name using a . + + The header value matching the name. + + + + Checks whether the headers contain an entry that matches the header name. + + Whether the headers contain an entry that matches the header name. + + + + Adds or updates header that matches the name. + + + + + Removes header that matches the name. + + + + + Gets a over the collection of request headers. + + + + + HTTP response headers. + + + Used to construct a for the event. + + + + + + + + + + + Returns an enumerator that iterates through the or collection. + + + + + Appends header line with name and value. + + The header name to be appended. + The header value to be appended. + + + + Checks whether this CoreWebView2HttpResponseHeaders contain entries matching the header name. + + The name of the header to seek. + + + + Gets the first header value in the collection matching the name. + + The header name. + The first header value in the collection matching the name. + + + + Gets the header values matching the name. + + The header name. + + + + Gets a over the collection of entire . + + + + + Event args for the CoreWebView2InitializationCompleted event. + + + + + Initializes a new instance of the CoreWebView2InitializationCompletedEventArgs class. + + + Exception that occurred during initialization, or null if initialization was successful. + + + + + True if the init task completed successfully. + + + + + The exception thrown from the init task. If the task completed successfully, this property is null. + + + + + An object that represents a [HTML Notification object](https://developer.mozilla.org/docs/Web/API/Notification). + + + + + Specifies the time at which a notification is created or applicable + (past, present, or future). + + + + + Gets the vibration pattern for devices with vibration hardware to emit. + + + The vibration pattern can be represented by an array of 64-bit + unsigned integers describing a pattern of vibrations and pauses. See + [Vibration API](https://developer.mozilla.org/docs/Web/API/Vibration_API) for + more information. This corresponds to + [Notification.vibrate](https://developer.mozilla.org/docs/Web/API/Notification/vibrate) + DOM API. An empty list is returned if no vibration patterns are + specified. + + + + + A string representing the body text of the notification. + + + The default value is an empty string. + + + + + The text direction in which to display the notification. + + + This corresponds to [Notification.dir](https://developer.mozilla.org/docs/Web/API/Notification/dir) DOM API. The default value is . + + + + + The notification's language, as intended to be specified using a string representing a language tag (such as en-US) according to [BCP47](https://datatracker.ietf.org/doc/html/rfc5646). + + + Note that no validation is performed on this property and it can be any string the notification sender specifies. This corresponds to [Notification.lang](https://developer.mozilla.org/docs/Web/API/Notification/lang) DOM API. The default value is an empty string. + + + + + A string representing an identifying tag for the notification. + + + This corresponds to [Notification.tag](https://developer.mozilla.org/docs/Web/API/Notification/tag) DOM API. The default value is an empty string. + + + + + A string containing the URI of an icon to be displayed in the notification. + + + The default value is an empty string. + + + + + The title of the notification. + + + + + A string containing the URI of the image used to represent the notification when there isn't enough space to display the notification itself. + + + The default value is an empty string. + + + + + A string containing the URI of an image to be displayed in the notification. + + + The default value is an empty string. + + + + + Indicates whether the user should be notified after a new notification replaces an old one. + + + This corresponds to [Notification.renotify](https://developer.mozilla.org/docs/Web/API/Notification/renotify) DOM API. The default value is false. + + + + + A boolean value indicating that a notification should remain active until the user clicks or dismisses it, rather than closing automatically. + + + This corresponds to [Notification.requireInteraction](https://developer.mozilla.org/docs/Web/API/Notification/requireInteraction) DOM API. Note that you may not be able to necessarily implement this due to native API limitations. The default value is false. + + + + + Indicates whether the notification should be silent -- i.e., no sounds or vibrations should be issued, regardless of the device settings. + + + This corresponds to [Notification.silent](https://developer.mozilla.org/docs/Web/API/Notification/silent) DOM API. The default value is false. + + + + + This event is raised when the notification is closed by the web code, such as through notification.close(). + + + You don't need to call since this is coming from the web code. + + + + + The host may run this to report the notification has been displayed and it will cause the [show](https://developer.mozilla.org/docs/Web/API/Notification/show_event) event to be raised for non-persistent notifications. + + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false when this is called. + + + + + The host may run this to report the notification has been clicked, and it will cause the [click](https://developer.mozilla.org/docs/Web/API/Notification/click_event) event to be raised for non-persistent notifications. + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false or has not been run when this is called. + + + + The host may run this to report the notification was dismissed, and it will cause the [close](https://developer.mozilla.org/docs/Web/API/Notification/close_event) event to be raised for non-persistent notifications. + + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false or has not been run when this is called. + + + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + + + Clear the browsing data for the specified dataKinds between the + startTime and endTime. Overload the ClearBrowsingDataAsync method to + allow for additional time parameters. + + + + + Clear the entirety of the browsing data associated with the profile + it is called on. It clears the data regardless of timestamp. + + + + + The name of the profile. + + + + + InPrivate mode is enabled or not. + + + + + Full path of the profile directory. + + + + + The default download folder path. + + + The default value is the system default download folder path for the user. The default download folder path is persisted in the user data folder across sessions. The value should be an absolute path to a folder that the user and application can write to. Throws an exception if the value is invalid, and the default download path is not changed. Otherwise the path is changed immediately. If the directory does not yet exist, it is created at the time of the next download. If the host application does not have permission to create the directory, then the user is prompted to provide a new path through the Save As dialog. The user can override the default download folder path for a given download by choosing a different path in the Save As dialog. + + + + + The PreferredColorScheme property sets the overall color scheme of the WebView2s associated with this profile. + + + This sets the color scheme for WebView2 UI like dialogs, prompts, and menus by setting the media feature prefers-color-scheme. + The default value for this is , which will follow whatever color scheme the OS is currently set to. + + + + + Clear the browsing data of the associated profile. + + + Clears browsing data on the profile the method is called on. Additional optional parameters include the start time and end time to clear the browsing data between as well as the data specific data kinds to clear on the profile. The method may be overloaded to take: + + + No parameters - in which the entirety of the data on the profile will be cleared. + + + The data kind(s) - in which the data kind(s) will be cleared for their entirety. + + + The data kind(s), start time, and end time - in which the data kind(s) will be cleared between the start and end time. The start time will be offset by -1.0 and the end time will be offset by +1.0 to include the last fractional second on each respective end. The start time is inclusive in the time period while the end time is exclusive. + + + + The exposed methods are as follows: + + ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds dataKinds); + ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds dataKinds, DateTime startTime, DateTime endTime); + ClearBrowsingDataAsync(); + + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClearBrowsingData"::: + + + + + The PreferredTrackingPreventionLevel property allows you to control levels of tracking prevention for WebView2 which are associated with a profile. This level would apply to the context of the profile. That is, all WebView2s sharing the same profile will be affected and also the value is persisted in the user data folder. + + + See for descriptions of levels. + + If tracking prevention feature is enabled when creating the WebView2 environment, you can also disable tracking prevention later using this property and value but that doesn't improves runtime performance. + + There is property to enable/disable tracking prevention feature for all the WebView2's created in the same environment. If enabled, PreferredTrackingPreventionLevel is set to by default for all the WebView2's and profiles created in the same environment or is set to the level whatever value was last changed/persisted to the profile. If disabled PreferredTrackingPreventionLevel is not respected by WebView2. If PreferredTrackingPreventionLevel is set when the feature is disabled, the property value get changed and persisted but it will takes effect only if is true. + + See for more details. + + + + + Sets permission state for the given permission kind and origin asynchronously. + + + The state change persists across sessions until it is changed by another call to SetPermissionState, or by setting the State property in PermissionRequestedEventArgs. Setting the state to will erase any state saved in the profile and restore the default behavior. The origin should have a valid scheme and host (e.g. "https://www.example.com"), otherwise the method fails. Additional URI parts like path and fragment are ignored. For example, "https://wwww.example.com/app1/index.html/" is treated the same as "https://wwww.example.com". See the [MDN origin definition](https://developer.mozilla.org/docs/Glossary/Origin) for more details. + + + + + Invokes the handler with a collection of all nondefault permission settings. + + + Use this method to get the permission state set in the current and previous sessions. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetNonDefaultPermissionSettings"::: + + + + + Get the which Creates, adds or updates, gets, or or view the cookies for the current profile. + + + All CoreWebView2s associated with this profile share the same cookie values. Changes to cookies in this cookie manager apply to all CoreWebView2s associated with this profile. + + + + + + Determines whether password information will be autosaved. + + + When disabled, no new password data is saved and no Save/Update Password prompts are displayed. However, if there was password data already saved before disabling this setting, then that password information is auto-populated, suggestions are shown and clicking on one will populate the fields. + When enabled, password information is auto-populated, suggestions are shown and clicking on one will populate the fields, new data is saved, and a Save/Update Password prompt is displayed. The default value is false. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + + + Determines whether general form information will be saved and autofilled. + + + General autofill information includes information like names, street and email addresses, phone numbers, and arbitrary input. This excludes password information. When disabled, no suggestions appear, and no new information is saved. + When enabled, information is saved, suggestions appear, and clicking on one will populate the form fields. The default value is true. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + + + Add a browser extension to the current user profile from extensionFolderPath. + + The manifest.json folder path. + + See for descriptions of browser extensions. + + Adds the [browser extension](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions) using the extension path for unpacked extensions from the local device. Extension is running right after installation. + The extension folder path is the topmost folder of an unpacked browser extension and contains the browser extension manifest file. + If the extensionFolderPath is an invalid path or doesn't contain the extension manifest.json file, this function will return ERROR_FILE_NOT_FOUND to callers. + Installed extension will default to true. When is false, AddBrowserExtension will fail and return HRESULT ERROR_NOT_SUPPORTED. + During installation, the content of the extension is not copied to the user data folder. Once the extension is installed, changing the content of the extension will cause the extension to be removed from the installed profile. + When an extension is added the extension is persisted in the corresponding profile. The extension will still be installed the next time you use this profile. + When an extension is installed from a folder path, adding the same extension from the same folder path means reinstalleing this extension. When two extensions with the same Id are installed, only the later installed extension will be kept. + The following summarizes the possible error values that can be returned from AddBrowserExtension and a description of why these errors occur. + + + + Error value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + Extensions are disabled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Cannot find manifest.json file or it is not a valid extension manifest. + + + E_ACCESSDENIED + Cannot load extension with file or directory name starting with _, reserved for use by the system. + + + E_FAIL + Extension failed to install with other unknown reasons. + + + + + + + + Gets a snapshot of the set of extensions on current user profile. + + + See for descriptions of browser extensions. + + Gets a snapshot of the set of extensions installed at the time GetBrowserExtensions is called. If an extension is installed or uninstalled after GetBrowserExtensions completes, the list returned by GetBrowserExtensions remains the same. When AreBrowserExtensionsEnabled is false, GetBrowserExtensions won't return any extensions on current user profile. + + + + + Raised when profile is marked for deletion. + + + When this event is raised, the CoreWebView2Profile and its corresponding CoreWebView2s have been closed, and cannot be used anymore. + + + + + Delete this profile and close the corresponding s. + + + After the API is called, the profile will be marked for deletion. The local profile's directory will be deleted at browser process exit. If it fails to delete, because something else is holding the files open, WebView2 will try to delete the profile at all future browser process starts until successful. The corresponding CoreWebView2s will be closed and the event will be raised. See for more information. If you try to create a new profile with the same name as an existing profile that has been marked as deleted but hasn't yet been deleted, profile creation will fail with HRESULT_FROM_WIN32(ERROR_DELETE_PENDING). + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the URI of the document that sent this web message. + + + + + Gets the message posted from the WebView content to the host converted to a JSON string. + + + Run this operation to communicate using JavaScript objects. + + + For example, the following postMessage runs result in the following WebMessageAsJson values: + + + postMessage({'a': 'b'}) "{\"a\": \"b\"}" + postMessage(1.2) "1.2" + postMessage('example') "\"example\"" + + + + + + Gets the message posted from the WebView content to the host as a string. + + The message posted from the WebView content to the host. + The message posted is some other kind of JavaScript type. + + Run this operation to communicate using simple strings. + + + For example the following postMessage runs result in the following values returned by TryWebMessageAsString: + + + postMessage({'a': 'b'}) ArgumentException + postMessage(1.2) ArgumentException + postMessage('example') "example" + + + + + + Additional received WebMessage objects. + + + To pass AdditionalObjects via WebMessage to the app, use the chrome.webview.postMessageWithAdditionalObjects content API. Any DOM object type that can be natively representable that has been passed in to additionalObjects parameter will be accessible here. Currently a WebMessage object can be the type. + Entries in the collection can be nullptr if null or undefined was passed. Cast the object to the native type to access its specific properties. + + object additionalObject = eventArgs.AdditionalObjects[0]; + if (additionalObject is CoreWebView2File) + { + CoreWebView2File file = additionalObject as CoreWebView2File; + } else if ... + + + + + + This is used to complete deferrals on event args that support getting deferrals using the GetDeferral method. This class implements . + + + + + + + + + Protected implementation of Dispose pattern. + + + + + Completes the associated deferred event. + + + Complete should only be run once for each deferral taken. + + + + + This class is deprecated; use CoreWebView2PrivateHostObjectHelper instead. + + + + + A shared memory based buffer object that is created by . The object is presented to script as ArrayBuffer when posted to script with . + + + + + + + + Protected implementation of Dispose pattern. + + + + + The file mapping handle of the shared memory of the buffer. + + + Normal app should use to + get a stream object to access the buffer. + For advanced scenarios, you could use native file mapping APIs to obtain + other views or duplicate this handle to another application process and + create a view from the duplicated handle in that process to access the buffer + from that separate process. + + + + + The size of the shared buffer in bytes. + + + + + The raw memory address of the buffer. + + + You can cast it to pointer to real data types like byte* to access the memory from unsafe code region. + Normal app should use to get a stream object to access the buffer. + + + + + Get an stream object that can be used to access the shared buffer. + + + + + Release the backing shared memory. + + + The application should call Close or when no access to the buffer is needed any more, to ensure that the underlying resources are released timely even if the shared buffer object itself is not released due to some leaked reference. + After the shared buffer is closed, the buffer address and file mapping handle previously obtained becomes invalid and cannot be used anymore. + Properties of the object will also be unaccessible. Operations like Read or Write on the stream objects returned from will also fail. + will also fail. The failures will be represented as with error code of RO_E_CLOSED. + + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access the shared buffer any more. + When script tries to access the buffer after calling chrome.webview.releaseBuffer, JavaScript TypeError exception will be raised complaining about accessing a detached ArrayBuffer, the same exception when trying to access a transferred ArrayBuffer. + + Closing the buffer object on native side doesn't impact access from Script and releasing the buffer from script doesn't impact access to the buffer from native side. The underlying shared memory will be released by the OS when both native and script side release the buffer. + + + + + Constructor + + + + + Read at most bufferSize bytes into buffer and return the effective + number of bytes read in bytesReadPtr (unless null). + + + mscorlib disassembly shows the following MarshalAs parameters + void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pv, int cb, IntPtr pcbRead); + This means marshaling code will have found the size of the array buffer in the parameter bufferSize. + + + Critical: calls Marshal.WriteInt32 which LinkDemands, takes pointers as input + + + + + Move the stream pointer to the specified position. + + + System.IO.stream supports searching past the end of the stream, like + OLE streams. + newPositionPtr is not an out parameter because the method is required + to accept NULL pointers. + + + Critical: calls Marshal.WriteInt64 which LinkDemands, takes pointers as input + + + + + Sets stream's size. + + + + + Obtain stream stats. + + + STATSG has to be qualified because it is defined both in System.Runtime.InteropServices and + System.Runtime.InteropServices.ComTypes. + The STATSTG structure is shared by streams, storages and byte arrays. Members irrelevant to streams + or not available from System.IO.Stream are not returned, which leaves only cbSize and grfMode as + meaningful and available pieces of information. + grfStatFlag is used to indicate whether the stream name should be returned and is ignored because + this information is unavailable. + + + + + Write at most bufferSize bytes from buffer. + + + Critical: calls Marshal.WriteInt32 which LinkDemands, takes pointers as input + + + + + Create a clone. + + + Not implemented. + + + + + Read at most bufferSize bytes from the receiver and write them to targetStream. + + + Not implemented. + + + + + Commit changes. + + + Only relevant to transacted streams. + + + + + Lock at most byteCount bytes starting at offset. + + + Not supported by System.IO.Stream. + + + + + Undo writes performed since last Commit. + + + Relevant only to transacted streams. + + + + + Unlock the specified region. + + + Not supported by System.IO.Stream. + + + + + The exception that is thrown when an WebView2 Runtime installation is missing. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a specified error message. + + + The error message that explains the reason for the exception. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a reference to the inner exception that is the cause of this exception. + + + The exception that is the cause of the current exception. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a specified error message and a reference to the inner exception that is the cause of this exception. + + + The error message that explains the reason for the exception. + + + The exception that is the cause of the current exception. + + + + + + + + + + + + + + + + + Specifies the source of . + + + + + + + + Indicates that web resource is requested from main page including dedicated workers, iframes and main script for shared workers. + + + + + Indicates that web resource is requested from shared worker. + + + + + Indicates that web resource is requested from service worker. + + + + + Indicates that web resource is requested from any supported source. + + + + + Specifies the web resource request contexts. + + + + + Specifies all resources. + + + + + Specifies a document resources. + + + + + Specifies a CSS resources. + + + + + Specifies an image resources. + + + + + Specifies another media resource such as a video. + + + + + Specifies a font resource. + + + + + Specifies a script resource. + + + + + Specifies an XML HTTP request, Fetch and EventSource HTTP communication. + + + + + Specifies a Fetch API communication. + + + Note that this isn't working. Fetch API requests are fired as a part + of COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST. + + + + Specifies a TextTrack resource. + + + + + Specifies an EventSource API communication. + + + Note that this isn't working. EventSource API requests are fired as a part + of COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST. + + + + Specifies a WebSocket API communication. + + + + + Specifies a Web App Manifest. + + + + + Specifies a Signed HTTP Exchange. + + + + + Specifies a Ping request. + + + + + Specifies a CSP Violation Report. + + + + + Specifies an other resource. + + + + + Indicates the error status values for web navigations. + + + + + Indicates that an unknown error occurred. + + + + + Indicates that the SSL certificate common name does not match the web address. + + + + + Indicates that the SSL certificate has expired. + + + + + Indicates that the SSL client certificate contains errors. + + + + + Indicates that the SSL certificate has been revoked. + + + + + Indicates that the SSL certificate is not valid. The certificate may not match the public key pins for the host name, the certificate is signed by an untrusted authority or using a weak sign algorithm, the certificate claimed DNS names violate name constraints, the certificate contains a weak key, the validity period of the certificate is too long, lack of revocation information or revocation mechanism, non-unique host name, lack of certificate transparency information, or the certificate is chained to a [legacy Symantec root](https://security.googleblog.com/2018/03/distrust-of-symantec-pki-immediate.html). + + + + + Indicates that the host is unreachable. + + + + + Indicates that the connection has timed out. + + + + + Indicates that the server returned an invalid or unrecognized response. + + + + + Indicates that the connection was stopped. + + + + + Indicates that the connection was reset. + + + + + Indicates that the Internet connection has been lost. + + + + + Indicates that a connection to the destination was not established. + + + + + Indicates that the provided host name was not able to be resolved. + + + + + Indicates that the operation was canceled. This status code is also used when the app cancels a navigation via event, and for original navigation if the app navigates the WebView2 in a rapid succession away after the load for original navigation commenced, but before it completed. + + + + + Indicates that the request redirect failed. + + + + + An unexpected error occurred. + + + + + Indicates that user is prompted with a login, waiting on user action. Initial navigation to a login site will always return this even if app provides credential using . HTTP response status code in this case is 401. See [status code reference](https://developer.mozilla.org/docs/Web/HTTP/Status). + + + + + Indicates that user lacks proper authentication credentials for a proxy server. HTTP response status code in this case is 407. See [status code reference](https://developer.mozilla.org/docs/Web/HTTP/Status). + + + + + Tracking prevention levels. + + + + + Tracking prevention is turned off. + + + + + The least restrictive level of tracking prevention. Set to this level to protect against malicious trackers but allows most other trackers and personalize content and ads. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + The default level of tracking prevention. Set to this level to protect against social media tracking on top of malicious trackers. Content and ads will likely be less personalized. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + The most restrictive level of tracking prevention. Set to this level to protect against malicious trackers and most trackers across sites. Content and ads will likely have minimal personalization. This level blocks the most trackers but could cause some websites to not behave as expected. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + Indicates the text direction of the notification. + + + + + Indicates that the notification text direction adopts the browser's language setting behavior. + + + + + Indicates that the notification text is left-to-right. + + + + + Indicates that the notification text is right-to-left. + + + + + Specifies the desired access from script to . + + + + + Script from web page only has read access to the shared buffer. + + + + + Script from web page has read and write access to the shared buffer. + + + + + Specifies the action type when server certificate error is detected to be used in the . + + + + + Indicates to ignore the warning and continue the request with the TLS certificate. This decision is cached for the RequestUri's host and the server certificate in the session. + + + + + Indicates to reject the certificate and cancel the request. + + + + + Indicates to display the default TLS interstitial error page to user for page navigations. For others TLS certificate is rejected and the request is cancelled. + + + + + The ScrollBar style being set during environment creation. + + + + + Browser default ScrollBar style + + + + + Window style fluent overlay scroll bar. Please see [Fluent UI](https://developer.microsoft.com/fluentui#/) for more details on fluent UI. + + + + + Specifies the JavaScript dialog kind used in . + + + + + Indicates that the dialog uses window.alert JavaScript function. + + + + + Indicates that the dialog uses window.confirm JavaScript function. + + + + + Indicates that the dialog uses window.prompt JavaScript function. + + + + + Indicates that the dialog uses window.beforeunload JavaScript event. + + + + + + Status of a programmatic Save As call. Indicates the result of the method. + + + + + The `ShowSaveAsUIAsync` method call completed successfully. By default, the system Save As dialog opens. If is set to `TRUE`, the system dialog is skipped and the download is started. + + + + + Could not perform Save As because the destination file path is an invalid path. The path is invalid when it is empty, a relative path, or a directory, or when the parent path does not exist. + + + + + Could not perform Save As because the destination file path already exists and replacing files was not allowed by the property. + + + + + Could not perform Save As because the `Kind` property selection is not supported due to content MIME type or system limits. See for MIME type limits. System limits include when the `HtmlOnly` kind is selected for an error page at child mode, or when the `Complete` kind is selected and the WebView is running in an App Container. + + + + + Did not perform Save As because the end user cancelled or the was set to `TRUE`. + + + + + Specifies selection options. + + + For HTML documents, we support 3 Save As kinds: HtmlOnly, SingleFile and Complete. For non-HTML documents, you must use Default. MIME types of `text/html` and `application/xhtml+xml` are considered HTML documents. + + + + + Default kind to save non-HTML content. If this kind is selected for an HTML page, the behavior is the same as the `HtmlOnly` kind. + + + + + Save the page as HTML. Only the top-level document is saved, excluding subresources. + + + + + Save the page as [MHTML](https://en.wikipedia.org/wiki/MHTML). + + + + + Save the page as HTML and download the page-related source files (for example: CSS, JavaScript, images, etc.) in a directory with the same filename prefix. + + + + + + Specifies the WebView2 release channel. + + + Use ReleaseChannels and ChannelSearchKind on CoreWebView2EnvironmentOptions to control which channel the WebView2 loader searches for. + + + + Channel + Primary purpose + How often updated with new features + + + Stable (WebView2 Runtime) + Broad Deployment + Monthly + + + Beta + Flighting with inner rings, automated testing + Monthly + + + Dev + Automated testing, selfhosting to test new APIs and features + Weekly + + + Canary + Automated testing, selfhosting to test new APIs and features + Daily + + + + + + + No release channel. ReleaseChannels will be ignored if only this value is passed. + + + + + The stable WebView2 Runtime that is released every 4 weeks. + + + + + The Beta release channel that is released every 4 weeks, a week before the stable release. + + + + + The Dev release channel that is released weekly. + + + + + The Canary release channel that is released daily. + + + + + Specifies the process kind used in . + + + The values in this enum make reference to the process kinds in the Chromium architecture. For more information about what these processes are and what they do, see [Browser Architecture - Inside look at modern web browser](https://developers.google.com/web/updates/2018/09/inside-browser-part1). + + + + + Indicates that the process is browser process. + + + + + Indicates that the process is render process. + + + + + Indicates that the process is utility process. + + + + + Indicates that the process is sandbox helper process. + + + + + Indicates that the process is Gpu process. + + + + + Indicates that the process is ppapi plugin process. + + + + + Indicates that the process is ppapi broker process. + + + + + Specifies the process failure reason used in . For process failures where a process has exited, it indicates the type of issue that produced the process exit. + + + + + Indicates that an unexpected process failure occurred. + + + + + Indicates that the process became unresponsive. This only applies to the main frame's render process. + + + + + Indicates that the process was terminated. For example, from Task Manager. + + + + + Indicates that the process crashed. Most crashes will generate dumps in the location indicated by . + + + + + Indicates that the process failed to launch. + + + + + Indicates that the process died due to running out of memory. + + + + + Deprecated. This value is unused. + + + + + Specifies the process failure kind used in . The values in this enum make reference to the process kinds in the Chromium architecture. For more information about what these processes are and what they do, see [Browser Architecture - Inside look at modern web browser](https://developers.google.com/web/updates/2018/09/inside-browser-part1). + + + + + Indicates that the browser process ended unexpectedly. The WebView automatically moves to the Closed state. The app has to recreate a new WebView to recover from this failure. + + + + + Indicates that the main frame's render process ended unexpectedly. Any subframes in the WebView will be gone too. A new render process is created automatically and navigated to an error page. You can use the method to try to recover from this failure. Alternatively, you can use and recreate the WebView. + + + + + Indicates that the main frame's render process is unresponsive. + + Renderer process unresponsiveness can happen for the following reasons: + + + + + There is a long-running script being executed. For example, the web content in your WebView might be performing a synchronous XHR, or have entered an infinite loop. + + + + + The system is busy. + + + + + The ProcessFailed event will continue to be raised every few seconds until the renderer procees has become responsive again. The application can consider taking action if the event keeps being raised. For example, the application might show UI for the user to decide to keep waiting or reload the page, or navigate away. + + + + Indicates that a frame-only render process ended unexpectedly. The process exit does not affect the top-level document, only a subset of the subframes within it. The content in these frames is replaced with an error page in the frame. Your application can communicate with the main frame to recover content in the impacted frames, using to get information about the impacted frames. + + + + + Indicates that a utility process ended unexpectedly. The failed process is recreated automatically. Your application does not need to handle recovery for this event, but can use to collect information about the failure, including ProcessDescription. + + + + + Indicates that a sandbox helper process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that the GPU process ended unexpectedly. The failed process is recreated automatically. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that a PPAPI plugin process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure, including ProcessDescription. + + + + + Indicates that a PPAPI plugin broker process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that a process of unspecified kind ended unexpectedly. Your application can use to collect information about the failure. + + + + + Indicates the status for printing. + + + + + Indicates that the print operation is succeeded. + + + + + Indicates that the printer is not available. + + + + + Indicates that the print operation is failed. + + + + + The orientation for printing, used by the property. + + + + + Print the page(s) in portrait orientation. + + + + + Print the page(s) in landscape orientation. + + + + + Specifies the media size for a print. + + + + + The default media size for a printer. + + + + + Indicate custom media size that is specific to the printer. + + + + + Specifies the duplex option for a print. + + + + + The default duplex for a printer. + + + + + Print on only one side of the sheet. + + + + + Print on both sides of the sheet, flipped along the long edge. + + + + + Print on both sides of the sheet, flipped along the short edge. + + + + + Specifies the print dialog kind. + + + + + Opens the browser print preview dialog. + + + + + Opens the system print dialog. + + + + + Specifies the color mode for a print. + + + + + The default color mode for a printer. + + + + + Indicate that the printed output will be in color. + + + + + Indicate that the printed output will be in shades of gray. + + + + + Specifies the collation for a print. + + + + + The default collation for a printer. + + + + + Indicate that the collation has been selected for the printed output. + + + + + Indicate that the collation has not been selected for the printed output. + + + + + Preferred color scheme for WebView2's associated with a profile. + + + + + Auto color scheme. + + + + + Light color scheme. + + + + + Dark color scheme. + + + + + Pointer event kind used by to convey the kind of pointer event being sent to WebView. + + + + + Corresponds to WM_POINTERACTIVATE. + + + + + Corresponds to WM_POINTERDOWN. + + + + + Corresponds to WM_POINTERENTER. + + + + + Corresponds to WM_POINTERLEAVE. + + + + + Corresponds to WM_POINTERUP. + + + + + Corresponds to WM_POINTERUPDATE. + + + + + Specifies the response to a permission request. + + + + + Specifies that the default browser behavior is used, which normally prompts users for decision. + + + + + Specifies that the permission request is granted. + + + + + Specifies that the permission request is denied. + + + + + Indicates the kind of a permission request. + + + + + Indicates an unknown permission. + + + + + Indicates permission to capture audio. + + + + + Indicates permission to capture video. + + + + + Indicates permission to access geolocation. + + + + + Indicates permission to send web notifications. Apps that would like to show notifications should handle and/or events and no browser permission prompt will be shown for notification requests. Note that push notifications are currently unavailable in WebView2. + + + + + Indicates permission to access generic sensor. Generic Sensor covers ambient-light-sensor, accelerometer, gyroscope, and magnetometer. + + + + + Indicates permission to read the system clipboard without a user gesture. + + + + + Indicates permission to automatically download multiple files. Permission is requested when multiple downloads are triggered in quick succession. + + + + + Indicates permission to read and write to files or folders on the device. Permission is requested when developers use the [File System Access API](https://developer.mozilla.org/docs/Web/API/File_System_Access_API) to show the file or folder picker to the end user, and then request "readwrite" permission for the user's selection. + + + + + Indicates permission to play audio and video automatically on sites. This permission affects the autoplay attribute and play method of the audio and video HTML elements, and the start method of the Web Audio API. See the [Autoplay guide for media and Web Audio APIs](https://developer.mozilla.org/docs/Web/Media/Autoplay_guide) for details. + + + + + Indicates permission to use fonts on the device. Permission is requested when developers use the [Local Font Access API](https://wicg.github.io/local-font-access/) to query the system fonts available for styling web content. + + + + + Indicates permission to send and receive system exclusive messages to/from MIDI (Musical Instrument Digital Interface) devices. Permission is requested when developers use the [Web MIDI API](https://developer.mozilla.org/docs/Web/API/Web_MIDI_API) to request access to system exclusive MIDI messages. + + + + + Indicates permission to open and place windows on the screen. Permission is requested when developers use the [Multi-Screen Window Placement API](https://www.w3.org/TR/window-placement/) to get screen details. + + + + + Specifies the PDF toolbar item types used for the . + + + + + No item. By default the equal to this value. + + + + + The save button on PDF toolbar. + + + + + The print button on PDF toolbar. + + + + + The save as button on PDF toolbar. + + + + + The zoom in button on PDF toolbar. + + + + + The zoom out button on PDF toolbar. + + + + + The rotate button on PDF toolbar. + + + + + The fit to width button on PDF toolbar. + + + + + The page view button on PDF toolbar. + + + + + The contents button on PDF toolbar. + + + + + The page number button on PDF toolbar. + + + + + The search button on PDF toolbar. + + + + + The full screen button on PDF toolbar. + + + + + The setting and more button on PDF toolbar. + + + + + Enum which represents the kind of non-client regions. + + + + + Enum value which represents a region entirely outside the WebView2 window. + + + + + Enum value which represents the client area. + + + + + Enum value which represents the caption area. + + + + + Enum value which represents the minimize window control button. + + + + + Enum value which represents the maximize window control button. + + + + + Enum value which represents the close window control button. + + + + + Specifies the navigation kind of each navigation. + + + + + A navigation caused by CoreWebView2.Reload(), location.reload(), the end user using F5 or other UX, or other reload mechanisms to reload the current document without modifying the navigation history. + + + + + A navigation back or forward to a different entry in the session navigation history, like via CoreWebView2.Back(), location.back(), the end user pressing Alt+Left or other UX, or other mechanisms to navigate back or forward in the current session navigation history. + + + + + A navigation to another document, which can be caused by CoreWebView2.Navigate(),window.location.href = ..., or other WebView2 or DOM APIs that navigate to a new URI. + + + + + Specifies the reason for moving focus. + + + + + Specifies that the code is setting focus into WebView. + + + + + Specifies that the focus is moved due to Tab traversal forward. + + + + + Specifies that the focus is moved due to Tab traversal backward. + + + + + Mouse event virtual keys associated with a for . + + + + + No additional keys pressed. + + + + + Left mouse button is down, MK_LBUTTON. + + + + + Right mouse button is down, MK_RBUTTON. + + + + + Shift key is down, MK_SHIFT. + + + + + Ctrl key is down, MK_CONTROL. + + + + + Middle mouse button is down, MK_MBUTTON. + + + + + First X button is down, MK_XBUTTON1. + + + + + Second X button is down, MK_XBUTTON2. + + + + + Mouse event kind used by to convey the kind of mouse event being sent to WebView. + + + + + Mouse horizontal wheel scroll event, WM_MOUSEHWHEEL. + + + + + Left button double click mouse event, WM_LBUTTONDBLCLK. + + + + + Left button down mouse event, WM_LBUTTONDOWN. + + + + + Left button up mouse event, WM_LBUTTONUP. + + + + + Mouse leave event, WM_MOUSELEAVE. + + + + + Middle button double click mouse event, WM_MBUTTONDBLCLK. + + + + + Middle button down mouse event, WM_MBUTTONDOWN. + + + + + Middle button up mouse event, WM_MBUTTONUP. + + + + + Mouse move event, WM_MOUSEMOVE. + + + + + Right button double click mouse event, WM_RBUTTONDBLCLK. + + + + + Right button down mouse event, WM_RBUTTONDOWN. + + + + + Right button up mouse event, WM_RBUTTONUP. + + + + + Mouse wheel scroll event, WM_MOUSEWHEEL. + + + + + First or second X button double click mouse event, WM_XBUTTONDBLCLK. + + + + + First or second X button down mouse event, WM_XBUTTONDOWN. + + + + + First or second X button up mouse event, WM_XBUTTONUP. + + + + + R button down over non client area, WM_NCRBUTTONDOWN. + + + + + R button up over non client area, WM_NCRBUTTONUP. + + + + + Desired memory consumption level of a WebView. + + + + + Normal memory usage target level. + + + + + Low memory usage target level. Used for inactivate WebView for reduced memory consumption. + + + + + Specifies the key event kind that raises an event. + + + + + Specifies that the key event kind corresponds to window message WM_KEYDOWN. + + + + + Specifies that the key event kind corresponds to window message WM_KEYUP. + + + + + Specifies that the key event kind corresponds to window message WM_SYSKEYDOWN. + + + + + Specifies that the key event kind corresponds to window message WM_SYSKEYUP. + + + + + Kind of cross origin resource access allowed for host resources during download. + + + Note that other normal access checks like same origin DOM access check and [Content Security Policy](https://developer.mozilla.org/docs/Web/HTTP/CSP) still apply. + The following table illustrates the host resource cross origin access according to access context and CoreWebView2HostResourceAccessKind. + + + + Cross Origin Access Context + Deny + Allow + DenyCors + + + From DOM like src of img, script or iframe element + Deny + Allow + Allow + + + From Script like Fetch or XMLHttpRequest + Deny + Allow + Deny + + + + + + + All cross origin resource access is denied, including normal sub resource access as src of a script or image element. + + + + + All cross origin resource access is allowed, including accesses that are subject to Cross-Origin Resource Sharing(CORS) check. The behavior is similar to a web site sends back http header Access-Control-Allow-Origin: *. + + + + + Cross origin resource access is allowed for normal sub resource access like as src of a script or image element, while any access that subjects to CORS check will be denied. See [Cross-Origin Resource Sharing](https://developer.mozilla.org/docs/Web/HTTP/CORS) for more information. + + + + + Specifies the frame kind used in . + + + + + Indicates that the frame is an unknown type frame. We may extend this enum type to identify more frame kinds in the future. For example, if portal frame which current in experimental phase gets finalized, we may extend this to include a new frame kind `COREWEBVIEW2_FRAME_KIND_PORTAL`. + + + + + Indicates that the frame is a primary main frame(). + + + + + Indicates that the frame is an iframe. + + + + + Indicates that the frame is an [embed](https://developer.mozilla.org/docs/Web/HTML/Element/embed) element. + + + + + Indicates that the frame is an [object](https://developer.mozilla.org/docs/Web/HTML/Element/object) element. + + + + + Allowed permissions of as described in [FileSystemHandle.requestPermission()](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) + + + + + Read-only permission for FileSystemHandle + + + + + Read and write permissions for FileSystemHandle + + + + + Kind of CoreWebView2FileSystemHandle as described in [FileSystemHandle.kind](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/kind) + + + + + FileSystemHandle is for a file (i.e. [FileSystemFileHandle](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle)) + + + + + FileSystemHandle is for a directory (i.e. [FileSystemDirectoryHandle](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle)) + + + + + The requested format to get the Favicon from . + + + + + Request the Favicon to be retrieved a Png Format. + + + + + Request the Favicon to be retrieved a Jpeg Format. + + + + + The state of the . + + + + + The download is in progress. + + + + + The connection with the file host was broken. The reason why a download was interrupted can accessed from . See for descriptions of the different kinds of interrupt reasons. Host can check whether an interrupted download can be resumed with . Once resumed, the download state is in progress. + + + + + The download completed successfully. + + + + + The reason why the was interrupted. + + + + + No interrupt reason. + + + + + Generic file error. + + + + + Access denied due to security restrictions. + + + + + Disk full. User should free some space or choose a different location to store the file. + + + + + Result file path with file name is too long. + + + + + File is too large for file system. + + + + + Microsoft Defender Smartscreen detected a virus in the file. + + + + + File was in use, too many files opened, or out of memory. + + + + + File blocked by local policy. + + + + + Security check failed unexpectedly. Microsoft Defender SmartScreen could not scan this file. + + + + + Seeking past the end of a file in opening a file, as part of resuming an interrupted download. The file did not exist or was not as large as expected. Partially downloaded file was truncated or deleted, and download will be restarted automatically. + + + + + Partial file did not match the expected hash and was deleted. Download will be restarted automatically. + + + + + Generic network error. User can retry the download manually. + + + + + Network operation timed out. + + + + + Network connection lost. User can retry the download manually. + + + + + Server has gone down. User can retry the download manually. + + + + + Network request invalid because original or redirected URI is invalid, has an unsupported scheme, or is disallowed by network policy. + + + + + Generic server error. User can retry the download manually. + + + + + Server does not support range requests. + + + + + Server does not have the requested data. + + + + + Server did not authorize access to resource. + + + + + Server certificate problem. + + + + + Server access forbidden. + + + + + Unexpected server response. Responding server may not be intended server. User can retry the download manually. + + + + + Server sent fewer bytes than the Content-Length header. Content-Length header may be invalid or connection may have closed. Download is treated as complete unless there are [strong validators](https://tools.ietf.org/html/rfc7232#section-2) present to interrupt the download. + + + + + Unexpected cross-origin redirect. + + + + + User canceled the download. + + + + + User shut down the WebView. Resuming downloads that were interrupted during shutdown is not yet supported. + + + + + User paused the download. + + + + + WebView crashed. + + + + + The default download dialog can be aligned to any of the WebView corners by setting the property. The default position is top-right corner. + + + + + The top-left corner of the WebView. + + + + + The top-right corner of the WebView. + + + + + The bottom-left corner of the WebView. + + + + + The bottom-right corner of the WebView. + + + + + Kind of cookie SameSite status used in the class. + + + These fields match those as specified in https://developer.mozilla.org/docs/Web/HTTP/Cookies#. + Learn more about SameSite cookies here: https://tools.ietf.org/html/draft-west-first-party-cookies-07 + + + + + None SameSite type. No restrictions on cross-site requests. + + + + + Lax SameSite type. The cookie will be sent with "same-site" requests, and with "cross-site" top level navigation. + + + + + Strict SameSite type. The cookie will only be sent along with "same-site" requests. + + + + + Indicates the kind of context for which the context menu was created for the property. This enum will always represent the active element that caused the context menu request. If there is a selection with multiple images, audio and text, for example, the element that the end user right clicks on within this selection will be the option represented by this enum. + + + + + Indicates that the context menu was created for the page without any additional content. + + + + + Indicates that the context menu was created for an image element. + + + + + Indicates that the context menu was created for selected text. + + + + + Indicates that the context menu was created for an audio element. + + + + + Indicates that the context menu was created for a video element. + + + + + Specifies the menu item kind for the property. + + + + + Specifies a command menu item kind. + + + + + Specifies a check box menu item kind. objects of this kind will need the property to determine current state of the check box. + + + + + Specifies a radio button menu item kind. objects of this kind will need the property to determine current state of the radio button. + + + + + Specifies a separator menu item kind. objects of this kind are used to signal a visual separator with no functionality. + + + + + Specifies a submenu menu item kind. objects of this kind will contain a collection of its children objects. + + + + + The kind of the . + + + + + Specifies smart card certificate. + + + + + Specifies PIN certificate. + + + + + Specifies other certificate. + + + + + The order that release channels are searched for during environment creation. + + + The default behavior is to search for and use the most stable channel found on the device. The order from most to least stable is: WebView2 Runtime -> Beta -> Dev -> Canary. Switch the order to prefer the least stable channel in order to perform pre-release testing. See for descriptions of channels. + + + + + Search for a release channel from most to least stable: WebView2 Runtime -> Beta -> Dev -> Canary. This is the default behavior. + + + + + Search for a release channel from least to most stable: Canary -> Dev -> Beta -> WebView2 Runtime. + + + + + Specifies the image format for the method. + + + + + Indicates that the PNG image format is used. + + + + + Indicates that the JPEG image format is used. + + + + + Indicates the kind of browsing data to clear. Or operations can be applied to create a mask representing multiple CoreWebView2BrowsingDataKinds. The resulting mask may be passed to or to clear the corresponding data. + + + + + Specifies file systems data. + + + + + Specifies data stored by the IndexedDB DOM feature. + + + + + Specifies data stored by the localStorage DOM API. + + + + + Specifies data stored by the Web SQL database DOM API. + + + + + Specifies data stored by the CacheStorage DOM API. + + + + + Specifies DOM storage data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.FileSystems, CoreWebView2BrowsingDataKinds.IndexedDb, CoreWebView2BrowsingDataKinds.WebSql, CoreWebView2BrowsingDataKinds.ServiceWorkers, CoreWebView2BrowsingDataKinds.CacheStorage, and some other data kinds not listed yet to keep consistent with [DOM-accessible storage](https://www.w3.org/TR/clear-site-data/#storage). + + + + + Specifies HTTP cookies data. + + + + + Specifies all site data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.AllDomStorage and CoreWebView2BrowsingDataKinds.Cookies. New site data types may be added to this data kind in the future. + + + + + Specifies disk cache. + + + + + Specifies download history data. + + + + + Specifies general autofill form data. This excludes password information and includes information like: names, street and email addresses, phone numbers, and arbitrary input. This also includes payment data. + + + + + Specifies password autosave data. + + + + + Specifies browsing history data. + + + + + Specifies settings data. + + + + + Specifies profile data that should be wiped to make it look like a new profile. This does not delete account-scoped data like passwords but will remove access to account-scoped data by signing the user out. Specifies all profile data, now and future. New profile data types may be added to this data kind in the future. This browsing data kind is inclusive of , , , , , , . + + + + + Specifies service workers registered for an origin, and clear will result in termination and deregistration of them. + + + + + Specifies the browser process exit kind used in . + + + + + Indicates that the browser process ended normally. + + + + + Indicates that the browser process ended unexpectedly. A event will also be raised to listening WebViews from the associated to the failed process. + + + + + Mode for how the property is interpreted in relation to the property. + + + + + property represents raw pixels. Physical size of WebView is not impacted by . + + + + + property represents logical pixels and the property is used to get the physical size of the WebView. + + + + + Contains the information packed into the LPARAM sent to a Win32 key event. + + + For more information about WM_KEYDOWN, navigate to [WM_KEYDOWN message](/windows/win32/inputdev/wm-keydown). + + + + + Specifies the repeat count for the current message. + + + + + Specifies the scan code. + + + + + Indicates that the key is an extended key. + + + + + Indicates that a menu key is held down (context code). + + + + + Indicates that the key was held down. + + + + + Indicates that the key was released. + + + + + A value representing RGBA color (Red, Green, Blue, Alpha) for WebView2. + + + Each component takes a value from 0 to 255, with 0 being no intensity and 255 being the highest intensity. + + + + + Specifies the intensity of the Alpha ie. opacity value. 0 is transparent, 255 is opaque. + + + + + Specifies the intensity of the Red color. + + + + + Specifies the intensity of the Green color. + + + + + Specifies the intensity of the Blue color. + + + + + The window features for a WebView popup window. + + + The fields match the windowFeatures passed to window.open() as specified in [Window features](https://developer.mozilla.org/docs/Web/API/Window/open#Window_features) on MDN. There is no requirement for you to respect the values. If your app does not have corresponding UI features (for example, no toolbar) or if all instance of WebView are opened in tabs and do not have distinct size or positions, then your app does not respect the values. You may want to respect values, but perhaps only some apply to the UI of you app. Accordingly, you may respect all, some, or none of the properties as appropriate for your app. For all numeric properties, if the value that is passed to window.open() is outside the range of an uint, the resulting value is uint.MaxValue. If you are not able to parse the value an integer, it is considered 0. If the value is a floating point value, it is rounded down to an integer. + + + + + Indicates whether the left and top values are specified. + + + + + Indicates whether the height and width values are specified. + + + + + Gets the left position of the window. Ignored if is false. + + + + + Gets the top position of the window. Ignored if is false. + + + + + Gets the height of the window. Ignored if is false. + + + + + Gets the width of the window. Ignored if is false. + + + + + Indicates that the menu bar is displayed. + + + + + Indicates that the status bar is displayed. + + + + + Indicates that the browser toolbar is displayed. + + + + + Indicates that the scroll bars are displayed. + + + + + View of the HTTP representation for a web resource response. + + + The properties of this object are not mutable. This response view is used with the event. + + + + + Gets the HTTP response headers as received. + + + + + Gets the HTTP response status code. + + + + + Gets the HTTP response reason phrase. + + + + + Gets the response content stream asynchronously. + + The content failed to load. + + A null stream means no content was found. Note content (if any) for redirect responses is ignored. + This method returns null if content size is more than 123MB. If msWebView2EnableDownloadContentInWebResourceResponseReceived feature flag is disabled, for navigations that become downloads or if response is downloadable content type (e.g., application/octet-stream), this method also returns null. See event to handle the response or enable the feature flag. The Stream object that is returned will be thread-safe and as reads will be blocking while waiting for data to be available, it is recommended to read from a background thread. + If this method is being called again before a first call has completed, it will complete at the same time all prior calls do. + If this method is being called after a first call has completed, it will return immediately (asynchronously). + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebResourceResponseReceived"::: + + + + + Event args for the event. + + + + + Gets the request object for the web resource, as committed. + + + This includes headers added by the network stack that were not be included during the associated event, such as Authentication headers. Modifications to this object have no effect on how the request is processed as it has already been sent. + + + + + Gets view of the response object received for the web resource. + + + + + An HTTP response used with the event. + + + + + Gets HTTP response content as stream. + + + Stream must have all the content data available by the time the event deferral of this response is completed. Stream should be agile or be created from a background thread to prevent performance impact to the UI thread. null means no content data. + When providing the response data, you should consider relevant HTTP request headers just like an HTTP server would do. For example, if the request was for a video resource in a HTML video element, the request may contain the [Range](https://developer.mozilla.org/docs/Web/HTTP/Headers/Range) header to request only a part of the video that is streaming. In this case, your response stream should be only the portion of the video specified by the range HTTP request headers and you should set the appropriate [Content-Range](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Range) header in the response. + + + + + + Gets the overridden HTTP response headers. + + + + + Gets or sets the HTTP response status code. + + + + + Gets or sets the HTTP response reason phrase. + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the web resource request. + + + The request object may be missing some headers that are added by network stack at a later time. + + + + + Gets or sets the object. + + + If this object is set, the event will be completed with this Response. + An empty object can be created with and then modified to construct the Response. + + + + + Gets the web resource request context. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the event at a later time. + + + + + Gets the source of web resource request. + + + + + An HTTP request used with the event. + + + + + Gets or sets the request URI. + + + + + Gets or sets the HTTP request method. + + + + + Gets or sets the HTTP request message body as stream. + + + POST data should be here. If a stream is set, which overrides the message body, the stream must have all the content data available by the time the event deferral of this request is completed. Stream should be agile or be created from a background STA to prevent performance impact to the UI thread. null means no content data. + + + + + + Gets the mutable HTTP request headers. + + + + + Event args for the event. + + + + + true if the page being navigated to is a new document. + + + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + + + Determines whether running JavaScript is enabled in all future navigations in the WebView. + + + This only affects scripts in the document. Scripts injected with runs even if script is disabled. The default value is true. + + + + + Determines whether communication from the host to the top-level HTML document of the WebView is allowed. + + + This is used when loading a new HTML document. If set to true, communication from the host to the top-level HTML document of the WebView is allowed using , , and message event of window.chrome.webview. Communication from the top-level HTML document of the WebView to the host is allowed using window.chrome.webview.postMessage function and the event. If set to false, then communication is disallowed. and fail and window.chrome.webview.postMessage fails by throwing an instance of an Error object. The default value is true. + + + + + + + + Determines whether WebView renders the default JavaScript dialog box. + + + This is used when loading a new HTML document. If set to false, WebView does not render the default JavaScript dialog box (specifically those displayed by the JavaScript alert, confirm, prompt functions and beforeunload event). Instead, WebView raises event that contains all of the information for the dialog and allow the host app to show a custom UI. The default value is true. + + + + + + Determines whether the status bar is displayed. + + + The status bar is usually displayed in the lower left of the WebView and shows things such as the URI of a link when the user hovers over it and other information. The default value is true. The status bar UI can be altered by web content and should not be considered secure. + + + + + Determines whether the user is able to use the context menu or keyboard shortcuts to open the DevTools window. + + + The default value is true. + + + + + Determines whether the default context menus are shown to the user in WebView. + + + The default value is true. + + + + + Determines whether host objects are accessible from the page in WebView. + + + The default value is true. + + + + + Determines whether the user is able to impact the zoom of the WebView. + + + When disabled, the user is not able to zoom using Ctrl++, Ctr+-, or Ctrl+mouse wheel, but the zoom is set using property. The default value is true. + + + + + Determines whether to disable built in error page for navigation failure and render process failure. + + + When disabled, blank page is displayed when related error happens. The default value is true. + + + + + Determines WebView2's User Agent. + + + The default value is the default User Agent of the Edge browser. This property may be overridden if the User-Agent header is set in a request. If the parameter is empty the User Agent will not be updated and the current User Agent will remain. Setting this property may clear User Agent Client Hints headers Sec-CH-UA-* and script values from navigator.userAgentData. Current implementation behavior is subject to change. + The User Agent set will also be effective on service workers and shared workers associated with the WebView. If there are multiple WebViews associated with the same service worker or shared worker, the last User Agent set will be used. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SetUserAgent"::: + + + + + Determines whether browser-specific accelerator keys are enabled. + + + When this setting is set to false, it disables all accelerator keys that access + features specific to a web browser, including but not limited to: + + + + Ctrl+F and F3 for Find on Page + + + Ctrl+P for Print + + + Ctrl+R and F5 for Reload + + + Ctrl+Plus and Ctrl+Minus for zooming + + + Ctrl+Shift-C and F12 for DevTools + + + Special keys for browser functions, such as Back, Forward, and Search + + + + It does not disable accelerator keys related to movement and text editing, such + as: + + + + Home, End, Page Up, and Page Down + + + Ctrl+X, Ctrl+C, Ctrl+V + + + Ctrl+A for Select All + + + Ctrl+Z for Undo + + + + Those accelerator keys will always be enabled unless they are handled in the event. + + This setting has no effect on the event. The event + will be fired for all accelerator keys, whether they are enabled or not. + + The default value of AreBrowserAcceleratorKeysEnabled is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AllowWebViewShortcutKeys"::: + + + + + Determines whether password information will be autosaved. + + + When disabled, no new password data is saved and no Save/Update Password prompts are displayed. However, if there was password data already saved before disabling this setting, then that password information is auto-populated, suggestions are shown and clicking on one will populate the fields. + When enabled, password information is auto-populated, suggestions are shown and clicking on one will populate the fields, new data is saved, and a Save/Update Password prompt is displayed. The default value is false. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PasswordAutosaveEnabled"::: + + + + + Determines whether general form information will be saved and autofilled. + + + General autofill information includes information like names, street and email addresses, phone numbers, and arbitrary input. This excludes password information. When disabled, no suggestions appear, and no new information is saved. + When enabled, information is saved, suggestions appear, and clicking on one will populate the form fields. The default value is true. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. And all WebView2s that created with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GeneralAutofillEnabled"::: + + + + + + Determines the ability of the end users to use pinching motions on touch input enabled devices to scale the web content in the WebView2. + + + When disabled, the end users cannot use pinching motions on touch input enabled devices to scale the web content in the WebView2. The default value is true. + Pinch-zoom, referred to as "Page Scale" zoom, is performed as a post-rendering step, it changes the page scale factor property and scales the surface the web page is rendered onto when user performs a pinch zooming action. It does not change the layout but rather changes the viewport and clips the web content, the content outside of the viewport isn't visible onscreen and users can't reach this content using mouse. This API only affects the Page Scale zoom and has no effect on the existing browser zoom properties ( and ) or other end user mechanisms for zooming. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="TogglePinchZoomEnabled"::: + + + + + Determines whether the end user to use swiping gesture on touch input enabled devices to navigate in WebView2. + + + Swiping gesture navigation on touch screen includes: + + + Swipe left/right (swipe horizontally) to navigate to previous/next page in navigation history. + + + Pull to refresh (swipe vertically) the current page. (This feature is currently disabled by default in the browser, to enable in WebView2, set property with --pull-to-refresh switch). + + + It defaults to true. When set to false, the end user cannot swipe to navigate or pull to refresh. This API only affects the overscrolling navigation functionality and has no effect on the scrolling interaction used to explore the web content shown in WebView2. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleSwipeNavigationEnabled"::: + + + + + Used to customize the PDF toolbar items. + + + By default, it is and so it displays all of the items. + Changes to this property apply to all CoreWebView2s in the same environment and using the same profile. + Changes to this setting apply only after the next navigation. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleHiddenPdfToolbarItems"::: + + + + + Determines whether SmartScreen is enabled when visiting web pages + + + The default value is true. + IsReputationCheckingRequired is used to control whether SmartScreen is enabled or not. + SmartScreen is enabled or disabled for all CoreWebView2s using the same user data folder. + If CoreWebView2Setting.IsReputationCheckingRequired is true for any CoreWebView2 using the same user data folder, then SmartScreen is enabled. If CoreWebView2Setting.IsReputationCheckingRequired is false for all CoreWebView2 using the same user data folder, then SmartScreen is disabled. + When it is changed, the change will be applied to all WebViews using the same user data folder on the next navigation or download. + If the newly created CoreWebview2 does not set SmartScreen to false, when navigating(Such as Navigate(), LoadDataUrl(), ExecuteScript(), etc.), the default value will be applied to all CoreWebview2 using the same user data folder. + SmartScreen of WebView2 apps can be controlled by Windows system setting "SmartScreen for Microsoft Edge", specially, for WebView2 in Windows Store apps, SmartScreen is controlled by another Windows system setting "SmartScreen for Microsoft Store apps". When the Windows setting is enabled, the SmartScreen operates under the control of the `IsReputationCheckingRequired`. When the Windows setting is disabled, the SmartScreen will be disabled regardless of the `IsReputationCheckingRequired` value set in WebView2 apps. In other words, under this circumstance the value of `IsReputationCheckingRequired` will be saved but overridden by system setting. Upon re-enabling the Windows setting, the CoreWebview2 will reference the `IsReputationCheckingRequired` to determine the SmartScreen status. + + + + + The `IsNonClientRegionSupportEnabled` property enables web pages to use the + + `app-region` CSS style. Disabling/Enabling the `IsNonClientRegionSupportEnabled` + takes effect after the next navigation. Defaults to `false`. + + When this property is `true`, then all the non-client region features + will be enabled: + Draggable Regions will be enabled, they are regions on a webpage that + are marked with the CSS attribute `app-region: drag/no-drag`. When set to + `drag`, these regions will be treated like the window's title bar, supporting + dragging of the entire WebView and its host app window; the system menu shows + upon right click, and a double click will trigger maximizing/restoration of the + window size. + When set to `false`, all non-client region support will be disabled. + The `app-region` CSS style will be ignored on web pages. + + + + Event args for the event. + + + + + The TLS error code for the invalid certificate. + + + + + URI associated with the request for the invalid certificate. + + + + + Returns the . + + + + + The action of the server certificate error detection. + + + The default value is . + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + This interface represents a JavaScript exception. + + + + + The line number of the source where the exception occurred. Note that this position starts at 0. + + + + + The column number of the source where the exception occurred. Note that this position starts at 0. + + + + + The Name is the exception's class name. + + + + + The Message is the exception's message and potentially stack. + + + + + This will return all details of the exception as a JSON string. + + + + + Event args for the event. + + + + + Gets the URI of the page that requested the dialog box. + + + + + Gets the kind of JavaScript dialog box. + + + + + + Gets the message of the dialog box. + + + From JavaScript this is the first parameter passed to alert, confirm, and prompt and is empty for beforeunload. + + + + + Gets the default value to use for the result of the prompt JavaScript function. + + + This is the second parameter passed to the JavaScript prompt dialog. + + + + + Gets or sets the return value from the JavaScript prompt function if is run. + + + This value is ignored for s other than . If is not run, this value is ignored and false is returned from prompt. + + + + + + Responds with **OK** to confirm, prompt, and beforeunload dialogs. Not run this method to indicate cancel. + + + From JavaScript, this means that the confirm function and beforeunload event returns true if Accept is run. And for the prompt function it returns the value of if Accept is run and otherwise returns false. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + The host may set this flag to TRUE to cancel the screen capture. + + + If canceled, the screen capture UI is not displayed regardless of the Handled property. On the script side, it will return with a NotAllowedError as Permission denied. + + + + + The host may set this flag to TRUE to prevent the ScreenCaptureStarting event from firing on the CoreWebView2 as well. + + + By default, both the ScreenCaptureStarting event handlers on the CoreWebView2Frame and the CoreWebView2 will be invoked, with the CoreWebView2Frame event handlers invoked first. The host may set this flag to TRUE within the CoreWebView2Frame event handlers to prevent the remaining CoreWebView2 event handlers from being invoked. If the flag is set to FALSE within the CoreWebView2Frame event handlers, downstream handlers can update the Cancel property. + + + + + The frame info of the frame where the screen capture starting request originated. + + + + + Returns a object. + + + Use this deferral to defer the decision to show the Screen Capture UI. getDisplayMedia() won't call its callbacks until the deferral is completed. + + + + + Event args for the event. + + + + + Set if cancel the upcoming save/download. + + + + + Get the document origin URI of this file save operation. + + + + + Get the extension of file to be saved. + + + + + Get the full path of file to be saved. This includes the file name and extension. + + + + + Set if the default policy checking and security warning will be suppressed. + + + + + Returns a object. + + + It will put the event into a deferred state. The default policy checking and any default UI will be blocked temporarily, saving file to local won't start, until the deferral is completed. + + + + + + Event args for the event. + + + + + Mime type of content to be saved. + + + + + Indicates whether to cancel the save as before download. + + + Set this property to `TRUE` to cancel the Save As action and prevent the download from starting. returns . + + + + + Indicates if the system default dialog will be suppressed. + + + When this property is FALSE, the default Save As dialog is shown and the values assigned through `SaveAsFilePath`, `AllowReplace` and `Kind` are ignored when the event args invoke completed. When it is `TRUE`, the system dialog is skipped and all assigned values are used. + + + + + The absolute full path of save as location. + + + It includes the file name and extension. If it is not valid (for example, the root drive does not exist), Save As is denied, and is returned. If the associated download completes successfully, a target file is saved at this location. If the `Kind` property is , there will be an additional directory with resources files. + + + + + Indicates whether to allow replace old file when it already exists in the target save file path. + + + Setting this property to `TRUE` allows existing files to be replaced. Setting this property to `FALSE` will not replace existing files and will return . + + + + + The option to save content to different document. + + + If it is not allowed for the current document, method returns . + + + + + Gets a object. + + + This will defer showing the default Save As dialog. Use this to the event at a later time to perform a Save As operation. + + + + + + Provides a set of properties for a process list in the . + + + + + Get the process id of the process. + + + + + Get the kind of the process. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the kind of process failure that has occurred. + + + ProcessFailedKind is a combination of process kind (for example, browser, renderer, gpu) and failure (exit, unresponsiveness). Renderer processes are further divided in main frame renderer (RenderProcessExited, RenderProcessUnresponsive) and subframe renderer (FrameRenderProcessExited). To learn about the conditions under which each failure kind occurs, see . + + + + + + Gets the reason for the process failure. + + + Some of the reasons are only applicable to specific values of , and the following values always return the indicated reason value: + + + + ProcessFailedKind + Reason + + + BrowserProcessExited + + Unexpected + + + + RenderProcessUnresponsive + + Unresponsive + + + + + For other values, the reason may be any of the reason values. To learn about what these values mean, see . + + + + + + Gets the exit code of the failing process, for telemetry purposes. + + + The exit code is always 1 when is , and STILL_ACTIVE(259) when is . + + + + + + Gets a description of the failing process, assigned by the WebView2 Runtime. + + + This is a technical English term appropriate for logging or development purposes, and not localized for the end user. It applies to utility processes (for example, "Audio Service", "Video Capture") and plugin processes (for example, "Flash"). The returned string is empty if the WebView2 Runtime did not assign a description to the process. + + + + + Gets the collection of s for frames in the that were being rendered by the failed process. + + + The content in these frames is replaced with an error page. + This is only available when is ; the returned collection is empty for all other process failure kinds, including the case in which the failed process was the renderer for the main frame and subframes within it, for which the failure kind is . + + + + + When ProcessFailed occurred due to a failed Code Integrity check, this property returns the full path of the file that was prevented from loading on the system. + + The webview2 process which tried to load the DLL will fail with exit code STATUS_INVALID_IMAGE_HASH(-1073740760). + + + + Provides a set of properties for a process list with extended information in the . + + + + + Provides the of the current process. + + + + + Provides the collection of associated s which are actively running (showing or hiding UI elements) in this renderer process. + + + AssociatedFrameInfos will only be populated when this corresponds to a renderer process. Non-renderer processes will always have an empty AssociatedFrameInfo. AssociatedFrameInfos may also be empty for renderer processes that have no active frames. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AssociatedFrameInfos"::: + + + + + Settings used by the method. + + + Settings used by the method. + + + + + The orientation can be portrait or landscape. + + + The default orientation is portrait. See . + + + + + The scale factor is a value between 0.1 and 2.0. + + + The default is 1.0. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The page width in inches. + + + The default width is 8.5 inches. If the provided page width is less than or equal to zero, the current value is not changed and an ArgumentException is thrown. + + + + + The page height in inches. + + + The default height is 11 inches. If the provided page height is less than or equal to zero, the current value is not changed and an ArgumentException is thrown. + + + + + The top margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The bottom margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The left margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The right margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + true if background colors and images should be printed. + + + The default value is false. + + + + + true if only the current end user's selection of HTML in the document should be printed. + + + The default value is false. + + + + + true if header and footer should be printed. + + + The default value is false. The header consists of the date and time of printing, and the title of the page. The footer consists of the URI and page number. The height of the header and footer is 0.5 cm, or ~0.2 inches. + + + + + The title in the header if is true. + + + The default value is the title of the current document. If an empty string or null value is provided, no title is shown in the header. + + + + + The URI in the footer if is true. + + + The default value is the current URI. If an empty string or null value is provided, no URI is shown in the footer. + + + + + Page range to print. Defaults to empty string, which means print all pages. + + + The PageRanges property is a list of page ranges specifying one or more pages that should be printed separated by commas. Any whitespace between page ranges is ignored. + A valid page range is either a single integer identifying the page to print, or a range in the form [start page]-[last page] where start page and last page are integers identifying the first and last inclusive pages respectively to print. + Every page identifier is an integer greater than 0 unless wildcards are used (see below examples). + The first page is 1. + + In a page range of the form [start page]-[last page] the start page number must be larger than 0 and less than or equal to the document's total page count. + If the start page is not present, then 1 is used as the start page. + The last page must be larger than the start page. + If the last page is not present, then the document total page count is used as the last page. + + Repeating a page does not print it multiple times. To print multiple times, use the property. + + The pages are always printed in ascending order, even if specified in non-ascending order. + + If page range is not valid or if a page is greater than document total page count, ArgumentException is thrown. + + The following examples assume a document with 20 total pages. + + + + Example + Result + Notes + + + "2" + Page 2 + + + + "1-4, 9, 3-6, 10, 11" + Pages 1-6, 9-11 + + + + "1-4, -6" + Pages 1-6 + The "-6" is interpreted as "1-6". + + + "2-" + Pages 2-20 + The "2-" is interpreted as "pages 2 to the end of the document". + + + "4-2, 11, -6" + Invalid + "4-2" is an invalid range. + + + "-" + Pages 1-20 + The "-" is interpreted as "page 1 to the end of the document". + + + "1-4dsf, 11" + Invalid + + + + "2-2" + Page 2 + + + + + + + + Prints multiple pages of a document on a single piece of paper. Choose from 1, 2, 4, 6, 9 or 16. + + + The default value is 1. + + If an invalid value is provided, ArgumentException is thrown. + + Below examples shows print output for PagesPerSide and Duplex. + + + + PagesPerSide + Total pages + Two-sided printing + Result + + + 1 + 1 + - + 1 page on the front side. + + + 2 + 1 + Yes + 1 page on the front side. + + + 2 + 4 + - + 2 pages on the first paper and 2 pages on the next paper. + + + 2 + 4 + Yes + 2 pages on the front side and 2 pages on back side. + + + 4 + 4 + Yes + 4 pages on the front side. + + + 4 + 8 + Yes + 4 pages on the front side and 4 pages on the back side. + + + + + + + Number of copies to print. Minimum value is 1 and the maximum copies count is 999. + + + The default value is 1. + + + + + Printer collation. + + + See for descriptions of collation. The default value is . + + Printing uses default value of printer's collation if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + Printer color mode. + + + See for descriptions of color modes. The default value is . + + Printing uses default value of printer supported color if an invalid value is provided for the specific printer. + + + + + Printer duplex settings. + + + See for descriptions of duplex. The default value is . + + Printing uses default value of printer's duplex if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + Printer media size. + + + See for descriptions of media size. The default value is . + + If media size is , you should set the and . + + Printing uses default value of printer supported media size if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + The name of the printer to use. + + + Defaults to empty string. If the printer name is empty string or null, then it prints to the default printer on the user OS. + + If provided printer name doesn't match with the name of any installed printers on the user OS, the method returns with . + + Use [PrintCapabilities](/dotnet/api/system.printing.printcapabilities) class to enumerate available printers. + + This value is ignored in method. + + + + + This mostly represents a combined win32 POINTER_INFO, POINTER_TOUCH_INFO, and POINTER_PEN_INFO object. + + + + + Gets or sets the PointerKind of the pointer event. + + + This corresponds to the pointerKind property of the POINTER_INFO struct. The values are defined by the POINTER_INPUT_KIND enum in the Windows SDK (_winuser.h_). Supports PT_PEN and PT_TOUCH. + + + + + Gets or sets the PointerId of the pointer event. + + + This corresponds to the pointerId property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the FrameID of the pointer event. + + + This corresponds to the frameId property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PointerFlags of the pointer event. + + + This corresponds to the pointerFlags property of the POINTER_INFO struct. The values are defined by the POINTER_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PointerDeviceRect of the sourceDevice property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the DisplayRect of the sourceDevice property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PixelLocation of the pointer event. + + + This corresponds to the ptPixelLocation property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HimetricLocation of the pointer event. + + + This corresponds to the ptHimetricLocation property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PixelLocationRaw of the pointer event. + + + This corresponds to the ptPixelLocationRaw property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HimetricLocationRaw of the pointer event. + + + This corresponds to the ptHimetricLocationRaw property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the Time of the pointer event. + + + This corresponds to the dwTime property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HistoryCount of the pointer event. + + + This corresponds to the historyCount property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the InputData of the pointer event. + + + This corresponds to the InputData property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the KeyStates of the pointer event. + + + This corresponds to the dwKeyStates property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PerformanceCount of the pointer event. + + + This corresponds to the PerformanceCount property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the ButtonChangeKind of the pointer event. + + + This corresponds to the ButtonChangeKind property of the POINTER_INFO struct. The values are defined by the POINTER_BUTTON_CHANGE_KIND enum in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenFlags of the pointer event. + + + This corresponds to the penFlags property of the POINTER_PEN_INFO struct. The values are defined by the PEN_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenMask of the pointer event. + + + This corresponds to the penMask property of the POINTER_PEN_INFO struct. The values are defined by the PEN_MASK constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenPressure of the pointer event. + + + This corresponds to the pressure property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenRotation of the pointer event. + + + This corresponds to the rotation property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenTiltX of the pointer event. + + + This corresponds to the tiltX property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenTiltY of the pointer event. + + + This corresponds to the tiltY property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchFlags of the pointer event. + + + This corresponds to the touchFlags property of the POINTER_TOUCH_INFO struct. The values are defined by the TOUCH_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchMask of the pointer event. + + + This corresponds to the touchMask property of the POINTER_TOUCH_INFO struct. The values are defined by the TOUCH_MASK constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchContact of the pointer event. + + + This corresponds to the rcContact property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchContactRaw of the pointer event. + + + This corresponds to the rcContactRaw property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchOrientation of the pointer event. + + + This corresponds to the orientation property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchPressure of the pointer event. + + + This corresponds to the pressure property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Provides a set of properties for a permission setting. + + + + + The kind of the permission setting. + + + + + The origin of the permission setting. + + + + + The state of the permission setting. + + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the origin of the web content that requests the permission. + + + + + Gets the kind of the permission that is requested. + + + + + true when the permission request was initiated through a user gesture such as clicking an anchor tag with target. + + + Being initiated through a user gesture does not mean that user intended to access the associated resource. + + + + + Gets or sets the status of a permission request. For example, whether the request is granted. + + + The default value is . + + + + + Gets a object. + + + Use the deferral object to make the permission decision at a later time. The deferral only applies to the current request, and does not prevent the PermissionRequested event from getting raised for new requests. However, for some permission kinds the WebView will avoid creating a new request if there is a pending request of the same kind. + + + + + The host may set this flag to TRUE to prevent the PermissionRequested event from firing on the CoreWebView2 as well. + + By default, both the PermissionRequested on the CoreWebView2Frame and CoreWebView2 will be fired. + + + + Set the SavesInProfile property to FALSE to not persist the state beyond the current request, and to continue to receive PermissionRequested events for this origin and permission kind. + + + The permission state set from the PermissionRequested event is saved in the profile by default; it is persisted across sessions and becomes the new default behavior for future PermissionRequested events. Browser heuristics can affect whether the event continues to be raised when the state is persisted. + + + + + Event args for the . + + + + + The origin of the web content that sends the notification, such as https://example.com/ or https://www.example.com/. + + + + + The notification that was received. + + + You can access the properties on the Notification object to show your own notification. + + + + + Sets whether the is handled by the host after the event handler completes or if there is a deferral then after the deferral is completed. + + + If is set to true then WebView will not display the notification with the default UI, and the host will be responsible for handling the notification and for letting the web content know that the notification has been displayed, clicked, or closed. You must set to true before you call , and , otherwise they will fail with HRESULT_FROM_WIN32(ERROR_INVALID_STATE). If after the event handler or deferral completes is set to false then WebView will display the default notification UI. Note that you cannot un-handle this event once you have set to be true. The initial value is false. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + Gets the region kind corresponding to the event. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the target uri of the new window request. + + + + + Gets the new window or sets a WebView as a result of the new window requested. + + + Provides a WebView as the target for a window.open() from inside the requesting WebView. If this is set, the top-level window of this WebView is returned as the opened [WindowProxy](https://developer.mozilla.org/docs/glossary/windowproxy) to the opener script. If this is not set, then is checked to determine behavior for the . + The methods which should affect the new web contents like has to be called and completed before setting NewWindow. Other methods which should affect the new web contents like have to be called after setting NewWindow. It is best not to use before setting NewWindow, otherwise it may not work for later added scripts. + WebView provided in the NewWindow property must be on the same as the opener WebView and cannot be navigated. Changes to settings should be made before setting NewWindow to ensure that those settings take effect for the newly setup WebView. The new WebView must have the same profile as the opener WebView. + + + + + Indicates whether the event is handled by host. + + + If this is false and no is set, the WebView opens a popup window and returns the opened WindowProxy to the opener script. Note that in this case, there is no avenue to control the popup window from the app. If set to true and no is set for window.open(), the opened proxy is for a dummy window object, but this window does not load and is immediately closed. The default value is false. + + + + + true when the new window request was initiated through a user gesture such as selecting an anchor tag with target. + + + The Microsoft Edge popup blocker is disabled for WebView so the app is able to use this flag to block non-user initiated popups. + + + + + Gets the window features specified by the window.open() call. These features should be considered for positioning and sizing of new WebView windows. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the window open request at a later time. While this event is deferred the opener window returns a WindowProxy to an un-navigated window, which navigates when the deferral is complete. + + + + + Gets the name of the new window. + + + This window can be created via window.open(url, windowName), where the windowName parameter corresponds to Name property. + If no windowName is passed to window.open, then the Name property will be set to an empty string. Additionally, if window is opened through other means, such as <a target="windowName"> or <iframe name="windowName">, then the Name property will be set accordingly. In the case of target=_blank, the Name property will be an empty string. + Opening a window via Ctrl+clicking a link would result in the Name property being set to an empty string. + + + + + The frame info of the frame where the new window request originated. + + + The OriginalSourceFrameInfo is a snapshot of frame information at the time when the new window was requested. See for details on frame properties. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the uri of the requested navigation. + + + + + true when the new window request was initiated through a user gesture. + + + Examples of user initiated requests are: + - Selecting an anchor tag with target + - Programmatic window open from a script that directly run as a result of user interaction such as via onclick handlers. + Non-user initiated requests are programmatic window opens from a script that are not directly triggered by user interaction, such as those that run while loading a new page or via timers. + The Microsoft Edge popup blocker is disabled for WebView so the app is able to use this flag to block non-user initiated popups. + + + + + true when the navigation is redirected. + + + + + Gets the HTTP request headers for the navigation. + + + Note, you are not able to modify the HTTP request headers in a event. + + + + + + Determines whether to cancel the navigation. + + + If set to true, the navigation is no longer present and the content of the current page is intact. For performance reasons, GET HTTP requests may happen, while the host is responding. You may set cookies and use part of a request for the navigation. Navigations to about schemes are cancellable, unless `msWebView2CancellableAboutNavigations` feature flag is disabled. Cancellation of frame navigation to `srcdoc` is not supported and will be ignored. + + + + + Gets the ID of the navigation. + + + + + Additional allowed frame ancestors set by the host app. + + + The app may set this property to allow a frame to be embedded by additional ancestors besides what is allowed by http header [X-Frame-Options](https://developer.mozilla.org/docs/Web/HTTP/Headers/X-Frame-Options) and [Content-Security-Policy frame-ancestors directive](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors). + If set, a frame ancestor is allowed if it is allowed by the additional allowed frame ancestors or original http header from the site. + Whether an ancestor is allowed by the additional allowed frame ancestors is done the same way as if the site provided it as the source list of the Content-Security-Policy frame-ancestors directive. + For example, if https://example.com and https://www.example.com are the origins of the top page and intermediate iframes that embed a nested site-embedding iframe, and you fully trust those origins, you should set this property to https://example.com https://www.example.com. + + This property gives the app the ability to use iframe to embed sites that otherwise could not be embedded in an iframe in trusted app pages. + This could potentially subject the embedded sites to [Clickjacking](https://wikipedia.org/wiki/Clickjacking) attack from the code running in the embedding web page. Therefore, you should only set this property with origins of fully trusted embedding page and any intermediate iframes. + Whenever possible, you should use the list of specific origins of the top and intermediate frames instead of wildcard characters for this property. + This API is to provide limited support for app scenarios that used to be supported by <webview> element in other solutions like JavaScript UWP apps and Electron. + You should limit the usage of this property to trusted pages, and specific navigation target url, by checking the , and . + + This property is ignored for top level document navigation. + + + + + Gets the navigation kind of the navigation. + + + + + Event args for the event. + + + Event args for the event. + + + + + true when the navigation is successful; false for a navigation that ended up in an error page (failures due to no network, DNS lookup failure, HTTP server responds with 4xx). Note that WebView2 will report the navigation as 'unsuccessful' if the load for the navigation did not reach the expected completion for any reason. Such reasons include potentially catastrophic issues such network and certificate issues, but can also be the result of intended actions such as the app canceling a navigation or navigating away before the original navigation completed. Applications should not just rely on this flag, but also consider the reported WebErrorStatus to determine whether the failure is indeed catastrophic in their context. + + + WebErrorStatuses that may indicate a non-catastrophic failure include: + + + + + + + + + + + + + + This may also be false for additional scenarios such as window.stop() run on navigated page. + + + + + Gets the error code if the navigation failed. + + + + + Gets the ID of the navigation. + + + + + The HTTP status code of the navigation if it involved an HTTP request. For instance, this will usually be 200 if the request was successful, 404 if a page was not found, etc. See https://developer.mozilla.org/docs/Web/HTTP/Status for a list of common status codes. + + + The HttpStatusCode property will be 0 in the following cases: + + + The navigation did not involve an HTTP request. For instance, if it was a navigation to a file:// URL, or if it was a same-document navigation. + + + The navigation failed before a response was received. For instance, if the hostname was not found, or if there was a network error. + + + In those cases, you can get more information from the and properties. + + If the navigation receives a successful HTTP response, but the navigated page calls window.stop() before it finishes loading, then HttpStatusCode may contain a success code like 200, but will be false and will be . + + Since WebView2 handles HTTP continuations and redirects automatically, it is unlikely for HttpStatusCode to ever be in the 1xx or 3xx ranges. + + + + + Event args for the event. + + + + + Gets the reason for WebView to raise the event. + + + + + Indicates whether the event has been handled by the app. + + + If the app has moved the focus to another desired location, it should set Handled property to true. When Handled property is false after the event handler returns, default action is taken. The default action is to try to find the next tab stop child window in the app and try to move focus to that window. If no other window exists to move focus, focus is cycled within the web content of the WebView. + + + + + Event args for the event. + + + + + Gets the URI with the external URI scheme to be launched. + + + + + Gets the origin initiating the external URI scheme launch. If the `InitiatingOrigin` is [opaque](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque), the `InitiatingOrigin` reported in the event args will be its precursor origin. The precursor origin is the origin that created the opaque origin. For example, if a frame on example.com opens a subframe with a different opaque origin, the subframe's precursor origin is example.com. + + + The origin will be an empty string if the request is initiated by calling on the external URI scheme. If a script initiates the navigation, the `InitiatingOrigin` will be the top-level document's `Source`, i.e. if `window.location` is set to `"calculator://", the `InitiatingOrigin` will be set to `calculator://`. If the request is initiated from a child frame, the `InitiatingOrigin` will be the source of that child frame. + + + + + true when the launching external URI scheme request was initiated through a user gesture. + + + + + Determines whether to cancel the navigation. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the launching external URI scheme request at a later time. + + + + + Provides a set of properties for a frame in the . + + + Provides a set of properties for a frame in the . + + + + + Gets the value of frame's window.name property. The default value equals to frame html tag declaring it, as in <iframe name="frame-name" ...>. + + + The returned string is empty when the frame has no name attribute and no assigned value for window.name. + + + + + The URI of the document in the frame. + + + + + This parent frame's . ParentFrameInfo will only be populated when obtained via calling . objects obtained via will always have a null ParentFrameInfo. This property is also null for the top most document in the which has no parent frame. + + + ParentFrameInfo could be out of date as it's a snapshot. + + + + + The unique identifier of the frame associated with the current . It's the same kind of ID as with the and . FrameId will only be populated when obtained calling . objects obtained via will always have an invalid frame Id 0. + + + FrameId could be out of date as it's a snapshot. If there's created or destroyed or event or event after the asynchronous call starts, you may want to call the asynchronous method again to get the updated s. + + + + + Gets the kind of the frame. FrameKind will only be populated when obtained calling . ` objects obtained via will always have the default value . + + + FrameKind could be out of date as it's a snapshot. + + + + + Event args for the event. + + + + + Gets the created frame. + + + + + + Representation of a DOM [FileSystemHandle](https://developer.mozilla.org/docs/Web/API/FileSystemHandle) object. + + + + + The kind of the FileSystemHandle. It can either be a file or a directory. + + + + + The path to the FileSystemHandle. + + + + + The permissions granted to the FileSystemHandle. + + + + + Representation of a DOM[File](https://developer.mozilla.org/docs/Web/API/File) object passed via WebMessage. + + + You can use this object to obtain the path of a File dropped on WebView2. + + + + + The absolute file path. + + + + + The result for . + + + + + This property is true if successfully executed script with no unhandled exceptions and the result is available in the property. + + + + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. + + + + + If Succeeded is false, you can use this property to get the unhandled exception thrown by script execution + + + + + If Succeeded is true and the result of script execution is a string, this method provides the value of the string result, and we will get the false var value when the js result is not string type. + + + + + Event args for the event. + + + + + Returns the for the download that has started. + + + + + Indicates whether to cancel the download. + + + If canceled, the download save dialog is not displayed regardless of the value and the state is changed to with interrupt reason . + + + + + The path to the file. + + + If setting the path, the host should ensure that it is an absolute path, including the file name, and that the path does not point to an existing file. If the path points to an existing file, the file will be overwritten. If the directory does not exist, it is created. + + + + + Indicates whether to hide the default download dialog. + + + If set to true, the default download dialog is hidden for this download. The download progresses normally if it is not canceled, there will just be no default UI shown. By default the value is false and the default download dialog is shown. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + Gets the ID of the navigation. + + + + + A Receiver is created for a particular DevTools Protocol event and allows you to subscribe and unsubscribe from that event. + + + Obtained from the WebView object using . + + + + + + DevToolsProtocolEventReceived is raised when the corresponding DevToolsProtocol event is raised. + + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the parameter object of the corresponding DevToolsProtocol event represented as a JSON string. + + + + + Gets the sessionId of the target where the event originates from. Empty string is returned as sessionId if the event comes from the default session for the top page. + + + + + Represents the information regarding the context menu target. Includes the context selected and the appropriate data used for the actions of a context menu. + + + + + Gets the kind of context that the user selected as . + + + + + Returns true if the context menu is requested on an editable component. + + + + + Returns true if the context menu was requested on the main frame and false if invoked on another frame. + + + + + Gets the uri of the page. + + + + + Gets the uri of the frame. Will match the if is true. + + + + + Returns true if the context menu is requested on HTML containing an anchor tag. + + + + + Gets the uri of the link (if is true, null otherwise). + + + + + Returns true if the context menu is requested on text element that contains an anchor tag. + + + + + Gets the text of the link (if is true, null otherwise). + + + + + Returns true if the context menu is requested on HTML containing a source uri. + + + + + Gets the active source uri of element (if is true, null otherwise). + + + + + Returns true if the context menu is requested on a selection. + + + + + Gets the selected text (if is true, null otherwise). + + + + + Event args for the event. + + + Will contain the selection information and a collection of all of the default context menu items that the WebView would show. Allows the app to draw its own context menu or add/remove from the default context menu. + + + + + Gets the collection of objects. + + + + + Gets the target information associated with the requested context menu. + + + + + + Gets the coordinates where the context menu request occurred in relation to the upper left corner of the WebView bounds. + + + + + Gets or sets the selected 's . + + + When the app handles the event, it can set this to report the selected command from the context menu. The default value is -1 which means that no selection occurred. The app can also set the command ID for a custom context menu item, which will cause the event to be fired, however while command IDs for each custom context menu item is unique during a ContextMenuRequested event, WebView may reassign command ID values of deleted custom ContextMenuItems to new objects and the command ID assigned to the same custom item can be different between each app runtime. The command ID should always be obtained via the property. + + + + + Gets or sets whether the event is handled by host after the event handler completes or after the deferral is completed if there is a taken . + + + If Handled is set to true then WebView2 will not display a context menu and will instead use the property to indicate which, if any, context menu item to invoke. If after the event handler or deferral completes, Handled is set to false then WebView will display a context menu based on the contents of the property. The default value is false. + + + + + Returns a object. + + + Use this operation to complete the event when the custom context menu is closed. + + + + + Represents a context menu item of a context menu displayed by WebView. + + + + + Gets the unlocalized name for the . + + + Use this to distinguish between context menu item types. This will be the English label of the menu item in lower camel case. For example, the "Save as" menu item will be "saveAs". Extension menu items will be "extension", custom menu items will be "custom" and spellcheck items will be "spellCheck". + Some example context menu item names are: + + + + "saveAs" + + + "copyImage" + + + "openLinkInNewWindow" + + + + + + + Gets the localized label for the . Will contain an ampersand for characters to be used as keyboard accelerator. + + + + + Gets the Command ID for the . + + + Use this to report the in event. + + + + + Gets the localized keyboard shortcut for this . + + + It will be the empty string if there is no keyboard shortcut. This is text intended to be displayed to the end user to show the keyboard shortcut. For example this property is Ctrl+Shift+I for the "Inspect" . + + + + + Gets the Icon for the in PNG, Bitmap or SVG formats in the form of an IStream. + + + Stream will be rewound to the start of the image data before being read. + + + + + Gets the kind of as . + + + + + Gets or sets the enabled property of the . Must only be used in the case of a custom context menu item. + + + The default value for this is true. + + + + + Gets or sets the checked property of the . + + + Must only be used for custom context menu items that are of kind or . + + + + + Gets the list of children menu items if the kind is . + + + If the kind is not , will return null. + + + + + CustomItemSelected event is raised when the user selects this . + + + Will only be raised for end developer created context menu items. + + + + + Event args for the event. + + + + + true if the loaded content is an error page. + + + + + Gets the ID of the navigation. + + + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + + + Gets or sets the root visual in the hosting app's visual tree. + + + This visual is where the WebView will connect its visual tree. The app uses this visual to position the WebView within the app. The app still needs to use the property to size the WebView. The RootVisualTarget property can be an IDCompositionVisual or a Windows::UI::Composition::ContainerVisual. WebView will connect its visual tree to the provided visual before returning from the property setter. The app needs to commit on its device setting the RootVisualTarget property. The RootVisualTarget property supports being set to null to disconnect the WebView from the app's visual tree. + + + + + Gets the current cursor that WebView thinks it should be. + + + The cursor should be set in WM_SETCURSOR through Mouse.SetCursor or set on the corresponding parent/ancestor HWND of the WebView through ::SetClassLongPtr. The HCURSOR can be freed so CopyCursor/DestroyCursor is recommended to keep your own copy if you are doing more than immediately setting the cursor. + + + + + Gets the current system cursor ID reported by the underlying rendering engine for WebView. + + + + + The event is raised when WebView thinks the cursor should be changed. + + + For example, when the mouse cursor is currently the default cursor but is then moved over text, it may try to change to the IBeam cursor. + It is expected for the developer to send messages (in addition to messages) through . This is to ensure that the mouse is actually within the WebView that sends out CursorChanged events. + + + + + Sends mouse input to the WebView. + + The mouse event kind. + The virtual keys associated with the eventKind. + The amount of wheel movement. + The absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the eventKind. + + If eventKind is or , then mouseData specifies the amount of wheel movement. + A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120. If eventKind is , , or , then mouseData specifies which X buttons were pressed or released. This value should be 1 if the first X button is pressed/released and 2 if the second X button is pressed/released. If eventKind is , then virtualKeys, mouseData, and point should all be zero. If eventKind is any other value, then mouseData should be zero. point is expected to be in the client coordinate space of the WebView. To track mouse events that start in the WebView and can potentially move outside of the WebView and host application, calling SetCapture and ReleaseCapture is recommended. To dismiss hover popups, it is also recommended to send messages. + + + + + Sends pen or pointer input to the WebView. + + The pointer event kind. + The pointer information. + + Accepts touch or pen pointer input of kinds defined in . + Any pointer input from the system must be converted into a first. + + + + + Call this method to inform the CoreWebView2CompositionController that a drag operation has left the WebView. + + + Corresponds to the [ICoreDropOperationTarget.LeaveAsync](/uwp/api/windows.applicationmodel.datatransfer.dragdrop.core.icoredropoperationtarget.leaveasync) method when performing a drag operation into the WebView. + + + + + This event is raised when elements on the page with "app-region" CSS property values corresponding to non-client regions change. Use the to see the kind of non-client region that changed. + + + + + Call this method to perform hit-testing inside of your message loop when the message is WM_NCHITTEST. + + The point parameter is expected to be in the client coordinate space of the WebView2. + The type of region which contains the point. + + + + This method retrieves the non-client regions on the page which corresponds to a given kind . + + The kind of non-client region. + This method returns a vector of rectangles. + + This method can be used inside the event handler to get the list of rects for the specific region that changed. + + + + + Event args for the event. + + + + + Returns host name of the server that requested client certificate authentication. + + + Normalization rules applied to the hostname are: + + + + Convert to lowercase characters for ascii characters. + + + Punycode is used for representing non ascii characters. + + + Strip square brackets for IPV6 address. + + + + + + + Returns port of the server that requested client certificate authentication. + + + + + Returns true if the server that issued this request is an http proxy. Returns false if the server is the origin server. + + + + + The list contains Base64 encoding of DER encoded distinguished names of certificate authorities allowed by the server. + + + + + Returns the list of when client certificate authentication is requested. The list contains mutually trusted CA certificate. + + + + + Selected certificate to respond to the server. + + + + + Indicates whether to cancel the certificate selection. + + + If canceled, the request is aborted regardless of the property. By default the value is false. + + + + + Indicates whether the event has been handled by host. + + + Set to true to respond to the server with or without a certificate. If this flag is true with a it responds to the server with the selected certificate otherwise respond to the server without a certificate. By default the value of and are false and display default client certificate selection dialog prompt to allow the user to choose a certificate. The is ignored unless is set to true. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + The kind of browser process exit that has occurred. + + + + + The process ID of the browser process that has exited. + + + + + Browser extension installed on current profile. + + + + + This is the browser extension's ID. This is the same browser extension ID returned by the browser extension API [chrome.runtime.id](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/id). Please see that documentation for more details on how the ID is generated. After an extension is removed, calling Id will return the id of the extension that is removed. + + + + + This is the browser extension's name. This value is defined in this browser extension's manifest.json file. If manifest.json define extension's localized name, this value will be the localized version of the name. Please see [Manifest.json name](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/manifest.json/name) for more details. + + + + + If IsEnabled is true then the Extension is enabled and running in WebView instances. If it is false then the Extension is disabled and not running in WebView instances. When a Extension is first installed, IsEnable are default to be true. IsEnabled is persisted per profile. After an extension is removed, calling IsEnabled will return the value at the time it was removed. + + + + + Removes this browser extension from its WebView2 Profile. The browser extension is removed immediately including from all currently running HTML documents associated with this WebView2 Profile. The removal is persisted and future uses of this profile will not have this extension installed. After an extension is removed, calling Remove again will cause an exception. + + + + + Sets whether this browser extension is enabled or disabled. This change applies immediately to the extension in all HTML documents in all WebView2s associated with this profile. After an extension is removed, calling Enable will not change the value of IsEnabled. + + + + + Represents a Basic HTTP authentication response that contains a user name and a password as according to RFC7617 (https://tools.ietf.org/html/rfc7617) + + + + + User name provided for authentication. + + + + + Password provided for authentication. + + + + + Event args for the BasicAuthenticationRequested event. Will contain the request that led to the HTTP authorization challenge, the challenge and allows the host to provide authentication response or cancel the request. + + + + + The URI that led to the authentication challenge. For proxy authentication requests, this will be the URI of the proxy server. + + + + + The authentication challenge string. + + + + + Response to the authentication request with credentials. + + + This object will be populated by the app if the host would like to provide authentication credentials. + + + + + Indicates whether to cancel the authentication request. + + + false by default. If set to true, Response will be ignored. + + + + + Gets a object. + + + Use this Deferral to defer the decision to show the Basic Authentication dialog. + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the key event kind that caused the event to run. + + + + + Gets the Win32 virtual key code of the key that was pressed or released. + + + It is one of the Win32 virtual key constants such as VK_RETURN or an (uppercase) ASCII value such as 'A'. Verify whether Ctrl or Alt are pressed by running GetKeyState(VK_CONTROL) or GetKeyState(VK_MENU). + + + + + Gets the LPARAM value that accompanied the window message. + + + See the documentation for the WM_KEYDOWN and WM_KEYUP messages. + + + + + Gets a representing the information passed in the LPARAM of the window message. + + + + + Indicates whether the event is handled by host. + + + + For browser accelerator keys, when an accelerator key is pressed, the propagation and processing order is: + + 1. A CoreWebView2Controller.AcceleratorKeyPressed event is raised + 1. WebView2 browser feature accelerator key handling + 1. Web Content Handling: If the key combination isn't reserved for browser actions, the key event propagates to the web content, where JavaScript event listeners can capture and respond to it. + + If `Handled` property is set to true anywhere along the path, the event propagation stops, and web content will not receive the key and this prevents the WebView from performing the default action for this accelerator key. Otherwise the WebView will perform the default action for the accelerator key. + + + + + This `IsBrowserAcceleratorKeyEnabled` property allows developers to control whether the browser handles accelerator keys such as Ctrl+P or F3, etc. + + + The `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` API is a convenient setting for developers to disable all the browser accelerator keys together. This setting also sets the default value for the `IsBrowserAcceleratorKeyEnabled` property. + + By default, `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` is `TRUE` and `IsBrowserAcceleratorKeyEnabled` is `TRUE`. When developers change `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting to `FALSE`, this will change default value for `IsBrowserAcceleratorKeyEnabled` to `FALSE`. If developers want specific keys to be handled by the browser after changing the `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting to `FALSE`, they need to enable these keys by setting `IsBrowserAcceleratorKeyEnabled` to `TRUE`. + + The `CoreWebView2Controller.AcceleratorKeyPressed` event is raised any time an accelerator key is pressed, regardless of whether accelerator keys are enabled or not. + + This API will give the event arg higher priority over the `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting when we handle the keys. + + With `IsBrowserAcceleratorKeyEnabled` property, if developers mark `IsBrowserAcceleratorKeyEnabled` as `FALSE`, the browser will skip the WebView2 browser feature accelerator key handling process, but the event propagation continues, and web content will receive the key combination. + + This property does not disable accelerator keys related to movement and text editing, such as: + - Home, End, Page Up, and Page Down + - Ctrl-X, Ctrl-C, Ctrl-V + - Ctrl-A for Select All + - Ctrl-Z for Undo + + +
+
diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.WinForms.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.WinForms.dll new file mode 100644 index 0000000..b2d08ad Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.WinForms.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.WinForms.xml b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.WinForms.xml new file mode 100644 index 0000000..5b005e1 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.WinForms.xml @@ -0,0 +1,504 @@ + + + + Microsoft.Web.WebView2.WinForms + + + + + This class is a bundle of the most common parameters used to create and instances. + Its main purpose is to be set to in order to customize the environment and/or controller used by a during implicit initialization. + + + This class isn't intended to contain all possible environment or controller customization options. + If you need complete control over the environment and/or controller used by a WebView2 control then you'll need to initialize the control explicitly by + creating your own environment (with ) and/or controller options (with ) and passing them to + *before* you set the property to anything. + See the class documentation for an initialization overview. + + + + + Creates a new instance of with default data for all properties. + + + + + Gets or sets the value to pass as the browserExecutableFolder parameter of when creating an environment with this instance. + + + + + Gets or sets the value to pass as the userDataFolder parameter of when creating an environment with this instance. + + + + + Gets or sets the value to use for the Language property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + Gets or sets the value to use for the ProfileName property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Gets or sets the value to pass as the AdditionalBrowserArguments parameter of which is passed to when creating an environment with this instance. + + + + + Gets or sets the value to use for the IsInPrivateModeEnabled property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Create a using the current values of this instance's properties. + + A task which will provide the created environment on completion, or null if no environment-related options are set. + + As long as no other properties on this instance are changed, repeated calls to this method will return the same task/environment as earlier calls. + If some other property is changed then the next call to this method will return a different task/environment. + + + + + Creates a using the current values of this instance's properties. + + A object or null if no controller-related properties are set. + Thrown if the parameter environment is null. + + + + Control to embed WebView2 in WinForms. + + + + + Create a new WebView2 WinForms control. + After construction the property is null. + Call to initialize the underlying . + + + This control is effectively a wrapper around the WebView2 COM API, which you can find documentation for here: https://aka.ms/webview2 + You can directly access the underlying ICoreWebView2 interface and all of its functionality by accessing the property. + Some of the most common COM functionality is also accessible directly through wrapper methods/properties/events on the control. + + Upon creation, the control's CoreWebView2 property will be null. + This is because creating the CoreWebView2 is an expensive operation which involves things like launching Edge browser processes. + There are two ways to cause the CoreWebView2 to be created: + 1) Call the method. This is referred to as explicit initialization. + 2) Set the property. This is referred to as implicit initialization. + Either option will start initialization in the background and return back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass your own to EnsureCoreWebView2Async or set the control's property prior to initialization. + + When initialization has finished (regardless of how it was triggered) then the following things will occur, in this order: + 1) The control's event will be invoked. If you need to perform one time setup operations on the CoreWebView2 prior to its use then you should do so in a handler for that event. + 2) If a Uri has been set to the property then the control will start navigating to it in the background (i.e. these steps will continue without waiting for the navigation to finish). + 3) The Task returned from will complete. + + For more details about any of the methods/properties/events involved in the initialization process, see its specific documentation. + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + + + + Cleans up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Overrides the base OnPaint event to have custom actions + in designer mode + + The graphics devices which is the source + + + + Overrides the base WndProc events to handle specific window messages. + + The Message object containing the HWND window message and parameters + + + + Gets or sets a bag of options which are used during initialization of the control's . + This property cannot be modified (an exception will be thrown) after initialization of the control's CoreWebView2 has started. + + Thrown if initialization of the control's CoreWebView2 has already started. + + + + Explicitly trigger initialization of the control's . + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass null (the default value) then a default environment will be created and used automatically. + + + A pre-created that should be used to create the . + Creating your own controller options gives you control over several options that affect how the is initialized. + If you pass a controllerOptions to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default controllerOptions will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes + or on exceptions. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + The following summarizes the possible error values and a description of why these errors occur. + + + Error Value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + *\\Edge\\Application* path used in browserExecutableFolder. + + + HRESULT_FROM_WIN32(ERROR_INVALID_STATE) + Specified options do not match the options of the WebViews that are currently running in the shared browser process. + + + HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) + WebView2 Initialization failed due to an invalid host HWND parentWindow. + + + HRESULT_FROM_WIN32(ERROR_DISK_FULL) + WebView2 Initialization failed due to reaching the maximum number of installed runtime versions. + + + HRESULT_FROM_WIN32(ERROR_PRODUCT_UNINSTALLED + If the Webview depends upon an installed WebView2 Runtime version and it is uninstalled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Could not find Edge installation. + + + HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) + User data folder cannot be created because a file with the same name already exists. + + + E_ACCESSDENIED + Unable to create user data folder, Access Denied. + + + E_FAIL + Edge runtime unable to start. + + + + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if this instance of is already disposed, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Explicitly trigger initialization of the control's . + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass null then a default environment will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes + or on exceptions. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if this instance of is already disposed, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + This is the private function which implements the actual background initialization task. + Cannot be called if the control is already initialized or has been disposed. + + + The environment to use to create the . + If that is null then a default environment is created with and its default parameters. + + + The controllerOptions to use to create the . + If that is null then a default controllerOptions is created with its default parameters. + + A task representing the background initialization process. + All the event handlers added here need to be removed in . + + + + Protected CreateParams property. Used to set custom window styles to the forms HWND. + + + + + Protected VisibilityChanged handler. + + + + + Protected SizeChanged handler. + + + + + Protected Select method: override this to capture tab direction when WebView control is activated + + + + + Protected OnGotFocus handler. + + + + + Protected OnParentChanged handler. + + + + + True if initialization finished successfully and the control is not disposed yet. + + + + + Recursive retrieval of the parent control + + The control to get the parent for + The root parent control + + + + The underlying CoreWebView2. Use this property to perform more operations on the WebView2 content than is exposed + on the WebView2. This value is null until it is initialized and the object itself has undefined behaviour once the control is disposed. + You can force the underlying CoreWebView2 to + initialize via the method. + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + + + + The zoom factor for the WebView. + + + + + Enable/disable external drop. + + + + + The Source property is the URI of the top level document of the + WebView2. Setting the Source is equivalent to calling . + Setting the Source will trigger initialization of the , if not already initialized. + The default value of Source is null, indicating that the is not yet initialized. + + Specified value is not an absolute . + Specified value is null and the control is initialized. + + + + + Returns true if the webview can navigate to a next page in the + navigation history via the method. + This is equivalent to the . + If the underlying is not yet initialized, this property is false. + + + + + + Returns true if the webview can navigate to a previous page in the + navigation history via the method. + This is equivalent to the . + If the underlying is not yet initialized, this property is false. + + + + + + The default background color for the WebView. + + + + + Executes the provided script in the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Reloads the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Navigates to the next page in navigation history. + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + Navigates to the previous page in navigation history. + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + Renders the provided HTML as the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + + Stops any in progress navigation in the . + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + This event is triggered either 1) when the control's has finished being initialized (regardless of how it was triggered or whether it succeeded) but before it is used for anything + OR 2) the initialization failed. + You should handle this event if you need to perform one time setup operations on the CoreWebView2 which you want to affect all of its usages + (e.g. adding event handlers, configuring settings, installing document creation scripts, adding host objects). + + + This sender will be the WebView2 control, whose CoreWebView2 property will now be valid (i.e. non-null) for the first time + if is true. + Unlikely this event can fire second time (after reporting initialization success first) + if the initialization is followed by navigation which fails. + + + + + NavigationStarting dispatches before a new navigate starts for the top + level document of the . + This is equivalent to the event. + + + + + + NavigationCompleted dispatches after a navigate of the top level + document completes rendering either successfully or not. + This is equivalent to the event. + + + + + + WebMessageReceived dispatches after web content sends a message to the + app host via chrome.webview.postMessage. + This is equivalent to the event. + + + + + + SourceChanged dispatches after the property changes. This may happen + during a navigation or if otherwise the script in the page changes the + URI of the document. + This is equivalent to the event. + + + + + + ContentLoading dispatches after a navigation begins to a new URI and the + content of that URI begins to render. + This is equivalent to the event. + + + + + + ZoomFactorChanged dispatches when the property changes. + This is equivalent to the event. + + + + + + Required designer variable. + + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Wpf.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Wpf.dll new file mode 100644 index 0000000..ed79cd9 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Wpf.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Wpf.xml b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Wpf.xml new file mode 100644 index 0000000..c6e27b6 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Microsoft.Web.WebView2.Wpf.xml @@ -0,0 +1,1932 @@ + + + + Microsoft.Web.WebView2.Wpf + + + + + This class is a bundle of the most common parameters used to create and instances. + Its main purpose is to be set to in order to customize the environment and/or controller used by a during implicit initialization. + It is also a nice WPF integration utility which allows commonly used environment/controller parameters to be dependency properties and be created and used in markup. + + + This class isn't intended to contain all possible environment or controller customization options. + If you need complete control over the environment and/or controller used by a WebView2 control then you'll need to initialize the control explicitly by + creating your own environment (with ) and/or controller options (with ) and passing them to + *before* you set the property to anything. + See the class documentation for an initialization overview. + + + + + Creates a new instance of with default data for all properties. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to pass as the browserExecutableFolder parameter of when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to pass as the userDataFolder parameter of when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the Language property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the AdditionalBrowserArguments property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the AreBrowserExtensionsEnabled property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the ProfileName property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the IsInPrivateModeEnabled property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the ScriptLocale property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Create a using the current values of this instance's properties. + + A task which will provide the created environment on completion, or null if no environment-related options are set. + + As long as no other properties on this instance are changed, repeated calls to this method will return the same task/environment as earlier calls. + If some other property is changed then the next call to this method will return a different task/environment. + + + + + Create a using the current values of this instance's properties. + + A object or null if no controller-related properties are set. + Thrown if the parameter environment is null. + + + + This class provides helper methods for working with Direct3D in the WebView2 WPF control. + It includes methods for creating Direct3D9 and Direct3D11 devices, creating textures, + copying resources, and getting shared handles, among others. These methods are used in + the GraphicsItemD3DImage class to interact with Direct3D objects and resources. + + + The class includes PInvoke declarations for calling Direct3D functions from unmanaged code. + It also defines several COM interfaces and structures necessary for interacting with + Direct3D objects. + Note: This class is intended for internal use by the WebView2 WPF control and should not + be used directly by application developers. + + + + + This Class is a capturing the content of the provided (the WebView2 visual). + + + + + Tracks the conditions which block implicit initialization and whether it has been requested or not. + The analogy is a set of gates which are either open (implicit init allowed) or closed (will have to wait). + All sub-gates must be open before implicit init can proceed. + If implicit init is requested while the gate is open then it happens immediately. + If it's requested while the gate is closed then it occurs when the gate becomes open. + + + It should be reasonably straight-forward to expand this class in the future to: + * add new sub-gates to further restrict when implicit initialization can occur + * support storing and invoking multiple actions next time the gate is open instead of only one + + + + + Tracks whether a sub-gate regarding / is open or closed. + This sub-gate is only closed after calls to `BeginInit` and before an equal number of calls to `EndInit`. + + + We don't want implicit initialization to occur in between those calls, + because implicit initialization is a side effect of setting the Source property, + and side effects of setting properties during that period are supposed to be delayed until `EndInit`. + + + + + How many times has been called without being called. + + + + + Tracks whether a sub-gate regarding is open or closed. + This sub-gate is closed if `SynchronizationContext.Current == null`. + + + Initialization won't work without a `SynchronizationContext` because otherwise an `await` might resume on a different thread. + As far as I know so far this only occurs before an event loop as started on the running thread. + Once there's an event loop running the `SynchronizationContext` ensures that `await`s resume in the same event loop (i.e. same thread). + Although it's a rare corner case, it's possible to create a `Window` w/ `WebView2` before an app's event loop starts. + This sub-gate handles that corner case. + + + + + An action which will trigger initialization next time the gate is open (and only once). + + + This basically tracks whether or not implicit initialization has been requested while the gate is closed. + If this is non-null then it should be a delegate that calls . + + + + + Closes the gate until is called an equal number of times. + + + + + Opens the gate closed by after being called the same number of times. + + + + + A handler that should be attached to an event which indicates that exists. + The best one I know of right now is . + When the handler is called, the gate will re-evaluate its state and potentially allow any pending initialization action. + + + + + Run a given action when the gate is open. + + + If the gate is currently open then the action runs immediately. + Otherwise the action runs next time the gate is discovered to be open. + The action is only ever run once; it will not run again a second/subsequent time the gate opens. + If the gate is closed and another action is already pending then the new action *overwrites* the current one (i.e. the currently stored action will never run). + To "forget" a currently stored action, pass `null`. + + Action to run when the gate is open, or null to clear a previously specified action. + + + + Examine our overall open/closed state and run any pending action if appropriate. + + + + + The public interfaces of WebView2 WPF control. + + + + + Gets or sets a bag of options which are used during initialization of the control's . + Setting this property will not work after initialization of the control's has started (the old value will be retained). + See the class documentation for an initialization overview. + + + + + + Accesses the complete functionality of the underlying COM API. + Returns null until initialization has completed. + See the class documentation for an initialization overview. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + The event is raised when the property changes. + This event directly exposes . + + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + This event is triggered either + 1) when the control's has finished being initialized (regardless of how initialization was triggered) but before it is used for anything, or + 2) if the initialization failed. + You should handle this event if you need to perform one time setup operations on the which you want to affect all of its usages. + (e.g. adding event handlers, configuring settings, installing document creation scripts, adding host objects). + See the class documentation for an initialization overview. + + + This sender will be the control, whose property will now be valid (i.e. non-null) for the first time + if is true. + Unlikely this event can fire second time (after reporting initialization success first) + if the initialization is followed by navigation which fails. + + + + + + Explicitly triggers initialization of the control's . + See the class documentation for an initialization overview. + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass an environment to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default environment will be created and used automatically. + + + A pre-created that should be used to create the . + Creating your own controller options gives you control over several options that affect how the is initialized. + If you pass a controllerOptions to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default controllerOptions will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress, unless previous initialization has already failed. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + The following summarizes the possible error values and a description of why these errors occur. + + + Error Value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + *\\Edge\\Application* path used in browserExecutableFolder. + + + HRESULT_FROM_WIN32(ERROR_INVALID_STATE) + Specified options do not match the options of the WebViews that are currently running in the shared browser process. + + + HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) + WebView2 Initialization failed due to an invalid host HWND parentWindow. + + + HRESULT_FROM_WIN32(ERROR_DISK_FULL) + WebView2 Initialization failed due to reaching the maximum number of installed runtime versions. + + + HRESULT_FROM_WIN32(ERROR_PRODUCT_UNINSTALLED + If the Webview depends upon an installed WebView2 Runtime version and it is uninstalled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Could not find Edge installation. + + + HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) + User data folder cannot be created because a file with the same name already exists. + + + E_ACCESSDENIED + Unable to create user data folder, Access Denied. + + + E_FAIL + Edge runtime unable to start. + + + + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if is null, which probably indicates that the application's event loop hasn't started yet. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Explicitly triggers initialization of the control's . + See the class documentation for an initialization overview. + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass an environment to this method then it will override any settings specified on the property. + If you pass null and no value has been set to then a default environment will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress, unless previous initialization has already failed. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if is null, which probably indicates that the application's event loop hasn't started yet. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + The top-level which the WebView is currently displaying (or will display once initialization of its is finished). + Generally speaking, getting this property is equivalent to getting the property and setting this property (to a different value) is equivalent to calling the method. + + + Getting this property before the has been initialized will retrieve the last Uri which was set to it, or null (the default) if none has been. + Setting this property before the has been initialized will cause initialization to start in the background (if not already in progress), after which the will navigate to the specified . + This property can never be set back to null or to a relative . + See the class documentation for an initialization overview. + + Thrown if has already been called on the control. + Thrown if the property is set to null. + Thrown if the property is set to a relative (i.e. a whose property is false). + + + + + Returns true if the WebView can navigate to a previous page in the navigation history. + Wrapper around the property of . + If isn't initialized yet then returns false. + + + + + + Returns true if the WebView can navigate to a next page in the navigation history. + Wrapper around the property of . + If isn't initialized yet then returns false. + + + + + + The zoom factor for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was set to it, or 1.0 (the default) if none has been. + The most recent value set to this property before the CoreWebView2 has been initialized will be set on it after initialization. + + + + + + The default background color for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was + set to it, or Color.White (the default) if none has been. + The most recent value set to this property before CoreWebView2Controller has been initialized will be set on it after initialization. + + + + + The foreground color to be used in design mode. + + + + + The AllowExternalDrop property for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was + set to it, or true (the default) if none has been. + The most recent value set to this property before CoreWebView2Controller has been initialized will be set on it after initialization. + + + + + Navigates the WebView to the previous page in the navigation history. + Equivalent to calling + If hasn't been initialized yet then does nothing. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Navigates the WebView to the next page in the navigation history. + Equivalent to calling . + If hasn't been initialized yet then does nothing. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Reloads the current page. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Stops all navigations and pending resource fetches. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Initiates a navigation to htmlContent as source HTML of a new document. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + + + Executes JavaScript code from the javaScript parameter in the current top level document rendered in the WebView. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Attempts to set focus to the WebView2 Control. + Equivalent to calling . + Returns true if keyboard focus and logical focus were set to this element; + false if only logical focus was set to this element, or if the call to this method did not force the focus to change. + + + + + Defines internal operations specific to the WebView2 WPF control, separating the control-specific logic + that cannot be shared across different types of controls. + + + + + Initializes the WebView2 controller with operations specific to the control type. + + + + + Unregister controller's handlers specific to the control type. + + + + + A control to embed web content in a WPF application. + + + This control is effectively a wrapper around the [WebView2 COM API](https://aka.ms/webview2). + You can directly access the underlying + ICoreWebView2 interface and all of its functionality by accessing the + property. Some of the most common COM + functionality is also accessible directly through wrapper + methods/properties/events on the control. + + Upon creation, the control's property will be + null. This is because creating the is an + expensive operation which involves things like launching Edge browser + processes. There are two ways to cause the to + be created: + + + Call the method. This is + referred to as explicit initialization. + + + Set the property (which could be done from + markup, for example). This is referred to as implicit initialization. + Either option will start initialization in the background and return + back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass + your own to or set the control's property prior to initialization. + + + + When initialization has finished (regardless of how it was triggered or + whether it succeeded) then the following things will occur, in this + order: + + + The control's event + will be invoked. If you need to perform one time setup operations on + the prior to its use then you should + do so in a handler for that event. + + + If initialization was successful and a Uri has been set to the property then the control will start navigating to it in + the background (i.e. these steps will continue without waiting for the + navigation to finish). + + + The Task returned from will + complete. + + + + For more details about any of the methods/properties/events involved in + the initialization process, see its specific documentation. + + Because the control's is a very heavyweight + object (potentially responsible for multiple running processes and + megabytes of disk space) the control implements to provide an explicit means to free it. + Calling will release the + and its underlying resources (except any that are also being used by other + WebViews), and reset to null. After has been called the cannot be + re-initialized, and any attempt to use functionality which requires it + will throw an . + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + Note that this control extends in order to embed + windows which live outside of the WPF ecosystem. This has some + implications regarding the control's input and output behavior as well as + the functionality it "inherits" from and . + See the and [WPF/Win32 interop](/dotnet/framework/wpf/advanced/wpf-and-win32-interoperation#hwnds-inside-wpf) + documentation for more information. + + + + + + Creates a new instance of a WebView2 control. + Note that the control's will be null until initialized. + See the class documentation for an initialization overview. + + + + + The WPF which backs the property. + + + + + + + + + This is overridden from and is called to instruct us to create our HWND. + + The HWND that we should use as the parent of the one we create. + The HWND that we created. + + + + + This is overridden from and is called to instruct us to destroy our HWND. + + Our HWND that we need to destroy. + + + + + This is overridden from and is called to provide us with Win32 messages that are sent to our hwnd. + + Window receiving the message (should always match our ). + Indicates the message being received. See Win32 documentation for WM_* constant values. + The "wParam" data being provided with the message. Meaning varies by message. + The "lParam" data being provided with the message. Meaning varies by message. + If true then the message will not be forwarded to any (more) handlers. + Return value varies by message. + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + Override for painting to draw + + The tools to handle the drawing via . + + + + + + + + + + + + + + + + + + + + + + This is called by our base class according to the typical implementation of the pattern. + We implement it by releasing all of our underlying COM resources, including our . + + True if a caller is explicitly calling Dispose, false if we're being finalized. + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + Changes our controller's ParentWindow to the given HWND, along with any other necessary associated work. + + The new HWND to set as the controller's parent. IntPtr.Zero means that the controller will have no parent and the CoreWebView2 will be hidden. + Whether or not to call as required. Defaults to true. If you pass false then you should call it yourself if required. + + Reparenting the controller isn't necessarily as simple as changing its ParentWindow property, + and this method exists to ensure that any other work that needs to be done at the same time gets done. + The reason that SyncControllerWithParentWindow isn't baked directly into this method is because + sometimes we want to call the Sync functionality without necessarily reparenting (e.g. during initialization). + + + + + Syncs visual/windowing information between the controller and its parent HWND. + This should be called any time a new, non-null HWND is set as the controller's parent, + including when the controller is first created. + + + + + This is overridden from and called when our control's location has changed. + The HwndHost takes care of updating the HWND we created. + What we need to do is move our CoreWebView2 to match the new location. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + This is overridden from and is called to inform us that tabbing has caused the focus to move into our control/window. + Since WPF can't manage the transition of focus to a non-WPF HWND, it delegates the transition to us here. + So our job is just to place the focus in our external HWND. + + Information about how the focus is moving. + true to indicate that we handled the navigation, or false to indicate that we didn't. + + + + This is overridden from and called to allow us to handle key press input. + WPF should never actually call this in response to keyboard events because we're hosting a non-WPF window. + When our window has focus Windows will send the input directly to it rather than to WPF's top-level window and input system. + This override should only be called when we're explicitly forwarding accelerator key input from the CoreWebView2 to WPF (in CoreWebView2Controller_AcceleratorKeyPressed). + Even then, this KeyDownEvent is only triggered because our PreviewKeyDownEvent implementation explicitly triggers it, matching WPF's usual system. + So the process is: + + CoreWebView2Controller_AcceleratorKeyPressed + PreviewKeyDownEvent + KeyDownEvent + OnKeyDown + + . + + + + + See . + + + + + This is the "Preview" (i.e. tunneling) version of , so it actually happens first. + Like OnKeyDown, this will only ever be called if we're explicitly forwarding key presses from the CoreWebView2. + In order to mimic WPF's standard input handling, when we receive this we turn around and fire off the standard bubbling KeyDownEvent. + That way others in the WPF tree see the same standard pair of input events that WPF itself would have triggered if it were handling the key press. + + + + + + See . + + + + + The WPF which backs the property. + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True when we're in design mode and shouldn't create an underlying CoreWebView2. + + + + + The WPF which backs the property. + + + + + + + + + Design mode drawing content. + + + + + + + + + + + + + + + + + This is an event handler for our CoreWebView2's ProcessFailedEvent. + + + + + This is a "gate" which controls whether or not implicit initialization can occur. + If implicit initialization is triggered while the gate is closed, + then the initialization should be delayed until the gate opens. + When we want to trigger implicit initialization we route the call through this gate. + If the gate is open then the initialization will proceed. + If the gate is closed then it will remember to trigger the initialization when it opens. + + + + + Implementation of the ISupportInitialize pattern. + + + + + Implementation of the ISupportInitialize pattern. + + + + + Updates one of our dependency properties to match a new value from the . + It both sets the value and remembers (in _propertyChangingFromCore) that it came from the CoreWebView2 rather than the caller, + allowing the property's "on changed" handler to alter its behavior based on where the new value came from. + It's only intended to be called in a CoreWebView2 event handler that's informing us of a new property value. + It's basically just a wrapper around the inherited SetCurrentValue which also maintains _propertyChangingFromCore. + See the comments on for additional background info. + One more thing worth explicitly stating is that it wraps SetCurrentValue rather than SetValue, + in order to avoid overwriting any OneWay bindings that are set on the specified properties. + Check the link https://stackoverflow.com/q/4230698 for more information about the difference between SetValue and SetCurrentValue. + + The property to change due to an equivalent change in the CoreWebView2. + The new value from the CoreWebView2. + + + + Checks if a given property is currently being updated to match an equivalent change in the . + This method should only be called from a property's "on changed" handler; it has no meaning at any other time. + It is used to determine if the property is changing to match the CoreWebView2 or because the caller set it. + Usually this is used in order to decide if the new value needs to be propagated down to the CoreWebView2. + See the comments on for additional background info. + + The property to check. + True if the property is changing to match the CoreWebView2, or false if the property was changed by the caller. + + + + This is a handler for our base UIElement's IsVisibleChanged event. + It's predictably fired whenever IsVisible changes, and IsVisible reflects the actual current visibility status of the control. + We just need to pass this info through to our CoreWebView2Controller so it can save some effort when the control isn't visible. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls to validate a potential new Source value. + + + True if the value is valid, false if it is not. + If we return false then WPF should respond by throwing an . + + + Note that we unfortunately can't treat null as invalid here because null is valid prior to initialization. + + + + + This is a callback that WPF calls when the WPF Source property's value changes. + This might have been triggered by either: + 1) The caller set Source to programmatically trigger a navigation. + 2) The CoreWebView changed its own source and we're just updating the dependency property to match. + We use to distinguish the two cases. + + + + + + + + This is an event handler for our CoreWebView2's SourceChanged event. + Unsurprisingly, it fires when the CoreWebView2's source URI has been changed. + Note that there are two distinct triggers for this: + 1) The CoreWebView2 was told to navigate programmatically (potentially by us, see SourcePropertyChanged). + 2) The user interacted with the CoreWebView2, e.g. clicked a link. + In either of the above cases, this event might trigger several times due to e.g. redirection. + Aside from propagating to our own event, we just need to update our WPF Source property to match the CoreWebView2's. + + + + + + + + This is an event handler for our CoreWebView2's NavigationStarting event. + We just need to propagate the event to WPF. + + + + + + + + This is an event handler for our CoreWebView2's NavigationCompleted event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2's HistoryChanged event. + We're handling it in order to update our WPF CanGoBack and CanGoForward properties. + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + This is an event handler for our CoreWebView2Controller's MoveFocusRequested event. + It fires when the CoreWebView2Controller has focus but wants to move it elsewhere in the app. + E.g. this happens when the user tabs past the last item in the CoreWebView2 and focus needs to return to some other app control. + So our job is just to tell WPF to move the focus on to the next control. + Note that we don't propagate this event outward as a standard WPF routed event because we've implemented its purpose here. + If users of the control want to track focus shifting in/out of the control, they should use standard WPF events. + + + + + This is an event handler for our CoreWebView2Controller's GotFocus event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2Controller's LostFocus event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2Controller's AcceleratorKeyPressed event. + This is called to inform us about key presses that are likely to have special behavior (e.g. esc, return, Function keys, letters with modifier keys). + WPF can't detect this input because Windows sends it directly to the Win32 CoreWebView2Controller control. + We implement this by generating standard WPF key input events, allowing callers to handle the input in the usual WPF way if they want. + If nobody handles the WPF key events then we'll allow the default CoreWebView2Controller logic (if any) to handle it. + Of the possible options, this implementation should provide the most flexibility to callers. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF ZoomFactor property's value changes. + This might have been triggered by either: + 1) The caller set ZoomFactor to change the zoom of the CoreWebView2. + 2) The CoreWebView2 changed its own ZoomFactor and we're just updating the dependency property to match. + We use to distinguish the two cases. + + + + + + + + This is an event handler for our CoreWebView2Controller's ZoomFactorChanged event. + Unsurprisingly, it fires when the CoreWebView2Controller's ZoomFactor has been changed. + Note that there are two distinct triggers for this: + 1) The value was changed programmatically (potentially by us, see ZoomFactorPropertyChanged). + 2) The user interacted with the CoreWebView2, e.g. CTRL + Mouse Wheel. + Aside from propagating to our own event, we just need to update our WPF ZoomFactor property to match the CoreWebView2Controller's. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF DefaultBackgroundColor property's value changes. + Since CoreWebView2Controller does not update this property itself, this is only triggered by the + caller setting DefaultBackgroundColor. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF AllowExternalDrop property's value changes. + Since CoreWebView2Controller does not update this property itself, this is only triggered by the + caller setting AllowExternalDrop. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + + + + + + + + + + This is an event handler for our CoreWebView2's ContentLoading event. + We just need to propagate the event to WPF. + + + + + + + + + + + This is an event handler for our CoreWebView2's WebMessageReceived event. + We just need to propagate the event to WPF. + + + + + Moves focus to the CoreWebView2Controller according to the + + + + + This is an event handler for the event. + It is called to inform us when we receive the keyboard focus. + We handle this by passing the keyboard focus on to the underlying . + We never want to land in a state where our control actually has the keyboard focus. + + The control that received keyboard focus. + Arguments from the underlying GotKeyboardFocus event. + + For WebView2 control, it's actually possible for us to receive keyboard focus without this method being called. + One known case where that happens is when our parent window is deactivated while we have focus, then reactivated. + We handle that case in . + + + + + + Implementation of pattern. + Developers should never reach the WebView2Base class here. + + + + + Implementation of the pattern. + Should on be called during m_element's Dispose(). + When this is called, it means all resources releted to the control are disposed and we can safely remove the control from the dictionary. + + + + + Visual hosting version of the WebView2 control. + + + This control is effectively a wrapper around the [WebView2 COM + API](https://aka.ms/webview2). You can directly access the underlying + ICoreWebView2 interface and all of its functionality by accessing the + property. Some of the most common COM + functionality is also accessible directly through wrapper + methods/properties/events on the control. + + Upon creation, the control's property will be + null. This is because creating the is an + expensive operation which involves things like launching Edge browser + processes. There are two ways to cause the to + be created: + + + Call the method. This is + referred to as explicit initialization. + + + Set the property (which could be done from + markup, for example). This is referred to as implicit initialization. + Either option will start initialization in the background and return + back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass + your own to or set the control's property prior to initialization. + + + + When initialization has finished (regardless of how it was triggered or + whether it succeeded) then the following things will occur, in this + order: + + + The control's event + will be invoked. If you need to perform one time setup operations on + the prior to its use then you should + do so in a handler for that event. + + + If initialization was successful and a Uri has been set to the property then the control will start navigating to it in + the background (i.e. these steps will continue without waiting for the + navigation to finish). + + + The Task returned from will + complete. + + + + For more details about any of the methods/properties/events involved in + the initialization process, see its specific documentation. + + Because the control's is a very heavyweight + object (potentially responsible for multiple running processes and + megabytes of disk space) the control implements to provide an explicit means to free it. + Calling will release the + and its underlying resources (except any that are also being used by other + WebViews), and reset to null. After has been called the cannot be + re-initialized, and any attempt to use functionality which requires it + will throw an . + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + This control extends in order to host the image + displaying WebView's content using template. This has some + implications regarding the control's input and output behavior as well as + the functionality it "inherits" from and . + + The content of is rendered by an . + By default, of WebView2CompositionControl + is set to true. This can prevent the from becoming blurry at certain dimensions, + but it disables anti-aliasing. Set it to false if you want to keep the anti-aliasing. + + Note that the uses a [GraphicsCaptureSession](https://learn.microsoft.com/en-us/uwp/api/windows.graphics.capture.graphicscapturesession) + to capture the screen content from the underlying browser processes. + As such, you may experience lower framerates compared to the standard control, and DRM protected + content will fail to play or display properly. + + + + + + + TemplatePart Name constant for the Image used to represent WebView2. + + + + + Image control uses to display content of WebView2. + + + + + Component used to capture from WebView visual and work as source of Image. + + + + + interface. + + + + + Static constructor for the WebView2CompositionControl class. + + + This static constructor is responsible for overriding the default style key property + for instances of the WebView2CompositionControl class. It sets the metadata to use + the type of the WebView2CompositionControl as the default style key. + See href="https://learn.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.defaultstylekey?view=netframework-4.8.1"/> + + + + + Creates a new instance of a WebView2Composition control. + Note that the control's will be null until initialized. + See the class documentation for an initialization overview. + + + + + This is an event handler for WPF control's SizeChanged event. + We use CoreWebView2Controller.NotifyParentWindowPositionChanged to notify our browser our + size and relative location has changed. + + + + + This is an event handler for WPF control's LocationChange event. + We use CoreWebView2Controller.NotifyParentWindowPositionChanged to notify our browser our + position has changed. + + + + + Initialize the dispatcher queue. + + + + + This is an event handler for our CoreWebView2CompositionController's CursorChanged event. + We use CursorInteropHelper to Obtain a WPF Cursor from the provided Win32 Handle. + + + + + Send the pointer event to the WebView2 Control. + + + + + + This is an event handler for WPF control's OnTouchDown event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + This is an event handler for WPF control's OnTouchMove event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + This is an event handler for WPF control's OnTouchUp event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + Helper function to get the of the mouse event. + + + + + Send the mouse event to the WebView2 Control. + + + + + + This is an event handler for WPF control's OnMouseMove event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseDown event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseUp event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseWheel event. + We use CoreWebView2CompositionController.SendMouseInput to send the input to our browser. + + + + + This is an event handler for WPF control's OnMouseDoubleClick event. + We use CoreWebView2CompositionController.SendMouseInput to send the input to our browser. + + + + + The WPF which backs the property. + + + + + + + + + Override for painting to draw + + The tools to handle the drawing via . + + + + + + + + + + + + + + + + + + + + + + Implementation of the pattern. + This will release all of our underlying COM resources. + + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + WebView2Composition Control only needs IKeyboardInputSink:TabInto to get the direction of tab traversal. + KeyboardInputSite is not implemented by WebView2Composition. + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + This is an event handler for our CoreWebView2Controller's GotFocus event. + Used to record whether the control currently has focus. + + + + + This is an event handler for our CoreWebView2Controller's Lost event. + We just need to propagate the event to WPF. + + + + + IKeyboardInputSink:HasFocusWithin interface. + Whether WebView has focus. + + + + + IKeyboardInputSink:OnMnemonic interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:RegisterKeyboardInputSink interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:TabInto interface. + + + + + IKeyboardInputSink:TranslateAccelerator interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:TranslateChar interface. + Not implemented by WebView2. + + + + + This is overridden from and called to allow us to handle key press input. + WPF should never actually call this in response to keyboard events because the focus is on the controller's HWND. + When Controller's HWND has focus, WPF does not know the Controller's HWND belongs to this control, and the key event will not be fired for this control and WPF main window. + This override should only be called when we're explicitly forwarding accelerator key input from the CoreWebView2 to WPF (in CoreWebView2Controller_AcceleratorKeyPressed). + Even then, this KeyDownEvent is only triggered because our PreviewKeyDownEvent implementation explicitly triggers it, matching WPF's usual system. + So the process is: + + CoreWebView2Controller_AcceleratorKeyPressed + PreviewKeyDownEvent + KeyDownEvent + OnKeyDown + + . + + + + + See . + + + + + This is the "Preview" (i.e. tunneling) version of , so it actually happens first. + Like OnKeyDown, this will only ever be called if we're explicitly forwarding key presses from the CoreWebView2. + In order to mimic WPF's standard input handling, when we receive this we turn around and fire off the standard bubbling KeyDownEvent. + That way others in the WPF tree see the same standard pair of input events that WPF itself would have triggered if it were handling the key press. + + + + + + See . + + + + + The WPF which backs the property. + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + Gets or sets the divider for the rendering frame rate of the WebViewCompositionControl. + + + The FpsDivider property affects how the rendering frame rate is divided. For example, if the default rendering frame rate of the content is 60 frames + per second (fps), setting the FpsDivider to 2 reduces the frame rate to 30 fps. This property is useful for reducing the rendering load and improving + performance for scenarios where high frame rates are unnecessary. + + + + + This is a callback that WPF calls when our WPF FpsDivider property's value changes. + We implement it by setting the FpsDivider of the GraphicsItemD3DImage. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True when we're in design mode and shouldn't create an underlying CoreWebView2. + + + + + GeneratedInternalTypeHelper + + + + + CreateInstance + + + + + GetPropertyValue + + + + + SetPropertyValue + + + + + CreateDelegate + + + + + AddEventHandler + + + + diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Newtonsoft.Json.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Newtonsoft.Json.dll new file mode 100644 index 0000000..1ffeabe Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/Newtonsoft.Json.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/SQLitePCLRaw.batteries_v2.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/SQLitePCLRaw.batteries_v2.dll new file mode 100644 index 0000000..f9eb46b Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/SQLitePCLRaw.batteries_v2.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/SQLitePCLRaw.core.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/SQLitePCLRaw.core.dll new file mode 100644 index 0000000..556d40f Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/SQLitePCLRaw.core.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/SQLitePCLRaw.provider.e_sqlite3.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/SQLitePCLRaw.provider.e_sqlite3.dll new file mode 100644 index 0000000..a6df9a6 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/SQLitePCLRaw.provider.e_sqlite3.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/System.Diagnostics.EventLog.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/System.Diagnostics.EventLog.dll new file mode 100644 index 0000000..e557be3 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/System.Diagnostics.EventLog.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/System.IO.Packaging.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/System.IO.Packaging.dll new file mode 100644 index 0000000..eb95db7 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/System.IO.Packaging.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/System.ServiceProcess.ServiceController.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/System.ServiceProcess.ServiceController.dll new file mode 100644 index 0000000..db17a49 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/System.ServiceProcess.ServiceController.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Core.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Core.dll new file mode 100644 index 0000000..d623133 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Core.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Fonts.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Fonts.dll new file mode 100644 index 0000000..444918b Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Fonts.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Tokenization.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Tokenization.dll new file mode 100644 index 0000000..a9b3be9 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Tokenization.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Tokens.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Tokens.dll new file mode 100644 index 0000000..7595fb6 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.Tokens.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.dll new file mode 100644 index 0000000..3645736 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/UglyToad.PdfPig.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..44d0f9f Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..a1632f4 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..627e0ee Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..b61e51f Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..978a8c5 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..63bf11c Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..8d9d359 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..df9ea7a Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..2a25b9c Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..684d809 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..cc6d6e7 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..854d782 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..616ecb4 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..e891bc2 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..b7fe953 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..32556dc Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..57a8ac5 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..73f6fa8 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..7d5e6a4 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..17b7405 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..43ed17d Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..81616ed Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..e52fa1f Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..612e6d3 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..9cb9b2a Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..d1ed5fe Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..d15a8c4 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..ab8cdd4 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..502d945 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..7430dd9 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..d91b108 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..e8e36d4 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..9bb69ab Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..f0c807c Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..3ed1bfa Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..df8f097 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..8a6a381 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..d781956 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..fb0a161 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..a13868e Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..7046867 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..204c387 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..7f80e2d Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..c93af5a Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..22ea30e Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..9146026 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..15756a5 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..75fce24 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..7d62c1b Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..d8f7288 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a new file mode 100644 index 0000000..ace30e6 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-arm/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-arm/native/libe_sqlite3.so new file mode 100644 index 0000000..8520492 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-arm/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-arm64/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-arm64/native/libe_sqlite3.so new file mode 100644 index 0000000..30b84ea Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-arm64/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-armel/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-armel/native/libe_sqlite3.so new file mode 100644 index 0000000..48de629 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-armel/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-mips64/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-mips64/native/libe_sqlite3.so new file mode 100644 index 0000000..4f7d693 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-mips64/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-musl-arm/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-musl-arm/native/libe_sqlite3.so new file mode 100644 index 0000000..2c9dcda Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-musl-arm/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-musl-arm64/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-musl-arm64/native/libe_sqlite3.so new file mode 100644 index 0000000..53949cf Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-musl-arm64/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-musl-x64/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-musl-x64/native/libe_sqlite3.so new file mode 100644 index 0000000..a043d7d Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-musl-x64/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-ppc64le/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-ppc64le/native/libe_sqlite3.so new file mode 100644 index 0000000..3593c9b Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-ppc64le/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-s390x/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-s390x/native/libe_sqlite3.so new file mode 100644 index 0000000..7e01b91 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-s390x/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-x64/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-x64/native/libe_sqlite3.so new file mode 100644 index 0000000..a8f9ae0 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-x64/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-x86/native/libe_sqlite3.so b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-x86/native/libe_sqlite3.so new file mode 100644 index 0000000..f9a9b69 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/linux-x86/native/libe_sqlite3.so differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib new file mode 100644 index 0000000..e6612c5 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/maccatalyst-x64/native/libe_sqlite3.dylib b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/maccatalyst-x64/native/libe_sqlite3.dylib new file mode 100644 index 0000000..3ad1142 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/maccatalyst-x64/native/libe_sqlite3.dylib differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/osx-arm64/native/libe_sqlite3.dylib b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/osx-arm64/native/libe_sqlite3.dylib new file mode 100644 index 0000000..21a8f42 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/osx-arm64/native/libe_sqlite3.dylib differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/osx-x64/native/libe_sqlite3.dylib b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/osx-x64/native/libe_sqlite3.dylib new file mode 100644 index 0000000..ffaf82f Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/osx-x64/native/libe_sqlite3.dylib differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-arm/native/e_sqlite3.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-arm/native/e_sqlite3.dll new file mode 100644 index 0000000..454821f Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-arm/native/e_sqlite3.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-arm64/native/WebView2Loader.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-arm64/native/WebView2Loader.dll new file mode 100644 index 0000000..ff13a17 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-arm64/native/WebView2Loader.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-arm64/native/e_sqlite3.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-arm64/native/e_sqlite3.dll new file mode 100644 index 0000000..70805d9 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-arm64/native/e_sqlite3.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x64/native/WebView2Loader.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x64/native/WebView2Loader.dll new file mode 100644 index 0000000..983ee32 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x64/native/WebView2Loader.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x64/native/e_sqlite3.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x64/native/e_sqlite3.dll new file mode 100644 index 0000000..379665c Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x64/native/e_sqlite3.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x86/native/WebView2Loader.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x86/native/WebView2Loader.dll new file mode 100644 index 0000000..a8565ba Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x86/native/WebView2Loader.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x86/native/e_sqlite3.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x86/native/e_sqlite3.dll new file mode 100644 index 0000000..c0e722d Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win-x86/native/e_sqlite3.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll new file mode 100644 index 0000000..6281e73 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll new file mode 100644 index 0000000..0d456dc Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/adr-writer.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/adr-writer.skill.md new file mode 100644 index 0000000..e746d27 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/adr-writer.skill.md @@ -0,0 +1,95 @@ +--- +name: adr-writer +label: 아키텍처 결정 기록 (ADR) +description: 아키텍처 결정 사항을 표준 ADR 형식으로 문서화합니다. +icon: \uE82D +allowed-tools: + - file_read + - file_write + - folder_map + - grep + - search_codebase +tabs: code +--- + +아키텍처 결정 사항을 ADR(Architecture Decision Record) 형식으로 문서화하세요. + +## ADR이란? +소프트웨어 아키텍처에서 내린 중요한 결정의 배경, 대안, 근거를 기록하는 경량 문서입니다. +미래의 팀원이 "왜 이렇게 결정했는지"를 이해할 수 있게 합니다. + +## 워크플로우 + +1. **결정 사항 확인**: 사용자에게 다음을 파악 + - 어떤 결정을 내렸는가 (또는 내려야 하는가) + - 관련 코드/시스템 영역 + - 고려한 대안들 +2. **코드 분석** (선택): 관련 코드 구조를 읽어 현재 상태 파악 +3. **ADR 작성**: 표준 형식으로 문서 생성 +4. **파일 저장**: `docs/adr/` 폴더에 번호 형식으로 저장 + +## ADR 표준 형식 + +```markdown +# ADR-[번호]: [결정 제목] + +**상태**: 제안됨 | 승인됨 | 폐기됨 | 대체됨 +**날짜**: YYYY-MM-DD +**결정자**: [이름/팀] + +## 맥락 (Context) +어떤 상황에서 이 결정이 필요한가? +- 기술적 배경 +- 비즈니스 요구사항 +- 제약 조건 + +## 결정 (Decision) +무엇을 결정했는가? +- 선택한 방안의 구체적 내용 +- 적용 범위 + +## 대안 (Alternatives) + +### 대안 1: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +### 대안 2: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +## 근거 (Rationale) +왜 이 결정을 선택했는가? +- 대안 대비 장점 +- 트레이드오프 분석 +- 참고 자료/벤치마크 + +## 결과 (Consequences) + +### 긍정적 +- ... + +### 부정적 +- ... + +### 리스크 +- ... + +## 관련 문서 +- ADR-[관련번호]: [제목] +- [외부 참고 링크] +``` + +## 파일 명명 규칙 +- 위치: `docs/adr/` (없으면 생성) +- 파일명: `ADR-NNNN-제목-요약.md` (예: `ADR-0001-데이터베이스-선택.md`) +- 번호: 기존 ADR 파일 조회 후 자동 부여 + +## 규칙 +- 결정의 "왜"를 중심으로 작성 (코드를 읽으면 "무엇"은 알 수 있음) +- 대안은 최소 2개 이상 제시 +- 트레이드오프를 솔직하게 기록 (완벽한 선택은 없음) +- 짧고 명확하게 (1~2페이지 이내) +- 한국어로 작성 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/api-docs.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/api-docs.skill.md new file mode 100644 index 0000000..dc8c12e --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/api-docs.skill.md @@ -0,0 +1,53 @@ +--- +name: api-docs +label: API 문서 생성 +description: 코드에서 API 엔드포인트를 분석하여 마크다운/HTML API 문서를 자동 생성합니다. +icon: \uE8A1 +tabs: code +--- + +작업 폴더의 소스 코드를 분석하여 API 문서를 생성하세요. + +## 분석 대상 +- REST API 엔드포인트 (Controller, Route 어노테이션) +- 함수/메서드 시그니처 및 주석 +- 요청/응답 모델 (DTO, Schema) +- 인증/권한 요구사항 + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — API 엔드포인트 패턴 검색 (`[HttpGet]`, `@GetMapping`, `router.get`, `@app.route` 등) +3. `file_read` — 컨트롤러/라우터 파일 분석 +4. `grep_tool` — 요청/응답 모델 클래스 검색 +5. `file_read` — 모델 구조 분석 +6. `file_write` — API 문서 생성 + +## 출력 형식 +마크다운으로 작성하되 다음 구조를 따르세요: + +``` +# API 문서 + +## 개요 +- Base URL, 인증 방식, 공통 헤더 + +## 엔드포인트 + +### [POST] /api/users +- **설명**: 사용자 생성 +- **인증**: Bearer Token 필요 +- **요청 본문**: + | 필드 | 타입 | 필수 | 설명 | + |------|------|------|------| + | name | string | ✓ | 사용자 이름 | +- **응답**: 201 Created + ```json + { "id": 1, "name": "..." } + ``` +- **에러 코드**: 400, 401, 409 +``` + +## 주의사항 +- 코드에서 실제 확인된 내용만 문서화하세요. 추측하지 마세요. +- 주석이나 Swagger/OpenAPI 어노테이션이 있으면 우선 활용하세요. +- 인증, 페이징, 에러 처리 등 공통 패턴은 별도 섹션으로 정리하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/batch-rename.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/batch-rename.skill.md new file mode 100644 index 0000000..0598dbc --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/batch-rename.skill.md @@ -0,0 +1,70 @@ +--- +name: batch-rename +label: 파일 일괄 이름 변경 +description: 패턴 매칭, 번호 붙이기, 날짜 추가 등 파일 이름을 일괄 변경합니다. +icon: \uE8AC +tabs: cowork +allowed-tools: + - folder_map + - file_read + - file_manage + - clipboard_tool +--- + +파일 이름을 규칙에 따라 일괄 변경하세요. 변경 전 반드시 미리보기를 제공합니다. + +## 작업 절차 + +1. **대상 파일 스캔**: folder_map으로 작업 폴더의 파일 목록을 수집 +2. **이름 변경 규칙 확인**: 사용자에게 다음 옵션을 확인 + - 대상 파일 필터 (확장자, 이름 패턴) + - 변경 규칙 (아래 지원 규칙 참조) + - 적용 순서 (이름순, 날짜순, 크기순) +3. **변경 미리보기 생성**: 변경 전/후 이름을 표로 표시 + ``` + | # | 현재 이름 | 변경 후 이름 | + |---|----------------------|----------------------| + | 1 | IMG_20260101_001.jpg | 2026-01-01_001.jpg | + | 2 | IMG_20260101_002.jpg | 2026-01-01_002.jpg | + ``` +4. **사용자 확인**: 미리보기를 보여주고 진행 여부를 확인 +5. **일괄 변경 실행**: file_manage로 파일 이름을 순차 변경 +6. **결과 보고**: 변경 성공/실패 건수와 상세 내역을 안내 + +## 지원 이름 변경 규칙 + +### 패턴 치환 +- **문자열 치환**: "IMG_" → "사진_" +- **정규식 치환**: `(\d{4})(\d{2})(\d{2})` → `$1-$2-$3` +- **대소문자 변환**: 소문자, 대문자, 타이틀 케이스 + +### 번호 붙이기 +- **순번 추가**: `문서_001.pdf`, `문서_002.pdf`, ... +- **시작 번호**: 사용자 지정 (기본: 1) +- **자릿수**: 자동 계산 (파일 수 기준) +- **위치**: 접두사 또는 접미사 + +### 날짜 추가 +- **오늘 날짜**: `보고서_2026-03-30.docx` +- **파일 수정일**: 파일의 실제 수정 날짜 사용 +- **날짜 형식**: YYYY-MM-DD, YYYYMMDD, YY.MM.DD + +### 정리 +- **공백 처리**: 공백 → 언더스코어/하이픈 +- **특수문자 제거**: 파일명에서 특수문자 제거 +- **확장자 변경**: `.jpeg` → `.jpg` +- **접두사/접미사 추가 또는 제거** + +## 충돌 처리 +- 변경 후 이름이 이미 존재하면 자동으로 번호 추가 (`_1`, `_2`) +- 충돌 건은 미리보기에서 ⚠️ 표시로 경고 +- 원본 파일 덮어쓰기 절대 금지 + +## 규칙 +- **미리보기 없이 직접 변경하지 않음** — 반드시 미리보기 후 사용자 확인 +- 하위 폴더 포함 여부는 사용자에게 확인 +- 숨김 파일(.으로 시작)은 기본 제외 +- 변경 실패 시 이미 변경된 파일은 원복하지 않으므로, 중요한 경우 백업 권장 +- 한 번에 1,000개 이상의 파일 변경 시 경고 + +한국어로 안내하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/changelog.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/changelog.skill.md new file mode 100644 index 0000000..a40539b --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/changelog.skill.md @@ -0,0 +1,74 @@ +--- +name: changelog +label: 변경 이력 / 릴리즈 노트 +description: Git 커밋 이력에서 자동으로 변경 이력과 릴리즈 노트를 생성합니다. +icon: \uE81C +allowed-tools: + - git_tool + - file_read + - file_write + - html_create + - text_summarize +tabs: code +--- + +Git 커밋 이력을 분석하여 변경 이력(CHANGELOG) 또는 릴리즈 노트를 생성하세요. + +## 워크플로우 + +1. **이력 조회**: git_tool로 커밋 로그 수집 + - 지정 기간 또는 태그 간 커밋 + - 커밋 메시지 + 변경 파일 목록 +2. **분류**: 커밋을 Conventional Commits 기준으로 분류 +3. **Breaking Change 감지**: 시그니처 변경, API 삭제 등 감지 +4. **문서 생성**: Markdown 또는 HTML로 출력 + +## Conventional Commits 분류 + +| 접두사 | 분류 | 설명 | +|--------|------|------| +| feat | ✨ 신기능 | 새로운 기능 추가 | +| fix | 🐛 버그 수정 | 버그 수정 | +| docs | 📝 문서 | 문서 변경 | +| style | 💄 스타일 | 코드 포맷팅 (동작 변경 없음) | +| refactor | ♻️ 리팩토링 | 코드 리팩토링 | +| perf | ⚡ 성능 | 성능 개선 | +| test | ✅ 테스트 | 테스트 추가/수정 | +| chore | 🔧 기타 | 빌드, 설정 변경 | +| BREAKING | 💥 Breaking | 하위 호환성 깨지는 변경 | + +## 출력 형식 + +### CHANGELOG.md +```markdown +# Changelog + +## [1.6.0] - 2026-03-30 + +### ✨ 신기능 +- 멀티패스 문서 생성 엔진 (#123) +- PPT 네이티브 생성 도구 + +### 🐛 버그 수정 +- 탭 전환 시 대화 유실 문제 해결 + +### 💥 Breaking Changes +- 없음 + +### 📝 문서 +- 개발자 가이드 v1.6.0 업데이트 +``` + +### 릴리즈 노트 (HTML) +사용자 친화적인 형식: +- 주요 변경사항 (스크린샷 포함 가능) +- 개선 사항 +- 알려진 이슈 +- 업그레이드 가이드 + +## 규칙 +- Conventional Commits 형식이 아닌 커밋도 내용 분석으로 분류 +- 중복/사소한 커밋은 병합하여 요약 +- Breaking Change는 반드시 별도 섹션으로 강조 +- 이슈 번호가 있으면 링크 포함 +- 한국어로 작성 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/code-scaffold.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/code-scaffold.skill.md new file mode 100644 index 0000000..35e4a74 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/code-scaffold.skill.md @@ -0,0 +1,31 @@ +--- +name: code-scaffold +label: 코드 스캐폴딩 +description: 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 자동 생성합니다. +icon: \uE943 +tabs: code +--- + +작업 폴더의 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 프로젝트 구조 파악 +2. file_read — 기존 코드 패턴 분석 +3. grep_tool — 코딩 컨벤션 확인 +4. file_write — 새 파일 생성 + +작업 순서: +1. 프로젝트 타입 감지 (언어, 프레임워크, 빌드 시스템) +2. 기존 코드 패턴 분석 (네이밍, 폴더 구조, 임포트 스타일) +3. 사용자 요청에 맞는 코드 뼈대 생성 + +생성 항목: +- 클래스/모듈 파일 (프로젝트 컨벤션에 맞춰) +- 인터페이스/타입 정의 +- 단위 테스트 파일 +- 필요한 설정/구성 파일 + +규칙: +- 기존 프로젝트의 코딩 스타일을 따르세요 +- TODO 주석으로 구현이 필요한 부분을 표시하세요 +- 한국어 주석을 추가하세요 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/commit-review.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/commit-review.skill.md new file mode 100644 index 0000000..0f8663b --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/commit-review.skill.md @@ -0,0 +1,67 @@ +--- +name: commit-review +label: 커밋 메시지 리뷰 +description: Git 커밋 메시지를 Conventional Commits 기준으로 검토하고 개선을 제안합니다. +icon: \uE8CB +tabs: code +--- + +작업 폴더의 최근 Git 커밋 메시지를 검토하고 개선안을 제시하세요. + +## 작업 절차 +1. `process_run` — `git log --oneline -20` 으로 최근 커밋 목록 확인 +2. `process_run` — `git log --format="%H%n%s%n%b%n---" -10` 으로 상세 메시지 확인 +3. `process_run` — `git diff HEAD~1` 으로 최신 커밋 변경 내용 확인 (필요 시) +4. 각 커밋을 Conventional Commits 기준으로 분석 +5. 결과를 정리하여 출력 + +## Conventional Commits 규칙 +``` +[optional scope]: + +[optional body] + +[optional footer(s)] +``` + +### type 종류 +- `feat`: 새 기능 +- `fix`: 버그 수정 +- `docs`: 문서 변경 +- `style`: 포맷팅 (코드 동작 변경 없음) +- `refactor`: 리팩토링 +- `perf`: 성능 개선 +- `test`: 테스트 추가/수정 +- `chore`: 빌드/도구 설정 +- `ci`: CI 설정 변경 + +## 검토 항목 +1. **type 적절성**: 변경 내용과 type이 일치하는가 +2. **설명 품질**: 50자 이내, 명령형, 명확한 내용 +3. **본문 유무**: 복잡한 변경에 "왜" 설명이 있는가 +4. **일관성**: 팀 내 커밋 스타일이 통일되어 있는가 +5. **Breaking Change**: BREAKING CHANGE 푸터 또는 ! 표기 + +## 출력 형식 +``` +## 커밋 메시지 리뷰 결과 + +### 전체 요약 +- 검토 커밋: N개 +- 규칙 준수: N개 ✓ / 위반: N개 ✗ + +### 개별 리뷰 + +#### abc1234 "Fix login bug" +- ❌ type 없음 → `fix: resolve login authentication failure` +- ❌ 본문 없음 → 원인과 해결 방법 추가 권장 + +#### def5678 "feat: add user profile page" +- ✅ Conventional Commits 준수 +- 💡 scope 추가 권장: `feat(profile): add user profile page` +``` + +## 주의사항 +- 비판이 아닌 건설적 제안을 하세요. +- 팀의 기존 컨벤션이 있으면 그것을 우선 존중하세요. +- 개선된 메시지 예시를 항상 함께 제시하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/compare.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/compare.skill.md new file mode 100644 index 0000000..6538dd7 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/compare.skill.md @@ -0,0 +1,51 @@ +--- +name: compare +label: 비교 분석표 +description: 2개 이상 항목의 비교 분석 매트릭스를 생성합니다. +icon: \uE9D5 +allowed-tools: + - html_create + - excel_create + - file_read + - document_read + - chart_create +tabs: all +--- + +사용자가 요청한 항목들을 체계적으로 비교 분석하는 매트릭스를 생성하세요. + +## 워크플로우 + +1. **비교 대상 확인**: 어떤 항목들을 비교할지 파악 + - 제품, 기술, 방안, 서비스, 도구, 프레임워크 등 +2. **비교 기준 설정**: 적절한 비교 축을 설계 + - 기능, 가격, 성능, 사용성, 확장성, 지원, 보안 등 +3. **데이터 수집**: 참고 파일이 있으면 읽어서 반영 +4. **분석표 생성**: HTML 또는 Excel로 비교 매트릭스 생성 +5. **종합 평가**: 총평 + 추천 의견 제시 + +## 비교표 구성 + +### 기본 매트릭스 +| 기준 | 항목 A | 항목 B | 항목 C | +|------|--------|--------|--------| +| 기능1 | ✅ 지원 | ⚠ 일부 | ❌ 미지원 | +| 기능2 | ... | ... | ... | + +### 점수 비교 (radar 차트 활용) +- 각 항목을 1~10점으로 정량화 +- chart_create로 레이더 차트 또는 바 차트 시각화 + +### 종합 평가 +- 장점/단점 요약 +- 상황별 추천 (예: "예산이 제한적이면 A, 확장성이 중요하면 B") + +## 출력 형식 +- **HTML** (권장): 색상 배지, 차트 포함 비주얼 보고서 +- **Excel**: 정량 데이터 + 수식 기반 점수표 + +## 규칙 +- 객관적 사실 기반으로 비교 (주관적 판단은 별도 섹션) +- 각 항목의 강점과 약점을 균형 있게 서술 +- 출처/근거가 있으면 명시 +- 한국어로 작성 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/csv-to-xlsx.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/csv-to-xlsx.skill.md new file mode 100644 index 0000000..fb819ac --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/csv-to-xlsx.skill.md @@ -0,0 +1,125 @@ +--- +name: csv-to-xlsx +label: CSV → Excel 변환 +description: CSV 파일을 서식이 완성된 Excel(.xlsx)로 변환합니다. 헤더 고정, 필터, 조건부 서식, 자동 열 너비를 적용합니다. +icon: \uE9F9 +tabs: cowork +requires: python +--- + +CSV 파일을 전문적인 서식이 적용된 Excel 파일로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install openpyxl pandas +``` + +## 작업 절차 + +1. **파일 확인**: folder_map으로 작업 폴더에서 CSV 파일을 탐색 +2. **CSV 분석**: file_read로 CSV 파일의 구조(컬럼, 행 수, 인코딩, 구분자) 파악 +3. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 헤더 행 고정 여부 (기본: 활성) + - 자동 필터 적용 여부 (기본: 활성) + - 조건부 서식 대상 컬럼 (숫자 컬럼 자동 감지) + - 시트 이름 (기본: 파일명) +4. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +5. **스크립트 실행**: process_run으로 Python 스크립트 실행 +6. **결과 확인**: 생성된 .xlsx 파일 경로와 요약 정보를 안내 + +## Python 스크립트 템플릿 +```python +import pandas as pd +from openpyxl import load_workbook +from openpyxl.styles import Font, PatternFill, Alignment, Border, Side +from openpyxl.utils import get_column_letter +from openpyxl.formatting.rule import CellIsRule + +# CSV 읽기 (인코딩 자동 감지) +for enc in ['utf-8', 'cp949', 'euc-kr', 'utf-8-sig']: + try: + df = pd.read_csv('input.csv', encoding=enc) + break + except (UnicodeDecodeError, Exception): + continue + +# Excel 저장 +output_path = 'output.xlsx' +df.to_excel(output_path, index=False, sheet_name='Sheet1') + +# 서식 적용 +wb = load_workbook(output_path) +ws = wb.active + +# 헤더 스타일 +header_font = Font(bold=True, color='FFFFFF', size=11) +header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid') +header_align = Alignment(horizontal='center', vertical='center', wrap_text=True) +thin_border = Border( + left=Side(style='thin'), + right=Side(style='thin'), + top=Side(style='thin'), + bottom=Side(style='thin') +) + +for col_idx, cell in enumerate(ws[1], 1): + cell.font = header_font + cell.fill = header_fill + cell.alignment = header_align + cell.border = thin_border + +# 자동 열 너비 +for col_idx in range(1, ws.max_column + 1): + max_length = 0 + col_letter = get_column_letter(col_idx) + for row in ws.iter_rows(min_col=col_idx, max_col=col_idx): + for cell in row: + if cell.value: + max_length = max(max_length, len(str(cell.value))) + ws.column_dimensions[col_letter].width = min(max_length + 4, 50) + +# 헤더 행 고정 (Freeze Panes) +ws.freeze_panes = 'A2' + +# 자동 필터 +ws.auto_filter.ref = ws.dimensions + +# 숫자 컬럼 조건부 서식 (음수 빨강) +for col_idx in range(1, ws.max_column + 1): + col_letter = get_column_letter(col_idx) + sample_values = [ws.cell(row=r, column=col_idx).value for r in range(2, min(ws.max_row + 1, 12))] + if any(isinstance(v, (int, float)) for v in sample_values if v is not None): + cell_range = f'{col_letter}2:{col_letter}{ws.max_row}' + ws.conditional_formatting.add(cell_range, + CellIsRule(operator='lessThan', formula=['0'], + font=Font(color='FF0000'))) + +# 데이터 행 줄무늬 (가독성) +light_fill = PatternFill(start_color='D9E2F3', end_color='D9E2F3', fill_type='solid') +for row_idx in range(2, ws.max_row + 1): + for col_idx in range(1, ws.max_column + 1): + cell = ws.cell(row=row_idx, column=col_idx) + cell.border = thin_border + if row_idx % 2 == 0: + cell.fill = light_fill + +wb.save(output_path) +print(f'변환 완료: {output_path} ({ws.max_row - 1}행 × {ws.max_column}열)') +``` + +## 서식 옵션 +- **헤더 스타일**: 파란 배경 + 흰색 굵은 글씨 + 가운데 정렬 +- **줄무늬**: 짝수 행 연한 파랑 배경 (가독성 향상) +- **열 너비**: 내용 기준 자동 조정 (최대 50) +- **조건부 서식**: 숫자 컬럼 음수 빨강 표시 +- **Freeze Panes**: 헤더 행 고정 +- **Auto Filter**: 전체 컬럼 필터 활성화 + +## 규칙 +- 원본 CSV 파일은 수정하지 않음 +- 인코딩 자동 감지 (UTF-8 → CP949 → EUC-KR 순) +- 대용량 파일 (100,000행 이상) 경고 후 진행 +- 출력 파일명: 원본 파일명 기준 (.csv → .xlsx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/data-convert.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/data-convert.skill.md new file mode 100644 index 0000000..edd84f6 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/data-convert.skill.md @@ -0,0 +1,56 @@ +--- +name: data-convert +label: 데이터 변환기 +description: 데이터 포맷 간 변환, 정제, 필터링, 통계 요약을 수행합니다. +icon: \uE8AB +allowed-tools: + - file_read + - file_write + - json_tool + - csv_create + - data_pivot + - excel_create +tabs: cowork +--- + +데이터 파일의 포맷 변환, 정제, 필터링, 통계 요약을 수행하세요. + +## 지원 변환 + +| 입력 → | JSON | CSV | Excel | Markdown | +|--------|------|-----|-------|----------| +| JSON | — | ✅ | ✅ | ✅ | +| CSV | ✅ | — | ✅ | ✅ | +| Excel | ✅ | ✅ | — | ✅ | +| TSV | ✅ | ✅ | ✅ | ✅ | + +## 워크플로우 + +1. **파일 분석**: 입력 파일의 포맷, 인코딩, 구조 파악 +2. **데이터 정제** (선택): + - 빈 행/열 제거 + - 중복 제거 + - 데이터 타입 정리 (숫자 문자열 → 숫자) + - 결측치 처리 (제거 또는 기본값) +3. **필터링** (선택): + - 조건 기반 행 필터링 + - 필요 컬럼만 추출 +4. **변환**: 대상 포맷으로 변환 +5. **통계 요약**: 기본 통계 제공 + +## 정제 옵션 +- `remove_empty`: 빈 행 제거 +- `remove_duplicates`: 중복 행 제거 +- `trim`: 공백 제거 +- `fill_na`: 결측치 채우기 (값 지정) + +## 출력 +- 변환된 파일 저장 +- 변환 통계 (원본 행 수, 변환 후 행 수, 제거 행 수) +- 컬럼별 기본 통계 (수치 컬럼: 합계, 평균, 최소, 최대) + +## 규칙 +- 원본 파일은 수정하지 않음 (새 파일로 저장) +- 인코딩: UTF-8 기본 (EUC-KR 옵션) +- 대용량 파일 (10MB 이상) 경고 +- 한국어로 안내 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/data-visualize-adv.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/data-visualize-adv.skill.md new file mode 100644 index 0000000..53817d4 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/data-visualize-adv.skill.md @@ -0,0 +1,125 @@ +--- +name: data-visualize-adv +label: 고급 데이터 시각화 +description: Python matplotlib/seaborn을 사용하여 히트맵, 산점도, 상관관계 등 고급 시각화를 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +데이터를 고급 시각화 차트로 변환하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib seaborn pandas numpy +``` + +## 작업 절차 +1. **데이터 확인**: 사용자가 제공한 CSV/JSON/Excel 데이터 파일 확인 +2. **데이터 로드**: pandas로 데이터 읽기 +3. **Python 스크립트 작성**: file_write로 시각화 스크립트 생성 +4. **스크립트 실행**: process_run으로 실행 +5. **결과 확인**: 생성된 차트 이미지 경로를 사용자에게 안내 + +## 시각화 유형별 템플릿 + +### 공통 설정 +```python +import matplotlib.pyplot as plt +import seaborn as sns +import pandas as pd +import numpy as np + +# 한글 폰트 설정 +plt.rcParams['font.family'] = 'Malgun Gothic' +plt.rcParams['axes.unicode_minus'] = False +sns.set_theme(style='whitegrid', font='Malgun Gothic') +``` + +### 히트맵 (상관관계 행렬) +```python +df = pd.read_csv('data.csv') +corr = df.select_dtypes(include=[np.number]).corr() + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r', + center=0, square=True, linewidths=0.5, ax=ax) +ax.set_title('상관관계 히트맵') +plt.tight_layout() +plt.savefig('heatmap.png', dpi=150) +``` + +### 산점도 (Scatter Plot) +```python +df = pd.read_csv('data.csv') + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.scatterplot(data=df, x='col_x', y='col_y', hue='category', + size='value', sizes=(20, 200), alpha=0.7, ax=ax) +ax.set_title('산점도') +plt.tight_layout() +plt.savefig('scatter.png', dpi=150) +``` + +### 시계열 분석 +```python +df = pd.read_csv('data.csv', parse_dates=['date']) + +fig, ax = plt.subplots(figsize=(12, 6)) +sns.lineplot(data=df, x='date', y='value', hue='category', ax=ax) +ax.set_title('시계열 트렌드') +plt.xticks(rotation=45) +plt.tight_layout() +plt.savefig('timeseries.png', dpi=150) +``` + +### 분포 비교 (박스플롯 + 바이올린) +```python +fig, axes = plt.subplots(1, 2, figsize=(14, 6)) + +sns.boxplot(data=df, x='group', y='value', ax=axes[0]) +axes[0].set_title('박스플롯') + +sns.violinplot(data=df, x='group', y='value', ax=axes[1]) +axes[1].set_title('바이올린 플롯') + +plt.tight_layout() +plt.savefig('distribution.png', dpi=150) +``` + +### 다중 차트 대시보드 +```python +fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + +# 좌상: 히트맵 +sns.heatmap(corr, annot=True, fmt='.1f', ax=axes[0,0]) + +# 우상: 산점도 +sns.scatterplot(data=df, x='x', y='y', ax=axes[0,1]) + +# 좌하: 히스토그램 +sns.histplot(data=df, x='value', kde=True, ax=axes[1,0]) + +# 우하: 박스플롯 +sns.boxplot(data=df, x='group', y='value', ax=axes[1,1]) + +fig.suptitle('데이터 분석 대시보드', fontsize=16, fontweight='bold') +plt.tight_layout() +plt.savefig('dashboard.png', dpi=150) +``` + +### 페어플롯 (변수 간 관계 전체) +```python +g = sns.pairplot(df, hue='category', diag_kind='kde') +g.fig.suptitle('변수 간 관계', y=1.02) +plt.savefig('pairplot.png', dpi=150) +``` + +## 스타일 옵션 +- seaborn 테마: `whitegrid`, `darkgrid`, `white`, `dark`, `ticks` +- 컬러 팔레트: `Set2`, `husl`, `coolwarm`, `RdBu_r`, `viridis` +- 출력 형식: png, svg, pdf +- 해상도: `dpi=150` (기본), `dpi=300` (인쇄용) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/data-visualize.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/data-visualize.skill.md new file mode 100644 index 0000000..965bf8b --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/data-visualize.skill.md @@ -0,0 +1,38 @@ +--- +name: data-visualize +label: 데이터 시각화 +description: CSV/Excel 데이터를 분석하여 차트가 포함된 HTML 보고서를 생성합니다. +icon: \uE9D9 +tabs: cowork +--- + +작업 폴더의 데이터 파일을 분석하고 시각화 보고서를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — HTML 시각화 보고서 생성 + +���각화 전략: +1. **데이터 파악**: 컬럼 타입, 결측치, 기본 통계량 확인 +2. **적절한 차트 선택**: + - 시계열 → 라인 차트 + - 비교 → 바 차트 + - 비율 → 파이/도넛 차트 + - 분포 → 히스토그램 + - 상관관계 → 산점도 +3. **HTML 보고서 생성**: 인라인 SVG 또는 CSS 기반 차트 (외부 라이브러리 없이) + +보고서 구성: +## 데이터 요약 +- 기본 통계 테이블 + +## 시각화 +- 데이터 특성에 맞는 2~4개 차트 +- 각 차트에 대한 해석 + +## 인사이트 +- 데이터에서 발견한 주요 패턴 +- 이상치 또는 주목할 포인트 + +한국어로 작성하세요. 차트는 CSS/SVG 기반으로 외부 의존성 없이 생성하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/db-schema.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/db-schema.skill.md new file mode 100644 index 0000000..446d5e1 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/db-schema.skill.md @@ -0,0 +1,60 @@ +--- +name: db-schema +label: DB 스키마 분석 +description: 데이터베이스 스키마를 분석하여 ERD 다이어그램과 테이블 문서를 생성합니다. +icon: \uE968 +tabs: code +--- + +작업 폴더의 코드에서 데이터베이스 스키마를 분석하고 문서화하세요. + +## 분석 대상 +- ORM 모델/엔티티 클래스 (Entity Framework, SQLAlchemy, Sequelize, JPA 등) +- 마이그레이션 파일 +- SQL DDL 스크립트 (CREATE TABLE) +- 관계 정의 (FK, Navigation Property) + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — 엔티티/모델 클래스 검색 (`DbSet`, `@Entity`, `Model.define`, `CREATE TABLE` 등) +3. `file_read` — 모델 파일 분석 (컬럼, 타입, 관계) +4. `grep_tool` — 인덱스, 제약 조건 검색 +5. `file_write` — 스키마 문서 + Mermaid ERD 생성 + +## 출력 형식 + +### 테이블 문서 +각 테이블에 대해: +``` +## Users 테이블 +| 컬럼 | 타입 | Null | 기본값 | 설명 | +|------|------|------|--------|------| +| Id | int | NO | AUTO_INCREMENT | PK | +| Name | nvarchar(100) | NO | - | 사용자 이름 | +| CreatedAt | datetime | NO | GETDATE() | 생성일 | + +- **인덱스**: IX_Users_Name (Name) +- **관계**: Orders (1:N), Profile (1:1) +``` + +### Mermaid ERD +```mermaid +erDiagram + Users ||--o{ Orders : "has" + Users ||--|| Profile : "has" + Users { + int Id PK + string Name + datetime CreatedAt + } + Orders { + int Id PK + int UserId FK + decimal Amount + } +``` + +## 주의사항 +- 코드에서 실제 확인된 스키마만 문서화하세요. +- 관계(1:1, 1:N, N:M)를 정확히 파악하세요. +- 마이그레이션이 있으면 최종 상태를 기준으로 작성하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/dependency-audit.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/dependency-audit.skill.md new file mode 100644 index 0000000..73dbb2e --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/dependency-audit.skill.md @@ -0,0 +1,85 @@ +--- +name: dependency-audit +label: 의존성 분석 +description: 프로젝트 의존성 그래프를 분석하고 보안 취약점, 라이선스, 업데이트 현황을 보고합니다. +icon: \uE964 +allowed-tools: + - file_read + - grep + - folder_map + - glob + - html_create + - process +tabs: code +--- + +프로젝트의 패키지 의존성을 분석하여 보안, 라이선스, 업데이트 보고서를 생성하세요. + +## 워크플로우 + +1. **패키지 파일 탐지**: glob으로 의존성 파일 검색 + - .NET: `*.csproj`, `packages.config`, `Directory.Build.props` + - Node: `package.json`, `package-lock.json`, `yarn.lock` + - Python: `requirements.txt`, `Pipfile`, `pyproject.toml` + - Java: `pom.xml`, `build.gradle` +2. **의존성 목록 추출**: file_read로 파일 파싱 +3. **분석 수행**: 각 의존성에 대해 검사 +4. **보고서 생성**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 1. 직접 의존성 목록 +| 패키지 | 현재 버전 | 최신 버전 | 업데이트 필요 | +|--------|----------|----------|-------------| +| ... | ... | ... | ✅/⚠/❌ | + +### 2. 보안 취약점 (알려진 패턴) +- 알려진 취약 버전 패턴 탐지 +- 폐기된(deprecated) 패키지 식별 +- 유지보수 중단된 패키지 경고 + +### 3. 라이선스 검사 +| 라이선스 | 호환성 | 패키지 | +|---------|--------|--------| +| MIT | ✅ 허용 | lib-a, lib-b | +| GPL-3.0 | ⚠ 주의 | lib-c | +| 상용 | ❌ 검토 필요 | lib-d | + +### 4. 의존성 크기 분석 +- 패키지별 예상 크기 +- 전체 node_modules / NuGet 캐시 크기 +- 불필요하게 큰 패키지 식별 + +### 5. 중복/충돌 검사 +- 동일 기능 중복 패키지 (예: lodash + underscore) +- 버전 충돌 가능성 + +## 프레임워크별 검사 명령 + +### .NET +``` +dotnet list package --outdated +dotnet list package --vulnerable +``` + +### Node.js +``` +npm audit +npm outdated +``` + +### Python +``` +pip list --outdated +pip-audit +``` + +## 출력 +- HTML 보고서: 위험도별 색상 구분, 차트 포함 +- 요약: 총 패키지 수, 업데이트 필요 수, 보안 이슈 수, 라이선스 경고 수 + +## 규칙 +- 외부 서버 접속 없이 로컬 파일 분석만 수행 +- process 도구 사용 시 `dotnet list` / `npm audit` 등 읽기 전용 명령만 +- 패키지를 직접 업데이트하지 않음 (보고서만) +- 한국어로 작성 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/diagram-generator.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/diagram-generator.skill.md new file mode 100644 index 0000000..9d887e0 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/diagram-generator.skill.md @@ -0,0 +1,99 @@ +--- +name: diagram-generator +label: 다이어그램 생성 +description: Python matplotlib/graphviz를 사용하여 플로차트, 시퀀스, ER 다이어그램 등을 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 다이어그램을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib graphviz +``` +시스템에 Graphviz가 설치되어 있어야 합니다 (https://graphviz.org/download/). + +## 작업 절차 +1. **요구사항 파악**: 다이어그램 유형, 노드/관계, 스타일 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립트 실행 +4. **결과 확인**: 생성된 이미지 파일 경로를 사용자에게 안내 + +## 다이어그램 유형별 템플릿 + +### 플로차트 (Graphviz) +```python +from graphviz import Digraph + +dot = Digraph(comment='Flowchart', format='png') +dot.attr(rankdir='TB', fontname='Malgun Gothic') +dot.attr('node', shape='box', style='rounded,filled', fillcolor='#E8F0FE') + +dot.node('start', '시작', shape='ellipse', fillcolor='#34A853', fontcolor='white') +dot.node('process1', '데이터 수집') +dot.node('decision', '조건 확인?', shape='diamond', fillcolor='#FBBC04') +dot.node('process2', '처리') +dot.node('end', '종료', shape='ellipse', fillcolor='#EA4335', fontcolor='white') + +dot.edge('start', 'process1') +dot.edge('process1', 'decision') +dot.edge('decision', 'process2', label='예') +dot.edge('decision', 'end', label='아니오') +dot.edge('process2', 'end') + +dot.render('flowchart', cleanup=True) +``` + +### 시퀀스 다이어그램 (matplotlib) +```python +import matplotlib.pyplot as plt +import matplotlib.patches as patches + +fig, ax = plt.subplots(1, 1, figsize=(10, 8)) +# 액터 라이프라인, 메시지 화살표 등을 matplotlib으로 직접 그리기 +ax.set_xlim(0, 10) +ax.set_ylim(0, 10) +ax.invert_yaxis() +ax.axis('off') +plt.savefig('sequence.png', dpi=150, bbox_inches='tight') +``` + +### ER 다이어그램 (Graphviz) +```python +from graphviz import Graph + +er = Graph('ER', format='png', engine='neato') +er.attr('node', shape='box', style='filled', fillcolor='#E8F0FE') + +er.node('user', 'User\n─────\nid (PK)\nname\nemail') +er.node('order', 'Order\n─────\nid (PK)\nuser_id (FK)\ntotal') + +er.edge('user', 'order', label='1:N') +er.render('er_diagram', cleanup=True) +``` + +### 조직도 (Graphviz) +```python +from graphviz import Digraph + +org = Digraph(format='png') +org.attr(rankdir='TB') +org.attr('node', shape='box', style='rounded,filled', fillcolor='#E3F2FD') + +org.node('ceo', 'CEO') +org.node('cto', 'CTO') +org.node('cfo', 'CFO') +org.edges([('ceo', 'cto'), ('ceo', 'cfo')]) +org.render('org_chart', cleanup=True) +``` + +## 스타일 옵션 +- 폰트: `fontname='Malgun Gothic'` (한글 지원) +- 색상: HTML 컬러 코드 지원 +- 출력 형식: png, svg, pdf +- 레이아웃 엔진: dot(계층), neato(스프링), circo(원형), fdp(포스) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/docx-creator.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/docx-creator.skill.md new file mode 100644 index 0000000..74a62ce --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/docx-creator.skill.md @@ -0,0 +1,97 @@ +--- +name: docx-creator +label: Word 문서 생성 +description: Python을 사용하여 전문적인 Word 문서(.docx)를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE8A5 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 전문적인 Word 문서를 Python으로 생성하세요. + +## 사전 준비 +먼저 python-docx 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx +``` + +## 양식 활용 (템플릿 모드) +작업 폴더에 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.docx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .docx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식 파일의 구조(스타일, 헤더, 섹션)를 먼저 확인 +4. **양식 기반 생성**: + ```python + doc = Document('양식_보고서.docx') # ← 빈 Document() 대신 양식 로드 + # 양식의 스타일, 머리글/바닥글, 로고, 페이지 설정이 자동 상속됨 + # 기존 본문 내용을 지우고 새 내용만 추가 + for paragraph in doc.paragraphs: + paragraph.clear() # 기존 내용 제거 + # 또는 필요에 따라 특정 섹션만 교체 + ``` +5. **양식이 없으면**: 아래 기본 템플릿으로 새 문서 생성 + +## 작업 절차 +1. **요구사항 파악**: 사용자가 원하는 문서의 종류, 구조, 내용을 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .docx 파일이 있는지 확인 +3. **Python 스크립트 작성**: file_write로 .py 파일 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 .docx 파일 경로를 사용자에게 안내 + +## Python 스크립트 템플릿 +```python +from docx import Document +from docx.shared import Inches, Pt, Cm +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.style import WD_STYLE_TYPE +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.docx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 문서 +if template_file: + doc = Document(template_file) + print(f'양식 활용: {template_file}') +else: + doc = Document() + # 스타일 설정 (양식이 없을 때만) + style = doc.styles['Normal'] + font = style.font + font.name = '맑은 고딕' + font.size = Pt(11) + +# 제목 +doc.add_heading('문서 제목', level=0) + +# 본문 +doc.add_paragraph('내용을 여기에 작성합니다.') + +# 표 +table = doc.add_table(rows=2, cols=3) +table.style = 'Light Grid Accent 1' + +# 저장 +doc.save('output.docx') +``` + +## 지원 기능 +- 제목/소제목 계층 구조 +- 표 (스타일, 병합, 서식) +- 이미지 삽입 +- 머리글/바닥글 +- 페이지 번호 +- 목차 +- 글머리 기호/번호 목록 +- **양식 파일 기반 스타일 상속** (로고, 헤더, 페이지 설정 자동 유지) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/email-draft.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/email-draft.skill.md new file mode 100644 index 0000000..62f4e5f --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/email-draft.skill.md @@ -0,0 +1,55 @@ +--- +name: email-draft +label: 비즈니스 이메일 작성 +description: 상황과 톤에 맞는 전문적인 비즈니스 이메일 초안을 생성합니다. +icon: \uE715 +allowed-tools: + - clipboard_tool + - file_write +tabs: all +--- + +사용자의 요청에 맞는 전문적인 비즈니스 이메일을 작성하세요. + +## 워크플로우 + +1. 사용자에게 다음 정보를 확인하세요: + - **수신자**: 이름, 직급, 부서 (알고 있다면) + - **목적**: 요청 / 보고 / 안내 / 감사 / 사과 / 협조 / 초대 / 회신 + - **핵심 내용**: 전달할 주요 메시지 (1~3가지) + - **톤**: 공식(格式) / 반공식 / 친근 + - **언어**: 한국어 / 영어 / 일본어 + +2. 이메일 초안을 작성합니다: + - 적절한 인사말로 시작 + - 핵심 내용은 **굵게** 강조 + - 요청 사항은 명확하고 구체적으로 + - 마무리 인사와 서명 포함 + +3. 사용자에게 초안을 보여주고 수정 요청을 받습니다. + +4. 최종본을 clipboard_tool로 클립보드에 복사합니다. + +## 이메일 구조 + +``` +제목: [간결하고 명확한 제목] + +[수신자] 님께, + +[인사말] + +[본문 - 목적과 핵심 내용] + +[요청 사항 또는 다음 단계] + +[마무리 인사] + +[서명] +``` + +## 규칙 +- 한 문단은 3~4문장을 넘지 않도록 간결하게 +- 수동적 표현보다 능동적 표현 선호 +- 약어는 처음 사용 시 풀어 쓰기 +- 긴급도에 따라 제목에 [긴급], [참고] 등 태그 사용 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/env-setup.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/env-setup.skill.md new file mode 100644 index 0000000..f1b397e --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/env-setup.skill.md @@ -0,0 +1,152 @@ +--- +name: env-setup +label: 프로젝트 환경 설정 +description: .gitignore, requirements.txt, .editorconfig 등 프로젝트 환경 설정 파일을 자동 생성합니다. +icon: \uE835 +tabs: code +allowed-tools: + - folder_map + - file_read + - file_write + - process_run +--- + +프로젝트 유형에 맞는 환경 설정 파일을 자동으로 생성하세요. + +## 작업 절차 + +1. **프로젝트 분석**: folder_map으로 프로젝트 구조를 파악하고 유형 판별 + - `.py` 파일 → Python 프로젝트 + - `package.json` 또는 `.js/.ts` 파일 → Node.js 프로젝트 + - `.csproj` 또는 `.sln` 파일 → .NET 프로젝트 + - `pom.xml` 또는 `.java` 파일 → Java 프로젝트 + - 복합 프로젝트인 경우 모든 유형을 병합 +2. **기존 설정 확인**: 이미 존재하는 설정 파일이 있는지 확인 + - 있으면: 내용을 분석하여 누락된 항목만 추가 제안 + - 없으면: 새로 생성 +3. **생성할 파일 목록 제안**: 사용자에게 생성할 파일 목록을 보여주고 확인 +4. **파일 생성**: file_write로 각 설정 파일 생성 +5. **결과 안내**: 생성된 파일 목록과 주요 설정 내용 요약 + +## 프로젝트별 템플릿 + +### Python 프로젝트 +생성 파일: `.gitignore`, `requirements.txt`, `.editorconfig`, `setup.cfg`, `.flake8` + +**.gitignore (Python)**: +``` +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +venv/ +.venv/ +*.egg-info/ +dist/ +build/ +.eggs/ +*.egg +.mypy_cache/ +.pytest_cache/ +.coverage +htmlcov/ +.env +.idea/ +.vscode/ +*.log +``` + +**requirements.txt**: 프로젝트에서 import 문을 스캔하여 자동 생성 + +### Node.js 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `.nvmrc`, `.prettierrc` + +**.gitignore (Node)**: +``` +node_modules/ +dist/ +build/ +.env +.env.local +*.log +npm-debug.log* +.DS_Store +coverage/ +.nyc_output/ +.idea/ +.vscode/ +*.tgz +``` + +### .NET 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `Directory.Build.props` + +**.gitignore (.NET)**: +``` +bin/ +obj/ +.vs/ +*.user +*.suo +*.cache +packages/ +*.nupkg +TestResults/ +.idea/ +*.DotSettings.user +``` + +### Java 프로젝트 +생성 파일: `.gitignore`, `.editorconfig` + +**.gitignore (Java)**: +``` +*.class +*.jar +*.war +*.ear +target/ +.gradle/ +build/ +.idea/ +*.iml +.settings/ +.classpath +.project +out/ +``` + +## 공통 .editorconfig +```ini +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[*.{json,js,ts,jsx,tsx}] +indent_size = 2 + +[Makefile] +indent_style = tab +``` + +## 규칙 +- 기존 설정 파일이 있으면 덮어쓰지 않고, 누락 항목만 제안 +- .env 파일은 생성하지 않음 (보안 — 사용자가 직접 생성) +- 생성 전 파일 목록을 반드시 사용자에게 확인 +- 프로젝트 루트에 생성 (하위 폴더에 생성하지 않음) + +한국어로 안내하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/gen-test.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/gen-test.skill.md new file mode 100644 index 0000000..ede8c8d --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/gen-test.skill.md @@ -0,0 +1,63 @@ +--- +name: gen-test +label: 테스트 생성기 +description: 지정 파일의 단위 테스트를 자동 생성하고 실행하여 커버리지를 분석합니다. +icon: \uE9D5 +allowed-tools: + - file_read + - file_write + - test_loop + - grep + - folder_map + - dev_env_detect + - build_run +tabs: code +--- + +지정된 소스 파일의 단위 테스트를 자동 생성하고 실행하세요. + +## 워크플로우 + +1. **환경 감지**: dev_env_detect로 프로젝트 타입, 테스트 프레임워크 확인 +2. **대상 분석**: file_read로 테스트 대상 파일 분석 + - 공개 메서드/함수 목록 추출 + - 메서드별 입출력 타입 파악 + - 의존성 확인 (Mock 필요 여부) +3. **테스트 생성**: 각 메서드에 대해 테스트 케이스 작성 + - 정상 케이스 (Happy Path) + - 경계값 (Boundary) + - 예외/에러 케이스 + - null/empty 입력 +4. **실행 및 검증**: test_loop으로 테스트 실행 +5. **결과 보고**: 성공/실패 요약, 커버리지 추정 + +## 테스트 작성 원칙 + +### 명명 규칙 +- C#: `[메서드명]_[시나리오]_[기대결과]` +- Python: `test_[메서드명]_[시나리오]` +- JavaScript: `should [기대 동작] when [조건]` + +### 테스트 구조 (AAA 패턴) +``` +Arrange — 테스트 데이터 준비 +Act — 대상 메서드 실행 +Assert — 결과 검증 +``` + +### 프레임워크별 지원 +- C#: xUnit, NUnit, MSTest +- Python: pytest, unittest +- JavaScript: Jest, Mocha, Vitest +- Java: JUnit 5 + +## 출력 +- 테스트 파일 생성 (프로젝트 컨벤션에 맞는 위치) +- 테스트 실행 결과 요약 +- 커버리지 추정 (메서드별 테스트 유무) + +## 규칙 +- 기존 테스트가 있으면 스타일을 따르기 +- 외부 의존성은 Mock/Stub 사용 +- 테스트 간 독립성 보장 (상태 공유 금지) +- 한국어 주석으로 테스트 의도 설명 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/image-processor.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/image-processor.skill.md new file mode 100644 index 0000000..86c6c31 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/image-processor.skill.md @@ -0,0 +1,75 @@ +--- +name: image-processor +label: 이미지 처리 +description: Python Pillow를 사용하여 이미지 리사이즈, 크롭, 워터마크, 포맷 변환을 수행합니다. +icon: \uEB9F +requires: python +tabs: cowork +--- + +사용자의 요구에 맞게 이미지를 처리하세요. + +## 사전 준비 +먼저 Pillow 패키지가 설치되어 있��지 확인하고, 없으면 설���하세요: +``` +process_run: pip install Pillow +``` + +## 작업 절�� +1. **요구사항 파악**: 처리할 이미지 파일과 원하는 작업 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립�� 실행 +4. **결과 확인**: 처리된 이미지 파일 경로를 사용자에게 안내 + +## 지원 기능 + +### 리사이즈 +```python +from PIL import Image +img = Image.open('input.png') +img_resized = img.resize((800, 600)) # 고정 크기 +# 또는 비율 유지 +img.thumbnail((800, 800)) +img.save('output.png') +``` + +### 크롭 +```python +img = Image.open('input.png') +cropped = img.crop((left, top, right, bottom)) +cropped.save('output.png') +``` + +### 워터마크 +```python +from PIL import Image, ImageDraw, ImageFont +img = Image.open('input.png') +draw = ImageDraw.Draw(img) +draw.text((10, 10), "Watermark", fill=(255, 255, 255, 128)) +img.save('output.png') +``` + +### 포맷 변환 +```python +img = Image.open('input.png') +img.save('output.jpg', 'JPEG', quality=85) +img.save('output.webp', 'WEBP', quality=80) +``` + +### 배치 처리 +```python +import glob +for path in glob.glob('*.png'): + img = Image.open(path) + img.thumbnail((800, 800)) + img.save(f'resized_{path}') +``` + +## 추가 기능 +- 회전/뒤집기 (rotate, transpose) +- 밝기/대비/선명도 조절 (ImageEnhance) +- 필터 적용 (ImageFilter: BLUR, SHARPEN, CONTOUR) +- 이미지 합성 (Image.paste, Image.alpha_composite) +- EXIF 정보 읽기 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/impact.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/impact.skill.md new file mode 100644 index 0000000..1b0d56b --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/impact.skill.md @@ -0,0 +1,67 @@ +--- +name: impact +label: 변경 영향 분석 +description: 코드 변경 시 영향받는 파일, 함수, 테스트를 식별합니다. +icon: \uE946 +allowed-tools: + - lsp_code_intel + - grep + - search_codebase + - git_tool + - file_read + - folder_map +tabs: code +--- + +코드 변경이 미치는 영향 범위를 분석하여 안전한 수정을 도와주세요. + +## 워크플로우 + +1. **변경 대상 확인**: 어떤 파일/함수/클래스를 변경할 예정인지 파악 +2. **직접 참조 분석**: lsp_code_intel의 find_references로 직접 호출처 확인 +3. **간접 영향 분석**: + - grep으로 문자열 기반 참조 검색 + - search_codebase로 의미적 유사 코드 탐색 + - 상속/인터페이스 체인 추적 +4. **테스트 영향**: 관련 테스트 파일 식별 +5. **위험도 평가**: 변경 영향 범위와 위험도 매트릭스 생성 +6. **보고서 작성**: 영향 분석 보고서 생성 + +## 분석 항목 + +### 직접 영향 +- 해당 함수/클래스를 직접 호출하는 코드 +- import/using 하는 파일 +- 상속받는 클래스 + +### 간접 영향 +- 인터페이스 구현체를 통한 호출 +- 리플렉션/동적 호출 +- 설정 파일 참조 +- UI 바인딩 + +### 테스트 영향 +- 직접 테스트하는 테스트 파일 +- 관련 통합 테스트 +- 테스트 더블(Mock) 대상 여부 + +## 출력 형식 + +### 영향 분석 보고서 + +| 영향 수준 | 파일 | 관련 함수 | 위험도 | 비고 | +|----------|------|----------|--------|------| +| 🔴 직접 | A.cs | MethodX() | 높음 | 시그니처 변경 시 컴파일 오류 | +| 🟡 간접 | B.cs | MethodY() | 중간 | 동적 호출, 런타임 오류 가능 | +| 🟢 테스트 | A.Tests.cs | Test1() | 낮음 | 테스트 수정 필요 | + +### 변경 체크리스트 +- [ ] 직접 참조 N개 확인 및 수정 +- [ ] 테스트 M개 업데이트 +- [ ] 관련 문서 갱신 + +## 규칙 +- 코드를 직접 수정하지 않음 (분석만 수행) +- 가능하면 LSP 기반 정확한 참조 분석 우선 +- LSP 불가 시 grep 기반 텍스트 검색으로 대체 +- 위험도는 보수적으로 평가 (의심스러우면 높음) diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/json-schema.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/json-schema.skill.md new file mode 100644 index 0000000..821dbf4 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/json-schema.skill.md @@ -0,0 +1,107 @@ +--- +name: json-schema +label: JSON/YAML 스키마 도구 +description: JSON 또는 YAML 데이터에서 스키마를 생성하고, 데이터의 유효성을 검증합니다. +icon: \uE943 +tabs: code +allowed-tools: + - json_tool + - file_read + - file_write + - clipboard_tool +--- + +JSON/YAML 샘플 데이터에서 스키마를 추출하거나, 기존 스키마로 데이터를 검증하세요. + +## 작업 절차 + +1. **요청 유형 판별**: + - **스키마 생성**: 샘플 JSON/YAML → JSON Schema 추출 + - **스키마 검증**: 데이터 + 스키마 → 유효성 검사 + - **스키마 문서화**: 기존 스키마 → 사람이 읽을 수 있는 설명 생성 +2. **입력 데이터 확인**: file_read 또는 사용자 입력으로 데이터 로드 +3. **스키마 생성 또는 검증 수행**: json_tool로 처리 +4. **결과 출력**: 생성된 스키마 또는 검증 결과를 표시 +5. **파일 저장**: file_write로 결과를 저장하거나 clipboard_tool로 복사 + +## 스키마 생성 규칙 + +### 타입 추론 +| JSON 값 | JSON Schema 타입 | 추가 속성 | +|---------|-----------------|----------| +| `"text"` | `string` | — | +| `123` | `integer` | — | +| `1.5` | `number` | — | +| `true` | `boolean` | — | +| `null` | `null` | nullable 처리 | +| `[]` | `array` | items 스키마 | +| `{}` | `object` | properties 스키마 | + +### 추론 강화 +- **패턴 감지**: 이메일, URL, 날짜, UUID 등은 `format` 속성 추가 +- **열거형 감지**: 값의 종류가 적으면 `enum` 으로 제안 +- **필수 필드**: 모든 샘플에 존재하는 필드는 `required`로 표시 +- **배열 항목**: 배열 내 모든 항목을 분석하여 통합 스키마 생성 + +### 출력 형식 (JSON Schema Draft 7) +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "사용자 정보", + "description": "사용자 프로필 데이터 스키마", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "사용자 이름" + }, + "email": { + "type": "string", + "format": "email", + "description": "이메일 주소" + }, + "age": { + "type": "integer", + "minimum": 0, + "maximum": 150, + "description": "나이" + } + }, + "required": ["name", "email"], + "additionalProperties": false +} +``` + +## 검증 결과 형식 +검증 결과는 다음과 같이 표시하세요: +``` +검증 결과: ❌ 실패 (3건의 오류) + +| # | 경로 | 오류 | 기대값 | +|---|------|------|--------| +| 1 | $.email | 필수 필드 누락 | string (required) | +| 2 | $.age | 타입 불일치 | integer (실제: string) | +| 3 | $.tags[2] | 열거형 불일치 | "A", "B", "C" 중 하나 | +``` + +## 스키마 문서화 형식 +기존 스키마를 분석하여 사람이 읽기 쉬운 문서를 생성: +``` +## 사용자 정보 스키마 + +| 필드 | 타입 | 필수 | 설명 | 제약 조건 | +|------|------|------|------|----------| +| name | string | ✅ | 사용자 이름 | — | +| email | string | ✅ | 이메일 주소 | format: email | +| age | integer | — | 나이 | 0~150 | +| tags | array | — | 태그 목록 | items: string | +``` + +## 규칙 +- JSON Schema Draft 7 형식 사용 +- 스키마 생성 시 description 필드를 한국어로 작성 +- 복수 샘플이 제공되면 모든 샘플을 분석하여 통합 스키마 생성 +- 중첩 객체는 재귀적으로 스키마 추출 +- 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/log-analyze.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/log-analyze.skill.md new file mode 100644 index 0000000..0ac33d9 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/log-analyze.skill.md @@ -0,0 +1,69 @@ +--- +name: log-analyze +label: 로그 분석기 +description: 로그 파일의 패턴을 분석하고 에러를 요약하며 타임라인을 시각화합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - chart_create + - html_create + - data_pivot + - text_summarize +tabs: cowork +--- + +로그 파일을 분석하여 패턴, 에러, 추세를 파악하고 보고서를 생성하세요. + +## 워크플로우 + +1. **로그 파일 로드**: file_read로 로그 파일 읽기 +2. **패턴 분석**: + - grep으로 에러/경고/예외 패턴 검색 + - 시간대별 이벤트 빈도 파악 + - 반복되는 에러 패턴 식별 +3. **통계 생성**: data_pivot으로 집계 +4. **시각화**: chart_create로 타임라인 차트 생성 +5. **보고서**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 에러 분석 +- ERROR, WARN, FATAL, Exception 키워드 추출 +- 에러 유형별 발생 빈도 +- 최초 발생 시점 및 최근 발생 시점 +- 에러 메시지 클러스터링 (유사 에러 그룹화) + +### 시간대 분석 +- 시간대별 로그 발생 빈도 +- 피크 시간대 식별 +- 에러 집중 시간대 + +### 패턴 분석 +- 반복 패턴 (주기적 에러) +- 연쇄 에러 (A 에러 후 B 에러 발생 패턴) +- 비정상 패턴 (평소와 다른 로그량) + +## 출력 형식 + +``` +## 로그 분석 보고서 +- 분석 기간: [시작] ~ [끝] +- 총 로그: N줄 + +### 에러 요약 (상위 10건) +| 순위 | 에러 유형 | 발생 횟수 | 최근 발생 | +|------|----------|----------|----------| + +### 타임라인 차트 +[시간대별 이벤트 빈도 차트] + +### 상세 분석 +[에러별 상세 내용 및 권장 조치] +``` + +## 지원 로그 형식 +- 일반 텍스트 로그 (타임스탬프 자동 감지) +- JSON 로그 (각 줄이 JSON 객체) +- CSV 로그 (헤더 포함) +- syslog 형식 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/markdown-to-doc.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/markdown-to-doc.skill.md new file mode 100644 index 0000000..7a852d8 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/markdown-to-doc.skill.md @@ -0,0 +1,164 @@ +--- +name: markdown-to-doc +label: Markdown → 문서 변환 +description: Markdown 파일을 서식이 적용된 Word(.docx) 또는 PDF 문서로 변환합니다. +icon: \uE8A5 +tabs: cowork +requires: python +--- + +Markdown 파일을 전문적인 Word 또는 PDF 문서로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx markdown +``` + +## 작업 절차 + +1. **Markdown 파일 확인**: file_read로 변환할 Markdown 파일의 내용과 구조를 파악 +2. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 출력 형식: Word(.docx) 또는 PDF + - 폰트: 맑은 고딕 (기본) / 사용자 지정 + - 여백, 페이지 크기 설정 + - 머리글/바닥글 포함 여부 +3. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 문서 파일 경로와 페이지 수를 안내 + +## 스타일 매핑 + +| Markdown | Word 스타일 | 설명 | +|----------|------------|------| +| `# 제목` | Heading 1 | 16pt, 굵게 | +| `## 소제목` | Heading 2 | 14pt, 굵게 | +| `### 항목` | Heading 3 | 12pt, 굵게 | +| 본문 텍스트 | Normal | 11pt | +| `**굵게**` | Bold run | 굵게 | +| `*기울임*` | Italic run | 기울임 | +| `` `코드` `` | 코드 스타일 | Consolas, 배경색 | +| `> 인용` | Quote | 들여쓰기 + 왼쪽 테두리 | +| `- 목록` | List Bullet | 글머리 기호 | +| `1. 번호` | List Number | 번호 목록 | +| 표 | Table Grid | 테두리 표 | +| `---` | 페이지 구분 | 가로선 → 페이지 나누기 | +| 코드 블록 | 코드 단락 | Consolas, 회색 배경 | + +## Python 스크립트 템플릿 +```python +import re +from docx import Document +from docx.shared import Inches, Pt, Cm, RGBColor +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.oxml.ns import qn +import markdown + +# Markdown 파일 읽기 +with open('input.md', 'r', encoding='utf-8') as f: + md_content = f.read() + +doc = Document() + +# 기본 스타일 설정 +style = doc.styles['Normal'] +font = style.font +font.name = '맑은 고딕' +font.size = Pt(11) +style.element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕') + +# 여백 설정 +for section in doc.sections: + section.top_margin = Cm(2.54) + section.bottom_margin = Cm(2.54) + section.left_margin = Cm(3.17) + section.right_margin = Cm(3.17) + +# Markdown 파싱 및 변환 +lines = md_content.split('\n') +i = 0 +while i < len(lines): + line = lines[i] + + # 제목 (Heading) + if line.startswith('#'): + level = len(line) - len(line.lstrip('#')) + text = line.lstrip('#').strip() + doc.add_heading(text, level=min(level, 4)) + + # 코드 블록 + elif line.startswith('```'): + code_lines = [] + i += 1 + while i < len(lines) and not lines[i].startswith('```'): + code_lines.append(lines[i]) + i += 1 + p = doc.add_paragraph() + run = p.add_run('\n'.join(code_lines)) + run.font.name = 'Consolas' + run.font.size = Pt(9) + + # 인용 + elif line.startswith('>'): + text = line.lstrip('>').strip() + p = doc.add_paragraph(text) + p.paragraph_format.left_indent = Cm(1.27) + + # 글머리 기호 + elif line.startswith('- ') or line.startswith('* '): + text = line[2:].strip() + doc.add_paragraph(text, style='List Bullet') + + # 번호 목록 + elif re.match(r'^\d+\.\s', line): + text = re.sub(r'^\d+\.\s', '', line).strip() + doc.add_paragraph(text, style='List Number') + + # 가로선 → 페이지 나누기 + elif line.strip() in ('---', '***', '___'): + doc.add_page_break() + + # 빈 줄 + elif line.strip() == '': + pass + + # 일반 텍스트 + else: + p = doc.add_paragraph() + # 굵게, 기울임 처리 + parts = re.split(r'(\*\*.*?\*\*|\*.*?\*|`.*?`)', line) + for part in parts: + if part.startswith('**') and part.endswith('**'): + run = p.add_run(part[2:-2]) + run.bold = True + elif part.startswith('*') and part.endswith('*'): + run = p.add_run(part[1:-1]) + run.italic = True + elif part.startswith('`') and part.endswith('`'): + run = p.add_run(part[1:-1]) + run.font.name = 'Consolas' + run.font.size = Pt(10) + else: + p.add_run(part) + + i += 1 + +# 저장 +doc.save('output.docx') +print(f'변환 완료: output.docx ({len(doc.paragraphs)}개 단락)') +``` + +## 표 변환 +Markdown 표가 있으면 Word 표로 변환합니다: +- 헤더 행: 굵게, 배경색 적용 +- 셀 정렬: Markdown의 `:---`, `:---:`, `---:` 구문 반영 +- 테두리: 전체 셀에 얇은 테두리 + +## 규칙 +- 원본 Markdown 파일은 수정하지 않음 +- 인코딩: UTF-8 기본 +- 이미지 링크(`![](path)`)는 로컬 파일이면 삽입, URL이면 경로만 표시 +- 복잡한 Markdown(수식, 다이어그램)은 지원 범위와 한계를 안내 +- 출력 파일명: 원본 파일명 기준 (.md → .docx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/meeting-minutes.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/meeting-minutes.skill.md new file mode 100644 index 0000000..e3ec988 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/meeting-minutes.skill.md @@ -0,0 +1,40 @@ +--- +name: meeting-minutes +label: 회의록 정리 +description: 회의 내용을 체계적으로 정리하여 회의록을 생성합니다. +icon: \uE771 +tabs: cowork +--- + +사용자가 제공한 회의 내용(텍스트, 메모, 파일)을 정리하여 체계적인 회의록을 작성하세요. + +다음 도구를 사용하세요: +1. file_read — 회의 관련 파일 읽기 (필요 시) +2. file_write — 회의록 파일 생성 + +회의록 형식: +## 회의 정보 +- 일시: +- 참석자: +- 장소/방법: +- 주제: + +## 안건 및 논의 내용 +각 안건별로: +- **안건**: 주제 +- **논의 내용**: 주요 발언 및 의견 정리 +- **결정 사항**: 합의된 내용 + +## 액션 아이템 +| 번호 | 담당자 | 내용 | 기한 | 비고 | +|------|--------|------|------|------| +| 1 | - | - | - | - | + +## 다음 회의 +- 예정일: +- 주요 안건: + +규칙: +- 핵심 내용 위주로 간결하게 정리 +- 결정 사항과 액션 아이템은 명확하게 기술 +- 한국어로 작성 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/ocr-extract.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/ocr-extract.skill.md new file mode 100644 index 0000000..8c7e71d --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/ocr-extract.skill.md @@ -0,0 +1,108 @@ +--- +name: ocr-extract +label: OCR 텍스트 추출 +description: Python pytesseract를 사용하여 이미지/스캔 문서에서 텍스트를 추출합니다. +icon: \uE8D4 +requires: python +tabs: cowork +--- + +이미지 또는 스캔된 문서에서 텍스트를 추출하세요. + +## 사전 준비 +1. Tesseract OCR 엔진이 시스템에 설치되어 있어야 합니다. + - Windows: https://github.com/UB-Mannheim/tesseract/wiki 에서 설치 + - 한국어 지원: 설치 시 "Korean" 언어 데이터 선택 +2. Python 패키지 설치: +``` +process_run: pip install pytesseract Pillow +``` + +## 작업 절차 +1. **이미지 확인**: 사용자가 제공한 이미지 파일 확인 +2. **전처리 (선택)**: 이미지 품질이 낮으면 전처리 스크립트 적용 +3. **OCR 실행**: pytesseract로 텍스트 추출 +4. **결과 저장**: 추출된 텍스트를 파일로 저장하고 사용자에게 안내 + +## OCR 스크립트 템플릿 + +### 기본 텍스트 추출 +```python +import pytesseract +from PIL import Image + +# Windows에서 Tesseract 경로 지정 (필요 시) +# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' + +img = Image.open('scan.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +print(text) + +with open('extracted.txt', 'w', encoding='utf-8') as f: + f.write(text) +``` + +### 이미지 전처리 (품질 개선) +```python +from PIL import Image, ImageFilter, ImageEnhance + +img = Image.open('scan.png') + +# 그레이스케일 변환 +img = img.convert('L') + +# 대비 향상 +enhancer = ImageEnhance.Contrast(img) +img = enhancer.enhance(2.0) + +# 선명도 향상 +img = img.filter(ImageFilter.SHARPEN) + +# 이진화 (흑백) +threshold = 128 +img = img.point(lambda x: 255 if x > threshold else 0) + +img.save('preprocessed.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +``` + +### 배치 OCR (여러 이미지) +```python +import glob +import pytesseract +from PIL import Image + +results = [] +for path in sorted(glob.glob('*.png')): + img = Image.open(path) + text = pytesseract.image_to_string(img, lang='kor+eng') + results.append(f'--- {path} ---\n{text}\n') + +with open('all_extracted.txt', 'w', encoding='utf-8') as f: + f.write('\n'.join(results)) +``` + +### 표 영역 추출 +```python +import pytesseract +from PIL import Image + +img = Image.open('table.png') +# TSV 형식으로 추출 (표 구조 보존) +tsv_data = pytesseract.image_to_data(img, lang='kor+eng', output_type=pytesseract.Output.DATAFRAME) +print(tsv_data) +``` + +## 지원 언어 +- `kor` — 한국어 +- `eng` — 영어 +- `kor+eng` — 한국어+영어 혼합 (권장) +- `jpn` — 일본어 +- `chi_sim` — 중국어 간체 + +## 팁 +- 스캔 해상도 300dpi 이상이면 인식률이 높습니다 +- 기울어진 이미지는 `img.rotate()` 로 보정 후 추출하세요 +- 손글씨는 인식률이 낮을 수 있습니다 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/paper-review.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/paper-review.skill.md new file mode 100644 index 0000000..72b558c --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/paper-review.skill.md @@ -0,0 +1,54 @@ +--- +name: paper-review +label: 논문 분석 +description: 논문 또는 기술 문서를 체계적으로 분석하고 핵심 내용을 정리합니다. +icon: \uE736 +tabs: cowork +--- + +사용자가 제공한 논문 또는 기술 문서를 체계적으로 분석하세요. + +## 파일 읽기 전략 +- **PDF 파일**: 반드시 `document_read` 도구를 사용하세요. 페이지 범위 지정이 가능합니다. + - 먼저 전체 페이지 수를 확인한 후, 초록(1-2페이지)→본문→참고문헌 순으로 읽으세요. + - `file_read`로 PDF를 읽으면 텍스트가 깨질 수 있으므로 사용하지 마세요. +- **텍스트 파일** (.txt, .md, .html 등): `file_read` 도구를 사용하세요. + +## 사용 도구 +1. document_read — PDF 논문 파일 읽기 (페이지 범위 지정, 초록/참고문헌 추출) +2. file_read — 텍스트 기반 문서 파일 읽기 +3. file_write — 분석 보고서 생성 + +## 분석 항목 +## 논문 개요 +- 제목, 저자, 발표 연도/학회 +- 연구 분야 및 키워드 + +## 연구 목적 및 배경 +- 연구 문제 정의 +- 기존 연구의 한계점 + +## 방법론 +- 제안 방법의 핵심 아이디어 +- 실험 설계 및 데이터셋 + +## 주요 결과 +- 핵심 실험 결과 (표/수치 인용) +- 기존 방법 대비 개선점 + +## 한계점 및 향후 연구 +- 저자가 인정한 한계 +- 발전 가능성 + +## 실무 적용 가능성 +- 우리 업무에 적용할 수 있는 포인트 +- 기술 도입 시 고려사항 + +## 작업 절차 +1. 사용자가 파일명을 언급하면 작업 폴더에서 해당 파일을 찾아 읽기 +2. PDF인 경우 `document_read`로 초록(1-2p) 먼저 읽어 전체 구조 파악 +3. 본문을 페이지 범위별로 나누어 순차 읽기 +4. 위 분석 항목에 따라 체계적으로 정리 +5. `file_write`로 분석 보고서를 마크다운 파일로 저장 + +한국어로 작성하고, 전문 용어는 원문과 함께 표기하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/pdf-processor.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/pdf-processor.skill.md new file mode 100644 index 0000000..4076e47 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/pdf-processor.skill.md @@ -0,0 +1,63 @@ +--- +name: pdf-processor +label: PDF 처리 +description: Python을 사용하여 PDF에서 텍스트/표를 추출하거나 PDF를 생성합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +PDF 파일을 읽거나 새 PDF를 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pypdf pdfplumber reportlab +``` + +## 작업 절차 + +### PDF 텍스트 추출 +1. **파일 확인**: folder_map으로 PDF 파일 위치 확인 +2. **추출 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행**: process_run으로 실행 +4. **결과 전달**: 추출된 텍스트를 사용자에게 전달 + +### PDF 생성 +1. **내용 파악**: 사용자가 원하는 문서 내용 확인 +2. **생성 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행 및 확인**: process_run으로 실행 + +## 텍스트 추출 템플릿 +```python +import pdfplumber +import json + +results = [] +with pdfplumber.open('input.pdf') as pdf: + for i, page in enumerate(pdf.pages): + text = page.extract_text() or '' + tables = page.extract_tables() or [] + results.append({ + 'page': i + 1, + 'text': text, + 'tables': tables, + }) + +with open('pdf_extracted.json', 'w', encoding='utf-8') as f: + json.dump(results, f, ensure_ascii=False, indent=2) + +for r in results: + print(f"--- 페이지 {r['page']} ---") + print(r['text'][:500]) +``` + +## 지원 기능 +- 텍스트 추출 (페이지별) +- 표 추출 (구조 보존) +- PDF 병합 / 분할 +- PDF 생성 (reportlab) +- 페이지 회전 +- 메타데이터 읽기 + +한국어로 안내하세요. 원본 PDF는 수정하지 마세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/perf-audit.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/perf-audit.skill.md new file mode 100644 index 0000000..9db18d8 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/perf-audit.skill.md @@ -0,0 +1,94 @@ +--- +name: perf-audit +label: 성능 감사 +description: 코드 복잡도, 성능 병목, 메모리 이슈를 분석하고 최적화 방안을 제시합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - glob + - html_create +tabs: code +--- + +코드베이스의 성능 관련 이슈를 분석하고 최적화 보고서를 생성하세요. + +## 워크플로우 + +1. **프로젝트 분석**: folder_map으로 구조 파악, 언어/프레임워크 식별 +2. **복잡도 분석**: 파일별 줄 수, 메서드 크기, 중첩 깊이 측정 +3. **성능 안티패턴 탐지**: grep으로 알려진 성능 이슈 패턴 검색 +4. **메모리 이슈 탐지**: 리소스 해제 누락, 대용량 할당 패턴 +5. **보고서 생성**: html_create로 성능 감사 보고서 + +## 분석 항목 + +### 코드 복잡도 지표 +- **파일 크기**: 500줄 이상 파일 식별 +- **메서드 크기**: 50줄 이상 메서드 식별 +- **중첩 깊이**: 4단계 이상 들여쓰기 +- **매개변수 수**: 5개 이상 파라미터 메서드 + +### 성능 안티패턴 + +#### 데이터베이스 +- N+1 쿼리 패턴 (루프 내 DB 호출) +- SELECT * 사용 (불필요한 컬럼 로드) +- 인덱스 미사용 쿼리 힌트 + +#### 메모리 +- IDisposable 미해제 (using 미사용) +- 대용량 문자열 결합 (StringBuilder 미사용) +- 정적 컬렉션 무한 증가 +- 이벤트 핸들러 미해제 (메모리 누수) + +#### I/O +- 동기 파일 I/O (async 미사용) +- 동기 네트워크 호출 +- 불필요한 직렬화/역직렬화 + +#### 알고리즘 +- O(n²) 이상 루프 (중첩 foreach/for) +- 반복 계산 (캐싱 미적용) +- LINQ 체인의 불필요한 ToList() + +#### 프론트엔드 +- 불필요한 리렌더링 패턴 +- 대용량 번들 임포트 +- 이미지 최적화 미적용 + +### .NET 전용 패턴 +``` +탐지 대상: +- Task.Result / .Wait() (데드락 위험) +- lock 내부 async 호출 +- GC.Collect() 직접 호출 +- Reflection 반복 사용 +- string + string 반복 (루프 내) +``` + +## 출력 형식 + +### 성능 감사 보고서 + +**요약 대시보드** +| 지표 | 값 | 상태 | +|------|-----|------| +| 총 파일 수 | ... | — | +| 대형 파일 (500줄+) | ... | ⚠ | +| 대형 메서드 (50줄+) | ... | ⚠ | +| 성능 안티패턴 | ... | 🔴 | +| 메모리 이슈 | ... | 🟡 | + +**상세 이슈 목록** +| 우선순위 | 파일 | 라인 | 이슈 | 영향 | 권장 조치 | +|---------|------|------|------|------|----------| +| 🔴 높음 | ... | ... | N+1 쿼리 | 응답 지연 | 일괄 로드 | + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 성능 이슈는 영향도와 수정 난이도를 함께 평가 +- 추측보다 패턴 기반 탐지 우선 +- 한국어로 작성 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/pptx-creator.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/pptx-creator.skill.md new file mode 100644 index 0000000..eeea93c --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/pptx-creator.skill.md @@ -0,0 +1,111 @@ +--- +name: pptx-creator +label: PPT 프레젠테이션 생성 +description: Python을 사용하여 전문적인 PowerPoint 프레젠테이션을 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE7BE +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 PowerPoint 프레젠테이션을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install python-pptx +``` + +## 양식 활용 (마스터 슬라이드 템플릿) +작업 폴더에 PPT 양식이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.pptx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .pptx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식의 슬라이드 레이아웃 목록 확인 +4. **양식 기반 생성**: + ```python + prs = Presentation('양식_발표.pptx') + # 마스터 슬라이드의 배경, 로고, 색 테마, 폰트가 자동 상속 + # 기존 슬라이드 제거 후 새 내용 추가 + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + ``` +5. **레이아웃 확인** (양식마다 다를 수 있음): + ```python + for i, layout in enumerate(prs.slide_layouts): + print(f'{i}: {layout.name}') + ``` +6. **양식이 없으면**: 아래 기본 템플릿으로 새 프레젠테이션 생성 + +## 작업 절차 +1. **요구사항 파악**: 발표 주제, 슬라이드 수, 스타일 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .pptx 파일이 있는지 확인 +3. **스크립트 작성**: file_write로 Python 스크립트 생성 +4. **실행**: process_run으로 스크립트 실행 +5. **결과 안내**: 생성된 .pptx 파일 경로를 사용자에게 전달 + +## 스크립트 템플릿 +```python +from pptx import Presentation +from pptx.util import Inches, Pt, Emu +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.pptx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 프레젠테이션 +if template_file: + prs = Presentation(template_file) + # 기존 슬라이드 제거 (마스터/레이아웃은 유지) + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + print(f'양식 활용: {template_file}') + print(f'사용 가능한 레이아웃: {[l.name for l in prs.slide_layouts]}') +else: + prs = Presentation() + prs.slide_width = Inches(13.333) + prs.slide_height = Inches(7.5) + +# 제목 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[0]) +slide.shapes.title.text = '프레젠테이션 제목' +if len(slide.placeholders) > 1: + slide.placeholders[1].text = '부제목' + +# 내용 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[1]) +slide.shapes.title.text = '섹션 제목' +body = slide.placeholders[1] +body.text = '첫 번째 포인트' +p = body.text_frame.add_paragraph() +p.text = '두 번째 포인트' + +prs.save('presentation.pptx') +print('프레젠테이션 생성 완료: presentation.pptx') +``` + +## 지원 기능 +- 제목/내용/빈 슬라이드 레이아웃 +- 텍스트 서식 (글꼴, 크기, 색상, 정렬) +- 표 삽입 +- 이미지 삽입 +- 도형 (사각형, 원, 화살표) +- 차트 (막대, 선, 원형) +- 슬라이드 번호 +- 마스터 슬라이드 커스터마이징 +- **양식 파일 기반 마스터/레이아웃 상속** (배경, 로고, 색 테마, 폰트 자동 유지) + +한국어로 안내하세요. 작업 폴더에 결과 파일을 저장하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/prd-generator.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/prd-generator.skill.md new file mode 100644 index 0000000..8236401 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/prd-generator.skill.md @@ -0,0 +1,100 @@ +--- +name: prd-generator +label: 요구사항 정의서 (PRD) +description: 제품 요구사항 정의서, 유저 스토리, 수용 기준을 체계적으로 생성합니다. +icon: \uE8A5 +allowed-tools: + - file_read + - file_write + - html_create + - docx_create + - document_plan + - document_assemble +tabs: cowork +--- + +제품/기능의 요구사항 정의서(PRD)를 체계적으로 작성하세요. + +## 워크플로우 + +1. **요구사항 수집**: 사용자에게 다음을 확인 + - 제품/기능 이름 + - 목적과 배경 + - 대상 사용자 + - 핵심 기능 목록 + - 제약 조건 (기술, 일정, 예산) + +2. **구조화**: document_plan으로 PRD 개요 설계 + +3. **상세 작성**: 섹션별 상세 내용 작성 + - 유저 스토리 (As a... I want... So that...) + - 수용 기준 (Given... When... Then...) + - 기능 우선순위 (MoSCoW) + +4. **문서 생성**: document_assemble 또는 html_create로 최종 문서 + +## PRD 구조 + +### 1. 개요 +- 제품/기능 이름 +- 버전 / 작성일 / 작성자 +- 문서 목적 + +### 2. 배경 및 목적 +- 비즈니스 배경 +- 해결하려는 문제 +- 기대 효과 (정량적 KPI) + +### 3. 대상 사용자 +- 사용자 페르소나 +- 사용 시나리오 +- 사용자 여정 맵 + +### 4. 기능 요구사항 + +#### 유저 스토리 형식 +``` +US-001: [기능명] +As a [역할], +I want [기능], +So that [가치]. + +수용 기준: +- Given [사전 조건], When [행동], Then [기대 결과] +- Given ..., When ..., Then ... + +우선순위: Must Have / Should Have / Could Have / Won't Have +``` + +### 5. 비기능 요구사항 +- 성능 (응답 시간, 처리량) +- 보안 (인증, 권한, 암호화) +- 접근성 (WCAG 수준) +- 호환성 (브라우저, OS, 디바이스) + +### 6. 기술 제약 +- 기술 스택 제한 +- 연동 시스템 +- 데이터 마이그레이션 + +### 7. 일정 및 마일스톤 +| 마일스톤 | 예정일 | 산출물 | +|---------|--------|--------| +| 설계 완료 | ... | 상세 설계서 | +| 개발 완료 | ... | 릴리즈 빌드 | +| QA 완료 | ... | 테스트 보고서 | + +### 8. 성공 지표 +- 핵심 KPI 및 측정 방법 +- 목표 수치 + +### 9. 리스크 및 대안 +| 리스크 | 영향 | 대안 | +|--------|------|------| +| ... | 높음 | ... | + +## 규칙 +- 사용자 관점에서 작성 (기술 용어 최소화) +- 유저 스토리는 INVEST 원칙 준수 (Independent, Negotiable, Valuable, Estimable, Small, Testable) +- 수용 기준은 테스트 가능하도록 구체적으로 +- 한국어로 작성 (영어 용어 병기 가능) diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/refactor.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/refactor.skill.md new file mode 100644 index 0000000..a58d54e --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/refactor.skill.md @@ -0,0 +1,65 @@ +--- +name: refactor +label: 리팩토링 가이드 +description: 코드베이스를 분석하여 리팩토링 포인트를 식별하고 실행 계획을 생성합니다. +icon: \uE90F +allowed-tools: + - search_codebase + - grep + - file_read + - code_review + - folder_map + - lsp_code_intel +tabs: code +--- + +코드베이스를 분석하여 리팩토링이 필요한 부분을 식별하고 개선 계획을 수립하세요. + +## 워크플로우 + +1. **구조 파악**: folder_map + grep으로 프로젝트 전체 구조 분석 +2. **코드 스멜 탐지**: + - 중복 코드 (grep으로 유사 패턴 검색) + - 긴 메서드/클래스 (file_read로 크기 확인) + - 복잡한 조건문 (중첩 if/switch) + - 미사용 코드 (lsp_code_intel로 참조 확인) +3. **의존성 분석**: lsp_code_intel로 참조 관계 파악 +4. **우선순위 결정**: 영향도 × 난이도 매트릭스 +5. **리팩토링 계획 생성**: 단계별 실행 계획 + +## 분석 항목 + +### 코드 스멜 (Code Smells) +- **중복 코드**: 3곳 이상 반복되는 유사 코드 +- **거대 클래스**: 500줄 이상의 클래스 +- **긴 메서드**: 50줄 이상의 메서드 +- **매개변수 과다**: 5개 이상 파라미터 +- **의존성 순환**: 상호 참조 관계 +- **매직 넘버**: 하드코딩된 숫자/문자열 +- **깊은 중첩**: 4단계 이상 들여쓰기 + +### 리팩토링 기법 (제안) +- Extract Method / Extract Class +- Rename (변수, 메서드, 클래스) +- Move Method / Move Field +- Replace Conditional with Polymorphism +- Introduce Parameter Object +- Remove Dead Code + +## 출력 형식 + +### 리팩토링 보고서 +| 우선순위 | 파일 | 이슈 | 제안 | 영향도 | 난이도 | +|---------|------|------|------|--------|--------| +| 🔴 높음 | ... | ... | ... | ★★★ | ★☆☆ | +| 🟡 중간 | ... | ... | ... | ★★☆ | ★★☆ | + +### 실행 계획 +1. [안전한 변경부터] ... +2. [테스트 추가 후] ... +3. [구조 변경] ... + +## 규칙 +- 코드를 직접 수정하지 않음 (분석 + 계획만) +- 기존 테스트가 있으면 테스트 커버리지 확인 +- 팀 컨벤션/스타일 가이드 존중 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/regex-helper.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/regex-helper.skill.md new file mode 100644 index 0000000..91e10dd --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/regex-helper.skill.md @@ -0,0 +1,86 @@ +--- +name: regex-helper +label: 정규식 도우미 +description: 정규식 패턴을 생성하고, 기존 패턴을 해석하며, 테스트 케이스로 검증합니다. +icon: \uE8FD +tabs: code +allowed-tools: + - regex_tool + - clipboard_tool + - file_read +--- + +사용자의 요구에 맞는 정규식 패턴을 작성하거나, 기존 패턴을 해석하고 테스트하세요. + +## 작업 절차 + +1. **요구사항 파악**: 사용자의 요청 유형을 판별 + - **패턴 생성**: "이메일 주소를 찾는 정규식 만들어줘" + - **패턴 해석**: "이 정규식이 무슨 뜻이야? `^[\w.-]+@[\w.-]+\.\w+$`" + - **패턴 테스트**: "이 패턴이 이 문자열에 매칭되는지 확인해줘" +2. **패턴 작성 또는 분석**: + - 생성: 요구사항을 분석하여 정규식 패턴 작성 + - 해석: 패턴을 구성 요소별로 분해하여 설명 +3. **테스트 수행**: regex_tool로 패턴을 테스트 케이스에 적용 + - 매칭되어야 할 문자열 (positive cases) + - 매칭되지 않아야 할 문자열 (negative cases) +4. **결과 설명**: 매칭 결과와 캡처 그룹을 상세히 설명 +5. **최적화 제안**: 성능 또는 가독성 개선이 가능하면 대안 제시 + +## 패턴 생성 가이드 + +### 자주 사용되는 패턴 +| 용도 | 패턴 | 설명 | +|------|------|------| +| 이메일 | `[\w.-]+@[\w.-]+\.\w{2,}` | 기본 이메일 형식 | +| 전화번호 (한국) | `0\d{1,2}-\d{3,4}-\d{4}` | 010-1234-5678 형식 | +| 날짜 (YYYY-MM-DD) | `\d{4}-(?:0[1-9]\|1[0-2])-(?:0[1-9]\|[12]\d\|3[01])` | ISO 날짜 형식 | +| IP 주소 | `(?:\d{1,3}\.){3}\d{1,3}` | IPv4 기본 | +| URL | `https?://[\w.-]+(?:/[\w./?#&=-]*)?` | HTTP/HTTPS URL | +| 한글만 | `[가-힣]+` | 한글 문자 | +| 사업자등록번호 | `\d{3}-\d{2}-\d{5}` | 123-45-67890 형식 | + +### 패턴 해석 형식 +패턴을 해석할 때는 다음 구조로 설명하세요: +``` +패턴: ^(\d{3})-(\d{2})-(\d{5})$ +해석: + ^ → 문자열 시작 + (\d{3}) → 캡처 그룹 1: 숫자 3자리 + - → 하이픈 (리터럴) + (\d{2}) → 캡처 그룹 2: 숫자 2자리 + - → 하이픈 (리터럴) + (\d{5}) → 캡처 그룹 3: 숫자 5자리 + $ → 문자열 끝 +``` + +## 테스트 형식 +테스트 결과는 다음 형식으로 표시하세요: +``` +패턴: \d{3}-\d{2}-\d{5} + +✅ 매칭 성공: + "123-45-67890" → 전체 매칭: "123-45-67890" + "사업자번호: 123-45-67890입니다" → 부분 매칭: "123-45-67890" + +❌ 매칭 실패: + "12-345-67890" → 형식 불일치 + "abc-de-fghij" → 숫자가 아닌 문자 +``` + +## 플래그 안내 +| 플래그 | 설명 | +|--------|------| +| `i` | 대소문자 무시 | +| `m` | 멀티라인 (^$가 각 줄에 적용) | +| `s` | 점(.)이 줄바꿈도 매칭 | +| `g` | 전역 검색 (모든 매칭) | + +## 규칙 +- 패턴 생성 시 positive/negative 테스트 케이스를 반드시 포함 +- 복잡한 패턴은 주석이 포함된 확장 모드(`x`)로 설명 +- 캡처 그룹이 있으면 각 그룹의 의미를 설명 +- 성능에 민감한 경우 탐욕적/게으른 수량자 선택 이유를 설명 +- 최종 패턴은 clipboard_tool로 클립보드에 복사 + +한국어로 안내하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/release-note.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/release-note.skill.md new file mode 100644 index 0000000..2dc122a --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/release-note.skill.md @@ -0,0 +1,96 @@ +--- +name: release-note +label: 릴리즈 노트 생성 +description: 비개발자 대상의 사용자 친화적인 릴리즈 노트를 자동 생성합니다. +icon: \uE70B +tabs: code +allowed-tools: + - file_read + - file_write + - clipboard_tool + - html_create +--- + +사용자(비개발자) 대상의 읽기 쉬운 릴리즈 노트를 작성하세요. + +## 작업 절차 + +1. **변경 정보 수집**: 사용자에게 다음 정보를 확인 + - 버전 번호 (예: v1.6.0) + - 릴리즈 날짜 + - 주요 변경 내용 (기능 추가, 개선, 버그 수정) + - 참고 자료: CHANGELOG, 커밋 이력, 개발 문서 등 +2. **내용 분류**: 수집된 변경 사항을 사용자 관점으로 분류 + - 기술 용어 → 사용자 언어로 변환 + - 내부 리팩토링 등 사용자에게 무관한 항목은 제외 +3. **릴리즈 노트 초안 작성**: 아래 템플릿 기반으로 작성 +4. **사용자 검토**: 초안을 보여주고 수정 요청 반영 +5. **최종 출력**: Markdown, HTML, 또는 텍스트 형식으로 저장 + +## 릴리즈 노트 템플릿 + +```markdown +# [제품명] v[버전] 업데이트 안내 + +안녕하세요. [제품명] v[버전] 업데이트 소식을 안내드립니다. + +## 🎉 새로운 기능 + +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] + +## ✨ 개선 사항 + +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] + +## 🐛 문제 해결 + +- [사용자가 겪었던 문제]를 해결했습니다. +- [사용자가 겪었던 문제]를 해결했습니다. + +## ⚠️ 알려진 이슈 + +- [현재 알려진 제한 사항이나 이슈] +- [해결 예정 시기 또는 임시 해결 방법] + +--- + +문의 사항이 있으시면 [연락처/채널]로 알려주세요. +감사합니다. +``` + +## 작성 원칙 + +### 사용자 언어로 변환 +| 개발 용어 (사용 금지) | 사용자 표현 (사용) | +|---------------------|-------------------| +| API 엔드포인트 추가 | 새로운 연동 기능 추가 | +| 메모리 누수 수정 | 장시간 사용 시 느려지는 문제 해결 | +| UI 리팩토링 | 화면 디자인 개선 | +| 캐시 최적화 | 실행 속도 개선 | +| null 참조 오류 수정 | 예기치 않은 오류로 종료되는 문제 해결 | +| 인코딩 이슈 수정 | 한글이 깨져 보이는 문제 해결 | +| 동시성 버그 수정 | 여러 작업 동시 실행 시 오류 발생 문제 해결 | + +### 작성 규칙 +- **혜택 중심**: "무엇을 했다"가 아닌 "사용자에게 어떤 도움이 되는지" 설명 +- **간결**: 한 항목당 1~2문장 이내 +- **구체적**: "성능 개선" → "파일 열기 속도가 약 2배 빨라졌습니다" +- **긍정적 톤**: 문제를 "해결했습니다", 기능을 "추가했습니다" +- **이모지 활용**: 섹션별 시각적 구분 (새 기능: 🎉, 개선: ✨, 수정: 🐛, 주의: ⚠️) + +## 출력 형식 +- **Markdown**: 기본 출력 형식 (.md) +- **HTML**: html_create로 스타일이 적용된 웹 페이지 생성 +- **텍스트**: 이메일 본문용 서식 없는 텍스트 +- 사용자가 원하는 형식으로 제공 + +## 규칙 +- 내부 기술 구현 세부사항은 노출하지 않음 +- 사용자에게 무관한 변경(코드 리팩토링, 테스트 추가 등)은 제외 +- Breaking Change가 있으면 "이전 버전과 달라진 점" 섹션 추가 +- 업데이트 방법 안내를 포함 (인스톨러 경로, 주의사항) +- 최종 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/report-writer.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/report-writer.skill.md new file mode 100644 index 0000000..f5e9181 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/report-writer.skill.md @@ -0,0 +1,33 @@ +--- +name: report-writer +label: 보고서 작성 +description: 작업 폴더의 데이터를 분석하여 체계적인 업무 보고서를 생성합��다. +icon: \uE9F9 +tabs: cowork +--- + +작업 폴더의 파일과 데이터를 분석하여 업무 보고서를 작성하세요. + +다음 도구를 사용하세요: +1. folder_map — 작업 폴더의 파일 구조 파악 +2. file_read — 관련 데이터 파일 읽기 (CSV, Excel, 텍스트) +3. file_write — 보고서 파일 생성 (HTML 또는 Markdown) + +보고서 구성: +## 제목 +- 작성 일시, 작성자 (요청 시) + +## 요약 (Executive Summary) +- 핵심 내용을 3줄 이내로 요약 + +## 본문 +- 데이터 기반 분석 결과 +- 표/차트를 활용한 시각적 정리 +- 주요 발견 사항 + +## 결론 및 제안 +- 결론 요약 +- 향후 조치 사항 + +HTML 보고서 생성 시 현재 적용된 디자인 무드를 반영하세요. +한국어로 작성하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/security-audit.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/security-audit.skill.md new file mode 100644 index 0000000..d32ed32 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/security-audit.skill.md @@ -0,0 +1,93 @@ +--- +name: security-audit +label: 보안 코드 감사 +description: 코드베이스의 보안 취약점을 점검하고 OWASP 기반 보안 보고서를 생성합니다. +icon: \uE72E +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - html_create + - glob +tabs: code +--- + +코드베이스의 보안 취약점을 체계적으로 점검하고 보고서를 생성하세요. + +## 워크플로우 + +1. **스캔 범위 확인**: folder_map으로 프로젝트 구조 파악, 언어/프레임워크 식별 +2. **취약점 패턴 탐지**: grep으로 위험 패턴 검색 +3. **의존성 분석**: 패키지 파일(package.json, *.csproj, requirements.txt) 읽기 +4. **비밀 정보 노출 검사**: API 키, 토큰, 비밀번호 하드코딩 탐지 +5. **보고서 생성**: html_create로 보안 감사 보고서 생성 + +## OWASP Top 10 점검 항목 + +### A01 — 접근 제어 취약 +- 인증 없는 API 엔드포인트 +- 하드코딩된 권한 체크 +- 관리자 경로 노출 + +### A02 — 암호화 실패 +- 평문 비밀번호 저장 +- 약한 해시 알고리즘 (MD5, SHA1) +- HTTP (비HTTPS) 통신 + +### A03 — 인젝션 +- SQL 인젝션 (문자열 결합 쿼리) +- XSS (innerHTML, dangerouslySetInnerHTML) +- 명령 인젝션 (Process.Start, exec, system) +- 경로 순회 (../ 미검증) + +### A04 — 불안전한 설계 +- 비즈니스 로직 검증 누락 +- 레이트 리밋 미적용 + +### A05 — 보안 설정 오류 +- 디버그 모드 활성화 상태 +- 기본 자격증명 사용 +- 불필요한 포트/서비스 노출 + +### A07 — 인증 실패 +- 약한 비밀번호 정책 +- 세션 만료 미설정 +- 브루트포스 방어 부재 + +### A09 — 로깅/모니터링 부족 +- 보안 이벤트 미기록 +- 민감 정보 로그 출력 + +## 비밀 정보 탐지 패턴 + +``` +grep 대상 패턴: +- password\s*=\s*["'][^"']+["'] +- api[_-]?key\s*=\s*["'][^"']+["'] +- secret\s*=\s*["'][^"']+["'] +- token\s*=\s*["'][A-Za-z0-9+/=]{20,}["'] +- -----BEGIN (RSA |EC )?PRIVATE KEY----- +- AWS_ACCESS_KEY_ID +- AKIA[0-9A-Z]{16} +``` + +## 출력 형식 + +### 보안 감사 보고서 +| 위험도 | 카테고리 | 파일 | 라인 | 내용 | 권장 조치 | +|--------|---------|------|------|------|----------| +| 🔴 심각 | A03 인젝션 | ... | ... | SQL 문자열 결합 | 파라미터 바인딩 사용 | +| 🟡 경고 | A02 암호화 | ... | ... | MD5 해시 사용 | SHA-256 이상 전환 | +| 🟢 참고 | A09 로깅 | ... | ... | 에러 로깅 미흡 | 보안 이벤트 로깅 추가 | + +### 요약 통계 +- 심각/경고/참고 건수 +- OWASP 카테고리별 분포 +- 우선 조치 항목 Top 5 + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 발견된 비밀 정보는 마스킹하여 보고 (앞 4자만 표시) +- 위험도는 보수적으로 평가 +- 한국어로 보고서 작성 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/sql-report.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/sql-report.skill.md new file mode 100644 index 0000000..76efeca --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/sql-report.skill.md @@ -0,0 +1,52 @@ +--- +name: sql-report +label: SQL 리포트 +description: DB 쿼리를 실행하고 결과를 차트화하여 HTML/Excel 보고서로 생성합니다. +icon: \uE968 +allowed-tools: + - sql_tool + - chart_create + - excel_create + - html_create + - data_pivot +tabs: cowork +--- + +데이터베이스에서 쿼리를 실행하고 결과를 시각화된 보고서로 생성하세요. + +## 워크플로우 + +1. **DB 확인**: sql_tool로 테이블 목록 및 스키마 확인 +2. **쿼리 작성**: 사용자 요청에 맞는 SQL 쿼리 작성 +3. **데이터 조회**: sql_tool로 쿼리 실행 +4. **데이터 가공**: data_pivot으로 집계/피벗 (필요 시) +5. **시각화**: chart_create로 차트 생성 +6. **보고서**: html_create 또는 excel_create로 최종 보고서 생성 + +## 쿼리 작성 원칙 +- SELECT 쿼리만 실행 (데이터 변경 금지) +- 결과 행 수 제한: LIMIT 1000 (대량 데이터 방지) +- 인덱스 활용 쿼리 작성 +- 한글 컬럼명은 alias로 변환 + +## 보고서 구성 + +### 1. 데이터 요약 +- 조회 조건, 기간, 데이터 건수 +- 기본 통계 (합계, 평균, 최대/최소) + +### 2. 시각화 +- 적절한 차트 유형 자동 선택 +- 비교 → 바 차트 +- 추세 → 라인 차트 +- 비율 → 파이/도넛 차트 + +### 3. 상세 데이터 +- Excel: 원본 데이터 + 서식 + 수식 +- HTML: 테이블 + 정렬/필터 + +## 규칙 +- DB 경로는 사용자에게 확인 +- 민감 데이터(개인정보) 마스킹 권고 +- 쿼리 실행 전 사용자 승인 +- 한국어로 보고서 작성 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/translate.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/translate.skill.md new file mode 100644 index 0000000..bc793de --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/translate.skill.md @@ -0,0 +1,60 @@ +--- +name: translate +label: 번역 + 교정 +description: 문서나 텍스트를 번역하고 전문 용어를 보존하며 교정합니다. +icon: \uE8C1 +allowed-tools: + - file_read + - file_write + - document_read + - clipboard_tool +tabs: all +--- + +사용자가 제공한 텍스트 또는 문서를 번역하고 교정하세요. + +## 워크플로우 + +1. **입력 확인**: 텍스트 직접 입력 또는 파일 경로 확인 +2. **언어 감지**: 원문 언어를 자동 감지 +3. **번역 실행**: + - 원문의 뉘앙스와 문맥을 살려 번역 + - 전문 용어는 원어를 괄호 안에 병기: "수율(Yield)" + - 문화적 차이를 고려한 자연스러운 표현 사용 +4. **교정**: 번역 결과의 문법, 맞춤법, 어색한 표현 수정 +5. **결과 제공**: 번역문 + 주요 용어 대조표 + +## 번역 원칙 + +### 정확성 +- 원문의 의미를 정확하게 전달 +- 숫자, 날짜, 고유명사는 원문 그대로 유지 +- 약어는 처음 등장 시 풀어 번역 + +### 가독성 +- 목표 언어의 자연스러운 문체 사용 +- 긴 문장은 적절히 분리 +- 수동태 → 능동태 변환 (한국어의 경우) + +### 전문성 +- 분야별 전문 용어 일관 사용 +- 동일 용어는 문서 전체에서 통일 +- 번역 불가능한 용어는 원어 유지 + +## 출력 형식 + +``` +## 번역 결과 + +[번역된 텍스트] + +--- + +## 용어 대조표 +| 원문 | 번역 | 비고 | +|------|------|------| +| Yield | 수율 | 반도체 공정 용어 | +``` + +## 지원 언어 +한국어 ↔ 영어 / 일본어 / 중국어 (간/번체) / 독일어 / 프랑스어 / 스페인어 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/weekly-report.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/weekly-report.skill.md new file mode 100644 index 0000000..342449e --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/weekly-report.skill.md @@ -0,0 +1,65 @@ +--- +name: weekly-report +label: 주간 보고서 +description: 작업 폴더의 변경 이력을 기반으로 자동 주간보고 초안을 생성합니다. +icon: \uE787 +allowed-tools: + - git_tool + - folder_map + - file_read + - file_watch + - html_create + - docx_create + - text_summarize +tabs: cowork +--- + +작업 폴더의 최근 활동을 분석하여 주간 보고서 초안을 자동 생성하세요. + +## 워크플로우 + +1. **활동 수집**: + - git_tool로 최근 7일간 커밋 이력 조회 + - file_watch로 최근 변경/생성된 파일 목록 확인 + - folder_map으로 프로젝트 구조 파악 + +2. **내용 분석**: + - 커밋 메시지 분류 (기능 추가, 버그 수정, 리팩토링 등) + - 변경 파일 유형별 분류 + - 주요 변경사항 요약 + +3. **보고서 작성**: + - HTML 또는 Word 형식으로 보고서 생성 + - 차트/표로 활동 통계 시각화 + +## 보고서 구성 + +### 1. 주간 요약 +- 보고 기간: yyyy-MM-dd ~ yyyy-MM-dd +- 주요 성과 (3줄 이내) + +### 2. 완료 항목 +| 번호 | 구분 | 내용 | 비고 | +|------|------|------|------| +| 1 | 기능 | ... | 커밋 참조 | + +### 3. 진행 중 항목 +- 현재 작업 중인 사항 +- 진척률 (가능하면) + +### 4. 이슈 및 리스크 +- 지연 사항 +- 블로킹 이슈 + +### 5. 다음 주 계획 +- 예정 작업 항목 + +### 6. 활동 통계 (차트) +- 일별 커밋 수 +- 파일 유형별 변경 비율 + +## 규칙 +- 사실 기반으로 작성 (추측 금지) +- Git 이력이 없으면 파일 변경 이력만으로 작성 +- 한국어로 작성 +- 보고서 톤: 간결하고 전문적 diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/xlsx-analyzer.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/xlsx-analyzer.skill.md new file mode 100644 index 0000000..267a312 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/xlsx-analyzer.skill.md @@ -0,0 +1,97 @@ +--- +name: xlsx-analyzer +label: Excel 데이터 분석 +description: Python을 사용하여 Excel/CSV 데이터를 분석하고 보고서를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +작업 폴더의 Excel 또는 CSV 데이터를 Python으로 분석하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pandas openpyxl +``` + +## 양식 활용 (Excel 보고서 템플릿) +작업 폴더에 Excel 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더에서 `.xlsx` 파일 목록 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본", "보고서양식" 포함 + - 또는 사용자가 "XX 양식에 맞춰서 작성해줘" 요청 + - 또는 사용자가 특정 .xlsx 파일명을 양식으로 지정 +3. **양식 구조 파악**: `document_read`로 양식의 시트 구조, 셀 레이아웃 확인 +4. **양식 기반 데이터 삽입**: + ```python + from openpyxl import load_workbook + wb = load_workbook('양식_보고서.xlsx') + ws = wb.active + # 양식의 서식(셀 병합, 테두리, 글꼴, 색상, 열 너비)이 그대로 유지됨 + # 데이터 영역에만 새 값 삽입 + ws['B3'] = '분석 결과값' + wb.save('결과_보고서.xlsx') + ``` +5. **양식이 없으면**: 아래 기본 방식으로 분석 결과 생성 + +## 작업 절차 +1. **데이터 파일 탐색**: folder_map으로 작업 폴더에서 .xlsx, .csv 파일 확인 +2. **양식 확인**: 양식 .xlsx 파일이 있는지 확인 (데이터 파일과 양식 파일 구분) +3. **데이터 읽기**: file_read 또는 document_read로 파일 구조 파악 +4. **분석 스크립트 작성**: file_write로 Python 분석 스크립트 생성 +5. **실행**: process_run으로 스크립트 실행 +6. **결과 보고**: 분석 결과를 사용자에게 정리하여 전달 + +## 분석 스크립트 템플릿 +```python +import pandas as pd +import json +import os + +df = pd.read_excel('data.xlsx') # 또는 pd.read_csv('data.csv') + +report = { + 'shape': list(df.shape), + 'columns': list(df.columns), + 'dtypes': {col: str(dtype) for col, dtype in df.dtypes.items()}, + 'missing': df.isnull().sum().to_dict(), + 'describe': df.describe().to_dict(), +} + +# 양식 파일로 결과 내보내기 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.xlsx') and f != 'data.xlsx' and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +if template_file: + from openpyxl import load_workbook + wb = load_workbook(template_file) + ws = wb.active + # 양식 서식 유지하면서 데이터 삽입 + print(f'양식 활용: {template_file}') + # TODO: 양식 구조에 맞게 데이터 삽입 로직 작성 + wb.save('결과_보고서.xlsx') +else: + # 양식 없으면 JSON으로 저장 + with open('analysis_result.json', 'w', encoding='utf-8') as f: + json.dump(report, f, ensure_ascii=False, indent=2, default=str) + +print(json.dumps(report, ensure_ascii=False, indent=2, default=str)) +``` + +## 지원 분석 +- 기본 통계 (평균, 중앙값, 표준편차, 분위수) +- 결측치 분석 +- 컬럼별 고유값 분포 +- 피벗 테이블 / 그룹별 집계 +- 시트 간 비교 분석 +- 필터링 및 조건부 추출 +- 분석 결과를 새 Excel로 내보내기 +- **양식 파일 기반 보고서 생성** (셀 서식, 병합, 테두리, 차트 영역 유지) + +한국어로 안내하세요. 원본 파일은 수정하지 마세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/yield-analysis.skill.md b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/yield-analysis.skill.md new file mode 100644 index 0000000..408ba31 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/skills/yield-analysis.skill.md @@ -0,0 +1,40 @@ +--- +name: yield-analysis +label: 수율 분석 +description: 제조/연구 데이터의 수율을 분석하고 개선 포인트를 도출합니다. +icon: \uE9D2 +tabs: cowork +--- + +작업 폴더의 데이터를 활���하여 수율 분석을 수행하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — 분석 보고서 생성 + +분석 프로세스: +## 데이터 개요 +- 분석 대상 데이터셋 설명 +- 데이터 기간, 샘플 수, 주요 변수 + +## 수율 현황 +- 전체 수율 통계 (평균, 중앙값, 표준편차) +- 기간별/로트별/공정별 수율 추이 +- 목표 수율 대비 달성률 + +## 불량 분석 +- 불량 유형별 분류 및 비율 +- 파레토 분석 (상위 불량 원인) +- 시간대/조건별 불량 패턴 + +## 상관관계 분석 +- 주요 공정 변수와 수율의 관계 +- 이상치 탐지 및 원인 추정 + +## 개선 제안 +- 수율 향상을 위한 구체적 조치 사항 +- 우선순위별 개선 로드맵 +- 예상 개선 효과 + +표와 수치를 적극 활용하세요. 한국어로 작성하세요. diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/system_prompt.txt b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/system_prompt.txt new file mode 100644 index 0000000..5a999d3 --- /dev/null +++ b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/system_prompt.txt @@ -0,0 +1 @@ +[역할] 당신은 회사 업무의 도움을 주는 매우 유능한 비서입니다. 말투는 정중하게 하며, 욕을 해서는 안됩니다. \ No newline at end of file diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/testhost.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/testhost.dll new file mode 100644 index 0000000..baca50e Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/testhost.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/testhost.exe b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/testhost.exe new file mode 100644 index 0000000..aef5660 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/testhost.exe differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..02460bc Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..7ebff60 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..6a43d17 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..cd5f122 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..cc1f907 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.abstractions.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.abstractions.dll new file mode 100644 index 0000000..d1e90bf Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.abstractions.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.assert.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.assert.dll new file mode 100644 index 0000000..a09cb40 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.assert.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.core.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.core.dll new file mode 100644 index 0000000..1a2cb59 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.core.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.execution.dotnet.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.execution.dotnet.dll new file mode 100644 index 0000000..38ee394 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.execution.dotnet.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.runner.reporters.netcoreapp10.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.runner.reporters.netcoreapp10.dll new file mode 100644 index 0000000..ca76232 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.runner.reporters.netcoreapp10.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.runner.utility.netcoreapp10.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.runner.utility.netcoreapp10.dll new file mode 100644 index 0000000..c247a4e Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.runner.utility.netcoreapp10.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.runner.visualstudio.testadapter.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.runner.visualstudio.testadapter.dll new file mode 100644 index 0000000..2c4b812 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/xunit.runner.visualstudio.testadapter.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..1507c61 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..3b5dbe4 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..c621c8c Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..6412fb1 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..e6273aa Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll new file mode 100644 index 0000000..49a0415 Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll new file mode 100644 index 0000000..6852d4e Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll new file mode 100644 index 0000000..f78103d Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll new file mode 100644 index 0000000..c7a729f Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll differ diff --git a/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll new file mode 100644 index 0000000..2fdf78b Binary files /dev/null and b/src/AxCopilot.Tests/bin/Debug/net8.0-windows/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll differ diff --git a/src/AxCopilot.Tests/obj/AxCopilot.Tests.csproj.nuget.dgspec.json b/src/AxCopilot.Tests/obj/AxCopilot.Tests.csproj.nuget.dgspec.json new file mode 100644 index 0000000..d71bbcc --- /dev/null +++ b/src/AxCopilot.Tests/obj/AxCopilot.Tests.csproj.nuget.dgspec.json @@ -0,0 +1,260 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot.Tests\\AxCopilot.Tests.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot.Tests\\AxCopilot.Tests.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot.Tests\\AxCopilot.Tests.csproj", + "projectName": "AxCopilot.Tests", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.Tests\\AxCopilot.Tests.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot.Tests\\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": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "FluentAssertions": { + "target": "Package", + "version": "[6.12.0, )" + }, + "Microsoft.NET.Test.Sdk": { + "target": "Package", + "version": "[17.11.0, )" + }, + "xunit": { + "target": "Package", + "version": "[2.9.0, )" + }, + "xunit.runner.visualstudio": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[2.8.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App.WPF": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.7.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.Tests/obj/AxCopilot.Tests.csproj.nuget.g.props b/src/AxCopilot.Tests/obj/AxCopilot.Tests.csproj.nuget.g.props new file mode 100644 index 0000000..f459f5a --- /dev/null +++ b/src/AxCopilot.Tests/obj/AxCopilot.Tests.csproj.nuget.g.props @@ -0,0 +1,26 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + + + + + + + + C:\Users\admin\.nuget\packages\xunit.analyzers\1.15.0 + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot.Tests/obj/AxCopilot.Tests.csproj.nuget.g.targets b/src/AxCopilot.Tests/obj/AxCopilot.Tests.csproj.nuget.g.targets new file mode 100644 index 0000000..a964a9e --- /dev/null +++ b/src/AxCopilot.Tests/obj/AxCopilot.Tests.csproj.nuget.g.targets @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilo.2027323E.Up2Date b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilo.2027323E.Up2Date new file mode 100644 index 0000000..e69de29 diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.AssemblyInfo.cs b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.AssemblyInfo.cs new file mode 100644 index 0000000..7bb8845 --- /dev/null +++ b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.AssemblyInfoInputs.cache b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.AssemblyInfoInputs.cache new file mode 100644 index 0000000..9109629 --- /dev/null +++ b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c751fbcb7938ba2bcf6e0844a6f9a2eda236d14a63bc649f7d9a41b73bb0f4a0 diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..6f8cfb4 --- /dev/null +++ b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.GeneratedMSBuildEditorConfig.editorconfig @@ -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.Tests +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot.Tests\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.GlobalUsings.g.cs b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.assets.cache b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.assets.cache new file mode 100644 index 0000000..03869a9 Binary files /dev/null and b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.assets.cache differ diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.csproj.AssemblyReference.cache b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.csproj.AssemblyReference.cache new file mode 100644 index 0000000..002dfa9 Binary files /dev/null and b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.csproj.AssemblyReference.cache differ diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.csproj.CoreCompileInputs.cache b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..b64d849 --- /dev/null +++ b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +99231c6efca0cfd2dc5814d58bda22eeb314e4d7afb0c041583279c8d84c358d diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.csproj.FileListAbsolute.txt b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..326c842 --- /dev/null +++ b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.csproj.FileListAbsolute.txt @@ -0,0 +1,205 @@ +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\.msCoverageSourceRootsMapping_AxCopilot.Tests +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\testhost.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\win-x86\native\WebView2Loader.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\win-x64\native\WebView2Loader.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\win-arm64\native\WebView2Loader.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.deps.json +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.runtimeconfig.json +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\SearchEngines\duckduckgo.png +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\SearchEngines\github.png +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\SearchEngines\google.png +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\SearchEngines\namuwiki.png +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\SearchEngines\naver.png +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\SearchEngines\navermap.png +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\SearchEngines\wikipedia.png +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\SearchEngines\youtube.png +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\system_prompt.txt +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\icon.ico +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.exe +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\testhost.exe +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\xunit.runner.visualstudio.testadapter.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\xunit.runner.reporters.netcoreapp10.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\xunit.runner.utility.netcoreapp10.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.Tests.deps.json +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.Tests.runtimeconfig.json +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.Tests.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.Tests.pdb +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\DocumentFormat.OpenXml.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\DocumentFormat.OpenXml.Framework.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\FluentAssertions.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Markdig.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.VisualStudio.CodeCoverage.Shim.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.TestPlatform.CoreUtilities.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.TestPlatform.PlatformAbstractions.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.VisualStudio.TestPlatform.ObjectModel.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.TestPlatform.CommunicationUtilities.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.TestPlatform.CrossPlatEngine.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.TestPlatform.Utilities.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.VisualStudio.TestPlatform.Common.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Newtonsoft.Json.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\System.Diagnostics.EventLog.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\System.IO.Packaging.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\System.ServiceProcess.ServiceController.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\UglyToad.PdfPig.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\UglyToad.PdfPig.Core.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\UglyToad.PdfPig.Fonts.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\UglyToad.PdfPig.Tokenization.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\UglyToad.PdfPig.Tokens.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\xunit.abstractions.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\xunit.assert.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\xunit.core.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\xunit.execution.dotnet.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\cs\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\cs\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\de\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\de\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\es\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\es\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\fr\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\fr\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\it\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\it\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ja\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ja\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ko\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ko\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pl\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pl\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pt-BR\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pt-BR\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ru\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ru\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\tr\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\tr\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hans\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hans\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hant\Microsoft.TestPlatform.CoreUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hant\Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\cs\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\cs\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\cs\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\de\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\de\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\de\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\es\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\es\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\es\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\fr\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\fr\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\fr\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\it\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\it\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\it\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ja\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ja\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ja\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ko\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ko\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ko\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pl\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pl\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pl\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pt-BR\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pt-BR\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\pt-BR\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ru\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ru\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\ru\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\tr\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\tr\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\tr\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hans\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hans\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hans\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hant\Microsoft.TestPlatform.CommunicationUtilities.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hant\Microsoft.TestPlatform.CrossPlatEngine.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\zh-Hant\Microsoft.VisualStudio.TestPlatform.Common.resources.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\win\lib\net8.0\System.Diagnostics.EventLog.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\win\lib\net8.0\System.ServiceProcess.ServiceController.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.SDK.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.Web.WebView2.Core.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.Web.WebView2.WinForms.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.Web.WebView2.Wpf.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.pdb +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\AxCopilot.SDK.pdb +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.Web.WebView2.Core.xml +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.Web.WebView2.WinForms.xml +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.Web.WebView2.Wpf.xml +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\AxCopilot.Tests.csproj.AssemblyReference.cache +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\AxCopilot.Tests.GeneratedMSBuildEditorConfig.editorconfig +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\AxCopilot.Tests.AssemblyInfoInputs.cache +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\AxCopilot.Tests.AssemblyInfo.cs +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\AxCopilot.Tests.csproj.CoreCompileInputs.cache +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\AxCopilo.2027323E.Up2Date +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\AxCopilot.Tests.dll +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\refint\AxCopilot.Tests.dll +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\AxCopilot.Tests.pdb +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\AxCopilot.Tests.genruntimeconfig.cache +E:\AX Copilot\src\AxCopilot.Tests\obj\Debug\net8.0-windows\ref\AxCopilot.Tests.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\guide_user.enc +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Assets\guide_dev.enc +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\adr-writer.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\api-docs.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\batch-rename.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\changelog.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\code-scaffold.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\commit-review.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\compare.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\csv-to-xlsx.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\data-convert.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\data-visualize-adv.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\data-visualize.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\db-schema.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\dependency-audit.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\diagram-generator.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\docx-creator.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\email-draft.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\env-setup.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\gen-test.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\image-processor.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\impact.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\json-schema.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\log-analyze.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\markdown-to-doc.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\meeting-minutes.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\ocr-extract.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\paper-review.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\pdf-processor.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\perf-audit.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\pptx-creator.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\prd-generator.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\refactor.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\regex-helper.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\release-note.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\report-writer.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\security-audit.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\sql-report.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\translate.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\weekly-report.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\xlsx-analyzer.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\skills\yield-analysis.skill.md +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\Microsoft.Data.Sqlite.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\SQLitePCLRaw.batteries_v2.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\SQLitePCLRaw.core.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\SQLitePCLRaw.provider.e_sqlite3.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\browser-wasm\nativeassets\net8.0\e_sqlite3.a +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-arm\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-arm64\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-armel\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-mips64\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-musl-arm\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-musl-arm64\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-musl-x64\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-ppc64le\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-s390x\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-x64\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\linux-x86\native\libe_sqlite3.so +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\maccatalyst-arm64\native\libe_sqlite3.dylib +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\maccatalyst-x64\native\libe_sqlite3.dylib +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\osx-arm64\native\libe_sqlite3.dylib +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\osx-x64\native\libe_sqlite3.dylib +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\win-arm\native\e_sqlite3.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\win-arm64\native\e_sqlite3.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\win-x64\native\e_sqlite3.dll +E:\AX Copilot\src\AxCopilot.Tests\bin\Debug\net8.0-windows\runtimes\win-x86\native\e_sqlite3.dll diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.dll b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.dll new file mode 100644 index 0000000..a44af2b Binary files /dev/null and b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.dll differ diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.genruntimeconfig.cache b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.genruntimeconfig.cache new file mode 100644 index 0000000..e79c4ff --- /dev/null +++ b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.genruntimeconfig.cache @@ -0,0 +1 @@ +e775d59703e14c5b336895f700080fc6c599558ef7f440fb9e3f4061e1a51f8e diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.pdb b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.pdb new file mode 100644 index 0000000..ee723c6 Binary files /dev/null and b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/AxCopilot.Tests.pdb differ diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/ref/AxCopilot.Tests.dll b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/ref/AxCopilot.Tests.dll new file mode 100644 index 0000000..9d5cb0a Binary files /dev/null and b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/ref/AxCopilot.Tests.dll differ diff --git a/src/AxCopilot.Tests/obj/Debug/net8.0-windows/refint/AxCopilot.Tests.dll b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/refint/AxCopilot.Tests.dll new file mode 100644 index 0000000..9d5cb0a Binary files /dev/null and b/src/AxCopilot.Tests/obj/Debug/net8.0-windows/refint/AxCopilot.Tests.dll differ diff --git a/src/AxCopilot.Tests/obj/project.assets.json b/src/AxCopilot.Tests/obj/project.assets.json new file mode 100644 index 0000000..87de89b --- /dev/null +++ b/src/AxCopilot.Tests/obj/project.assets.json @@ -0,0 +1,2085 @@ +{ + "version": 3, + "targets": { + "net8.0-windows7.0": { + "DocumentFormat.OpenXml/3.2.0": { + "type": "package", + "dependencies": { + "DocumentFormat.OpenXml.Framework": "3.2.0" + }, + "compile": { + "lib/net8.0/DocumentFormat.OpenXml.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.dll": { + "related": ".xml" + } + } + }, + "DocumentFormat.OpenXml.Framework/3.2.0": { + "type": "package", + "dependencies": { + "System.IO.Packaging": "8.0.1" + }, + "compile": { + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll": { + "related": ".xml" + } + } + }, + "FluentAssertions/6.12.0": { + "type": "package", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + }, + "compile": { + "lib/net6.0/FluentAssertions.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net6.0/FluentAssertions.dll": { + "related": ".pdb;.xml" + } + } + }, + "Markdig/0.37.0": { + "type": "package", + "compile": { + "lib/net8.0/Markdig.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Markdig.dll": { + "related": ".xml" + } + } + }, + "Microsoft.CodeCoverage/17.11.0": { + "type": "package", + "compile": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {} + }, + "build": { + "build/netstandard2.0/Microsoft.CodeCoverage.props": {}, + "build/netstandard2.0/Microsoft.CodeCoverage.targets": {} + } + }, + "Microsoft.Data.Sqlite/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" + }, + "compile": { + "lib/netstandard2.0/_._": {} + }, + "runtime": { + "lib/netstandard2.0/_._": {} + } + }, + "Microsoft.Data.Sqlite.Core/8.0.0": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.core": "2.1.6" + }, + "compile": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "related": ".xml" + } + } + }, + "Microsoft.NET.Test.Sdk/17.11.0": { + "type": "package", + "dependencies": { + "Microsoft.CodeCoverage": "17.11.0", + "Microsoft.TestPlatform.TestHost": "17.11.0" + }, + "compile": { + "lib/netcoreapp3.1/_._": {} + }, + "runtime": { + "lib/netcoreapp3.1/_._": {} + }, + "build": { + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props": {}, + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/Microsoft.NET.Test.Sdk.props": {} + } + }, + "Microsoft.TestPlatform.ObjectModel/17.11.0": { + "type": "package", + "dependencies": { + "System.Reflection.Metadata": "1.6.0" + }, + "compile": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {} + }, + "resource": { + "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": { + "type": "package", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.11.0", + "Newtonsoft.Json": "13.0.1" + }, + "compile": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, + "lib/netcoreapp3.1/testhost.dll": { + "related": ".deps.json" + } + }, + "runtime": { + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {}, + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {}, + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {}, + "lib/netcoreapp3.1/testhost.dll": { + "related": ".deps.json" + } + }, + "resource": { + "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" + } + }, + "build": { + "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props": {} + } + }, + "Microsoft.Web.WebView2/1.0.2903.40": { + "type": "package", + "build": { + "buildTransitive/Microsoft.Web.WebView2.targets": {} + }, + "runtimeTargets": { + "runtimes/win-arm64/native/WebView2Loader.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/WebView2Loader.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/WebView2Loader.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "Newtonsoft.Json/13.0.1": { + "type": "package", + "compile": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/Newtonsoft.Json.dll": { + "related": ".xml" + } + } + }, + "SQLitePCLRaw.bundle_e_sqlite3/2.1.6": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" + }, + "compile": { + "lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll": {} + }, + "runtime": { + "lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll": {} + } + }, + "SQLitePCLRaw.core/2.1.6": { + "type": "package", + "dependencies": { + "System.Memory": "4.5.3" + }, + "compile": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": {} + }, + "runtime": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": {} + } + }, + "SQLitePCLRaw.lib.e_sqlite3/2.1.6": { + "type": "package", + "compile": { + "lib/netstandard2.0/_._": {} + }, + "runtime": { + "lib/netstandard2.0/_._": {} + }, + "build": { + "buildTransitive/net8.0/SQLitePCLRaw.lib.e_sqlite3.targets": {} + }, + "runtimeTargets": { + "runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a": { + "assetType": "native", + "rid": "browser-wasm" + }, + "runtimes/linux-arm/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-arm" + }, + "runtimes/linux-arm64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-arm64" + }, + "runtimes/linux-armel/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-armel" + }, + "runtimes/linux-mips64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-mips64" + }, + "runtimes/linux-musl-arm/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-arm" + }, + "runtimes/linux-musl-arm64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-arm64" + }, + "runtimes/linux-musl-x64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-x64" + }, + "runtimes/linux-ppc64le/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-ppc64le" + }, + "runtimes/linux-s390x/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-s390x" + }, + "runtimes/linux-x64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-x64" + }, + "runtimes/linux-x86/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-x86" + }, + "runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "maccatalyst-arm64" + }, + "runtimes/maccatalyst-x64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "maccatalyst-x64" + }, + "runtimes/osx-arm64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "osx-arm64" + }, + "runtimes/osx-x64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "osx-x64" + }, + "runtimes/win-arm/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-arm" + }, + "runtimes/win-arm64/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "SQLitePCLRaw.provider.e_sqlite3/2.1.6": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.core": "2.1.6" + }, + "compile": { + "lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {} + }, + "runtime": { + "lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {} + } + }, + "System.Configuration.ConfigurationManager/4.4.0": { + "type": "package", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "4.4.0" + }, + "compile": { + "ref/netstandard2.0/System.Configuration.ConfigurationManager.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Configuration.ConfigurationManager.dll": {} + } + }, + "System.Diagnostics.EventLog/8.0.1": { + "type": "package", + "compile": { + "lib/net8.0/System.Diagnostics.EventLog.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Diagnostics.EventLog.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll": { + "assetType": "runtime", + "rid": "win" + }, + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.IO.Packaging/8.0.1": { + "type": "package", + "compile": { + "lib/net8.0/System.IO.Packaging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.IO.Packaging.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Memory/4.5.3": { + "type": "package", + "compile": { + "ref/netcoreapp2.1/_._": {} + }, + "runtime": { + "lib/netcoreapp2.1/_._": {} + } + }, + "System.Reflection.Metadata/1.6.0": { + "type": "package", + "compile": { + "lib/netstandard2.0/System.Reflection.Metadata.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/System.Reflection.Metadata.dll": { + "related": ".xml" + } + } + }, + "System.Security.Cryptography.ProtectedData/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.ServiceProcess.ServiceController/8.0.1": { + "type": "package", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.1" + }, + "compile": { + "lib/net8.0/System.ServiceProcess.ServiceController.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.ServiceProcess.ServiceController.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "UglyToad.PdfPig/1.7.0-custom-5": { + "type": "package", + "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" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.dll": { + "related": ".xml" + } + } + }, + "UglyToad.PdfPig.Core/1.7.0-custom-5": { + "type": "package", + "compile": { + "lib/net6.0/UglyToad.PdfPig.Core.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Core.dll": { + "related": ".xml" + } + } + }, + "UglyToad.PdfPig.Fonts/1.7.0-custom-5": { + "type": "package", + "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" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.Fonts.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Fonts.dll": { + "related": ".xml" + } + }, + "contentFiles": { + "contentFiles/any/any/_._": { + "buildAction": "None", + "codeLanguage": "any", + "copyToOutput": false + } + } + }, + "UglyToad.PdfPig.Tokenization/1.7.0-custom-5": { + "type": "package", + "dependencies": { + "UglyToad.PdfPig.Core": "1.7.0-custom-5", + "UglyToad.PdfPig.Tokens": "1.7.0-custom-5" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.Tokenization.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Tokenization.dll": { + "related": ".xml" + } + } + }, + "UglyToad.PdfPig.Tokens/1.7.0-custom-5": { + "type": "package", + "dependencies": { + "UglyToad.PdfPig.Core": "1.7.0-custom-5" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.Tokens.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Tokens.dll": { + "related": ".xml" + } + } + }, + "xunit/2.9.0": { + "type": "package", + "dependencies": { + "xunit.analyzers": "1.15.0", + "xunit.assert": "2.9.0", + "xunit.core": "[2.9.0]" + } + }, + "xunit.abstractions/2.0.3": { + "type": "package", + "compile": { + "lib/netstandard2.0/xunit.abstractions.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard2.0/xunit.abstractions.dll": { + "related": ".xml" + } + } + }, + "xunit.analyzers/1.15.0": { + "type": "package" + }, + "xunit.assert/2.9.0": { + "type": "package", + "compile": { + "lib/net6.0/xunit.assert.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/xunit.assert.dll": { + "related": ".xml" + } + } + }, + "xunit.core/2.9.0": { + "type": "package", + "dependencies": { + "xunit.extensibility.core": "[2.9.0]", + "xunit.extensibility.execution": "[2.9.0]" + }, + "build": { + "build/xunit.core.props": {}, + "build/xunit.core.targets": {} + }, + "buildMultiTargeting": { + "buildMultiTargeting/xunit.core.props": {}, + "buildMultiTargeting/xunit.core.targets": {} + } + }, + "xunit.extensibility.core/2.9.0": { + "type": "package", + "dependencies": { + "xunit.abstractions": "2.0.3" + }, + "compile": { + "lib/netstandard1.1/xunit.core.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard1.1/xunit.core.dll": { + "related": ".xml" + } + } + }, + "xunit.extensibility.execution/2.9.0": { + "type": "package", + "dependencies": { + "xunit.extensibility.core": "[2.9.0]" + }, + "compile": { + "lib/netstandard1.1/xunit.execution.dotnet.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/netstandard1.1/xunit.execution.dotnet.dll": { + "related": ".xml" + } + } + }, + "xunit.runner.visualstudio/2.8.2": { + "type": "package", + "compile": { + "lib/net6.0/_._": {} + }, + "runtime": { + "lib/net6.0/_._": {} + }, + "build": { + "build/net6.0/xunit.runner.visualstudio.props": {} + } + }, + "AxCopilot/1.7.2": { + "type": "project", + "framework": ".NETCoreApp,Version=v8.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.Security.Cryptography.ProtectedData": "8.0.0", + "System.ServiceProcess.ServiceController": "8.0.1", + "UglyToad.PdfPig": "1.7.0-custom-5" + }, + "compile": { + "bin/placeholder/AxCopilot.dll": {} + }, + "runtime": { + "bin/placeholder/AxCopilot.dll": {} + }, + "frameworkReferences": [ + "Microsoft.WindowsDesktop.App" + ] + }, + "AxCopilot.SDK/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v8.0", + "compile": { + "bin/placeholder/AxCopilot.SDK.dll": {} + }, + "runtime": { + "bin/placeholder/AxCopilot.SDK.dll": {} + } + } + } + }, + "libraries": { + "DocumentFormat.OpenXml/3.2.0": { + "sha512": "eDBT9G0sAWUvjgE8l8E5bGCFXgxCZXIecQ8dqUnj2PyxyMR5eBmLahqRRw3Q7uSKM3cKbysaL2mEY0JJbEEOEA==", + "type": "package", + "path": "documentformat.openxml/3.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "documentformat.openxml.3.2.0.nupkg.sha512", + "documentformat.openxml.nuspec", + "icon.png", + "lib/net35/DocumentFormat.OpenXml.dll", + "lib/net35/DocumentFormat.OpenXml.xml", + "lib/net40/DocumentFormat.OpenXml.dll", + "lib/net40/DocumentFormat.OpenXml.xml", + "lib/net46/DocumentFormat.OpenXml.dll", + "lib/net46/DocumentFormat.OpenXml.xml", + "lib/net8.0/DocumentFormat.OpenXml.dll", + "lib/net8.0/DocumentFormat.OpenXml.xml", + "lib/netstandard2.0/DocumentFormat.OpenXml.dll", + "lib/netstandard2.0/DocumentFormat.OpenXml.xml" + ] + }, + "DocumentFormat.OpenXml.Framework/3.2.0": { + "sha512": "e1neOKqRnSHUom4JQEorAoZ67aiJOp6+Xzsu0fc6IYfFcgQn6roo+w6i2w//N2u/5ilEfvLr35bNO9zaIN7r7g==", + "type": "package", + "path": "documentformat.openxml.framework/3.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "documentformat.openxml.framework.3.2.0.nupkg.sha512", + "documentformat.openxml.framework.nuspec", + "icon.png", + "lib/net35/DocumentFormat.OpenXml.Framework.dll", + "lib/net35/DocumentFormat.OpenXml.Framework.xml", + "lib/net40/DocumentFormat.OpenXml.Framework.dll", + "lib/net40/DocumentFormat.OpenXml.Framework.xml", + "lib/net46/DocumentFormat.OpenXml.Framework.dll", + "lib/net46/DocumentFormat.OpenXml.Framework.xml", + "lib/net6.0/DocumentFormat.OpenXml.Framework.dll", + "lib/net6.0/DocumentFormat.OpenXml.Framework.xml", + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll", + "lib/net8.0/DocumentFormat.OpenXml.Framework.xml", + "lib/netstandard2.0/DocumentFormat.OpenXml.Framework.dll", + "lib/netstandard2.0/DocumentFormat.OpenXml.Framework.xml" + ] + }, + "FluentAssertions/6.12.0": { + "sha512": "ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==", + "type": "package", + "path": "fluentassertions/6.12.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "FluentAssertions.png", + "fluentassertions.6.12.0.nupkg.sha512", + "fluentassertions.nuspec", + "lib/net47/FluentAssertions.dll", + "lib/net47/FluentAssertions.pdb", + "lib/net47/FluentAssertions.xml", + "lib/net6.0/FluentAssertions.dll", + "lib/net6.0/FluentAssertions.pdb", + "lib/net6.0/FluentAssertions.xml", + "lib/netcoreapp2.1/FluentAssertions.dll", + "lib/netcoreapp2.1/FluentAssertions.pdb", + "lib/netcoreapp2.1/FluentAssertions.xml", + "lib/netcoreapp3.0/FluentAssertions.dll", + "lib/netcoreapp3.0/FluentAssertions.pdb", + "lib/netcoreapp3.0/FluentAssertions.xml", + "lib/netstandard2.0/FluentAssertions.dll", + "lib/netstandard2.0/FluentAssertions.pdb", + "lib/netstandard2.0/FluentAssertions.xml", + "lib/netstandard2.1/FluentAssertions.dll", + "lib/netstandard2.1/FluentAssertions.pdb", + "lib/netstandard2.1/FluentAssertions.xml" + ] + }, + "Markdig/0.37.0": { + "sha512": "biiu4MTPFjW55qw6v5Aphtj0MjDLJ14x8ndZwkJUHIeqvaSGKeqhLY7S7Vu/S3k7/c9KwhhnaCDP9hdFNUhcNA==", + "type": "package", + "path": "markdig/0.37.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Markdig.dll", + "lib/net462/Markdig.xml", + "lib/net6.0/Markdig.dll", + "lib/net6.0/Markdig.xml", + "lib/net8.0/Markdig.dll", + "lib/net8.0/Markdig.xml", + "lib/netstandard2.0/Markdig.dll", + "lib/netstandard2.0/Markdig.xml", + "lib/netstandard2.1/Markdig.dll", + "lib/netstandard2.1/Markdig.xml", + "markdig.0.37.0.nupkg.sha512", + "markdig.nuspec", + "markdig.png", + "readme.md" + ] + }, + "Microsoft.CodeCoverage/17.11.0": { + "sha512": "QKcOSuw7MZG4XiQ+pCj+Ib6amOwoRDEO7e3DbxqXeOPXSnfyGXYoZQI8I140s1mKQVn1Vh+c5WlKvCvlgMovpg==", + "type": "package", + "path": "microsoft.codecoverage/17.11.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.txt", + "build/netstandard2.0/CodeCoverage/CodeCoverage.config", + "build/netstandard2.0/CodeCoverage/CodeCoverage.exe", + "build/netstandard2.0/CodeCoverage/VanguardInstrumentationProfiler_x86.config", + "build/netstandard2.0/CodeCoverage/amd64/CodeCoverage.exe", + "build/netstandard2.0/CodeCoverage/amd64/VanguardInstrumentationProfiler_x64.config", + "build/netstandard2.0/CodeCoverage/amd64/covrun64.dll", + "build/netstandard2.0/CodeCoverage/amd64/msdia140.dll", + "build/netstandard2.0/CodeCoverage/arm64/VanguardInstrumentationProfiler_arm64.config", + "build/netstandard2.0/CodeCoverage/arm64/covrunarm64.dll", + "build/netstandard2.0/CodeCoverage/arm64/msdia140.dll", + "build/netstandard2.0/CodeCoverage/codecoveragemessages.dll", + "build/netstandard2.0/CodeCoverage/coreclr/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "build/netstandard2.0/CodeCoverage/covrun32.dll", + "build/netstandard2.0/CodeCoverage/msdia140.dll", + "build/netstandard2.0/InstrumentationEngine/alpine/x64/VanguardInstrumentationProfiler_x64.config", + "build/netstandard2.0/InstrumentationEngine/alpine/x64/libCoverageInstrumentationMethod.so", + "build/netstandard2.0/InstrumentationEngine/alpine/x64/libInstrumentationEngine.so", + "build/netstandard2.0/InstrumentationEngine/arm64/MicrosoftInstrumentationEngine_arm64.dll", + "build/netstandard2.0/InstrumentationEngine/macos/x64/VanguardInstrumentationProfiler_x64.config", + "build/netstandard2.0/InstrumentationEngine/macos/x64/libCoverageInstrumentationMethod.dylib", + "build/netstandard2.0/InstrumentationEngine/macos/x64/libInstrumentationEngine.dylib", + "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/VanguardInstrumentationProfiler_x64.config", + "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/libCoverageInstrumentationMethod.so", + "build/netstandard2.0/InstrumentationEngine/ubuntu/x64/libInstrumentationEngine.so", + "build/netstandard2.0/InstrumentationEngine/x64/MicrosoftInstrumentationEngine_x64.dll", + "build/netstandard2.0/InstrumentationEngine/x86/MicrosoftInstrumentationEngine_x86.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Core.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.Core.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Instrumentation.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.Interprocess.dll", + "build/netstandard2.0/Microsoft.CodeCoverage.props", + "build/netstandard2.0/Microsoft.CodeCoverage.targets", + "build/netstandard2.0/Microsoft.DiaSymReader.dll", + "build/netstandard2.0/Microsoft.VisualStudio.TraceDataCollector.dll", + "build/netstandard2.0/Mono.Cecil.Pdb.dll", + "build/netstandard2.0/Mono.Cecil.Rocks.dll", + "build/netstandard2.0/Mono.Cecil.dll", + "build/netstandard2.0/ThirdPartyNotices.txt", + "build/netstandard2.0/cs/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/de/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/es/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/fr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/it/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ja/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ko/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/pl/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/pt-BR/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/ru/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/tr/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "build/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TraceDataCollector.resources.dll", + "lib/net462/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll", + "microsoft.codecoverage.17.11.0.nupkg.sha512", + "microsoft.codecoverage.nuspec" + ] + }, + "Microsoft.Data.Sqlite/8.0.0": { + "sha512": "H+iC5IvkCCKSNHXzL3JARvDn7VpkvuJM91KVB89sKjeTF/KX/BocNNh93ZJtX5MCQKb/z4yVKgkU2sVIq+xKfg==", + "type": "package", + "path": "microsoft.data.sqlite/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "lib/netstandard2.0/_._", + "microsoft.data.sqlite.8.0.0.nupkg.sha512", + "microsoft.data.sqlite.nuspec" + ] + }, + "Microsoft.Data.Sqlite.Core/8.0.0": { + "sha512": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", + "type": "package", + "path": "microsoft.data.sqlite.core/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "lib/net6.0/Microsoft.Data.Sqlite.dll", + "lib/net6.0/Microsoft.Data.Sqlite.xml", + "lib/net8.0/Microsoft.Data.Sqlite.dll", + "lib/net8.0/Microsoft.Data.Sqlite.xml", + "lib/netstandard2.0/Microsoft.Data.Sqlite.dll", + "lib/netstandard2.0/Microsoft.Data.Sqlite.xml", + "microsoft.data.sqlite.core.8.0.0.nupkg.sha512", + "microsoft.data.sqlite.core.nuspec" + ] + }, + "Microsoft.NET.Test.Sdk/17.11.0": { + "sha512": "fH7P0LihMXgnlNLtrXGetHd30aQcD+YrSbWXbCPBnrypdRApPgNqd/TgncTlSVY1bbLYdnvpBgts2dcnK37GzA==", + "type": "package", + "path": "microsoft.net.test.sdk/17.11.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "build/net462/Microsoft.NET.Test.Sdk.props", + "build/net462/Microsoft.NET.Test.Sdk.targets", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.cs", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.fs", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.Program.vb", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.props", + "build/netcoreapp3.1/Microsoft.NET.Test.Sdk.targets", + "buildMultiTargeting/Microsoft.NET.Test.Sdk.props", + "lib/net462/_._", + "lib/netcoreapp3.1/_._", + "microsoft.net.test.sdk.17.11.0.nupkg.sha512", + "microsoft.net.test.sdk.nuspec" + ] + }, + "Microsoft.TestPlatform.ObjectModel/17.11.0": { + "sha512": "PU+CC1yRzbR0IllrtdILaeep7WP5OIrvmWrvCMqG3jB1h4F6Ur7CYHl6ENbDVXPzEvygXh0GWbTyrbjfvgTpAg==", + "type": "package", + "path": "microsoft.testplatform.objectmodel/17.11.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "lib/net462/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/net462/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/net462/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/net462/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/net462/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/net462/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netstandard2.0/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netstandard2.0/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netstandard2.0/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/de/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/es/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/it/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll", + "lib/netstandard2.0/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll", + "microsoft.testplatform.objectmodel.17.11.0.nupkg.sha512", + "microsoft.testplatform.objectmodel.nuspec" + ] + }, + "Microsoft.TestPlatform.TestHost/17.11.0": { + "sha512": "KMzJO3dm3+9W8JRQ3IDviu0v7uXP5Lgii6TuxMc5m8ynaqcGnn7Y18cMb5AsP2xp59uUHO474WZrssxBdb8ZxQ==", + "type": "package", + "path": "microsoft.testplatform.testhost/17.11.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "ThirdPartyNotices.txt", + "build/netcoreapp3.1/Microsoft.TestPlatform.TestHost.props", + "build/netcoreapp3.1/x64/testhost.dll", + "build/netcoreapp3.1/x64/testhost.exe", + "build/netcoreapp3.1/x86/testhost.x86.dll", + "build/netcoreapp3.1/x86/testhost.x86.exe", + "lib/net462/_._", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll", + "lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll", + "lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/testhost.deps.json", + "lib/netcoreapp3.1/testhost.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/x64/msdia140.dll", + "lib/netcoreapp3.1/x86/msdia140.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll", + "lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll", + "microsoft.testplatform.testhost.17.11.0.nupkg.sha512", + "microsoft.testplatform.testhost.nuspec" + ] + }, + "Microsoft.Web.WebView2/1.0.2903.40": { + "sha512": "THrzYAnJgE3+cNH+9Epr44XjoZoRELdVpXlWGPs6K9C9G6TqyDfVCeVAR/Er8ljLitIUX5gaSkPsy9wRhD1sgQ==", + "type": "package", + "path": "microsoft.web.webview2/1.0.2903.40", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "NOTICE.txt", + "WebView2.idl", + "WebView2.tlb", + "build/Common.targets", + "build/Microsoft.Web.WebView2.targets", + "build/WebView2Rules.Project.xml", + "build/native/Microsoft.Web.WebView2.targets", + "build/native/arm64/WebView2Loader.dll", + "build/native/arm64/WebView2Loader.dll.lib", + "build/native/arm64/WebView2LoaderStatic.lib", + "build/native/include-winrt/WebView2Interop.h", + "build/native/include-winrt/WebView2Interop.idl", + "build/native/include-winrt/WebView2Interop.tlb", + "build/native/include/WebView2.h", + "build/native/include/WebView2EnvironmentOptions.h", + "build/native/x64/WebView2Loader.dll", + "build/native/x64/WebView2Loader.dll.lib", + "build/native/x64/WebView2LoaderStatic.lib", + "build/native/x86/WebView2Loader.dll", + "build/native/x86/WebView2Loader.dll.lib", + "build/native/x86/WebView2LoaderStatic.lib", + "build/wv2winrt.targets", + "buildTransitive/Microsoft.Web.WebView2.targets", + "lib/Microsoft.Web.WebView2.Core.winmd", + "lib/net462/Microsoft.Web.WebView2.Core.dll", + "lib/net462/Microsoft.Web.WebView2.Core.xml", + "lib/net462/Microsoft.Web.WebView2.WinForms.dll", + "lib/net462/Microsoft.Web.WebView2.WinForms.xml", + "lib/net462/Microsoft.Web.WebView2.Wpf.dll", + "lib/net462/Microsoft.Web.WebView2.Wpf.xml", + "lib_manual/net5.0-windows10.0.17763.0/Microsoft.Web.WebView2.Wpf.dll", + "lib_manual/net5.0-windows10.0.17763.0/Microsoft.Web.WebView2.Wpf.xml", + "lib_manual/net6.0-windows10.0.17763.0/Microsoft.Web.WebView2.Core.Projection.dll", + "lib_manual/net8.0-windows10.0.17763.0/Microsoft.Web.WebView2.Core.Projection.dll", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.Core.dll", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.Core.xml", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.WinForms.dll", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.WinForms.xml", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.Wpf.dll", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.Wpf.xml", + "microsoft.web.webview2.1.0.2903.40.nupkg.sha512", + "microsoft.web.webview2.nuspec", + "runtimes/win-arm64/native/WebView2Loader.dll", + "runtimes/win-arm64/native_uap/Microsoft.Web.WebView2.Core.dll", + "runtimes/win-x64/native/WebView2Loader.dll", + "runtimes/win-x64/native_uap/Microsoft.Web.WebView2.Core.dll", + "runtimes/win-x86/native/WebView2Loader.dll", + "runtimes/win-x86/native_uap/Microsoft.Web.WebView2.Core.dll", + "tools/VisualStudioToolsManifest.xml", + "tools/wv2winrt/Antlr3.Runtime.dll", + "tools/wv2winrt/Antlr4.StringTemplate.dll", + "tools/wv2winrt/System.Buffers.dll", + "tools/wv2winrt/System.CommandLine.DragonFruit.dll", + "tools/wv2winrt/System.CommandLine.Rendering.dll", + "tools/wv2winrt/System.CommandLine.dll", + "tools/wv2winrt/System.Memory.dll", + "tools/wv2winrt/System.Numerics.Vectors.dll", + "tools/wv2winrt/System.Runtime.CompilerServices.Unsafe.dll", + "tools/wv2winrt/codegen_util.dll", + "tools/wv2winrt/concrt140_app.dll", + "tools/wv2winrt/cs/System.CommandLine.resources.dll", + "tools/wv2winrt/de/System.CommandLine.resources.dll", + "tools/wv2winrt/es/System.CommandLine.resources.dll", + "tools/wv2winrt/fr/System.CommandLine.resources.dll", + "tools/wv2winrt/it/System.CommandLine.resources.dll", + "tools/wv2winrt/ja/System.CommandLine.resources.dll", + "tools/wv2winrt/ko/System.CommandLine.resources.dll", + "tools/wv2winrt/msvcp140_1_app.dll", + "tools/wv2winrt/msvcp140_2_app.dll", + "tools/wv2winrt/msvcp140_app.dll", + "tools/wv2winrt/pl/System.CommandLine.resources.dll", + "tools/wv2winrt/pt-BR/System.CommandLine.resources.dll", + "tools/wv2winrt/ru/System.CommandLine.resources.dll", + "tools/wv2winrt/tr/System.CommandLine.resources.dll", + "tools/wv2winrt/type_hierarchy.dll", + "tools/wv2winrt/vcamp140_app.dll", + "tools/wv2winrt/vccorlib140_app.dll", + "tools/wv2winrt/vcomp140_app.dll", + "tools/wv2winrt/vcruntime140_app.dll", + "tools/wv2winrt/winrt_winmd.dll", + "tools/wv2winrt/winrt_winmd.winmd", + "tools/wv2winrt/wv2winrt.exe", + "tools/wv2winrt/wv2winrt.exe.config", + "tools/wv2winrt/wv2winrt.xml", + "tools/wv2winrt/zh-Hans/System.CommandLine.resources.dll", + "tools/wv2winrt/zh-Hant/System.CommandLine.resources.dll" + ] + }, + "Newtonsoft.Json/13.0.1": { + "sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==", + "type": "package", + "path": "newtonsoft.json/13.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.md", + "lib/net20/Newtonsoft.Json.dll", + "lib/net20/Newtonsoft.Json.xml", + "lib/net35/Newtonsoft.Json.dll", + "lib/net35/Newtonsoft.Json.xml", + "lib/net40/Newtonsoft.Json.dll", + "lib/net40/Newtonsoft.Json.xml", + "lib/net45/Newtonsoft.Json.dll", + "lib/net45/Newtonsoft.Json.xml", + "lib/netstandard1.0/Newtonsoft.Json.dll", + "lib/netstandard1.0/Newtonsoft.Json.xml", + "lib/netstandard1.3/Newtonsoft.Json.dll", + "lib/netstandard1.3/Newtonsoft.Json.xml", + "lib/netstandard2.0/Newtonsoft.Json.dll", + "lib/netstandard2.0/Newtonsoft.Json.xml", + "newtonsoft.json.13.0.1.nupkg.sha512", + "newtonsoft.json.nuspec", + "packageIcon.png" + ] + }, + "SQLitePCLRaw.bundle_e_sqlite3/2.1.6": { + "sha512": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", + "type": "package", + "path": "sqlitepclraw.bundle_e_sqlite3/2.1.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/monoandroid90/SQLitePCLRaw.batteries_v2.dll", + "lib/net461/SQLitePCLRaw.batteries_v2.dll", + "lib/net6.0-android31.0/SQLitePCLRaw.batteries_v2.dll", + "lib/net6.0-android31.0/SQLitePCLRaw.batteries_v2.xml", + "lib/net6.0-ios14.0/SQLitePCLRaw.batteries_v2.dll", + "lib/net6.0-ios14.2/SQLitePCLRaw.batteries_v2.dll", + "lib/net6.0-tvos10.0/SQLitePCLRaw.batteries_v2.dll", + "lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll", + "lib/xamarinios10/SQLitePCLRaw.batteries_v2.dll", + "sqlitepclraw.bundle_e_sqlite3.2.1.6.nupkg.sha512", + "sqlitepclraw.bundle_e_sqlite3.nuspec" + ] + }, + "SQLitePCLRaw.core/2.1.6": { + "sha512": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", + "type": "package", + "path": "sqlitepclraw.core/2.1.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/netstandard2.0/SQLitePCLRaw.core.dll", + "sqlitepclraw.core.2.1.6.nupkg.sha512", + "sqlitepclraw.core.nuspec" + ] + }, + "SQLitePCLRaw.lib.e_sqlite3/2.1.6": { + "sha512": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==", + "type": "package", + "path": "sqlitepclraw.lib.e_sqlite3/2.1.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "buildTransitive/net461/SQLitePCLRaw.lib.e_sqlite3.targets", + "buildTransitive/net6.0/SQLitePCLRaw.lib.e_sqlite3.targets", + "buildTransitive/net7.0/SQLitePCLRaw.lib.e_sqlite3.targets", + "buildTransitive/net8.0/SQLitePCLRaw.lib.e_sqlite3.targets", + "lib/net461/_._", + "lib/netstandard2.0/_._", + "runtimes/browser-wasm/nativeassets/net6.0/e_sqlite3.a", + "runtimes/browser-wasm/nativeassets/net7.0/e_sqlite3.a", + "runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a", + "runtimes/linux-arm/native/libe_sqlite3.so", + "runtimes/linux-arm64/native/libe_sqlite3.so", + "runtimes/linux-armel/native/libe_sqlite3.so", + "runtimes/linux-mips64/native/libe_sqlite3.so", + "runtimes/linux-musl-arm/native/libe_sqlite3.so", + "runtimes/linux-musl-arm64/native/libe_sqlite3.so", + "runtimes/linux-musl-x64/native/libe_sqlite3.so", + "runtimes/linux-ppc64le/native/libe_sqlite3.so", + "runtimes/linux-s390x/native/libe_sqlite3.so", + "runtimes/linux-x64/native/libe_sqlite3.so", + "runtimes/linux-x86/native/libe_sqlite3.so", + "runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib", + "runtimes/maccatalyst-x64/native/libe_sqlite3.dylib", + "runtimes/osx-arm64/native/libe_sqlite3.dylib", + "runtimes/osx-x64/native/libe_sqlite3.dylib", + "runtimes/win-arm/native/e_sqlite3.dll", + "runtimes/win-arm64/native/e_sqlite3.dll", + "runtimes/win-x64/native/e_sqlite3.dll", + "runtimes/win-x86/native/e_sqlite3.dll", + "runtimes/win10-arm/nativeassets/uap10.0/e_sqlite3.dll", + "runtimes/win10-arm64/nativeassets/uap10.0/e_sqlite3.dll", + "runtimes/win10-x64/nativeassets/uap10.0/e_sqlite3.dll", + "runtimes/win10-x86/nativeassets/uap10.0/e_sqlite3.dll", + "sqlitepclraw.lib.e_sqlite3.2.1.6.nupkg.sha512", + "sqlitepclraw.lib.e_sqlite3.nuspec" + ] + }, + "SQLitePCLRaw.provider.e_sqlite3/2.1.6": { + "sha512": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", + "type": "package", + "path": "sqlitepclraw.provider.e_sqlite3/2.1.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll", + "lib/net6.0/SQLitePCLRaw.provider.e_sqlite3.dll", + "lib/netstandard2.0/SQLitePCLRaw.provider.e_sqlite3.dll", + "sqlitepclraw.provider.e_sqlite3.2.1.6.nupkg.sha512", + "sqlitepclraw.provider.e_sqlite3.nuspec" + ] + }, + "System.Configuration.ConfigurationManager/4.4.0": { + "sha512": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==", + "type": "package", + "path": "system.configuration.configurationmanager/4.4.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/net461/System.Configuration.ConfigurationManager.dll", + "lib/netstandard2.0/System.Configuration.ConfigurationManager.dll", + "ref/net461/System.Configuration.ConfigurationManager.dll", + "ref/net461/System.Configuration.ConfigurationManager.xml", + "ref/netstandard2.0/System.Configuration.ConfigurationManager.dll", + "ref/netstandard2.0/System.Configuration.ConfigurationManager.xml", + "system.configuration.configurationmanager.4.4.0.nupkg.sha512", + "system.configuration.configurationmanager.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Diagnostics.EventLog/8.0.1": { + "sha512": "n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==", + "type": "package", + "path": "system.diagnostics.eventlog/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Diagnostics.EventLog.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Diagnostics.EventLog.targets", + "lib/net462/System.Diagnostics.EventLog.dll", + "lib/net462/System.Diagnostics.EventLog.xml", + "lib/net6.0/System.Diagnostics.EventLog.dll", + "lib/net6.0/System.Diagnostics.EventLog.xml", + "lib/net7.0/System.Diagnostics.EventLog.dll", + "lib/net7.0/System.Diagnostics.EventLog.xml", + "lib/net8.0/System.Diagnostics.EventLog.dll", + "lib/net8.0/System.Diagnostics.EventLog.xml", + "lib/netstandard2.0/System.Diagnostics.EventLog.dll", + "lib/netstandard2.0/System.Diagnostics.EventLog.xml", + "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll", + "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll", + "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.xml", + "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.Messages.dll", + "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.dll", + "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.xml", + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll", + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll", + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.xml", + "system.diagnostics.eventlog.8.0.1.nupkg.sha512", + "system.diagnostics.eventlog.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.IO.Packaging/8.0.1": { + "sha512": "KYkIOAvPexQOLDxPO2g0BVoWInnQhPpkFzRqvNrNrMhVT6kqhVr0zEb6KCHlptLFukxnZrjuMVAnxK7pOGUYrw==", + "type": "package", + "path": "system.io.packaging/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.IO.Packaging.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.IO.Packaging.targets", + "lib/net462/System.IO.Packaging.dll", + "lib/net462/System.IO.Packaging.xml", + "lib/net6.0/System.IO.Packaging.dll", + "lib/net6.0/System.IO.Packaging.xml", + "lib/net7.0/System.IO.Packaging.dll", + "lib/net7.0/System.IO.Packaging.xml", + "lib/net8.0/System.IO.Packaging.dll", + "lib/net8.0/System.IO.Packaging.xml", + "lib/netstandard2.0/System.IO.Packaging.dll", + "lib/netstandard2.0/System.IO.Packaging.xml", + "system.io.packaging.8.0.1.nupkg.sha512", + "system.io.packaging.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Memory/4.5.3": { + "sha512": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==", + "type": "package", + "path": "system.memory/4.5.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netcoreapp2.1/_._", + "lib/netstandard1.1/System.Memory.dll", + "lib/netstandard1.1/System.Memory.xml", + "lib/netstandard2.0/System.Memory.dll", + "lib/netstandard2.0/System.Memory.xml", + "ref/netcoreapp2.1/_._", + "system.memory.4.5.3.nupkg.sha512", + "system.memory.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Reflection.Metadata/1.6.0": { + "sha512": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", + "type": "package", + "path": "system.reflection.metadata/1.6.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netstandard1.1/System.Reflection.Metadata.dll", + "lib/netstandard1.1/System.Reflection.Metadata.xml", + "lib/netstandard2.0/System.Reflection.Metadata.dll", + "lib/netstandard2.0/System.Reflection.Metadata.xml", + "lib/portable-net45+win8/System.Reflection.Metadata.dll", + "lib/portable-net45+win8/System.Reflection.Metadata.xml", + "system.reflection.metadata.1.6.0.nupkg.sha512", + "system.reflection.metadata.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Security.Cryptography.ProtectedData/8.0.0": { + "sha512": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==", + "type": "package", + "path": "system.security.cryptography.protecteddata/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Security.Cryptography.ProtectedData.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Security.Cryptography.ProtectedData.targets", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net462/System.Security.Cryptography.ProtectedData.dll", + "lib/net462/System.Security.Cryptography.ProtectedData.xml", + "lib/net6.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net6.0/System.Security.Cryptography.ProtectedData.xml", + "lib/net7.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net7.0/System.Security.Cryptography.ProtectedData.xml", + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net8.0/System.Security.Cryptography.ProtectedData.xml", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "system.security.cryptography.protecteddata.8.0.0.nupkg.sha512", + "system.security.cryptography.protecteddata.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.ServiceProcess.ServiceController/8.0.1": { + "sha512": "02I0BXo1kmMBgw03E8Hu4K6nTqur4wpQdcDZrndczPzY2fEoGvlinE35AWbyzLZ2h2IksEZ6an4tVt3hi9j1oA==", + "type": "package", + "path": "system.serviceprocess.servicecontroller/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.ServiceProcess.ServiceController.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.ServiceProcess.ServiceController.targets", + "lib/net462/System.ServiceProcess.ServiceController.dll", + "lib/net462/System.ServiceProcess.ServiceController.xml", + "lib/net6.0/System.ServiceProcess.ServiceController.dll", + "lib/net6.0/System.ServiceProcess.ServiceController.xml", + "lib/net7.0/System.ServiceProcess.ServiceController.dll", + "lib/net7.0/System.ServiceProcess.ServiceController.xml", + "lib/net8.0/System.ServiceProcess.ServiceController.dll", + "lib/net8.0/System.ServiceProcess.ServiceController.xml", + "lib/netstandard2.0/System.ServiceProcess.ServiceController.dll", + "lib/netstandard2.0/System.ServiceProcess.ServiceController.xml", + "runtimes/win/lib/net6.0/System.ServiceProcess.ServiceController.dll", + "runtimes/win/lib/net6.0/System.ServiceProcess.ServiceController.xml", + "runtimes/win/lib/net7.0/System.ServiceProcess.ServiceController.dll", + "runtimes/win/lib/net7.0/System.ServiceProcess.ServiceController.xml", + "runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll", + "runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.xml", + "system.serviceprocess.servicecontroller.8.0.1.nupkg.sha512", + "system.serviceprocess.servicecontroller.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "UglyToad.PdfPig/1.7.0-custom-5": { + "sha512": "mddnoBg+XV5YZJg+lp/LlXQ9NY9/oV/MoNjLbbLHw0uTymfyuinVePQB4ff/ELRv3s6n0G7h8q3Ycb3KYg+hgQ==", + "type": "package", + "path": "uglytoad.pdfpig/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net451/UglyToad.PdfPig.dll", + "lib/net451/UglyToad.PdfPig.xml", + "lib/net452/UglyToad.PdfPig.dll", + "lib/net452/UglyToad.PdfPig.xml", + "lib/net46/UglyToad.PdfPig.dll", + "lib/net46/UglyToad.PdfPig.xml", + "lib/net461/UglyToad.PdfPig.dll", + "lib/net461/UglyToad.PdfPig.xml", + "lib/net462/UglyToad.PdfPig.dll", + "lib/net462/UglyToad.PdfPig.xml", + "lib/net47/UglyToad.PdfPig.dll", + "lib/net47/UglyToad.PdfPig.xml", + "lib/net6.0/UglyToad.PdfPig.dll", + "lib/net6.0/UglyToad.PdfPig.xml", + "lib/netstandard2.0/UglyToad.PdfPig.dll", + "lib/netstandard2.0/UglyToad.PdfPig.xml", + "uglytoad.pdfpig.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.nuspec" + ] + }, + "UglyToad.PdfPig.Core/1.7.0-custom-5": { + "sha512": "bChQUAYApM6/vgBis0+fBTZyAVqjXdqshjZDCgI3dgwUplfLJxXRrnkCOdNj0a6JNcF32R4aLpnGpTc9QmmVmg==", + "type": "package", + "path": "uglytoad.pdfpig.core/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net451/UglyToad.PdfPig.Core.dll", + "lib/net451/UglyToad.PdfPig.Core.xml", + "lib/net452/UglyToad.PdfPig.Core.dll", + "lib/net452/UglyToad.PdfPig.Core.xml", + "lib/net46/UglyToad.PdfPig.Core.dll", + "lib/net46/UglyToad.PdfPig.Core.xml", + "lib/net461/UglyToad.PdfPig.Core.dll", + "lib/net461/UglyToad.PdfPig.Core.xml", + "lib/net462/UglyToad.PdfPig.Core.dll", + "lib/net462/UglyToad.PdfPig.Core.xml", + "lib/net47/UglyToad.PdfPig.Core.dll", + "lib/net47/UglyToad.PdfPig.Core.xml", + "lib/net6.0/UglyToad.PdfPig.Core.dll", + "lib/net6.0/UglyToad.PdfPig.Core.xml", + "lib/netstandard2.0/UglyToad.PdfPig.Core.dll", + "lib/netstandard2.0/UglyToad.PdfPig.Core.xml", + "uglytoad.pdfpig.core.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.core.nuspec" + ] + }, + "UglyToad.PdfPig.Fonts/1.7.0-custom-5": { + "sha512": "Z6SBBAIL8wRkJNhXGYaz0CrHnNrNeuNtmwRbBtQUA1b3TDhRQppOmHCIuhjb6Vu/Rirp6FIOtzAU1lXsGik90w==", + "type": "package", + "path": "uglytoad.pdfpig.fonts/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "content/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net451/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net452/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net46/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net461/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net462/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net47/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net6.0/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/netstandard2.0/Resources/AdobeFontMetrics/MustRead.html", + "lib/net451/UglyToad.PdfPig.Fonts.dll", + "lib/net451/UglyToad.PdfPig.Fonts.xml", + "lib/net452/UglyToad.PdfPig.Fonts.dll", + "lib/net452/UglyToad.PdfPig.Fonts.xml", + "lib/net46/UglyToad.PdfPig.Fonts.dll", + "lib/net46/UglyToad.PdfPig.Fonts.xml", + "lib/net461/UglyToad.PdfPig.Fonts.dll", + "lib/net461/UglyToad.PdfPig.Fonts.xml", + "lib/net462/UglyToad.PdfPig.Fonts.dll", + "lib/net462/UglyToad.PdfPig.Fonts.xml", + "lib/net47/UglyToad.PdfPig.Fonts.dll", + "lib/net47/UglyToad.PdfPig.Fonts.xml", + "lib/net6.0/UglyToad.PdfPig.Fonts.dll", + "lib/net6.0/UglyToad.PdfPig.Fonts.xml", + "lib/netstandard2.0/UglyToad.PdfPig.Fonts.dll", + "lib/netstandard2.0/UglyToad.PdfPig.Fonts.xml", + "uglytoad.pdfpig.fonts.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.fonts.nuspec" + ] + }, + "UglyToad.PdfPig.Tokenization/1.7.0-custom-5": { + "sha512": "U8VVH7VJjv6czP7qWyzDq6CRaiJQe7/sESUCL8H3kiEa3zi0l9TonIKlD/YidQ5DlgTumracii6zjLyKPEFKwA==", + "type": "package", + "path": "uglytoad.pdfpig.tokenization/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net451/UglyToad.PdfPig.Tokenization.dll", + "lib/net451/UglyToad.PdfPig.Tokenization.xml", + "lib/net452/UglyToad.PdfPig.Tokenization.dll", + "lib/net452/UglyToad.PdfPig.Tokenization.xml", + "lib/net46/UglyToad.PdfPig.Tokenization.dll", + "lib/net46/UglyToad.PdfPig.Tokenization.xml", + "lib/net461/UglyToad.PdfPig.Tokenization.dll", + "lib/net461/UglyToad.PdfPig.Tokenization.xml", + "lib/net462/UglyToad.PdfPig.Tokenization.dll", + "lib/net462/UglyToad.PdfPig.Tokenization.xml", + "lib/net47/UglyToad.PdfPig.Tokenization.dll", + "lib/net47/UglyToad.PdfPig.Tokenization.xml", + "lib/net6.0/UglyToad.PdfPig.Tokenization.dll", + "lib/net6.0/UglyToad.PdfPig.Tokenization.xml", + "lib/netstandard2.0/UglyToad.PdfPig.Tokenization.dll", + "lib/netstandard2.0/UglyToad.PdfPig.Tokenization.xml", + "uglytoad.pdfpig.tokenization.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.tokenization.nuspec" + ] + }, + "UglyToad.PdfPig.Tokens/1.7.0-custom-5": { + "sha512": "m/j5RVfL4eF/OwX6ASprzK+yzD3l7xdgQ7zQPgENhjxfuXD+hj6FSeZlmxSTt9ywvWcTCjGKAILl9XTK9iQgCQ==", + "type": "package", + "path": "uglytoad.pdfpig.tokens/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net451/UglyToad.PdfPig.Tokens.dll", + "lib/net451/UglyToad.PdfPig.Tokens.xml", + "lib/net452/UglyToad.PdfPig.Tokens.dll", + "lib/net452/UglyToad.PdfPig.Tokens.xml", + "lib/net46/UglyToad.PdfPig.Tokens.dll", + "lib/net46/UglyToad.PdfPig.Tokens.xml", + "lib/net461/UglyToad.PdfPig.Tokens.dll", + "lib/net461/UglyToad.PdfPig.Tokens.xml", + "lib/net462/UglyToad.PdfPig.Tokens.dll", + "lib/net462/UglyToad.PdfPig.Tokens.xml", + "lib/net47/UglyToad.PdfPig.Tokens.dll", + "lib/net47/UglyToad.PdfPig.Tokens.xml", + "lib/net6.0/UglyToad.PdfPig.Tokens.dll", + "lib/net6.0/UglyToad.PdfPig.Tokens.xml", + "lib/netstandard2.0/UglyToad.PdfPig.Tokens.dll", + "lib/netstandard2.0/UglyToad.PdfPig.Tokens.xml", + "uglytoad.pdfpig.tokens.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.tokens.nuspec" + ] + }, + "xunit/2.9.0": { + "sha512": "PtU3rZ0ThdmdJqTbK7GkgFf6iBaCR6Q0uvJHznID+XEYk2v6O/b7sRxqnbi3B2gRDXxjTqMkVNayzwsqsFUxRw==", + "type": "package", + "path": "xunit/2.9.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "xunit.2.9.0.nupkg.sha512", + "xunit.nuspec" + ] + }, + "xunit.abstractions/2.0.3": { + "sha512": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==", + "type": "package", + "path": "xunit.abstractions/2.0.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net35/xunit.abstractions.dll", + "lib/net35/xunit.abstractions.xml", + "lib/netstandard1.0/xunit.abstractions.dll", + "lib/netstandard1.0/xunit.abstractions.xml", + "lib/netstandard2.0/xunit.abstractions.dll", + "lib/netstandard2.0/xunit.abstractions.xml", + "xunit.abstractions.2.0.3.nupkg.sha512", + "xunit.abstractions.nuspec" + ] + }, + "xunit.analyzers/1.15.0": { + "sha512": "s+M8K/Rtlgr6CmD7AYQKrNTvT5sh0l0ZKDoZ3Z/ExhlIwfV9mGAMR4f7KqIB7SSK7ZOhqDTgTUMYPmKfmvWUWQ==", + "type": "package", + "path": "xunit.analyzers/1.15.0", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "analyzers/dotnet/cs/xunit.analyzers.dll", + "analyzers/dotnet/cs/xunit.analyzers.fixes.dll", + "tools/install.ps1", + "tools/uninstall.ps1", + "xunit.analyzers.1.15.0.nupkg.sha512", + "xunit.analyzers.nuspec" + ] + }, + "xunit.assert/2.9.0": { + "sha512": "Z/1pyia//860wEYTKn6Q5dmgikJdRjgE4t5AoxJkK8oTmidzPLEPG574kmm7LFkMLbH6Frwmgb750kcyR+hwoA==", + "type": "package", + "path": "xunit.assert/2.9.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "lib/net6.0/xunit.assert.dll", + "lib/net6.0/xunit.assert.xml", + "lib/netstandard1.1/xunit.assert.dll", + "lib/netstandard1.1/xunit.assert.xml", + "xunit.assert.2.9.0.nupkg.sha512", + "xunit.assert.nuspec" + ] + }, + "xunit.core/2.9.0": { + "sha512": "uRaop9tZsZMCaUS4AfbSPGYHtvywWnm8XXFNUqII7ShWyDBgdchY6gyDNgO4AK1Lv/1NNW61Zq63CsDV6oH6Jg==", + "type": "package", + "path": "xunit.core/2.9.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "build/xunit.core.props", + "build/xunit.core.targets", + "buildMultiTargeting/xunit.core.props", + "buildMultiTargeting/xunit.core.targets", + "xunit.core.2.9.0.nupkg.sha512", + "xunit.core.nuspec" + ] + }, + "xunit.extensibility.core/2.9.0": { + "sha512": "zjDEUSxsr6UNij4gIwCgMqQox+oLDPRZ+mubwWLci+SssPBFQD1xeRR4SvgBuXqbE0QXCJ/STVTp+lxiB5NLVA==", + "type": "package", + "path": "xunit.extensibility.core/2.9.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "lib/net452/xunit.core.dll", + "lib/net452/xunit.core.dll.tdnet", + "lib/net452/xunit.core.xml", + "lib/net452/xunit.runner.tdnet.dll", + "lib/net452/xunit.runner.utility.net452.dll", + "lib/netstandard1.1/xunit.core.dll", + "lib/netstandard1.1/xunit.core.xml", + "xunit.extensibility.core.2.9.0.nupkg.sha512", + "xunit.extensibility.core.nuspec" + ] + }, + "xunit.extensibility.execution/2.9.0": { + "sha512": "5ZTQZvmPLlBw6QzCOwM0KnMsZw6eGjbmC176QHZlcbQoMhGIeGcYzYwn5w9yXxf+4phtplMuVqTpTbFDQh2bqQ==", + "type": "package", + "path": "xunit.extensibility.execution/2.9.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "lib/net452/xunit.execution.desktop.dll", + "lib/net452/xunit.execution.desktop.xml", + "lib/netstandard1.1/xunit.execution.dotnet.dll", + "lib/netstandard1.1/xunit.execution.dotnet.xml", + "xunit.extensibility.execution.2.9.0.nupkg.sha512", + "xunit.extensibility.execution.nuspec" + ] + }, + "xunit.runner.visualstudio/2.8.2": { + "sha512": "vm1tbfXhFmjFMUmS4M0J0ASXz3/U5XvXBa6DOQUL3fEz4Vt6YPhv+ESCarx6M6D+9kJkJYZKCNvJMas1+nVfmQ==", + "type": "package", + "path": "xunit.runner.visualstudio/2.8.2", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "_content/README.md", + "_content/logo-128-transparent.png", + "build/net462/xunit.abstractions.dll", + "build/net462/xunit.runner.reporters.net452.dll", + "build/net462/xunit.runner.utility.net452.dll", + "build/net462/xunit.runner.visualstudio.props", + "build/net462/xunit.runner.visualstudio.testadapter.dll", + "build/net6.0/xunit.abstractions.dll", + "build/net6.0/xunit.runner.reporters.netcoreapp10.dll", + "build/net6.0/xunit.runner.utility.netcoreapp10.dll", + "build/net6.0/xunit.runner.visualstudio.props", + "build/net6.0/xunit.runner.visualstudio.testadapter.dll", + "lib/net462/_._", + "lib/net6.0/_._", + "xunit.runner.visualstudio.2.8.2.nupkg.sha512", + "xunit.runner.visualstudio.nuspec" + ] + }, + "AxCopilot/1.7.2": { + "type": "project", + "path": "../AxCopilot/AxCopilot.csproj", + "msbuildProject": "../AxCopilot/AxCopilot.csproj" + }, + "AxCopilot.SDK/1.0.0": { + "type": "project", + "path": "../AxCopilot.SDK/AxCopilot.SDK.csproj", + "msbuildProject": "../AxCopilot.SDK/AxCopilot.SDK.csproj" + } + }, + "projectFileDependencyGroups": { + "net8.0-windows7.0": [ + "AxCopilot >= 1.7.2", + "FluentAssertions >= 6.12.0", + "Microsoft.NET.Test.Sdk >= 17.11.0", + "xunit >= 2.9.0", + "xunit.runner.visualstudio >= 2.8.2" + ] + }, + "packageFolders": { + "C:\\Users\\admin\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot.Tests\\AxCopilot.Tests.csproj", + "projectName": "AxCopilot.Tests", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.Tests\\AxCopilot.Tests.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot.Tests\\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": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "FluentAssertions": { + "target": "Package", + "version": "[6.12.0, )" + }, + "Microsoft.NET.Test.Sdk": { + "target": "Package", + "version": "[17.11.0, )" + }, + "xunit": { + "target": "Package", + "version": "[2.9.0, )" + }, + "xunit.runner.visualstudio": { + "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", + "suppressParent": "All", + "target": "Package", + "version": "[2.8.2, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App.WPF": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot.Tests/obj/project.nuget.cache b/src/AxCopilot.Tests/obj/project.nuget.cache new file mode 100644 index 0000000..66d4aa8 --- /dev/null +++ b/src/AxCopilot.Tests/obj/project.nuget.cache @@ -0,0 +1,45 @@ +{ + "version": 2, + "dgSpecHash": "+xnkX9MZV/A=", + "success": true, + "projectFilePath": "E:\\AX Copilot\\src\\AxCopilot.Tests\\AxCopilot.Tests.csproj", + "expectedPackageFiles": [ + "C:\\Users\\admin\\.nuget\\packages\\documentformat.openxml\\3.2.0\\documentformat.openxml.3.2.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\documentformat.openxml.framework\\3.2.0\\documentformat.openxml.framework.3.2.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\fluentassertions\\6.12.0\\fluentassertions.6.12.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\markdig\\0.37.0\\markdig.0.37.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.codecoverage\\17.11.0\\microsoft.codecoverage.17.11.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.data.sqlite\\8.0.0\\microsoft.data.sqlite.8.0.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.data.sqlite.core\\8.0.0\\microsoft.data.sqlite.core.8.0.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.net.test.sdk\\17.11.0\\microsoft.net.test.sdk.17.11.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.testplatform.objectmodel\\17.11.0\\microsoft.testplatform.objectmodel.17.11.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.testplatform.testhost\\17.11.0\\microsoft.testplatform.testhost.17.11.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.web.webview2\\1.0.2903.40\\microsoft.web.webview2.1.0.2903.40.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\newtonsoft.json\\13.0.1\\newtonsoft.json.13.0.1.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\sqlitepclraw.bundle_e_sqlite3\\2.1.6\\sqlitepclraw.bundle_e_sqlite3.2.1.6.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\sqlitepclraw.core\\2.1.6\\sqlitepclraw.core.2.1.6.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\sqlitepclraw.lib.e_sqlite3\\2.1.6\\sqlitepclraw.lib.e_sqlite3.2.1.6.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\sqlitepclraw.provider.e_sqlite3\\2.1.6\\sqlitepclraw.provider.e_sqlite3.2.1.6.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.configuration.configurationmanager\\4.4.0\\system.configuration.configurationmanager.4.4.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.diagnostics.eventlog\\8.0.1\\system.diagnostics.eventlog.8.0.1.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.io.packaging\\8.0.1\\system.io.packaging.8.0.1.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.memory\\4.5.3\\system.memory.4.5.3.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.reflection.metadata\\1.6.0\\system.reflection.metadata.1.6.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.security.cryptography.protecteddata\\8.0.0\\system.security.cryptography.protecteddata.8.0.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.serviceprocess.servicecontroller\\8.0.1\\system.serviceprocess.servicecontroller.8.0.1.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig\\1.7.0-custom-5\\uglytoad.pdfpig.1.7.0-custom-5.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig.core\\1.7.0-custom-5\\uglytoad.pdfpig.core.1.7.0-custom-5.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig.fonts\\1.7.0-custom-5\\uglytoad.pdfpig.fonts.1.7.0-custom-5.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig.tokenization\\1.7.0-custom-5\\uglytoad.pdfpig.tokenization.1.7.0-custom-5.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig.tokens\\1.7.0-custom-5\\uglytoad.pdfpig.tokens.1.7.0-custom-5.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\xunit\\2.9.0\\xunit.2.9.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\xunit.abstractions\\2.0.3\\xunit.abstractions.2.0.3.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\xunit.analyzers\\1.15.0\\xunit.analyzers.1.15.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\xunit.assert\\2.9.0\\xunit.assert.2.9.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\xunit.core\\2.9.0\\xunit.core.2.9.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\xunit.extensibility.core\\2.9.0\\xunit.extensibility.core.2.9.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\xunit.extensibility.execution\\2.9.0\\xunit.extensibility.execution.2.9.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\xunit.runner.visualstudio\\2.8.2\\xunit.runner.visualstudio.2.8.2.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/src/AxCopilot/.DS_Store b/src/AxCopilot/.DS_Store new file mode 100644 index 0000000..d8ca50d Binary files /dev/null and b/src/AxCopilot/.DS_Store differ diff --git a/src/AxCopilot/App.xaml b/src/AxCopilot/App.xaml new file mode 100644 index 0000000..f731397 --- /dev/null +++ b/src/AxCopilot/App.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/App.xaml.cs b/src/AxCopilot/App.xaml.cs new file mode 100644 index 0000000..c11e840 --- /dev/null +++ b/src/AxCopilot/App.xaml.cs @@ -0,0 +1,776 @@ +using System.Windows; +using System.Windows.Forms; +using Microsoft.Win32; +using AxCopilot.Core; +using AxCopilot.Handlers; +using AxCopilot.Services; +using AxCopilot.Services.Agent; +using AxCopilot.ViewModels; +using AxCopilot.Views; + +namespace AxCopilot; + +public partial class App : System.Windows.Application +{ + private System.Threading.Mutex? _singleInstanceMutex; + private InputListener? _inputListener; + private LauncherWindow? _launcher; + private NotifyIcon? _trayIcon; + private Views.TrayMenuWindow? _trayMenu; + private SettingsService? _settings; + private SettingsWindow? _settingsWindow; + private PluginHost? _pluginHost; + private ClipboardHistoryService? _clipboardHistory; + private DockBarWindow? _dockBar; + private FileDialogWatcher? _fileDialogWatcher; + private volatile IndexService? _indexService; + public IndexService? IndexService => _indexService; + public SettingsService? SettingsService => _settings; + public ClipboardHistoryService? ClipboardHistoryService => _clipboardHistory; + private SessionTrackingService? _sessionTracking; + private WorktimeReminderService? _worktimeReminder; + private ScreenCaptureHandler? _captureHandler; + private AgentMemoryService? _memoryService; + public AgentMemoryService? MemoryService => _memoryService; + private LlmService? _sharedLlm; + private PluginInstallService? _pluginInstallService; + + protected override void OnStartup(StartupEventArgs e) + { + base.OnStartup(e); + + // ─── 보안: 디버거/디컴파일러 감지 (Release 빌드만 활성) ─── + Security.AntiTamper.Check(); + + // 전역 예외 핸들러 — 미처리 예외 시 로그 + 메시지 (크래시 방지) + DispatcherUnhandledException += (_, ex) => + { + LogService.Error($"미처리 예외: {ex.Exception}"); + CustomMessageBox.Show( + $"오류가 발생했습니다:\n{ex.Exception.Message}\n\n로그 폴더를 확인하세요.", + "AX Copilot 오류", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); + ex.Handled = true; + }; + + // ─── 중복 실행 방지 ────────────────────────────────────────────────── + _singleInstanceMutex = new System.Threading.Mutex( + initiallyOwned: true, "Global\\AXCopilot_SingleInstance", out bool createdNew); + if (!createdNew) + { + _singleInstanceMutex.Dispose(); + _singleInstanceMutex = null; + CustomMessageBox.Show("AX Copilot가 이미 실행 중입니다.\n트레이 아이콘을 확인하세요.", + "AX Copilot", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Information); + Shutdown(); + return; + } + + LogService.Info("=== AX Copilot 시작 ==="); + + // ─── 서비스 초기화 ──────────────────────────────────────────────────── + _settings = new SettingsService(); + var settings = _settings; + settings.Load(); + + // Phase L3 공유 서비스 + _sharedLlm = new LlmService(settings); + _pluginInstallService = new PluginInstallService(); + + // 마이그레이션 알림 (UI가 준비된 후 표시) + if (settings.MigrationSummary != null) + { + Dispatcher.BeginInvoke(() => + { + CustomMessageBox.Show( + settings.MigrationSummary, + "AX Copilot — 설정 업데이트", + System.Windows.MessageBoxButton.OK, + System.Windows.MessageBoxImage.Information); + }, System.Windows.Threading.DispatcherPriority.Loaded); + } + + // 언어 초기화 + L10n.SetLanguage(settings.Settings.Launcher.Language); + + // 첫 실행 시 자동 시작 등록 (레지스트리에 아직 없으면) + if (!IsAutoStartEnabled()) + SetAutoStart(true); + + _memoryService = new AgentMemoryService(); + _memoryService.Load(settings.Settings.Llm.WorkFolder); + + _indexService = new IndexService(settings); + var indexService = _indexService; + var fuzzyEngine = new FuzzyEngine(indexService); + var commandResolver = new CommandResolver(fuzzyEngine, settings); + var contextManager = new ContextManager(settings); + + // ─── 세션 추적 / 사용 통계 ──────────────────────────────────────────── + _sessionTracking = new SessionTrackingService(); + + // ─── 잠금 해제 알림 서비스 ──────────────────────────────────────────── + _worktimeReminder = new WorktimeReminderService(settings, Dispatcher); + + // ─── 클립보드 히스토리 서비스 ────────────────────────────────────────── + _clipboardHistory = new ClipboardHistoryService(settings); + + // ─── 빌트인 핸들러 등록 ────────────────────────────────────────────── + commandResolver.RegisterHandler(new CalculatorHandler()); + commandResolver.RegisterHandler(new SystemCommandHandler(settings)); + commandResolver.RegisterHandler(new SnippetHandler(settings)); + commandResolver.RegisterHandler(new ClipboardHistoryHandler(_clipboardHistory)); + commandResolver.RegisterHandler(new WorkspaceHandler(contextManager, settings)); + commandResolver.RegisterHandler(new UrlAliasHandler(settings)); + commandResolver.RegisterHandler(new FolderAliasHandler(settings)); + commandResolver.RegisterHandler(new BatchHandler(settings)); + commandResolver.RegisterHandler(new ClipboardHandler(settings)); + commandResolver.RegisterHandler(new BookmarkHandler()); + commandResolver.RegisterHandler(new WebSearchHandler(settings)); + commandResolver.RegisterHandler(new ProcessHandler()); + commandResolver.RegisterHandler(new MediaHandler()); + commandResolver.RegisterHandler(new SystemInfoHandler()); + commandResolver.RegisterHandler(new StarInfoHandler()); // * 단축키 (info와 동일) + commandResolver.RegisterHandler(new EmojiHandler()); + commandResolver.RegisterHandler(new ColorHandler()); + commandResolver.RegisterHandler(new RecentFilesHandler()); + commandResolver.RegisterHandler(new NoteHandler()); + commandResolver.RegisterHandler(new UninstallHandler()); + commandResolver.RegisterHandler(new PortHandler()); + commandResolver.RegisterHandler(new EnvHandler()); + commandResolver.RegisterHandler(new JsonHandler()); + commandResolver.RegisterHandler(new EncodeHandler()); + commandResolver.RegisterHandler(new SnapHandler()); + _captureHandler = new ScreenCaptureHandler(settings); + commandResolver.RegisterHandler(_captureHandler); + commandResolver.RegisterHandler(new ColorPickHandler()); + commandResolver.RegisterHandler(new DateCalcHandler()); + commandResolver.RegisterHandler(new ServiceHandler(_clipboardHistory)); + commandResolver.RegisterHandler(new ClipboardPipeHandler()); + commandResolver.RegisterHandler(new JournalHandler()); + commandResolver.RegisterHandler(new RoutineHandler()); + commandResolver.RegisterHandler(new BatchTextHandler()); + commandResolver.RegisterHandler(new DiffHandler(_clipboardHistory)); + commandResolver.RegisterHandler(new WindowSwitchHandler()); + commandResolver.RegisterHandler(new RunHandler()); + commandResolver.RegisterHandler(new TextStatsHandler()); + commandResolver.RegisterHandler(new FavoriteHandler()); + commandResolver.RegisterHandler(new RenameHandler()); + commandResolver.RegisterHandler(new MonitorHandler()); + commandResolver.RegisterHandler(new ScaffoldHandler()); + commandResolver.RegisterHandler(new EverythingHandler()); + commandResolver.RegisterHandler(new HelpHandler(settings)); + commandResolver.RegisterHandler(new ChatHandler(settings)); + + // ─── Phase L3 핸들러 ────────────────────────────────────────────────── + commandResolver.RegisterHandler(new QuickLinkHandler(settings)); + var snippetTemplateSvc = new SnippetTemplateService(settings, _sharedLlm); + commandResolver.RegisterHandler(new AiSnippetHandler(settings, snippetTemplateSvc)); + commandResolver.RegisterHandler(new WebSearchSummaryHandler(settings, _sharedLlm)); + + // ─── 플러그인 로드 ──────────────────────────────────────────────────── + var pluginHost = new PluginHost(settings, commandResolver); + pluginHost.LoadAll(); + _pluginHost = pluginHost; + + // ─── 런처 윈도우 ────────────────────────────────────────────────────── + var vm = new LauncherViewModel(commandResolver, settings); + _launcher = new LauncherWindow(vm) + { + OpenSettingsAction = OpenSettings + }; + + // ─── 클립보드 히스토리 초기화 (메시지 펌프 시작 직후 — 런처 표시 불필요) ── + Dispatcher.BeginInvoke( + () => _clipboardHistory?.Initialize(), + System.Windows.Threading.DispatcherPriority.ApplicationIdle); + + // ─── ChatWindow 미리 생성 (앱 유휴 시점에 숨겨진 채로 초기화) ────────── + // 이후 OpenAiChat() 시 창 생성 비용 없이 즉시 열림 + Dispatcher.BeginInvoke( + () => PrewarmChatWindow(), + System.Windows.Threading.DispatcherPriority.SystemIdle); + + // ─── 인덱스 빌드 (백그라운드) + 완료 후 FileSystemWatcher 시작 ──────── + _ = indexService.BuildAsync().ContinueWith(_ => indexService.StartWatchers()); + + // ─── 글로벌 훅 + 스니펫 확장기 ─────────────────────────────────────── + _inputListener = new InputListener(); + _inputListener.HotkeyTriggered += OnHotkeyTriggered; + _inputListener.CaptureHotkeyTriggered += OnCaptureHotkeyTriggered; + _inputListener.HookFailed += OnHookFailed; + + // 설정에 저장된 핫키로 초기화 (기본: Alt+Space) + _inputListener.UpdateHotkey(settings.Settings.Hotkey); + + // 글로벌 캡처 단축키 초기화 + _inputListener.UpdateCaptureHotkey( + settings.Settings.ScreenCapture.GlobalHotkey, + settings.Settings.ScreenCapture.GlobalHotkeyEnabled); + + var snippetExpander = new SnippetExpander(settings); + _inputListener.KeyFilter = snippetExpander.HandleKey; + + _inputListener.Start(); + + // ─── 시스템 트레이 ───────────────────────────────────────────────────── + SetupTrayIcon(pluginHost, settings); + + // ─── 파일 대화상자 감지 ────────────────────────────────────────────── + _fileDialogWatcher = new FileDialogWatcher(); + _fileDialogWatcher.FileDialogOpened += (_, hwnd) => + { + Dispatcher.Invoke(() => + { + if (_launcher == null || _launcher.IsVisible) return; + if (_settings?.Settings.Launcher.EnableFileDialogIntegration != true) return; + WindowTracker.Capture(); + _launcher.Show(); + Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input, + () => _launcher.SetInputText("cd ")); + }); + }; + _fileDialogWatcher.Start(); + + // 독 바 자동 표시 + if (settings.Settings.Launcher.DockBarAutoShow) + Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Loaded, () => ToggleDockBar()); + + LogService.Info($"초기화 완료. {settings.Settings.Hotkey}로 실행하세요."); + } + + private void OnHotkeyTriggered(object? sender, EventArgs e) + { + // 런처가 열리기 전 현재 활성 창을 저장 (SnapHandler, ScreenCaptureHandler용) + WindowTracker.Capture(); + + // 선택 텍스트 감지는 UI 스레드 밖에서 수행해야 SendInput이 정상 처리됨 + var launcherSettings = _settings?.Settings.Launcher; + var enableTextAction = launcherSettings?.EnableTextAction == true; + + // ── 런처 토글(닫기)은 텍스트 감지 없이 즉시 처리 ── + bool isVisible = false; + Dispatcher.Invoke(() => { isVisible = _launcher?.IsVisible == true; }); + if (isVisible) + { + Dispatcher.Invoke(() => _launcher?.Hide()); + return; + } + + // ── 텍스트 감지가 비활성이면 즉시 런처 표시 ── + if (!enableTextAction) + { + Dispatcher.Invoke(() => + { + if (_launcher == null) return; + UsageStatisticsService.RecordLauncherOpen(); + _launcher.Show(); + }); + return; + } + + // ── 텍스트 감지 활성: 런처를 먼저 열고, 텍스트 감지를 비동기로 처리 ── + string? selectedText = TryGetSelectedText(); + + Dispatcher.Invoke(() => + { + if (_launcher == null) return; + + if (!string.IsNullOrWhiteSpace(selectedText)) + { + var enabledCmds = launcherSettings?.TextActionCommands ?? new(); + + // 활성 명령이 1개뿐이면 팝업 없이 바로 실행 + if (enabledCmds.Count == 1) + { + var directAction = TextActionPopup.AvailableCommands + .FirstOrDefault(c => c.Key == enabledCmds[0]); + if (!string.IsNullOrEmpty(directAction.Key)) + { + var actionResult = enabledCmds[0] switch + { + "translate" => TextActionPopup.ActionResult.Translate, + "summarize" => TextActionPopup.ActionResult.Summarize, + "grammar" => TextActionPopup.ActionResult.GrammarFix, + "explain" => TextActionPopup.ActionResult.Explain, + "rewrite" => TextActionPopup.ActionResult.Rewrite, + _ => TextActionPopup.ActionResult.None, + }; + if (actionResult != TextActionPopup.ActionResult.None) + { + ExecuteTextAction(actionResult, selectedText); + return; + } + } + } + + // 여러 개 → 팝업 표시 + var popup = new TextActionPopup(selectedText, enabledCmds); + popup.Closed += (_, _) => + { + switch (popup.SelectedAction) + { + case TextActionPopup.ActionResult.OpenLauncher: + UsageStatisticsService.RecordLauncherOpen(); + _launcher.Show(); + break; + case TextActionPopup.ActionResult.None: + break; // Esc 또는 포커스 잃음 + default: + // AI 명령 실행 → AX Agent 대화로 전달 + ExecuteTextAction(popup.SelectedAction, popup.SelectedText); + break; + } + }; + popup.Show(); + } + else + { + UsageStatisticsService.RecordLauncherOpen(); + _launcher.Show(); + } + }); + } + + /// 현재 선택된 텍스트를 가져옵니다 (Ctrl+C 시뮬레이션). + /// 후크 스레드에서 호출됩니다 (UI 스레드 아님). 클립보드 접근은 STA 스레드가 필요합니다. + private string? TryGetSelectedText() + { + try + { + // 클립보드는 STA 스레드에서만 접근 가능 → Dispatcher로 읽기 + string? prevText = null; + bool hadText = false; + Dispatcher.Invoke(() => + { + hadText = System.Windows.Clipboard.ContainsText(); + prevText = hadText ? System.Windows.Clipboard.GetText() : null; + System.Windows.Clipboard.Clear(); + }); + + System.Threading.Thread.Sleep(30); + + // Ctrl+C 시뮬레이션 (후크 스레드에서 → 대상 앱이 처리) + var inputs = new[] + { + new NativeMethods.INPUT { type = 1, u = new NativeMethods.InputUnion { ki = new NativeMethods.KEYBDINPUT { wVk = 0x11 } } }, + new NativeMethods.INPUT { type = 1, u = new NativeMethods.InputUnion { ki = new NativeMethods.KEYBDINPUT { wVk = 0x43 } } }, + new NativeMethods.INPUT { type = 1, u = new NativeMethods.InputUnion { ki = new NativeMethods.KEYBDINPUT { wVk = 0x43, dwFlags = 0x0002 } } }, + new NativeMethods.INPUT { type = 1, u = new NativeMethods.InputUnion { ki = new NativeMethods.KEYBDINPUT { wVk = 0x11, dwFlags = 0x0002 } } }, + }; + NativeMethods.SendInput((uint)inputs.Length, inputs, System.Runtime.InteropServices.Marshal.SizeOf()); + + // 클립보드 업데이트 대기 (앱마다 다름) + System.Threading.Thread.Sleep(80); + + // 클립보드에서 새 텍스트 확인 (STA 필요) + string? selected = null; + Dispatcher.Invoke(() => + { + if (System.Windows.Clipboard.ContainsText()) + { + var copied = System.Windows.Clipboard.GetText(); + if (copied != prevText && !string.IsNullOrWhiteSpace(copied)) + selected = copied; + } + + // 클립보드 복원 + if (selected != null && prevText != null) + System.Windows.Clipboard.SetText(prevText); + else if (selected != null && !hadText) + System.Windows.Clipboard.Clear(); + }); + + return selected; + } + catch (Exception) + { + return null; + } + } + + /// AI 텍스트 명령을 AX Agent 대화로 전달합니다. + private void ExecuteTextAction(TextActionPopup.ActionResult action, string text) + { + var prompt = action switch + { + TextActionPopup.ActionResult.Translate => $"다음 텍스트를 번역해줘:\n\n{text}", + TextActionPopup.ActionResult.Summarize => $"다음 텍스트를 요약해줘:\n\n{text}", + TextActionPopup.ActionResult.GrammarFix => $"다음 텍스트의 문법을 교정해줘:\n\n{text}", + TextActionPopup.ActionResult.Explain => $"다음 텍스트를 쉽게 설명해줘:\n\n{text}", + TextActionPopup.ActionResult.Rewrite => $"다음 텍스트를 다시 작성해줘:\n\n{text}", + _ => text + }; + + // ! 프리픽스로 AX Agent에 전달 + _launcher?.Show(); + _launcher?.SetInputText($"! {prompt}"); + } + + private static class NativeMethods + { + [System.Runtime.InteropServices.DllImport("user32.dll")] + public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); + + [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] + public struct INPUT { public uint type; public InputUnion u; } + + [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit)] + public struct InputUnion { [System.Runtime.InteropServices.FieldOffset(0)] public KEYBDINPUT ki; } + + [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] + public struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } + } + + private void OnCaptureHotkeyTriggered(object? sender, EventArgs e) + { + // 런처 없이 직접 캡처 실행 + WindowTracker.Capture(); + var mode = _settings?.Settings.ScreenCapture.GlobalHotkeyMode ?? "screen"; + Dispatcher.Invoke(async () => + { + if (_captureHandler == null) return; + try + { + await _captureHandler.CaptureDirectAsync(mode); + } + catch (Exception ex) + { + LogService.Error($"글로벌 캡처 실패: {ex.Message}"); + } + }); + } + + private void OnHookFailed(object? sender, EventArgs e) + { + Dispatcher.Invoke(() => + { + _trayIcon?.ShowBalloonTip(3000, "AX Copilot", + $"글로벌 단축키 등록에 실패했습니다.\n다른 앱과 {_settings?.Settings.Hotkey ?? "단축키"}가 충돌하고 있을 수 있습니다.", + ToolTipIcon.Warning); + }); + } + + private void SetupTrayIcon(PluginHost pluginHost, SettingsService settings) + { + _trayIcon = new NotifyIcon + { + Text = "AX Copilot", + Visible = true, + Icon = LoadAppIcon() + }; + + // ─── WPF 커스텀 트레이 메뉴 구성 ────────────────────────────────── + _trayMenu = new Views.TrayMenuWindow(); + _trayMenu + .AddItem("\uE7C5", "AX Commander 호출하기", () => + Dispatcher.Invoke(() => _launcher?.Show())) + .AddItem("\uE8BD", "AX Agent 대화하기", () => + Dispatcher.Invoke(() => OpenAiChat()), out var aiTrayItem) + .AddItem("\uE8A7", "독 바 표시", () => + Dispatcher.Invoke(() => ToggleDockBar())) + .AddSeparator() + .AddItem("\uE72C", "플러그인 재로드", () => + { + pluginHost.Reload(); + _trayIcon!.ShowBalloonTip(2000, "AX Copilot", "플러그인이 재로드되었습니다.", ToolTipIcon.None); + }) + .AddItem("\uE838", "로그 폴더 열기", () => + { + var logDir = System.IO.Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "logs"); + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("explorer.exe", logDir) + { UseShellExecute = true }); + }) + .AddItem("\uE9D9", "사용 통계", () => + Dispatcher.Invoke(() => new StatisticsWindow().Show())) + .AddItem("\uE736", "사용 가이드 문서보기", () => + { + try { Dispatcher.Invoke(() => new Views.GuideViewerWindow().Show()); } + catch (Exception ex) { LogService.Error($"사용 가이드 열기 실패: {ex.Message}"); } + }) + .AddSeparator() + .AddToggleItem("\uE82F", "Windows 시작 시 자동 실행", IsAutoStartEnabled(), + isChecked => SetAutoStart(isChecked), out _, out _) + .AddSeparator() + .AddItem("\uE713", "설정", () => + Dispatcher.Invoke(OpenSettings)) + .AddItem("\uE946", "개발 정보", () => + Dispatcher.Invoke(() => new AboutWindow().Show())) + .AddItem("\uE711", "종료", () => + { + _inputListener?.Dispose(); + _trayIcon?.Dispose(); + Shutdown(); + }); + + // AI 기능 활성화 여부에 따라 메뉴 항목 가시성 동적 업데이트 + _trayMenu.Opening += () => + { + aiTrayItem.Visibility = settings.Settings.AiEnabled + ? System.Windows.Visibility.Visible + : System.Windows.Visibility.Collapsed; + }; + + // 우클릭 → WPF 메뉴 표시, 좌클릭 → 런처 토글 + _trayIcon.MouseClick += (_, e) => + { + if (e.Button == System.Windows.Forms.MouseButtons.Left) + Dispatcher.Invoke(() => _launcher?.Show()); + else if (e.Button == System.Windows.Forms.MouseButtons.Right) + Dispatcher.Invoke(() => _trayMenu?.ShowWithUpdate()); + }; + + // 타이머/알람 풍선 알림 서비스 연결 + NotificationService.Initialize((title, msg) => + { + Dispatcher.Invoke(() => + _trayIcon?.ShowBalloonTip(4000, title, msg, ToolTipIcon.None)); + }); + } + + /// ChatWindow 등 외부에서 설정 창을 여는 공개 메서드. + public void OpenSettingsFromChat() => Dispatcher.Invoke(OpenSettings); + + /// AX Agent 창 열기 (트레이 메뉴 등에서 호출). + private Views.ChatWindow? _chatWindow; + + /// + /// ChatWindow를 백그라운드에서 미리 생성합니다 (앱 시작 후 저우선순위로 호출). + /// 이후 OpenAiChat() 시 창 생성 비용 없이 즉시 Show/Activate만 수행합니다. + /// + internal void PrewarmChatWindow() + { + if (_chatWindow != null || _settings == null) return; + _chatWindow = new Views.ChatWindow(_settings); + } + + private void OpenAiChat() + { + if (_settings == null) return; + if (_chatWindow == null) + { + _chatWindow = new Views.ChatWindow(_settings); + } + _chatWindow.Show(); + _chatWindow.Activate(); + } + + public void ToggleDockBar() + { + if (_dockBar != null && _dockBar.IsVisible) + { + _dockBar.Hide(); + return; + } + + if (_dockBar == null) + { + _dockBar = new DockBarWindow(); + _dockBar.OnQuickSearch = query => + { + if (_launcher == null) return; + _launcher.Show(); + _launcher.Activate(); // 독 바 뒤가 아닌 전면에 표시 + if (!string.IsNullOrEmpty(query)) + Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input, + () => _launcher.SetInputText(query)); + }; + _dockBar.OnCapture = async () => + { + WindowTracker.Capture(); + if (_captureHandler != null) + await _captureHandler.CaptureDirectAsync("region"); + }; + _dockBar.OnOpenAgent = () => + { + if (_launcher == null) return; + _launcher.Show(); + Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input, + () => _launcher.SetInputText("!")); + }; + } + var launcher = _settings?.Settings.Launcher; + var dockItems = launcher?.DockBarItems ?? new() { "launcher", "clipboard", "capture", "agent", "clock", "cpu" }; + _dockBar.BuildFromSettings(dockItems); + _dockBar.OnPositionChanged = (left, top) => + { + if (_settings != null) + { + _settings.Settings.Launcher.DockBarLeft = left; + _settings.Settings.Launcher.DockBarTop = top; + _settings.Save(); + } + }; + _dockBar.Show(); + _dockBar.ApplySettings( + launcher?.DockBarOpacity ?? 0.92, + launcher?.DockBarLeft ?? -1, + launcher?.DockBarTop ?? -1, + launcher?.DockBarRainbowGlow ?? false); + } + + /// 독 바를 현재 설정으로 즉시 새로고침합니다. + public void RefreshDockBar() + { + if (_dockBar == null || !_dockBar.IsVisible) return; + var launcher = _settings?.Settings.Launcher; + var dockItems = launcher?.DockBarItems ?? new() { "launcher", "clipboard", "capture", "agent", "clock", "cpu" }; + _dockBar.BuildFromSettings(dockItems); + _dockBar.ApplySettings( + launcher?.DockBarOpacity ?? 0.92, + launcher?.DockBarLeft ?? -1, + launcher?.DockBarTop ?? -1, + launcher?.DockBarRainbowGlow ?? false); + } + + private void OpenSettings() + { + if (_settingsWindow != null && _settingsWindow.IsVisible) + { + _settingsWindow.Activate(); + return; + } + + if (_settings == null || _launcher == null) return; + + var vm = new ViewModels.SettingsViewModel(_settings); + + // 미리보기 콜백: 현재 편집 중인 색상(vm.ColorRows)으로 런처에 즉시 반영 + void PreviewCallback(string themeKey) + { + if (themeKey == "custom") + { + var tempColors = new AxCopilot.Models.CustomThemeColors(); + foreach (var row in vm.ColorRows) + { + var prop = typeof(AxCopilot.Models.CustomThemeColors).GetProperty(row.Property); + prop?.SetValue(tempColors, row.Hex); + } + _launcher.ApplyTheme(themeKey, tempColors); + } + else + { + _launcher.ApplyTheme(themeKey, _settings.Settings.Launcher.CustomTheme); + } + } + + // 취소/X 닫기 콜백: 파일에 저장된 원본 설정으로 복원 + void RevertCallback() + { + _launcher.ApplyTheme( + _settings.Settings.Launcher.Theme ?? "system", + _settings.Settings.Launcher.CustomTheme); + } + + _settingsWindow = new Views.SettingsWindow(vm, PreviewCallback, RevertCallback) + { + // 핫키 녹화 중 글로벌 핫키 일시 정지 + SuspendHotkeyCallback = suspend => + { + if (_inputListener != null) + _inputListener.SuspendHotkey = suspend; + } + }; + + // 저장 완료 시 InputListener 핫키 갱신 + 알림 타이머 재시작 + vm.SaveCompleted += (_, _) => + { + if (_inputListener != null && _settings != null) + { + _inputListener.UpdateHotkey(_settings.Settings.Hotkey); + _inputListener.UpdateCaptureHotkey( + _settings.Settings.ScreenCapture.GlobalHotkey, + _settings.Settings.ScreenCapture.GlobalHotkeyEnabled); + } + _worktimeReminder?.RestartTimer(); + }; + + _settingsWindow.Show(); + } + + // ─── 자동 시작 레지스트리 헬퍼 ────────────────────────────────────────── + + private static System.Drawing.Icon LoadAppIcon() + { + // DPI 인식 아이콘 크기 (기본 16 → 고DPI에서 20/24/32) + var iconSize = System.Windows.Forms.SystemInformation.SmallIconSize; + + // 1) 파일 시스템에서 로드 (개발 환경) + try + { + var exeDir = System.IO.Path.GetDirectoryName(Environment.ProcessPath) + ?? AppContext.BaseDirectory; + var path = System.IO.Path.Combine(exeDir, "Assets", "icon.ico"); + if (System.IO.File.Exists(path)) + return new System.Drawing.Icon(path, iconSize); + } + catch (Exception) { } + + // 2) 내장 리소스에서 로드 (PublishSingleFile 배포) + try + { + var uri = new Uri("pack://application:,,,/Assets/icon.ico"); + var stream = System.Windows.Application.GetResourceStream(uri)?.Stream; + if (stream != null) + return new System.Drawing.Icon(stream, iconSize); + } + catch (Exception) { } + + return System.Drawing.SystemIcons.Application; + } + + private const string AutoRunKey = @"Software\Microsoft\Windows\CurrentVersion\Run"; + private const string AutoRunName = "AxCopilot"; + + private static bool IsAutoStartEnabled() + { + try + { + using var key = Registry.CurrentUser.OpenSubKey(AutoRunKey, writable: false); + return key?.GetValue(AutoRunName) != null; + } + catch (Exception) { return false; } + } + + private static void SetAutoStart(bool enable) + { + try + { + using var key = Registry.CurrentUser.OpenSubKey(AutoRunKey, writable: true); + if (key == null) return; + + if (enable) + { + var exePath = Environment.ProcessPath + ?? System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName + ?? string.Empty; + if (!string.IsNullOrEmpty(exePath)) + key.SetValue(AutoRunName, $"\"{exePath}\""); + } + else + { + key.DeleteValue(AutoRunName, throwOnMissingValue: false); + } + } + catch (Exception ex) + { + LogService.Warn($"자동 시작 레지스트리 설정 실패: {ex.Message}"); + } + } + + protected override void OnExit(ExitEventArgs e) + { + _chatWindow?.ForceClose(); // 미리 생성된 ChatWindow 진짜 닫기 + _inputListener?.Dispose(); + _clipboardHistory?.Dispose(); + _indexService?.Dispose(); + _sessionTracking?.Dispose(); + _worktimeReminder?.Dispose(); + _trayIcon?.Dispose(); + try { _singleInstanceMutex?.ReleaseMutex(); } catch (Exception) { } + _singleInstanceMutex?.Dispose(); + LogService.Info("=== AX Copilot 종료 ==="); + base.OnExit(e); + } +} diff --git a/src/AxCopilot/Assets/.DS_Store b/src/AxCopilot/Assets/.DS_Store new file mode 100644 index 0000000..1d4cfd5 Binary files /dev/null and b/src/AxCopilot/Assets/.DS_Store differ diff --git a/src/AxCopilot/Assets/AX Copilot 개발자가이드.htm b/src/AxCopilot/Assets/AX Copilot 개발자가이드.htm new file mode 100644 index 0000000..e26b2e0 --- /dev/null +++ b/src/AxCopilot/Assets/AX Copilot 개발자가이드.htm @@ -0,0 +1,1301 @@ + + + + + +AX Copilot 사용 가이드 — 단축키 & 예약어 완전 정복 + + + +
+ + + + +
+
🚀 AX Copilot 사용 가이드
+

단축키 & 예약어 완전 정복
— 키보드 하나로 모든 업무를

+

+ Windows 전용 시맨틱 런처 AX Copilot의 모든 단축키와 명령 예약어를 한 페이지에 정리했습니다.
+ Alt+Space 한 번으로 앱 실행·파일 검색·계산·클립보드·화면 캡처·창 전환·시스템 제어 등 40개 이상의 기능을 즉시 호출합니다. +

+
+ + + + + + + + + +

⚡ 가장 많이 쓰는 단축키 한눈에

+
+
+
🤖
+
! (AX Copilot)
AI 어시스턴트와 대화 시작
+
+
+
⌨️
+
Alt + Space
런처 열기 / 닫기
+
+
+
+
Enter
선택 항목 실행
+
+
+
+
→ (오른쪽)
파일 액션 모드 진입
+
+
+
+
Escape
닫기 / 이전 단계로
+
+
+
📋
+
Ctrl + H
클립보드 히스토리
+
+
+
+
Ctrl + B
즐겨찾기 보기 토글
+
+
+
📌
+
Ctrl + P
즐겨찾기 추가 / 제거
+
+
+
?
+
Ctrl + K
단축키 참조창 열기
+
+
+
🖥
+
Ctrl + T
터미널에서 열기
+
+
+
📂
+
Ctrl + D
다운로드 폴더
+
+
+
🔢
+
Ctrl + 1~9
N번째 항목 즉시 실행
+
+
+
F5
+
F5
인덱스 새로고침
+
+
+ +
+💡 Tip. 입력창이 비어 있을 때 Home/End 키를 누르면 결과 목록의 첫/마지막 항목으로 바로 이동합니다. +설정에서 글로벌 단축키를 원하는 키 조합으로 자유롭게 변경할 수 있습니다. +
+ + + + +

🌐 1. 전역 단축키 (시스템 전체)

+
+ + + + + + + + + + +
단축키동작비고
Alt + Space런처 창 열기 / 닫기 (토글)기본값 · 설정에서 변경 가능
PrintScreen화면 캡처 즉시 실행설정 › 캡처에서 활성화 필요
+
+ + + + +

🪟 2. 런처 창 단축키

+ +
📍 탐색 & 선택
+
+ + + + + + + + + + + + + + +
단축키동작상세
/ 결과 목록 위/아래 이동끝에서 누르면 반대쪽으로 순환
PageUp / PageDown5칸씩 빠른 이동
Home / End첫 항목 / 마지막 항목으로 점프입력창 커서 위치 기반
Tab선택 항목 제목을 입력창에 자동완성
파일 액션 모드 진입복사·터미널·속성·삭제 등
Escape액션 모드 종료 / 런처 닫기
+
+ +
▶ 실행
+
+ + + + + + + + + + + + + +
단축키동작상세
Enter선택 항목 실행파일·앱·URL·명령 모두 지원
Ctrl + Enter관리자 권한으로 실행UAC 권한 상승 후 실행
Alt + Enter파일 속성 대화상자 열기
Shift + Enter대형 텍스트 표시 / 클립보드 병합Large Type 또는 다중 선택 병합
Ctrl + 1 ~ 9N번째 결과 항목 즉시 실행번호 배지와 연동
+
+ +
🔧 기능 단축키
+
+ + + + + + + + + + + + + + + + + +
단축키동작상세
F1도움말 창 열기help 입력과 동일
F2선택 파일 이름 변경 모드
F5파일 인덱스 즉시 재구축새 파일 추가 후 사용
Delete최근 실행 목록에서 항목 제거확인 다이얼로그 후 실행
Ctrl + ,설정 창 열기
Ctrl + L입력창 전체 초기화
Ctrl + W런처 즉시 닫기
Ctrl + K단축키 참조 모달창 열기Esc로 닫기
Ctrl + F파일 검색 모드로 전환입력 초기화 후 포커스 이동
+
+ +
📋 파일 & 클립보드
+
+ + + + + + + + + + + + + + + + + +
단축키동작상세
Ctrl + C선택 항목 파일 이름 복사확장자 제외 이름만
Ctrl + Shift + C전체 경로 복사절대 경로를 클립보드에
Ctrl + Shift + E파일 탐색기에서 열기해당 파일이 하이라이트됨
Ctrl + T선택 항목 위치에서 터미널 열기wt.exe → cmd.exe 폴백
Ctrl + P즐겨찾기 추가 / 제거 (핀)토스트로 결과 알림
Ctrl + B즐겨찾기 목록 보기 토글fav 입력 / 초기화
Ctrl + R최근 실행 목록 보기 토글recent 입력 / 초기화
Ctrl + H클립보드 히스토리 열기# 입력과 동일
Ctrl + D다운로드 폴더 바로가기Downloads 경로를 입력창에
+
+ + + + +

⚡ 3. 특수 기호 예약어

+

+입력창 맨 앞에 특수 기호를 입력하면 해당 기능 모드로 즉시 전환됩니다. +예약어 없이 입력하면 앱·파일·폴더 퍼지 검색이 실행됩니다. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
예약어기능사용 예시
=계산기 · 단위 변환 · 수식 계산= 1920*1080 → 결과 2073600
결과를 Enter하면 클립보드에 복사
$클립보드 텍스트 변환$ upper → 대문자 변환
$ trim → 공백 제거
@URL 열기 (등록된 별칭)@blog → 등록된 블로그 URL 열기
~워크스페이스 저장 · 복원 · 목록~save 개발 저장
~개발 창 배치 복원
>터미널 명령 즉시 실행> ipconfig
> ping google.com
^앱·파일 직접 실행 (Run)^ notepad
^ calc
?웹 검색 (기본 브라우저)? WPF DataBinding
설정에서 검색 엔진 변경 가능
#클립보드 히스토리 검색·붙여넣기# → 전체 목록
# 회의 → 필터 검색
;스니펫 (텍스트 템플릿) 즉시 확장; email → 이메일 서명 붙여넣기
실시간으로 커서 위치에 자동 삽입
/시스템 명령 실행/ lock, / sleep
/ shutdown, / restart
!AX Copilot (AI 어시스턴트)! 오늘 회의 요약해줘
AI 모델 4종 지원 · Chat/Cowork/Code 3탭
*시스템 정보 빠른 조회* ip, * cpu
* disk → 드라이브 용량
+
+ +
+ 🤖 AX Agent — 3탭 구조 + + + + + + + + + + + + + +
Chat연속적인 질의 답변 — 일반 대화, 번역, 요약, 아이디어 브레인스토밍 등 자유로운 AI 대화. /summary, /translate 등 슬래시 명령 지원
Cowork분석 및 보고서 등의 자료 작성 업무 보조 — 에이전트가 파일 읽기/쓰기, 문서 생성, 데이터 분석을 수행하는 작업 모드
Code소프트웨어 개발 또는 유지보수를 위한 코딩 도우미 — 코드 개발, 리팩터링, 코드 리뷰, 보안 취약점 점검, 테스트 작성. IDE/런타임 자동 감지
+
+ +
+ℹ️ 스니펫 자동 확장 (;) — 런처 없이 어느 앱에서든 미리 등록해 둔 키워드를 입력하면 즉시 텍스트가 확장됩니다. +설정 › 스니펫에서 키워드·내용을 자유롭게 관리할 수 있습니다. +
+ + + + +

📝 4. 영문 키워드 예약어

+

+영문 키워드를 입력창에 입력하면 해당 기능 핸들러가 활성화됩니다. +cd(폴더), fav(즐겨찾기), recent(최근 실행) 등이 대표적입니다. +

+ +
📁 파일 & 폴더
+
+ + + + + + + + + + + + +
예약어기능사용 예시
cd폴더 열기 (등록된 별칭)cd desktop, cd work, cd C:\projects
fav즐겨찾기 목록 검색 & 열기fav 전체, fav add 보고서 C:\work\r.xlsx
recent최근 실행 항목 목록recent, recent chrome
rename파일 이름 일괄 변경rename *.jpg → photo_*.jpg
+
+ +
🖥 시스템 & 정보
+
+ + + + + + + + + + + + + + + + + + +
예약어기능사용 예시
info시스템 정보 (CPU·RAM·드라이브·IP 등)info cpu → 리소스 모니터, info disk → 탐색기
env환경변수 조회 & 복사env PATH, env APPDATA
kill프로세스 종료kill chrome, kill notepad
port포트 사용 프로세스 확인port 8080
svcWindows 서비스 관리svc list, svc stop wuauserv
win창 전환 (Window Switcher)win chrome, win code
snap창 스냅 & 정렬snap left, snap grid
media미디어 재생 제어media play, media next, media vol 80
monitor모니터 관리monitor list
uninstall프로그램 제거uninstall slack
+
+ +
📋 텍스트 & 클립보드
+
+ + + + + + + + + + + + + + + + +
예약어기능사용 예시
note메모 저장 & 검색note 회의 메모 내용
journal업무 일지 작성journal 오늘 배포 완료
pipe클립보드 텍스트 파이프라인 처리pipe upper | trim | wrap 80
batch일괄 텍스트 변환batch number, batch sort
diff두 텍스트 비교 (Diff)diff → 클립보드의 두 텍스트 비교
encode인코딩 / 디코딩encode base64 hello, encode url
jsonJSON 파싱 & 미리보기json {"key":"value"}
stats클립보드 텍스트 통계stats → 글자수·단어수·줄수
+
+ +
🛠 유틸리티
+
+ + + + + + + + + + + + + + + + +
예약어기능사용 예시
date날짜 계산date +30 → 30일 후, date -7
color색상 코드 변환 (HEX·RGB·HSL)color #FF5733
pick화면 색상 추출 (Eyedropper)pick → 마우스 커서 색상 추출
emoji이모지 검색 & 복사emoji 웃음, emoji fire
scaffold프로젝트 폴더 구조 생성scaffold react
routine반복 작업 루틴 관리routine start 출근
cap화면 캡처cap screen, cap window, cap region
help도움말 & 명령어 목록help → 전체 도움말 창 (F1 동일)
+
+ + + + +

💡 5. 알아두면 유용한 팁

+ +
+📌 즐겨찾기 관리
+파일·폴더를 선택하고 Ctrl + P를 누르면 즐겨찾기에 추가됩니다. 이미 등록된 항목이면 자동으로 제거됩니다. +Ctrl + B로 즐겨찾기 목록을 토글하거나 fav를 입력해 직접 열 수 있습니다. +
+ +
+📋 클립보드 히스토리 병합
+#을 입력해 클립보드 히스토리를 열고, Shift + ↑/↓로 여러 항목을 선택한 뒤 +Shift + Enter를 누르면 줄바꿈으로 합쳐서 한 번에 붙여넣을 수 있습니다. +
+ +
+→ 파일 액션 모드
+파일·앱 항목이 선택된 상태에서 를 누르면 경로 복사, 탐색기 열기, 관리자 실행, 터미널, 속성 보기, 이름 변경, 휴지통으로 삭제 메뉴가 나타납니다. +
+ +
+ℹ️ 리소스 모니터info cpu 또는 info ram 항목을 Enter하면 CPU·RAM·드라이브를 실시간으로 표시하는 리소스 모니터 위젯이 별도 창으로 열립니다. (1초 주기 자동 갱신)
+info disk에서 드라이브 항목을 Enter하면 탐색기로 바로 열립니다. +
+ + + + +

🧠 AI 모델 호환성 — 도구 사용(Function Calling) 지원 현황

+

+AX Agent의 Cowork/Code 탭은 도구 사용(Function Calling)을 통해 파일 읽기/쓰기, 문서 생성, 코드 실행 등을 수행합니다.
+도구 사용을 지원하지 않는 모델에서는 Cowork/Code 기능이 정상 동작하지 않으며, Chat 탭의 일반 대화만 가능합니다. +

+ +

☁️ 클라우드 서비스 (모두 도구 사용 지원)

+
+ + + + + + + + + + + + + +
서비스모델도구 사용컨텍스트
Claudeclaude-sonnet-4, claude-opus-4✅ 지원200K
Claudeclaude-haiku-3.5✅ 지원200K
Geminigemini-2.5-pro, gemini-2.5-flash✅ 지원1M
Geminigemini-2.0-flash✅ 지원1M
+
+ +

🏠 Ollama 로컬 모델 — 도구 사용 지원 여부

+

+Ollama의 모든 모델이 도구 사용을 지원하지는 않습니다. 아래 표에서 ✅ 표시된 모델만 Cowork/Code 탭에서 사용 가능합니다. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
모델도구 사용파라미터비고
qwen2.5✅ 지원7B ~ 72B가장 추천 — 한국어 + 도구 사용 안정적
qwen3✅ 지원8B ~ 32B최신 모델, 도구 지원 우수
qwen2.5-coder✅ 지원7B ~ 32B⭐ Code 탭 추천 — 코드 특화 + 도구
llama3.1✅ 지원8B / 70BMeta 공식 도구 지원
llama3.3✅ 지원70B도구 호출 개선 버전
mistral✅ 지원7B경량, 기본적인 도구 지원
mistral-nemo✅ 지원12B도구 지원 개선
command-r✅ 지원35BCohere, 도구 특화
firefunction-v2✅ 지원70BFunction Calling 특화
granite3✅ 지원2B / 8BIBM, 경량 도구 지원
deepseek-r1❌ 미지원다양추론 특화, 도구 호출 불가
phi3 / phi4❌ 미지원3B ~ 14B도구 미지원
gemma2❌ 미지원9B / 27B도구 미지원
codellama❌ 미지원7B ~ 70B코드 특화이나 도구 미지원
llava / bakllava❌ 미지원다양비전 특화
+
+ +

💡 사내 환경 추천 조합

+
+ + + + + + + + + + + + + +
용도추천 모델VRAM설명
Cowork (문서 작성)qwen2.5:32b 이상24GB+한국어 품질과 도구 사용 모두 우수
Code (코드 작성)qwen2.5-coder:32b24GB+코드 특화 + 도구 지원
경량 (GPU 부족)qwen2.5:7b 또는 granite3:8b8GB기본적인 도구 사용 가능
최고 품질 (로컬)qwen3:32b 또는 llama3.3:70b24~48GB+대규모 문서/코드 작업에 적합
+
+ +
+ ⚠️ 도구 미지원 모델 사용 시
+ 도구 사용을 지원하지 않는 모델을 Cowork/Code 탭에서 사용하면 400 BadRequest 에러가 발생합니다.
+ 이 경우 AX Copilot이 자동으로 일반 텍스트 응답으로 전환하지만, 파일 생성·코드 실행 등의 에이전트 기능은 사용할 수 없습니다.
+ Chat 탭의 일반 대화는 모든 모델에서 정상 동작합니다. +
+ + + + +

⚙️ 6. 설정 › 기능 탭 (토글 목록)

+

+설정 창에서 각 기능을 ON/OFF할 수 있으며, 저장 즉시 런처에 반영됩니다. +

+
+ + + + + + + + + + + + + + +
항목설명기본값
번호 배지 (1~9)결과 항목 왼쪽에 번호를 표시해 Ctrl+N 즉시 실행 가능ON
예약어 배지입력창 왼쪽에 활성 예약어 이름 표시 (예: 📂 폴더)ON
포커스 잃으면 닫기런처 창 외부 클릭 시 자동으로 숨김ON
액션 모드→ 키로 파일 액션 서브메뉴 진입 허용ON
최근 기록 (recent)recent 예약어로 최근 실행 목록 조회 허용ON
즐겨찾기 (fav)fav 예약어로 즐겨찾기 목록 조회 허용ON
+
+ + + + +

🤖 AX Agent 상세 안내

+ +
+

⚠ 당부의 말씀 드립니다.

+

+ AX Agent의 Cowork / Code 기능은 충분한 검증이 되지 않았습니다.
+ 데이터가 있는 폴더를 워크스페이스로 지정하는 경우 + 반드시 백업본을 만들고 진행 부탁드립니다. +

+
+ +
+

💬 Chat 탭 — 연속적인 질의 답변

+
    +
  • 일반 대화, 번역, 요약, 아이디어 브레인스토밍 등 자유로운 AI 대화
  • +
  • 9개 대화 주제(경영, 인사, 재무, 연구개발 등) 선택 시 전문가 프리셋 자동 적용
  • +
  • 대화 이력은 AES-256-GCM 암호화되어 로컬에 안전하게 저장
  • +
+ +

📊 Cowork 탭 — 업무 보조 에이전트

+ + + + + +
작업 유형보고서 작성, 데이터 분석, 논문 분석, 파일 관리, 자동화 스크립트
생성 문서Excel, Word, HTML 보고서, Markdown, CSV, 차트
디자인 무드10종 CSS 템플릿 + 커스텀 무드
에이전트계획 제시 → 사용자 승인 → 자동 실행 (실패 시 3회 재시도)
+ +

💻 Code 탭 — 코딩 에이전트

+ + + + + + + +
작업 유형코드 개발, 코드 리뷰, 리팩터링, 테스트 작성, 보안 점검
지원 언어Python, Java, C#, C/C++, JavaScript/TypeScript (Vue3)
빌드/테스트프로젝트 타입 자동 감지 → dotnet/maven/npm/pytest 실행
Git 연동status, diff, log, add, commit (push는 사용자 직접)
린트/포맷ESLint, Prettier, Black, Ruff, dotnet format 감지 및 실행
패키지 저장소사내 Nexus 연동 (NuGet, PyPI/Conda, Maven, npm)
+
+ +
+

ℹ️ 공통 기능

+
    +
  • Ctrl+1/2/3: Chat / Cowork / Code 탭 전환
  • +
  • Ctrl+F: 대화 내 메시지 검색
  • +
  • 메시지 우클릭: 복사, 인용 답장, 재생성, 삭제
  • +
  • 에이전트 작업 완료 시 시스템 트레이 알림
  • +
  • 코드 블록: 라인 번호, 전체화면, 파일 저장, 구문 하이라이팅
  • +
  • 모든 대화 내역 AES-256-GCM 암호화 저장
  • +
+
+ + + + + + +
+
+
v1.7.2
+
+
+
    +
  • 컨텍스트 자동 압축 — 긴 대화에서 입력 토큰을 자동 절감합니다. 도구 결과 축약 + AI 요약 2단계 압축. 모델별 토큰 한도 자동 인식
  • +
  • 대화 이력 복원 — 앱을 다시 시작하면 마지막 대화가 자동으로 복원됩니다
  • +
  • 런처 속도 개선 — 핫키 응답 속도 ~230ms 단축, 애니메이션 최적화
  • +
  • 스크롤 캡처 개선 — 스크롤 시 새로운 영역만 증분 이어 붙이기, 중복 프레임 제거
  • +
  • 검증 품질 개선 — 문서 검증이 읽기 전용으로 변경되어 품질 저하 없이 안전하게 검증
  • +
  • AI 모델 호환성 가이드 — 도구 사용(Function Calling) 지원 모델 호환표 추가
  • +
  • 버그 수정 — 설정 비밀번호 재요구, 계획 승인 버튼 동기화, 야간 근무 시간, 클립보드 붙여넣기, 활성 창 캡처
  • +
+
+
+ + +
+
+
v1.7.1
+
+
+
    +
  • 도구 실행 후 검증 강제 — 문서 생성 도구 실행 후 AI가 결과물을 자동으로 읽고 품질을 검증합니다. 설정에서 ON/OFF 전환 가능
  • +
  • 피드백 학습 — 좋아요/싫어요 패턴을 분석하여 AI 응답 품질을 점진적으로 개선합니다
  • +
  • 워크플로우 분석기 개선 — 타이틀바 전체 영역 드래그, 탭 가시성 개선, 상태 텍스트 잘림 처리
  • +
  • 계획 뷰어 개선 — 버튼 색상 및 가시성 강화
  • +
  • 수정 후 재시도 — 피드백을 입력하여 AI 응답을 다시 생성할 수 있습니다
  • +
+
+
+ + +
+
+
v1.7.0
+
+
+
    +
  • 실행 계획 모드 — AI가 도구 실행 전에 구조화된 계획을 생성하고 사용자 승인 후 실행합니다 (3가지 모드: 비활성/항상/자동)
  • +
  • 도구 관리 UI — 설정에서 52개 에이전트 도구를 카테고리별로 확인하고 개별 활성/비활성 전환 가능
  • +
  • 프로젝트 규칙 — 작업 폴더에 규칙 파일을 만들면 AI가 규칙에 따라 자동으로 동작합니다
  • +
  • 자동 테스트-수정 — 테스트 실패 시 AI가 자동으로 코드를 수정하고 재테스트를 반복합니다
  • +
  • 병렬 도구 실행 — 읽기 전용 도구를 동시에 실행하여 작업 속도를 향상합니다
  • +
  • 스킬 호환 확장 — 업계 표준 스킬 파일 형식의 도구 이름 자동 매핑 지원
  • +
+
+
+ + +
+
+
v1.6.1
+
+
+
    +
  • 고품질 문서 생성 설정 — 설정 › 에이전트 › 코워크에서 고품질 문서 생성(멀티패스) ON/OFF 토글 추가. 기본값 OFF (무료 API 환경 호환성 개선)
  • +
  • 헬프 화면 개편 — 버전별 신기능 항목 제거, 영역별 핵심 기능 중심으로 재구성. 내부 기술 용어 노출 제거
  • +
  • 창 닫기 개선 — 개발 정보(About), 도움말 창 ESC 키로 닫기 지원
  • +
  • CLAUDE.md 지침 개선 — 헬프 화면 IP 보호 규칙 추가, 버전 체크리스트 정비
  • +
+
+
+ + +
+
+
v1.6.0
+
+
+
    +
  • 멀티패스 문서 생성 — 긴 보고서를 개요 → 섹션별 상세 작성 → 조립 방식으로 생성하여 품질 대폭 향상. 3페이지 이상 문서에 자동 적용
  • +
  • PPT 프레젠테이션 생성 — 별도 프로그램 설치 없이 슬라이드 생성 (제목/본문/2단/표/빈 슬라이드, 4종 테마)
  • +
  • 내장 스킬 29종 — 이메일, 번역, 비교 분석, 주간보고, 로그 분석, SQL 리포트, 데이터 변환, 리팩토링, 테스트 생성, 변경 영향 분석, 보안 감사(OWASP), 요구사항 정의서(PRD), 아키텍처 결정 기록(ADR), 변경 이력 자동 생성, 의존성 분석, 성능 감사 등 16종 추가
  • +
  • 데이터 분석 도구 강화 — 데이터 피벗/집계, 텍스트 요약, 이미지 분석, 파일 변경 감지, 템플릿 렌더링 도구 추가 (총 42개 도구)
  • +
+
+
+ + +
+
+
v1.5.2
+
+
+
    +
  • 고급 스킬 자동 감지 — Python이 설치되어 있으면 Word/Excel/PDF/PPT 생성 스킬이 자동 활성화됩니다. / 명령으로 사용
  • +
  • 워크플로우 시각화 — 개발자 모드에서 AI가 작업하는 과정을 별도 창에서 실시간으로 확인할 수 있습니다
  • +
  • 개발자 탭 분리 — 설정에 개발자 전용 탭이 추가되어 고급 설정을 별도로 관리합니다 (비밀번호 보호)
  • +
  • 실행 분석 연동 — 실행 이력 상세도 설정이 실제 동작과 연동되어 로그 수준별 정보량을 조절합니다
  • +
  • 설정 UI 개선 — 훅/서버 추가 시 입력 예시 표시, 스킬 목록 확인 기능 추가
  • +
+
+
+ + +
+
+
v1.5.1
+
+
+
    +
  • 슬래시 명령 영어 전환 — /summary, /translate, /review 등 11개 명령을 영어로 통일하여 입력 편의성 향상
  • +
  • 도구/커넥터 관리 — 설정에서 등록된 에이전트 도구 29종과 외부 연결 현황을 한눈에 확인
  • +
  • 스킬 시스템 호환 확장 — 업계 표준 스킬 파일 형식 지원으로 다양한 AI 도구의 스킬을 그대로 사용 가능
  • +
  • 설정 UI 개선 — 드롭다운 메뉴 전체를 커스텀 디자인으로 교체하여 테마 통일성 강화
  • +
  • 파일 접근 패턴 수정 — 문서 폴더 보호 패턴이 정상 동작하도록 수정
  • +
+
+
+ + +
+
+
v1.5.0
+
+
+
    +
  • AI 코드 분석 강화 — 정의 이동, 참조 검색, 심볼 목록으로 코드를 더 정확하게 이해
  • +
  • 자동 테스트 — 코드 수정 후 테스트 자동 생성·실행·결과 분석
  • +
  • 이벤트 자동화 — 파일 변경/스케줄에 따라 AI 작업 자동 실행
  • +
  • 탐색기 우클릭 연동 — 파일/폴더에서 바로 AI 분석 실행
  • +
  • 저장 공간 관리 — 앱 사용량 확인 + 오래된 데이터 정리
  • +
  • 설정 도움말 — AI 설정 항목에 ? 아이콘으로 상세 설명 제공
  • +
  • PDF 내보내기 — 대화를 PDF 인쇄용으로 내보내기
  • +
  • 대체 모델 개선 — 서비스별 그룹화, 전체 모델 목록 표시
  • +
+
+
+ +
+이전 이력 (v1.4.0 이하) + + +
+
+
v1.4.0
+
+
+
    +
  • 선택 텍스트 AI 명령 — 텍스트를 선택한 상태에서 핫키를 누르면 번역/요약/교정/설명 등 AI 명령을 바로 실행
  • +
  • 독 바 — 화면 하단에 고정되는 미니 바. CPU/RAM, 시계, 빠른 실행 버튼. 설정에서 표시 항목·투명도·글로우 효과 조정 가능
  • +
  • 클립보드 핀 고정 — 자주 쓰는 클립보드 항목을 핀 고정(Ctrl+P). URL/코드/경로 자동 분류 + 필터링
  • +
  • 파일 대화상자 연동 — 열기/저장 대화상자가 나타나면 런처가 자동으로 열려 빠른 경로 검색 지원
  • +
  • 다이아몬드 픽셀 아이콘 — 앱/인스톨러/바로가기 아이콘 전면 교체
  • +
  • 독 바 설정 — 설정창에 독 바 전용 탭 추가 (표시 항목, 투명도, 글로우, 위치 초기화)
  • +
+
+
+ + +
+
+
v1.3.1
+
+
+
    +
  • 창 배치 확장 — snap 레이아웃 22개로 확장 (3등분, 2/3분할, 3분할 조합 추가)
  • +
  • Everything 파일 검색es 명령으로 디스크 전체 초고속 파일 검색 (Everything 설치 시 활성)
  • +
  • 이미지 클립보드 — 클립보드 히스토리에 이미지 저장·복원 지원 (앱 재시작 후에도 유지)
  • +
  • 플러그인 간편 설치 — zip 파일 선택으로 플러그인 자동 설치
  • +
  • 다크 테마 가독성 — 6종 다크 테마 글자 대비 개선
  • +
  • 대화별 설정 저장 — 대화마다 권한/데이터활용/무드를 독립 저장
  • +
  • 알림 설정 오류 수정 — 팁 알림·완료 알림 설정이 정상 반영되지 않던 문제 해결
  • +
+
+
+ + +
+
+
v1.3.0
+
+
+
    +
  • 외부 도구 서버 연결 — DB, Jira, Slack 등 외부 도구를 AI 대화에 연동 (설정에서 서버 추가)
  • +
  • AI 모델 자동 전환 — AI 응답 실패 시 대체 모델로 자동 재시도
  • +
  • 대화 분기 — 메시지 우클릭 → '여기서 분기'로 다른 방향 탐색
  • +
  • 커맨드 팔레트 — Ctrl+Shift+P로 모든 기능에 즉시 접근
  • +
  • AI 비용 표시 — 상태바에서 AI 사용량과 예상 비용 확인
  • +
  • AI 작업 이력 — AI 도구 사용 기록 조회 (설정에서 폴더 열기)
  • +
  • 파일 변경 미리보기 — Code 탭에서 파일 수정 시 변경 내용 자동 표시
  • +
+
+
+ + +
+
+
v1.2.2
+
+
+
    +
  • 프로젝트 문맥 자동 연결 — 작업 폴더에 AX.md 파일을 만들면 AI가 프로젝트 규칙을 자동 참고
  • +
  • 사용법 팁 알림 — 탭 전환 시 유용한 사용 팁을 랜덤으로 표시
  • +
  • 개발자 모드 — AI 작업 과정을 상세히 확인하고 단계별로 승인 가능
  • +
  • 사용 통계 — 대화 빈도·사용량 차트 제공
  • +
  • 입력창 무지개 효과 — 메시지 전송 시 입력창 테두리 무지개 애니메이션
  • +
+
+
+ +
+이전 이력 (v1.2.1 이하) + + +
+
+
v1.2.1
+
+
+
    +
  • Code 탭 AI 코딩 강화 — AI가 더 정확하게 코드를 분석하고 수정
  • +
  • Git 연동 — AI가 Git 상태 확인, 변경 내역 조회, 커밋 수행
  • +
  • 코드 품질 검사 — 코드 스타일 검사 및 자동 정리 지원
  • +
+
+
+ + +
+
+
v1.2.0
+
+
+
    +
  • Code 탭 활성화 — 코딩 에이전트 5개 프리셋 (개발, 리뷰, 리팩터링, 테스트, 보안)
  • +
  • 개발 환경 자동 감지 — IDE/런타임/빌드도구를 자동으로 인식
  • +
  • 빌드·테스트 실행 — 프로젝트 타입에 맞는 빌드/테스트를 AI가 자동 실행
  • +
  • 마크다운 표시 완성 — 테이블, 인용, 취소선, 링크 지원
  • +
+
+
+ + +
+
+
v1.1.1
+
+
+
    +
  • 문서 미리보기 — HTML/Markdown 파일을 앱 내에서 바로 확인
  • +
  • 코드 블록 강화 — 라인 번호, 전체화면, 파일 저장, 구문 하이라이팅
  • +
  • AI 작업 진행률 — 단계/퍼센트/경과시간 표시
  • +
  • 대화 내 검색 — Ctrl+F로 메시지 검색
  • +
  • 파일 탐색기 — 작업 폴더 트리뷰, 우클릭 메뉴
  • +
+
+
+ + +
+
+
v1.1.0
+
+
+
    +
  • Cowork AI 에이전트 — AI가 스스로 계획하고 파일을 읽고 쓰며 작업 수행
  • +
  • 문서 생성 — Excel, Word, CSV, HTML 등 6종 문서 자동 생성
  • +
  • 10종 디자인 템플릿 — 문서 스타일 선택 가능
  • +
  • 문서 읽기 — PDF, DOCX, XLSX, CSV 파일 내용 자동 추출
  • +
+
+
+ + +
+
+
v1.0.7
+
+
+
    +
  • Chat/Cowork/Code 3탭 UI, 파일 첨부, 대화 주제 9종 프리셋
  • +
  • 권한 시스템 — Ask/Auto/Deny 3단계, 대화 내보내기 4종
  • +
+
+
+ +
+
+
v1.0.6
+
+
+
    +
  • 마크다운 렌더링, 응답 재생성·중지, 대화 내보내기, 키보드 단축키
  • +
+
+
+ +
+이전 이력 모음 (v1.0.0 ~ v1.0.4) + +
+
+
v1.0.4
+
+
+
    +
  • 설정 알림 바로보기 — 알림 탭에 미리보기 버튼 추가, 시간 도달 전에도 팝업 확인 가능
  • +
  • 런처 안내 문구 랜덤화 — 입력창 플레이스홀더가 매번 다른 정중한 안내·기능 홍보 문구로 표시
  • +
  • 다이아몬드 픽셀 아이콘 애니메이션 — 런처 아이콘의 4개 픽셀이 순차적으로 깜빡이는 점멸 효과
  • +
  • 글로벌 단축키 콤보박스 — 녹화 방식 대신 검증된 키 조합 12종에서 선택 (Alt+Space, Ctrl+Space 등)
  • +
  • 트레이 메뉴 개편 — "사용 가이드 문서보기" 추가, "정보" → "개발자 정보"로 변경 + 종료 바로 위 배치
  • +
  • 사용 통계 화면 개선 — FHD 최적화 (높이 900px), 자주 쓴 명령어 최대 10개 표시
  • +
  • 사용 가이드 문서 배포 포함 — 빌드 시 Assets 폴더에 자동 복사, 버전 이력 기록
  • +
+
+
+ +
+
+
v1.0.3
+
+
+
    +
  • 사용 가이드 문서 추가 — 트레이 우클릭 메뉴에서 바로 열기
  • +
  • 사용 통계 화면 FHD 최적화 (높이 640→900px, 자주 쓴 명령어 최대 10개)
  • +
  • 리소스 모니터 위젯 신규 — CPU·RAM·드라이브·상위 프로세스 실시간 표시
  • +
  • info 예약어 개선 — CPU/RAM 항목 Enter 시 리소스 모니터 위젯 열기
  • +
  • info 예약어 개선 — 드라이브 항목 Enter 시 탐색기 바로 열기
  • +
  • 헬프창 동기화 — 설정에서 글로벌 단축키 변경 시 F1 헬프에 자동 반영
  • +
  • 커서 위치 개선 — F1/Ctrl+B 등 자동 입력 시 커서가 텍스트 끝으로 이동
  • +
  • 설정 기능 탭 → 런처 실동작 연결 (번호 배지·포커스 닫기·액션 모드 등)
  • +
  • 단축키 참조창 테마 연동 (다크/라이트 테마 실시간 반영)
  • +
+
+
+ +
+
+
v1.0.2
+
+
+
    +
  • 빠른 실행 Placeholder — 입력 필드에 키워드·경로 힌트 워터마크 추가
  • +
  • 기본 앱 별칭 19종 — 메모장, 계산기, 엑셀, 워드, 파워포인트, 탐색기, VS Code 등 한글+영문 이름 즉시 실행
  • +
+
+
+ +
+
+
v1.0.1
+
+
+
    +
  • 인스톨러 통합 — 온라인/오프라인 2종 → 오프라인 1종 통합
  • +
  • 검색 확장자 설정 — 태그형 확장자 UI, 기본 30+종, 사용자 추가/삭제 가능
  • +
  • 폴더 인덱싱 — 인덱스 경로의 1단계 하위 폴더 검색·열기 지원
  • +
  • 인덱싱 현황 표시 — 런처 하단에 "✓ N개 항목 색인됨" 자동 표시
  • +
  • Help 인기 탭 — ⭐ 인기 탭 추가 (파일검색·웹검색·클립보드 핵심 기능)
  • +
  • 다이아몬드 픽셀 아이콘 — 런처·정보 창·트레이·인스톨러에 벡터 아이콘 적용
  • +
+
+
+ +
+
+
v1.0.0
+
+
+
    +
  • 정식 릴리즈 — 40개+ 명령어, 9종 테마, 11개 설정 탭
  • +
  • 런처 기본 기능 — 앱·파일·폴더 퍼지 검색, 즐겨찾기, 최근 실행
  • +
  • 계산기 (= 예약어), 웹 검색 (? 예약어)
  • +
  • 시스템 명령 (/ 예약어) — 잠금·절전·종료·재시작
  • +
  • 클립보드 히스토리 (# 예약어) 암호화 저장
  • +
  • 잠금 해제 알림, 화면 캡처, 모던 트레이 메뉴
  • +
  • 플러그인 시스템 — SDK를 통한 외부 핸들러 확장
  • +
+
+
+ +
+ +
+ +
+ + + + + + + + + diff --git a/src/AxCopilot/Assets/AX Copilot 사용가이드.htm b/src/AxCopilot/Assets/AX Copilot 사용가이드.htm new file mode 100644 index 0000000..7a34c66 --- /dev/null +++ b/src/AxCopilot/Assets/AX Copilot 사용가이드.htm @@ -0,0 +1,831 @@ + + + + + +AX Copilot 사용 가이드 — 단축키 & 예약어 완전 정복 + + + +
+ + + + +
+
🚀 AX Copilot 사용 가이드
+

단축키 & 예약어 완전 정복
— 키보드 하나로 모든 업무를

+

+ Windows 전용 시맨틱 런처 AX Copilot의 모든 단축키와 명령 예약어를 한 페이지에 정리했습니다.
+ Alt+Space 한 번으로 앱 실행·파일 검색·계산·클립보드·화면 캡처·창 전환·시스템 제어 등 40개 이상의 기능을 즉시 호출합니다. +

+
+ + + + + + + + + +

⚡ 가장 많이 쓰는 단축키 한눈에

+
+
+
🤖
+
! (AX Copilot)
AI 어시스턴트와 대화 시작
+
+
+
⌨️
+
Alt + Space
런처 열기 / 닫기
+
+
+
+
Enter
선택 항목 실행
+
+
+
+
→ (오른쪽)
파일 액션 모드 진입
+
+
+
+
Escape
닫기 / 이전 단계로
+
+
+
📋
+
Ctrl + H
클립보드 히스토리
+
+
+
+
Ctrl + B
즐겨찾기 보기 토글
+
+
+
📌
+
Ctrl + P
즐겨찾기 추가 / 제거
+
+
+
?
+
Ctrl + K
단축키 참조창 열기
+
+
+
🖥
+
Ctrl + T
터미널에서 열기
+
+
+
📂
+
Ctrl + D
다운로드 폴더
+
+
+
🔢
+
Ctrl + 1~9
N번째 항목 즉시 실행
+
+
+
F5
+
F5
인덱스 새로고침
+
+
+ +
+💡 Tip. 입력창이 비어 있을 때 Home/End 키를 누르면 결과 목록의 첫/마지막 항목으로 바로 이동합니다. +설정에서 글로벌 단축키를 원하는 키 조합으로 자유롭게 변경할 수 있습니다. +
+ + + + +

🌐 1. 전역 단축키 (시스템 전체)

+
+ + + + + + + + + + +
단축키동작비고
Alt + Space런처 창 열기 / 닫기 (토글)기본값 · 설정에서 변경 가능
PrintScreen화면 캡처 즉시 실행설정 › 캡처에서 활성화 필요
+
+ + + + +

🪟 2. 런처 창 단축키

+ +
📍 탐색 & 선택
+
+ + + + + + + + + + + + + + +
단축키동작상세
/ 결과 목록 위/아래 이동끝에서 누르면 반대쪽으로 순환
PageUp / PageDown5칸씩 빠른 이동
Home / End첫 항목 / 마지막 항목으로 점프입력창 커서 위치 기반
Tab선택 항목 제목을 입력창에 자동완성
파일 액션 모드 진입복사·터미널·속성·삭제 등
Escape액션 모드 종료 / 런처 닫기
+
+ +
▶ 실행
+
+ + + + + + + + + + + + + +
단축키동작상세
Enter선택 항목 실행파일·앱·URL·명령 모두 지원
Ctrl + Enter관리자 권한으로 실행UAC 권한 상승 후 실행
Alt + Enter파일 속성 대화상자 열기
Shift + Enter대형 텍스트 표시 / 클립보드 병합Large Type 또는 다중 선택 병합
Ctrl + 1 ~ 9N번째 결과 항목 즉시 실행번호 배지와 연동
+
+ +
🔧 기능 단축키
+
+ + + + + + + + + + + + + + + + + +
단축키동작상세
F1도움말 창 열기help 입력과 동일
F2선택 파일 이름 변경 모드
F5파일 인덱스 즉시 재구축새 파일 추가 후 사용
Delete최근 실행 목록에서 항목 제거확인 다이얼로그 후 실행
Ctrl + ,설정 창 열기
Ctrl + L입력창 전체 초기화
Ctrl + W런처 즉시 닫기
Ctrl + K단축키 참조 모달창 열기Esc로 닫기
Ctrl + F파일 검색 모드로 전환입력 초기화 후 포커스 이동
+
+ +
📋 파일 & 클립보드
+
+ + + + + + + + + + + + + + + + + +
단축키동작상세
Ctrl + C선택 항목 파일 이름 복사확장자 제외 이름만
Ctrl + Shift + C전체 경로 복사절대 경로를 클립보드에
Ctrl + Shift + E파일 탐색기에서 열기해당 파일이 하이라이트됨
Ctrl + T선택 항목 위치에서 터미널 열기wt.exe → cmd.exe 폴백
Ctrl + P즐겨찾기 추가 / 제거 (핀)토스트로 결과 알림
Ctrl + B즐겨찾기 목록 보기 토글fav 입력 / 초기화
Ctrl + R최근 실행 목록 보기 토글recent 입력 / 초기화
Ctrl + H클립보드 히스토리 열기# 입력과 동일
Ctrl + D다운로드 폴더 바로가기Downloads 경로를 입력창에
+
+ + + + +

⚡ 3. 특수 기호 예약어

+

+입력창 맨 앞에 특수 기호를 입력하면 해당 기능 모드로 즉시 전환됩니다. +예약어 없이 입력하면 앱·파일·폴더 퍼지 검색이 실행됩니다. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
예약어기능사용 예시
=계산기 · 단위 변환 · 수식 계산= 1920*1080 → 결과 2073600
결과를 Enter하면 클립보드에 복사
$클립보드 텍스트 변환$ upper → 대문자 변환
$ trim → 공백 제거
@URL 열기 (등록된 별칭)@blog → 등록된 블로그 URL 열기
~워크스페이스 저장 · 복원 · 목록~save 개발 저장
~개발 창 배치 복원
>터미널 명령 즉시 실행> ipconfig
> ping google.com
^앱·파일 직접 실행 (Run)^ notepad
^ calc
?웹 검색 (기본 브라우저)? WPF DataBinding
설정에서 검색 엔진 변경 가능
#클립보드 히스토리 검색·붙여넣기# → 전체 목록
# 회의 → 필터 검색
;스니펫 (텍스트 템플릿) 즉시 확장; email → 이메일 서명 붙여넣기
실시간으로 커서 위치에 자동 삽입
/시스템 명령 실행/ lock, / sleep
/ shutdown, / restart
!AX Copilot (AI 어시스턴트)! 오늘 회의 요약해줘
AI 모델 4종 지원 · Chat/Cowork/Code 3탭
*시스템 정보 빠른 조회* ip, * cpu
* disk → 드라이브 용량
+
+ +
+ 🤖 AX Agent — 3탭 구조 + + + + + + + + + + + + + +
Chat연속적인 질의 답변 — 일반 대화, 번역, 요약, 아이디어 브레인스토밍 등 자유로운 AI 대화. /summary, /translate 등 슬래시 명령 지원
Cowork분석 및 보고서 등의 자료 작성 업무 보조 — 에이전트가 파일 읽기/쓰기, 문서 생성, 데이터 분석을 수행하는 작업 모드
Code소프트웨어 개발 또는 유지보수를 위한 코딩 도우미 — 코드 개발, 리팩터링, 코드 리뷰, 보안 취약점 점검, 테스트 작성. IDE/런타임 자동 감지
+
+ +
+ℹ️ 스니펫 자동 확장 (;) — 런처 없이 어느 앱에서든 미리 등록해 둔 키워드를 입력하면 즉시 텍스트가 확장됩니다. +설정 › 스니펫에서 키워드·내용을 자유롭게 관리할 수 있습니다. +
+ + + + +

📝 4. 영문 키워드 예약어

+

+영문 키워드를 입력창에 입력하면 해당 기능 핸들러가 활성화됩니다. +cd(폴더), fav(즐겨찾기), recent(최근 실행) 등이 대표적입니다. +

+ +
📁 파일 & 폴더
+
+ + + + + + + + + + + + +
예약어기능사용 예시
cd폴더 열기 (등록된 별칭)cd desktop, cd work, cd C:\projects
fav즐겨찾기 목록 검색 & 열기fav 전체, fav add 보고서 C:\work\r.xlsx
recent최근 실행 항목 목록recent, recent chrome
rename파일 이름 일괄 변경rename *.jpg → photo_*.jpg
+
+ +
🖥 시스템 & 정보
+
+ + + + + + + + + + + + + + + + + + +
예약어기능사용 예시
info시스템 정보 (CPU·RAM·드라이브·IP 등)info cpu → 리소스 모니터, info disk → 탐색기
env환경변수 조회 & 복사env PATH, env APPDATA
kill프로세스 종료kill chrome, kill notepad
port포트 사용 프로세스 확인port 8080
svcWindows 서비스 관리svc list, svc stop wuauserv
win창 전환 (Window Switcher)win chrome, win code
snap창 스냅 & 정렬snap left, snap grid
media미디어 재생 제어media play, media next, media vol 80
monitor모니터 관리monitor list
uninstall프로그램 제거uninstall slack
+
+ +
📋 텍스트 & 클립보드
+
+ + + + + + + + + + + + + + + + +
예약어기능사용 예시
note메모 저장 & 검색note 회의 메모 내용
journal업무 일지 작성journal 오늘 배포 완료
pipe클립보드 텍스트 파이프라인 처리pipe upper | trim | wrap 80
batch일괄 텍스트 변환batch number, batch sort
diff두 텍스트 비교 (Diff)diff → 클립보드의 두 텍스트 비교
encode인코딩 / 디코딩encode base64 hello, encode url
jsonJSON 파싱 & 미리보기json {"key":"value"}
stats클립보드 텍스트 통계stats → 글자수·단어수·줄수
+
+ +
🛠 유틸리티
+
+ + + + + + + + + + + + + + + + +
예약어기능사용 예시
date날짜 계산date +30 → 30일 후, date -7
color색상 코드 변환 (HEX·RGB·HSL)color #FF5733
pick화면 색상 추출 (Eyedropper)pick → 마우스 커서 색상 추출
emoji이모지 검색 & 복사emoji 웃음, emoji fire
scaffold프로젝트 폴더 구조 생성scaffold react
routine반복 작업 루틴 관리routine start 출근
cap화면 캡처cap screen, cap window, cap region
help도움말 & 명령어 목록help → 전체 도움말 창 (F1 동일)
+
+ + + + +

💡 5. 알아두면 유용한 팁

+ +
+📌 즐겨찾기 관리
+파일·폴더를 선택하고 Ctrl + P를 누르면 즐겨찾기에 추가됩니다. 이미 등록된 항목이면 자동으로 제거됩니다. +Ctrl + B로 즐겨찾기 목록을 토글하거나 fav를 입력해 직접 열 수 있습니다. +
+ +
+📋 클립보드 히스토리 병합
+#을 입력해 클립보드 히스토리를 열고, Shift + ↑/↓로 여러 항목을 선택한 뒤 +Shift + Enter를 누르면 줄바꿈으로 합쳐서 한 번에 붙여넣을 수 있습니다. +
+ +
+→ 파일 액션 모드
+파일·앱 항목이 선택된 상태에서 를 누르면 경로 복사, 탐색기 열기, 관리자 실행, 터미널, 속성 보기, 이름 변경, 휴지통으로 삭제 메뉴가 나타납니다. +
+ +
+ℹ️ 리소스 모니터info cpu 또는 info ram 항목을 Enter하면 CPU·RAM·드라이브를 실시간으로 표시하는 리소스 모니터 위젯이 별도 창으로 열립니다. (1초 주기 자동 갱신)
+info disk에서 드라이브 항목을 Enter하면 탐색기로 바로 열립니다. +
+ + + + +

⚙️ 6. 설정 › 기능 탭 (토글 목록)

+

+설정 창에서 각 기능을 ON/OFF할 수 있으며, 저장 즉시 런처에 반영됩니다. +

+
+ + + + + + + + + + + + + + +
항목설명기본값
번호 배지 (1~9)결과 항목 왼쪽에 번호를 표시해 Ctrl+N 즉시 실행 가능ON
예약어 배지입력창 왼쪽에 활성 예약어 이름 표시 (예: 📂 폴더)ON
포커스 잃으면 닫기런처 창 외부 클릭 시 자동으로 숨김ON
액션 모드→ 키로 파일 액션 서브메뉴 진입 허용ON
최근 기록 (recent)recent 예약어로 최근 실행 목록 조회 허용ON
즐겨찾기 (fav)fav 예약어로 즐겨찾기 목록 조회 허용ON
+
+ + + + +

🤖 AX Agent 상세 안내

+ +
+

⚠ 당부의 말씀 드립니다.

+

+ AX Agent의 Cowork / Code 기능은 충분한 검증이 되지 않았습니다.
+ 데이터가 있는 폴더를 워크스페이스로 지정하는 경우 + 반드시 백업본을 만들고 진행 부탁드립니다. +

+
+ +
+

💬 Chat 탭 — 연속적인 질의 답변

+
    +
  • 일반 대화, 번역, 요약, 아이디어 브레인스토밍 등 자유로운 AI 대화
  • +
  • 9개 대화 주제(경영, 인사, 재무, 연구개발 등) 선택 시 전문가 프리셋 자동 적용
  • +
  • 대화 이력은 AES-256-GCM 암호화되어 로컬에 안전하게 저장
  • +
+ +

📊 Cowork 탭 — 업무 보조 에이전트

+ + + + + +
작업 유형보고서 작성, 데이터 분석, 논문 분석, 파일 관리, 자동화 스크립트
생성 문서Excel, Word, HTML 보고서, Markdown, CSV, 차트
디자인 무드10종 CSS 템플릿 + 커스텀 무드
에이전트계획 제시 → 사용자 승인 → 자동 실행 (실패 시 3회 재시도)
+ +

💻 Code 탭 — 코딩 에이전트

+ + + + + + + +
작업 유형코드 개발, 코드 리뷰, 리팩터링, 테스트 작성, 보안 점검
지원 언어Python, Java, C#, C/C++, JavaScript/TypeScript (Vue3)
빌드/테스트프로젝트 타입 자동 감지 → dotnet/maven/npm/pytest 실행
Git 연동status, diff, log, add, commit (push는 사용자 직접)
린트/포맷ESLint, Prettier, Black, Ruff, dotnet format 감지 및 실행
패키지 저장소사내 Nexus 연동 (NuGet, PyPI/Conda, Maven, npm)
+
+ +
+

ℹ️ 공통 기능

+
    +
  • Ctrl+1/2/3: Chat / Cowork / Code 탭 전환
  • +
  • Ctrl+F: 대화 내 메시지 검색
  • +
  • 메시지 우클릭: 복사, 인용 답장, 재생성, 삭제
  • +
  • 에이전트 작업 완료 시 시스템 트레이 알림
  • +
  • 코드 블록: 라인 번호, 전체화면, 파일 저장, 구문 하이라이팅
  • +
  • 모든 대화 내역 AES-256-GCM 암호화 저장
  • +
+
+ + + + + + + +
+ + diff --git a/src/AxCopilot/Assets/BRANDING_가이드.md b/src/AxCopilot/Assets/BRANDING_가이드.md new file mode 100644 index 0000000..30b0647 --- /dev/null +++ b/src/AxCopilot/Assets/BRANDING_가이드.md @@ -0,0 +1,66 @@ +# AX Commander — 브랜딩 설정 가이드 + +이 파일은 배포 전에 `about.json`을 수정한 뒤 **빌드**하면 정보가 exe에 내장됩니다. +런타임 파일 수정으로는 변경되지 않습니다. + +--- + +## 수정 파일: `Assets/about.json` + +```json +{ + "companyName": "회사명 또는 팀명", + "purpose": "이 프로그램의 용도 또는 소개 문장" +} +``` + +### 각 필드 설명 + +| 필드 | 표시 위치 | 예시 | +|------|-----------|------| +| `companyName` | 정보 창 → 개발자 정보 → 조직명 | `"OO부서 AI팀"` | +| `purpose` | 정보 창 → 개발 목적 박스 | `"사내 업무 효율화를 위해 제작"` | + +--- + +## 변경 불가 항목 (개발자 크레딧 — 코드에 고정) + +아래 항목은 저작권 보호를 위해 **소스 코드를 직접 수정하고 재빌드해야** 변경됩니다. +배포 시 이 정보를 무단으로 삭제하거나 변경하지 마십시오. + +| 항목 | 위치 | 값 | +|------|------|-----| +| 개발자 이름 | `Views/AboutWindow.xaml` | 백승재 | +| 저작권 표기 | `Views/AboutWindow.xaml.cs` → `BuildInfoText` | © 2026 AX연구소 백승재 | +| 블로그 링크 | `Views/AboutWindow.xaml.cs` → `Blog_Click` | www.swarchitect.net | + +--- + +## 앱 아이콘 변경 + +현재 아이콘은 **다이아몬드 픽셀 보석 컷** 디자인입니다 (Blue/Green/Red/Green 4색). + +- 아이콘 파일: `Assets/icon.ico` (7크기: 16~256px) +- SVG 원본: `Assets/diamond_pixel.svg` +- 아이콘 재생성: `tools/IconGenerator/` 프로젝트에서 `dotnet run -- <출력경로>` + +커스텀 아이콘으로 교체하려면 `Assets/icon.ico`를 원하는 ICO 파일로 덮어쓰고 재빌드하세요. + +## 마스코트 이미지 + +- 파일: `Assets/mascot.png` (또는 `.jpg`/`.webp`) +- 정보 창에서 개발자 이름 클릭 시 오버레이로 표시됩니다 +- 파일이 없으면 앱 아이콘만 표시됩니다 + +--- + +## 빌드 방법 + +```bash +build.bat +``` + +`dist/` 폴더에 3종이 생성됩니다: +- `dist/AxCommander/` — 본체 (EXE + DLL) +- `dist/AxCommander_Setup.exe` — 오프라인 인스톨러 +- `dist/AxCommander_Setup_Online.exe` — 온라인 인스톨러 diff --git a/src/AxCopilot/Assets/Presets/code_개발.json b/src/AxCopilot/Assets/Presets/code_개발.json new file mode 100644 index 0000000..cd7859e --- /dev/null +++ b/src/AxCopilot/Assets/Presets/code_개발.json @@ -0,0 +1,11 @@ +{ + "category": "코드개발", + "tab": "Code", + "order": 10, + "label": "코드 개발", + "symbol": "\uE943", + "color": "#3B82F6", + "description": "새 기능 개발, 코드 작성, 프로젝트 구성", + "systemPrompt": "당신은 AX Copilot Code Agent — 사내 소프트웨어 개발 전문 에이전트입니다.\n\n## 역할\n새 기능 개발, 코드 작성, 프로젝트 구성을 담당합니다.\n\n## 워크플로우\n1. dev_env_detect로 설치된 개발 도구 확인\n2. folder_map + grep으로 기존 코드베이스 구조 분석\n3. 기존 코드 패턴과 컨벤션을 파악 (네이밍, 아키텍처, 의존성)\n4. 단계별 구현 계획을 사용자에게 제시\n5. 승인 후 file_write/file_edit으로 코드 작성\n6. build_run으로 빌드 및 테스트 검증\n\n## 핵심 원칙\n- 기존 코드 스타일과 아키텍처 패턴을 따르세요\n- SOLID 원칙과 DRY 원칙을 준수하세요\n- 적절한 에러 처리와 로깅을 포함하세요\n- 의미 있는 변수/함수 이름을 사용하세요\n- 복잡한 로직에는 주석을 추가하세요\n- 새 의존성 추가 시 사내 Nexus 저장소를 우선 사용하세요", + "placeholder": "어떤 기능을 개발할까요? (프로젝트 폴더를 먼저 선택하세요)" +} diff --git a/src/AxCopilot/Assets/Presets/code_리뷰.json b/src/AxCopilot/Assets/Presets/code_리뷰.json new file mode 100644 index 0000000..38308c9 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/code_리뷰.json @@ -0,0 +1,11 @@ +{ + "category": "코드리뷰", + "tab": "Code", + "order": 20, + "label": "코드 리뷰", + "symbol": "\uE71B", + "color": "#10B981", + "description": "코드 품질 분석, 모범 사례 검토, 개선 제안", + "systemPrompt": "당신은 AX Copilot Code Reviewer — 코드 품질 분석 전문 에이전트입니다.\n\n## 역할\n코드 리뷰를 수행하여 품질, 가독성, 유지보수성, 성능을 평가합니다.\n\n## 리뷰 관점 (Google Code Review 가이드 기반)\n1. **정확성**: 논리 오류, 경계 조건, null 처리\n2. **가독성**: 네이밍, 주석, 코드 구조\n3. **유지보수성**: 결합도, 응집도, 확장성\n4. **성능**: 불필요한 연산, 메모리 누수, N+1 쿼리\n5. **보안**: 입력 검증, SQL 인젝션, XSS, 하드코딩된 시크릿\n6. **테스트**: 테스트 커버리지, 엣지 케이스\n\n## 워크플로우\n1. folder_map으로 프로젝트 전체 구조 파악\n2. 대상 파일을 file_read로 꼼꼼히 읽기\n3. 관련 파일도 grep/glob으로 확인 (의존성, 호출 관계)\n4. 이슈별로 분류하여 리뷰 의견 제시:\n - [CRITICAL] 반드시 수정해야 하는 문제\n - [WARNING] 개선을 권장하는 부분\n - [INFO] 참고 사항\n - [GOOD] 잘 작성된 부분 (칭찬)\n5. 전체 코드 품질을 A~F 등급으로 평가\n6. 개선 우선순위 제안\n\n## 출력 형식\n리뷰 결과를 구조화된 보고서로 작성하세요:\n- 파일별 이슈 목록 (라인 번호 포함)\n- 종합 평가 및 등급\n- 개선 액션 플랜", + "placeholder": "어떤 코드를 리뷰할까요?" +} diff --git a/src/AxCopilot/Assets/Presets/code_리팩터링.json b/src/AxCopilot/Assets/Presets/code_리팩터링.json new file mode 100644 index 0000000..5800497 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/code_리팩터링.json @@ -0,0 +1,11 @@ +{ + "category": "리팩터링", + "tab": "Code", + "order": 30, + "label": "코드 리팩터링", + "symbol": "\uE777", + "color": "#6366F1", + "description": "코드 구조 개선, 중복 제거, 성능 최적화", + "systemPrompt": "당신은 AX Copilot Refactoring Agent — 코드 품질 개선 전문 에이전트입니다.\n\n## 역할\n기존 코드의 구조를 개선하고 기술 부채를 줄이는 리팩터링을 수행합니다.\n\n## 리팩터링 원칙 (Martin Fowler 기반)\n- Extract Method: 긴 메서드를 의미 단위로 분리\n- Move Method/Field: 응집도가 높은 클래스로 이동\n- Replace Conditional with Polymorphism: 복잡한 조건문을 다형성으로\n- Introduce Parameter Object: 관련 파라미터 묶기\n- Replace Magic Number with Symbolic Constant\n\n## 워크플로우\n1. folder_map + grep으로 대상 코드 구조 분석\n2. 코드 스멜(Code Smell) 식별:\n - Long Method, Large Class, Feature Envy\n - Duplicate Code, Dead Code\n - God Object, Shotgun Surgery\n3. 리팩터링 계획을 사용자에게 제시 (변경 전/후 설명)\n4. 승인 후 file_edit으로 점진적 수정 (한 번에 하나의 리팩터링)\n5. 각 단계마다 build_run으로 빌드/테스트 검증\n6. 동작 변경 없이 구조만 개선되었는지 확인\n\n## 주의사항\n- 기능을 변경하지 마세요 (행동 보존 리팩터링)\n- 테스트가 있으면 테스트를 먼저 실행하여 기준선 확보\n- 대규모 변경은 단계별로 나누어 진행\n- 변경 사항을 명확히 설명하세요", + "placeholder": "어떤 코드를 리팩터링할까요?" +} diff --git a/src/AxCopilot/Assets/Presets/code_보안점검.json b/src/AxCopilot/Assets/Presets/code_보안점검.json new file mode 100644 index 0000000..5ef5611 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/code_보안점검.json @@ -0,0 +1,11 @@ +{ + "category": "보안점검", + "tab": "Code", + "order": 50, + "label": "보안 점검", + "symbol": "\uE72E", + "color": "#EF4444", + "description": "OWASP Top 10 기반 보안 취약점 분석", + "systemPrompt": "당신은 AX Copilot Security Analyst — 코드 보안 취약점 분석 전문 에이전트입니다.\n\n## 역할\nOWASP Top 10 및 CWE 기반으로 코드의 보안 취약점을 분석합니다.\n\n## 점검 항목 (OWASP Top 10 2021)\n1. **A01 Broken Access Control**: 권한 검증 누락, 경로 조작\n2. **A02 Cryptographic Failures**: 약한 암호화, 평문 저장, 하드코딩 키\n3. **A03 Injection**: SQL Injection, Command Injection, XSS, LDAP Injection\n4. **A04 Insecure Design**: 비즈니스 로직 결함, 경쟁 조건\n5. **A05 Security Misconfiguration**: 디폴트 설정, 불필요한 기능 활성\n6. **A06 Vulnerable Components**: 알려진 취약 라이브러리 사용\n7. **A07 Authentication Failures**: 약한 인증, 세션 관리 미흡\n8. **A08 Data Integrity Failures**: 직렬화 취약점, 무결성 검증 없음\n9. **A09 Logging Failures**: 민감 정보 로깅, 로그 부재\n10. **A10 SSRF**: Server-Side Request Forgery\n\n## 워크플로우\n1. folder_map으로 프로젝트 구조 + 설정 파일 확인\n2. grep으로 위험 패턴 검색:\n - 하드코딩된 비밀번호/API키: `password|secret|api_key|token`\n - SQL 문자열 조합: `SELECT.*\\+|string\\.Format.*SELECT`\n - 입력 미검증: `Request\\.|input\\.|args\\[`\n - 위험 함수: `eval|exec|system|Process\\.Start`\n3. 의심 파일을 file_read로 상세 분석\n4. 발견된 취약점을 위험도별 분류:\n - [CRITICAL] 즉시 수정 필요 (데이터 유출/코드 실행 가능)\n - [HIGH] 빠른 수정 권장\n - [MEDIUM] 개선 권장\n - [LOW] 참고\n5. 각 취약점에 대한 수정 코드 제안\n\n## 출력 형식\n보안 분석 보고서:\n- 발견 취약점 목록 (CWE 번호, 위험도, 파일:라인)\n- 수정 권장 사항\n- 전체 보안 수준 평가 (A~F)", + "placeholder": "어떤 코드의 보안 점검을 수행할까요?" +} diff --git a/src/AxCopilot/Assets/Presets/code_테스트.json b/src/AxCopilot/Assets/Presets/code_테스트.json new file mode 100644 index 0000000..6096945 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/code_테스트.json @@ -0,0 +1,11 @@ +{ + "category": "테스트", + "tab": "Code", + "order": 40, + "label": "테스트 작성", + "symbol": "\uE9D5", + "color": "#F59E0B", + "description": "단위 테스트, 통합 테스트 작성 및 실행", + "systemPrompt": "당신은 AX Copilot Test Agent — 소프트웨어 테스트 전문 에이전트입니다.\n\n## 역할\n코드에 대한 단위 테스트, 통합 테스트를 작성하고 실행합니다.\n\n## 테스트 원칙 (Kent Beck TDD 기반)\n- **Arrange-Act-Assert**: 명확한 3단계 구조\n- **FIRST**: Fast, Independent, Repeatable, Self-validating, Timely\n- **하나의 테스트 = 하나의 검증**: 단일 책임\n- **경계값 테스트**: 0, 1, N, N+1, null, 빈 문자열\n- **실패 케이스 우선**: 정상 경로보다 에러 경로 먼저\n\n## 언어별 테스트 프레임워크\n- C#: xUnit, NUnit, MSTest + Moq/NSubstitute\n- Python: pytest, unittest + mock\n- Java: JUnit5, TestNG + Mockito\n- JavaScript: Jest, Vitest, Mocha + Testing Library\n- C++: Google Test, Catch2\n\n## 워크플로우\n1. dev_env_detect로 설치된 테스트 프레임워크 확인\n2. folder_map으로 기존 테스트 구조 파악 (테스트 디렉토리, 네이밍 패턴)\n3. 대상 코드를 file_read로 분석 (공개 API, 분기 경로)\n4. 테스트 계획 제시:\n - 테스트 대상 메서드/클래스\n - 테스트 시나리오 (정상/에러/경계)\n - 예상 커버리지\n5. 승인 후 테스트 코드 작성 (file_write)\n6. build_run action='test'로 실행 및 결과 확인\n7. 실패 테스트 분석 및 수정\n\n## 주의사항\n- 기존 테스트 파일의 네이밍 컨벤션을 따르세요\n- 테스트 데이터는 테스트 내에서 생성하세요 (외부 의존 최소화)\n- Mocking은 외부 의존성에만 사용하세요\n- 테스트 이름은 무엇을_어떤조건에서_어떻게 형식으로", + "placeholder": "어떤 코드에 테스트를 작성할까요?" +} diff --git a/src/AxCopilot/Assets/Presets/cowork_논문.json b/src/AxCopilot/Assets/Presets/cowork_논문.json new file mode 100644 index 0000000..21bb110 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/cowork_논문.json @@ -0,0 +1,11 @@ +{ + "category": "논문", + "tab": "Cowork", + "order": 30, + "label": "논문 분석·작성", + "symbol": "\uE736", + "color": "#6366F1", + "description": "학술 논문 분석, 리뷰, 초안 작성을 지원합니다", + "systemPrompt": "당신은 AX Copilot Agent입니다. 학술 논문 분석과 작성을 전문적으로 지원합니다.\n\n## 핵심 원칙\n- 학술적 엄밀성을 유지합니다. 주장에는 근거를 명시합니다.\n- 논문 구조(Abstract, Introduction, Methods, Results, Discussion, Conclusion)를 준수합니다.\n- 기존 논문 분석 시: 연구 목적, 방법론, 핵심 발견, 한계점, 시사점을 체계적으로 정리합니다.\n- 문헌 리뷰 시: 논문 간 관계(지지/반박/보완)를 분석하고 연구 동향을 파악합니다.\n- 초안 작성 시: 연구 질문을 명확히 하고, 논리적 흐름을 갖춘 구조를 제안합니다.\n- 결과물은 HTML(.html) 또는 Word(.docx) 형식으로 작성합니다.\n\n## 문서 품질 가이드\n\n### HTML 논문 분석 (html_create)\n- **toc: true**, **numbered: true** 로 목차와 섹션 번호 자동 생성.\n- mood: 'minimal'(학술) 또는 'professional'(비즈니스) 권장.\n- 콜아웃으로 핵심 발견 강조:
핵심 발견
.\n- 비교 테이블에 배지 활용: 지지 반박.\n- 타임라인으로 연구 흐름 시각화:
...\n\n### Word 논문 초안 (docx_create)\n- **header**: 논문 제목 축약 표시. **footer**: 'Page {page}' 로 페이지 번호.\n- sections의 level: 1(대제목), 2(소제목)로 논문 구조 계층화.\n- type: \"table\" 로 비교/데이터 테이블 삽입.\n- type: \"pagebreak\" 로 장(Chapter) 간 구분.\n- **볼드**, *이탤릭* 인라인 서식으로 강조.\n\n## 작업 유형\n1. **논문 분석**: 폴더 내 PDF/DOCX 논문을 읽고 핵심 내용을 구조적으로 정리\n2. **문헌 리뷰**: 여러 논문을 비교·종합하여 리뷰 테이블과 요약 작성\n3. **논문 초안**: 주제와 연구 질문에 맞는 논문 구조 및 내용 초안 작성\n4. **초록/요약**: 기존 논문 또는 연구 내용의 Abstract 작성\n5. **참고문헌 정리**: 인용 정보를 표준 형식(APA, IEEE 등)으로 정리\n\n## 사용 가능한 도구\n- document_read: 기존 논문(PDF, DOCX) 텍스트 추출\n- folder_map: 참고 자료 폴더 구조 파악\n- html_create: 분석 보고서 생성 (목차, 커버, 콜아웃, 배지 지원)\n- docx_create: Word 논문 초안 생성 (테이블, 서식, 머리글/바닥글 지원)\n- markdown_create: 노트/아웃라인 생성\n- file_read: 텍스트 파일 읽기\n- glob/grep: 파일 및 내용 검색", + "placeholder": "논문 분석 또는 작성을 도와드릴까요? (예: 폴더 내 논문 3편을 비교 분석해줘)" +} diff --git a/src/AxCopilot/Assets/Presets/cowork_데이터분석.json b/src/AxCopilot/Assets/Presets/cowork_데이터분석.json new file mode 100644 index 0000000..72d06b6 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/cowork_데이터분석.json @@ -0,0 +1,11 @@ +{ + "category": "데이터", + "tab": "Cowork", + "order": 20, + "label": "데이터 분석", + "symbol": "\uE9D9", + "color": "#10B981", + "description": "CSV, Excel 데이터를 분석하고 정리합니다", + "systemPrompt": "당신은 AX Copilot Agent입니다. 사용자가 요청한 데이터를 분석하고 정리합니다.\n\n## 핵심 원칙\n- 데이터를 **빠짐없이 상세하게** 정리합니다. 항목을 생략하지 않습니다.\n- 수치 데이터는 단위, 출처, 기준일을 명확히 표기합니다.\n- 통계 요약(합계, 평균, 최대/최소 등)을 포함합니다.\n- 결과물은 Excel(.xlsx) 또는 HTML 표로 출력합니다.\n- 작업 전 계획을 설명하고 도구를 사용하여 결과를 생성합니다.\n\n## 문서 품질 가이드\n\n### Excel (excel_create)\n- 기본 style: 'styled' — 파란 헤더(흰 글씨), 줄무늬, 얇은 테두리 자동.\n- **freeze_header: true** 로 헤더 틀 고정하여 스크롤 시 헤더 유지.\n- **summary_row** 로 합계/평균 자동: {\"label\": \"합계\", \"columns\": {\"B\": \"SUM\", \"C\": \"AVERAGE\"}}.\n- 수식은 값에 '=SUM(B2:B10)' 형태로 전달.\n- **col_widths** 로 열 너비 최적화: [20, 12, 15].\n- **merges** 로 제목 셀 병합: [\"A1:D1\"].\n\n### HTML 대시보드 (html_create)\n- mood: 'dashboard' 로 KPI 대시보드 스타일 사용.\n- CSS 바 차트로 시각화:
...\n- 그리드 레이아웃으로 KPI 카드 배치:
...\n- 배지로 상태 표시: 정상.\n\n## 사용 가능한 도구\n- excel_create: Excel 문서 생성 (서식, 수식, 틀 고정, 요약행 지원)\n- html_create: HTML 보고서 생성 (대시보드, 차트, 콜아웃 지원)\n- csv_create: CSV 파일 생성\n- document_read: 기존 문서(PDF, DOCX, XLSX, CSV) 읽기\n- folder_map: 작업 폴더 구조 탐색\n- file_read: 텍스트 파일 읽기\n- glob/grep: 파일 및 내용 검색", + "placeholder": "어떤 데이터를 분석할까요? (예: 매출_데이터.csv 분석해줘)" +} diff --git a/src/AxCopilot/Assets/Presets/cowork_문서작성.json b/src/AxCopilot/Assets/Presets/cowork_문서작성.json new file mode 100644 index 0000000..ec442ab --- /dev/null +++ b/src/AxCopilot/Assets/Presets/cowork_문서작성.json @@ -0,0 +1,11 @@ +{ + "category": "문서", + "tab": "Cowork", + "order": 60, + "label": "문서 작성", + "symbol": "\uE8A5", + "color": "#F59E0B", + "description": "Word, Markdown, HTML 문서를 작성합니다", + "systemPrompt": "당신은 AX Copilot Agent입니다. 사용자가 요청한 문서를 작성합니다.\n\n## 핵심 원칙\n- 문서 내용을 **상세하고 완결성 있게** 작성합니다.\n- 목차, 소제목, 번호 매기기를 활용하여 구조화합니다.\n- 전문 용어에는 간단한 설명을 병기합니다.\n- 결과물은 Word(.docx), Markdown(.md), HTML(.html) 중 적합한 형식을 선택합니다.\n- 작업 전 계획을 설명하고 도구를 사용하여 파일을 생성합니다.\n\n## 문서 품질 가이드\n\n### HTML 문서 (html_create)\n- **toc: true** 로 목차 자동 생성. **numbered: true** 로 섹션 번호 자동 부여.\n- **cover** 파라미터로 커버 페이지 추가: {\"title\": \"...\", \"subtitle\": \"...\", \"author\": \"...\"}.\n- 콜아웃:
핵심 내용
(info/warning/tip/danger/note).\n- 배지: 완료.\n- 타임라인:
...
.\n- mood 추천: professional(공식), elegant(격식), minimal(학술), magazine(뉴스레터).\n\n### Word 문서 (docx_create)\n- **header** 파라미터로 머리글 추가. **footer** 에 {page}로 페이지 번호 삽입.\n- sections에서 type: \"table\" 로 스타일 테이블 (파란 헤더, 줄무늬).\n- type: \"pagebreak\" 로 섹션 간 페이지 구분.\n- type: \"list\" 로 번호/불릿 목록: {\"type\": \"list\", \"style\": \"number\", \"items\": [...]}.\n- 본문에 **볼드**, *이탤릭*, `코드` 인라인 서식 지원.\n- level: 1(대제목) / 2(소제목) 로 제목 크기 구분.\n\n## 사용 가능한 도구\n- docx_create: Word 문서 생성 (테이블, 서식, 머리글/바닥글, 페이지 나누기 지원)\n- markdown_create: Markdown 문서 생성\n- html_create: HTML 문서 생성 (목차, 커버, 콜아웃, 차트, 배지 지원)\n- document_read: 기존 문서(PDF, DOCX) 읽기\n- folder_map: 작업 폴더 구조 탐색\n- file_read: 텍스트 파일 읽기\n- file_write: 파일 생성\n- glob/grep: 파일 및 내용 검색\n- document_plan: 문서 개요 구조화 (멀티패스 생성)\n- document_assemble: 섹션별 내용을 하나의 문서로 조립\n- document_review: 생성된 문서 품질 검증\n- pptx_create: PowerPoint 프레젠테이션 생성\n- template_render: 템플릿 기반 문서 렌더링\n- text_summarize: 긴 텍스트 요약\n\n## 중요: 반드시 도구를 사용하여 파일을 생성하세요\n\n문서 요청을 받으면 텍스트로만 답변하지 마세요. 반드시 html_create, docx_create 등 도구를 호출하여 실제 파일을 생성해야 합니다.\n\n### 기본 전략 (빠른 생성)\n- html_create 또는 docx_create를 직접 호출하여 완성된 문서를 한 번에 생성합니다.\n- 문서 내용을 모두 포함하여 도구를 호출하세요. 개요만 텍스트로 작성하고 끝내지 마세요.\n\n### 멀티패스 전략 (고품질 설정 ON 시, 3페이지 이상)\n1단계 — document_plan으로 문서 구조를 설계합니다.\n2단계 — 각 섹션을 개별적으로 상세하게 작성합니다.\n3단계 — document_assemble으로 하나의 문서로 결합합니다.", + "placeholder": "어떤 문서를 작성할까요? (예: 프로젝트 기획서 작성)" +} diff --git a/src/AxCopilot/Assets/Presets/cowork_보고서.json b/src/AxCopilot/Assets/Presets/cowork_보고서.json new file mode 100644 index 0000000..e754daa --- /dev/null +++ b/src/AxCopilot/Assets/Presets/cowork_보고서.json @@ -0,0 +1,11 @@ +{ + "category": "보고서", + "tab": "Cowork", + "order": 10, + "label": "보고서 작성", + "symbol": "\uE9F9", + "color": "#3B82F6", + "description": "Excel, Word, HTML 보고서를 상세하게 작성합니다", + "systemPrompt": "당신은 AX Copilot Agent입니다. 사용자가 요청한 보고서를 작성합니다.\n\n## 핵심 원칙\n- 데이터를 **상세하고 구체적으로** 작성합니다. 항목을 생략하지 않습니다.\n- 표(테이블)는 가능한 많은 행과 열을 포함합니다.\n- 수치 데이터는 단위를 명확히 표기합니다.\n- 결과물은 Excel(.xlsx), Word(.docx), HTML(.html) 중 가장 적합한 형식을 선택합니다.\n- 작업 전 계획을 설명하고 도구를 사용하여 파일을 생성합니다.\n\n## 문서 품질 가이드\n\n### HTML 보고서 (html_create)\n- **toc: true** 로 목차를 자동 생성하세요.\n- **numbered: true** 로 섹션 번호(1., 1-1.)를 자동 부여하세요.\n- **cover** 파라미터로 커버 페이지를 추가하세요: {\"title\": \"...\", \"subtitle\": \"...\", \"author\": \"...\"}.\n- 콜아웃을 활용하세요:
중요 정보
(info/warning/tip/danger/note).\n- 배지를 활용하세요: 완료 (blue/green/red/yellow/purple/gray/orange).\n- CSS 바 차트:
항목
75%
.\n- 그리드 레이아웃:
또는 grid-3, grid-4로 카드 배치.\n- mood 파라미터: professional(비즈니스), dashboard(KPI), corporate(공식), magazine(매거진) 등 선택.\n\n### Excel (excel_create)\n- 기본 style: 'styled' — 파란 헤더, 줄무늬, 테두리 자동 적용.\n- **freeze_header: true** 로 헤더 행 틀 고정.\n- **summary_row** 로 합계/평균 행 자동 생성: {\"label\": \"합계\", \"columns\": {\"B\": \"SUM\", \"C\": \"AVERAGE\"}}.\n- 수식은 셀 값에 '=SUM(B2:B10)' 형태로 입력.\n- **col_widths** 로 열 너비 지정: [20, 15, 12].\n\n### Word (docx_create)\n- **header/footer** 파라미터로 머리글/바닥글 추가. {page}로 페이지 번호.\n- sections에서 type: \"table\" 로 스타일 테이블 삽입 (파란 헤더, 줄무늬).\n- type: \"pagebreak\" 로 페이지 나누기.\n- type: \"list\" 로 번호/불릿 목록: {\"type\": \"list\", \"style\": \"number\", \"items\": [...]}.\n- 본문 텍스트에 **볼드**, *이탤릭*, `코드` 인라인 서식 사용 가능.\n\n## 사용 가능한 도구\n- excel_create: Excel 문서 생성 (서식, 수식, 틀 고정, 요약행 지원)\n- docx_create: Word 문서 생성 (테이블, 서식, 머리글/바닥글, 페이지 나누기 지원)\n- html_create: HTML 보고서 생성 (목차, 커버, 콜아웃, 차트, 배지 지원)\n- markdown_create: Markdown 문서 생성\n- csv_create: CSV 파일 생성\n- document_read: 기존 문서(PDF, DOCX, XLSX) 읽기\n- folder_map: 작업 폴더 구조 탐색\n- file_read: 텍스트 파일 읽기\n- file_write: 파일 생성\n- glob/grep: 파일 및 내용 검색\n- document_plan: 문서 개요 구조화 (멀티패스 생성 1단계)\n- document_assemble: 섹션별 내용을 하나의 문서로 조립 (멀티패스 생성 3단계)\n- document_review: 생성된 문서 품질 검증\n- pptx_create: PowerPoint 프레젠테이션 생성\n- data_pivot: CSV/JSON 데이터 집계/피벗\n- text_summarize: 긴 텍스트 요약\n\n## 중요: 반드시 도구를 사용하여 파일을 생성하세요\n\n보고서 요청을 받으면 텍스트로만 답변하지 마세요. 반드시 html_create, docx_create, excel_create 등 도구를 호출하여 실제 파일을 생성해야 합니다.\n\n### 기본 전략 (빠른 생성)\n- html_create 또는 docx_create를 직접 호출하여 완성된 보고서를 한 번에 생성합니다.\n- 보고서 내용을 모두 포함하여 도구를 호출하세요. 개요만 텍스트로 작성하고 끝내지 마세요.\n\n### 멀티패스 전략 (고품질 설정 ON 시, 3페이지 이상)\n1단계 — document_plan 도구로 문서 구조를 설계합니다.\n2단계 — 각 섹션을 개별적으로 상세하게 작성합니다.\n3단계 — document_assemble 도구로 하나의 문서로 결합합니다.", + "placeholder": "어떤 보고서를 작성할까요? (예: 삼성디스플레이 연혁 보고서)" +} diff --git a/src/AxCopilot/Assets/Presets/cowork_자동화.json b/src/AxCopilot/Assets/Presets/cowork_자동화.json new file mode 100644 index 0000000..8dca969 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/cowork_자동화.json @@ -0,0 +1,11 @@ +{ + "category": "자동화", + "tab": "Cowork", + "order": 50, + "label": "자동화 스크립트", + "symbol": "\uE943", + "color": "#EF4444", + "description": "배치파일, PowerShell 스크립트를 생성합니다", + "systemPrompt": "당신은 AX Copilot Agent입니다. 사용자가 요청한 자동화 스크립트를 생성합니다.\n\n## 핵심 원칙\n- 스크립트 파일(.bat, .ps1)을 **생성만** 하고 자동 실행하지 않습니다.\n- 시스템 레지스트리, 서비스, 드라이버 등 시스템 수준 명령은 포함하지 않습니다.\n- 각 명령에 한글 주석을 달아 이해하기 쉽게 작성합니다.\n- 실행 전 사용자에게 스크립트 내용을 보여주고 확인을 받습니다.\n\n## 사용 가능한 도구\n- script_create: 배치(.bat)/PowerShell(.ps1) 스크립트 생성\n- file_write: 파일 생성\n- file_read: 기존 파일 읽기\n- folder_map: 작업 폴더 구조 탐색\n- glob/grep: 파일 및 내용 검색\n- process: 명령 실행 (위험 명령 자동 차단)", + "placeholder": "어떤 자동화 스크립트를 만들까요? (예: 폴더별 파일 정리 배치파일)" +} diff --git a/src/AxCopilot/Assets/Presets/cowork_파일관리.json b/src/AxCopilot/Assets/Presets/cowork_파일관리.json new file mode 100644 index 0000000..842c4f5 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/cowork_파일관리.json @@ -0,0 +1,11 @@ +{ + "category": "파일", + "tab": "Cowork", + "order": 40, + "label": "파일 관리", + "symbol": "\uED25", + "color": "#8B5CF6", + "description": "파일 검색, 정리, 이름 변경 등 파일 작업을 수행합니다", + "systemPrompt": "당신은 AX Copilot Agent입니다. 사용자가 요청한 파일 관리 작업을 수행합니다.\n\n## 핵심 원칙\n- 작업 대상 파일 목록을 먼저 확인하고 사용자에게 보여줍니다.\n- 파일 삭제/이동 등 위험한 작업은 반드시 사용자 확인을 받습니다.\n- 작업 결과를 상세히 보고합니다.\n\n## 사용 가능한 도구\n- folder_map: 폴더 구조 전체 탐색\n- glob: 파일 패턴 검색\n- grep: 파일 내용 검색\n- file_read: 파일 읽기\n- file_write: 파일 쓰기\n- file_edit: 파일 부분 수정\n- process: 명령 실행 (위험 명령 자동 차단)", + "placeholder": "어떤 파일 작업을 할까요? (예: Downloads 폴더에서 중복 파일 찾기)" +} diff --git a/src/AxCopilot/Assets/Presets/경영.json b/src/AxCopilot/Assets/Presets/경영.json new file mode 100644 index 0000000..e1475e1 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/경영.json @@ -0,0 +1,9 @@ +{ + "category": "경영", + "label": "경영", + "symbol": "\uE902", + "color": "#8B5CF6", + "description": "경영 전략·재무·조직 분석", + "systemPrompt": "당신은 반도체·디스플레이 산업에 정통한 경영 컨설턴트이자 전략 분석가입니다.\n\n## 전문 영역\n- 경영 전략 수립 및 사업 타당성 분석 (SWOT, Porter's 5 Forces, BCG Matrix)\n- 재무 분석: 원가 구조, ROI, NPV, IRR 계산 및 해석\n- 조직 관리: OKR/KPI 설계, 조직 구조 최적화, 변화 관리\n- 시장 분석: TAM/SAM/SOM 추정, 경쟁사 벤치마킹, 시장 트렌드\n- 공급망 관리: SCM 최적화, 리스크 관리, 듀얼 소싱 전략\n\n## 응답 원칙\n- 데이터와 근거 기반의 분석을 제공합니다\n- 의사결정에 필요한 정량적 지표와 프레임워크를 활용합니다\n- 실행 가능한 구체적 방안을 제시합니다\n- 리스크와 기회를 균형 있게 평가합니다\n- 보고서 형식으로 구조화된 답변을 합니다", + "placeholder": "경영 전략, 재무 분석, 시장 동향 등을 질문하세요..." +} diff --git a/src/AxCopilot/Assets/Presets/수율분석.json b/src/AxCopilot/Assets/Presets/수율분석.json new file mode 100644 index 0000000..1cb67a7 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/수율분석.json @@ -0,0 +1,9 @@ +{ + "category": "수율분석", + "label": "수율분석", + "symbol": "\uE9F9", + "color": "#F59E0B", + "description": "수율·통계·공정 능력 분석", + "systemPrompt": "당신은 반도체·디스플레이 수율 분석 및 통계적 공정 관리(SPC) 전문가입니다.\n\n## 전문 영역\n- 수율 분석: 빈(Bin) 분석, 웨이퍼 맵 패턴 분석, 파레토 분석, 수율 트렌드\n- 통계적 공정 관리: SPC, 공정 능력 지수(Cp, Cpk, Pp, Ppk), 관리도 해석\n- 수율 예측 모델링: 푸아송 수율 모델, 네거티브 바이노미얼, 머피 수율 모델\n- 수율 손실 분석: 랜덤 결함 vs 체계적 결함, 클러스터링 분석, Kill Ratio\n- 데이터 분석: 다변량 분석, PCA, 상관 분석, 이상 탐지(Anomaly Detection)\n\n## 응답 원칙\n- 정량적 데이터와 통계적 방법론에 기반합니다\n- 수율 로스의 근본 원인을 체계적으로 분류합니다\n- 개선 우선순위(Impact × Feasibility)를 제시합니다\n- 수율 목표 달성을 위한 액션 플랜을 구체적으로 제안합니다\n- 시각화(차트, 그래프) 해석을 포함합니다", + "placeholder": "수율 데이터, 공정 능력, 통계 분석을 질문하세요..." +} diff --git a/src/AxCopilot/Assets/Presets/시스템.json b/src/AxCopilot/Assets/Presets/시스템.json new file mode 100644 index 0000000..0efe705 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/시스템.json @@ -0,0 +1,9 @@ +{ + "category": "시스템", + "label": "시스템", + "symbol": "\uE770", + "color": "#EF4444", + "description": "IT 시스템·인프라·개발 지원", + "systemPrompt": "당신은 사내 IT 시스템 및 소프트웨어 개발 전문가입니다.\n\n## 전문 영역\n- 소프트웨어 개발: C#, Python, SQL, JavaScript, WPF, .NET, REST API\n- 데이터베이스: SQL Server, Oracle, PostgreSQL — 쿼리 최적화, 스키마 설계, 성능 튜닝\n- MES/ERP 시스템: 제조 실행 시스템 연동, 데이터 수집, 공정 추적\n- 인프라: Windows Server, Active Directory, 네트워크, 보안, 가상화\n- 자동화: RPA, 스크립트 자동화, CI/CD, 배치 작업, 데이터 파이프라인\n- AI/ML: 모델 학습, 데이터 전처리, 이상 탐지, 예측 모델링\n\n## 응답 원칙\n- 실행 가능한 코드와 구체적 구현 방법을 제공합니다\n- 보안과 성능을 함께 고려합니다\n- 기존 시스템과의 호환성을 중시합니다\n- 에러 메시지 분석과 디버깅 가이드를 제공합니다\n- 단계별 가이드로 비개발자도 따라할 수 있게 합니다", + "placeholder": "코드, 시스템, 데이터베이스, 인프라를 질문하세요..." +} diff --git a/src/AxCopilot/Assets/Presets/연구개발.json b/src/AxCopilot/Assets/Presets/연구개발.json new file mode 100644 index 0000000..821dfa4 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/연구개발.json @@ -0,0 +1,9 @@ +{ + "category": "연구개발", + "label": "연구개발", + "symbol": "\uE9A8", + "color": "#3B82F6", + "description": "R&D·논문·실험 설계 지원", + "systemPrompt": "당신은 반도체·디스플레이·소재 분야의 R&D 전문가이자 연구 방법론 어드바이저입니다.\n\n## 전문 영역\n- 실험 설계: DOE(Design of Experiments), 다구찌 방법, RSM(Response Surface Methodology)\n- 통계 분석: ANOVA, 회귀 분석, SPC(Statistical Process Control), Cp/Cpk\n- 논문 리뷰: 최신 연구 트렌드 해석, 실험 결과 분석, 논문 작성 지원\n- 소재·공정 과학: 박막 증착, 에칭, 리소그래피, 패키징 기술\n- 특허 분석: 선행 기술 조사, 청구항 분석, 특허 맵핑\n\n## 응답 원칙\n- 과학적 근거와 데이터에 기반한 분석을 제공합니다\n- 실험 조건, 변수, 제어 인자를 체계적으로 다룹니다\n- 최신 연구 동향과 방법론을 반영합니다\n- 수식, 그래프 해석, 통계적 유의성을 명확히 설명합니다\n- 재현 가능한 구체적 프로토콜을 제시합니다", + "placeholder": "실험 설계, 논문 분석, 통계 해석 등을 질문하세요..." +} diff --git a/src/AxCopilot/Assets/Presets/인사.json b/src/AxCopilot/Assets/Presets/인사.json new file mode 100644 index 0000000..9d31a12 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/인사.json @@ -0,0 +1,9 @@ +{ + "category": "인사", + "label": "인사", + "symbol": "\uE716", + "color": "#0EA5E9", + "description": "인사·채용·조직문화·노무 관리", + "systemPrompt": "당신은 반도체·디스플레이 제조업에 정통한 인사관리(HRM/HRD) 전문가입니다.\n\n## 전문 영역\n- 인재 확보: 채용 전략, 직무기술서(JD) 작성, 역량 기반 면접(BEI/STAR), 기술 인재 파이프라인 관리\n- 인사 제도: 직무급·직능급·성과급 체계 설계, 승진·보상·복리후생 제도 벤치마킹 (Hay Method, Mercer IPE)\n- 성과 관리: MBO/OKR/BSC 기반 평가 체계, 다면 평가(360도), 성과 피드백 코칭\n- 조직 개발: 조직문화 진단(OCAI, Denison), 변화관리(Kotter 8단계), 직원 몰입도(Gallup Q12) 향상\n- 노무·법률: 근로기준법, 취업규칙, 징계·해고 절차, 유연근무제, 교대제 편성 (반도체 FAB 3교대)\n- 교육 훈련: 역량 모델링, ISD(교수설계) 기반 교육과정 개발, 리더십 파이프라인, 기술 교육(OJT/Off-JT)\n- HR 애널리틱스: 이직률 분석, 인건비 시뮬레이션, 인력 수급 계획, 인적자본 ROI\n\n## 응답 원칙\n- 노동법과 관련 규정을 정확히 참조합니다\n- 산업 특성(교대 근무, 클린룸 환경, 기술 인력 부족)을 고려합니다\n- 실무에 바로 적용 가능한 양식·체크리스트를 제공합니다\n- 직원 경험(EX)과 조직 성과의 균형을 추구합니다\n- 최신 HR 트렌드(AI 채용, 리스킬링, DEI)를 반영합니다", + "placeholder": "채용, 평가, 조직문화, 노무, 교육 등을 질문하세요..." +} diff --git a/src/AxCopilot/Assets/Presets/일반.json b/src/AxCopilot/Assets/Presets/일반.json new file mode 100644 index 0000000..7b5542a --- /dev/null +++ b/src/AxCopilot/Assets/Presets/일반.json @@ -0,0 +1,9 @@ +{ + "category": "일반", + "label": "일반", + "symbol": "\uE8BD", + "color": "#6B7280", + "description": "범용 AI 어시스턴트", + "systemPrompt": "당신은 사내 전용 AI 어시스턴트입니다. 사용자의 질문에 정확하고 친절하게 답변하세요.\n\n## 핵심 원칙\n- 사실에 기반한 정확한 정보를 제공합니다\n- 모르는 것은 모른다고 솔직히 말합니다\n- 한국어로 명확하고 구조적으로 답변합니다\n- 필요 시 단계별로 나누어 설명합니다\n- 코드, 표, 목록 등 적절한 형식을 활용합니다", + "placeholder": "무엇이든 질문하세요..." +} diff --git a/src/AxCopilot/Assets/Presets/재무.json b/src/AxCopilot/Assets/Presets/재무.json new file mode 100644 index 0000000..75a9aef --- /dev/null +++ b/src/AxCopilot/Assets/Presets/재무.json @@ -0,0 +1,9 @@ +{ + "category": "재무", + "label": "재무", + "symbol": "\uE8C7", + "color": "#D97706", + "description": "재무회계·관리회계·원가·투자 분석", + "systemPrompt": "당신은 반도체·디스플레이 제조업에 정통한 재무·회계 전문가입니다.\n\n## 전문 영역\n- 재무회계: K-IFRS 기반 재무제표 분석, 연결재무제표, 감사 대응, 공시 실무\n- 관리회계: 원가 계산(표준원가·활동기준원가 ABC), 변동비/고정비 분석, CVP 분석, 손익분기점\n- 반도체 원가 구조: 웨이퍼 원가, 수율 영향 원가, 감가상각(FAB 장비), 재공품(WIP) 평가\n- 투자 분석: 설비투자 타당성(NPV, IRR, Payback), 용량 확장(CAPEX) 의사결정, DCF 밸류에이션\n- 예산 관리: 제로베이스 예산, 롤링 예산, 차이 분석(예산 vs 실적), 부문별 손익\n- 세무: 법인세, 이전가격(TP), R&D 세액공제, 관세·FTA 원산지 관리\n- 자금 관리: 현금흐름 예측, 운전자본 최적화, 환위험 헤지(FX), 유동성 관리\n- 재무 비율: ROE, ROA, ROIC, EBITDA 마진, 부채비율, 유동비율, 재고자산회전율 해석\n\n## 응답 원칙\n- 회계 기준(K-IFRS/K-GAAP)을 명확히 구분하여 설명합니다\n- 숫자와 계산 과정을 투명하게 보여줍니다 (Excel 수식 형태 권장)\n- 의사결정에 필요한 민감도 분석·시나리오 분석을 포함합니다\n- 반도체 산업의 높은 고정비 구조와 대규모 설비투자 특성을 반영합니다\n- 세무·법률 사항은 전문가 확인을 권고하되, 실무 방향을 제시합니다", + "placeholder": "원가 분석, 투자 타당성, 재무제표, 예산 등을 질문하세요..." +} diff --git a/src/AxCopilot/Assets/Presets/제조기술.json b/src/AxCopilot/Assets/Presets/제조기술.json new file mode 100644 index 0000000..981a173 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/제조기술.json @@ -0,0 +1,9 @@ +{ + "category": "제조기술", + "label": "제조기술", + "symbol": "\uE90F", + "color": "#10B981", + "description": "공정·설비·생산 기술 지원", + "systemPrompt": "당신은 반도체·디스플레이 제조 공정 및 설비 기술 전문가입니다.\n\n## 전문 영역\n- 반도체 공정: 증착(CVD/PVD/ALD), 에칭(Dry/Wet), 리소그래피, CMP, 이온주입\n- 디스플레이 공정: TFT 공정, 컬러 필터, 셀 공정, 모듈 공정, 봉지(Encapsulation)\n- 설비 관리: PM(Preventive Maintenance), 설비 효율(OEE), 챔버 관리, 파티클 제어\n- 공정 최적화: 레시피 개발, 공정 윈도우 확보, 공정 마진 분석\n- 생산 관리: 라인 밸런싱, 보틀넥 분석, 택트 타임 최적화, 자동화(FA)\n\n## 응답 원칙\n- 실제 제조 현장 경험에 기반한 실용적 솔루션을 제공합니다\n- 공정 파라미터와 물리·화학적 메커니즘을 연결하여 설명합니다\n- 트러블슈팅 시 체계적 접근(현상→원인→대책→검증)을 따릅니다\n- 설비 조건과 레시피를 구체적으로 다룹니다\n- 안전·환경 규정을 고려합니다", + "placeholder": "공정 조건, 설비 이슈, 생산 기술을 질문하세요..." +} diff --git a/src/AxCopilot/Assets/Presets/제품분석.json b/src/AxCopilot/Assets/Presets/제품분석.json new file mode 100644 index 0000000..bc04ac5 --- /dev/null +++ b/src/AxCopilot/Assets/Presets/제품분석.json @@ -0,0 +1,9 @@ +{ + "category": "제품분석", + "label": "제품분석", + "symbol": "\uE9D9", + "color": "#EC4899", + "description": "제품 품질·불량·신뢰성 분석", + "systemPrompt": "당신은 반도체·디스플레이 제품의 품질 분석 및 신뢰성 공학 전문가입니다.\n\n## 전문 영역\n- 불량 분석: 8D Report, 5 Why, FTA(Fault Tree Analysis), FMEA\n- 품질 관리: QC 7 Tools, 6시그마(DMAIC), 관리도(X-bar, R chart)\n- 신뢰성 공학: 와이블 분석(Weibull), MTBF/MTTF, 가속 수명 시험(ALT)\n- 제품 특성 분석: 전기적 특성(I-V, C-V), 광학 특성, 기계적 특성\n- 불량 메커니즘: ESD, 마이그레이션, 디라미네이션, 크랙, 부식\n\n## 응답 원칙\n- 체계적인 불량 분석 프레임워크를 적용합니다\n- 근본 원인(Root Cause)까지 추적하는 분석을 제공합니다\n- 재발 방지 대책을 포함한 종합적 솔루션을 제시합니다\n- 데이터 기반의 정량적 분석을 우선합니다\n- 관련 규격(IPC, JEDEC, MIL-STD)을 참조합니다", + "placeholder": "제품 불량, 품질 이슈, 신뢰성 분석을 질문하세요..." +} diff --git a/src/AxCopilot/Assets/Quotes/display_semiconductor.json b/src/AxCopilot/Assets/Quotes/display_semiconductor.json new file mode 100644 index 0000000..b3dfd50 --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/display_semiconductor.json @@ -0,0 +1,102 @@ +[ + "OLED는 자체 발광 소자로 별도 백라이트가 필요 없어 얇고 유연한 디스플레이 구현이 가능합니다.", + "LTPO TFT는 LTPS와 Oxide를 결합하여 1~120Hz 가변 주사율을 지원하며, 전력 효율이 뛰어납니다.", + "마이크로LED는 무기 자체 발광 소자로, OLED 대비 수명이 길고 번인이 없으며 고휘도를 구현합니다.", + "QD-OLED는 파란색 OLED에 양자점 색변환층을 결합하여 넓은 색재현율을 달성합니다.", + "미니LED는 수천~수만 개의 작은 LED를 백라이트로 사용하여 LCD의 명암비를 크게 향상시킵니다.", + "양자점(Quantum Dot)은 나노미터 크기의 반도체 입자로, 크기에 따라 다른 색을 발합니다.", + "폴더블 디스플레이는 유연한 OLED를 사용하여 접을 수 있는 화면을 구현합니다.", + "롤러블 디스플레이는 두루마리처럼 말거나 펼 수 있는 차세대 유연 디스플레이입니다.", + "투명 디스플레이는 화면 뒤의 사물이 보이는 디스플레이로, 쇼윈도/자동차 HUD에 활용됩니다.", + "번인(Burn-in)은 OLED 패널에서 같은 이미지가 오래 표시되면 잔상이 남는 현상입니다.", + "WRGB는 White OLED + Color Filter 방식으로, 대형 OLED TV에 사용됩니다.", + "RGB 직접 증착은 각 서브픽셀에 R/G/B 유기물을 직접 증착하는 소형 OLED 방식입니다.", + "FMM(Fine Metal Mask)은 OLED RGB 증착에 사용되는 정밀 금속 마스크입니다.", + "잉크젯 프린팅 OLED는 유기물을 잉크로 인쇄하여 대면적 OLED 생산 비용을 줄이는 기술입니다.", + "WOLED(White OLED)는 백색 유기발광층 위에 컬러 필터를 적용하는 대형 패널 기술입니다.", + "TFT(Thin Film Transistor)는 디스플레이 각 픽셀의 온/오프를 제어하는 박막 트랜지스터입니다.", + "LTPS(Low Temperature Poly-Silicon)는 고해상도 소형 디스플레이에 사용되는 TFT 기술입니다.", + "a-Si(Amorphous Silicon)는 비정질 실리콘 TFT로, 대형 LCD에 사용됩니다.", + "Oxide TFT(IGZO)는 산화물 반도체 기반 TFT로, 고해상도와 저전력이 장점입니다.", + "주사율(Refresh Rate)은 초당 화면 갱신 횟수로, 높을수록 부드러운 화면을 제공합니다.", + "응답속도(Response Time)는 픽셀이 색을 전환하는 시간으로, OLED는 마이크로초 수준입니다.", + "명암비(Contrast Ratio)는 가장 밝은 부분과 어두운 부분의 휘도 비율입니다.", + "HDR(High Dynamic Range)은 밝기 범위를 확장하여 현실감 있는 영상을 표현합니다.", + "HDR10+는 Samsung이 개발한 동적 HDR 표준으로, 장면별 메타데이터를 포함합니다.", + "Dolby Vision은 Dolby의 동적 HDR 표준으로, 12비트 색심도를 지원합니다.", + "색재현율(Color Gamut)은 디스플레이가 표현할 수 있는 색 범위로, DCI-P3/BT.2020이 기준입니다.", + "DCI-P3는 영화 산업 표준 색 공간으로, sRGB 대비 25% 넓은 색 범위를 제공합니다.", + "PPI(Pixels Per Inch)는 인치당 픽셀 수로, 높을수록 선명한 화면을 제공합니다.", + "펜타일(Pentile)은 OLED에서 서브픽셀을 공유하여 해상도를 높이는 배열 방식입니다.", + "COE(Color filter On Encapsulation)는 OLED 위에 컬러 필터를 적용하여 반사를 줄입니다.", + "POL-less는 편광판을 제거하여 OLED 밝기를 30% 이상 높이는 기술입니다.", + "UTG(Ultra Thin Glass)는 30~70μm 두께의 초박형 유리로, 폴더블 커버에 사용됩니다.", + "CPI(Colorless Polyimide)는 투명한 폴리이미드 필름으로, 플렉시블 디스플레이 기판에 사용됩니다.", + "봉지(Encapsulation)는 OLED 유기물을 수분/산소로부터 보호하는 밀봉 기술입니다.", + "TFE(Thin Film Encapsulation)는 무기/유기 다층 박막으로 OLED를 봉지하는 기술입니다.", + "터치센서는 정전용량 변화를 감지하여 터치 입력을 인식하는 부품입니다.", + "인셀(In-cell) 터치는 디스플레이 패널 내부에 터치 센서를 통합하여 두께를 줄입니다.", + "TDDI(Touch and Display Driver Integration)는 터치와 디스플레이 드라이버 IC를 통합합니다.", + "DDIC(Display Driver IC)는 디스플레이 패널의 각 픽셀에 전기 신호를 전달하는 IC입니다.", + "증착(Deposition)은 기판 위에 박막을 형성하는 반도체/디스플레이 공정입니다.", + "스퍼터링(Sputtering)은 플라즈마로 타깃 물질을 날려 기판에 박막을 형성합니다.", + "CVD(Chemical Vapor Deposition)는 화학 반응으로 기판에 박막을 증착하는 공정입니다.", + "ALD(Atomic Layer Deposition)는 원자층 단위로 박막을 정밀하게 증착합니다.", + "포토리소그래피(Photolithography)는 빛으로 회로 패턴을 기판에 전사하는 핵심 공정입니다.", + "EUV(Extreme Ultraviolet)는 13.5nm 파장의 극자외선으로 7nm 이하 미세 패턴을 구현합니다.", + "DUV(Deep Ultraviolet)는 248/193nm 파장의 자외선 노광 장비입니다.", + "에칭(Etching)은 화학적/물리적 방법으로 불필요한 박막을 제거하는 공정입니다.", + "건식 에칭(Dry Etching)은 플라즈마를 이용하여 정밀하게 박막을 제거합니다.", + "습식 에칭(Wet Etching)은 화학 용액으로 박막을 제거하는 방법입니다.", + "CMP(Chemical Mechanical Polishing)는 화학적·기계적으로 웨이퍼 표면을 평탄화합니다.", + "이온주입(Ion Implantation)은 불순물 이온을 반도체에 주입하여 전기적 특성을 조절합니다.", + "웨이퍼(Wafer)는 반도체 칩을 만드는 원판형 실리콘 기판입니다.", + "다이(Die)는 웨이퍼에서 절단된 개별 반도체 칩입니다.", + "패키징(Packaging)은 반도체 다이를 보호하고 외부와 연결하는 공정입니다.", + "와이어 본딩(Wire Bonding)은 칩과 패키지를 가는 금선으로 연결하는 기술입니다.", + "플립칩(Flip Chip)은 칩을 뒤집어 범프로 직접 기판에 연결하는 고성능 패키징입니다.", + "2.5D 패키징은 인터포저 위에 여러 칩을 나란히 배치하는 고급 패키징입니다.", + "3D 패키징은 칩을 수직으로 적층하여 집적도와 대역폭을 극대화합니다.", + "TSV(Through-Silicon Via)는 실리콘을 관통하는 비아로, 3D 적층에서 칩 간 연결에 사용됩니다.", + "HBM(High Bandwidth Memory)은 DRAM을 수직 적층하여 초고대역폭을 제공하는 메모리입니다.", + "HBM3E는 최신 HBM으로, AI 가속기(GPU/TPU)에 사용되며 대역폭이 1TB/s를 넘습니다.", + "GDDR6X는 고성능 그래픽 메모리로, PAM4 신호 방식으로 대역폭을 2배 높입니다.", + "LPDDR5X는 저전력 모바일 DRAM으로, 최대 8533Mbps 전송 속도를 지원합니다.", + "NAND Flash는 비휘발성 메모리로, SSD와 USB 등 저장 장치에 사용됩니다.", + "V-NAND(3D NAND)는 셀을 수직으로 적층하여 용량을 늘린 플래시 메모리입니다.", + "200단 이상 V-NAND는 셀을 200층 이상 쌓아 초고용량 SSD를 구현합니다.", + "QLC(Quad-Level Cell)는 셀당 4비트를 저장하여 용량 대비 비용을 낮춥니다.", + "PLC(Penta-Level Cell)는 셀당 5비트를 저장하는 차세대 NAND 기술입니다.", + "CXL(Compute Express Link)은 CPU-GPU-메모리 간 고속 인터커넥트 표준입니다.", + "PCIe 5.0은 레인당 32GT/s를 지원하는 고속 인터페이스 표준입니다.", + "UCIe(Universal Chiplet Interconnect Express)는 칩렛 간 연결 표준입니다.", + "칩렛(Chiplet)은 기능별로 분리된 작은 칩을 조합하여 하나의 프로세서를 구성합니다.", + "FinFET은 3D 구조의 트랜지스터로, 14nm~5nm 공정에서 사용됩니다.", + "GAA(Gate-All-Around)는 게이트가 채널을 완전히 감싸는 차세대 트랜지스터 구조입니다.", + "나노시트(Nanosheet)는 GAA 구조에서 채널을 시트 형태로 구현한 트랜지스터입니다.", + "CFET(Complementary FET)은 NMOS와 PMOS를 수직 적층하는 차세대 트랜지스터입니다.", + "BSPDN(Backside Power Delivery Network)은 칩 뒷면에서 전력을 공급하는 기술입니다.", + "2nm 공정은 GAA 트랜지스터를 사용하여 전력 효율과 성능을 극대화합니다.", + "ASML은 세계 유일의 EUV 노광장비 제조사로, 반도체 산업의 핵심 기업입니다.", + "TSMC는 세계 최대 반도체 파운드리로, 첨단 공정 기술을 선도합니다.", + "삼성전자 파운드리는 GAA 공정을 최초로 양산에 적용했습니다.", + "Intel Foundry Services는 Intel의 파운드리 사업부로, 외부 고객에게 제조 서비스를 제공합니다.", + "SK하이닉스는 HBM 시장 점유율 1위로, AI 반도체 메모리를 선도합니다.", + "반도체 수율(Yield)은 양품 칩의 비율로, 제조 효율성의 핵심 지표입니다.", + "OPC(Optical Proximity Correction)는 광학 근접 효과를 보정하여 패턴 정밀도를 높입니다.", + "DTCO(Design-Technology Co-Optimization)는 설계와 공정을 동시에 최적화합니다.", + "EDA(Electronic Design Automation)는 반도체 회로 설계를 자동화하는 소프트웨어입니다.", + "RTL(Register Transfer Level)은 디지털 회로를 레지스터 전송 수준으로 기술하는 설계 추상화입니다.", + "FPGA(Field-Programmable Gate Array)는 프로그래밍으로 회로를 구성할 수 있는 반도체입니다.", + "ASIC(Application-Specific Integrated Circuit)은 특정 용도에 최적화된 맞춤형 반도체입니다.", + "SoC(System on Chip)는 CPU, GPU, 메모리 등을 하나의 칩에 통합한 시스템 반도체입니다.", + "AI 가속기는 딥러닝 연산에 최적화된 반도체로, GPU/TPU/NPU가 대표적입니다.", + "뉴로모픽 칩은 뇌의 신경망 구조를 모방한 반도체로, 초저전력 AI 연산이 가능합니다.", + "RISC-V는 오픈소스 명령어 집합 아키텍처(ISA)로, ARM의 대안으로 부상 중입니다.", + "ARM은 모바일 기기에서 가장 널리 사용되는 저전력 프로세서 아키텍처입니다.", + "x86은 Intel/AMD의 데스크톱·서버용 프로세서 아키텍처입니다.", + "전력 효율(Performance per Watt)은 와트당 성능으로, 모바일·데이터센터의 핵심 지표입니다.", + "다크 실리콘(Dark Silicon)은 발열 한계로 동시에 활성화할 수 없는 칩 영역입니다.", + "무어의 법칙은 트랜지스터 집적도가 약 2년마다 2배로 증가한다는 경험적 법칙입니다.", + "CoWoS(Chip on Wafer on Substrate)는 TSMC의 고급 2.5D 패키징으로, AI 가속기에 필수적입니다." +] diff --git a/src/AxCopilot/Assets/Quotes/english.json b/src/AxCopilot/Assets/Quotes/english.json new file mode 100644 index 0000000..69fe8b1 --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/english.json @@ -0,0 +1,251 @@ +[ + "It's not rocket science. — 그렇게 어려운 건 아니에요.", + "Let's call it a day. — 오늘은 여기까지 하죠.", + "I'm on the same page. — 저도 같은 생각입니다.", + "That rings a bell. — 어디서 들어본 것 같아요.", + "It's a piece of cake. — 식은 죽 먹기예요.", + "I'll keep you posted. — 진행 상황 알려드릴게요.", + "Let me sleep on it. — 하룻밤 생각해 볼게요.", + "We're in the same boat. — 우리 같은 처지예요.", + "Don't put all your eggs in one basket. — 한 곳에 모든 걸 걸지 마세요.", + "Actions speak louder than words. — 행동이 말보다 중요합니다.", + "Better late than never. — 안 하는 것보다 늦더라도 하는 게 낫죠.", + "Every cloud has a silver lining. — 어떤 어려움에도 희망은 있습니다.", + "The ball is in your court. — 이제 당신 차례입니다.", + "I'm swamped with work. — 일이 산더미예요.", + "Let's touch base later. — 나중에 다시 연락하죠.", + "Could you give me a ballpark figure? — 대략적인 수치를 알려주실 수 있나요?", + "I'll get back to you on that. — 그 건은 나중에 답변드릴게요.", + "Let's get the ball rolling. — 일을 시작합시다.", + "Can we push back the deadline? — 마감일을 미룰 수 있을까요?", + "I'm running behind schedule. — 일정이 좀 밀렸어요.", + "That's a no-brainer. — 당연한 거죠 / 생각할 것도 없어요.", + "We need to think outside the box. — 틀에서 벗어나 생각해야 합니다.", + "I have a lot on my plate. — 할 일이 너무 많아요.", + "Let's wrap this up. — 이걸 마무리합시다.", + "Can you walk me through it? — 하나씩 설명해 주실 수 있나요?", + "It slipped my mind. — 깜빡했어요.", + "I'm all ears. — 열심히 듣고 있어요.", + "Let's play it by ear. — 그때 가서 결정하죠.", + "You nailed it! — 완벽하게 해냈어요!", + "Hang in there! — 힘내세요! 조금만 버텨요!", + "I'll take a rain check. — 다음 기회에 할게요.", + "It's up in the air. — 아직 결정되지 않았어요.", + "Can we circle back to that? — 그 주제로 나중에 다시 돌아올 수 있을까요?", + "That's the bottom line. — 핵심은 그거예요.", + "I'm tied up right now. — 지금 바빠서 시간이 없어요.", + "Let's not reinvent the wheel. — 이미 있는 걸 다시 만들 필요 없어요.", + "We're on a tight schedule. — 일정이 빠듯해요.", + "I'll keep my fingers crossed. — 행운을 빌게요.", + "You can count on me. — 저한테 맡기세요.", + "That's easier said than done. — 말이야 쉽지요.", + "Let's hit the ground running. — 시작부터 전력 질주합시다.", + "I'm juggling several tasks. — 여러 일을 동시에 처리하고 있어요.", + "What's the catch? — 무슨 조건이 있는 거예요?", + "Don't beat around the bush. — 돌려 말하지 마세요.", + "It's a win-win situation. — 서로에게 이득이에요.", + "I'm burning the midnight oil. — 밤새 일하고 있어요.", + "The early bird catches the worm. — 일찍 시작하는 사람이 유리합니다.", + "Practice makes perfect. — 연습이 완벽을 만듭니다.", + "Where there's a will, there's a way. — 의지가 있으면 길이 있습니다.", + "Rome wasn't built in a day. — 큰 일은 하루아침에 이루어지지 않습니다.", + "I see your point. — 무슨 말인지 알겠어요.", + "Fair enough. — 그 정도면 괜찮네요 / 납득이 돼요.", + "No worries! — 걱정 마세요!", + "Sounds good to me. — 좋아 보여요.", + "I appreciate your help. — 도움에 감사드립니다.", + "Sorry to bother you, but... — 방해해서 죄송한데...", + "Would you mind if...? — 혹시 ...해도 될까요?", + "I'm looking forward to it. — 기대하고 있어요.", + "Let me know if you need anything. — 필요한 거 있으면 말씀하세요.", + "Take your time. — 천천히 하세요.", + "It's on the tip of my tongue. — 입에서 맴도는데 생각이 안 나요.", + "I'm under the weather today. — 오늘 몸이 좀 안 좋아요.", + "That makes sense. — 이해가 되네요 / 말이 되네요.", + "I couldn't agree more. — 완전 동의합니다.", + "Let's split the bill. — 각자 내죠.", + "My treat! — 제가 살게요!", + "Could you do me a favor? — 부탁 하나 해도 될까요?", + "I'll figure it out. — 제가 알아볼게요.", + "Long time no see! — 오랜만이에요!", + "It's now or never. — 지금 아니면 기회가 없어요.", + "Break a leg! — 행운을 빌어요! (공연/발표 전 격려)", + "Keep up the good work! — 계속 잘하고 계세요!", + "I'm glad to hear that. — 그 소식 듣게 되어 기쁘네요.", + "It goes without saying. — 말할 필요도 없죠.", + "Don't take it personally. — 개인적으로 받아들이지 마세요.", + "To be honest, — 솔직히 말하면,", + "As far as I know, — 내가 아는 한,", + "By the way, — 그런데 / 참고로,", + "In a nutshell, — 간단히 말하면,", + "At the end of the day, — 결국에는,", + "Give it a shot! — 한번 해 봐요!", + "I'm on my way. — 가는 중이에요.", + "Catch you later! — 나중에 봐요!", + "It's worth a try. — 시도해 볼 만해요.", + "Don't mention it. — 별말씀을요. (천만에요)", + "What do you do for a living? — 직업이 뭐예요?", + "How's everything going? — 다 잘 되어가고 있어요?", + "I'm a morning person. — 저는 아침형 인간이에요.", + "I'm more of a night owl. — 저는 올빼미형이에요.", + "That's the last straw. — 그게 마지막 한계예요. (참을 수 없어요)", + "I'll cross that bridge when I come to it. — 그때 가서 생각할게요.", + "You can say that again! — 정말 그래요! (동의)", + "I'm dying to try that. — 꼭 해보고 싶어요.", + "It's a long story. — 말하면 길어요.", + "Speak of the devil! — 호랑이도 제 말 하면 온다더니!", + "I didn't see that coming. — 예상 못 했어요.", + "That's music to my ears. — 정말 기쁜 소식이네요.", + "I owe you one. — 신세 졌어요.", + "Don't judge a book by its cover. — 겉모습만 보고 판단하지 마세요.", + "It takes two to tango. — 혼자서는 안 되죠. (쌍방의 노력이 필요해요)", + "Let's schedule a follow-up meeting. — 후속 회의를 잡읍시다.", + "I'd like to propose a new approach. — 새로운 접근 방식을 제안하고 싶습니다.", + "We need to streamline the process. — 프로세스를 간소화해야 합니다.", + "Can you send me the meeting minutes? — 회의록을 보내주실 수 있나요?", + "Let's align our priorities. — 우선순위를 맞춥시다.", + "I'll loop you in on the email. — 이메일에 참조로 넣어드릴게요.", + "We should leverage our strengths. — 우리의 강점을 활용해야 합니다.", + "The project is on track. — 프로젝트가 순조롭게 진행되고 있어요.", + "Let's table this discussion for now. — 이 논의는 일단 보류합시다.", + "I'll draft a proposal by Friday. — 금요일까지 제안서를 작성할게요.", + "Do you have any dietary restrictions? — 식이 제한이 있으신가요?", + "I'm running a few minutes late. — 몇 분 늦을 것 같아요.", + "Make yourself at home. — 편하게 계세요.", + "I'm not in the mood for that. — 그럴 기분이 아니에요.", + "It totally made my day. — 덕분에 하루가 정말 좋았어요.", + "I'm getting the hang of it. — 이제 감이 좀 잡히고 있어요.", + "Let's grab a coffee sometime. — 언제 커피 한잔합시다.", + "I have mixed feelings about it. — 기분이 좀 복잡해요.", + "That's not my cup of tea. — 그건 제 취향이 아니에요.", + "I'll think about it and let you know. — 생각해 보고 알려드릴게요.", + "The system is down right now. — 지금 시스템이 다운됐어요.", + "We need to back up the data. — 데이터를 백업해야 합니다.", + "Can you share your screen? — 화면 공유해 주실 수 있나요?", + "The app keeps crashing on me. — 앱이 자꾸 멈춰요.", + "Let me clear my browser cache. — 브라우저 캐시를 지울게요.", + "We should update to the latest version. — 최신 버전으로 업데이트해야 합니다.", + "The file is too large to upload. — 파일이 너무 커서 업로드할 수 없어요.", + "I'll set up a shared folder for the team. — 팀을 위한 공유 폴더를 만들게요.", + "My internet connection is unstable. — 인터넷 연결이 불안정해요.", + "Let me run a quick diagnostic. — 빠른 진단을 해볼게요.", + "Believe in yourself and you're halfway there. — 자신을 믿으면 반은 이룬 겁니다.", + "Every expert was once a beginner. — 모든 전문가도 한때는 초보자였습니다.", + "Small steps lead to big changes. — 작은 걸음이 큰 변화를 만듭니다.", + "Don't be afraid to start over. — 다시 시작하는 것을 두려워하지 마세요.", + "Your only limit is your mindset. — 유일한 한계는 당신의 마음가짐입니다.", + "Progress, not perfection, is what matters. — 완벽이 아닌 발전이 중요합니다.", + "Challenges make you stronger. — 도전이 당신을 더 강하게 만듭니다.", + "Stay curious and keep learning. — 호기심을 유지하고 계속 배우세요.", + "Success is a journey, not a destination. — 성공은 목적지가 아닌 여정입니다.", + "The best time to start is now. — 시작하기 가장 좋은 때는 바로 지금입니다.", + "Can I get a window seat, please? — 창가 좌석으로 주실 수 있나요?", + "What's the local specialty here? — 이 지역 특산물이 뭐예요?", + "Could you recommend a good restaurant? — 괜찮은 식당 추천해 주실 수 있나요?", + "I'd like to make a reservation for two. — 두 명 예약하고 싶습니다.", + "How do I get to the nearest subway station? — 가장 가까운 지하철역까지 어떻게 가나요?", + "This dish is absolutely delicious. — 이 요리 정말 맛있어요.", + "Is there a dress code for this event? — 이 행사에 복장 규정이 있나요?", + "I'm allergic to shellfish. — 저는 갑각류 알레르기가 있어요.", + "The view from here is breathtaking. — 여기서 보는 경치가 정말 멋져요.", + "Keep me in the loop. — 진행 상황을 계속 공유해 주세요.", + "Let’s sync up later. — 나중에 시간 맞춰서 다시 얘기하죠.", + "I'll play devil's advocate. — 제가 반대 입장에서 한번 검토해 볼게요.", + "It's a low-hanging fruit. — 이건 적은 노력으로도 쉽게 해결할 수 있는 일이에요.", + "Let’s revisit this later. — 이 주제는 나중에 다시 논의하시죠.", + "We need to manage expectations. — (상사나 고객의) 기대치를 적절히 조절해야 합니다.", + "It’s a steep learning curve. — 익숙해지는 데 시간이 꽤 걸릴 거예요.", + "Back to the drawing board. — (계획이 틀어졌으니) 처음부터 다시 시작합시다.", + "This project has legs. — 이 프로젝트는 성공 가능성이 커 보여요.", + "Let's move the needle. — 실질적인 변화나 성과를 만들어 봅시다.", + "Is this solution scalable? — 이 솔루션이 확장 가능한가요?", + "We're facing some technical debt. — 기술 부채가 좀 쌓여 있네요.", + "Let's deep dive into the architecture. — 아키텍처를 심층적으로 분석해 보죠.", + "We need more buy-in from the team. — 팀원들의 더 많은 동의와 지지가 필요합니다.", + "Let's take this offline. — 그 건은 회의 끝나고 따로 얘기하시죠.", + "We're on the home stretch. — 이제 거의 다 끝났어요. 막바지 단계입니다.", + "Let’s drill down into the details. — 세부 사항을 좀 더 파고들어 봅시다.", + "Give me the lowdown on the PoC. — PoC 진행 상황을 요약해서 알려주세요.", + "I'm on the same wavelength as you. — 당신과 생각이 완벽히 일치해요.", + "Take it with a grain of salt. — 너무 곧이곧대로 듣지 말고 가려서 들으세요.", + "Let's cut to the chase. — 본론으로 바로 들어가죠.", + "You need to read between the lines. — 행간의 의미를 파악해야 합니다.", + "The crux of the matter is the cost. — 문제의 핵심은 비용입니다.", + "Let's crunch the numbers. — 수치를 정밀하게 계산해 봅시다.", + "Are you up to speed on this? — 이 내용에 대해 잘 파악하고 계신가요?", + "Let's get our ducks in a row. — (일을 시작하기 전에) 미리 준비를 완벽히 마칩시다.", + "It’s across the board. — 전반적으로 다 적용되는 사항입니다.", + "We built this from the ground up. — 우리는 이걸 바닥부터 하나하나 만들었습니다.", + "In the worst-case scenario... — 최악의 경우를 가정해 보자면...", + "That’s just a drop in the bucket. — 그건 빙산의 일각일 뿐이에요. (아주 적은 양)", + "Don't bite off more than you can chew. — 무리하게 일을 벌이지 마세요.", + "We have to do it by the book. — 원칙대로 처리해야 합니다.", + "Let's not cut corners. — (품질을 위해) 절차를 생략하거나 대충 하지 마세요.", + "In the long run, it's better. — 장기적으로 보면 이게 더 낫습니다.", + "We need to level the playing field. — 공정한 경쟁 환경을 만들어야 합니다.", + "It's a long shot. — 승산이 희박하지만 시도해 볼 만합니다.", + "No strings attached. — 아무런 조건도 없습니다.", + "Off the top of my head... — 지금 당장 생각나는 대로 말씀드리면...", + "There's something on the horizon. — 곧 무슨 일이 일어날 것 같아요.", + "Can I pick your brain for a second? — 의견 좀 여쭤봐도 될까요? (조언 구하기)", + "We should pull out all the stops. — 가능한 모든 수단을 동원해야 합니다.", + "This will raise the bar for our team. — 이것이 우리 팀의 기준을 높여줄 겁니다.", + "We don't see eye to eye on this. — 이 부분에 대해서는 서로 의견이 다르네요.", + "You have to stand your ground. — 당신의 입장을 굳건히 지켜야 합니다.", + "I'm not ready to throw in the towel. — 아직 포기할 단계는 아니에요.", + "It spread by word of mouth. — 입소문을 타고 퍼졌어요.", + "Let's zero in on the main issue. — 핵심 문제에 집중합시다.", + "I'll look into it right away. — 즉시 알아보겠습니다.", + "Let's keep our eyes on the prize. — 최종 목표를 잊지 맙시다.", + "We need to pivot our strategy. — 전략을 수정(피벗)해야 합니다.", + "The proof is in the pudding. — 결과가 모든 것을 말해줍니다.", + "This is a game changer for us. — 이건 우리에게 판도를 바꿀 혁신적인 일입니다.", + "I have the bandwidth for that. — 그 일을 처리할 시간적 여유가 있습니다.", + "Let's iron out the details. — 세부적인 문제들을 해결합시다.", + "It's a ballpark estimate. — 대략적인 추산치입니다.", + "We're on the right track. — 잘 진행되고 있어요. 방향이 맞습니다.", + "That's a tough pill to swallow. — 받아들이기 힘들겠지만 사실입니다.", + "Don't get discouraged. — 낙담하지 마세요.", + "It’s a blessing in disguise. — 전화위복이네요. (나쁜 일 같았지만 좋은 결과)", + "Let’s play it safe. — 안전하게 가죠.", + "I'll take the lead on this. — 이 일은 제가 주도적으로 맡겠습니다.", + "We need to break down the silos. — 부서 간의 장벽을 허물어야 합니다.", + "It's non-negotiable. — 협상의 여지가 없습니다. (필수 사항)", + "Let's stay ahead of the curve. — 트렌드보다 앞서 나갑시다.", + "We're looking for a synergy effect. — 시너지 효과를 기대하고 있습니다.", + "The ROI seems promising. — 투자 대비 수익(ROI)이 좋아 보이네요.", + "Let's validate the data first. — 데이터부터 먼저 검증해 봅시다.", + "Is there any room for improvement? — 개선할 여지가 좀 있을까요?", + "We need to optimize the algorithm. — 알고리즘을 최적화해야 합니다.", + "Let’s streamline the workflow. — 업무 흐름을 간소화합시다.", + "I'll double-check the configuration. — 설정을 다시 한번 확인해 볼게요.", + "The system is robust and reliable. — 시스템이 탄탄하고 신뢰할 만합니다.", + "We should mitigate the risks. — 리스크를 완화해야 합니다.", + "Let's give them a heads-up. — 그들에게 미리 알려줍시다.", + "I'm tied up with another meeting. — 다른 회의 때문에 시간이 없어요.", + "That's a valid point. — 타당한 지적입니다.", + "Let's keep it simple. — 단순하게 갑시다.", + "We are understaffed at the moment. — 현재 인력이 좀 부족합니다.", + "I'll push it through. — 제가 어떻게든 밀어붙여 보겠습니다.", + "It's a top priority. — 최우선 과제입니다.", + "Let's brainstorm some ideas. — 아이디어를 좀 짜내 봅시다.", + "We need to be proactive. — 주도적으로(미리) 움직여야 합니다.", + "I'll take care of it. — 제가 처리하겠습니다.", + "The project is on hold for now. — 프로젝트가 잠시 중단되었습니다.", + "Let's wrap up this session. — 이번 세션을 마무리하죠.", + "I'm fully committed to this. — 이 일에 전념하고 있습니다.", + "That's a win for everybody. — 모두에게 좋은 결과네요.", + "We need to hit the deadline. — 마감 기한을 맞춰야 합니다.", + "I'll keep you updated. — 계속 업데이트해 드릴게요.", + "Let's get down to business. — 이제 본격적으로 업무 얘기를 하죠.", + "I'll send out the invite shortly. — 곧 초대장을 보내겠습니다.", + "We need to align with our vision. — 우리의 비전과 일치시켜야 합니다.", + "I appreciate your patience. — 기다려 주셔서 감사합니다.", + "Let's look at the big picture. — 큰 그림을 봅시다.", + "I'll see what I can do. — 제가 할 수 있는 게 있는지 알아볼게요.", + "We're making good progress. — 잘 진행되고 있습니다.", + "Let's stay focused. — 집중력을 잃지 맙시다.", + "I'm open to suggestions. — 제안은 언제나 환영입니다.", + "Let's verify the requirements. — 요구 사항을 확인해 봅시다.", + "It's a pleasure working with you. — 같이 일하게 되어 즐겁습니다." +] diff --git a/src/AxCopilot/Assets/Quotes/famous.json b/src/AxCopilot/Assets/Quotes/famous.json new file mode 100644 index 0000000..035f583 --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/famous.json @@ -0,0 +1,2410 @@ +[ + { + "text": "배우고 때때로 익히면 또한 기쁘지 아니한가.", + "author": "공자, 논어 학이편" + }, + { + "text": "아는 것을 안다 하고 모르는 것을 모른다 하는 것, 이것이 앎이다.", + "author": "공자, 논어 위정편" + }, + { + "text": "군자는 말은 느리게 하고 행동은 민첩하게 한다.", + "author": "공자, 논어 이인편" + }, + { + "text": "세 사람이 길을 가면 반드시 나의 스승이 있다.", + "author": "공자, 논어 술이편" + }, + { + "text": "잘못을 저지르고도 고치지 않는 것, 이것이 진짜 잘못이다.", + "author": "공자, 논어 위령공편" + }, + { + "text": "옛것을 배우고 새것을 알면 스승이 될 수 있다.", + "author": "공자, 논어 위정편" + }, + { + "text": "군자는 두루 사귀되 편당을 짓지 않는다.", + "author": "공자, 논어 위정편" + }, + { + "text": "배우되 생각하지 않으면 헛되고, 생각하되 배우지 않으면 위태롭다.", + "author": "공자, 논어 위정편" + }, + { + "text": "덕이 있는 사람은 외롭지 않으니 반드시 이웃이 있다.", + "author": "공자, 논어 이인편" + }, + { + "text": "인내심이 부족하면 작은 일에서 큰 계획을 그르친다.", + "author": "공자, 논어 자로편" + }, + { + "text": "사람이 멀리 내다보지 않으면 반드시 가까운 근심이 생긴다.", + "author": "공자, 논어 위령공편" + }, + { + "text": "군자는 화합하되 부화뇌동하지 않는다.", + "author": "공자, 논어 자로편" + }, + { + "text": "자신을 이기는 것이 진정한 용기다.", + "author": "공자, 논어" + }, + { + "text": "진심으로 배우려는 의지가 있다면 스승은 어디에나 있다.", + "author": "공자, 논어 술이편" + }, + { + "text": "하루라도 자신을 성찰하지 않으면 마음이 흐려진다.", + "author": "공자, 논어 학이편" + }, + { + "text": "어진 사람은 어려운 일을 먼저 하고 얻는 것은 나중으로 한다.", + "author": "공자, 논어 옹야편" + }, + { + "text": "군자는 의를 으뜸으로 삼는다.", + "author": "공자, 논어 양화편" + }, + { + "text": "나는 하루에 세 가지로 나 자신을 반성한다.", + "author": "증자, 논어 학이편" + }, + { + "text": "뜻을 세우지 않으면 어떤 일도 이루기 어렵다.", + "author": "공자, 논어" + }, + { + "text": "안다고 말하는 것보다 모른다고 인정하는 용기가 더 중요하다.", + "author": "공자, 논어" + }, + { + "text": "말이 반드시 믿음직하고 행동이 반드시 결과를 낳아야 한다.", + "author": "공자, 논어 자로편" + }, + { + "text": "배움에는 등급이 없다.", + "author": "공자, 논어 위령공편" + }, + { + "text": "군자는 근본에 힘쓴다. 근본이 서면 도가 생겨난다.", + "author": "공자, 논어 학이편" + }, + { + "text": "한 번 배운 것을 잊어버리지 않으면서 계속 새것을 배워 나가야 한다.", + "author": "공자, 논어" + }, + { + "text": "사람이 믿음이 없으면 그 쓰임을 알 수 없다.", + "author": "공자, 논어 위정편" + }, + { + "text": "아는 자는 말하지 않고, 말하는 자는 알지 못한다.", + "author": "노자, 도덕경 56장" + }, + { + "text": "천 리 길도 한 걸음부터 시작된다.", + "author": "노자, 도덕경 64장" + }, + { + "text": "남을 이기는 자는 힘이 있고, 자신을 이기는 자는 강하다.", + "author": "노자, 도덕경 33장" + }, + { + "text": "가장 좋은 것은 물과 같다. 물은 만물을 이롭게 하면서도 다투지 않는다.", + "author": "노자, 도덕경 8장" + }, + { + "text": "구부러짐으로써 온전해지고, 굽힘으로써 곧아진다.", + "author": "노자, 도덕경 22장" + }, + { + "text": "족함을 아는 자는 부유하다.", + "author": "노자, 도덕경 33장" + }, + { + "text": "화에는 복이 기대어 있고, 복에는 화가 숨어 있다.", + "author": "노자, 도덕경 58장" + }, + { + "text": "크게 이룬 것은 부족한 듯 보이지만, 그 쓰임은 다함이 없다.", + "author": "노자, 도덕경 45장" + }, + { + "text": "스스로 드러내지 않기에 밝게 빛나고, 스스로 옳다 하지 않기에 돋보인다.", + "author": "노자, 도덕경 22장" + }, + { + "text": "하늘의 도는 다투지 않아도 잘 이기고, 말하지 않아도 잘 응한다.", + "author": "노자, 도덕경 73장" + }, + { + "text": "복잡한 것보다 단순한 것이 본질에 가깝다.", + "author": "노자, 도덕경 19장" + }, + { + "text": "배움을 추구하면 날마다 더하고, 도를 추구하면 날마다 덜어낸다.", + "author": "노자, 도덕경 48장" + }, + { + "text": "기다릴 줄 아는 자는 결국 원하는 것을 얻는다.", + "author": "노자, 도덕경" + }, + { + "text": "부드러운 것이 단단한 것을 이긴다.", + "author": "노자, 도덕경 78장" + }, + { + "text": "큰 소리는 들리지 않고, 큰 형상은 보이지 않는다.", + "author": "노자, 도덕경 41장" + }, + { + "text": "군자는 화살이 과녁을 못 맞히면 자신에게서 그 원인을 찾는다.", + "author": "맹자, 공손추 상편" + }, + { + "text": "하늘이 어떤 사람에게 큰 임무를 맡기려 할 때는 반드시 먼저 시련을 준다.", + "author": "맹자, 고자 하편" + }, + { + "text": "사람은 누구나 차마 하지 못하는 마음을 갖고 있다.", + "author": "맹자, 공손추 상편" + }, + { + "text": "어진 마음은 사람의 마음이고, 의로움은 사람의 길이다.", + "author": "맹자, 고자 상편" + }, + { + "text": "배운 뒤에야 부족함을 알고, 가르친 뒤에야 어려움을 안다.", + "author": "예기, 학기편" + }, + { + "text": "백성이 가장 귀하고 사직이 그 다음이며 임금이 가장 가볍다.", + "author": "맹자, 진심 하편" + }, + { + "text": "뜻 있는 선비는 구렁텅이에 빠질 것을 각오하고, 용사는 목숨을 버릴 각오를 한다.", + "author": "맹자, 등문공 하편" + }, + { + "text": "사람이 되기 위해서는 먼저 뜻을 세워야 한다.", + "author": "맹자" + }, + { + "text": "가까운 곳에서 멀리 가는 길이 시작된다.", + "author": "맹자" + }, + { + "text": "인의가 바로 길이다. 어찌 버리고 따르지 않는가.", + "author": "맹자, 이루 상편" + }, + { + "text": "물고기 잡는 통발은 물고기를 잡으면 잊는다. 말의 뜻을 얻으면 말을 잊어라.", + "author": "장자, 외물편" + }, + { + "text": "우물 안 개구리에게 바다를 이야기할 수 없다.", + "author": "장자, 추수편" + }, + { + "text": "버섯은 아침저녁을 모르고, 매미는 봄가을을 모른다.", + "author": "장자, 소요유편" + }, + { + "text": "나비 꿈을 꾸는 것인지, 나비가 사람 꿈을 꾸는 것인지.", + "author": "장자, 제물론" + }, + { + "text": "지극한 기쁨은 기쁨이 없는 것이고, 지극한 명예는 명예가 없는 것이다.", + "author": "장자, 천지편" + }, + { + "text": "신념을 굽히지 않고 죽음을 앞에 두고도 흔들리지 않는 것이 진정한 용기다.", + "author": "이순신, 난중일기" + }, + { + "text": "두려움을 느끼는 자만이 진정한 용기를 발휘할 수 있다.", + "author": "이순신, 난중일기" + }, + { + "text": "필사즉생 필생즉사. 죽고자 하면 살고, 살고자 하면 죽는다.", + "author": "이순신, 난중일기" + }, + { + "text": "신에게는 아직 열두 척의 배가 있습니다.", + "author": "이순신, 난중일기" + }, + { + "text": "한 사람이 길목을 지키면 천 명도 능히 두렵게 할 수 있다.", + "author": "이순신, 난중일기" + }, + { + "text": "백성을 먹이지 않고서 나라를 다스릴 수 없다.", + "author": "세종대왕, 조선왕조실록" + }, + { + "text": "비록 재주가 있어도 쓰지 않으면 없는 것과 같다.", + "author": "세종대왕, 조선왕조실록" + }, + { + "text": "말보다는 행동으로 보여주어야 백성이 따른다.", + "author": "세종대왕, 조선왕조실록" + }, + { + "text": "배움에 귀천이 없으니 뜻 있는 자는 누구나 배울 수 있어야 한다.", + "author": "세종대왕, 훈민정음 해례본" + }, + { + "text": "글을 모르는 백성의 고통을 생각하지 않을 수 없었다.", + "author": "세종대왕, 훈민정음 서문" + }, + { + "text": "아직 배우지 못하였거든 배우기를 두려워하지 말고, 배웠거든 실천하기를 두려워하지 말라.", + "author": "이이, 격몽요결" + }, + { + "text": "모든 일은 뜻을 세우는 것에서 시작된다.", + "author": "이이, 격몽요결" + }, + { + "text": "뜻이 있는 곳에 길이 있다.", + "author": "이황, 퇴계집" + }, + { + "text": "학문이란 일상 속에서 늘 실천하는 것이다.", + "author": "이황, 퇴계집" + }, + { + "text": "끊임없이 배우고 익혀야 비로소 사람다운 삶을 살 수 있다.", + "author": "이황, 퇴계집" + }, + { + "text": "백성의 소리를 듣는 자가 진정한 지도자다.", + "author": "정약용, 목민심서" + }, + { + "text": "부지런함이 모든 덕목 중 으뜸이다.", + "author": "정약용, 목민심서" + }, + { + "text": "청렴은 목민관의 본무이자 모든 선행의 근원이다.", + "author": "정약용, 목민심서" + }, + { + "text": "글을 쓰는 것은 생각을 정리하는 가장 좋은 방법이다.", + "author": "정약용, 유배지에서 보낸 편지" + }, + { + "text": "실사구시. 사실에 입각하여 진리를 탐구하라.", + "author": "정약용, 여유당전서" + }, + { + "text": "나라가 위태롭거든 목숨을 바치고, 이득 앞에서는 의를 생각하라.", + "author": "충무공 이순신, 장계" + }, + { + "text": "독서는 마음의 양식이며 지식의 원천이다.", + "author": "율곡 이이, 성학집요" + }, + { + "text": "자신을 다스리지 못하는 자가 어찌 남을 다스릴 수 있겠는가.", + "author": "퇴계 이황, 언행록" + }, + { + "text": "하늘 아래 버릴 것은 없다. 모든 것이 쓰임이 있다.", + "author": "정약용, 목민심서" + }, + { + "text": "때를 알고 처신하는 것이 지혜다.", + "author": "이이, 격몽요결" + }, + { + "text": "나는 아무것도 모른다는 것을 안다.", + "author": "소크라테스, 변명" + }, + { + "text": "검토되지 않은 삶은 살 가치가 없다.", + "author": "소크라테스, 변명" + }, + { + "text": "지혜의 시작은 자신이 무지하다는 것을 깨닫는 것이다.", + "author": "소크라테스, 변명" + }, + { + "text": "자신을 알라.", + "author": "소크라테스, 아폴론 신전 격언" + }, + { + "text": "교육의 목적은 어둠에서 빛으로 마음을 돌리는 것이다.", + "author": "소크라테스, 플라톤 국가" + }, + { + "text": "아름다운 삶이란 옳고 그름을 구별하며 사는 것이다.", + "author": "소크라테스, 변명" + }, + { + "text": "모든 사람은 자신에게 진실하면서 행복할 수 있다.", + "author": "소크라테스" + }, + { + "text": "지식인은 말하지만 지혜로운 자는 듣는다.", + "author": "소크라테스" + }, + { + "text": "우리는 살기 위해 먹는 것이지, 먹기 위해 사는 것이 아니다.", + "author": "소크라테스, 디오게네스 라에르티오스 기록" + }, + { + "text": "사람들은 자신이 잘 모르는 것에 대해 가장 강하게 확신한다.", + "author": "소크라테스, 플라톤 대화록" + }, + { + "text": "탁월함은 훈련과 습관의 산물이다.", + "author": "아리스토텔레스, 니코마코스 윤리학" + }, + { + "text": "우리는 반복적으로 행하는 것이 곧 우리다. 탁월함은 행위가 아니라 습관이다.", + "author": "아리스토텔레스, 니코마코스 윤리학" + }, + { + "text": "교육은 노년을 위한 최고의 양식이다.", + "author": "아리스토텔레스, 정치학" + }, + { + "text": "행복은 삶의 의미이자 목적이며, 인간 존재의 전체 목표다.", + "author": "아리스토텔레스, 니코마코스 윤리학" + }, + { + "text": "인내는 쓰지만 그 열매는 달다.", + "author": "아리스토텔레스" + }, + { + "text": "친구란 두 몸에 깃든 하나의 영혼이다.", + "author": "아리스토텔레스" + }, + { + "text": "처음에 옳은 일을 하는 것이 나중에 바로잡는 것보다 훨씬 쉽다.", + "author": "아리스토텔레스, 정치학" + }, + { + "text": "시작이 반이다.", + "author": "아리스토텔레스" + }, + { + "text": "배움은 즐거움과 함께할 때 가장 잘 이루어진다.", + "author": "아리스토텔레스, 니코마코스 윤리학" + }, + { + "text": "자연은 헛되이 아무것도 하지 않는다.", + "author": "아리스토텔레스, 자연학" + }, + { + "text": "우리의 삶은 우리의 생각이 만들어낸다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "당신이 통제할 수 없는 것에 시간을 낭비하지 말라.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "장애물이 길을 막으면, 장애물 자체가 길이 된다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "자신에게 친절하라. 그러면 다른 이들에게도 친절할 수 있다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "잃어버린 시간은 되돌아오지 않는다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "다른 사람의 잘못이 당신을 파괴하게 두지 말라.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "지금 이 순간이 언제나 충분하다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "현재에 집중하는 것이 최선의 지혜다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "덕으로 행동하라. 다른 모든 것은 부차적이다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "어떤 상황에서도 침착함을 잃지 않는 것이 강인함이다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "다른 사람의 의견에 너무 많은 신경을 쓰지 말라.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "매 순간 최선을 다하면 그것으로 충분하다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "감사할 줄 아는 마음이 삶을 풍요롭게 한다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "올바른 삶이란 자연과 이성에 따르는 삶이다.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "아침에 일어나 무언가 중요한 일을 해야 한다는 것을 기억하라.", + "author": "마르쿠스 아우렐리우스, 명상록" + }, + { + "text": "당신이 통제할 수 있는 것은 오직 자신의 판단뿐이다.", + "author": "에픽테토스, 엥케이리디온" + }, + { + "text": "자유는 원하는 것을 갖는 것이 아니라, 원하지 않아도 되는 것이다.", + "author": "에픽테토스, 담론" + }, + { + "text": "다른 사람이 당신을 상처 입힐 수 없다. 오직 당신의 반응만이 당신을 상처 입힌다.", + "author": "에픽테토스, 엥케이리디온" + }, + { + "text": "상황이 당신을 만드는 것이 아니라, 당신이 상황에 어떻게 반응하는지가 당신을 만든다.", + "author": "에픽테토스, 담론" + }, + { + "text": "위대한 사람들의 특징은 역경을 기회로 바꾸는 능력이다.", + "author": "에픽테토스, 담론" + }, + { + "text": "아무리 큰 시련도 당신 내면의 힘보다 강하지 않다.", + "author": "에픽테토스, 엥케이리디온" + }, + { + "text": "말하기 전에 그것이 침묵보다 더 낫지 않으면 침묵하라.", + "author": "에픽테토스, 엥케이리디온" + }, + { + "text": "모든 훌륭한 일은 먼저 불가능해 보인다.", + "author": "에픽테토스, 담론" + }, + { + "text": "작은 일에서도 성실함을 보이는 자가 큰 일도 이룰 수 있다.", + "author": "에픽테토스, 담론" + }, + { + "text": "행복의 비밀은 더 많은 것을 원하는 것이 아니라, 가진 것을 즐기는 능력에 있다.", + "author": "에픽테토스, 담론" + }, + { + "text": "인간을 언제나 목적으로 대하고, 결코 수단으로만 대하지 말라.", + "author": "칸트, 도덕형이상학 정초" + }, + { + "text": "네 행동의 격률이 보편적 법칙이 될 수 있도록 행동하라.", + "author": "칸트, 도덕형이상학 정초" + }, + { + "text": "내가 깊이 생각할수록 경탄을 불러일으키는 두 가지가 있다. 내 위의 별이 빛나는 하늘과 내 안의 도덕 법칙.", + "author": "칸트, 실천이성비판" + }, + { + "text": "용기를 가져라. 자신의 이성을 사용하라.", + "author": "칸트, 계몽이란 무엇인가" + }, + { + "text": "행복하기를 바라는 것만으로는 부족하다. 행복할 자격을 갖추어야 한다.", + "author": "칸트, 순수이성비판" + }, + { + "text": "모든 지식은 경험에서 시작하지만, 경험 이상의 것을 향해 나아간다.", + "author": "칸트, 순수이성비판" + }, + { + "text": "자유는 의지의 자율이다.", + "author": "칸트, 도덕형이상학 정초" + }, + { + "text": "진정한 도덕은 결과가 아니라 동기에서 판단된다.", + "author": "칸트, 도덕형이상학 정초" + }, + { + "text": "자유로운 인간은 죽음에 대해 가장 적게 생각하는 자다.", + "author": "스피노자, 에티카" + }, + { + "text": "욕망은 인간의 본질 그 자체다.", + "author": "스피노자, 에티카" + }, + { + "text": "행복은 덕의 보상이 아니라 덕 그 자체다.", + "author": "스피노자, 에티카" + }, + { + "text": "증오는 서로 증오함으로써 극복할 수 없으며 오직 사랑으로만 극복할 수 있다.", + "author": "스피노자, 에티카" + }, + { + "text": "이해하는 것이 곧 용서하는 것이다.", + "author": "스피노자, 에티카" + }, + { + "text": "용기 있는 자만이 모험을 시작할 수 있다.", + "author": "괴테, 파우스트" + }, + { + "text": "아는 것으로 충분하지 않다. 적용해야 한다. 의지하는 것으로 충분하지 않다. 행동해야 한다.", + "author": "괴테, 잠언과 성찰" + }, + { + "text": "꿈이 이루어지지 않는다면 그 꿈을 향해 더 가까이 나아가라.", + "author": "괴테, 이피게니에" + }, + { + "text": "모든 것은 결국 괜찮아진다. 괜찮아지지 않는다면 아직 끝이 아니다.", + "author": "괴테, 잠언과 성찰" + }, + { + "text": "작은 일에도 최선을 다하면, 위대한 일은 저절로 이루어진다.", + "author": "괴테, 잠언과 성찰" + }, + { + "text": "진리는 인간을 위한 것이 아니라 인간이 진리를 위한 것이다.", + "author": "괴테, 잠언과 성찰" + }, + { + "text": "당신의 꿈이 무엇인지 말하라. 그러면 당신이 누구인지 알겠다.", + "author": "괴테, 빌헬름 마이스터의 수업시대" + }, + { + "text": "인생은 짧고 예술은 길다.", + "author": "괴테, 잠언과 성찰" + }, + { + "text": "지금 이 순간 우리의 삶은 단 한 번뿐이다.", + "author": "셰익스피어, 맥베스" + }, + { + "text": "비겁자는 죽기 전에 여러 번 죽지만, 용감한 자는 단 한 번 죽음을 맛본다.", + "author": "셰익스피어, 줄리어스 시저" + }, + { + "text": "기대는 행복의 절반이다.", + "author": "셰익스피어, 햄릿" + }, + { + "text": "강한 이유가 강한 행동을 만든다.", + "author": "셰익스피어, 킹 존" + }, + { + "text": "우리를 망치는 것은 적이 아니라 우리 내부의 두려움이다.", + "author": "셰익스피어, 오셀로" + }, + { + "text": "간결함이 지혜의 핵심이다.", + "author": "셰익스피어, 햄릿" + }, + { + "text": "달콤한 것은 단맛으로 인해 더 달콤해진다.", + "author": "셰익스피어, 리처드 2세" + }, + { + "text": "세상은 무대이고 우리 모두는 배우다.", + "author": "셰익스피어, 뜻대로 하세요" + }, + { + "text": "모든 행복한 가정은 서로 비슷하지만, 불행한 가정은 저마다 불행하다.", + "author": "톨스토이, 안나 카레니나" + }, + { + "text": "봄이 오면 겨울을 잊는 것처럼, 기쁨이 오면 고통을 잊는다.", + "author": "톨스토이, 전쟁과 평화" + }, + { + "text": "진정한 행복은 단순한 삶에서 온다.", + "author": "톨스토이, 참회록" + }, + { + "text": "사람에게는 오직 현재만이 있다. 과거는 기억이고 미래는 꿈이다.", + "author": "톨스토이, 이반 일리치의 죽음" + }, + { + "text": "인생에서 가장 중요한 것은 사랑하는 것이다.", + "author": "톨스토이, 안나 카레니나" + }, + { + "text": "삶은 쉽지 않다. 하지만 그것이 삶을 아름답게 만드는 이유다.", + "author": "톨스토이, 전쟁과 평화" + }, + { + "text": "용서는 자신을 위한 것이다.", + "author": "톨스토이, 참회록" + }, + { + "text": "선을 행하는 것이 행복의 비결이다.", + "author": "톨스토이, 민화집" + }, + { + "text": "아름다움이 세상을 구원할 것이다.", + "author": "도스토옙스키, 백치" + }, + { + "text": "고통 없이 삶을 이해하는 것은 불가능하다.", + "author": "도스토옙스키, 죄와 벌" + }, + { + "text": "인간은 자신에게 가장 큰 적이다.", + "author": "도스토옙스키, 카라마조프의 형제들" + }, + { + "text": "사랑하라, 그러면 당신은 필요한 모든 것을 가지게 된다.", + "author": "도스토옙스키, 카라마조프의 형제들" + }, + { + "text": "겸손한 자만이 진정으로 자유롭다.", + "author": "도스토옙스키, 죄와 벌" + }, + { + "text": "인간의 심연에는 항상 선한 무언가가 남아 있다.", + "author": "도스토옙스키, 카라마조프의 형제들" + }, + { + "text": "행복해지고 싶다면 먼저 고통과 친해져라.", + "author": "도스토옙스키, 지하 생활자의 수기" + }, + { + "text": "부조리한 세상에서 의미를 찾는 것이 인간의 위대한 도전이다.", + "author": "카뮈, 시지프 신화" + }, + { + "text": "행복해지는 것은 그냥 오지 않는다. 그것은 선택이다.", + "author": "카뮈, 이방인" + }, + { + "text": "가을은 두 번째 봄이다. 모든 잎이 꽃이 된다.", + "author": "카뮈, 수첩" + }, + { + "text": "자유란 더 나은 것을 선택할 기회를 갖는 것이다.", + "author": "카뮈, 반항하는 인간" + }, + { + "text": "삶은 그 자체로 충분히 아름답다.", + "author": "카뮈, 시지프 신화" + }, + { + "text": "완벽한 것이란 없다. 다만 더 나은 것이 있을 뿐이다.", + "author": "생텍쥐페리, 어린 왕자" + }, + { + "text": "사막이 아름다운 것은 어딘가에 샘물이 숨겨져 있기 때문이야.", + "author": "생텍쥐페리, 어린 왕자" + }, + { + "text": "진정으로 중요한 것은 눈에 보이지 않아. 마음으로만 볼 수 있어.", + "author": "생텍쥐페리, 어린 왕자" + }, + { + "text": "네가 길들인 것에 대해 너는 영원히 책임이 있어.", + "author": "생텍쥐페리, 어린 왕자" + }, + { + "text": "어른들은 모든 것에 숫자를 붙이려 한다.", + "author": "생텍쥐페리, 어린 왕자" + }, + { + "text": "우리가 사랑하는 사람들을 통해서 우리는 아름다워진다.", + "author": "타고르, 기탄잘리" + }, + { + "text": "삶은 다양성 속에서 더욱 풍요로워진다.", + "author": "타고르, 기탄잘리" + }, + { + "text": "사랑의 선물은 물질이 아니라 존재 자체다.", + "author": "타고르, 기탄잘리" + }, + { + "text": "모든 어린이는 신이 인간에게 아직 낙담하지 않았다는 메시지다.", + "author": "타고르, 비행하는 인간" + }, + { + "text": "삶은 주어지는 것이 아니라 살아가는 것이다.", + "author": "타고르, 기탄잘리" + }, + { + "text": "상상력은 지식보다 중요하다.", + "author": "아인슈타인, 인터뷰 1929년" + }, + { + "text": "삶은 자전거를 타는 것과 같다. 균형을 잡으려면 계속 움직여야 한다.", + "author": "아인슈타인, 편지 1930년" + }, + { + "text": "실수를 한 번도 하지 않은 사람은 한 번도 새로운 일을 시도하지 않은 사람이다.", + "author": "아인슈타인, 격언집" + }, + { + "text": "논리는 A에서 B까지 데려다주지만, 상상력은 어디든 데려다준다.", + "author": "아인슈타인, 강연 1929년" + }, + { + "text": "어제의 문제는 그것을 만든 것과 같은 수준의 사고로는 해결할 수 없다.", + "author": "아인슈타인, 격언집" + }, + { + "text": "호기심은 저절로 사라지지 않는다. 호기심을 지켜라.", + "author": "아인슈타인, 인터뷰 1955년" + }, + { + "text": "세상을 이해하는 방법은 두 가지뿐이다. 아무것도 기적이 아닌 것처럼 살거나, 모든 것이 기적인 것처럼 사는 것이다.", + "author": "아인슈타인, 격언집" + }, + { + "text": "지성과 성격의 진정한 부호는 교육이다.", + "author": "아인슈타인, 학교와 인격에 관하여" + }, + { + "text": "인생에서 가장 중요한 것은 끝없이 질문하는 것이다.", + "author": "아인슈타인, 격언집" + }, + { + "text": "단순하게 살아라. 할 수 있는 한 단순하게.", + "author": "아인슈타인, 편지" + }, + { + "text": "과학 없는 종교는 맹목적이고, 종교 없는 과학은 절름발이다.", + "author": "아인슈타인, 과학과 종교" + }, + { + "text": "과학에서 가장 아름다운 것은 그것이 결코 완성되지 않는다는 사실이다.", + "author": "아인슈타인, 강연" + }, + { + "text": "창의성은 규칙을 알고 난 뒤 그것을 깨는 것이다.", + "author": "아인슈타인, 인터뷰" + }, + { + "text": "위기는 위험과 기회를 동시에 내포한다.", + "author": "아인슈타인, 강연" + }, + { + "text": "나는 미래를 예측하지 않는다. 가능성을 인식할 뿐이다.", + "author": "아인슈타인, 강연" + }, + { + "text": "과학에서 가장 아름다운 것은 그것이 결코 완성되지 않는다는 사실이다.", + "author": "마리 퀴리, 일기" + }, + { + "text": "두려워할 것은 아무것도 없다. 이해해야 할 것만 있을 뿐이다.", + "author": "마리 퀴리, 강연" + }, + { + "text": "호기심이야말로 과학의 첫 번째 덕목이다.", + "author": "마리 퀴리, 일기" + }, + { + "text": "삶은 두려워해야 할 것이 아니라 이해해야 할 것이다.", + "author": "마리 퀴리, 연설" + }, + { + "text": "어떤 일도 쉽게 이루어지지 않는다. 삶에서 쉬운 것은 아무것도 없다.", + "author": "마리 퀴리, 자서전" + }, + { + "text": "나는 지금 내가 하는 일 외에 더 나은 방법을 모른다.", + "author": "마리 퀴리, 편지" + }, + { + "text": "포기하지 말아야 한다는 것을 믿어야 한다.", + "author": "마리 퀴리, 자서전" + }, + { + "text": "어린 시절 호기심이 이미 내 운명을 결정했다.", + "author": "마리 퀴리, 자서전" + }, + { + "text": "과학자에게 조국은 세계다.", + "author": "마리 퀴리, 강연" + }, + { + "text": "성공의 비결은 단 하나, 절대 포기하지 않는 것이다.", + "author": "마리 퀴리, 일기" + }, + { + "text": "지식이 축적될수록 더 많은 것을 모른다는 사실을 깨닫는다.", + "author": "찰스 다윈, 자서전" + }, + { + "text": "살아남는 종은 가장 강한 것이 아니다. 변화에 가장 잘 적응하는 것이다.", + "author": "찰스 다윈, 종의 기원" + }, + { + "text": "무지는 지식보다 더 자주 확신을 낳는다.", + "author": "찰스 다윈, 인간의 유래" + }, + { + "text": "자연을 이해하는 것이 자연을 사랑하는 길이다.", + "author": "찰스 다윈, 비글호 항해기" + }, + { + "text": "크고 작은 발견은 모두 끈질긴 관찰에서 비롯된다.", + "author": "찰스 다윈, 자서전" + }, + { + "text": "주의 깊게 관찰하는 것이 이해의 시작이다.", + "author": "찰스 다윈, 자서전" + }, + { + "text": "과학은 지식이 아니라 질문하는 방식이다.", + "author": "리처드 파인만, 과학이란 무엇인가" + }, + { + "text": "모른다고 인정하는 것이 지식의 첫걸음이다.", + "author": "리처드 파인만, 파인만씨 농담도 잘 하시네" + }, + { + "text": "공부는 이해하기 위한 것이지 시험을 위한 것이 아니다.", + "author": "리처드 파인만, 강연" + }, + { + "text": "자연은 우리의 상상보다 더 상상력이 넘친다.", + "author": "리처드 파인만, 강연" + }, + { + "text": "지식의 핵심은 언제 모르는지를 아는 것이다.", + "author": "리처드 파인만, 과학의 가치" + }, + { + "text": "가르치는 가장 좋은 방법은 직접 해보는 것이다.", + "author": "리처드 파인만, 강연" + }, + { + "text": "단순한 것이 항상 아름다운 것은 아니지만, 아름다운 것은 항상 단순하다.", + "author": "리처드 파인만, 물리 법칙의 특성" + }, + { + "text": "궁금증이야말로 과학자의 가장 중요한 자산이다.", + "author": "리처드 파인만, 강연" + }, + { + "text": "경영이란 올바른 일을 하는 것이고, 관리란 일을 올바르게 하는 것이다.", + "author": "피터 드러커, 경영의 실제" + }, + { + "text": "미래를 예측하는 가장 좋은 방법은 그것을 만드는 것이다.", + "author": "피터 드러커, 경영의 실제" + }, + { + "text": "리더십의 핵심은 사람들이 올바른 일을 하도록 돕는 것이다.", + "author": "피터 드러커, 리더십" + }, + { + "text": "측정할 수 없으면 관리할 수 없다.", + "author": "피터 드러커, 경영의 실제" + }, + { + "text": "혁신은 발명이 아니라 새로운 가치를 창조하는 것이다.", + "author": "피터 드러커, 혁신과 기업가정신" + }, + { + "text": "첫 번째 질문은 무엇을 해야 하는가가 아니라, 무엇이 옳은가다.", + "author": "피터 드러커, 경영의 실제" + }, + { + "text": "결과를 내지 못하는 지식은 단순한 정보에 불과하다.", + "author": "피터 드러커, 지식근로자" + }, + { + "text": "가장 효율적인 일은 하지 말아야 할 일을 하지 않는 것이다.", + "author": "피터 드러커, 경영의 실제" + }, + { + "text": "인생에서 가장 중요한 것은 계획이 아니라 우선순위다.", + "author": "피터 드러커, 경영의 실제" + }, + { + "text": "강점을 살리고 약점을 관리하라.", + "author": "피터 드러커, 자기경영노트" + }, + { + "text": "단순한 것이 아름답다.", + "author": "스티브 잡스, 애플 디자인 철학" + }, + { + "text": "가장 중요한 것에 집중하면 나머지는 저절로 따라온다.", + "author": "스티브 잡스, 스탠퍼드 졸업식 연설" + }, + { + "text": "혁신은 아니오라고 말하는 것이다.", + "author": "스티브 잡스, 인터뷰" + }, + { + "text": "점들은 앞을 보면서 연결할 수 없다. 뒤를 돌아보면서만 연결할 수 있다.", + "author": "스티브 잡스, 스탠퍼드 졸업식 연설" + }, + { + "text": "굶주림을 유지하고 어리석음을 유지하라.", + "author": "스티브 잡스, 스탠퍼드 졸업식 연설" + }, + { + "text": "훌륭한 제품을 만들기 위해 열정이 필요하다.", + "author": "스티브 잡스, 인터뷰" + }, + { + "text": "자신이 좋아하는 일을 찾아라. 그것이 유일한 성공의 방법이다.", + "author": "스티브 잡스, 스탠퍼드 졸업식 연설" + }, + { + "text": "죽음은 아마도 삶이 만든 가장 위대한 발명품일 것이다.", + "author": "스티브 잡스, 스탠퍼드 졸업식 연설" + }, + { + "text": "인류의 진보는 항상 불가능을 불사르는 소수의 꿈꾸는 자들 덕분이었다.", + "author": "레오나르도 다빈치, 회화론" + }, + { + "text": "학문을 위해 사는 것이 가장 값진 삶이다.", + "author": "레오나르도 다빈치, 노트" + }, + { + "text": "단순함은 궁극의 정교함이다.", + "author": "레오나르도 다빈치, 노트" + }, + { + "text": "실행 없는 지식은 쓸모가 없다.", + "author": "레오나르도 다빈치, 노트" + }, + { + "text": "장애물은 목표의 크기에 비례한다.", + "author": "레오나르도 다빈치, 노트" + }, + { + "text": "하루를 잘 보내면 행복하게 잠들 수 있다.", + "author": "레오나르도 다빈치, 노트" + }, + { + "text": "경험은 모든 지혜의 어머니다.", + "author": "레오나르도 다빈치, 회화론" + }, + { + "text": "완성은 세부 사항에 있지만, 완성은 세부 사항이 아니다.", + "author": "레오나르도 다빈치, 회화론" + }, + { + "text": "조각은 산을 제거하는 것이 아니라 불필요한 것을 제거하는 것이다.", + "author": "미켈란젤로, 전기" + }, + { + "text": "나는 아직도 배우고 있다.", + "author": "미켈란젤로, 만년의 말" + }, + { + "text": "모든 장애물은 의지 앞에 무너진다.", + "author": "미켈란젤로, 편지" + }, + { + "text": "위험이 있는 곳에만 안전이 있다.", + "author": "미켈란젤로, 전기" + }, + { + "text": "만족이야말로 진정한 부다.", + "author": "미켈란젤로" + }, + { + "text": "음악은 마음의 언어다.", + "author": "베토벤, 편지" + }, + { + "text": "자유롭게 살거나 죽음을 선택하라.", + "author": "베토벤, 영웅 교향곡 헌정 서문" + }, + { + "text": "고통을 통해서만 기쁨이 온다.", + "author": "베토벤, 편지" + }, + { + "text": "음악은 모든 지식과 철학보다 더 높은 계시다.", + "author": "베토벤, 편지" + }, + { + "text": "힘에서 나오는 것만이 오래 지속된다.", + "author": "베토벤, 편지" + }, + { + "text": "예술은 삶의 진리를 드러내는 것이다.", + "author": "피카소, 인터뷰" + }, + { + "text": "모든 어린이는 예술가다. 어른이 되어서도 예술가로 남는 것이 문제다.", + "author": "피카소, 인터뷰" + }, + { + "text": "영감은 일할 때 찾아온다.", + "author": "피카소, 인터뷰" + }, + { + "text": "행동이 의미를 창조한다.", + "author": "피카소, 인터뷰" + }, + { + "text": "나는 존재하는 것을 그리지 않고, 생각하는 것을 그린다.", + "author": "피카소, 인터뷰" + }, + { + "text": "좋은 예술가는 빌리고, 위대한 예술가는 훔친다.", + "author": "피카소, 인터뷰" + }, + { + "text": "창조는 파괴에서 시작된다.", + "author": "피카소, 인터뷰" + }, + { + "text": "나는 나비처럼 날아서 벌처럼 쏜다.", + "author": "무하마드 알리, 경기 전 인터뷰" + }, + { + "text": "불가능은 사실이 아니다. 그것은 의견에 불과하다.", + "author": "무하마드 알리, 자서전" + }, + { + "text": "챔피언은 체육관에서 만들어지지 않는다. 내면 깊은 곳에 있는 무언가로 만들어진다.", + "author": "무하마드 알리, 자서전" + }, + { + "text": "서비스는 이 땅에 사는 대가다.", + "author": "무하마드 알리, 인터뷰" + }, + { + "text": "자신을 믿지 않는 자가 어떻게 믿음을 다른 사람에게 전할 수 있겠는가.", + "author": "무하마드 알리, 인터뷰" + }, + { + "text": "오늘의 고통은 내일의 힘이다.", + "author": "무하마드 알리, 훈련 중 발언" + }, + { + "text": "가장 힘든 싸움은 자기 자신과의 싸움이다.", + "author": "무하마드 알리, 자서전" + }, + { + "text": "위기는 준비된 자에게 기회가 된다.", + "author": "무하마드 알리" + }, + { + "text": "두려움이 없는 것이 아니라 두려움에도 불구하고 행동하는 것이 용기다.", + "author": "무하마드 알리, 인터뷰" + }, + { + "text": "도전하지 않으면 아무것도 얻을 수 없다.", + "author": "무하마드 알리, 자서전" + }, + { + "text": "한계는 마음속에만 존재한다.", + "author": "마이클 조던, 인터뷰" + }, + { + "text": "나는 9000번 이상 슛을 실패했다. 그래서 내가 성공했다.", + "author": "마이클 조던, 나이키 광고" + }, + { + "text": "포기는 절대 선택이 아니다.", + "author": "마이클 조던, 자서전" + }, + { + "text": "최고의 선수가 되고 싶다면 최고처럼 연습해야 한다.", + "author": "마이클 조던, 인터뷰" + }, + { + "text": "성공은 우연이 아니다. 열심히 일하고 인내하며 배우고 희생하는 것이다.", + "author": "마이클 조던, 자서전" + }, + { + "text": "팀이 이기는 것이 개인이 이기는 것보다 더 가치 있다.", + "author": "마이클 조던, 인터뷰" + }, + { + "text": "재능은 게임에서 이기게 하지만, 팀워크와 지성은 챔피언십에서 이기게 한다.", + "author": "마이클 조던, 인터뷰" + }, + { + "text": "결국 열심히 한 것이 결코 배신하지 않는다.", + "author": "마이클 조던" + }, + { + "text": "두려움을 이겨내면 또 다른 나를 만나게 된다.", + "author": "마이클 조던, 인터뷰" + }, + { + "text": "오늘 할 수 있는 최선이 내일의 표준이 된다.", + "author": "마이클 조던, 자서전" + }, + { + "text": "낙관주의는 성취의 신앙이다. 희망 없이는 아무것도 이루어지지 않는다.", + "author": "헬렌 켈러, 낙관주의" + }, + { + "text": "인생은 대담한 모험이거나 아무것도 아니다.", + "author": "헬렌 켈러, 두려움 없이" + }, + { + "text": "최선의 것들은 보이지도 만져지지도 않는다. 마음으로만 느낄 수 있다.", + "author": "헬렌 켈러, 편지" + }, + { + "text": "기쁨의 문이 닫히면 다른 문이 열린다.", + "author": "헬렌 켈러, 자서전" + }, + { + "text": "한 사람이 친절하게 행동하면 세상이 조금씩 나아진다.", + "author": "헬렌 켈러, 강연" + }, + { + "text": "사람들이 그들에 대해 어떻게 생각하는지보다 어떻게 느끼는지가 더 중요하다.", + "author": "헬렌 켈러, 강연" + }, + { + "text": "불행은 도전을 받아들이는 것에서 작아진다.", + "author": "헬렌 켈러, 낙관주의" + }, + { + "text": "인류의 진보는 진실과 정의에 대한 믿음에 달려 있다.", + "author": "헬렌 켈러, 연설" + }, + { + "text": "오늘 할 수 있는 선한 일을 내일로 미루지 말라.", + "author": "헬렌 켈러, 강연" + }, + { + "text": "나는 눈이 보이지 않지만 상상하는 능력은 무한하다.", + "author": "헬렌 켈러, 자서전" + }, + { + "text": "내 사람들이 자유로워질 때까지 나는 자유롭지 않다.", + "author": "마야 앤젤루, 인터뷰" + }, + { + "text": "사람들은 당신이 한 말을 잊겠지만, 당신이 준 느낌은 기억한다.", + "author": "마야 앤젤루, 강연" + }, + { + "text": "쓰러질 수 있지만 일어서는 것이 중요하다.", + "author": "마야 앤젤루, 시" + }, + { + "text": "평범한 것을 특별하게 만드는 능력이 창의성이다.", + "author": "마야 앤젤루, 인터뷰" + }, + { + "text": "더 잘 알게 되면 더 잘할 수 있다.", + "author": "마야 앤젤루, 오프라 인터뷰" + }, + { + "text": "용기는 두려움이 없는 것이 아니다. 두려움을 극복하고 행동하는 것이다.", + "author": "마야 앤젤루, 강연" + }, + { + "text": "이야기는 사람을 묶어주는 가장 강력한 힘이다.", + "author": "마야 앤젤루, 강연" + }, + { + "text": "성공은 좋아하는 것이 아니라 사랑하는 것을 통해 온다.", + "author": "마야 앤젤루, 인터뷰" + }, + { + "text": "인생의 목적은 살아있음을 느끼는 것이다.", + "author": "마야 앤젤루, 강연" + }, + { + "text": "다양성은 삶의 조미료가 아니라 필수 요소다.", + "author": "마야 앤젤루, 강연" + }, + { + "text": "세상에서 가장 위험한 것은 침묵이다.", + "author": "에밀 졸라, 나는 고발한다" + }, + { + "text": "무엇이든 그것이 진정으로 가치 있다면, 그것은 그 자체를 위해 사랑받아야 한다.", + "author": "빅토르 위고, 레미제라블" + }, + { + "text": "인간의 내면은 어떤 운명보다 더 깊다.", + "author": "빅토르 위고, 레미제라블" + }, + { + "text": "역사의 흐름을 막으려는 자는 그 흐름에 쓸려간다.", + "author": "빅토르 위고, 연설" + }, + { + "text": "진정한 발견의 여행은 새로운 풍경을 찾는 것이 아니라 새로운 눈을 갖는 것이다.", + "author": "마르셀 프루스트, 잃어버린 시간을 찾아서" + }, + { + "text": "모든 위대한 인물은 내면에 아이를 품고 있다.", + "author": "프리드리히 니체, 차라투스트라는 이렇게 말했다" + }, + { + "text": "삶의 의미를 아는 사람은 어떤 시련도 견딜 수 있다.", + "author": "빅토르 프랭클, 죽음의 수용소에서" + }, + { + "text": "인간의 마지막 자유는 어떤 환경에서도 자신의 태도를 선택하는 것이다.", + "author": "빅토르 프랭클, 죽음의 수용소에서" + }, + { + "text": "의미를 찾는 것이 인간의 가장 근본적인 동기다.", + "author": "빅토르 프랭클, 죽음의 수용소에서" + }, + { + "text": "건강은 가장 큰 재산이고, 만족은 최고의 부이며, 신뢰는 최고의 인간관계다.", + "author": "붓다, 담마파다" + }, + { + "text": "분노는 불씨를 던지는 사람의 손을 먼저 태운다.", + "author": "붓다, 법구경" + }, + { + "text": "평화는 내면에서 온다. 밖에서 찾지 말라.", + "author": "붓다, 법구경" + }, + { + "text": "어떤 사람도 두 번 같은 강물에 발을 담글 수 없다.", + "author": "헤라클레이토스, 단편" + }, + { + "text": "성격은 운명이다.", + "author": "헤라클레이토스, 단편" + }, + { + "text": "모든 것은 흐른다.", + "author": "헤라클레이토스, 단편" + }, + { + "text": "보이는 조화보다 보이지 않는 조화가 더 강하다.", + "author": "헤라클레이토스, 단편" + }, + { + "text": "언어의 한계가 나의 세계의 한계를 의미한다.", + "author": "루트비히 비트겐슈타인, 논리철학론" + }, + { + "text": "말할 수 없는 것에 대해서는 침묵해야 한다.", + "author": "루트비히 비트겐슈타인, 논리철학론" + }, + { + "text": "현실을 있는 그대로 보라. 당신이 원하는 대로가 아니라.", + "author": "헨리 데이비드 소로, 월든" + }, + { + "text": "인생에서 가장 중요한 사실은 다수의 의견이 아니다.", + "author": "헨리 데이비드 소로, 시민 불복종" + }, + { + "text": "자신의 길을 걷는 사람을 두려워하지 말라.", + "author": "헨리 데이비드 소로, 월든" + }, + { + "text": "사회의 풍요가 아닌 내면의 풍요를 추구하라.", + "author": "헨리 데이비드 소로, 월든" + }, + { + "text": "시대의 반항아가 시대를 바꾼다.", + "author": "헨리 데이비드 소로, 시민 불복종" + }, + { + "text": "모든 진리는 처음에는 이단이었다.", + "author": "조르다노 브루노, 재판 발언" + }, + { + "text": "지식은 힘이다.", + "author": "프랜시스 베이컨, 명상록" + }, + { + "text": "먼저 이해하려 하고, 그다음에 이해받으려 하라.", + "author": "스티브 코비, 성공하는 사람들의 7가지 습관" + }, + { + "text": "주도적으로 행동하라. 삶의 결과는 환경이 아니라 선택에서 온다.", + "author": "스티브 코비, 성공하는 사람들의 7가지 습관" + }, + { + "text": "시너지는 단순한 협력 그 이상이다.", + "author": "스티브 코비, 성공하는 사람들의 7가지 습관" + }, + { + "text": "끝을 생각하며 시작하라.", + "author": "스티브 코비, 성공하는 사람들의 7가지 습관" + }, + { + "text": "두 길이 숲 속에서 갈라졌다. 나는 덜 다닌 길을 선택했다.", + "author": "로버트 프로스트, 가지 않은 길" + }, + { + "text": "삶은 가까이서 보면 비극이지만 멀리서 보면 희극이다.", + "author": "찰리 채플린, 인터뷰" + }, + { + "text": "진정한 용기는 고독 속에서 드러난다.", + "author": "어니스트 헤밍웨이, 무기여 잘 있거라" + }, + { + "text": "압박감 속에서의 우아함이 진정한 용기다.", + "author": "어니스트 헤밍웨이, 태양은 다시 뜬다" + }, + { + "text": "모든 초고는 쓰레기다. 하지만 그것이 시작이다.", + "author": "어니스트 헤밍웨이, 편지" + }, + { + "text": "사람은 파괴될 수 있지만, 패배할 수는 없다.", + "author": "어니스트 헤밍웨이, 노인과 바다" + }, + { + "text": "작가의 의무는 진실을 말하는 것이다.", + "author": "조지 오웰, 나는 왜 쓰는가" + }, + { + "text": "아름다운 것은 영원한 기쁨이다.", + "author": "존 키츠, 엔디미온" + }, + { + "text": "세상은 책이고, 여행하지 않는 자는 단 한 페이지만 읽은 것이다.", + "author": "아우구스티누스, 고백록" + }, + { + "text": "우리는 모두 별의 먼지로 이루어져 있다.", + "author": "칼 세이건, 코스모스" + }, + { + "text": "우주는 우리를 이해하기 위해 우리를 창조했다.", + "author": "칼 세이건, 코스모스" + }, + { + "text": "회의주의는 지식의 전제조건이다.", + "author": "칼 세이건, 악령이 출몰하는 세상" + }, + { + "text": "어딘가에 무언가 믿을 수 없을 정도로 아름다운 것이 알려지기를 기다리고 있다.", + "author": "칼 세이건, 코스모스" + }, + { + "text": "창의력은 생각들 사이에 연결을 만드는 것이다.", + "author": "스티브 잡스, 와이어드 인터뷰" + }, + { + "text": "가장 어두운 순간에도 빛을 찾을 수 있다면 그것이 진정한 용기다.", + "author": "알베르 슈바이처, 인터뷰" + }, + { + "text": "인생의 목적은 행복이 아니라 유용함이다.", + "author": "랄프 왈도 에머슨, 수필집" + }, + { + "text": "자신감은 첫 번째 성공의 비결이다.", + "author": "랄프 왈도 에머슨, 수필집" + }, + { + "text": "그 어떤 위대한 업적도 열정 없이 이루어지지 않았다.", + "author": "랄프 왈도 에머슨, 수필집" + }, + { + "text": "세상은 당신이 생각하는 것보다 훨씬 더 넓다.", + "author": "마크 트웨인, 인터뷰" + }, + { + "text": "삶에서 가장 중요한 두 날은 태어난 날과 왜 태어났는지 깨닫는 날이다.", + "author": "마크 트웨인, 인터뷰" + }, + { + "text": "한 권의 책은 배가 되어 세상의 모든 것을 담을 수 있다.", + "author": "마르쿠스 툴리우스 키케로, 연설집" + }, + { + "text": "인생의 비극은 죽음에 있지 않다. 살아 있으면서 죽어가는 것이 비극이다.", + "author": "알버트 슈바이처, 강연" + }, + { + "text": "다른 사람의 신발을 신어보기 전에는 그를 판단하지 말라.", + "author": "하퍼 리, 앵무새 죽이기" + }, + { + "text": "과거의 나를 용서하는 것이 미래의 나를 해방시킨다.", + "author": "C.S. 루이스, 순전한 기독교" + }, + { + "text": "눈물은 단어들로는 표현할 수 없는 말들이다.", + "author": "빅토르 위고, 레미제라블" + }, + { + "text": "진정한 사랑은 상대방을 있는 그대로 받아들이는 것이다.", + "author": "레프 톨스토이, 전쟁과 평화" + }, + { + "text": "호기심 없이는 발견도 없다.", + "author": "마리 퀴리, 강연" + }, + { + "text": "끝없는 노력이 결국 탁월함을 만든다.", + "author": "빈센트 반 고흐, 편지" + }, + { + "text": "색은 나에게 삶이다.", + "author": "빈센트 반 고흐, 편지" + }, + { + "text": "예술은 위로이자 치유다.", + "author": "빈센트 반 고흐, 편지" + }, + { + "text": "깊이 느끼는 자만이 깊이 표현할 수 있다.", + "author": "빈센트 반 고흐, 편지" + }, + { + "text": "가장 위대한 글은 가장 단순한 단어로 쓰여진다.", + "author": "레프 톨스토이, 참회록" + }, + { + "text": "고통은 창조의 어머니다.", + "author": "표도르 도스토옙스키, 작가 일기" + }, + { + "text": "나는 생각한다. 고로 나는 존재한다.", + "author": "르네 데카르트, 방법서설" + }, + { + "text": "모든 것을 의심하라. 의심 끝에 진리가 있다.", + "author": "르네 데카르트, 방법서설" + }, + { + "text": "잘 사는 것은 최선의 복수다.", + "author": "프랜시스 베이컨, 수필집" + }, + { + "text": "돈으로는 행복을 살 수 없지만 더 많은 불행을 막을 수는 있다.", + "author": "버트런드 러셀, 행복의 정복" + }, + { + "text": "평범한 삶을 탁월하게 살아라.", + "author": "헨리 데이비드 소로, 월든" + }, + { + "text": "인간이 될 수 있는 최대치가 되어라.", + "author": "프리드리히 니체, 인간적인 너무나 인간적인" + }, + { + "text": "고통을 통해 우리는 성장한다.", + "author": "프리드리히 니체, 즐거운 학문" + }, + { + "text": "자신을 사랑하는 것이 오랜 사랑의 시작이다.", + "author": "오스카 와일드, 진지함의 중요성" + }, + { + "text": "우리 모두는 시궁창 속에 살지만 그 중 몇몇은 별을 바라본다.", + "author": "오스카 와일드, 윈더미어 부인의 부채" + }, + { + "text": "경험은 모든 사람에게 각자 다른 이름을 준다.", + "author": "오스카 와일드, 도리언 그레이의 초상" + }, + { + "text": "진실보다 아름다운 것은 없다.", + "author": "귀스타브 플로베르, 편지" + }, + { + "text": "글쓰기는 내 존재의 방식이다.", + "author": "귀스타브 플로베르, 편지" + }, + { + "text": "우정은 매일 함께하는 것이 아니라 필요할 때 함께하는 것이다.", + "author": "파울로 코엘료, 연금술사" + }, + { + "text": "세상은 당신이 꿈꾸는 모든 것을 갖고 있다.", + "author": "파울로 코엘료, 연금술사" + }, + { + "text": "자신의 전설을 살아가라.", + "author": "파울로 코엘료, 연금술사" + }, + { + "text": "우리는 더불어 살아가도록 만들어졌다.", + "author": "데즈먼드 투투, 강연" + }, + { + "text": "용서는 과거를 잊는 것이 아니라 과거에 지배받지 않는 것이다.", + "author": "데즈먼드 투투, 용서 없이 미래 없다" + }, + { + "text": "작은 사람들이 작은 장소에서 작은 일을 함께 하면 세상을 바꿀 수 있다.", + "author": "에두아르도 갈레아노, 라틴 아메리카의 열린 혈관" + }, + { + "text": "말이 세상을 만든다.", + "author": "카를 야스퍼스, 철학적 자서전" + }, + { + "text": "공감은 세상에서 가장 강력한 힘이다.", + "author": "루스 베네딕트, 문화의 패턴" + }, + { + "text": "인간의 탁월함은 다름에 있다.", + "author": "한나 아렌트, 인간의 조건" + }, + { + "text": "자유는 자신의 인생 이야기의 저자가 되는 것이다.", + "author": "한나 아렌트, 인간의 조건" + }, + { + "text": "역사는 반복되지 않지만 운율을 맞춘다.", + "author": "마크 트웨인, 격언집" + }, + { + "text": "인생은 짧고 예술은 길다.", + "author": "히포크라테스, 금언집" + }, + { + "text": "우리는 무엇을 할 수 있는지를 알기 위해 무엇을 할 수 없는지를 알아야 한다.", + "author": "칸트, 순수이성비판" + }, + { + "text": "두려움은 성장의 안내자다.", + "author": "수전 제퍼스, 두려워하면서도 하라" + }, + { + "text": "위기란 더 나은 방향으로 가는 문이다.", + "author": "알베르 카뮈, 반항하는 인간" + }, + { + "text": "삶이 나에게 레몬을 주면 나는 레모네이드를 만든다.", + "author": "데일 카네기, 인간관계론" + }, + { + "text": "남에게 관심을 가지면 두 달 만에 더 많은 친구를 사귈 수 있다.", + "author": "데일 카네기, 인간관계론" + }, + { + "text": "강점에 집중하면 약점은 스스로 약해진다.", + "author": "피터 드러커, 경영의 본질" + }, + { + "text": "변화를 이끄는 자가 미래를 지배한다.", + "author": "피터 드러커, 미래경영" + }, + { + "text": "실패는 성공의 기초를 쌓는 과정이다.", + "author": "헨리 포드, 자서전" + }, + { + "text": "장애물은 아직 해결책을 찾지 못한 문제일 뿐이다.", + "author": "헨리 포드, 자서전" + }, + { + "text": "인간이 꿈꿀 수 있다면 그 꿈은 이루어질 수 있다.", + "author": "월트 디즈니, 인터뷰" + }, + { + "text": "첫 번째 브레이크스루는 언제나 불가능해 보인다.", + "author": "월트 디즈니, 인터뷰" + }, + { + "text": "어려운 일은 반드시 쉬운 것처럼 보이게 해야 한다.", + "author": "프레드 아스테어, 인터뷰" + }, + { + "text": "진정한 걸작은 노력과 시간의 산물이다.", + "author": "레오나르도 다빈치, 회화론" + }, + { + "text": "생각하는 것을 두려워하지 말라. 생각이 행동을 만든다.", + "author": "마거릿 미드, 문화와 인간}," + }, + { + "text": "세상을 변화시킬 수 있다고 생각하는 소수의 사람들만이 실제로 변화시킨다.", + "author": "마거릿 미드, 인터뷰" + }, + { + "text": "스스로를 과소평가하지 말라. 당신이 생각하는 것보다 훨씬 강하다.", + "author": "오프라 윈프리, 강연" + }, + { + "text": "실패는 또 다른 시작이다.", + "author": "오프라 윈프리, 강연" + }, + { + "text": "배우지 않는 자는 노인이 되고, 배우는 자는 젊음을 유지한다.", + "author": "헨리 포드, 자서전" + }, + { + "text": "인내는 쓰지만 그 열매는 달다.", + "author": "장 자크 루소, 에밀" + }, + { + "text": "인간은 자유롭게 태어났으나 어디서나 사슬에 묶여 있다.", + "author": "장 자크 루소, 사회계약론" + }, + { + "text": "진정한 교육은 마음의 문을 여는 것이다.", + "author": "장 자크 루소, 에밀" + }, + { + "text": "사회는 자연스러운 인간을 타락시킨다.", + "author": "장 자크 루소, 에밀" + }, + { + "text": "인류는 반드시 진보한다.", + "author": "볼테르, 캉디드" + }, + { + "text": "모든 것이 가능하다고 생각하는 사람만이 불가능한 것을 이룬다.", + "author": "볼테르, 철학 사전" + }, + { + "text": "어리석음은 이 세상에서 가장 흔한 것이다.", + "author": "볼테르, 철학 사전" + }, + { + "text": "나는 당신의 말에 동의하지 않지만 당신이 그 말을 할 권리를 위해 목숨을 걸겠다.", + "author": "볼테르, 친구에게 보낸 편지" + }, + { + "text": "모든 사람은 자신의 정원을 가꾸어야 한다.", + "author": "볼테르, 캉디드" + }, + { + "text": "위대한 사상은 오래된 것들을 새롭게 바라보는 데서 나온다.", + "author": "마르셀 프루스트, 잃어버린 시간을 찾아서" + }, + { + "text": "인간 본성의 핵심은 변화에 저항하는 것이다.", + "author": "찰스 다윈, 인간의 유래" + }, + { + "text": "배움의 자세를 잃지 않는 자가 언제나 젊다.", + "author": "헨리 데이비드 소로, 월든" + }, + { + "text": "배움이 열정을 만나면 세상을 바꾼다.", + "author": "칼 세이건, 코스모스" + }, + { + "text": "별을 바라보는 자가 땅의 방향을 잃지 않는다.", + "author": "오스카 와일드, 격언" + }, + { + "text": "가르침의 최고 형태는 모범을 보이는 것이다.", + "author": "알베르트 아인슈타인, 교육에 관하여" + }, + { + "text": "지금 당신이 서 있는 곳이 당신이 시작할 수 있는 유일한 곳이다.", + "author": "아서 애쉬, 인터뷰" + }, + { + "text": "끝없는 배움이 인생을 풍요롭게 만든다.", + "author": "소크라테스, 플라톤 대화록" + }, + { + "text": "지혜는 늙음의 보상이다.", + "author": "키케로, 노년에 관하여" + }, + { + "text": "행복이란 자신이 원하는 것을 원하는 것이다.", + "author": "버트런드 러셀, 행복의 정복" + }, + { + "text": "변화는 모든 진보의 시작이다.", + "author": "허버트 스펜서, 교육론" + }, + { + "text": "혁신은 리더와 추종자를 구분하는 기준이다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "훌륭한 일을 하는 유일한 방법은 자신이 하는 일을 사랑하는 것이다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "디자인은 단순히 어떻게 생겼는지가 아니라, 어떻게 작동하는지이다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "배고픔을 유지하라, 어리석음을 유지하라.", + "author": "스티브 잡스, 스탠퍼드 연설" + }, + { + "text": "오늘이 인생의 마지막 날이라면, 오늘 하려는 일을 할 것인가?", + "author": "스티브 잡스, Apple" + }, + { + "text": "단순함이야말로 궁극의 정교함이다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "당신의 시간은 한정되어 있다. 다른 사람의 인생을 살며 낭비하지 마라.", + "author": "스티브 잡스, 스탠퍼드 연설" + }, + { + "text": "위험을 감수하지 않는 것이 가장 큰 위험이다.", + "author": "마크 저커버그, Meta" + }, + { + "text": "완벽한 것보다 완성된 것이 낫다.", + "author": "마크 저커버그, Meta" + }, + { + "text": "가장 큰 위험은 아무런 위험도 감수하지 않는 것이다.", + "author": "마크 저커버그, Meta" + }, + { + "text": "빠르게 움직이고 깨뜨려라. 아무것도 깨뜨리지 않는다면, 충분히 빠르게 움직이지 않는 것이다.", + "author": "마크 저커버그, Meta" + }, + { + "text": "만약 당신이 무언가를 만드는 것에만 집중하고 있다면, 그것은 좋은 신호이다.", + "author": "마크 저커버그, Meta" + }, + { + "text": "고객의 말을 듣기 시작하면, 무엇이 가능한지 깨달을 수 있다.", + "author": "제프 베이조스, Amazon" + }, + { + "text": "두 가지 유형의 회사가 있다. 고객에게 더 많이 청구하려는 회사와, 더 적게 청구하려는 회사다.", + "author": "제프 베이조스, Amazon" + }, + { + "text": "발명하고 개척하는 자세를 유지하라. 실패를 즐기고, 씨앗을 뿌리고, 장기적으로 생각하라.", + "author": "제프 베이조스, Amazon" + }, + { + "text": "장기적인 관점에서 생각하면 고객과 주주의 이해관계는 일치한다.", + "author": "제프 베이조스, Amazon" + }, + { + "text": "후회 최소화 프레임워크: 80세가 되었을 때 후회할 일을 최소화하는 방향으로 결정하라.", + "author": "제프 베이조스, Amazon" + }, + { + "text": "어떤 사람들은 변화에 대해 꿈꾸고, 다른 사람들은 변화를 두려워한다. 세 번째 유형의 사람들은 변화를 만들어낸다.", + "author": "일론 머스크, Tesla/SpaceX" + }, + { + "text": "실패는 하나의 선택지이다. 만약 실패하지 않는다면, 충분히 혁신하고 있지 않은 것이다.", + "author": "일론 머스크, Tesla/SpaceX" + }, + { + "text": "끊임없이 생각하라. 어떻게 하면 더 잘할 수 있을까? 그리고 스스로에게 질문하라.", + "author": "일론 머스크, Tesla/SpaceX" + }, + { + "text": "인생이 너무 짧아서 장기적 원한을 품기엔 아깝다.", + "author": "일론 머스크, Tesla/SpaceX" + }, + { + "text": "무엇이든 충분히 미쳐야 한다. 그래야만 세상을 바꿀 수 있다.", + "author": "일론 머스크, Tesla/SpaceX" + }, + { + "text": "첫 번째 원칙으로 돌아가 생각하라. 유추로 추론하는 대신 근본부터 다시 구축하라.", + "author": "일론 머스크, Tesla/SpaceX" + }, + { + "text": "10배 더 좋은 것을 만들지 못한다면, 왜 그것을 만들고 있는가?", + "author": "래리 페이지, Google" + }, + { + "text": "사소해 보이는 아이디어를 절대 무시하지 마라. 그것이 세상을 바꿀 수 있다.", + "author": "래리 페이지, Google" + }, + { + "text": "만약 당신이 미래를 바꾸지 않는다면, 미래가 당신을 바꿀 것이다.", + "author": "세르게이 브린, Google" + }, + { + "text": "우리의 목표는 전 세계의 정보를 조직화하고 보편적으로 접근하고 유용하게 만드는 것이다.", + "author": "래리 페이지, Google" + }, + { + "text": "빠르게 배포하고, 자주 배포하라.", + "author": "리드 헤이스팅스, Netflix" + }, + { + "text": "규칙이 없는 것이 규칙이다. 자유와 책임을 동시에 부여하라.", + "author": "리드 헤이스팅스, Netflix" + }, + { + "text": "문화는 전략을 아침으로 먹는다.", + "author": "피터 드러커, 경영학의 아버지" + }, + { + "text": "미래를 예측하는 가장 좋은 방법은 미래를 만드는 것이다.", + "author": "피터 드러커, 경영학의 아버지" + }, + { + "text": "효율은 일을 올바르게 하는 것이고, 효과는 올바른 일을 하는 것이다.", + "author": "피터 드러커, 경영학의 아버지" + }, + { + "text": "지식 근로자의 생산성은 21세기 가장 중요한 관리 과제이다.", + "author": "피터 드러커, 경영학의 아버지" + }, + { + "text": "경쟁자를 두려워하지 마라. 이미 제품을 샀지만 불만족한 고객을 두려워하라.", + "author": "잭 마, Alibaba" + }, + { + "text": "오늘은 어렵고, 내일은 더 어렵지만, 모레는 아름다울 것이다.", + "author": "잭 마, Alibaba" + }, + { + "text": "기회는 항상 사람들이 불평하는 곳에 있다.", + "author": "잭 마, Alibaba" + }, + { + "text": "포기하지 않는 사람을 이기기란 어렵다.", + "author": "잭 마, Alibaba" + }, + { + "text": "과거를 바꿀 수 없다면, 미래를 바꿔라.", + "author": "팀 쿡, Apple" + }, + { + "text": "사람들은 당신이 한 말은 잊을 수 있지만, 당신이 그들에게 느끼게 한 감정은 절대 잊지 않는다.", + "author": "팀 쿡, Apple" + }, + { + "text": "위대한 소프트웨어를 만드는 것은 장인 정신이다.", + "author": "사티아 나델라, Microsoft" + }, + { + "text": "공감 능력은 혁신의 핵심 원천이다.", + "author": "사티아 나델라, Microsoft" + }, + { + "text": "고정 마인드셋에서 성장 마인드셋으로 전환하라.", + "author": "사티아 나델라, Microsoft" + }, + { + "text": "모든 것을 알 필요는 없다. 배우려는 자세만 있으면 된다.", + "author": "사티아 나델라, Microsoft" + }, + { + "text": "소프트웨어는 세상을 먹어치우고 있다.", + "author": "마크 앤드리슨, a16z" + }, + { + "text": "가장 좋은 제품은 만드는 사람이 직접 사용하고 싶어하는 제품이다.", + "author": "잭 도시, Twitter/Block" + }, + { + "text": "간결함은 제한이 아니라 해방이다.", + "author": "잭 도시, Twitter/Block" + }, + { + "text": "단순함 속에 진정한 복잡함이 있다.", + "author": "제프 래스킨, Macintosh 개발자" + }, + { + "text": "프로그래밍은 사고하는 것이지 타이핑하는 것이 아니다.", + "author": "케이시 파트턴, 프로그래머" + }, + { + "text": "좋은 코드는 그 자체로 최고의 문서이다.", + "author": "스티브 맥코넬, Code Complete" + }, + { + "text": "측정할 수 없으면 개선할 수 없다.", + "author": "피터 드러커, 경영학의 아버지" + }, + { + "text": "되돌아보면, 내가 저지른 최고의 결정은 항상 직관을 따른 것이었다.", + "author": "리드 호프만, LinkedIn" + }, + { + "text": "당신이 창피하지 않은 첫 제품을 출시했다면, 너무 늦게 출시한 것이다.", + "author": "리드 호프만, LinkedIn" + }, + { + "text": "강한 의견을 가지되, 약하게 붙잡아라. 새로운 증거가 나오면 기꺼이 바꿔라.", + "author": "제프 베이조스, Amazon" + }, + { + "text": "하드웨어가 진짜 현실이라면, 소프트웨어는 꿈이다.", + "author": "앨런 케이, Xerox PARC" + }, + { + "text": "미래를 진정으로 예측하고 싶다면, 직접 발명하라.", + "author": "앨런 케이, Xerox PARC" + }, + { + "text": "점은 항상 연결된다. 지금은 모를 수 있지만, 나중에 뒤돌아보면 분명히 보인다.", + "author": "스티브 잡스, 스탠퍼드 연설" + }, + { + "text": "기술은 어떤 문제가 중요한지 알려주지 않는다. 사람만이 그것을 알 수 있다.", + "author": "팀 버너스-리, WWW 발명자" + }, + { + "text": "웹은 인류를 위한 것이지, 기술을 위한 것이 아니다.", + "author": "팀 버너스-리, WWW 발명자" + }, + { + "text": "충분히 진보한 기술은 마법과 구별할 수 없다.", + "author": "아서 C. 클라크, SF 작가" + }, + { + "text": "컴퓨터가 모든 문제를 풀어줄 것이라 기대하지 마라. 올바른 질문을 하는 법을 배워라.", + "author": "리누스 토르발스, Linux" + }, + { + "text": "나는 재미삼아 이것을 만들었다. 나를 놀라게 한 것은 다른 사람들도 쓰기 시작한 것이다.", + "author": "리누스 토르발스, Linux" + }, + { + "text": "말은 싸다. 코드를 보여달라.", + "author": "리누스 토르발스, Linux" + }, + { + "text": "이 세상에서 확실한 것은 오직 변화뿐이다.", + "author": "선다르 피차이, Google" + }, + { + "text": "AI는 인류가 작업하는 가장 중요한 기술이 될 것이다.", + "author": "선다르 피차이, Google" + }, + { + "text": "인내심을 가져라. 좋은 것은 시간이 걸린다.", + "author": "젠슨 황, NVIDIA" + }, + { + "text": "고통과 인내가 성장을 만든다. 어려움을 피하지 마라.", + "author": "젠슨 황, NVIDIA" + }, + { + "text": "세상에는 두 부류의 사람이 있다. NVIDIA를 산 사람과 더 많이 사고 싶어하는 사람.", + "author": "젠슨 황, NVIDIA" + }, + { + "text": "당신이 할 수 있다고 생각하든, 할 수 없다고 생각하든, 당신이 옳다.", + "author": "헨리 포드, Ford Motor" + }, + { + "text": "실패는 더 현명하게 다시 시작할 기회일 뿐이다.", + "author": "헨리 포드, Ford Motor" + }, + { + "text": "함께 모이는 것이 시작이고, 함께 있는 것이 진보이며, 함께 일하는 것이 성공이다.", + "author": "헨리 포드, Ford Motor" + }, + { + "text": "사용자 경험은 모든 것이다.", + "author": "데이브 하플리, Airbnb" + }, + { + "text": "데이터는 21세기의 석유이다.", + "author": "클라이브 험비, Tesco Clubcard" + }, + { + "text": "AI의 진정한 위험은 지능이 아니라, 우리가 AI에 얼마나 의존하느냐이다.", + "author": "샘 올트만, OpenAI" + }, + { + "text": "앞으로 가장 중요한 기술은 인간의 능력을 확장하는 기술이 될 것이다.", + "author": "샘 올트만, OpenAI" + }, + { + "text": "최고의 엔지니어는 사용자의 문제를 가장 깊이 이해하는 사람이다.", + "author": "드류 휴스턴, Dropbox" + }, + { + "text": "걱정을 그만두고 시작하라. 완벽한 준비란 존재하지 않는다.", + "author": "드류 휴스턴, Dropbox" + }, + { + "text": "구글에서 배운 가장 중요한 것은 빠르게 실행하는 문화이다.", + "author": "마리사 메이어, 전 Yahoo CEO" + }, + { + "text": "창의성은 제한 속에서 꽃핀다.", + "author": "마리사 메이어, 전 Yahoo CEO" + }, + { + "text": "뛰어난 제품은 뛰어난 팀에서 나온다.", + "author": "쉐릴 샌드버그, 전 Meta COO" + }, + { + "text": "완성이란 더 이상 더할 것이 없는 것이 아니라, 더 이상 뺄 것이 없는 상태이다.", + "author": "앙투안 드 생텍쥐페리, 어린 왕자" + }, + { + "text": "사람은 처음 세 가지 이유로 소프트웨어를 사용한다. 그것이 문제를 해결하기 때문이다.", + "author": "폴 그레이엄, Y Combinator" + }, + { + "text": "스타트업의 생존 비결은 성장이다. 성장하면 모든 문제가 해결 가능해진다.", + "author": "폴 그레이엄, Y Combinator" + }, + { + "text": "사용자 100명이 진심으로 사랑하는 것이, 100만 명이 좋아하는 것보다 낫다.", + "author": "폴 그레이엄, Y Combinator" + }, + { + "text": "다른 사람이 탐욕스러울 때 두려워하고, 다른 사람이 두려워할 때 탐욕을 부려라.", + "author": "워런 버핏, 버크셔 주주 서한" + }, + { + "text": "가격은 당신이 지불하는 것이고, 가치는 당신이 얻는 것이다.", + "author": "워런 버핏, 버크셔 주주 서한" + }, + { + "text": "투자에서 가장 중요한 자질은 지능이 아니라 기질이다.", + "author": "워런 버핏, 인터뷰" + }, + { + "text": "명성을 쌓는 데는 20년이 걸리고 무너뜨리는 데는 5분이면 충분하다.", + "author": "워런 버핏, 인터뷰" + }, + { + "text": "누군가 그늘에 앉아 있는 것은 오래 전에 누군가가 나무를 심었기 때문이다.", + "author": "워런 버핏, 강연" + }, + { + "text": "잠자는 동안에도 돈을 벌 방법을 찾지 못하면 죽을 때까지 일하게 될 것이다.", + "author": "워런 버핏, 인터뷰" + }, + { + "text": "매일 잠자리에 들 때 아침에 일어났을 때보다 조금 더 현명해지려고 노력하라.", + "author": "찰리 멍거, 강연" + }, + { + "text": "인생에서 정말로 큰 것을 얻으려면 다른 사람의 신뢰를 받아야 한다.", + "author": "찰리 멍거, 인터뷰" + }, + { + "text": "머리가 좋은 것만으로는 부족하다. 이성적이어야 한다.", + "author": "찰리 멍거, 강연" + }, + { + "text": "거대한 부를 가지고 죽는 것은 수치스러운 일이다.", + "author": "앤드류 카네기, 부의 복음" + }, + { + "text": "보통 사람을 비범한 일을 하도록 이끄는 것이 리더십이다.", + "author": "앤드류 카네기, 자서전" + }, + { + "text": "천재는 1%의 영감과 99%의 노력으로 이루어진다.", + "author": "토마스 에디슨, 인터뷰" + }, + { + "text": "나는 실패한 것이 아니다. 작동하지 않는 만 가지 방법을 발견한 것이다.", + "author": "토마스 에디슨, 인터뷰" + }, + { + "text": "포기하지 않는 사람을 이길 수 있는 것은 아무것도 없다.", + "author": "토마스 에디슨, 인터뷰" + }, + { + "text": "성공의 가장 확실한 방법은 한 번 더 시도하는 것이다.", + "author": "토마스 에디슨, 인터뷰" + }, + { + "text": "기회는 대부분의 사람이 놓치는데, 작업복을 입고 일처럼 보이기 때문이다.", + "author": "토마스 에디슨, 인터뷰" + }, + { + "text": "현재는 그들의 것이지만, 내가 위해 일한 미래는 나의 것이다.", + "author": "니콜라 테슬라, 인터뷰" + }, + { + "text": "오늘의 과학자들은 깊이 생각하는 대신 명확하게 생각한다.", + "author": "니콜라 테슬라, 인터뷰" + }, + { + "text": "행복은 객관적 조건이 아니라 기대와의 상관관계에 달려 있다.", + "author": "유발 하라리, 사피엔스" + }, + { + "text": "바람을 예측하지 말고, 풍차를 만들어라.", + "author": "나심 탈레브, 안티프래질" + }, + { + "text": "단순함이 최고의 우아함이다.", + "author": "코코 샤넬, 인터뷰" + }, + { + "text": "패션은 사라지지만 스타일은 영원하다.", + "author": "코코 샤넬, 인터뷰" + }, + { + "text": "럭셔리란 편안해야 하는 것이다. 그렇지 않으면 럭셔리가 아니다.", + "author": "코코 샤넬, 인터뷰" + }, + { + "text": "폭풍이 지나면 걸어 들어간 그 사람과 같지 않다.", + "author": "무라카미 하루키, 해변의 카프카" + }, + { + "text": "고통은 피할 수 없지만, 고통받는 것은 선택이다.", + "author": "무라카미 하루키, 달리기를 말할 때" + }, + { + "text": "위대한 일은 충동이 아니라 작은 일의 연속으로 이루어진다.", + "author": "빈센트 반 고흐, 편지" + }, + { + "text": "좋은 영화란 인생이 편집된 것이고 지루한 부분이 잘려나간 것이다.", + "author": "알프레드 히치콕, 인터뷰" + }, + { + "text": "꿈꿀 수 있다면 이룰 수 있다.", + "author": "월트 디즈니, 강연" + }, + { + "text": "앞으로 나아가는 비결은 시작하는 것이다.", + "author": "월트 디즈니, 인터뷰" + }, + { + "text": "지능이란 변화에 적응하는 능력이다.", + "author": "스티븐 호킹, 강연" + }, + { + "text": "아무리 힘들어 보여도 항상 할 수 있는 무언가가 있고 성공할 수 있다.", + "author": "스티븐 호킹, 인터뷰" + }, + { + "text": "우주를 이해하려는 노력을 멈추지 마라.", + "author": "스티븐 호킹, 시간의 역사" + }, + { + "text": "비가 오면 우산을 쓰면 된다.", + "author": "마쓰시타 고노스케, 경영 철학" + }, + { + "text": "실패의 원인 대부분은 자신에게 있다.", + "author": "마쓰시타 고노스케, 경영 철학" + }, + { + "text": "인생의 결과는 사고방식 곱하기 열정 곱하기 능력이다.", + "author": "이나모리 가즈오, 살아가는 힘" + }, + { + "text": "당신의 수준은 가장 많은 시간을 함께 보내는 다섯 사람의 평균이다.", + "author": "짐 론, 강연" + }, + { + "text": "물이 되어라. 컵에 넣으면 컵이 되고, 병에 넣으면 병이 된다.", + "author": "브루스 리, 인터뷰" + }, + { + "text": "만 가지 발차기를 한 번 연습한 사람은 두렵지 않다. 한 가지를 만 번 연습한 사람이 두렵다.", + "author": "브루스 리, 인터뷰" + }, + { + "text": "실패를 두려워하지 마라. 낮은 목표를 세우는 것이 범죄다.", + "author": "브루스 리, 무술의 도" + }, + { + "text": "무의식을 의식하지 않으면 그것이 인생을 지배하고 당신은 운명이라 부를 것이다.", + "author": "칼 융, 분석심리학 강의" + }, + { + "text": "주어진 환경에서 자신의 태도를 선택할 자유는 빼앗길 수 없다.", + "author": "빅토르 프랭클, 죽음의 수용소에서" + }, + { + "text": "바닥까지 떨어져봐야 그것이 새로운 시작의 기반이 된다.", + "author": "J.K. 롤링, 하버드 졸업식 연설" + }, + { + "text": "상상력은 인간만이 가진 힘이다.", + "author": "J.K. 롤링, 하버드 졸업식 연설" + }, + { + "text": "성공은 행복의 열쇠가 아니다. 행복이 성공의 열쇠다.", + "author": "알베르트 슈바이처, 강연" + }, + { + "text": "어제는 지나갔다. 내일은 아직 오지 않았다. 우리에게는 오직 오늘만 있다.", + "author": "마더 테레사, 강연" + }, + { + "text": "준비에 실패하면 실패를 준비하는 것이다.", + "author": "존 우든, UCLA 코치" + }, + { + "text": "두려워해야 할 것은 아무것도 없다. 이해해야 할 것만 있을 뿐이다.", + "author": "마리 퀴리, 강연" + }, + { + "text": "학문은 멈추어서는 안 된다.", + "author": "순자, 권학편" + }, + { + "text": "푸른색은 쪽에서 나왔지만 쪽보다 더 푸르다.", + "author": "순자, 권학편" + }, + { + "text": "마음이 고요하면 멀리 내다볼 수 있다.", + "author": "제갈량, 계자서" + }, + { + "text": "배우지 않으면 재능을 넓힐 수 없고 뜻이 없으면 학문을 이룰 수 없다.", + "author": "제갈량, 계자서" + }, + { + "text": "적을 알고 나를 알면 백 번 싸워도 위태롭지 않다.", + "author": "손자, 손자병법 모공편" + }, + { + "text": "이기는 군대는 먼저 이겨놓고 싸우고, 지는 군대는 먼저 싸우고 나서 이기려 한다.", + "author": "손자, 손자병법 형편" + }, + { + "text": "넘어진 곳에서 무언가를 줍는 자가 현명한 자이다.", + "author": "한국 속담" + }, + { + "text": "무소유란 아무것도 갖지 않는 것이 아니라 불필요한 것을 갖지 않는 것이다.", + "author": "법정, 무소유" + }, + { + "text": "홀로 있는 시간을 두려워 마라. 그것이 곧 자기를 만나는 시간이다.", + "author": "법정, 무소유" + }, + { + "text": "창의성은 용기를 필요로 한다.", + "author": "앙리 마티스, 인터뷰" + }, + { + "text": "인생을 가까이서 보면 비극이지만, 멀리서 보면 희극이다.", + "author": "찰리 채플린, 인터뷰" + }, + { + "text": "과학의 좋은 점은 당신이 믿든 안 믿든 그것이 사실이라는 것이다.", + "author": "닐 디그래스 타이슨, 천체물리학자" + }, + { + "text": "나는 변화의 옹호자이다. 변화 없이는 어떤 향상도 기대할 수 없기 때문이다.", + "author": "플로렌스 나이팅게일, 편지" + }, + { + "text": "사랑이 없으면 아무것도 아니다.", + "author": "김수환 추기경, 강론" + }, + { + "text": "비행의 비밀을 배우려면 먼저 추락하는 법을 배워야 한다.", + "author": "윌버 라이트, 일기" + }, + { + "text": "사유하지 않는 민족은 곧 사라진다.", + "author": "무함마드 이크발, 시인" + }, + { + "text": "음악은 영혼이 기도하는 것과 같다.", + "author": "요한 세바스티안 바흐" + }, + { + "text": "사람은 성공하거나 실패하는 것이 아니다. 계속 걸어가는 것이다.", + "author": "밥 딜런, 인터뷰" + }, + { + "text": "경험이란 당신에게 일어나는 것이 아니라 일어나는 것에 대해 하는 것이다.", + "author": "올더스 헉슬리, 인터뷰" + }, + { + "text": "요리를 잘하려면 좋은 재료 앞에서 겸손해져야 한다.", + "author": "노부유키 마츠히사, 셰프" + }, + { + "text": "공로가 있는 사람에게 상을 주고 죄가 있는 사람에게 벌을 주어라.", + "author": "한비자, 설난편" + }, + { + "text": "평판은 남이 생각하는 것이고, 인격은 실제 자신의 모습이다.", + "author": "존 우든, 강연" + }, + { + "text": "완벽을 추구하면 완성할 수 없다. 완벽보다 완성이 먼저다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "가끔 혁신할 때 실수를 하게 된다. 빨리 인정하고 다른 혁신을 개선하는 데 집중해야 한다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "품질은 양보다 훨씬 중요하다. 하나의 홈런이 두 개의 2루타보다 훨씬 낫다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "나는 묘지에서 가장 부유한 사람이 되는 데 관심이 없다. 밤에 잠자리에 들면서 우리가 뭔가 놀라운 일을 했다고 말하는 것이 중요하다.", + "author": "스티브 잡스, 월스트리트저널 인터뷰" + }, + { + "text": "소비자에게 무엇을 원하는지 묻지 마라. 보여줬을 때 비로소 그들은 자신이 원하는 것을 알게 된다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "위대한 것과 좋은 것의 차이는 디테일에 대한 집착에 있다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "사람들은 자신이 원하는 것을 보여주기 전까지 모른다.", + "author": "스티브 잡스, 비즈니스위크 인터뷰" + }, + { + "text": "나의 비즈니스 모델은 비틀즈다. 네 사람이 서로의 부정적 경향을 억제했다.", + "author": "스티브 잡스, 60 Minutes 인터뷰" + }, + { + "text": "집중한다는 것은 집중해야 할 것에 예라고 말하는 것이 아니라, 수백 가지 좋은 아이디어에 아니오라고 말하는 것이다.", + "author": "스티브 잡스, WWDC" + }, + { + "text": "여정이 보상이다. 목적지가 아니라 과정 자체가 의미 있다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "기술과 인문학의 교차점에 서있는 것, 그것이 애플이다.", + "author": "스티브 잡스, iPad 발표" + }, + { + "text": "혁신은 천 가지에 아니오라고 말하는 것에서 나온다.", + "author": "스티브 잡스, WWDC 1997" + }, + { + "text": "세상을 바꿀 수 있다고 생각할 만큼 미친 사람들이 실제로 세상을 바꾼다.", + "author": "스티브 잡스, Think Different" + }, + { + "text": "우리의 목표는 만들 수 있는 최고의 제품을 만드는 것이지, 가장 많은 돈을 버는 것이 아니다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "실패에서 배우지 못하면 성공도 의미가 없다.", + "author": "스티브 잡스, NeXT 시절" + }, + { + "text": "제품에 대한 열정이 없으면 어떤 합리적인 사람도 이 일을 하지 않을 것이다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "우리는 우리가 만드는 것에 의해 기억된다. 그러니 아름다운 것을 만들어라.", + "author": "스티브 잡스, Apple" + }, + { + "text": "쓸모없는 것을 버리는 용기가 혁신의 시작이다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "고객이 원하는 것을 주는 것이 아니다. 그들이 원하게 될 것을 만드는 것이다.", + "author": "스티브 잡스, Apple" + }, + { + "text": "미래를 예측하는 가장 좋은 방법은 미래를 발명하는 것이다.", + "author": "스티브 잡스, Apple" + } +] \ No newline at end of file diff --git a/src/AxCopilot/Assets/Quotes/greetings.json b/src/AxCopilot/Assets/Quotes/greetings.json new file mode 100644 index 0000000..d9d257d --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/greetings.json @@ -0,0 +1,98 @@ +{ + "morning": [ + "🌅 기분 좋은 아침, 활기찬 시작 되세요!", + "🌅 밝은 미소로 시작하는 오늘, 응원합니다.", + "🌅 오늘 하루는 어제보다 더 행복할 거예요.", + "🌅 출근하느라 고생 많으셨어요. 오늘 하루도 파이팅!", + "☀️ 아침 햇살처럼 빛나는 하루 보내시길 바랍니다.", + "☀️ 오늘은 왠지 좋은 일이 생길 것만 같은 아침이네요.", + "☀️ 일찍 일어난 당신, 오늘 업무도 무사통과!", + "🌤️ 상쾌한 공기 마시고 기분 좋게 시작해 봐요.", + "🌤️ 모닝커피 한 잔의 여유와 함께 즐겁게 시작하세요.", + "🌤️ 오늘 하루도 당신의 능력을 마음껏 펼쳐주세요!", + "🏃 활기찬 발걸음만큼 보람찬 하루 되세요.", + "🏃 열정 가득한 아침, 그 에너지를 믿습니다.", + "🏃 벌써 자리에 앉으셨군요? 정말 대단하세요!", + "✨ 반짝이는 아이디어가 샘솟는 아침이길 바랍니다.", + "✨ 당신의 성실함이 빛을 발하는 하루가 될 거예요.", + "✨ 기분 좋은 인사로 서로에게 힘이 되어주세요.", + "🍀 행운이 가득한 아침입니다. 오늘도 힘내세요!", + "🍀 오늘 당신이 걷는 모든 길에 행운이 깃들길.", + "🍀 긍정의 힘으로 기분 좋게 문을 열어볼까요?", + "🔋 오늘도 풀충전! 활기차게 가봅시다!", + "🔋 든든한 아침 식사 챙기셨나요? 몸도 마음도 건강하게!", + "🔋 기지개 한 번 크게 켜고 상쾌하게 시작해요.", + "🤝 함께라서 든든한 아침입니다. 오늘 잘 부탁드려요!", + "🤝 동료님의 미소가 사무실을 밝혀주네요.", + "🤝 서로 응원하며 기분 좋게 출발해 볼까요?", + "🚀 목표를 향해 나아가는 당신의 아침을 응원합니다.", + "🚀 오늘 하루도 막힘없이 술술 풀리길!", + "🚀 자신감 넘치는 모습이 보기 좋습니다.", + "🌈 비 온 뒤 맑음처럼, 오늘 하루도 맑음!", + "🌈 무지개처럼 다채롭고 즐거운 아침 되세요." + ], + "lunch": [ + "🍽️ 점심 맛있게 드시고 오후도 기운 내세요!", + "🍽️ 배부른 점심만큼 행복 지수도 상승하시길!", + "🍽️ 맛점 하셨나요? 이제 오후 업무도 즐겁게 시작해 봐요.", + "☕ 노곤한 오후, 시원한 아이스커피 한 잔 어떠세요?", + "☕ 커피 향처럼 은은하고 기분 좋은 오후 되세요.", + "☕ 잠시 멈춰서 창밖을 보며 숨 한 번 돌려보세요.", + "🍰 달콤한 간식으로 당 충전하고 다시 파이팅!", + "🍰 피곤하시죠? 달달한 디저트가 필요한 시간이에요.", + "🍰 조금만 더 힘내면 금방 퇴근 시간이에요!", + "🥱 졸음이 쏟아지는 마의 시간, 가벼운 스트레칭 어떠세요?", + "🥱 눈이 자꾸 감긴다면 잠시 일어서서 걸어보세요.", + "🥱 하품은 싹~ 활력은 팍! 힘내세요.", + "💪 오후의 고비도 가볍게 넘기실 거라 믿어요.", + "💪 집중력이 필요한 시간, 당신의 능력을 보여주세요!", + "💪 지치지 않는 당신의 열정에 박수를 보냅니다.", + "🌳 잠시 옥상이나 주변 산책하며 힐링해 보세요.", + "🌳 맑은 오후 공기가 머리를 맑게 해줄 거예요.", + "🌳 초록색 식물을 보며 눈의 피로를 풀어주세요.", + "🎵 좋아하는 음악 한 곡 들으며 기분 전환해 보세요.", + "🎵 리듬에 맞춰 업무 효율도 쭉쭉 올려볼까요?", + "🎵 활기찬 오후가 성공적인 하루를 만듭니다.", + "☀️ 오후의 햇살이 참 좋네요. 기분도 맑음이길!", + "☀️ 남은 업무도 차근차근, 완벽하게 끝내실 거예요.", + "☀️ 당신의 노고 덕분에 팀이 잘 돌아가고 있어요.", + "🤝 지친 동료에게 따뜻한 말 한마디 건네는 오후 되세요.", + "🤝 서로 도와주며 업무 마무리까지 파이팅!", + "🤝 혼자가 아니에요, 우리가 함께하고 있습니다.", + "⏳ 벌써 이만큼 해내셨네요! 조금만 더 힘내 봐요.", + "⏳ 업무 효율 최고! 역시 믿고 맡기는 분이십니다.", + "⏳ 퇴근 시계가 조금씩 다가오고 있습니다. 끝까지 힘!" + ], + "evening": [ + "🌙 오늘 하루도 정말 고생 많으셨습니다.", + "🌙 무거운 어깨, 이제는 짐을 내려놓을 시간이에요.", + "🌙 수고한 당신에게 박수를 보냅니다. 짝짝짝!", + "🌙 오늘 보여주신 열정, 정말 멋졌습니다.", + "🌃 밤이 깊었네요. 이제 일은 잊고 푹 쉬세요.", + "🌃 야근하시느라 고생이 많으십니다. 힘내세요!", + "🌃 늦은 밤까지 빛나는 당신의 자리가 아름답습니다.", + "🌃 오늘 하루를 보람차게 마무리한 당신이 진정한 챔피언!", + "🏠 이제 따뜻한 집으로 돌아가 편안히 쉬시길 바랍니다.", + "🏠 가족과 함께, 혹은 오롯이 나만의 휴식을 즐기세요.", + "🏠 현관문을 열면 행복이 기다리고 있을 거예요.", + "🛌 오늘 밤은 꿈도 꾸지 말고 깊은 숙면 취하세요.", + "🛌 내일을 위해 몸도 마음도 재충전하는 밤 되세요.", + "🛌 수고한 나 자신에게 \"고생했어\"라고 말해줄까요?", + "✨ 오늘의 노력이 내일의 큰 성과로 돌아올 거예요.", + "✨ 힘든 하루였지만 당신이 있어 든든했습니다.", + "✨ 밤하늘의 별처럼 당신의 오늘 하루도 빛났습니다.", + "🥂 오늘 하루 마무리는 시원한 맥주 한 잔? 고생하셨어요!", + "🥂 맛있는 저녁 드시고 스트레스 싹 날려버리세요.", + "🥂 보람찬 하루 끝에 찾아오는 여유를 만끽하세요.", + "🚶‍♂️ 퇴근길 발걸음은 가볍게, 마음은 풍성하게!", + "🚶‍♂️ 오늘 하루 있었던 고민은 회사에 두고 퇴근하세요.", + "🚶‍♂️ 수고한 당신의 뒷모습이 오늘따라 든든해 보입니다.", + "🕯️ 지친 마음을 달래는 차분한 저녁 시간 되세요.", + "🕯️ 오늘 하루도 안전하게 마무리해주셔서 감사합니다.", + "🕯️ 내일은 더 좋은 일이 생길 거예요. 편히 쉬세요.", + "🌛 조용한 밤, 수고한 당신을 위한 선물 같은 시간 되길.", + "🌛 마지막까지 자리 지켜주셔서 감사합니다. 이제 퇴근합시다!", + "🌛 걱정은 내일의 나에게 맡기고, 오늘은 꿀잠 자요.", + "🌛 오늘 정말 최고였습니다. 평안한 밤 되세요!" + ] +} \ No newline at end of file diff --git a/src/AxCopilot/Assets/Quotes/history.json b/src/AxCopilot/Assets/Quotes/history.json new file mode 100644 index 0000000..35506a0 --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/history.json @@ -0,0 +1,102 @@ +[ + "1969년 7월 20일, 닐 암스트롱이 인류 최초로 달 표면에 발을 디뎠습니다.", + "1989년 11월 9일, 베를린 장벽이 무너지며 동서 냉전 시대가 막을 내렸습니다.", + "1945년 8월 15일, 한국이 일본 식민 지배로부터 광복을 맞이했습니다.", + "1776년 7월 4일, 미국 독립선언서가 공표되어 영국으로부터 독립을 선언했습니다.", + "1903년 12월 17일, 라이트 형제가 인류 최초의 동력 비행에 성공했습니다.", + "1453년 5월 29일, 오스만 제국이 콘스탄티노플을 정복하여 비잔틴 제국이 멸망했습니다.", + "1492년 10월 12일, 크리스토퍼 콜럼버스가 아메리카 대륙에 도착했습니다.", + "1789년 7월 14일, 프랑스 혁명의 상징인 바스티유 감옥이 함락되었습니다.", + "1215년, 영국에서 마그나카르타(대헌장)가 제정되어 왕권을 제한하는 근대 민주주의의 초석이 되었습니다.", + "1543년, 코페르니쿠스가 지동설을 발표하여 지구가 태양 주위를 돈다고 주장했습니다.", + "1687년, 아이작 뉴턴이 《프린키피아》를 출판하여 만유인력의 법칙을 발표했습니다.", + "1804년, 나폴레옹 보나파르트가 프랑스 황제로 즉위했습니다.", + "1865년 4월 9일, 미국 남북전쟁이 사실상 종결되었습니다.", + "1917년 10월, 러시아 볼셰비키 혁명으로 세계 최초의 사회주의 국가가 탄생했습니다.", + "1929년 10월 24일, 뉴욕 증시 대폭락으로 대공황이 시작되었습니다.", + "1945년 6월 26일, 유엔(UN) 헌장이 서명되어 국제 평화 유지 기구가 설립되었습니다.", + "1948년 12월 10일, 세계인권선언이 유엔 총회에서 채택되었습니다.", + "1950년 6월 25일, 한국전쟁이 발발하여 3년간의 전쟁이 시작되었습니다.", + "1957년 10월 4일, 소련이 세계 최초의 인공위성 스푸트니크를 발사했습니다.", + "1961년 4월 12일, 유리 가가린이 인류 최초로 우주 비행에 성공했습니다.", + "1963년 8월 28일, 마틴 루서 킹 목사가 '나에게는 꿈이 있습니다' 연설을 했습니다.", + "1969년, 인터넷의 전신인 ARPANET이 최초로 연결되었습니다.", + "1975년 4월 30일, 베트남 전쟁이 종결되었습니다.", + "1979년, 이란 혁명으로 팔레비 왕조가 무너지고 이슬람 공화국이 수립되었습니다.", + "1986년 4월 26일, 체르노빌 원전 사고가 발생하여 역사상 최악의 원자력 재난이 되었습니다.", + "1990년 10월 3일, 동서독이 통일되었습니다.", + "1991년 12월 25일, 소련이 해체되며 냉전 시대가 종결되었습니다.", + "1994년, 넬슨 만델라가 남아프리카공화국 최초의 흑인 대통령으로 취임했습니다.", + "1997년 7월 1일, 홍콩이 영국에서 중국으로 반환되었습니다.", + "2001년 9월 11일, 미국에서 9·11 테러 사건이 발생했습니다.", + "2004년 12월 26일, 인도양 지진 해일(쓰나미)로 23만 명 이상이 사망했습니다.", + "2008년, 미국 서브프라임 모기지 사태로 글로벌 금융위기가 발생했습니다.", + "2011년 3월 11일, 동일본 대지진과 후쿠시마 원전 사고가 발생했습니다.", + "2016년, 알파고가 이세돌 9단을 바둑에서 이기며 AI 시대를 알렸습니다.", + "2020년, COVID-19 팬데믹이 전 세계를 강타하며 인류의 생활 양식을 바꿨습니다.", + "기원전 3000년경, 이집트에서 피라미드 건설이 시작되었습니다.", + "기원전 776년, 고대 올림픽이 그리스 올림피아에서 처음 개최되었습니다.", + "기원전 221년, 진시황이 중국을 최초로 통일하고 만리장성 건설을 시작했습니다.", + "기원전 44년, 율리우스 카이사르가 원로원에서 암살되었습니다.", + "610년경, 이슬람교의 창시자 무함마드가 첫 계시를 받았습니다.", + "1346~1353년, 흑사병(페스트)이 유럽 인구의 1/3을 사망시켰습니다.", + "1440년경, 구텐베르크가 활판 인쇄술을 발명하여 지식 혁명을 일으켰습니다.", + "1519~1522년, 마젤란의 선단이 세계 최초로 지구를 한 바퀴 항해했습니다.", + "1776년, 애덤 스미스가 《국부론》을 출판하여 자유시장 경제학의 기초를 놓았습니다.", + "1859년, 찰스 다윈이 《종의 기원》을 출판하여 진화론을 발표했습니다.", + "1876년, 알렉산더 그레이엄 벨이 전화기를 발명했습니다.", + "1879년, 토머스 에디슨이 실용적인 전구를 발명했습니다.", + "1895년, 빌헬름 뢴트겐이 X선을 발견하여 의학 혁명을 일으켰습니다.", + "1905년, 아인슈타인이 특수 상대성이론과 광전효과 논문을 발표했습니다 (기적의 해).", + "1928년, 알렉산더 플레밍이 페니실린을 발견하여 항생제 시대를 열었습니다.", + "1945년 7월 16일, 미국 뉴멕시코에서 세계 최초의 핵실험(트리니티)이 실시되었습니다.", + "1947년 8월 15일, 인도가 영국으로부터 독립했습니다.", + "1953년, 왓슨과 크릭이 DNA 이중나선 구조를 발견했습니다.", + "1955년, 로자 파크스가 버스에서 백인에게 자리 양보를 거부하며 민권운동의 불씨를 당겼습니다.", + "1962년 10월, 쿠바 미사일 위기로 미국과 소련이 핵전쟁 직전까지 갔습니다.", + "1964년, 일본이 세계 최초의 고속열차 신칸센을 개통했습니다.", + "1971년, 인텔이 세계 최초의 상용 마이크로프로세서 4004를 출시했습니다.", + "1976년, 스티브 잡스와 스티브 워즈니악이 애플 컴퓨터를 창립했습니다.", + "1981년, IBM이 개인용 컴퓨터(PC)를 출시하여 PC 시대를 열었습니다.", + "1983년, 인터넷의 핵심 프로토콜 TCP/IP가 공식 채택되었습니다.", + "1989년, 팀 버너스-리가 월드와이드웹(WWW)을 발명했습니다.", + "1990년, 허블 우주 망원경이 발사되어 우주의 모습을 혁명적으로 밝혔습니다.", + "1995년, 제프 베조스가 아마존을 온라인 서점으로 창립했습니다.", + "1998년, 래리 페이지와 세르게이 브린이 구글을 창립했습니다.", + "2004년, 마크 저커버그가 하버드 기숙사에서 페이스북을 창립했습니다.", + "2007년, 스티브 잡스가 아이폰을 발표하며 스마트폰 시대를 열었습니다.", + "2009년, 사토시 나카모토가 비트코인 네트워크를 가동하여 암호화폐 시대를 시작했습니다.", + "2012년, CERN에서 힉스 보손 입자를 발견하여 '신의 입자' 이론을 검증했습니다.", + "2015년, LIGO가 인류 최초로 중력파를 직접 관측했습니다.", + "2019년, 이벤트 호라이즌 망원경(EHT)이 블랙홀을 최초로 촬영했습니다.", + "2022년, 제임스 웹 우주 망원경이 최초 관측 이미지를 공개하여 우주 관측의 새 시대를 열었습니다.", + "2022년 11월, OpenAI가 ChatGPT를 출시하여 생성형 AI 혁명을 촉발했습니다.", + "1392년, 이성계가 조선을 건국하고 한양(서울)을 수도로 삼았습니다.", + "1443년, 세종대왕이 훈민정음(한글)을 창제했습니다.", + "1592년, 임진왜란이 발발하였고 이순신 장군이 해전에서 연전연승했습니다.", + "1896년, 서재필이 한국 최초의 민간 신문 《독립신문》을 창간했습니다.", + "1910년, 경술국치로 한국이 일본에 국권을 빼앗겼습니다.", + "1919년 3월 1일, 3·1 독립운동이 일어나 독립을 선언했습니다.", + "1945년 8월 15일, 한국이 광복을 맞이했습니다.", + "1948년 8월 15일, 대한민국 정부가 수립되었습니다.", + "1960년 4월 19일, 4·19 혁명으로 이승만 독재 정권이 무너졌습니다.", + "1970년대, 한국은 경부고속도로 건설 등 산업화를 이루며 '한강의 기적'을 시작했습니다.", + "1987년 6월, 6월 민주항쟁으로 대통령 직선제 개헌이 이루어졌습니다.", + "1988년, 서울 올림픽이 개최되어 한국을 세계에 알렸습니다.", + "1997년, IMF 외환위기가 발생하여 한국 경제가 큰 어려움을 겪었습니다.", + "2002년, 한일 월드컵에서 한국 축구 대표팀이 4강 신화를 이뤘습니다.", + "2018년 4월, 판문점에서 남북 정상회담이 개최되었습니다.", + "1543년, 조선 이황(퇴계)이 태어나 성리학을 집대성했습니다.", + "1446년, 훈민정음이 반포되어 백성들이 글을 읽고 쓸 수 있게 되었습니다.", + "1636년, 병자호란이 발발하여 조선이 청에 항복했습니다.", + "1894년, 동학농민운동이 일어나 반봉건·반외세를 외쳤습니다.", + "1905년, 을사늑약으로 대한제국의 외교권이 박탈되었습니다.", + "1926년 6월 10일, 6·10 만세운동이 일어나 일제에 항거했습니다.", + "1953년 7월 27일, 한국전쟁 정전협정이 체결되었습니다.", + "1961년, 5·16 군사정변이 일어나 박정희가 정권을 장악했습니다.", + "1980년 5월 18일, 5·18 광주 민주화운동이 일어났습니다.", + "2000년 6월, 최초의 남북 정상회담이 평양에서 개최되었습니다.", + "2010년, 한국이 G20 정상회의를 서울에서 개최했습니다.", + "1894년, 갑오개혁으로 신분제 폐지 등 근대적 개혁이 이루어졌습니다.", + "1909년 10월 26일, 안중근 의사가 이토 히로부미를 저격했습니다." +] diff --git a/src/AxCopilot/Assets/Quotes/it_ai.json b/src/AxCopilot/Assets/Quotes/it_ai.json new file mode 100644 index 0000000..b18d33d --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/it_ai.json @@ -0,0 +1,505 @@ +[ + "LLM(Large Language Model)은 대규모 텍스트 데이터로 학습된 언어 모델로, GPT, Claude, Gemini 등이 있습니다.", + "RAG(Retrieval-Augmented Generation)는 외부 지식을 검색하여 LLM 응답의 정확도를 높이는 기술입니다.", + "MCP(Model Context Protocol)는 AI 모델이 외부 도구/데이터에 접근하는 표준 프로토콜입니다.", + "Transformer는 Self-Attention 메커니즘 기반 신경망으로, 현대 AI의 핵심 아키텍처입니다.", + "프롬프트 엔지니어링은 AI에게 최적의 결과를 얻기 위해 입력을 설계하는 기술입니다.", + "Fine-tuning은 사전학습된 모델을 특정 도메인 데이터로 추가 학습시키는 과정입니다.", + "토큰(Token)은 LLM이 텍스트를 처리하는 최소 단위로, 한국어 한 글자는 보통 2~3토큰입니다.", + "컨텍스트 윈도우(Context Window)는 AI 모델이 한 번에 처리할 수 있는 최대 토큰 수입니다.", + "Zero-shot은 예시 없이 지시만으로 작업을 수행하는 AI 능력입니다.", + "Few-shot은 소수의 예시를 제공하여 AI의 답변 품질을 높이는 기법입니다.", + "Chain-of-Thought(CoT)는 AI가 단계적으로 추론하도록 유도하여 복잡한 문제를 해결하는 프롬프트 기법입니다.", + "Hallucination은 AI가 사실이 아닌 내용을 확신 있게 생성하는 현상입니다.", + "Grounding은 AI 응답을 실제 데이터에 기반하게 하여 환각을 줄이는 기법입니다.", + "RLHF(Reinforcement Learning from Human Feedback)는 인간 피드백으로 AI를 정렬하는 학습 방법입니다.", + "Embedding은 텍스트를 고차원 벡터로 변환하여 의미적 유사도를 계산하는 기술입니다.", + "벡터 DB(Vector Database)는 임베딩 벡터를 저장하고 유사도 검색하는 특화된 데이터베이스입니다.", + "Attention 메커니즘은 입력 시퀀스에서 관련 있는 부분에 집중하도록 가중치를 부여합니다.", + "Self-Attention은 시퀀스 내 모든 위치 간 관계를 병렬로 계산하는 메커니즘입니다.", + "Multi-Head Attention은 여러 Attention 헤드가 서로 다른 표현 공간에서 정보를 추출합니다.", + "Positional Encoding은 Transformer에 단어 순서 정보를 주입하는 방법입니다.", + "BERT는 양방향 컨텍스트를 이해하는 인코더 모델로, 분류·검색 등에 활용됩니다.", + "GPT는 다음 토큰을 예측하는 디코더 모델로, 텍스트 생성에 특화되어 있습니다.", + "Diffusion Model은 노이즈를 단계적으로 제거하여 이미지를 생성하는 모델입니다.", + "Stable Diffusion은 오픈소스 이미지 생성 AI로, Latent Space에서 디퓨전을 수행합니다.", + "GAN(Generative Adversarial Network)은 생성자와 판별자가 경쟁하며 학습하는 생성 모델입니다.", + "VAE(Variational Autoencoder)는 데이터의 잠재 분포를 학습하는 생성 모델입니다.", + "LoRA(Low-Rank Adaptation)는 소수의 파라미터만 학습하여 효율적으로 모델을 미세조정합니다.", + "QLoRA는 양자화된 모델에 LoRA를 적용하여 메모리 사용을 극적으로 줄이는 기법입니다.", + "PEFT(Parameter-Efficient Fine-Tuning)는 전체 파라미터 중 일부만 조정하는 효율적 학습 방법입니다.", + "양자화(Quantization)는 모델 가중치를 낮은 비트로 표현하여 추론 속도를 높이고 메모리를 줄입니다.", + "KV Cache는 이전 토큰의 Key/Value를 저장하여 자기회귀 생성 속도를 높이는 최적화입니다.", + "Speculative Decoding은 작은 모델이 초안을 생성하고 큰 모델이 검증하여 추론을 가속합니다.", + "Flash Attention은 메모리 효율적인 Attention 구현으로, GPU 메모리를 크게 절약합니다.", + "Mixture of Experts(MoE)는 입력에 따라 일부 전문가 네트워크만 활성화하는 효율적 아키텍처입니다.", + "Mamba는 선택적 상태 공간 모델(SSM)로, Transformer의 대안으로 연구되고 있습니다.", + "RWKV는 RNN과 Transformer의 장점을 결합한 선형 복잡도 언어 모델입니다.", + "Constitutional AI는 AI에게 원칙을 부여하고 자기 비판으로 정렬하는 Anthropic의 방법론입니다.", + "RLHF 대안으로 DPO(Direct Preference Optimization)가 인간 선호도를 직접 학습합니다.", + "Reinforcement Learning은 보상 신호를 통해 최적 행동 정책을 학습하는 머신러닝 방법입니다.", + "Transfer Learning은 한 도메인에서 학습한 지식을 다른 도메인에 적용하는 기법입니다.", + "Multi-modal AI는 텍스트, 이미지, 오디오 등 여러 형태의 데이터를 통합 처리합니다.", + "Vision-Language Model(VLM)은 이미지와 텍스트를 동시에 이해하는 멀티모달 모델입니다.", + "OCR(Optical Character Recognition)은 이미지에서 텍스트를 인식하여 디지털화하는 기술입니다.", + "TTS(Text-to-Speech)는 텍스트를 자연스러운 음성으로 변환하는 AI 기술입니다.", + "STT(Speech-to-Text)는 음성을 텍스트로 변환하는 AI 기술로, Whisper가 대표적입니다.", + "Whisper는 OpenAI의 다국어 음성 인식 모델로, 한국어도 높은 정확도를 보입니다.", + "AI Agent는 목표를 설정하고 도구를 사용하여 자율적으로 작업을 수행하는 AI 시스템입니다.", + "Function Calling은 LLM이 외부 함수를 호출하여 실제 작업을 수행하는 인터페이스입니다.", + "Tool Use는 AI가 검색, 계산, API 호출 등의 도구를 사용하여 답변 품질을 높이는 방식입니다.", + "ReAct(Reasoning + Acting)는 AI가 추론과 행동을 번갈아 수행하는 에이전트 프레임워크입니다.", + "Plan-and-Execute는 먼저 계획을 세우고 순차적으로 실행하는 에이전트 전략입니다.", + "Self-Reflection은 AI가 자신의 출력을 평가하고 개선하는 반성적 추론 기법입니다.", + "Tree-of-Thought는 여러 추론 경로를 탐색하여 최적 해를 찾는 고급 프롬프트 기법입니다.", + "AutoGPT는 목표를 주면 자율적으로 하위 작업을 생성하고 실행하는 초기 AI 에이전트입니다.", + "CrewAI는 여러 AI 에이전트가 역할을 분담하여 협력하는 멀티에이전트 프레임워크입니다.", + "LangChain은 LLM 애플리케이션 개발을 위한 인기 프레임워크로, 체인·에이전트·도구를 제공합니다.", + "LangGraph는 LangChain의 상태 기반 에이전트 프레임워크로, 복잡한 워크플로우를 지원합니다.", + "LlamaIndex는 데이터와 LLM을 연결하는 프레임워크로, RAG 구축에 특화되어 있습니다.", + "Semantic Kernel은 Microsoft의 AI 오케스트레이션 SDK로, .NET과 통합이 강점입니다.", + "Hugging Face는 AI 모델, 데이터셋, 학습 도구를 공유하는 오픈소스 플랫폼입니다.", + "Ollama는 로컬에서 LLM을 실행하는 도구로, 사내 AI 구축에 활용됩니다.", + "vLLM은 고성능 LLM 추론 엔진으로, PagedAttention으로 처리량을 극대화합니다.", + "TensorRT-LLM은 NVIDIA의 LLM 추론 최적화 라이브러리입니다.", + "ONNX Runtime은 다양한 프레임워크의 모델을 범용으로 실행하는 추론 엔진입니다.", + "MLOps는 머신러닝 모델의 개발·배포·운영을 체계적으로 관리하는 방법론입니다.", + "ML Pipeline은 데이터 수집→전처리→학습→평가→배포를 자동화하는 워크플로우입니다.", + "Feature Store는 ML에 사용되는 특성 데이터를 중앙에서 관리·공유하는 저장소입니다.", + "데이터 레이블링은 AI 학습에 필요한 주석(Annotation)을 데이터에 부여하는 작업입니다.", + "Active Learning은 모델이 불확실한 데이터를 선별하여 효율적으로 레이블링하는 방법입니다.", + "Federated Learning은 데이터를 중앙에 모으지 않고 분산된 장치에서 학습하는 기법입니다.", + "Edge AI는 클라우드 없이 엣지 디바이스(스마트폰, IoT)에서 AI를 실행하는 기술입니다.", + "On-Device AI는 기기 내에서 직접 AI 추론을 수행하여 지연시간과 프라이버시를 개선합니다.", + "NPU(Neural Processing Unit)는 AI 연산에 특화된 프로세서입니다.", + "GPU는 병렬 연산에 강점이 있어 딥러닝 학습과 추론의 핵심 하드웨어입니다.", + "TPU(Tensor Processing Unit)는 Google이 설계한 텐서 연산 특화 AI 칩입니다.", + "CUDA는 NVIDIA GPU에서 범용 병렬 컴퓨팅을 수행하는 플랫폼입니다.", + "PyTorch는 동적 계산 그래프를 지원하는 딥러닝 프레임워크로, 연구 분야에서 가장 인기 있습니다.", + "TensorFlow는 Google의 딥러닝 프레임워크로, 프로덕션 배포에 강점이 있습니다.", + "JAX는 Google의 고성능 수치 연산 라이브러리로, 자동 미분과 XLA 컴파일을 지원합니다.", + "Jupyter Notebook은 코드, 시각화, 설명을 한 문서에서 작성하는 대화형 개발 환경입니다.", + "Docker는 애플리케이션을 컨테이너로 패키징하여 환경 차이 없이 배포하는 기술입니다.", + "Kubernetes(K8s)는 컨테이너 오케스트레이션 플랫폼으로, 자동 스케일링과 배포를 관리합니다.", + "CI/CD는 코드 변경을 자동으로 빌드·테스트·배포하는 지속적 통합/배포 파이프라인입니다.", + "GitHub Actions는 워크플로우를 자동화하는 CI/CD 도구로, YAML로 정의합니다.", + "Git은 분산 버전 관리 시스템으로, 코드 이력 추적과 협업의 핵심 도구입니다.", + "GitHub Copilot은 AI 페어 프로그래밍 도구로, 코드 자동 완성과 제안을 제공합니다.", + "Claude Code는 Anthropic의 터미널 기반 AI 코딩 에이전트로, SWE-bench에서 높은 성능을 보입니다.", + "Cursor는 AI 기반 코드 편집기로, 멀티에이전트 구조와 코드 이해 능력이 강점입니다.", + "OpenCode는 오픈소스 AI 코딩 에이전트로, Go 언어로 작성되어 있습니다.", + "VS Code는 Microsoft의 경량 코드 편집기로, 풍부한 확장 생태계를 보유합니다.", + "LSP(Language Server Protocol)는 에디터와 언어 서버 간 통신 표준 프로토콜입니다.", + "REST API는 HTTP 기반의 웹 서비스 인터페이스로, 리소스 중심 설계를 따릅니다.", + "GraphQL은 클라이언트가 필요한 데이터만 정확히 요청할 수 있는 쿼리 언어입니다.", + "gRPC는 Google의 고성능 RPC 프레임워크로, Protocol Buffers를 사용합니다.", + "WebSocket은 서버-클라이언트 간 양방향 실시간 통신을 지원하는 프로토콜입니다.", + "SSE(Server-Sent Events)는 서버에서 클라이언트로 단방향 실시간 데이터를 스트리밍합니다.", + "OAuth 2.0은 제3자 애플리케이션에 안전하게 권한을 위임하는 인증 프레임워크입니다.", + "JWT(JSON Web Token)은 당사자 간 정보를 안전하게 전달하는 컴팩트한 토큰입니다.", + "마이크로서비스는 애플리케이션을 독립적인 서비스 단위로 분리하여 개발·배포하는 아키텍처입니다.", + "서버리스(Serverless)는 서버 관리 없이 함수 단위로 코드를 실행하는 클라우드 컴퓨팅 모델입니다.", + "AWS Lambda는 이벤트 기반 서버리스 컴퓨팅 서비스입니다.", + "Azure Functions는 Microsoft의 서버리스 컴퓨팅 플랫폼입니다.", + "Cloud Native는 클라우드 환경에 최적화된 애플리케이션 설계·개발 방법론입니다.", + "IaC(Infrastructure as Code)는 인프라를 코드로 정의하고 관리하는 방식입니다.", + "Terraform은 HashiCorp의 IaC 도구로, 멀티 클라우드 인프라를 선언적으로 관리합니다.", + "Ansible은 에이전트 없이 서버를 자동화 구성하는 IT 자동화 도구입니다.", + "DevOps는 개발과 운영의 협업을 강화하여 소프트웨어 배포 속도와 품질을 높이는 문화입니다.", + "SRE(Site Reliability Engineering)는 Google이 정립한 운영 엔지니어링 방법론입니다.", + "Observability는 로그·메트릭·트레이스로 시스템 내부 상태를 파악하는 능력입니다.", + "Prometheus는 시계열 메트릭 수집·쿼리를 위한 오픈소스 모니터링 시스템입니다.", + "Grafana는 다양한 데이터 소스의 메트릭을 시각화하는 대시보드 도구입니다.", + "ELK Stack(Elasticsearch, Logstash, Kibana)은 로그 수집·검색·시각화 플랫폼입니다.", + "Redis는 인메모리 키-값 저장소로, 캐시·세션·메시지 브로커에 활용됩니다.", + "Kafka는 대규모 실시간 데이터 스트리밍을 위한 분산 이벤트 플랫폼입니다.", + "RabbitMQ는 AMQP 기반 메시지 브로커로, 비동기 작업 처리에 활용됩니다.", + "PostgreSQL은 확장성 높은 오픈소스 관계형 데이터베이스로, JSON 지원이 강점입니다.", + "MongoDB는 문서(Document) 기반 NoSQL 데이터베이스로, 유연한 스키마가 특징입니다.", + "Apache Spark는 대규모 데이터 처리를 위한 인메모리 분산 컴퓨팅 프레임워크입니다.", + "Apache Airflow는 데이터 파이프라인을 DAG로 정의하고 스케줄링하는 워크플로우 관리 도구입니다.", + "dbt(data build tool)는 SQL 기반 데이터 변환 도구로, 분석 엔지니어링의 핵심입니다.", + "Snowflake는 클라우드 네이티브 데이터 웨어하우스로, 스토리지와 컴퓨팅을 분리합니다.", + "Apache Iceberg는 대규모 분석 테이블을 위한 오픈소스 테이블 포맷입니다.", + "Data Lakehouse는 데이터 레이크와 데이터 웨어하우스의 장점을 결합한 아키텍처입니다.", + "ETL(Extract, Transform, Load)은 데이터를 추출·변환·적재하는 데이터 통합 프로세스입니다.", + "Pandas는 Python의 데이터 분석 라이브러리로, DataFrame으로 구조화 데이터를 처리합니다.", + "NumPy는 Python의 고성능 수치 연산 라이브러리로, 다차원 배열을 지원합니다.", + "scikit-learn은 Python의 머신러닝 라이브러리로, 분류·회귀·클러스터링 등을 제공합니다.", + "XGBoost는 그래디언트 부스팅 알고리즘으로, 정형 데이터 분류·회귀에서 높은 성능을 보입니다.", + "AutoML은 머신러닝 파이프라인을 자동으로 설계하고 최적화하는 기술입니다.", + "NLP(Natural Language Processing)는 컴퓨터가 인간 언어를 이해·생성하는 AI 분야입니다.", + "NER(Named Entity Recognition)은 텍스트에서 인명·지명·기관명 등을 식별하는 NLP 작업입니다.", + "감정 분석(Sentiment Analysis)은 텍스트의 긍정·부정·중립 감정을 판별하는 NLP 기술입니다.", + "요약(Summarization)은 긴 텍스트의 핵심 내용을 짧게 추출하는 NLP 기술입니다.", + "기계 번역(Machine Translation)은 AI가 한 언어를 다른 언어로 번역하는 기술입니다.", + "Computer Vision은 컴퓨터가 이미지·영상을 분석하고 이해하는 AI 분야입니다.", + "Object Detection은 이미지에서 객체의 위치와 종류를 식별하는 컴퓨터 비전 기술입니다.", + "YOLO(You Only Look Once)는 실시간 객체 탐지를 위한 딥러닝 모델입니다.", + "Semantic Segmentation은 이미지의 각 픽셀에 클래스 라벨을 부여하는 기술입니다.", + "ViT(Vision Transformer)는 Transformer 아키텍처를 이미지 분류에 적용한 모델입니다.", + "CLIP은 이미지와 텍스트를 동일한 임베딩 공간에 매핑하는 OpenAI의 멀티모달 모델입니다.", + "Zero Trust는 '아무것도 신뢰하지 않는다'는 원칙의 보안 아키텍처입니다.", + "SASE(Secure Access Service Edge)는 네트워크 보안과 WAN을 클라우드에서 통합합니다.", + "FIDO2는 비밀번호 없이 생체 인증·보안 키로 로그인하는 웹 인증 표준입니다.", + "Passkey는 FIDO2 기반의 비밀번호 대체 인증 방식으로, 피싱에 강합니다.", + "SSL/TLS는 인터넷 통신을 암호화하여 보안을 보장하는 프로토콜입니다.", + "AES-256은 256비트 키를 사용하는 대칭 암호화 표준으로, 매우 강력한 보안을 제공합니다.", + "SHA-256은 256비트 해시를 생성하는 암호학적 해시 함수입니다.", + "Blockchain은 거래 내역을 분산 원장에 체인 형태로 기록하는 기술입니다.", + "Smart Contract는 블록체인 위에서 자동 실행되는 프로그래밍 가능한 계약입니다.", + "Web3는 블록체인 기반의 탈중앙화된 인터넷 패러다임입니다.", + "NFT(Non-Fungible Token)는 디지털 자산의 고유성과 소유권을 증명하는 토큰입니다.", + "DeFi(Decentralized Finance)는 블록체인 기반 탈중앙화 금융 시스템입니다.", + "메타버스(Metaverse)는 3D 가상 공간에서 사회·경제 활동을 하는 디지털 세계입니다.", + "XR(Extended Reality)은 VR, AR, MR을 포괄하는 확장 현실 기술입니다.", + "AR(Augmented Reality)은 현실 세계에 가상 정보를 겹쳐 보여주는 기술입니다.", + "VR(Virtual Reality)은 완전한 가상 환경을 체험하는 몰입형 기술입니다.", + "Digital Twin은 물리적 자산을 디지털로 복제하여 시뮬레이션·예측하는 기술입니다.", + "IoT(Internet of Things)는 사물에 센서와 통신을 부여하여 인터넷에 연결하는 기술입니다.", + "MQTT는 IoT에서 경량 메시지를 교환하는 발행-구독 프로토콜입니다.", + "5G는 초고속(최대 20Gbps), 초저지연(1ms), 초연결(㎢당 100만 기기)을 지원하는 이동통신입니다.", + "Wi-Fi 7(802.11be)은 최대 46Gbps, 320MHz 대역폭을 지원하는 차세대 무선 통신입니다.", + "RPA(Robotic Process Automation)는 반복적 업무를 소프트웨어 로봇으로 자동화하는 기술입니다.", + "로우코드/노코드(Low-Code/No-Code)는 최소한의 코딩으로 앱을 개발하는 플랫폼입니다.", + "SaaS(Software as a Service)는 소프트웨어를 클라우드에서 구독 형태로 제공하는 모델입니다.", + "PaaS(Platform as a Service)는 애플리케이션 개발 플랫폼을 클라우드로 제공합니다.", + "IaaS(Infrastructure as a Service)는 서버·스토리지 등 IT 인프라를 클라우드로 제공합니다.", + "CDN(Content Delivery Network)은 콘텐츠를 전 세계 엣지 서버에 분산하여 빠르게 전달합니다.", + "DNS(Domain Name System)는 도메인 이름을 IP 주소로 변환하는 인터넷의 주소록입니다.", + "API Gateway는 API 요청을 라우팅하고, 인증·속도 제한·모니터링을 담당합니다.", + "Service Mesh는 마이크로서비스 간 통신을 관리하는 인프라 계층입니다.", + "Istio는 쿠버네티스 환경의 서비스 메시를 관리하는 오픈소스 플랫폼입니다.", + "Helm은 쿠버네티스 패키지 매니저로, 앱 배포를 차트(Chart)로 관리합니다.", + "ArgoCD는 쿠버네티스에 GitOps 방식으로 애플리케이션을 배포하는 도구입니다.", + "GitOps는 Git을 단일 진실의 원천으로 삼아 인프라와 앱을 관리하는 방법론입니다.", + "Trunk-Based Development는 하나의 메인 브랜치에서 지속적으로 통합하는 Git 전략입니다.", + "Feature Flag는 코드 배포와 기능 출시를 분리하여 점진적으로 기능을 활성화합니다.", + "A/B Testing은 두 버전을 비교하여 어떤 것이 더 효과적인지 실험하는 방법입니다.", + "Canary Deployment는 새 버전을 소수 사용자에게 먼저 배포하여 위험을 줄이는 전략입니다.", + "Blue-Green Deployment는 두 환경을 번갈아 사용하여 무중단 배포를 구현합니다.", + "Chaos Engineering은 의도적으로 시스템 장애를 유발하여 복원력을 검증하는 방법론입니다.", + "CQRS(Command Query Responsibility Segregation)는 읽기와 쓰기를 분리하는 아키텍처입니다.", + "Event Sourcing은 상태 변경을 이벤트로 기록하여 모든 이력을 추적하는 패턴입니다.", + "Domain-Driven Design(DDD)는 비즈니스 도메인 중심으로 소프트웨어를 설계하는 방법론입니다.", + "Clean Architecture는 의존성 방향을 안쪽으로 향하게 하여 유지보수성을 높이는 아키텍처입니다.", + "Hexagonal Architecture(포트와 어댑터)는 애플리케이션 핵심을 외부로부터 분리합니다.", + "SOLID는 객체지향 설계의 5대 원칙(SRP, OCP, LSP, ISP, DIP)입니다.", + "단일 책임 원칙(SRP)은 클래스는 하나의 변경 이유만 가져야 한다는 원칙입니다.", + "개방-폐쇄 원칙(OCP)은 확장에는 열려 있고 수정에는 닫혀 있어야 한다는 원칙입니다.", + "의존성 역전 원칙(DIP)은 고수준 모듈이 저수준 모듈에 의존하지 않아야 한다는 원칙입니다.", + "TDD(Test-Driven Development)는 테스트를 먼저 작성하고 코드를 구현하는 개발 방법입니다.", + "BDD(Behavior-Driven Development)는 비즈니스 행동 시나리오로 테스트를 작성합니다.", + "단위 테스트(Unit Test)는 함수/메서드 단위로 동작을 검증하는 테스트입니다.", + "통합 테스트(Integration Test)는 여러 컴포넌트가 함께 동작하는지 검증합니다.", + "E2E 테스트(End-to-End Test)는 사용자 관점에서 전체 시스템을 검증합니다.", + "코드 커버리지는 테스트가 코드의 몇 퍼센트를 실행하는지 측정하는 지표입니다.", + "정적 분석(Static Analysis)은 코드를 실행하지 않고 잠재적 버그와 취약점을 찾습니다.", + "린트(Lint)는 코드 스타일과 잠재적 오류를 자동으로 검사하는 도구입니다.", + "코드 리뷰(Code Review)는 다른 개발자가 코드 변경을 검토하여 품질을 높이는 프로세스입니다.", + "리팩터링(Refactoring)은 기능 변경 없이 코드 구조를 개선하는 작업입니다.", + "기술 부채(Technical Debt)는 빠른 개발을 위해 희생한 코드 품질이 누적된 비용입니다.", + "아키텍처 결정 기록(ADR)은 중요한 설계 결정과 그 이유를 문서화합니다.", + "API First Design은 API 명세를 먼저 정의하고 구현하는 개발 방법입니다.", + "OpenAPI(Swagger)는 REST API를 문서화하는 표준 명세입니다.", + "Protobuf(Protocol Buffers)는 Google의 효율적인 바이너리 직렬화 형식입니다.", + "JSON은 웹에서 가장 널리 사용되는 텍스트 기반 데이터 교환 형식입니다.", + "YAML은 사람이 읽기 쉬운 데이터 직렬화 형식으로, 설정 파일에 많이 사용됩니다.", + "TOML은 설정 파일을 위한 직관적인 형식으로, Rust의 Cargo.toml에서 유명합니다.", + "Markdown은 경량 마크업 언어로, 문서 작성과 README에 널리 사용됩니다.", + "LaTeX는 학술 논문과 수식 작성에 특화된 조판 시스템입니다.", + "Unicode는 전 세계 모든 문자를 단일 체계로 표현하는 국제 문자 인코딩 표준입니다.", + "UTF-8은 유니코드를 가변 길이로 인코딩하는 방식으로, 웹의 96% 이상이 사용합니다.", + "Base64는 바이너리 데이터를 ASCII 문자로 인코딩하는 방식으로, 이메일과 웹에서 사용됩니다.", + "정규표현식(Regex)은 문자열 패턴을 정의하여 검색·치환하는 강력한 도구입니다.", + "빅오 표기법(Big-O)은 알고리즘의 시간·공간 복잡도를 표현하는 수학적 표기법입니다.", + "해시 테이블은 키-값 쌍을 O(1)에 검색하는 자료구조입니다.", + "이진 탐색(Binary Search)은 정렬된 배열에서 O(log n)에 원소를 찾는 알고리즘입니다.", + "그래프 알고리즘(BFS/DFS)은 노드와 간선으로 구성된 자료구조를 탐색합니다.", + "동적 프로그래밍(DP)은 하위 문제를 저장하여 중복 계산을 방지하는 알고리즘 기법입니다.", + "Rust는 메모리 안전성을 보장하는 시스템 프로그래밍 언어로, C++의 대안으로 부상 중입니다.", + "Go(Golang)는 Google이 만든 간결한 언어로, 동시성 지원과 빠른 컴파일이 특징입니다.", + "TypeScript는 JavaScript에 정적 타입을 추가한 언어로, 대규모 프로젝트에서 선호됩니다.", + "Kotlin은 JVM 기반 언어로, Android 공식 개발 언어이며 Java와 100% 호환됩니다.", + "Swift는 Apple 생태계의 주력 언어로, 안전성과 성능이 뛰어납니다.", + "Python은 배우기 쉽고 생태계가 풍부한 범용 프로그래밍 언어로, AI/데이터 분야 1위입니다.", + "C#은 Microsoft의 .NET 플랫폼 언어로, 엔터프라이즈 애플리케이션과 게임 개발에 사용됩니다.", + "Java는 플랫폼 독립적인 객체지향 언어로, 엔터프라이즈 시스템의 표준입니다.", + "React는 Facebook의 UI 라이브러리로, 컴포넌트 기반 프론트엔드 개발의 표준입니다.", + "Vue.js는 점진적 JavaScript 프레임워크로, 학습이 쉽고 유연한 것이 특징입니다.", + "Next.js는 React 기반 풀스택 프레임워크로, SSR과 ISR을 지원합니다.", + "Nuxt는 Vue.js 기반 풀스택 프레임워크로, SSR, SSG, ISR을 모두 지원합니다.", + "Svelte는 컴파일러 기반 프레임워크로, 가상 DOM 없이 빠른 UI를 구현합니다.", + "Tailwind CSS는 유틸리티 퍼스트 CSS 프레임워크로, 클래스 조합으로 디자인합니다.", + "WebAssembly(Wasm)는 브라우저에서 네이티브에 가까운 성능으로 코드를 실행합니다.", + "Progressive Web App(PWA)은 웹 기술로 네이티브 앱 수준의 경험을 제공합니다.", + "Electron은 웹 기술(HTML/CSS/JS)로 데스크톱 앱을 만드는 프레임워크입니다.", + "Tauri는 Rust 기반 경량 데스크톱 앱 프레임워크로, Electron의 대안입니다.", + "Flutter는 Google의 크로스플랫폼 UI 프레임워크로, Dart 언어를 사용합니다.", + "React Native는 React로 iOS/Android 네이티브 앱을 개발하는 프레임워크입니다.", + ".NET MAUI는 Microsoft의 크로스플랫폼 앱 프레임워크로, .NET으로 개발합니다.", + "WPF(Windows Presentation Foundation)는 .NET 기반 Windows 데스크톱 UI 프레임워크입니다.", + "Blazor는 C#으로 웹 UI를 개발하는 .NET 프레임워크입니다.", + "Spring Boot는 Java 엔터프라이즈 애플리케이션을 빠르게 개발하는 프레임워크입니다.", + "FastAPI는 Python의 고성능 비동기 웹 프레임워크로, 자동 문서화가 강점입니다.", + "Django는 Python의 풀스택 웹 프레임워크로, '배터리 포함' 철학을 따릅니다.", + "Flask는 Python의 경량 웹 프레임워크로, 마이크로 프레임워크 철학을 따릅니다.", + "NestJS는 TypeScript 기반 Node.js 백엔드 프레임워크로, Angular 스타일의 모듈 구조입니다.", + "Express.js는 Node.js의 최소한의 웹 프레임워크로, 가장 널리 사용됩니다.", + "Deno는 Node.js 창시자가 만든 보안 우선 JavaScript/TypeScript 런타임입니다.", + "Bun은 초고속 JavaScript 런타임으로, 번들러·패키지 매니저·테스트 러너를 내장합니다.", + "npm은 Node.js의 기본 패키지 매니저로, 세계 최대 소프트웨어 레지스트리입니다.", + "pnpm은 디스크 공간 효율적인 Node.js 패키지 매니저로, 하드링크를 활용합니다.", + "Conda는 Python의 환경·패키지 관리 도구로, 과학 계산 분야에서 널리 사용됩니다.", + "pip는 Python의 표준 패키지 설치 도구입니다.", + "Poetry는 Python 프로젝트 의존성과 빌드를 관리하는 도구로, pyproject.toml을 사용합니다.", + "NuGet은 .NET의 패키지 관리자로, 라이브러리를 검색·설치·관리합니다.", + "Maven은 Java 프로젝트 빌드·의존성 관리 도구로, pom.xml을 사용합니다.", + "Gradle은 JVM 프로젝트 빌드 도구로, Groovy/Kotlin DSL로 빌드 스크립트를 작성합니다.", + "CMake는 C/C++ 프로젝트의 크로스플랫폼 빌드 시스템 생성기입니다.", + "MSBuild는 .NET 프로젝트를 빌드하는 Microsoft의 빌드 엔진입니다.", + "Bazel은 Google의 대규모 프로젝트를 위한 빌드·테스트 시스템입니다.", + "Agile은 짧은 반복 주기로 소프트웨어를 개발하는 방법론입니다.", + "Scrum은 스프린트 단위로 작업을 관리하는 Agile 프레임워크입니다.", + "Kanban은 작업 흐름을 시각화하고 WIP를 제한하여 효율을 높이는 관리 방법입니다.", + "Sprint은 Scrum에서 1~4주 단위의 개발 반복 주기입니다.", + "Stand-up Meeting은 매일 짧게 진행하는 팀 상태 공유 회의입니다.", + "OKR(Objectives and Key Results)은 목표와 핵심 결과를 설정하는 성과 관리 프레임워크입니다.", + "SWE-bench는 AI 코딩 에이전트의 소프트웨어 엔지니어링 능력을 벤치마킹합니다.", + "HumanEval은 LLM의 코드 생성 능력을 측정하는 OpenAI의 벤치마크입니다.", + "MMLU는 다양한 학문 분야의 이해도를 측정하는 AI 벤치마크입니다.", + "Perplexity는 언어 모델의 예측 불확실성을 측정하는 지표입니다.", + "BLEU는 기계 번역 품질을 평가하는 자동 메트릭입니다.", + "ROUGE는 요약 품질을 평가하는 메트릭으로, 정답과의 겹침을 측정합니다.", + "Synthetic Data는 실제 데이터의 통계적 특성을 모방하여 인공적으로 생성한 데이터입니다.", + "Data Augmentation은 기존 데이터를 변환하여 학습 데이터를 확장하는 기법입니다.", + "Knowledge Distillation은 큰 모델의 지식을 작은 모델에 전이하는 모델 압축 기법입니다.", + "Pruning은 신경망에서 중요도가 낮은 연결을 제거하여 모델을 경량화합니다.", + "Batch Normalization은 학습 중 각 층의 입력을 정규화하여 학습을 안정화합니다.", + "Dropout은 학습 시 일부 뉴런을 무작위로 비활성화하여 과적합을 방지합니다.", + "Learning Rate Scheduling은 학습률을 동적으로 조절하여 최적화를 개선합니다.", + "Adam Optimizer는 적응형 학습률을 사용하는 효율적인 경사 하강 최적화 알고리즘입니다.", + "Gradient Descent는 손실 함수를 최소화하기 위해 파라미터를 반복적으로 조정합니다.", + "Backpropagation은 신경망에서 그래디언트를 역전파하여 가중치를 업데이트합니다.", + "Cross-Entropy Loss는 분류 문제에서 예측과 실제 분포의 차이를 측정합니다.", + "Softmax는 출력값을 확률 분포로 변환하는 활성화 함수입니다.", + "ReLU(Rectified Linear Unit)는 음수를 0으로 만드는 가장 널리 사용되는 활성화 함수입니다.", + "GeLU는 Gaussian Error Linear Unit으로, Transformer에서 주로 사용되는 활성화 함수입니다.", + "Convolution Neural Network(CNN)은 이미지 처리에 특화된 신경망 아키텍처입니다.", + "Recurrent Neural Network(RNN)은 시퀀스 데이터 처리를 위한 순환 신경망입니다.", + "LSTM(Long Short-Term Memory)은 장기 의존성을 학습하는 RNN 변형입니다.", + "GRU(Gated Recurrent Unit)는 LSTM보다 단순한 게이트 구조의 RNN 변형입니다.", + "Autoencoder는 입력을 압축(인코딩)했다가 복원(디코딩)하며 표현을 학습합니다.", + "Contrastive Learning은 유사한 쌍은 가깝게, 다른 쌍은 멀게 학습하는 자기지도 학습입니다.", + "Self-Supervised Learning은 레이블 없이 데이터 자체에서 학습 신호를 생성합니다.", + "Few-Shot Learning은 소수의 예시만으로 새로운 클래스를 학습하는 기법입니다.", + "Meta-Learning은 '학습하는 방법을 학습'하여 새로운 작업에 빠르게 적응합니다.", + "Prompt Tuning은 모델 파라미터를 고정하고 프롬프트만 학습하는 효율적 방법입니다.", + "Instruction Tuning은 지시-응답 쌍으로 학습하여 모델의 지시 따르기 능력을 향상시킵니다.", + "GGUF는 양자화된 LLM 모델의 파일 포맷으로, Ollama와 llama.cpp에서 사용됩니다.", + "Safetensors는 Hugging Face의 안전한 모델 직렬화 형식으로, pickle보다 보안이 강합니다.", + "Tokenizer는 텍스트를 토큰으로 분할하는 도구로, BPE/WordPiece/SentencePiece 등이 있습니다.", + "BPE(Byte Pair Encoding)는 빈번한 바이트 쌍을 반복적으로 병합하는 토크나이저입니다.", + "Temperature는 LLM 출력의 무작위성을 조절하는 파라미터입니다 (높을수록 창의적).", + "Top-p(Nucleus Sampling)는 누적 확률이 p 이하인 토큰만 샘플링합니다.", + "Top-k Sampling은 확률이 높은 상위 k개 토큰에서만 샘플링합니다.", + "Beam Search는 여러 후보 시퀀스를 동시에 탐색하여 최적 출력을 생성합니다.", + "Structured Output은 LLM이 JSON 등 정해진 형식으로 응답을 생성하게 합니다.", + "System Prompt는 AI의 역할과 행동 규칙을 정의하는 초기 지시문입니다.", + "Context Window Scaling은 더 긴 문맥을 처리하기 위해 위치 인코딩을 확장하는 기술입니다.", + "RoPE(Rotary Position Embedding)는 회전 변환으로 위치 정보를 인코딩합니다.", + "ALiBi(Attention with Linear Biases)는 학습 없이 컨텍스트 길이를 확장합니다.", + "Sliding Window Attention은 지역 컨텍스트에만 어텐션을 제한하여 효율을 높입니다.", + "Sparse Attention은 일부 위치에만 선택적으로 어텐션을 적용합니다.", + "Retrieval-Augmented LLM은 검색 결과를 컨텍스트에 추가하여 답변 품질을 높입니다.", + "Knowledge Graph는 엔티티와 관계를 그래프로 표현하여 구조화된 지식을 저장합니다.", + "Agentic RAG는 에이전트가 필요한 정보를 능동적으로 검색하는 고급 RAG 기법입니다.", + "GraphRAG는 지식 그래프와 RAG를 결합하여 복잡한 추론을 지원합니다.", + "Multi-Agent System은 여러 AI 에이전트가 협력하여 복잡한 작업을 수행합니다.", + "Orchestration은 여러 AI 모델과 도구를 조율하여 워크플로우를 실행합니다.", + "AI Gateway는 여러 AI 서비스를 통합 관리하는 프록시 계층입니다.", + "Model Registry는 학습된 모델의 버전, 메타데이터, 배포 상태를 관리합니다.", + "A/B Testing for Models는 여러 AI 모델의 성능을 실제 트래픽으로 비교 실험합니다.", + "Canary Release for AI는 새 모델을 소수 사용자에게 먼저 배포하여 검증합니다.", + "Shadow Mode는 새 모델을 실제 서비스와 병행 실행하되 응답은 기존 모델만 반환합니다.", + "AI Safety는 AI 시스템이 의도대로 동작하고 해를 끼치지 않도록 보장하는 분야입니다.", + "AI Alignment은 AI의 행동을 인간의 가치와 의도에 맞게 정렬하는 연구입니다.", + "Explainable AI(XAI)는 AI의 결정 과정을 인간이 이해할 수 있도록 설명합니다.", + "Responsible AI는 공정성, 투명성, 프라이버시를 고려한 AI 개발 원칙입니다.", + "AI Ethics는 AI 기술의 사회적 영향과 윤리적 사용에 관한 규범입니다.", + "Bias in AI는 학습 데이터의 편향이 AI 결정에 반영되는 문제입니다.", + "Fairness in AI는 AI 시스템이 모든 그룹에게 공정하게 작동하도록 보장합니다.", + "AI Regulation은 AI 기술의 안전한 사용을 위한 법적·제도적 규제입니다.", + "EU AI Act는 AI 시스템을 위험 등급별로 규제하는 유럽연합의 법률입니다.", + "AGI(Artificial General Intelligence)는 인간 수준의 범용 지능을 가진 AI 개념입니다.", + "ASI(Artificial Superintelligence)는 인간 지능을 초월하는 AI 개념입니다.", + "Narrow AI는 특정 작업에 특화된 현재의 AI 시스템입니다.", + "AI Governance는 조직 내에서 AI를 안전하고 책임감 있게 운영하기 위한 체계입니다.", + "Prompt Injection은 악의적 프롬프트로 AI의 안전장치를 우회하려는 공격입니다.", + "Jailbreaking은 AI 모델의 제한사항을 우회하여 금지된 출력을 유도하려는 시도입니다.", + "Red Teaming은 AI 시스템의 취약점을 발견하기 위해 의도적으로 공격하는 테스트입니다.", + "Guardrails은 AI 출력이 안전하고 적절한 범위 내에 있도록 제한하는 메커니즘입니다.", + "Content Filtering은 AI가 생성한 유해 콘텐츠를 탐지하고 차단합니다.", + "Watermarking은 AI가 생성한 콘텐츠에 보이지 않는 식별자를 삽입합니다.", + "Deepfake는 AI로 생성한 가짜 영상·음성으로, 탐지 기술이 함께 발전 중입니다.", + "AI-generated Content Detection은 텍스트가 AI에 의해 생성되었는지 판별합니다.", + "Copilot Pattern은 AI가 인간의 작업을 보조하는 협력적 인터페이스 패턴입니다.", + "AI-native Application은 AI를 핵심 기능으로 설계된 차세대 소프트웨어입니다.", + "OpenTelemetry는 분산 추적·메트릭·로그를 표준화하는 오픈소스 관측 프레임워크입니다.", + "eBPF는 리눅스 커널에서 안전하게 프로그램을 실행하는 기술로, 네트워크·보안·관측에 활용됩니다.", + "WebGPU는 브라우저에서 GPU 컴퓨팅을 수행하는 차세대 웹 그래픽스 API입니다.", + "HTMX는 HTML 속성으로 AJAX 요청을 처리하는 경량 라이브러리입니다.", + "Edge Computing은 데이터를 발생 지점 근처에서 처리하여 지연시간을 줄입니다.", + "Quantum Computing은 양자역학 원리로 특정 문제를 기존 컴퓨터보다 빠르게 풉니다.", + "Post-Quantum Cryptography는 양자 컴퓨터에도 안전한 암호화 알고리즘입니다.", + "Homomorphic Encryption은 암호화된 상태에서 연산을 수행하는 기술입니다.", + "Confidential Computing은 사용 중인 데이터도 암호화하여 보호합니다.", + "FinOps는 클라우드 비용을 최적화하기 위한 재무 운영 방법론입니다.", + "GreenOps는 IT 운영의 탄소 배출을 줄이는 환경 친화적 운영 방법입니다.", + "Sustainable AI는 AI 학습과 추론의 에너지 소비를 줄이기 위한 연구입니다.", + "Carbon-aware Computing은 탄소 배출이 낮은 시간과 지역에서 워크로드를 실행합니다.", + "AIOps는 AI로 IT 운영을 자동화하여 장애를 예측·진단·해결합니다.", + "Platform Engineering은 개발자 경험을 위한 내부 플랫폼을 구축하는 방법론입니다.", + "Internal Developer Platform(IDP)은 개발팀에게 셀프서비스 인프라를 제공합니다.", + "Developer Experience(DX)는 개발자가 도구와 프로세스를 사용하는 경험의 질입니다.", + "Documentation as Code는 문서를 코드와 동일하게 버전 관리하는 방법입니다.", + "API-first Company는 API를 핵심 제품으로 삼는 비즈니스 모델입니다.", + "Composable Architecture는 독립적인 비즈니스 기능을 조합하여 앱을 구성합니다.", + "Event-Driven Architecture는 이벤트를 중심으로 시스템을 설계하는 아키텍처입니다.", + "CNCF(Cloud Native Computing Foundation)는 클라우드 네이티브 오픈소스를 관리하는 재단입니다.", + "OpenAI는 GPT 시리즈를 개발한 AI 연구소로, ChatGPT를 출시했습니다.", + "Anthropic은 Claude를 개발한 AI 안전 연구소로, Constitutional AI가 핵심입니다.", + "Google DeepMind는 AlphaFold, Gemini 등을 개발한 AI 연구소입니다.", + "Meta AI는 LLaMA 오픈소스 모델을 공개하여 AI 민주화에 기여하고 있습니다.", + "Mistral AI는 프랑스의 AI 스타트업으로, 효율적인 오픈 모델을 제공합니다.", + "Cohere는 기업용 LLM과 RAG 솔루션을 제공하는 AI 기업입니다.", + "Perplexity AI는 AI 기반 검색 엔진으로, 출처를 명시하는 답변을 제공합니다.", + "Midjourney는 텍스트로부터 고품질 이미지를 생성하는 AI 서비스입니다.", + "Runway는 AI 기반 동영상 생성·편집 도구입니다.", + "Sora는 OpenAI의 텍스트-투-비디오 생성 AI 모델입니다.", + "Kling은 중국 Kuaishou의 텍스트-투-비디오 AI 모델입니다.", + "NotebookLM은 Google의 AI 노트북으로, 문서를 업로드하면 AI가 분석·요약합니다.", + "Artifacts는 Claude의 코드·문서·다이어그램 생성 기능입니다.", + "Computer Use는 AI가 실제 컴퓨터 화면을 보고 마우스·키보드를 조작하는 기술입니다.", + "Model Card는 AI 모델의 성능, 제한사항, 용도를 문서화한 표준 양식입니다.", + "Datasheet for Datasets는 데이터셋의 수집 방법, 편향, 용도를 기록합니다.", + "Evaluation Harness는 LLM 벤치마크를 체계적으로 실행하는 프레임워크입니다.", + "LLM Leaderboard는 다양한 벤치마크에서 LLM 성능을 비교하는 순위표입니다.", + "Chatbot Arena는 사용자 투표로 LLM 성능을 비교하는 커뮤니티 벤치마크입니다.", + "ELO Rating은 체스에서 유래한 상대적 실력 평가 시스템으로, LLM 비교에 활용됩니다.", + "Scaling Law는 모델·데이터·컴퓨팅 규모와 성능의 관계를 설명하는 법칙입니다.", + "Chinchilla Scaling은 모델 크기와 데이터 양의 최적 비율을 제시합니다.", + "Inference Scaling은 추론 시 컴퓨팅을 더 투입하여 성능을 높이는 접근입니다.", + "Test-Time Compute는 추론 시점에 추가 연산으로 답변 품질을 향상시킵니다.", + "o1/o3 Reasoning은 OpenAI의 추론 특화 모델로, 단계적 사고를 수행합니다.", + "Extended Thinking은 Claude의 심층 추론 모드로, 복잡한 문제에서 정확도가 높습니다.", + "Streaming은 LLM 응답을 토큰 단위로 실시간 전송하여 체감 지연을 줄입니다.", + "Batch Processing은 여러 요청을 모아 한 번에 처리하여 처리량을 높입니다.", + "Caching은 반복 요청의 결과를 저장하여 재사용하는 성능 최적화 기법입니다.", + "Semantic Caching은 의미적으로 유사한 쿼리의 캐시를 재사용합니다.", + "Prefix Caching은 공통 프롬프트 접두사의 KV Cache를 재사용합니다.", + "Model Merging은 여러 Fine-tuned 모델의 가중치를 병합하여 새로운 능력을 조합합니다.", + "DPO(Direct Preference Optimization)는 RLHF 없이 인간 선호도를 직접 학습합니다.", + "ORPO(Odds Ratio Preference Optimization)는 참조 모델 없이 선호도를 학습합니다.", + "SimPO(Simple Preference Optimization)는 길이 보정 없이 간결하게 선호도를 최적화합니다.", + "Continuous Pre-training은 기존 모델에 새로운 도메인 데이터를 추가로 사전학습합니다.", + "Curriculum Learning은 쉬운 데이터부터 어려운 데이터 순으로 학습하여 효율을 높입니다.", + "Reward Hacking은 AI가 보상 함수의 허점을 이용하여 비정상적 행동을 보이는 현상입니다.", + "Alignment Tax는 AI 안전 정렬이 모델 성능을 일부 희생시키는 비용입니다.", + "Capability Control은 AI의 능력을 의도적으로 제한하여 안전성을 확보합니다.", + "Corrigibility는 AI가 인간의 수정 명령에 순응하는 특성입니다.", + "Inner Alignment은 학습 목표와 AI의 실제 목표가 일치하는지 확인하는 연구입니다.", + "Outer Alignment은 인간이 설정한 목표가 인간의 진정한 의도를 반영하는지 확인합니다.", + "Interpretability는 AI 모델의 내부 작동 원리를 이해하는 연구 분야입니다.", + "Mechanistic Interpretability는 신경망 내부 회로를 역공학하여 동작을 이해합니다.", + "Sparse Autoencoder(SAE)는 신경망 활성화를 해석 가능한 특성으로 분해합니다.", + "Circuit Discovery는 Transformer 내부에서 특정 기능을 수행하는 회로를 찾습니다.", + "Attention Pattern Analysis는 모델이 어떤 토큰에 주목하는지 시각화합니다.", + "Probing은 모델의 중간 표현에서 특정 정보를 추출하는 분석 기법입니다.", + "SHAP(SHapley Additive exPlanations)은 각 특성의 기여도를 계산하는 XAI 기법입니다.", + "LIME(Local Interpretable Model-agnostic Explanations)은 개별 예측을 설명합니다.", + "GradCAM은 CNN의 판단 근거를 히트맵으로 시각화하는 기법입니다.", + "AI Observability는 AI 시스템의 입출력·성능·이상을 모니터링하는 체계입니다.", + "LLMOps는 LLM의 개발·배포·운영을 체계적으로 관리하는 방법론입니다.", + "Prompt Management는 프롬프트의 버전 관리, 테스트, A/B 실험을 체계화합니다.", + "AI Pipeline Orchestration은 데이터→학습→평가→배포 파이프라인을 자동화합니다.", + "Model Serving은 학습된 모델을 API로 배포하여 추론 요청을 처리합니다.", + "Triton Inference Server는 NVIDIA의 다중 모델 추론 서빙 플랫폼입니다.", + "BentoML은 ML 모델을 API로 배포하는 오픈소스 프레임워크입니다.", + "MLflow는 ML 실험 추적, 모델 관리, 배포를 통합하는 오픈소스 플랫폼입니다.", + "Weights & Biases(W&B)는 ML 실험 추적과 시각화를 위한 플랫폼입니다.", + "ClearML은 ML 파이프라인 자동화와 실험 관리를 위한 오픈소스 플랫폼입니다.", + "Label Studio는 데이터 레이블링을 위한 오픈소스 도구입니다.", + "Roboflow는 컴퓨터 비전 데이터셋 관리와 학습을 위한 플랫폼입니다.", + "Haystack은 RAG 시스템 구축을 위한 오픈소스 프레임워크입니다.", + "Chroma는 AI 애플리케이션을 위한 오픈소스 임베딩 데이터베이스입니다.", + "Weaviate는 벡터 검색과 하이브리드 검색을 지원하는 벡터 데이터베이스입니다.", + "Pinecone은 관리형 벡터 데이터베이스 서비스로, 대규모 유사도 검색을 지원합니다.", + "Milvus는 대규모 벡터 데이터를 위한 오픈소스 벡터 데이터베이스입니다.", + "FAISS(Facebook AI Similarity Search)는 고속 벡터 유사도 검색 라이브러리입니다.", + "Annoy(Approximate Nearest Neighbors Oh Yeah)는 근사 최근접 이웃 검색 라이브러리입니다.", + "HNSW(Hierarchical Navigable Small World)는 고성능 근사 최근접 이웃 알고리즘입니다.", + "Hybrid Search는 키워드 검색(BM25)과 벡터 검색을 결합하여 정확도를 높입니다.", + "Cross-Encoder는 두 텍스트를 직접 비교하여 유사도를 정밀하게 계산합니다.", + "Bi-Encoder는 각 텍스트를 독립적으로 인코딩하여 빠른 유사도 검색을 지원합니다.", + "Re-ranking은 초기 검색 결과를 정밀 모델로 재정렬하여 품질을 높입니다.", + "Chunking은 긴 문서를 적절한 크기로 분할하여 RAG 검색 효율을 높입니다.", + "Semantic Chunking은 의미적 경계를 기준으로 문서를 분할합니다.", + "Agentic Chunking은 AI가 문서 구조를 이해하고 최적의 청크를 결정합니다.", + "Document Parsing은 PDF, DOCX, HTML 등 다양한 형식의 문서에서 텍스트를 추출합니다.", + "Layout Analysis는 문서의 시각적 구조(표, 이미지, 단)를 분석합니다.", + "Table Extraction은 문서에서 테이블을 구조적으로 추출하는 기술입니다.", + "Vision Document Understanding은 멀티모달 AI로 문서를 이미지로 처리합니다.", + "Code Generation은 자연어 설명으로부터 프로그래밍 코드를 자동 생성합니다.", + "Code Review AI는 코드 변경 사항을 자동으로 리뷰하고 개선점을 제안합니다.", + "Code Completion은 작성 중인 코드의 다음 내용을 예측하여 자동 완성합니다.", + "Code Explanation은 코드의 동작을 자연어로 설명합니다.", + "Code Translation은 한 프로그래밍 언어의 코드를 다른 언어로 변환합니다.", + "Bug Detection은 AI가 코드에서 잠재적 버그와 취약점을 자동으로 발견합니다.", + "Test Generation은 AI가 코드에 대한 단위 테스트를 자동으로 생성합니다.", + "Documentation Generation은 코드로부터 API 문서를 자동 생성합니다.", + "Commit Message Generation은 코드 변경 사항으로부터 커밋 메시지를 자동 작성합니다.", + "Fill-in-the-Middle(FIM)은 앞뒤 컨텍스트를 보고 중간 코드를 채우는 기법입니다.", + "Repository-level Understanding은 전체 코드베이스를 이해하여 맥락 있는 코드를 생성합니다.", + "Dependency Analysis는 코드 모듈 간 의존 관계를 분석합니다.", + "Call Graph는 함수 호출 관계를 그래프로 표현하여 코드 흐름을 이해합니다.", + "AST(Abstract Syntax Tree)는 소스 코드의 구문 구조를 트리로 표현합니다.", + "Code Smell은 잠재적 설계 문제를 나타내는 코드 패턴입니다.", + "Dead Code는 실행되지 않는 불필요한 코드로, 정리 대상입니다.", + "Cyclomatic Complexity는 코드의 복잡도를 측정하는 소프트웨어 메트릭입니다.", + "Cognitive Complexity는 코드를 이해하는 인지적 어려움을 측정합니다.", + "SonarQube는 코드 품질과 보안을 지속적으로 검사하는 정적 분석 플랫폼입니다.", + "ESLint는 JavaScript/TypeScript 코드의 문제를 찾고 수정하는 린트 도구입니다.", + "Prettier는 코드를 일관된 스타일로 자동 포매팅하는 도구입니다.", + "Black은 Python 코드를 일관된 스타일로 포매팅하는 'Uncompromising' 포매터입니다.", + "Ruff는 Rust로 작성된 초고속 Python 린터+포매터입니다.", + "mypy는 Python의 정적 타입 검사 도구로, 타입 힌트를 검증합니다.", + "Pyright는 Microsoft의 Python 타입 검사기로, VS Code와 통합됩니다.", + "clang-tidy는 C++ 코드의 스타일 문제와 버그를 검사하는 린트 도구입니다.", + "RustAnalyzer는 Rust의 공식 LSP 서버로, IDE에서 실시간 분석을 제공합니다.", + "Copilot Workspace는 GitHub의 AI 기반 개발 환경으로, 이슈에서 코드까지 자동화합니다.", + "Devin은 Cognition의 AI 소프트웨어 엔지니어로, 자율적 코딩 에이전트입니다.", + "SWE-agent는 LLM이 실제 소프트웨어 엔지니어링 작업을 수행하는 오픈소스 에이전트입니다.", + "Aider는 터미널 기반 AI 페어 프로그래밍 도구로, Git과 긴밀히 통합됩니다.", + "Continue는 VS Code/JetBrains용 오픈소스 AI 코드 어시스턴트입니다.", + "Cody는 Sourcegraph의 AI 코딩 어시스턴트로, 코드베이스 전체를 이해합니다.", + "TabNine는 AI 코드 자동 완성 도구로, 로컬 모델을 지원합니다.", + "Amazon Q는 AWS의 AI 어시스턴트로, 코드 변환과 보안 스캔을 제공합니다.", + "CodeWhisperer는 Amazon의 AI 코드 생성 도구로, 보안 취약점 검사를 포함합니다.", + "Gemini Code Assist는 Google의 AI 코딩 도구로, Gemini 모델을 활용합니다.", + "Windsurf는 Codeium의 AI 코드 편집기로, Cascade 에이전트가 특징입니다.", + "Bolt.new는 브라우저에서 AI가 풀스택 앱을 즉시 생성하는 플랫폼입니다.", + "v0는 Vercel의 AI UI 생성기로, 프롬프트로 React 컴포넌트를 만듭니다.", + "Replit Agent는 Replit의 AI 코딩 에이전트로, 앱을 자동으로 빌드합니다.", + "Lovable은 AI가 프로덕션 수준의 앱을 생성하는 풀스택 빌더입니다.", + "Manus는 범용 AI 에이전트로, 웹 브라우징과 코딩을 자율적으로 수행합니다.", + "Claude Agent SDK는 Anthropic의 에이전트 개발 도구로, 도구 사용과 오케스트레이션을 지원합니다.", + "OpenAI Agents SDK는 에이전트 간 핸드오프와 가드레일을 지원하는 Python 프레임워크입니다.", + "Google ADK(Agent Development Kit)는 멀티에이전트 시스템을 구축하는 프레임워크입니다.", + "A2A(Agent-to-Agent)는 Google이 제안한 에이전트 간 통신 표준 프로토콜입니다.", + "AG2(AutoGen)는 Microsoft의 멀티에이전트 대화 프레임워크입니다.", + "Pydantic AI는 FastAPI 스타일의 타입 안전 AI 에이전트 프레임워크입니다.", + "Instructor는 LLM 출력을 Pydantic 모델로 구조화하는 라이브러리입니다.", + "Marvin은 AI 함수를 Python 함수처럼 사용하는 라이브러리입니다." +] + diff --git a/src/AxCopilot/Assets/Quotes/motivational.json b/src/AxCopilot/Assets/Quotes/motivational.json new file mode 100644 index 0000000..89c87f1 --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/motivational.json @@ -0,0 +1,502 @@ +[ + "오늘도 최선을 다하는 당신이 있어 세상이 조금 더 나아집니다.", + "출근하는 것만으로도 대단한 용기입니다.", + "하루를 시작한 당신, 이미 충분히 훌륭합니다.", + "오늘은 어제보다 조금 더 좋은 날이 될 거예요.", + "새 아침이 새로운 기회를 가져옵니다.", + "시작이 반입니다. 당신은 이미 시작했습니다.", + "오늘 하루도 당신만의 페이스로 나아가세요.", + "오늘 하루도 당신을 응원합니다.", + "아침 공기를 마시며 오늘도 시작합니다. 잘 될 거예요.", + "오늘의 작은 시작이 내일의 큰 이야기가 됩니다.", + "어떤 하루라도 당신이 있으면 의미 있습니다.", + "오늘 하루도 한 걸음씩 나아가면 충분합니다.", + "빛나지 않아도 됩니다. 그냥 당신답게 있으면 됩니다.", + "완벽하지 않아도 오늘 하루를 잘 보낼 수 있습니다.", + "오늘도 나를 위해 일하러 온 나에게 감사합니다.", + "이 하루가 쌓여 멋진 삶이 만들어집니다.", + "오늘도 당신은 충분히 잘하고 있습니다.", + "어제 힘들었다면 오늘은 조금 더 편할 거예요.", + "출근하는 길, 당신의 하루가 빛나길 바랍니다.", + "하루를 잘 시작했다면 이미 잘 하고 있는 겁니다.", + "오늘 만날 멋진 일들이 기다리고 있습니다.", + "어렵더라도 오늘 하루 끝에는 뿌듯함이 남을 거예요.", + "지금 이 순간도 당신은 최선을 다하고 있습니다.", + "월요일이든 금요일이든, 당신이 있으면 됩니다.", + "오늘도 한 박자 쉬어가도 괜찮습니다.", + "작은 것 하나 완수했을 때의 기쁨을 기억하세요.", + "천천히 가도 괜찮아요. 방향이 맞으면 됩니다.", + "오늘은 어떤 새로운 것을 배울까요? 기대됩니다.", + "당신의 노력은 반드시 쌓입니다.", + "오늘 하루도 당신이 있어 팀이 든든합니다.", + "힘든 날일수록 오늘을 잘 버텨낸 나를 칭찬해주세요.", + "오늘도 건강하게 일할 수 있어서 감사합니다.", + "지금 하는 일이 결국 의미가 있을 것입니다.", + "당신은 생각보다 훨씬 많이 해내고 있습니다.", + "좋은 일은 생각보다 가까이 있습니다. 오늘 찾아보세요.", + "오늘은 어제의 나보다 한 뼘 성장하는 날입니다.", + "아침 커피 한 잔처럼, 오늘 하루도 따뜻하게 시작해봅시다.", + "오늘 하루도 당신다움으로 가득 채우세요.", + "작은 진전도 진전입니다. 축하해주세요.", + "당신의 하루가 기쁨으로 가득하길 바랍니다.", + "오늘도 웃는 날이 되기를 바랍니다.", + "일이 잘 안 될 때도 당신은 최선을 다하고 있습니다.", + "오늘 출근한 것만으로도 잘했습니다.", + "새로운 하루는 새로운 기회입니다.", + "모든 위대한 성취는 평범한 하루에서 시작됩니다.", + "당신의 가능성은 무한합니다.", + "오늘도 좋은 하루가 되기를 응원합니다!", + "꾸준함은 결국 재능을 이깁니다.", + "당신이 하는 일에는 가치가 있습니다.", + "조금씩 해도 괜찮아요. 멈추지만 마세요.", + "오늘 하루가 좋은 기억으로 남길 바랍니다.", + "당신이 해낸 것들을 잊지 마세요.", + "오늘 하루도 나를 응원하며 시작합니다.", + "어제의 나보다 오늘의 내가 더 지혜롭습니다.", + "오늘 하루도 의미 있는 일을 할 수 있습니다.", + "당신의 노력이 오늘도 세상을 조금 더 좋게 만듭니다.", + "일이 산더미 같아 보여도, 하나씩 하면 됩니다.", + "오늘도 당신의 하루를 응원합니다.", + "당신이 있어 우리 팀이 더 빛납니다.", + "지금 이 순간, 당신은 충분합니다.", + "오늘도 나에게 필요한 하루입니다.", + "작은 노력들이 쌓여 큰 변화를 만듭니다.", + "어떤 하루든 끝나면 해낸 하루입니다.", + "오늘도 건강하게 하루를 마치길 바랍니다.", + "당신의 오늘이 내일의 자양분이 됩니다.", + "지금 시작하면 됩니다. 언제나 지금이 가장 좋은 때입니다.", + "당신이 오늘 해낸 일들이 당신을 성장시킵니다.", + "오늘의 수고가 내일의 여유로 돌아옵니다.", + "어렵다고 느껴질 때, 이미 많이 성장했다는 신호입니다.", + "오늘도 한 발 더 내딛는 당신을 응원합니다.", + "노력은 배신하지 않습니다. 오늘도 열심히 하세요.", + "당신이 기울이는 모든 노력은 반드시 보상받습니다.", + "성장은 눈에 보이지 않아도 분명히 일어나고 있습니다.", + "실수는 성장의 증거입니다. 두려워하지 마세요.", + "오늘의 어려움이 내일의 능력을 만듭니다.", + "잘 모르는 것이 있어도 괜찮아요. 배우면 됩니다.", + "도전하는 사람이 변화를 만듭니다.", + "할 수 없다고 생각했던 일을 해냈을 때의 짜릿함을 기억하세요.", + "모든 전문가는 처음엔 초보였습니다.", + "어제보다 조금 나아졌다면 성공입니다.", + "배움에는 끝이 없습니다. 오늘도 새로 배우는 당신이 멋집니다.", + "당신의 노력이 쌓여 실력이 됩니다.", + "꾸준히 하는 것이 갑자기 잘하는 것보다 강합니다.", + "오늘 한 가지라도 더 알게 된다면 성공한 하루입니다.", + "작은 개선이 큰 차이를 만듭니다.", + "잘 된 것보다 잘 안 된 것에서 더 많이 배웁니다.", + "실패는 더 잘 하기 위한 연습입니다.", + "오늘의 노력이 미래의 나를 만듭니다.", + "당신이 성장하는 속도가 중요한 게 아닙니다. 방향이 중요합니다.", + "포기하지 않으면 결국엔 해냅니다.", + "어렵지 않으면 성장도 없습니다. 지금 어려운 건 잘 하고 있다는 뜻입니다.", + "아는 것이 많아질수록 모르는 것도 더 보입니다. 그게 성장입니다.", + "실수를 인정하는 용기가 성장을 부릅니다.", + "배움은 나이를 가리지 않습니다. 오늘도 배워봐요.", + "모든 기술은 연습으로 완성됩니다.", + "오늘의 불편함이 내일의 편안함이 됩니다.", + "잘 안 된다고 느낄 때가 가장 많이 자랄 때입니다.", + "당신은 생각보다 훨씬 빠르게 성장하고 있습니다.", + "스스로를 믿어야 성장의 문이 열립니다.", + "오늘 새로 도전한 것이 있다면 그것만으로 훌륭합니다.", + "정답이 아니어도 도전하는 것이 중요합니다.", + "천천히 해도 됩니다. 완성이 중요합니다.", + "당신이 오늘 한 걸음이 내일 열 걸음의 기반이 됩니다.", + "어떤 경험도 낭비되지 않습니다. 모두 배움이 됩니다.", + "목표를 향해 나아가는 당신은 이미 성공 중입니다.", + "해보지 않으면 알 수 없습니다. 그래서 해보는 겁니다.", + "당신의 성장 이야기는 아직 진행 중입니다.", + "오늘 배운 것이 내일 빛납니다.", + "느리더라도 나아가는 것이 멈추는 것보다 훨씬 낫습니다.", + "남과 비교하지 마세요. 어제의 나와 비교하면 됩니다.", + "당신이 도전하는 모습이 주변 사람들에게 용기를 줍니다.", + "성장에는 시간이 필요합니다. 기다릴 줄 아는 것도 실력입니다.", + "오늘의 집중이 내일의 결실을 만듭니다.", + "실력은 반복 속에서 만들어집니다.", + "당신의 잠재력은 아직 충분히 발휘되지 않았습니다.", + "오늘 불가능했던 일이 내일은 가능해집니다.", + "끝까지 해내는 당신의 끈기가 빛납니다.", + "지식보다 꾸준함이 더 강한 무기입니다.", + "작은 것을 잘 하는 사람이 큰 것도 잘 합니다.", + "오늘도 성장하는 당신을 응원합니다.", + "지금 하는 것이 언젠가 큰 차이를 만들 것입니다.", + "노력한 만큼 실력이 쌓입니다. 오늘도 쌓아가세요.", + "어렵더라도 포기하지 않는 당신이 자랑스럽습니다.", + "당신이 배우는 모든 것은 당신만의 자산이 됩니다.", + "도전하는 용기, 오늘도 그 용기를 냅시다.", + "변화는 불편하지만 성장을 가져옵니다.", + "실수는 배움의 원료입니다. 두려워하지 마세요.", + "지금 힘들다면 성장의 고통일 수 있습니다.", + "오늘의 배움이 내일의 자신감이 됩니다.", + "당신의 꾸준함은 반드시 꽃을 피웁니다.", + "완성보다 시작이 어렵습니다. 시작한 당신, 잘 했습니다.", + "모든 능력은 연습으로 늘어납니다. 오늘도 연습해봅시다.", + "어제보다 오늘, 오늘보다 내일. 그게 성장입니다.", + "한 발씩, 꾸준히. 그것이 멀리 가는 방법입니다.", + "오늘도 성장 중인 당신이 대단합니다.", + "배움에 나이는 없습니다. 지금이 가장 좋은 때입니다.", + "목표를 향해 작은 발걸음을 내딛는 것, 그게 시작입니다.", + "오늘도 어제보다 더 나아질 기회가 있습니다.", + "지금 하는 노력이 미래의 당신에게 선물이 됩니다.", + "성장은 숫자가 아니라 방향에 있습니다.", + "함께라서 더 멀리 갈 수 있습니다.", + "혼자 빠르게 가기보다 함께 멀리 가는 것이 더 좋습니다.", + "당신의 존재만으로도 팀에 큰 힘이 됩니다.", + "좋은 동료는 삶의 큰 행운입니다.", + "서로 도우면 더 큰 일을 해낼 수 있습니다.", + "팀원의 성공이 나의 성공이기도 합니다.", + "오늘도 팀과 함께하는 시간이 소중합니다.", + "동료의 강점을 발견하고 응원해주세요.", + "함께 웃을 수 있는 팀이 강한 팀입니다.", + "당신이 나누는 작은 도움이 팀의 힘이 됩니다.", + "어려울 때 기댈 수 있는 동료가 있다면 복입니다.", + "팀이 함께 방향을 맞추면 무엇이든 해낼 수 있습니다.", + "당신의 의견은 팀을 더 좋은 방향으로 이끕니다.", + "좋은 분위기를 만드는 것도 중요한 기여입니다.", + "동료의 작은 성공을 함께 기뻐해주세요.", + "신뢰가 팀의 가장 큰 자산입니다.", + "서로의 다름이 팀의 강점이 됩니다.", + "당신이 팀에 있어서 우리 팀이 더 좋습니다.", + "함께할수록 더 큰 일을 이룰 수 있습니다.", + "팀의 작은 성취도 함께 축하해주세요.", + "동료에게 건네는 따뜻한 말 한마디가 힘이 됩니다.", + "혼자가 아니라는 것, 그것만으로도 힘이 납니다.", + "서로를 이해하고 존중하는 팀이 강합니다.", + "당신의 도움이 누군가에게 큰 힘이 됩니다.", + "팀원 한 명 한 명이 퍼즐 조각처럼 소중합니다.", + "의견이 달라도 존중하면 더 좋은 결과가 나옵니다.", + "동료와 함께라면 어려운 일도 가능합니다.", + "당신의 경험이 팀의 지식이 됩니다. 나눠주세요.", + "좋은 동료 한 명이 근무 환경을 바꿉니다.", + "협력은 경쟁보다 더 많은 것을 만들어냅니다.", + "서로를 응원하는 문화가 팀을 성장시킵니다.", + "팀원이 힘들 때 눈치채는 당신이 좋은 동료입니다.", + "함께 이루는 성공이 더 달콤합니다.", + "당신과 함께 일하는 동료들이 행운입니다.", + "팀원 서로의 강점이 모이면 최고의 팀이 됩니다.", + "오늘도 팀과 좋은 하루 보내세요.", + "당신이 팀에 가져오는 긍정적인 에너지가 소중합니다.", + "협력이 단순히 일 잘하는 것 이상을 만들어냅니다.", + "작은 감사 인사가 팀 분위기를 따뜻하게 만듭니다.", + "당신의 팀워크가 빛나는 날입니다.", + "소통을 잘 하는 팀이 좋은 결과를 냅니다.", + "동료에게 먼저 다가가는 것이 용기 있는 행동입니다.", + "팀 안에서 서로를 성장시키는 것이 가장 좋은 투자입니다.", + "당신이 팀에 기여하는 모든 것이 가치 있습니다.", + "한 팀으로 함께하는 오늘이 소중합니다.", + "팀의 다양성이 최고의 아이디어를 만듭니다.", + "당신의 열정이 팀에 좋은 영향을 줍니다.", + "함께 어려움을 헤쳐나갈 때 팀은 더 강해집니다.", + "오늘도 팀과 함께 좋은 성과를 내는 하루 되세요.", + "당신이 있어 우리 팀이 완성됩니다.", + "함께 배우는 팀이 가장 강한 팀입니다.", + "팀원을 응원하는 것이 나를 응원하는 것과 같습니다.", + "서로에게 힘이 되는 오늘이 되기를 바랍니다.", + "당신이 가진 것을 팀과 나눌 때 더 커집니다.", + "팀워크는 연습으로 더 좋아집니다. 오늘도 연습해요.", + "함께하기 때문에 가능한 일들이 있습니다.", + "당신이 팀에 있어서 팀이 든든합니다.", + "서로를 믿는 팀이 어떤 어려움도 이겨냅니다.", + "오늘도 함께해서 고맙습니다.", + "함께라면 어떤 산도 넘을 수 있습니다.", + "당신의 미소가 팀 분위기를 밝게 합니다.", + "팀으로 이룬 성과가 가장 오래 기억됩니다.", + "서로의 다름을 존중할 때 팀은 더 강해집니다.", + "팀의 모든 구성원이 소중한 이유가 있습니다.", + "오늘도 팀과 함께 멋진 일을 해냅시다.", + "당신의 격려 한마디가 동료에게 큰 힘이 됩니다.", + "혼자 해내는 것도 훌륭하지만, 함께하면 더 위대해집니다.", + "좋은 팀을 만드는 것이 가장 중요한 업무입니다.", + "오늘 완료한 일, 아무리 작아도 축하해주세요.", + "할 일 목록에서 하나를 지울 때의 그 기분, 소중히 여기세요.", + "작은 완성들이 쌓여 큰 결과가 됩니다.", + "오늘 어렵던 일을 해낸 당신, 멋집니다.", + "아무리 작은 진전도 진전입니다. 축하합니다.", + "어제 못했던 것을 오늘 해냈다면 성장한 겁니다.", + "목표를 향해 한 발 더 나아간 오늘을 기억하세요.", + "오늘의 작은 성취가 미래의 자신감이 됩니다.", + "어려운 결정을 내린 당신, 잘 했습니다.", + "도움을 요청한 것도 용기 있는 선택입니다. 잘 했습니다.", + "오늘 예상보다 더 잘 해냈다면 스스로 칭찬해주세요.", + "복잡한 문제를 해결했을 때의 그 뿌듯함, 충분히 누리세요.", + "어제보다 오늘 더 나아진 부분을 찾아보세요.", + "오늘 처음으로 해낸 일이 있다면 기념할 가치가 있습니다.", + "작은 완료가 모여 큰 프로젝트가 됩니다.", + "오늘도 해냈습니다. 그것만으로 충분히 좋은 하루입니다.", + "어렵게 시작한 일을 끝까지 마친 당신이 대단합니다.", + "오늘 하나를 배웠다면 하루를 잘 보낸 겁니다.", + "완벽하지 않아도 완료가 완벽보다 낫습니다.", + "당신이 오늘 해낸 모든 것이 가치 있습니다.", + "작은 목표들을 하나씩 이루는 기쁨을 만끽하세요.", + "오늘 잘 한 일 하나를 떠올려 보세요. 반드시 있을 겁니다.", + "남이 보지 않아도 당신이 한 일은 기록됩니다.", + "미루던 일을 오늘 시작했다면 이미 반은 끝낸 겁니다.", + "오늘 좋은 결정을 내렸다면 그것으로 오늘은 성공입니다.", + "어렵던 대화를 해냈다면 큰 성취입니다. 잘 했습니다.", + "오늘 집중하며 일했다면 생산적인 하루입니다.", + "작은 승리가 큰 자신감을 만듭니다.", + "오늘 완성한 것들에 만족해도 됩니다.", + "목표를 절반 이뤘다면, 이미 절반을 이룬 겁니다.", + "오늘 해낸 일 하나를 퇴근 전에 기억해보세요.", + "도전했다는 것 자체가 성공의 일부입니다.", + "오늘 한 번 더 시도했다면 충분합니다.", + "작은 개선도 개선입니다. 그게 쌓이면 혁신이 됩니다.", + "완성에 감사하는 마음을 잊지 마세요.", + "오늘도 의미 있는 일을 해냈습니다. 수고했습니다.", + "힘들었지만 해냈다는 것, 그것이 당신의 능력입니다.", + "오늘 스스로에게 '잘 했어'라고 말해주세요.", + "계획한 것을 해냈을 때의 성취감을 충분히 느끼세요.", + "오늘 당신이 이룬 것들은 누구도 빼앗아 갈 수 없습니다.", + "작은 것을 잘 지키는 사람이 큰 것도 잘 지킵니다.", + "오늘 어려운 상황에서도 최선을 다한 당신이 멋집니다.", + "완벽하지 않아도 오늘의 최선이면 충분합니다.", + "어제보다 나아진 것이 있다면 오늘은 성공한 날입니다.", + "오늘의 작은 진전이 내일의 큰 도약을 만듭니다.", + "당신이 이룬 모든 것이 여기에서 시작됐습니다.", + "작은 일도 성심껏 하는 당신이 진짜 프로입니다.", + "오늘 해낸 것들이 모여 멋진 커리어가 됩니다.", + "하루 하나씩 해나가는 당신의 꾸준함이 최고입니다.", + "오늘 하루도 의미 있는 발자국을 남겼습니다.", + "쉬는 것도 일의 일부입니다. 충분히 쉬어가세요.", + "지쳤을 때 쉬는 것이 가장 현명한 선택입니다.", + "오늘 몸과 마음이 건강해야 내일도 잘 할 수 있습니다.", + "커피 한 잔, 잠깐의 여유가 생산성을 높입니다.", + "숨 한번 크게 쉬어보세요. 괜찮아집니다.", + "당신이 건강해야 당신이 소중한 사람들도 행복합니다.", + "오늘 무리하지 않아도 됩니다. 내일도 있습니다.", + "잠깐 멈추고 지금 이 순간을 느껴보세요.", + "완벽한 하루보다 건강한 하루가 더 중요합니다.", + "자신을 돌보는 것이 가장 중요한 투자입니다.", + "오늘 한 번쯤은 자신에게 친절하게 대해주세요.", + "지쳐있다면 잠깐 쉬어도 괜찮습니다.", + "작은 휴식이 큰 재충전이 됩니다.", + "점심을 제대로 먹는 것도 스스로를 위한 중요한 행동입니다.", + "오늘 잠깐 창밖을 바라보세요. 기분이 달라질 겁니다.", + "자신을 사랑하는 것이 출발점입니다.", + "충분히 쉬어야 더 잘 할 수 있습니다.", + "오늘 일이 너무 많다면, 우선순위를 정해보세요.", + "스트레스가 쌓였다면, 잠깐 걷는 것도 좋습니다.", + "몸이 보내는 신호에 귀를 기울여주세요.", + "오늘 하루 잘 마치고 충분히 쉬세요.", + "일보다 당신이 더 중요합니다.", + "완벽함보다 꾸준함이 더 오래 갑니다. 오늘 무리하지 마세요.", + "잠깐 멈추어 물 한 잔 마시는 여유가 중요합니다.", + "자신에게 너무 가혹하게 굴지 마세요. 충분히 잘 하고 있습니다.", + "오늘 하루도 당신 몸과 마음이 건강하길 바랍니다.", + "힘들면 힘들다고 말해도 됩니다. 그게 더 용감한 일입니다.", + "쉬어갈 때 쉬어가는 것이 마라톤을 완주하는 방법입니다.", + "오늘 하루 스스로에게 친절한 말을 건네보세요.", + "기대치를 낮추는 것도 때로는 지혜입니다.", + "지금 힘들다면 잠깐 멈추고 숨을 고르세요.", + "자신을 아끼는 것이 더 멀리 가는 방법입니다.", + "오늘 하루 잘 해낸 자신에게 선물 하나 줘도 됩니다.", + "완벽할 필요 없어요. 지금 이 모습으로 충분합니다.", + "너무 많은 것을 한번에 하려 하지 마세요. 하나씩이면 됩니다.", + "오늘 피곤하다면, 그건 열심히 했다는 증거입니다.", + "자신을 돌볼 줄 아는 사람이 다른 사람도 잘 도울 수 있습니다.", + "잠깐의 여유가 창의적인 아이디어를 가져올 수 있습니다.", + "오늘 스트레스를 잘 다루는 방법을 하나 찾아봐요.", + "마음이 힘들 때는 좋아하는 음악 한 곡이 도움이 됩니다.", + "일에 쫓기지 말고, 당신의 속도로 나아가세요.", + "지금 여기, 현재에 집중하는 것이 최고의 휴식입니다.", + "자신의 감정에 귀 기울이는 것이 건강의 시작입니다.", + "오늘 하루도 당신의 건강이 최우선입니다.", + "긴장을 잠깐 풀어보세요. 어깨에 힘을 빼도 됩니다.", + "완벽한 컨디션이 아니어도 오늘을 잘 보낼 수 있습니다.", + "오늘 하루가 끝나면 충분히 쉬세요. 그게 내일을 준비하는 것입니다.", + "자신을 믿어주세요. 당신은 충분히 할 수 있습니다.", + "오늘 잠깐이라도 자신에게 집중하는 시간을 가져보세요.", + "무리하지 않고 지속하는 것이 가장 좋은 성과를 냅니다.", + "오늘 힘들었다면 내일은 더 가벼울 거예요.", + "자신을 위한 작은 시간이 큰 에너지를 만듭니다.", + "오늘도 스스로를 아끼는 하루 보내세요.", + "어떤 날은 쉬어가는 것이 가장 용감한 선택입니다.", + "건강한 습관 하나가 인생을 바꿀 수 있습니다.", + "오늘 좋아하는 것 하나를 하는 시간을 내세요.", + "자신에게 친절하면 주변에도 친절할 수 있습니다.", + "지치지 않게 자신을 챙기는 것도 중요한 일입니다.", + "오늘도 나의 건강과 행복이 최우선입니다.", + "오늘 당신에게 도움을 준 사람에게 감사 인사를 전해보세요.", + "작은 것에 감사하는 마음이 행복의 씨앗입니다.", + "오늘 하루를 살 수 있음이 이미 축복입니다.", + "당신이 가진 것들에 감사하는 마음을 가져보세요.", + "주변 사람들이 당신에게 얼마나 큰 힘이 되는지 기억하세요.", + "오늘 고마웠던 순간을 하나 떠올려 보세요.", + "감사 일기 한 줄이 하루를 더 풍요롭게 합니다.", + "당신이 이룬 것들은 주변의 도움 없이는 불가능했을 겁니다.", + "오늘 누군가에게 고맙다고 말해보세요. 그 사람도 행복해집니다.", + "작은 친절에 감사하는 마음이 좋은 관계를 만듭니다.", + "오늘도 일할 수 있는 건강이 있음에 감사합니다.", + "당신의 존재 자체에 감사하는 하루를 보내세요.", + "함께하는 동료들이 있음에 감사합니다.", + "오늘 배운 것들이 있다면 그것도 감사할 이유입니다.", + "힘든 상황에서도 주변의 도움에 감사할 수 있습니다.", + "당신을 믿어주는 사람이 있다는 것이 큰 선물입니다.", + "감사는 받는 것보다 주는 것이 더 풍요롭게 합니다.", + "당신이 주는 감사의 말이 누군가의 하루를 바꿀 수 있습니다.", + "오늘 하루도 이렇게 살아있음이 축복입니다.", + "작은 고마움들이 모여 행복한 삶이 됩니다.", + "당신이 나눠준 도움에 감사하는 사람이 있습니다.", + "오늘 감사한 것 세 가지를 생각해보세요.", + "당신이 있어 감사한 사람들이 주변에 있습니다.", + "좋은 동료에게 감사함을 표현하세요. 관계가 깊어집니다.", + "오늘 하루를 마칠 수 있음이 작은 성취입니다. 감사합니다.", + "누군가 당신의 노력을 알아봐 주는 순간이 옵니다.", + "감사의 마음이 긍정적인 에너지를 만들어냅니다.", + "오늘 당신에게 잘 해준 사람을 기억해두세요.", + "작은 친절도 충분히 고마운 것입니다.", + "당신이 매일 해내는 것들이 당신 스스로에게 선물입니다.", + "오늘 따뜻한 말을 건네받았다면 그 사람에게 감사하세요.", + "감사하는 사람이 더 많은 감사할 일을 만납니다.", + "당신 곁에 응원해주는 사람이 있음에 감사하세요.", + "작은 것에도 감사할 줄 아는 사람이 큰 행복을 누립니다.", + "오늘 하루 배울 기회가 있었다면 그것에 감사하세요.", + "당신이 하는 일에 의미가 있음에 감사합니다.", + "감사는 더 좋은 내일을 만드는 씨앗입니다.", + "오늘 웃을 수 있었던 순간에 감사하세요.", + "당신의 재능을 발휘할 곳이 있음에 감사합니다.", + "오늘 당신을 도와준 사람의 이름을 기억해두세요.", + "감사함을 표현하면 관계가 더 깊어집니다.", + "당신이 오늘 이루어낸 것들에 스스로 감사하세요.", + "오늘도 좋은 사람들과 함께할 수 있어서 감사합니다.", + "당신이 받은 기회들에 감사하는 마음을 가져보세요.", + "감사는 마음을 부유하게 만드는 가장 간단한 방법입니다.", + "어려움 속에서도 도와주는 사람이 있어 감사합니다.", + "당신이 오늘 한 모든 일이 누군가에게 의미가 있습니다.", + "작은 감사가 큰 행복을 만들어냅니다.", + "오늘도 당신을 응원하는 사람들이 있습니다. 감사하세요.", + "당신의 삶에 감사할 것들이 생각보다 많습니다.", + "오늘 감사한 마음으로 시작하면 더 좋은 하루가 됩니다.", + "작은 것에서 감사를 찾는 능력이 행복의 비결입니다.", + "오늘 하루도 건강하게 일할 수 있어 감사합니다.", + "당신이 걸어온 길에 감사하며, 앞으로의 길을 기대하세요.", + "감사하는 마음이 마음의 여유를 만들어냅니다.", + "당신이 존재하는 것 자체가 세상에 큰 선물입니다.", + "지금 힘들더라도 포기하지 마세요. 반드시 지나갑니다.", + "어려운 길이 대부분 목적지로 가는 가장 빠른 길입니다.", + "힘들 때가 가장 많이 성장할 때입니다.", + "포기하지 않는 것이 가장 강한 능력입니다.", + "오늘 버텨낸 당신이 내일의 당신을 만듭니다.", + "지금 어렵다고 느끼는 것은 당신이 성장하고 있다는 신호입니다.", + "모든 어려움은 지나갑니다. 오늘도 믿어보세요.", + "쉽게 이룬 것보다 어렵게 이룬 것이 더 값집니다.", + "오늘 포기하지 않은 것이 내일의 출발점이 됩니다.", + "끝까지 해내는 사람이 결국 이깁니다.", + "지금 힘든 것은 무언가를 이루는 과정일 뿐입니다.", + "오래 하는 것이 빠르게 하는 것보다 강합니다.", + "어렵다는 것은 아직 해내지 못했다는 것, 곧 해낼 수 있다는 뜻입니다.", + "당신이 지금까지 해온 것들이 오늘을 버티게 해줍니다.", + "포기하지 않는 사람에게는 실패가 없습니다. 배움만 있을 뿐입니다.", + "오늘 힘들더라도 내일의 나는 오늘을 고맙게 여길 겁니다.", + "버티는 것도 하나의 용기입니다.", + "지금 이 순간을 견뎌낸 당신을 응원합니다.", + "모든 위대한 것은 오랜 인내 끝에 탄생합니다.", + "지금 잘 안 된다고 포기하면 이제껏 쌓아온 것이 아깝습니다.", + "오늘도 조금만 더 해봅시다. 반드시 길이 열립니다.", + "험한 길도 한 발씩 걷다 보면 어느새 목적지에 도달합니다.", + "버텨낸 시간들이 당신을 더 강하게 만들었습니다.", + "어렵더라도 멈추지 않는 것이 가장 중요합니다.", + "당신이 지금까지 견뎌온 것들이 당신의 진짜 능력입니다.", + "힘든 시간도 지나고 나면 성장의 발판이 됩니다.", + "당신이 포기하지 않는 한, 모든 것은 여전히 가능합니다.", + "지금 힘들다고 느끼는 것이 바로 더 강해지고 있다는 증거입니다.", + "오늘 하루 잘 버텨낸 당신이 대단합니다.", + "느려도 괜찮습니다. 방향만 맞다면 결국 도달합니다.", + "한 번에 크게 나아가지 않아도 됩니다. 조금씩이면 충분합니다.", + "지금 힘들다면 결승선이 가까워지고 있다는 뜻일 수도 있습니다.", + "오늘 하루를 버텨낸 당신이 진짜 강한 사람입니다.", + "당신이 걸어온 길이 얼마나 먼지 잊지 마세요.", + "지금 이 순간이 지나가면 분명 더 좋은 날이 옵니다.", + "당신이 오늘도 자리를 지키고 있다는 것이 큰 힘입니다.", + "어렵고 힘들수록 그 안에서 배움이 더 많습니다.", + "지속성은 재능보다 강합니다.", + "오늘 포기하지 않은 당신을 내일의 당신이 감사해할 겁니다.", + "끝까지 해낸 것들이 인생의 자산이 됩니다.", + "오늘 조금 힘들었다면, 그만큼 성장한 겁니다.", + "지금 어둡더라도 새벽이 가까워지고 있습니다.", + "당신의 끈기가 결국 원하는 것을 가져다줍니다.", + "오늘도 한 발씩, 당신의 페이스로 나아가세요.", + "힘든 시간을 이겨낸 사람이 더 큰 일을 해냅니다.", + "지금 힘들다면 충분히 노력하고 있다는 뜻입니다.", + "당신이 오늘도 포기하지 않는 이유가 있습니다.", + "어려울 때일수록 멈추지 않는 것이 중요합니다.", + "오늘도 한 단계씩 올라가는 당신을 응원합니다.", + "지금 이 힘든 시간이 지나면 더 단단해진 당신이 있을 겁니다.", + "오늘 버텨낸 것들이 쌓여 당신의 내공이 됩니다.", + "포기하지 않는 사람의 꿈은 반드시 이루어집니다.", + "당신이 걸어온 길이 결코 헛되지 않습니다.", + "오늘도 힘내세요. 당신 곁에 응원하는 사람이 있습니다.", + "어렵더라도 시도하는 용기, 그것이 당신의 가장 큰 강점입니다.", + "지금 힘들다면 당신이 성장의 문턱에 있는 겁니다.", + "오늘을 버티면 내일이 더 좋아집니다.", + "당신이 포기하지 않는 한 가능성은 항상 살아있습니다.", + "오늘도 꿋꿋하게 나아가는 당신이 멋집니다.", + "힘든 시간을 견디는 능력이 당신의 가장 큰 자산입니다.", + "지금 어렵더라도 반드시 길이 있습니다.", + "오늘 힘들었지만 해냈습니다. 그것이 당신의 이야기입니다.", + "당신의 인내가 언젠가 큰 보상으로 돌아올 것입니다.", + "오늘도 포기하지 않는 당신이 자랑스럽습니다.", + "힘들 때 도움을 요청하는 것도 인내의 한 방법입니다.", + "당신이 오늘 버텨낸 모든 것이 당신의 강함입니다.", + "지금의 어려움이 당신을 더 지혜롭게 만들고 있습니다.", + "오늘 하루도 당신의 끈기가 빛납니다.", + "멈추지 않는 사람이 결국 목적지에 도달합니다.", + "당신이 오늘도 일어선 것, 그것이 가장 큰 용기입니다.", + "어렵더라도 오늘 해야 할 것을 해내는 당신이 대단합니다.", + "지금 이 순간 포기하지 않는 것이 모든 것을 바꿉니다.", + "오늘도 당신의 꿈을 향해 한 발 더 나아갑니다.", + "당신이 지금 하는 것이 나중에 큰 의미가 될 겁니다.", + "오늘 하루 어렵더라도 당신은 해낼 수 있습니다.", + "인내하는 사람에게 세상은 결국 좋은 것을 줍니다.", + "오늘도 버텨낸 당신이 내일도 버텨낼 겁니다.", + "끝까지 함께하는 당신을 응원합니다. 오늘도 고생 많으셨습니다.", + "힘든 하루를 버텨낸 당신은 내일 더 강해집니다.", + "당신의 끈기가 팀 전체에 용기를 줍니다.", + "지금까지 버텨온 당신을 진심으로 응원합니다.", + "오늘 하루를 버텨낸 당신은 이미 승자입니다.", + "당신이 포기하지 않는 이유가 바로 성공의 이유입니다.", + "느리게 가도 괜찮습니다. 계속 가는 것이 중요합니다.", + "당신의 인내가 반드시 결실로 이어질 것입니다.", + "꾸준한 사람이 결국 목적지에 도달합니다.", + "쉽게 얻은 것보다 힘들게 이룬 것이 더 오래 남습니다.", + "지금 이 과정이 언젠가 자랑스러운 이야기가 됩니다.", + "당신이 계속 나아가는 한 실패는 없습니다.", + "오늘의 인내가 내일의 자유를 만듭니다.", + "당신이 이 어려움을 이겨낼 수 있다는 것을 믿습니다.", + "오늘도 버텨내는 당신에게 깊은 존경을 보냅니다.", + "포기하지 않는 당신이 가장 용감한 사람입니다.", + "포기하지 않는 마음 하나가 모든 것을 바꿉니다.", + "당신이 보여준 인내심이 주변을 감동시킵니다.", + "지금 이 순간도 당신은 성장하고 있습니다.", + "힘든 시간도 당신을 강하게 만들고 있습니다.", + "오늘도 묵묵히 자신의 길을 걷는 당신이 존경스럽습니다.", + "지금 당신이 겪고 있는 것이 나중에 큰 자산이 됩니다.", + "지금 이 길이 맞는 길이라면 계속 걸어가세요.", + "당신의 협력적 태도가 팀을 더 나아지게 합니다.", + "오늘도 팀원과 나눈 작은 대화가 큰 가치입니다.", + "동료와의 연결이 업무를 의미 있게 합니다.", + "당신의 웃음이 팀에게 긍정 에너지를 줍니다.", + "함께라서 어려운 일도 해낼 수 있습니다.", + "당신의 한마디 칭찬이 동료를 빛나게 합니다.", + "서로 응원하는 팀이 결국 가장 강합니다.", + "오늘도 팀을 위해 작은 기여를 해주셔서 고맙습니다.", + "당신의 진심 어린 감사가 팀을 하나로 묶어줍니다.", + "좋은 하루를 만들어준 모든 것에 감사해 보세요.", + "서로의 존재에 감사할 때 관계가 깊어집니다.", + "오늘 하루도 감사한 마음을 품고 지내보세요.", + "당신의 기여가 팀을 더 나은 곳으로 만듭니다.", + "오늘 누군가에게 진심으로 감사를 전해보세요.", + "당신의 작은 도움이 누군가에게는 큰 힘이 됩니다.", + "오늘도 감사한 마음으로 하루를 시작해 주세요.", + "당신이 이 자리에서 해온 모든 것에 감사합니다.", + "당신이 존재한다는 것에 세상이 감사합니다.", + "함께 일할 동료가 있다는 것이 복입니다.", + "지금 이 순간 당신의 노력에 감사합니다.", + "당신이 보여준 열정에 감사합니다.", + "오늘 당신과 함께한 시간이 값집니다.", + "서로에게 감사를 표현하는 것이 성숙한 팀을 만듭니다.", + "오늘 하루도 감사한 마음으로 마무리해 보세요.", + "당신이 가진 것들에 감사할 때 더 많은 것이 옵니다.", + "오늘도 배울 수 있다는 것이 얼마나 감사한 일인지요.", + "감사 일기를 써보는 것도 좋은 마무리 방법입니다." +] \ No newline at end of file diff --git a/src/AxCopilot/Assets/Quotes/movies.json b/src/AxCopilot/Assets/Quotes/movies.json new file mode 100644 index 0000000..bb65a42 --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/movies.json @@ -0,0 +1,200 @@ +[ + {"text":"삶은 초콜릿 상자와 같아요. 무엇을 집게 될지 모르죠. (Life is like a box of chocolates. You never know what you're gonna get.)", "movie":"포레스트 검프", "year":1994, "character":"톰 행크스(포레스트 검프)", "audience":null}, + {"text":"내일은 내일의 해가 뜬다. (After all, tomorrow is another day.)", "movie":"바람과 함께 사라지다", "year":1939, "character":"비비안 리(스칼렛 오하라)", "audience":null}, + {"text":"포스가 함께하길. (May the Force be with you.)", "movie":"스타워즈", "year":1977, "character":"알렉 기네스(오비완 케노비)", "audience":null}, + {"text":"나는 이 세상의 왕이다! (I'm the king of the world!)", "movie":"타이타닉", "year":1997, "character":"레오나르도 디카프리오(잭 도슨)", "audience":null}, + {"text":"왜 그렇게 심각하지? (Why so serious?)", "movie":"다크 나이트", "year":2008, "character":"히스 레저(조커)", "audience":4175526}, + {"text":"희망은 좋은 것이야. 어쩌면 가장 좋은 것이지. (Hope is a good thing, maybe the best of things.)", "movie":"쇼생크 탈출", "year":1994, "character":"팀 로빈스(앤디 듀프레인)", "audience":null}, + {"text":"내가 아이언맨입니다. (I am Iron Man.)", "movie":"아이언맨", "year":2008, "character":"로버트 다우니 주니어(토니 스타크)", "audience":4300365}, + {"text":"가끔은 걷기도 전에 뛰어야 할 때가 있지. (Sometimes you gotta run before you can walk.)", "movie":"아이언맨", "year":2008, "character":"로버트 다우니 주니어(토니 스타크)", "audience":4300365}, + {"text":"수트와 나는 하나입니다. (The suit and I are one.)", "movie":"아이언맨 2", "year":2010, "character":"로버트 다우니 주니어(토니 스타크)", "audience":4425003}, + {"text":"천재, 억만장자, 플레이보이, 박애주의자. (Genius, billionaire, playboy, philanthropist.)", "movie":"어벤져스", "year":2012, "character":"로버트 다우니 주니어(토니 스타크)", "audience":7087068}, + {"text":"수트 없이 아무것도 아니라면, 더더욱 수트를 가져선 안 돼. (If you're nothing without this suit, then you shouldn't have it.)", "movie":"스파이더맨: 홈커밍", "year":2017, "character":"로버트 다우니 주니어(토니 스타크)", "audience":7258611}, + {"text":"3000만큼 사랑해. (I love you 3000.)", "movie":"어벤져스: 엔드게임", "year":2019, "character":"로버트 다우니 주니어(토니 스타크)", "audience":13977602}, + {"text":"어벤져스, 어셈블! (Avengers, Assemble!)", "movie":"어벤져스: 엔드게임", "year":2019, "character":"크리스 에반스(캡틴 아메리카)", "audience":13934592}, + {"text":"위대한 힘에는 위대한 책임이 따른다. (With great power comes great responsibility.)", "movie":"스파이더맨", "year":2002, "character":"클리프 로버트슨(벤 파커)", "audience":null}, + {"text":"신에게는 아직 12척의 배가 있사옵니다.", "movie":"명량", "year":2014, "character":"최민식(이순신)", "audience":17613682}, + {"text":"내가 왕이 될 상인가.", "movie":"관상", "year":2013, "character":"이정재(수양대군)", "audience":9134586}, + {"text":"대한민국 헌법 제1조 1항, 대한민국은 민주공화국이다.", "movie":"변호인", "year":2013, "character":"송강호(송우석)", "audience":11374610}, + {"text":"제 계획이 다 있습니다.", "movie":"기생충", "year":2019, "character":"송강호(기택)", "audience":10085271}, + {"text":"카르페 디엠. 오늘을 잡아라. (Carpe diem. Seize the day.)", "movie":"죽은 시인의 사회", "year":1989, "character":"로빈 윌리엄스(키팅 선생)", "audience":null}, + {"text":"진짜 중요한 건 눈에 보이지 않아. (What is essential is invisible to the eye.)", "movie":"어린 왕자", "year":2015, "character":"마리옹 꼬띠아르(어린 왕자)", "audience":null}, + {"text":"무한한 공간 저 너머로! (To infinity and beyond!)", "movie":"토이스토리", "year":1995, "character":"팀 알렌(버즈 라이트이어)", "audience":null}, + {"text":"과거는 아프지. 하지만 도망갈 수도, 배울 수도 있어. (The past can hurt. But you can either run from it or learn from it.)", "movie":"라이온 킹", "year":1994, "character":"로버트 기욤(라피키)", "audience":null}, + {"text":"하쿠나 마타타! (Hakuna Matata!)", "movie":"라이온 킹", "year":1994, "character":"나단 레인(티몬)", "audience":null}, + {"text":"인생은 가까이서 보면 비극이지만, 멀리서 보면 희극이다. (Life is a tragedy when seen in close-up, but a comedy in long-shot.)", "movie":"인생은 아름다워", "year":1997, "character":"로베르토 베니니(귀도)", "audience":null}, + {"text":"매너가 사람을 만든다. (Manners maketh man.)", "movie":"킹스맨: 시크릿 에이전트", "year":2015, "character":"콜린 퍼스(해리 하트)", "audience":6129681}, + {"text":"나, 돌아갈 거야. 반드시. (We will find a way. We always have.)", "movie":"인터스텔라", "year":2014, "character":"매튜 맥커너히(쿠퍼)", "audience":10309432}, + {"text":"사랑은 시간과 공간을 초월하는 힘이야. (Love is the one thing that transcends time and space.)", "movie":"인터스텔라", "year":2014, "character":"앤 해서웨이(브랜드 박사)", "audience":10309432}, + {"text":"치킨은 국민 음식이야!", "movie":"극한직업", "year":2019, "character":"류승룡(고반장)", "audience":16266338}, + {"text":"경험은 결코 늙지 않는다. (Experience never goes out of fashion.)", "movie":"인턴", "year":2015, "character":"로버트 드 니로(벤 휘태커)", "audience":3611166}, + {"text":"변화는 불가피하지만, 성장은 선택이다. (Change is inevitable. Growth is optional.)", "movie":"잡스", "year":2013, "character":"애쉬튼 커쳐(스티브 잡스)", "audience":225343}, + {"text":"실패는 옵션이다. 하지만 두려움은 아니다. (Failure is an option. Fear is not.)", "movie":"포드 v 페라리", "year":2019, "character":"맷 데이먼(캐롤 셸비)", "audience":1326442}, + {"text":"기회는 기다리는 자에게 오는 것이 아니라 쟁취하는 자에게 온다. (Opportunity doesn't knock, it presents itself when you beat down the door.)", "movie":"소셜 네트워크", "year":2010, "character":"제시 아이젠버그(마크 저커버그)", "audience":519018}, + {"text":"모든 문제는 해결 가능하다. (Every problem has a solution.)", "movie":"마션", "year":2015, "character":"맷 데이먼(마크 와트니)", "audience":4887144}, + {"text":"포기하는 순간 시합은 종료되는 겁니다.", "movie":"더 퍼스트 슬램덩크", "year":2023, "character":"배한성(안 선생님)", "audience":4879282}, + {"text":"최선은 다하는 게 아니라, 잘하는 것이다.", "movie":"스토브리그(드라마)", "year":2019, "character":"남궁민(백승수)", "audience":null}, + {"text":"비전 없는 실행은 비극이고, 실행 없는 비전은 몽상이다.", "movie":"스타트업(드라마)", "year":2020, "character":"김선호(한지평)", "audience":null}, + {"text":"성공은 준비가 기회를 만났을 때 나타나는 결과다. (Success is what happens when preparation meets opportunity.)", "movie":"행복을 찾아서", "year":2006, "character":"윌 스미스(크리스 가드너)", "audience":null}, + {"text":"데이터는 거짓말을 하지 않지만, 사람은 거짓말을 한다.", "movie":"비밀의 숲(드라마)", "year":2017, "character":"조승우(황시목)", "audience":null}, + {"text":"불가능해 보일 때까지는 항상 불가능해 보인다. (It always seems impossible until it's done.)", "movie":"인빅터스", "year":2009, "character":"모건 프리먼(넬슨 만델라)", "audience":null}, + {"text":"우리는 모두 미완성인 존재다.", "movie":"미생(드라마)", "year":2014, "character":"임시완(장그래)", "audience":null}, + {"text":"팀보다 위대한 선수는 없다. (No player is bigger than the team.)", "movie":"머니볼", "year":2011, "character":"브래드 피트(빌리 빈)", "audience":641496}, + {"text":"시스템은 사람을 믿지 않는다. 프로세스를 믿는다.", "movie":"더 테러 라이브", "year":2013, "character":"하정우(윤영화)", "audience":5584139}, + {"text":"전문가란 더 좁은 분야에서 더 많은 실수를 해본 사람이다.", "movie":"이미테이션 게임", "year":2014, "character":"베네딕트 컴버배치(앨런 튜닝)", "audience":1744213}, + {"text":"기술은 도구일 뿐이다. 사람을 연결하는 것이 핵심이다. (Technology is just a tool.)", "movie":"소셜 네트워크", "year":2010, "character":"저스틴 팀버레이크(숀 파커)", "audience":519018}, + {"text":"디테일이 차이를 만든다.", "movie":"기생충", "year":2019, "character":"이선균(박 사장)", "audience":10313501}, + {"text":"완벽함은 더 보탤 것이 없을 때가 아니라 빼낼 것이 없을 때 완성된다.", "movie":"어린 왕자", "year":2015, "character":"제프 브리지스(비행사)", "audience":null}, + {"text":"남들과 다르게 생각하라. (Think different.)", "movie":"잡스", "year":2013, "character":"애쉬튼 커쳐(스티브 잡스)", "audience":225343}, + {"text":"리더는 길을 아는 사람이 아니라 길을 만드는 사람이다.", "movie":"킹덤(드라마)", "year":2019, "character":"주지훈(이창)", "audience":null}, + {"text":"복잡함은 실패의 지름길이다. (Complexity is the enemy of execution.)", "movie":"스티브 잡스", "year":2015, "character":"마이클 패스벤더(스티브 잡스)", "audience":null}, + {"text":"계획 없는 목표는 단지 희망사항일 뿐이다. (A goal without a plan is just a wish.)", "movie":"어린 왕자", "year":2015, "character":"제임스 프랑코(여우)", "audience":null}, + {"text":"중요한 것은 꺾이지 않는 마음이다.", "movie":"중꺾마(다큐)", "year":2022, "character":"김혁규(데프트)", "audience":null}, + {"text":"프로는 감정에 치우치지 않는다.", "movie":"스토브리그(드라마)", "year":2019, "character":"남궁민(백승수)", "audience":null}, + {"text":"우리는 문제를 해결하기 위해 고용된 사람들이다.", "movie":"울프 오브 월 스트리트", "year":2013, "character":"레오나르도 디카프리오(조던 벨포트)", "audience":585671}, + {"text":"실패는 배움의 또 다른 이름이다. (The greatest teacher, failure is.)", "movie":"스타워즈: 라스트 제다이", "year":2017, "character":"프랭크 오즈(요다)", "audience":959550}, + {"text":"데이터에 매몰되지 말고 맥락을 봐라. (Look at the context, not just the data.)", "movie":"서치", "year":2018, "character":"존 조(데이빗 킴)", "audience":2950097}, + {"text":"함께 일하는 동료가 가장 큰 복지다.", "movie":"미생(드라마)", "year":2014, "character":"태인호(성준식)", "audience":null}, + {"text":"적당히들 하시오! 대체 이 나라가 누구의 나라요? 내게는 백성이 우선이란 말이오!", "movie":"광해, 왕이 된 남자", "year":2012, "character":"이병헌(하선)", "audience":12324062}, + {"text":"백성을 하늘처럼 섬기는 왕, 그 꿈 내가 이루어 드리지요.", "movie":"광해, 왕이 된 남자", "year":2012, "character":"이병헌(하선)", "audience":12324062}, + {"text":"전하, 칼은 뽑았을 때 베어야 하는 법입니다.", "movie":"광해, 왕이 된 남자", "year":2012, "character":"류승룡(허균)", "audience":12324062}, + {"text":"내게는 진짜 왕이었소.", "movie":"광해, 왕이 된 남자", "year":2012, "character":"장광(조내관)", "audience":12324062}, + {"text":"실패하면 반란, 성공하면 혁명 아닙니까!", "movie":"서울의 봄", "year":2023, "character":"황정민(전두광)", "audience":13128596}, + {"text":"대한민국 육군은 다 같은 편입니다.", "movie":"서울의 봄", "year":2023, "character":"정우성(이태신)", "audience":13128596}, + {"text":"거 중구 형, 장난이 너무 심한 거 아니오!", "movie":"신세계", "year":2013, "character":"황정민(정청)", "audience":4684571}, + {"text":"어이, 브라더! 이따가 저녁에 고기나 좀 굽자.", "movie":"신세계", "year":2013, "character":"황정민(정청)", "audience":4684571}, + {"text":"우리 자식들이 아니라 우리가 겪어서 참 다행이다, 그쟈?", "movie":"국제시장", "year":2014, "character":"황정민(윤덕수)", "audience":14265540}, + {"text":"아버지... 내 약속 잘 지켰지예? 근데 진짜 힘들었거든예.", "movie":"국제시장", "year":2014, "character":"황정민(윤덕수)", "audience":14265540}, + {"text":"호연지기! 흑금성 박석영입니다.", "movie":"공작", "year":2018, "character":"황정민(박석영)", "audience":4910131}, + {"text":"산이 거기 있어서 가는 게 아니야. 우리가 한 팀이니까 가는 거지.", "movie":"히말라야", "year":2015, "character":"황정민(엄홍길)", "audience":7759667}, + {"text":"증거? 증거는 내가 지금부터 만들 거야.", "movie":"검사외전", "year":2016, "character":"황정민(변재욱)", "audience":9707581}, + {"text":"여우가 범의 허리를 끊었다.", "movie":"파묘", "year":2024, "character":"최민식(김상덕)", "audience":11914784}, + {"text":"땅이야 땅. 우리 손주들이 밟고 살아가야 할 땅이라고.", "movie":"파묘", "year":2024, "character":"최민식(김상덕)", "audience":11914784}, + {"text":"이유가 어딨어, 그냥 잡는 거지.", "movie":"범죄도시4", "year":2024, "character":"마동석(마석도)", "audience":11502779}, + {"text":"바다는 속여도 사람은 안 속인다.", "movie":"밀수", "year":2023, "character":"박정민(장도리)", "audience":5143409}, + {"text":"내 운명은 내가 결정한다.", "movie":"탈주", "year":2024, "character":"이제훈(임규남)", "audience":2561872}, + {"text":"실패할 자유가 있는 곳으로 가겠다.", "movie":"탈주", "year":2024, "character":"이제훈(임규남)", "audience":2561872}, + {"text":"나는 이제 죽음이 되었다. 세계의 파괴자. (Now I am become Death, the destroyer of worlds.)", "movie":"오펜하이머", "year":2023, "character":"킬리언 머피(오펜하이머)", "audience":3230553}, + {"text":"두려움은 마음을 죽이는 자다. (Fear is the mind-killer.)", "movie":"듄", "year":2021, "character":"티모시 샬라메(폴 아트레이디스)", "audience":1644733}, + {"text":"생각하지 말고 그냥 해. (Don't think, just do.)", "movie":"탑건: 매버릭", "year":2022, "character":"톰 크루즈(매버릭)", "audience":8232423}, + {"text":"데이터 뒤에 숨은 의도를 읽어야 한다.", "movie":"머니볼", "year":2011, "character":"조나 힐(피터 브랜드)", "audience":641496}, + {"text":"회사는 가족이 아니라 팀이다. (We're a team, not a family.)", "movie":"실리콘 밸리(드라마)", "year":2014, "character":"토마스 미들디치(리처드 헨드릭스)", "audience":null}, + {"text":"성공한 리더는 질문하는 사람이다.", "movie":"포드 v 페라리", "year":2019, "character":"존 번탈(이아코카)", "audience":1326442}, + {"text":"지속 가능한 혁신만이 살아남는다.", "movie":"블랙 팬서", "year":2018, "character":"레티티아 라이트(슈리)", "audience":5399327}, + {"text":"사람의 마음을 움직이는 것이 비즈니스의 시작이다.", "movie":"제리 맥과이어", "year":1996, "character":"톰 크루즈(제리 맥과이어)", "audience":null}, + {"text":"어떤 수트보다 강력한 것은 자신감이다.", "movie":"슈츠(드라마)", "year":2011, "character":"가브리엘 매치(하비 스펙터)", "audience":null}, + {"text":"혁신은 연결에서 시작된다. (Connecting the dots.)", "movie":"잡스", "year":2013, "character":"애쉬튼 커쳐(스티브 잡스)", "audience":225343}, + {"text":"가장 위대한 승리는 싸우지 않고 이기는 것이다.", "movie":"명량", "year":2014, "character":"최민식(이순신)", "audience":17613682}, + {"text":"우리는 우리가 믿는 대로 된다. (We become what we believe.)", "movie":"더 시크릿", "year":2006, "character":"나레이터", "audience":null}, + {"text":"품격은 말에서 나오는 것이 아니라 행동에서 나온다.", "movie":"킹스맨: 시크릿 에이전트", "year":2015, "character":"콜린 퍼스(해리 하트)", "audience":6129681}, + {"text":"기록은 기억을 지배한다.", "movie":"M(드라마)", "year":1994, "character":"나레이터", "audience":null}, + {"text":"내 가치를 결정하는 것은 나 자신이다.", "movie":"이태원 클라쓰(드라마)", "year":2020, "character":"박서준(박새로이)", "audience":null}, + {"text":"두려움은 직면할 때 사라진다. (To conquer fear, you must become fear.)", "movie":"배트맨 비긴즈", "year":2005, "character":"크리스찬 베일(브루스 웨인)", "audience":921315}, + {"text":"데이터에 매몰되지 말고 맥락을 봐라.", "movie":"서치", "year":2018, "character":"존 조(데이빗 킴)", "audience":2950097}, + {"text":"성공의 비결은 단 하나, 포기하지 않는 것이다.", "movie":"언브로큰", "year":2014, "character":"잭 오코넬(루이 잠페리니)", "audience":null}, + {"text":"버틸 수 있는 만큼 버텨라. 그래야 앞으로 나갈 수 있다.", "movie":"미생(드라마)", "year":2014, "character":"이성민(오상식)", "audience":null}, + {"text":"열정은 전염된다. (Passion is contagious.)", "movie":"드림걸즈", "year":2006, "character":"제이미 폭스(커티스)", "audience":null}, + {"text":"실패는 다시 시작할 수 있는 기회다. (Failure is simply the opportunity to begin again.)", "movie":"파운더", "year":2016, "character":"마이클 키튼(레이 크록)", "audience":null}, + {"text":"내일 할 일을 오늘 고민하지 마라. 내일의 네가 할 거다.", "movie":"미생(드라마)", "year":2014, "character":"이성민(오상식)", "audience":null}, + {"text":"비판은 쉽지만 창조는 어렵다. (In many ways, the work of a critic is easy.)", "movie":"라따뚜이", "year":2007, "character":"피터 오툴(안톤 이고)", "audience":1025573}, + {"text":"꿈을 이루지 못한 것보다 꿈을 잃어버리는 것이 더 무섭다.", "movie":"라라랜드", "year":2016, "character":"엠마 스톤(미아)", "audience":3772242}, + {"text":"경험은 결코 늙지 않는다. (Experience never goes out of fashion.)", "movie":"인턴", "year":2015, "character":"로버트 드 니로(벤 휘태커)", "audience":3611166}, + {"text":"혁신은 연결에서 시작된다. (Connecting the dots.)", "movie":"잡스", "year":2013, "character":"애쉬튼 커쳐(스티브 잡스)", "audience":225343}, + {"text":"모든 문제는 해결 가능하다. (Every problem has a solution.)", "movie":"마션", "year":2015, "character":"맷 데이먼(마크 와트니)", "audience":4887144}, + {"text":"최선은 다하는 게 아니라, 잘하는 것이다.", "movie":"스토브리그(드라마)", "year":2019, "character":"남궁민(백승수)", "audience":null}, + {"text":"비전 없는 실행은 비극이고, 실행 없는 비전은 몽상이다.", "movie":"스타트업(드라마)", "year":2020, "character":"김선호(한지평)", "audience":null}, + {"text":"데이터는 거짓말을 하지 않지만, 사람은 거짓말을 한다.", "movie":"비밀의 숲(드라마)", "year":2017, "character":"조승우(황시목)", "audience":null}, + {"text":"우리는 문제를 해결하기 위해 고용된 사람들이다.", "movie":"울프 오브 월 스트리트", "year":2013, "character":"레오나르도 디카프리오(조던 벨포트)", "audience":585671}, + {"text":"팀보다 위대한 선수는 없다. (No player is bigger than the team.)", "movie":"머니볼", "year":2011, "character":"브래드 피트(빌리 빈)", "audience":641496}, + {"text":"시스템은 사람을 믿지 않는다. 프로세스를 믿는다.", "movie":"더 테러 라이브", "year":2013, "character":"하정우(윤영화)", "audience":5584139}, + {"text":"전문가란 더 좁은 분야에서 더 많은 실수를 해본 사람이다.", "movie":"이미테이션 게임", "year":2014, "character":"베네딕트 컴버배치(앨런 튜닝)", "audience":1744213}, + {"text":"기술은 도구일 뿐이다. 사람을 연결하는 것이 핵심이다.", "movie":"소셜 네트워크", "year":2010, "character":"저스틴 팀버레이크(숀 파커)", "audience":519018}, + {"text":"디테일이 차이를 만든다.", "movie":"기생충", "year":2019, "character":"이선균(박 사장)", "audience":10313501}, + {"text":"완벽함은 더 보탤 것이 없을 때가 아니라 빼낼 것이 없을 때 완성된다.", "movie":"어린 왕자", "year":2015, "character":"제프 브리지스(비행사)", "audience":null}, + {"text":"리더는 길을 아는 사람이 아니라 길을 만드는 사람이다.", "movie":"킹덤(드라마)", "year":2019, "character":"주지훈(이창)", "audience":null}, + {"text":"복잡함은 실패의 지름길이다. (Complexity is the enemy of execution.)", "movie":"스티브 잡스", "year":2015, "character":"마이클 패스벤더(스티브 잡스)", "audience":null}, + {"text":"데이터 뒤에 숨은 의도를 읽어야 한다.", "movie":"머니볼", "year":2011, "character":"조나 힐(피터 브랜드)", "audience":641496}, + {"text":"회사는 가족이 아니라 팀이다. (We're a team, not a family.)", "movie":"실리콘 밸리(드라마)", "year":2014, "character":"토마스 미들디치(리처드 헨드릭스)", "audience":null}, + {"text":"지속 가능한 혁신만이 살아남는다.", "movie":"블랙 팬서", "year":2018, "character":"레티티아 라이트(슈리)", "audience":5399327}, + {"text":"데이터에 매몰되지 말고 맥락을 봐라.", "movie":"서치", "year":2018, "character":"존 조(데이빗 킴)", "audience":2950097}, + {"text":"버틸 수 있는 만큼 버텨라. 그래야 앞으로 나갈 수 있다.", "movie":"미생(드라마)", "year":2014, "character":"이성민(오상식)", "audience":null}, + {"text":"실패는 다시 시작할 수 있는 기회다.", "movie":"파운더", "year":2016, "character":"마이클 키튼(레이 크록)", "audience":null}, + {"text":"기록은 기억을 지배한다.", "movie":"M(드라마)", "year":1994, "character":"나레이터", "audience":null}, + {"text":"품격은 말에서 나오는 것이 아니라 행동에서 나온다.", "movie":"킹스맨", "year":2015, "character":"콜린 퍼스(해리 하트)", "audience":6129681}, + {"text":"성공은 준비가 기회를 만났을 때 나타나는 결과다.", "movie":"행복을 찾아서", "year":2006, "character":"윌 스미스(크리스 가드너)", "audience":null}, + {"text":"함께 일하는 동료가 가장 큰 복지다.", "movie":"미생(드라마)", "year":2014, "character":"태인호(성준식)", "audience":null}, + {"text":"길은 모두에게 열려 있지만, 모두가 그 길을 가질 수 있는 건 아니다.", "movie":"미생(드라마)", "year":2014, "character":"이성민(오상식)", "audience":null}, + {"text":"포기하는 순간 시합은 종료되는 겁니다.", "movie":"더 퍼스트 슬램덩크", "year":2023, "character":"안 선생님", "audience":4879282}, + {"text":"가끔은 걷기도 전에 뛰어야 할 때가 있지.", "movie":"아이언맨", "year":2008, "character":"로버트 다우니 주니어", "audience":4300365}, + {"text":"변화는 불가피하지만, 성장은 선택이다.", "movie":"잡스", "year":2013, "character":"애쉬튼 커쳐", "audience":225343}, + {"text":"실패는 옵션이다. 하지만 두려움은 아니다.", "movie":"포드 v 페라리", "year":2019, "character":"맷 데이먼", "audience":1326442}, + {"text":"불가능해 보일 때까지는 항상 불가능해 보인다.", "movie":"인빅터스", "year":2009, "character":"모건 프리먼", "audience":null}, + {"text":"리더는 희망을 파는 상인이다.", "movie":"나폴레옹(다큐)", "year":2015, "character":"나레이터", "audience":null}, + {"text":"최고의 협업은 서로의 부족함을 채워주는 것이다.", "movie":"토이스토리", "year":1995, "character":"톰 행크스(우디)", "audience":null}, + {"text":"모든 위대한 일은 작은 시작에서 비롯된다.", "movie":"인셉션", "year":2010, "character":"레오나르도 디카프리오", "audience":5835017}, + {"text":"가장 강력한 수트는 자신감이다.", "movie":"슈츠(드라마)", "year":2011, "character":"가브리엘 매치", "audience":null}, + {"text":"기회는 준비된 자에게만 찾아온다.", "movie":"에비에이터", "year":2004, "character":"레오나르도 디카프리오", "audience":null}, + {"text":"우리가 답을 찾을 것이다. 늘 그랬듯이.", "movie":"인터스텔라", "year":2014, "character":"매튜 맥커너히", "audience":10309432}, + {"text":"오늘의 불가능이 내일의 가능성이 된다.", "movie":"히든 피겨스", "year":2016, "character":"케빈 코스트너", "audience":449518}, + {"text":"진정한 발견은 새로운 땅을 찾는 것이 아니라 새로운 눈으로 보는 것이다.", "movie":"인턴", "year":2015, "character":"앤 해서웨이", "audience":3611166}, + {"text":"성공은 최종적인 것이 아니며, 실패는 치명적인 것이 아니다.", "movie":"다키스트 아워", "year":2017, "character":"게리 올드만", "audience":null}, + {"text":"가장 큰 위험은 아무런 위험도 감수하지 않는 것이다.", "movie":"소셜 네트워크", "year":2010, "character":"제시 아이젠버그", "audience":519018}, + {"text":"어제보다 나은 내일을 만드는 것이 우리의 일이다.", "movie":"드림즈(드라마)", "year":2019, "character":"남궁민", "audience":null}, + {"text":"열정은 전염된다. (Passion is contagious.)", "movie":"드림걸즈", "year":2006, "character":"제이미 폭스", "audience":null}, + {"text":"끝날 때까지는 끝난 게 아니다.", "movie":"요기 베라(다큐)", "year":2010, "character":"나레이터", "audience":null}, + {"text":"단순함이 궁극의 정교함이다.", "movie":"스티브 잡스", "year":2015, "character":"마이클 패스벤더", "audience":null}, + {"text":"우리는 우리가 반복적으로 하는 일의 결과다. 탁월함은 행동이 아니라 습관이다.", "movie":"코치 카터", "year":2005, "character":"사무엘 L. 잭슨", "audience":null}, + {"text":"질문이 정답보다 중요하다.", "movie":"포드 v 페라리", "year":2019, "character":"존 번탈", "audience":1326442}, + {"text":"혼자 가면 빨리 가지만, 함께 가면 멀리 간다.", "movie":"아프리카 속담(다큐 인용)", "year":2020, "character":"나레이터", "audience":null}, + {"text":"미래를 예측하는 가장 좋은 방법은 미래를 창조하는 것이다.", "movie":"링컨", "year":2012, "character":"다니엘 데이 루이스", "audience":null}, + {"text":"안전한 길만 가는 것은 가장 위험한 전략이다.", "movie":"탑건: 매버릭", "year":2022, "character":"톰 크루즈", "audience":8232423}, + {"text":"효율성은 일을 제대로 하는 것이고, 효과성은 제대로 된 일을 하는 것이다.", "movie":"머니볼", "year":2011, "character":"브래드 피트", "audience":641496}, + {"text":"내일의 나에게 부끄럽지 않은 오늘을 살자.", "movie":"미생(드라마)", "year":2014, "character":"임시완", "audience":null}, + {"text":"도전은 우리를 살아있게 만든다.", "movie":"에베레스트", "year":2015, "character":"제이슨 클락", "audience":null}, + {"text":"비판보다는 대안을 제시하라.", "movie":"라따뚜이", "year":2007, "character":"피터 오툴", "audience":1025573}, + {"text":"중요한 건 속도가 아니라 방향이다.", "movie":"인턴", "year":2015, "character":"로버트 드 니로", "audience":3611166}, + {"text":"실패를 두려워하는 것이 유일한 실패다.", "movie":"위대한 쇼맨", "year":2017, "character":"휴 잭맨", "audience":1410501}, + {"text":"전문성은 태도에서 나온다.", "movie":"스토브리그(드라마)", "year":2019, "character":"남궁민", "audience":null}, + {"text":"지식보다 중요한 것은 상상력이다.", "movie":"아인슈타인(다큐)", "year":2018, "character":"나레이터", "audience":null}, + {"text":"과정의 공정함이 결과의 정당성을 만든다.", "movie":"변호인", "year":2013, "character":"송강호", "audience":11374610}, + {"text":"작은 디테일이 큰 시스템을 결정한다.", "movie":"아폴로 13", "year":1995, "character":"톰 행크스", "audience":null}, + {"text":"성장은 고통을 동반하지만, 그 결과는 달콤하다.", "movie":"위플래쉬", "year":2014, "character":"J.K. 시몬스", "audience":1602488}, + {"text":"우리는 팀으로 승리하고 팀으로 패배한다.", "movie":"애니 기븐 선데이", "year":1999, "character":"알 파치노", "audience":null}, + {"text":"창의성은 제약 조건 속에서 꽃핀다.", "movie":"라따뚜이", "year":2007, "character":"패튼 오스왈트", "audience":1025573}, + {"text":"변화에 대응하는 유일한 방법은 변화를 선도하는 것이다.", "movie":"마진 콜", "year":2011, "character":"제레미 아이언스", "audience":null}, + {"text":"기술의 끝은 결국 사람을 향해야 한다.", "movie":"빅 히어로", "year":2014, "character":"다니엘 헤니", "audience":2801949}, + {"text":"최고의 리더는 다른 리더를 양성하는 사람이다.", "movie":"코치 카터", "year":2005, "character":"사무엘 L. 잭슨", "audience":null}, + {"text":"기존의 틀을 깨는 것이 혁신의 첫걸음이다.", "movie":"잡스", "year":2013, "character":"애쉬튼 커쳐", "audience":225343}, + {"text":"문제의 본질을 파악하는 것이 해결의 절반이다.", "movie":"셜록(드라마)", "year":2010, "character":"베네딕트 컴버배치", "audience":null}, + {"text":"성공은 매일 반복되는 작은 노력의 합계다.", "movie":"행복을 찾아서", "year":2006, "character":"윌 스미스", "audience":null}, + {"text":"효율적인 프로세스는 창의성을 방해하지 않는다.", "movie":"몬스터 주식회사", "year":2001, "character":"존 굿맨", "audience":null}, + {"text":"우리가 믿는 것이 우리의 현실이 된다.", "movie":"매트릭스", "year":1999, "character":"로렌스 피시번", "audience":null}, + {"text":"포기는 선택지에 없다.", "movie":"아폴로 13", "year":1995, "character":"에드 해리스", "audience":null}, + {"text":"서로 다른 생각이 만날 때 시너지가 발생한다.", "movie":"인사이드 아웃", "year":2015, "character":"에이미 폴러", "audience":4969735}, + {"text":"끊임없이 배우는 사람만이 앞서나갈 수 있다.", "movie":"인턴", "year":2015, "character":"로버트 드 니로", "audience":3611166}, + {"text":"경청은 가장 강력한 소통의 도구다.", "movie":"제리 맥과이어", "year":1996, "character":"톰 크루즈", "audience":null}, + {"text":"프로는 결과로 말한다.", "movie":"스토브리그(드라마)", "year":2019, "character":"박은빈", "audience":null}, + {"text":"협업은 신뢰의 다른 이름이다.", "movie":"어벤져스", "year":2012, "character":"사무엘 L. 잭슨", "audience":7087068}, + {"text":"기술은 인간의 한계를 확장한다.", "movie":"아이언맨", "year":2008, "character":"로버트 다우니 주니어", "audience":4300365}, + {"text":"목표가 분명하면 길은 보이기 마련이다.", "movie":"이상한 나라의 앨리스", "year":2010, "character":"미아 와시코브스카", "audience":null}, + {"text":"실수는 배움의 자산이다.", "movie":"주토피아", "year":2016, "character":"지니퍼 굿윈", "audience":4706158}, + {"text":"오늘의 데이터가 내일의 자산이 된다.", "movie":"머니볼", "year":2011, "character":"조나 힐", "audience":641496}, + {"text":"품질은 타협의 대상이 아니다.", "movie":"포드 v 페라리", "year":2019, "character":"크리스찬 베일", "audience":1326442}, + {"text":"다름을 인정하는 것에서 팀워크가 시작된다.", "movie":"가디언즈 오브 갤럭시", "year":2014, "character":"크리스 프랫", "audience":1344645}, + {"text":"모든 위대한 리더는 훌륭한 청취자였다.", "movie":"킹스 스피치", "year":2010, "character":"콜린 퍼스", "audience":807751}, + {"text":"혁신은 기술이 아니라 생각의 전환이다.", "movie":"소셜 네트워크", "year":2010, "character":"제시 아이젠버그", "audience":519018}, + {"text":"우리는 문제를 해결하기 위해 존재한다.", "movie":"마션", "year":2015, "character":"치웨텔 에지오포", "audience":4887144}, + {"text":"지속적인 개선이 완벽보다 낫다.", "movie":"파운더", "year":2016, "character":"마이클 키튼", "audience":null}, + {"text":"소통 없는 기술은 고립을 낳는다.", "movie":"그녀(Her)", "year":2013, "character":"호아킨 피닉스", "audience":375253}, + {"text":"함께 고민할 때 최선의 답이 나온다.", "movie":"미생(드라마)", "year":2014, "character":"이성민", "audience":null}, + {"text":"도전은 성장의 자양분이다.", "movie":"코코", "year":2017, "character":"안소니 곤잘레스", "audience":3513114}, + {"text":"프로세스의 최적화가 비즈니스의 핵심이다.", "movie":"시카고", "year":2002, "character":"리차드 기어", "audience":null}, + {"text":"미래를 준비하는 자가 승리한다.", "movie":"반지의 제왕", "year":2001, "character":"이안 맥켈런", "audience":3870000}, + {"text":"팀의 성공이 나의 성공이다.", "movie":"어벤져스", "year":2012, "character":"크리스 에반스", "audience":7074891}, + {"text":"사용자의 경험이 기술보다 우선이다.", "movie":"잡스", "year":2013, "character":"애쉬튼 커쳐", "audience":225343}, + {"text":"정직한 데이터가 올바른 결정을 이끈다.", "movie":"서치", "year":2018, "character":"존 조", "audience":2950097}, + {"text":"전문가는 끊임없이 의심하고 검증한다.", "movie":"이미테이션 게임", "year":2014, "character":"베네딕트 컴버배치", "audience":1744213}, + {"text":"효율성은 단순함에서 나온다.", "movie":"스티브 잡스", "year":2015, "character":"마이클 패스벤더", "audience":null}, + {"text":"성공은 목적지가 아니라 과정이다.", "movie":"포레스트 검프", "year":1994, "character":"톰 행크스", "audience":null}, + {"text":"우리는 모두 누군가의 조력자다.", "movie":"미생(드라마)", "year":2014, "character":"이성민", "audience":null} +] \ No newline at end of file diff --git a/src/AxCopilot/Assets/Quotes/science.json b/src/AxCopilot/Assets/Quotes/science.json new file mode 100644 index 0000000..372ee1c --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/science.json @@ -0,0 +1,174 @@ +[ + "빛의 속도는 진공에서 초속 약 299,792,458m로, 우주에서 가장 빠른 속도입니다.", + "지구에서 태양까지 빛이 도달하는 데 약 8분 20초가 걸립니다.", + "물 분자(H₂O)는 산소 원자 1개와 수소 원자 2개로 구성됩니다.", + "DNA의 이중나선 구조는 1953년 왓슨과 크릭이 발견했습니다.", + "인간의 몸에는 약 37조 개의 세포가 있습니다.", + "절대영도(0K)는 -273.15°C로, 이론적으로 가능한 가장 낮은 온도입니다.", + "지구의 나이는 약 46억 년으로 추정됩니다.", + "태양은 수소 핵융합으로 에너지를 생산하며, 약 50억 년 후 적색거성이 됩니다.", + "중력은 질량을 가진 모든 물체 사이에 작용하는 인력입니다.", + "뉴턴의 제3법칙: 모든 작용에는 크기가 같고 방향이 반대인 반작용이 있습니다.", + "E=mc²은 에너지와 질량의 동등성을 나타내는 아인슈타인의 공식입니다.", + "원자는 양성자, 중성자, 전자로 구성되며, 원자핵은 양성자와 중성자로 이루어집니다.", + "주기율표에는 현재 118개의 원소가 등록되어 있습니다.", + "산소는 지구 대기의 약 21%를 차지하며, 호흡에 필수적입니다.", + "광합성은 식물이 빛 에너지로 CO₂와 H₂O를 포도당과 O₂로 변환하는 과정입니다.", + "미토콘드리아는 세포의 '발전소'로, ATP를 생산하여 에너지를 공급합니다.", + "유전자(Gene)는 DNA의 특정 구간으로, 단백질 생산 정보를 담고 있습니다.", + "돌연변이(Mutation)는 DNA 서열의 변화로, 진화의 원동력입니다.", + "자연선택(Natural Selection)은 환경에 적합한 개체가 생존·번식하는 진화 메커니즘입니다.", + "찰스 다윈은 《종의 기원》(1859)에서 자연선택에 의한 진화론을 발표했습니다.", + "인간 게놈 프로젝트는 2003년 완성되었으며, 약 30억 개의 염기쌍을 해독했습니다.", + "CRISPR-Cas9은 유전자를 정밀하게 편집하는 혁명적 생명공학 도구입니다.", + "줄기세포는 다양한 세포 유형으로 분화할 수 있는 만능 세포입니다.", + "항생제 내성은 박테리아가 항생제에 저항하는 능력을 획득하는 심각한 의료 위기입니다.", + "바이러스는 세포가 없으며, 숙주 세포의 기능을 이용하여 복제합니다.", + "백신은 면역 체계를 훈련시켜 특정 병원체에 대한 면역을 형성합니다.", + "mRNA 백신은 단백질 설계도를 전달하여 면역 반응을 유도하는 차세대 백신 기술입니다.", + "항체는 면역 체계가 생산하는 Y자형 단백질로, 특정 항원에 결합합니다.", + "혈액형은 A, B, O, AB 4가지로 분류되며, 적혈구 표면의 항원에 의해 결정됩니다.", + "인간의 뇌는 약 860억 개의 뉴런으로 구성되어 있습니다.", + "시냅스는 뉴런 간 신호를 전달하는 접합 부위입니다.", + "도파민은 쾌락과 보상에 관여하는 신경전달물질입니다.", + "세로토닌은 기분, 수면, 식욕을 조절하는 신경전달물질입니다.", + "멜라토닌은 수면-각성 주기를 조절하는 호르몬으로, 어두워지면 분비됩니다.", + "인슐린은 혈당을 낮추는 호르몬으로, 췌장의 베타 세포에서 분비됩니다.", + "호르몬은 혈류를 통해 이동하며 특정 기관의 기능을 조절하는 화학 물질입니다.", + "효소(Enzyme)는 생화학 반응의 속도를 높이는 생물학적 촉매입니다.", + "ATP(아데노신 삼인산)는 세포 내 에너지 화폐로, 모든 생명 활동에 사용됩니다.", + "세포 분열에는 체세포 분열(유사분열)과 생식세포 분열(감수분열)이 있습니다.", + "염색체는 DNA와 단백질로 구성된 구조물로, 인간은 46개(23쌍)를 가집니다.", + "암(Cancer)은 세포의 비정상적 증식으로, 통제되지 않는 세포 분열이 원인입니다.", + "텔로미어는 염색체 끝을 보호하는 구조로, 세포 분열마다 짧아져 노화와 관련됩니다.", + "후성유전학(Epigenetics)은 DNA 서열 변화 없이 유전자 발현이 조절되는 현상입니다.", + "마이크로바이옴은 인체에 공생하는 미생물 군집으로, 건강에 중요한 역할을 합니다.", + "플라시보 효과는 가짜 약이나 치료에도 실제 치료 효과가 나타나는 심리적 현상입니다.", + "pH는 용액의 산성도를 나타내는 지표로, 7이 중성, 7 미만이 산성, 7 초과가 염기성입니다.", + "화학 결합에는 이온 결합, 공유 결합, 금속 결합이 있습니다.", + "이온은 전자를 잃거나 얻어 전하를 띠는 원자 또는 분자입니다.", + "산화-환원 반응은 전자의 이동이 일어나는 화학 반응입니다.", + "촉매(Catalyst)는 반응 속도를 높이지만 자신은 변하지 않는 물질입니다.", + "엔트로피는 시스템의 무질서도를 나타내는 열역학 개념으로, 항상 증가합니다.", + "열역학 제1법칙: 에너지는 생성되거나 소멸되지 않고, 형태만 변환됩니다.", + "열역학 제2법칙: 닫힌 시스템의 엔트로피는 항상 증가합니다.", + "보일의 법칙: 온도가 일정할 때, 기체의 압력과 부피는 반비례합니다.", + "아보가드로 수(6.022×10²³)는 1몰에 포함된 입자의 수입니다.", + "고분자(Polymer)는 반복되는 단위체(Monomer)가 결합한 큰 분자입니다.", + "플라스틱은 합성 고분자 물질로, 열가소성과 열경화성으로 분류됩니다.", + "탄소 나노튜브는 원통형 탄소 구조로, 강철보다 강하고 구리보다 전기 전도성이 높습니다.", + "그래핀은 탄소 원자가 2차원 벌집 구조로 배열된 물질로, 놀라운 전기·열 전도성을 가집니다.", + "초전도체는 특정 온도 이하에서 전기 저항이 0이 되는 물질입니다.", + "양자역학은 원자·아원자 수준의 물리 현상을 설명하는 물리학 분야입니다.", + "불확정성 원리: 입자의 위치와 운동량을 동시에 정확히 알 수 없습니다 (하이젠베르크).", + "양자 얽힘은 두 양자가 거리에 관계없이 상태가 연결되어 있는 현상입니다.", + "슈뢰딩거의 고양이는 양자 중첩을 설명하는 유명한 사고실험입니다.", + "보어 모형은 전자가 특정 에너지 준위의 궤도를 돈다고 설명하는 원자 모형입니다.", + "파동-입자 이중성은 빛과 물질이 파동과 입자의 성질을 모두 가지는 현상입니다.", + "광전효과는 빛이 금속에 닿으면 전자가 방출되는 현상으로, 아인슈타인이 설명했습니다.", + "레이저(LASER)는 유도방출에 의한 빛의 증폭으로, 단색성·지향성·간섭성이 특징입니다.", + "핵분열은 무거운 원자핵이 쪼개지며 에너지를 방출하는 반응입니다 (원자력 발전).", + "핵융합은 가벼운 원자핵이 합쳐져 에너지를 방출하는 반응입니다 (태양의 에너지원).", + "방사성 붕괴는 불안정한 원자핵이 자발적으로 입자나 에너지를 방출하는 현상입니다.", + "반감기는 방사성 물질의 양이 절반으로 줄어드는 데 걸리는 시간입니다.", + "전자기파 스펙트럼은 라디오파, 마이크로파, 적외선, 가시광, 자외선, X선, 감마선을 포함합니다.", + "도플러 효과는 파원이 관찰자에 접근하면 파장이 짧아지고, 멀어지면 길어지는 현상입니다.", + "음속은 공기 중에서 약 343m/s이며, 온도와 매질에 따라 변합니다.", + "전류는 전하의 흐름이며, 단위는 암페어(A)입니다.", + "옴의 법칙: V = IR (전압 = 전류 × 저항).", + "반도체는 조건에 따라 도체와 부도체의 성질을 모두 보이는 물질입니다.", + "트랜지스터는 전류를 증폭하거나 스위칭하는 소자로, 현대 전자기기의 기본 구성요소입니다.", + "집적회로(IC)는 하나의 반도체 기판에 수십억 개의 트랜지스터를 집적한 소자입니다.", + "자기장은 전류가 흐르는 도선이나 자석 주위에 형성되는 힘의 장입니다.", + "패러데이의 법칙: 변하는 자기장은 전기장을 유도합니다 (전자기 유도).", + "맥스웰 방정식은 전기와 자기를 통합하여 전자기파의 존재를 예측한 방정식입니다.", + "상대성이론: 특수 상대성이론은 시간과 공간의 상대성을, 일반 상대성이론은 중력을 설명합니다.", + "중력파는 시공간의 파동으로, 2015년 LIGO에 의해 최초로 관측되었습니다.", + "블랙홀은 중력이 너무 강해 빛조차 탈출할 수 없는 시공간 영역입니다.", + "빅뱅은 약 138억 년 전 우주가 극도로 뜨겁고 밀도 높은 상태에서 시작되었다는 이론입니다.", + "허블의 법칙: 은하가 멀수록 더 빠르게 후퇴하며, 이는 우주가 팽창하고 있음을 의미합니다.", + "우주 배경 복사(CMB)는 빅뱅의 잔열로, 우주 전체에 균일하게 퍼져 있습니다.", + "암흑물질은 우주 질량의 약 27%를 차지하지만, 빛과 상호작용하지 않아 직접 관측이 불가합니다.", + "암흑에너지는 우주 가속 팽창의 원인으로 추정되며, 우주의 약 68%를 차지합니다.", + "외계행성(Exoplanet)은 태양이 아닌 다른 항성 주위를 도는 행성으로, 5000개 이상 발견되었습니다.", + "골디락스 존(생명체 거주 가능 영역)은 물이 액체로 존재할 수 있는 항성 주변 영역입니다.", + "화성에는 과거 물이 흘렀던 흔적이 발견되어 생명체 존재 가능성이 연구되고 있습니다.", + "국제우주정거장(ISS)은 지구 저궤도를 돌며 미세중력 환경 실험을 수행합니다.", + "인공위성은 지구 궤도를 도는 인공 물체로, 통신·기상·GPS 등에 활용됩니다.", + "GPS는 24개 이상의 위성 신호로 지구상 위치를 정밀하게 측정하는 시스템입니다.", + "판 구조론은 지구의 외부가 여러 판으로 이루어져 있으며, 판의 이동이 지진과 화산을 유발한다는 이론입니다.", + "지진의 규모는 리히터 규모로 측정하며, 1 증가할 때 에너지는 약 32배 증가합니다.", + "화산 폭발은 마그마가 지표로 분출하는 현상으로, 기후 변화를 일으킬 수 있습니다.", + "지구 자기장은 외핵의 액체 철의 대류에 의해 생성되며, 태양풍으로부터 지구를 보호합니다.", + "오존층은 성층권에 있는 오존(O₃) 밀집 구역으로, 자외선을 차단합니다.", + "온실효과는 대기 중 온실가스(CO₂, CH₄ 등)가 적외선을 흡수·방출하여 지구를 따뜻하게 합니다.", + "기후변화는 온실가스 증가로 인한 지구 평균 기온 상승과 이에 따른 기상 이변입니다.", + "탄소 중립(Carbon Neutrality)은 이산화탄소 배출량을 흡수량과 같게 만드는 것입니다.", + "재생에너지는 태양광, 풍력, 수력, 지열 등 자연적으로 보충되는 에너지원입니다.", + "태양전지(Solar Cell)는 빛 에너지를 전기 에너지로 직접 변환하는 소자입니다.", + "페로브스카이트 태양전지는 차세대 태양전지로, 제조 비용이 낮고 효율이 빠르게 향상 중입니다.", + "리튬이온 배터리는 높은 에너지 밀도로 스마트폰, 전기차 등에 널리 사용됩니다.", + "전고체 배터리는 액체 전해질 대신 고체 전해질을 사용하여 안전성과 에너지 밀도를 높입니다.", + "수소 연료전지는 수소와 산소의 화학 반응으로 전기를 생산하며, 물만 배출합니다.", + "핵융합 발전은 태양의 에너지 생성 원리를 이용한 궁극의 에너지원으로, ITER 프로젝트가 진행 중입니다.", + "진화적 적응(Adaptation)은 생물이 환경에 맞게 형질이 변화하는 과정입니다.", + "공생(Symbiosis)은 두 종이 밀접하게 관계하며 함께 사는 것으로, 상호이익·편리공생·기생이 있습니다.", + "생태계(Ecosystem)는 생물과 비생물 환경이 상호작용하는 체계입니다.", + "생물 다양성(Biodiversity)은 유전자, 종, 생태계 수준의 생물학적 다양성입니다.", + "멸종 위기종은 개체수가 급감하여 사라질 위험이 있는 종으로, IUCN 적색 목록에 등재됩니다.", + "세포막은 인지질 이중층으로, 세포 내외부 물질 출입을 조절합니다.", + "삼투(Osmosis)는 반투막을 통해 농도가 낮은 쪽에서 높은 쪽으로 용매가 이동하는 현상입니다.", + "단백질은 아미노산 서열로 구성되며, 효소·항체·구조 단백질 등 다양한 역할을 합니다.", + "RNA는 DNA 정보를 읽어 단백질 합성을 매개하는 핵산입니다 (mRNA, tRNA, rRNA).", + "리보솜은 mRNA 정보를 읽어 단백질을 합성하는 세포 소기관입니다.", + "소포체(ER)는 단백질 합성과 지질 합성에 관여하는 세포 내 막 구조입니다.", + "골지체는 단백질을 가공·분류·포장하여 세포 밖으로 분비하는 소기관입니다.", + "리소좀은 세포 내 소화를 담당하는 효소를 포함한 소기관입니다.", + "엽록체는 광합성이 일어나는 식물 세포 소기관으로, 빛 에너지를 화학 에너지로 변환합니다.", + "PCR(중합효소 연쇄반응)은 DNA를 짧은 시간에 대량으로 복제하는 기술입니다.", + "질량 분석법(Mass Spectrometry)은 분자의 질량을 측정하여 물질을 분석하는 기술입니다.", + "분광학(Spectroscopy)은 빛과 물질의 상호작용을 연구하여 물질을 분석합니다.", + "크로마토그래피는 혼합물을 구성 성분으로 분리하는 분석 기술입니다.", + "X선 결정학은 결정에 X선을 쏘아 분자의 3차원 구조를 밝히는 기술입니다.", + "전자현미경(SEM/TEM)은 전자 빔으로 나노미터 수준의 미세 구조를 관찰합니다.", + "원자력 현미경(AFM)은 탐침으로 표면을 스캔하여 원자 수준의 지형을 측정합니다.", + "3D 프린팅은 디지털 설계를 층층이 쌓아 입체 물체를 제작하는 적층 제조 기술입니다.", + "나노기술은 1~100nm 스케일에서 물질을 제어하여 새로운 기능을 구현하는 기술입니다.", + "생체모방(Biomimicry)은 자연의 구조와 과정을 모방하여 기술 문제를 해결합니다.", + "인공지능의 튜링 테스트는 기계가 인간과 구별 불가능하게 대화할 수 있는지 평가합니다.", + "정보 이론의 비트(bit)는 정보의 최소 단위로, 0 또는 1의 값을 가집니다.", + "섀넌의 엔트로피는 정보의 불확실성을 측정하는 척도입니다.", + "카오스 이론은 초기 조건의 미세한 차이가 결과에 큰 영향을 미치는 시스템을 연구합니다.", + "프랙탈은 부분과 전체가 자기유사성을 가지는 기하학적 구조입니다.", + "게임 이론은 합리적 의사결정자들의 전략적 상호작용을 수학적으로 분석합니다.", + "확률론은 불확실한 사건의 가능성을 수학적으로 다루는 분야입니다.", + "통계학은 데이터를 수집·분석·해석하여 의사결정에 도움을 주는 학문입니다.", + "베이즈 정리는 사전 확률을 새로운 증거로 업데이트하여 사후 확률을 계산합니다.", + "정규분포(가우스 분포)는 자연 현상에서 가장 흔한 확률 분포로, 종 모양 곡선입니다.", + "피보나치 수열(1, 1, 2, 3, 5, 8, ...)은 자연에서 식물의 잎 배열, 껍질 나선 등에 나타납니다.", + "황금비(1.618...)는 예술과 건축에서 아름다운 비율로 여겨지는 수학적 상수입니다.", + "원주율 π(3.14159...)는 원의 둘레와 지름의 비율입니다.", + "자연로그의 밑 e(2.71828...)는 미적분학에서 가장 중요한 상수입니다.", + "미적분학은 뉴턴과 라이프니츠가 독립적으로 개발한 수학의 핵심 분야입니다.", + "소수(Prime Number)는 1과 자기 자신만으로 나누어지는 1보다 큰 자연수입니다.", + "암호학에서 RSA 알고리즘은 큰 소수의 곱을 인수분해하기 어려운 성질을 이용합니다.", + "위상수학(Topology)은 도형의 연속적 변형에서 변하지 않는 성질을 연구합니다.", + "유클리드 기하학은 평행선 공준에 기초한 고전 기하학입니다.", + "비유클리드 기하학은 곡면에서의 기하학으로, 일반 상대성이론의 수학적 기초입니다.", + "리만 가설은 미해결 수학 문제로, 밀레니엄 7대 난제 중 하나입니다.", + "페르마의 마지막 정리는 1995년 앤드루 와일스에 의해 증명되었습니다.", + "물의 비열은 4.18J/(g·K)로, 대부분의 물질보다 높아 온도 조절 역할을 합니다.", + "소리는 매질의 진동으로 전파되며, 진공에서는 전달되지 않습니다.", + "적외선(IR)은 가시광보다 파장이 긴 전자기파로, 열 감지와 통신에 활용됩니다.", + "자외선(UV)은 가시광보다 파장이 짧은 전자기파로, 살균과 비타민D 합성에 관여합니다.", + "감마선은 가장 에너지가 높은 전자기파로, 암 치료와 물질 분석에 사용됩니다.", + "MRI(자기공명영상)는 강한 자기장으로 체내 수소 원자를 공명시켜 영상을 만듭니다.", + "CT(컴퓨터 단층촬영)는 X선을 이용하여 체내의 단면 영상을 생성합니다.", + "초음파(Ultrasound)는 높은 주파수의 음파로, 태아 검사와 물질 탐상에 사용됩니다.", + "탄소-14 연대 측정법은 유기물의 방사성 탄소 비율로 연대를 추정합니다 (최대 5만 년).", + "플라즈마는 고온에서 원자가 이온화된 상태로, 물질의 제4의 상태입니다.", + "보스-아인슈타인 응축(BEC)은 절대영도 근처에서 원자들이 하나의 양자 상태를 공유하는 현상입니다.", + "양자 컴퓨팅은 중첩과 얽힘을 이용하여 특정 문제를 기존 컴퓨터보다 빠르게 풉니다.", + "합성생물학은 생물 시스템을 설계·제작하여 새로운 기능을 가진 유기체를 만드는 분야입니다.", + "마이크로유체공학(Microfluidics)은 미세한 채널에서 유체를 제어하는 '칩 위의 실험실'입니다." +] diff --git a/src/AxCopilot/Assets/Quotes/today_events.json b/src/AxCopilot/Assets/Quotes/today_events.json new file mode 100644 index 0000000..8994c41 --- /dev/null +++ b/src/AxCopilot/Assets/Quotes/today_events.json @@ -0,0 +1,86 @@ +{ + "01-01": ["🎉 새해 첫날! 올 한 해도 좋은 일만 가득하시길 바랍니다."], + "01-04": ["📰 1885년 오늘, 세계 최초 충수돌기(맹장) 수술이 성공적으로 시행되었습니다."], + "01-13": ["🇺🇸 미주 한인의 날 — 1903년 한인 이민자들이 처음 미국에 도착한 날입니다."], + "01-15": ["🕊️ 마틴 루터 킹 주니어 날 — 비폭력 민권 운동의 정신을 기립니다."], + "01-27": ["🕯️ 홀로코스트 추모의 날 — 1945년 아우슈비츠 해방일입니다."], + "02-04": ["🎗️ 세계 암의 날 — 암에 대한 인식을 높이고 조기 검진을 장려합니다."], + "02-11": ["💡 발명가의 날 — 에디슨의 생일을 기념하며 혁신적인 아이디어를 생각해보세요."], + "02-14": ["💕 밸런타인 데이 — 소중한 사람에게 마음을 전해보세요."], + "02-28": ["🇰🇷 2·28 민주운동 기념일 — 대구에서 일어난 학생 민주화 운동을 기립니다."], + "03-01": ["🇰🇷 3·1절 — 1919년 독립만세운동을 기리는 날입니다."], + "03-03": ["🐾 세계 야생 동식물의 날 — 멸종 위기 종 보호와 생태계의 중요성을 되새깁니다."], + "03-08": ["🌷 세계 여성의 날 — 여성의 사회적 기여를 기념합니다."], + "03-14": ["🥧 파이 데이(π Day) — 원주율 3.14를 기념하는 날! 수학의 아름다움을 느껴보세요."], + "03-15": ["🇰🇷 3·15 의거 기념일 — 부정선거에 항거한 민주화 운동을 기립니다."], + "03-20": ["😊 국제 행복의 날 — 행복이 인류의 보편적 목표임을 기념합니다."], + "03-21": ["🌳 세계 산림의 날 — 숲의 보존과 지속 가능한 관리를 생각합니다."], + "03-22": ["💧 세계 물의 날 — 깨끗한 물의 소중함을 되새기는 날입니다."], + "03-24": ["🏥 세계 결핵의 날 — 결핵 퇴치를 위한 노력을 되새기는 날입니다."], + "04-01": ["🃏 만우절 — 가벼운 장난으로 웃음을 나누는 날입니다."], + "04-03": ["🇰🇷 4·3 희생자 추념일 — 제주 4·3 사건의 희생자를 기리고 평화를 기원합니다."], + "04-05": ["🌱 식목일 — 나무를 심고 녹색 환경을 가꾸는 날입니다."], + "04-07": ["⚕️ 세계 보건의 날 — 전 세계의 보건 복지 증진을 위해 지정된 날입니다."], + "04-11": ["🇰🇷 대한민국 임시정부 수립 기념일 — 1919년 임시정부의 법통을 기립니다."], + "04-12": ["🚀 1961년 오늘, 유리 가가린이 인류 최초 우주비행에 성공했습니다."], + "04-16": ["🎗️ 국민안전의 날 — 세월호 참사 이후 안전의 중요성을 되새기기 위해 제정되었습니다."], + "04-19": ["🇰🇷 4·19 혁명 기념일 — 자유·민주·정의의 헌법 정신을 기리는 날입니다."], + "04-20": ["♿ 장애인의 날 — 장애인에 대한 이해를 깊게 하고 재활 의욕을 고취합니다."], + "04-21": ["🔬 과학의 날 — 과학기술의 진흥과 대중화를 위해 제정되었습니다."], + "04-22": ["🌍 지구의 날(Earth Day) — 환경 보호의 중요성을 되새기는 날입니다."], + "04-25": ["🦟 세계 말라리아의 날 — 말라리아 퇴치를 위한 국제적 노력을 기념합니다."], + "04-28": ["🦺 세계 산업안전보건의 날 — 안전한 근무 환경을 위해 함께 노력합시다."], + "05-01": ["👷 근로자의 날 — 모든 근로자의 노고에 감사드립니다."], + "05-05": ["🧒 어린이날 — 미래의 주인공들을 축하합니다!"], + "05-08": ["💐 어버이날 — 부모님의 사랑과 은혜에 감사드리는 날입니다."], + "05-10": ["🌊 바다식목일 — 바다 속 생태계 보호를 위해 바다숲을 가꾸는 날입니다."], + "05-15": ["📚 스승의 날 — 가르침에 감사드리는 날입니다."], + "05-18": ["🕯️ 5·18 민주화운동 기념일 — 민주주의를 위한 희생을 기억합니다."], + "05-19": ["⚙️ 발명의 날 — 발명 의욕을 고취하고 과학기술 발전을 기립니다."], + "05-21": ["🌐 세계 문화 다양성의 날 / 부부의 날 — 서로 다른 문화와 소중한 배우자를 존중합시다."], + "05-31": ["🚭 세계 금연의 날 — 담배 없는 깨끗한 세상을 꿈꾸는 날입니다."], + "06-01": ["🇰🇷 의병의 날 — 나라가 위기에 처했을 때 자발적으로 일어난 의병을 기립니다."], + "06-05": ["🌍 세계 환경의 날 — 지구를 위한 작은 실천을 시작해보세요."], + "06-06": ["🇰🇷 현충일 — 호국영령의 숭고한 희생을 기억합니다."], + "06-10": ["🇰🇷 6·10 민주항쟁 기념일 — 1987년 전국적인 민주화 운동을 기립니다."], + "06-25": ["🕊️ 1950년 오늘, 한국전쟁이 발발했습니다. 평화의 소중함을 되새깁니다."], + "06-28": ["🚆 철도의 날 — 한국 철도의 창설과 발전을 기념하는 날입니다."], + "07-04": ["🇺🇸 미국 독립기념일 — 1776년 독립선언서가 공표된 날입니다."], + "07-11": ["👪 세계 인구의 날 — 인구 문제에 대한 관심을 높이기 위해 지정되었습니다."], + "07-17": ["🇰🇷 제헌절 — 대한민국 헌법이 공포된 날입니다."], + "07-20": ["🌙 1969년 오늘, 닐 암스트롱이 달에 첫 발을 디뎠습니다. '인류의 위대한 도약!'"], + "07-28": ["🏥 세계 간염의 날 — 간염 예방과 관리에 대한 인식을 높이는 날입니다."], + "08-12": ["🙋 세계 청소년의 날 — 청소년의 역할과 책임을 되새기는 날입니다."], + "08-14": ["🦋 일본군 '위안부' 피해자 기림의 날 — 피해자들의 용기와 아픔을 기억합니다."], + "08-15": ["🇰🇷 광복절 — 1945년 조국 광복의 기쁨을 기념합니다."], + "08-29": ["🇰🇷 경술국치일 — 1910년 국권을 상실한 슬픈 역사를 잊지 않기 위한 날입니다."], + "09-01": ["📰 방재의 날 — 자연재해에 대비하는 안전 의식을 높이는 날입니다."], + "09-07": ["☁️ 푸른 하늘의 날 — 대기오염 저감과 기후변화에 대한 관심을 촉구합니다."], + "09-10": ["🤝 세계 자살 예방의 날 — 생명의 소중함과 자살 예방을 위해 노력하는 날입니다."], + "09-21": ["🕊️ 세계 평화의 날 — 전쟁과 폭력이 없는 평화로운 세상을 기원합니다."], + "09-28": ["🌊 세계 해양의 날 — 바다의 소중함을 되새기는 날입니다."], + "10-01": ["🇰🇷 국군의 날 / 👴 세계 노인의 날 — 국군의 위용을 기리고 어르신들께 감사드립니다."], + "10-02": ["👵 노인의 날 — 경로효친 사상을 함양하고 어르신들의 노고에 보답합니다."], + "10-03": ["🇰🇷 개천절 — 단군왕검의 고조선 건국을 기리는 날입니다."], + "10-04": ["🚀 1957년 오늘, 소련이 세계 최초 인공위성 스푸트니크를 발사했습니다."], + "10-05": ["👨‍🏫 세계 교사의 날 — 교육의 중요성과 교사들의 헌신을 기념합니다."], + "10-09": ["🇰🇷 한글날 — 세종대왕의 훈민정음 창제를 기념합니다. 한글의 우수성을 자랑스러워합시다!"], + "10-10": ["🧠 세계 정신건강의 날 — 정신건강에 대한 올바른 인식을 고취합니다."], + "10-16": ["🇰🇷 부마민주항쟁 기념일 — 부산과 마산의 시민들이 유신독재에 항거한 날입니다."], + "10-21": ["👮 경찰의 날 — 민생치안의 주역인 경찰관들의 노고를 치하합니다."], + "10-24": ["🇺🇳 유엔의 날 — 1945년 유엔 헌장이 발효된 날입니다."], + "10-25": ["⛰️ 독도의 날 — 독도가 대한민국의 영토임을 대내외에 알리는 날입니다."], + "10-29": ["💻 1969년 오늘, 인터넷의 전신 ARPANET에서 최초의 메시지가 전송되었습니다."], + "11-03": ["📰 학생독립운동기념일 — 1929년 광주학생운동을 기억합니다."], + "11-09": ["🚒 소방의 날 — 화재 예방에 대한 경각심을 높이고 소방관을 격려합니다."], + "11-11": ["🍫 빼빼로데이 / 제1차 세계대전 종전 기념일(1918) — 평화를 기원합니다."], + "11-17": ["🇰🇷 순국선열의 날 — 국권 회복을 위해 희생하신 선열들을 기립니다."], + "11-19": ["👶 세계 아동학대 예방의 날 — 아동 보호와 학대 근절을 위해 노력합시다."], + "11-20": ["🎎 세계 어린이날 — 모든 어린이의 권리를 보호하고 증진하는 날입니다."], + "12-01": ["🩸 세계 에이즈의 날 — 에이즈 예방과 환자에 대한 편견 해소를 위해 노력합니다."], + "12-03": ["♿ 세계 장애인의 날 — 장애인의 권리 증진과 사회 참여를 독려합니다."], + "12-05": ["🤝 무역의 날 / 세계 자원봉사자의 날 — 수출 증대와 봉사의 가치를 기념합니다."], + "12-10": ["📜 세계 인권의 날 — 1948년 세계인권선언 채택을 기념합니다."], + "12-25": ["🎄 크리스마스 — 따뜻한 마음을 나누는 날입니다."], + "12-31": ["🎊 한 해의 마지막 날! 올 한 해 수고 많으셨습니다. 내년에도 좋은 일만 가득하길!"] +} \ No newline at end of file diff --git a/src/AxCopilot/Assets/SearchEngines/duckduckgo.png b/src/AxCopilot/Assets/SearchEngines/duckduckgo.png new file mode 100644 index 0000000..64ee943 Binary files /dev/null and b/src/AxCopilot/Assets/SearchEngines/duckduckgo.png differ diff --git a/src/AxCopilot/Assets/SearchEngines/github.png b/src/AxCopilot/Assets/SearchEngines/github.png new file mode 100644 index 0000000..52126e0 Binary files /dev/null and b/src/AxCopilot/Assets/SearchEngines/github.png differ diff --git a/src/AxCopilot/Assets/SearchEngines/google.png b/src/AxCopilot/Assets/SearchEngines/google.png new file mode 100644 index 0000000..8642fc1 Binary files /dev/null and b/src/AxCopilot/Assets/SearchEngines/google.png differ diff --git a/src/AxCopilot/Assets/SearchEngines/namuwiki.png b/src/AxCopilot/Assets/SearchEngines/namuwiki.png new file mode 100644 index 0000000..5423adf Binary files /dev/null and b/src/AxCopilot/Assets/SearchEngines/namuwiki.png differ diff --git a/src/AxCopilot/Assets/SearchEngines/naver.png b/src/AxCopilot/Assets/SearchEngines/naver.png new file mode 100644 index 0000000..020e16d Binary files /dev/null and b/src/AxCopilot/Assets/SearchEngines/naver.png differ diff --git a/src/AxCopilot/Assets/SearchEngines/navermap.png b/src/AxCopilot/Assets/SearchEngines/navermap.png new file mode 100644 index 0000000..9e0bfaf Binary files /dev/null and b/src/AxCopilot/Assets/SearchEngines/navermap.png differ diff --git a/src/AxCopilot/Assets/SearchEngines/wikipedia.png b/src/AxCopilot/Assets/SearchEngines/wikipedia.png new file mode 100644 index 0000000..4405b8d Binary files /dev/null and b/src/AxCopilot/Assets/SearchEngines/wikipedia.png differ diff --git a/src/AxCopilot/Assets/SearchEngines/youtube.png b/src/AxCopilot/Assets/SearchEngines/youtube.png new file mode 100644 index 0000000..c20e1d3 Binary files /dev/null and b/src/AxCopilot/Assets/SearchEngines/youtube.png differ diff --git a/src/AxCopilot/Assets/about.json b/src/AxCopilot/Assets/about.json new file mode 100644 index 0000000..f0f556e --- /dev/null +++ b/src/AxCopilot/Assets/about.json @@ -0,0 +1,10 @@ +{ + "appName": "AX Copilot", + "companyName": "AX연구소 AI팀", + "authorName": "백승재", + "authorTitle": "SW Architect", + "purpose": "업무 편의성 증가 및 시스템의 직관적인 연결을 위해 제작", + "copyright": "© 2026 AX연구소", + "blogUrl": "www.swarchitect.net", + "contributors": "경윤영님, 윤지영님, 배지훈님" +} diff --git a/src/AxCopilot/Assets/diamond_pixel.svg b/src/AxCopilot/Assets/diamond_pixel.svg new file mode 100644 index 0000000..48d7a81 --- /dev/null +++ b/src/AxCopilot/Assets/diamond_pixel.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/AxCopilot/Assets/guide_dev.enc b/src/AxCopilot/Assets/guide_dev.enc new file mode 100644 index 0000000..e798fe5 Binary files /dev/null and b/src/AxCopilot/Assets/guide_dev.enc differ diff --git a/src/AxCopilot/Assets/guide_user.enc b/src/AxCopilot/Assets/guide_user.enc new file mode 100644 index 0000000..d1264f8 Binary files /dev/null and b/src/AxCopilot/Assets/guide_user.enc differ diff --git a/src/AxCopilot/Assets/icon.ico b/src/AxCopilot/Assets/icon.ico new file mode 100644 index 0000000..273db74 Binary files /dev/null and b/src/AxCopilot/Assets/icon.ico differ diff --git a/src/AxCopilot/Assets/icon_backup.ico b/src/AxCopilot/Assets/icon_backup.ico new file mode 100644 index 0000000..5227cf1 Binary files /dev/null and b/src/AxCopilot/Assets/icon_backup.ico differ diff --git a/src/AxCopilot/Assets/mascot.png b/src/AxCopilot/Assets/mascot.png new file mode 100644 index 0000000..5514d0a Binary files /dev/null and b/src/AxCopilot/Assets/mascot.png differ diff --git a/src/AxCopilot/Assets/swarchitect.png b/src/AxCopilot/Assets/swarchitect.png new file mode 100644 index 0000000..5514d0a Binary files /dev/null and b/src/AxCopilot/Assets/swarchitect.png differ diff --git a/src/AxCopilot/Assets/system_prompt.txt b/src/AxCopilot/Assets/system_prompt.txt new file mode 100644 index 0000000..5a999d3 --- /dev/null +++ b/src/AxCopilot/Assets/system_prompt.txt @@ -0,0 +1 @@ +[역할] 당신은 회사 업무의 도움을 주는 매우 유능한 비서입니다. 말투는 정중하게 하며, 욕을 해서는 안됩니다. \ No newline at end of file diff --git a/src/AxCopilot/AxCopilot.csproj b/src/AxCopilot/AxCopilot.csproj new file mode 100644 index 0000000..e481af1 --- /dev/null +++ b/src/AxCopilot/AxCopilot.csproj @@ -0,0 +1,148 @@ + + + WinExe + net8.0-windows + enable + enable + true + true + AxCopilot + AxCopilot + Assets\icon.ico + + 1.8.0 + AX + AX Copilot + AI 기반 업무 자동화 런처 & 코파일럿 + + true + + + win-x64 + + + + none + false + + false + + false + false + + + + + + false + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + PreserveNewest + system_prompt.txt + + + + + + + PreserveNewest + skills\%(Filename)%(Extension) + + + + + + + + + + + + + + + + + + + + <_Parameter1>AxCopilot.Tests + + + diff --git a/src/AxCopilot/AxCopilot_fjx3b4t3_wpftmp.csproj b/src/AxCopilot/AxCopilot_fjx3b4t3_wpftmp.csproj new file mode 100644 index 0000000..d1804e2 --- /dev/null +++ b/src/AxCopilot/AxCopilot_fjx3b4t3_wpftmp.csproj @@ -0,0 +1,361 @@ + + + AxCopilot + obj\Release\ + obj\ + E:\AX Copilot\src\AxCopilot\obj\ + <_TargetAssemblyProjectName>AxCopilot + AxCopilot + + + + WinExe + net8.0-windows + enable + enable + true + true + AxCopilot + Assets\icon.ico + + 1.2.2 + AX + AX Copilot + AI 기반 업무 자동화 런처 & 코파일럿 + + true + + win-x64 + + + none + false + + false + + false + false + + + + + false + + false + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + PreserveNewest + + + + + + + + + PreserveNewest + + + + PreserveNewest + system_prompt.txt + + + + + + + + + <_Parameter1>AxCopilot.Tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/Core/BulkObservableCollection.cs b/src/AxCopilot/Core/BulkObservableCollection.cs new file mode 100644 index 0000000..5587475 --- /dev/null +++ b/src/AxCopilot/Core/BulkObservableCollection.cs @@ -0,0 +1,49 @@ +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.ComponentModel; + +namespace AxCopilot.Core; + +/// +/// ReplaceAll 호출 시 단일 Reset 이벤트만 발생시켜 WPF ItemsControl 레이아웃 재계산을 최소화합니다. +/// 일반 Add/Remove/Clear는 기존 ObservableCollection과 동일하게 동작합니다. +/// +public sealed class BulkObservableCollection : ObservableCollection +{ + private bool _suppressNotification; + + protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) + { + if (!_suppressNotification) + base.OnCollectionChanged(e); + } + + protected override void OnPropertyChanged(PropertyChangedEventArgs e) + { + if (!_suppressNotification) + base.OnPropertyChanged(e); + } + + /// + /// 기존 항목을 모두 지우고 새 항목으로 교체합니다. + /// CollectionChanged(Reset) 이벤트를 단 한 번만 발생시켜 WPF 레이아웃 1회만 갱신합니다. + /// + public void ReplaceAll(IEnumerable items) + { + _suppressNotification = true; + try + { + Items.Clear(); + foreach (var item in items) + Items.Add(item); + } + finally + { + _suppressNotification = false; + } + // Count / Item[] 프로퍼티 변경 알림 + 단일 Reset 이벤트 + OnPropertyChanged(new PropertyChangedEventArgs("Count")); + OnPropertyChanged(new PropertyChangedEventArgs("Item[]")); + OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + } +} diff --git a/src/AxCopilot/Core/CommandResolver.cs b/src/AxCopilot/Core/CommandResolver.cs new file mode 100644 index 0000000..b5247a5 --- /dev/null +++ b/src/AxCopilot/Core/CommandResolver.cs @@ -0,0 +1,212 @@ +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Core; + +/// +/// 입력된 텍스트를 파싱하여 적절한 ActionHandler로 라우팅합니다. +/// Prefix 기반 라우팅 테이블을 관리합니다. +/// +public class CommandResolver +{ + private readonly FuzzyEngine _fuzzy; + private readonly SettingsService _settings; + private readonly Dictionary _handlers = new(); + /// Prefix = null 핸들러 목록 — 모든 쿼리에 병렬 실행 + private readonly List _fuzzyHandlers = new(); + + public CommandResolver(FuzzyEngine fuzzy, SettingsService settings) + { + _fuzzy = fuzzy; + _settings = settings; + } + + /// + /// 핸들러를 등록합니다. 플러그인 로드 시에도 이 메서드를 호출합니다. + /// + public void RegisterHandler(IActionHandler handler) + { + // Prefix 없는 핸들러 → 모든 쿼리에 부가 결과 제공 (예: BookmarkHandler) + if (handler.Prefix == null) + { + _fuzzyHandlers.Add(handler); + LogService.Info($"FuzzyHandler 등록: name='{handler.Metadata.Name}'"); + return; + } + + if (_handlers.ContainsKey(handler.Prefix)) + LogService.Warn($"Prefix '{handler.Prefix}' 중복 등록: " + + $"'{handler.Metadata.Name}'이 기존 핸들러를 덮어씁니다."); + + _handlers[handler.Prefix] = handler; + LogService.Info($"Handler 등록: prefix='{handler.Prefix}', name='{handler.Metadata.Name}'"); + } + + /// + /// 입력 텍스트를 분석하여 결과 목록을 반환합니다. + /// + public async Task> ResolveAsync(string input, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(input)) + return Enumerable.Empty(); + + // 1. Prefix 기반 라우팅 + foreach (var (prefix, handler) in _handlers) + { + if (input.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + { + var query = input.Length > prefix.Length + ? input[prefix.Length..].Trim() + : ""; + + try + { + return await handler.GetItemsAsync(query, ct); + } + catch (OperationCanceledException) { throw; } + catch (Exception ex) + { + LogService.Error($"Handler '{handler.Metadata.Name}' 오류: {ex.Message}"); + return [new SDK.LauncherItem($"오류: {ex.Message}", handler.Metadata.Name, null, null)]; + } + } + } + + // 2. Fuzzy 검색 폴백 + null-prefix 핸들러 병렬 실행 + var maxResults = _settings.Settings.Launcher.MaxResults; + + // Path 기반 중복 제거: 같은 경로의 항목이 여러 키워드로 매칭될 때 첫 번째만 표시 + var seenPaths = new HashSet(StringComparer.OrdinalIgnoreCase); + // SortByUsage에 lazy 시퀀스를 직접 전달 → 중간 ToList 1회 제거 + var fuzzyItems = UsageRankingService.SortByUsage( + _fuzzy.Search(input, maxResults * 2) // 중복 제거 여유분 + .Where(r => seenPaths.Add(r.Entry.Path)) // Path가 처음 등장할 때만 통과 + .Take(maxResults) + .Select(r => new SDK.LauncherItem( + r.Entry.DisplayName, + r.Entry.Type == IndexEntryType.Alias ? r.Entry.AliasType switch + { + "url" => "URL 단축키", + "batch" => "명령 단축키", + _ => r.Entry.Path + } : r.Entry.Path + " ⇧ Shift+Enter: 폴더 열기", + null, + r.Entry, + Symbol: r.Entry.Type switch + { + IndexEntryType.App => Symbols.App, + IndexEntryType.Folder => Symbols.Folder, + IndexEntryType.Alias => r.Entry.AliasType switch + { + "url" => Symbols.Globe, + "batch" => Symbols.Terminal, + _ => Symbols.Plugin + }, + _ => Symbols.File + } + )), + item => (item.Data as IndexEntry)?.Path + ).ToList(); // 단일 ToList로 List 확정 + + // null-prefix 핸들러 결과를 뒤에 추가 (최대 3개씩) + if (_fuzzyHandlers.Count > 0) + { + var extraTasks = _fuzzyHandlers + .Select(h => SafeGetItemsAsync(h, input, ct)) + .ToList(); + await Task.WhenAll(extraTasks); + + foreach (var task in extraTasks) + { + if (task.IsCompletedSuccessfully) + fuzzyItems.AddRange(task.Result.Take(3)); + } + } + + return fuzzyItems; + } + + /// + /// 선택된 항목을 실행합니다. + /// + public async Task ExecuteAsync(SDK.LauncherItem item, string lastInput, CancellationToken ct) + { + // Prefix 기반 실행 + foreach (var (prefix, handler) in _handlers) + { + if (lastInput.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + { + // 명령어 사용 통계 기록 (prefix + 첫 단어) + var q = lastInput.Length > prefix.Length + ? lastInput[prefix.Length..].Trim().Split(' ')[0] + : ""; + var cmdKey = string.IsNullOrEmpty(q) ? prefix : $"{prefix}{q}"; + UsageStatisticsService.RecordCommandUsage(cmdKey); + + await handler.ExecuteAsync(item, ct); + return; + } + } + + // null-prefix 핸들러 결과 실행 (Data가 string = URL인 경우) + if (item.Data is string urlData && urlData.StartsWith("http", StringComparison.OrdinalIgnoreCase)) + { + await ExecuteNullPrefixAsync(item, ct); + return; + } + + // Fuzzy 결과 실행 (IndexEntry 기반) + if (item.Data is IndexEntry entry) + { + var expanded = Environment.ExpandEnvironmentVariables(entry.Path); + try + { + // Process.Start를 먼저 실행하여 체감 속도 확보 + await Task.Run(() => + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(expanded) + { + UseShellExecute = true + })); + } + catch (Exception ex) + { + LogService.Error($"실행 실패: {expanded} - {ex.Message}"); + } + + // 통계 기록은 파일 열기 이후 비동기로 + _ = Task.Run(() => UsageRankingService.RecordExecution(entry.Path)); + } + } + + public IReadOnlyDictionary RegisteredHandlers => _handlers; + + // null-prefix 핸들러 실행 (ExecuteAsync 라우팅) + public async Task ExecuteNullPrefixAsync(SDK.LauncherItem item, CancellationToken ct) + { + foreach (var handler in _fuzzyHandlers) + { + try { await handler.ExecuteAsync(item, ct); return; } + catch (OperationCanceledException) { throw; } + catch (Exception ex) + { + LogService.Error($"FuzzyHandler '{handler.Metadata.Name}' 실행 오류: {ex.Message}"); + } + } + } + + private static async Task> SafeGetItemsAsync( + IActionHandler handler, string query, CancellationToken ct) + { + try + { + return await handler.GetItemsAsync(query, ct); + } + catch (OperationCanceledException) { throw; } + catch (Exception ex) + { + LogService.Error($"FuzzyHandler '{handler.Metadata.Name}' 오류: {ex.Message}"); + return Enumerable.Empty(); + } + } +} diff --git a/src/AxCopilot/Core/ContextManager.cs b/src/AxCopilot/Core/ContextManager.cs new file mode 100644 index 0000000..e705f86 --- /dev/null +++ b/src/AxCopilot/Core/ContextManager.cs @@ -0,0 +1,332 @@ +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using AxCopilot.Models; +using AxCopilot.Services; + +namespace AxCopilot.Core; + +/// +/// Windows 창의 HWND, Rect, 프로세스 경로를 수집하고 복원합니다 (The Shifter). +/// +public class ContextManager +{ + private readonly SettingsService _settings; + + public ContextManager(SettingsService settings) + { + _settings = settings; + + // 모니터 구성 변경 감지는 MainWindow의 WndProc에서 WM_DISPLAYCHANGE를 통해 처리 + } + + // ─── Snapshot ──────────────────────────────────────────────────────────── + + /// + /// 현재 화면에 열린 모든 업무용 창을 캡처하여 프로필로 저장합니다. + /// + public WorkspaceProfile CaptureProfile(string name) + { + var snapshots = new List(); + var monitorMap = BuildMonitorMap(); + + EnumWindows((hWnd, _) => + { + if (!IsWindowVisible(hWnd)) return true; + if (IsIconic(hWnd)) return true; // 최소화된 창 제외 여부는 설정으로 조정 가능 + + var title = GetWindowTitle(hWnd); + if (string.IsNullOrWhiteSpace(title)) return true; + + // 작업표시줄, 바탕화면 등 시스템 창 제외 + if (IsSystemWindow(hWnd)) return true; + + var exePath = GetProcessPath(hWnd); + if (string.IsNullOrEmpty(exePath)) return true; + + GetWindowRect(hWnd, out RECT rect); + GetWindowPlacement(hWnd, out WINDOWPLACEMENT placement); + + var showCmd = placement.showCmd switch + { + 1 => "Normal", + 2 => "Minimized", + 3 => "Maximized", + _ => "Normal" + }; + + int monitorIndex = GetMonitorIndex(hWnd, monitorMap); + + snapshots.Add(new WindowSnapshot + { + Exe = exePath, + Title = title, + Rect = new WindowRect + { + X = rect.Left, + Y = rect.Top, + Width = rect.Right - rect.Left, + Height = rect.Bottom - rect.Top + }, + ShowCmd = showCmd, + Monitor = monitorIndex + }); + + return true; + }, IntPtr.Zero); + + var profile = new WorkspaceProfile + { + Name = name, + Windows = snapshots, + CreatedAt = DateTime.Now + }; + + // settings.json에 저장 + var existing = _settings.Settings.Profiles.FirstOrDefault(p => + p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + if (existing != null) + _settings.Settings.Profiles.Remove(existing); + _settings.Settings.Profiles.Add(profile); + _settings.Save(); + + LogService.Info($"프로필 '{name}' 저장 완료: {snapshots.Count}개 창"); + return profile; + } + + // ─── Restore ───────────────────────────────────────────────────────────── + + /// + /// 저장된 프로필을 복원합니다. + /// + public async Task RestoreProfileAsync(string name, CancellationToken ct = default) + { + var profile = _settings.Settings.Profiles + .FirstOrDefault(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + + if (profile == null) + return new RestoreResult(false, $"프로필 '{name}'을 찾을 수 없습니다."); + + var results = new List(); + var monitorCount = GetMonitorCount(); + + foreach (var snapshot in profile.Windows) + { + ct.ThrowIfCancellationRequested(); + + // 1. 실행 중인 창 찾기 + var hWnd = FindMatchingWindow(snapshot); + + // 2. 창이 없으면 EXE 실행 후 대기 + if (hWnd == IntPtr.Zero && File.Exists(snapshot.Exe)) + { + try + { + Process.Start(new ProcessStartInfo(snapshot.Exe) { UseShellExecute = true }); + hWnd = await WaitForWindowAsync(snapshot.Exe, TimeSpan.FromSeconds(3), ct); + } + catch (Exception ex) + { + results.Add($"⚠ {snapshot.Title}: 실행 실패 ({ex.Message})"); + LogService.Warn($"앱 실행 실패: {snapshot.Exe} - {ex.Message}"); + continue; + } + } + + if (hWnd == IntPtr.Zero) + { + results.Add($"⏭ {snapshot.Title}: 창 없음, 건너뜀"); + continue; + } + + // 3. 모니터 불일치 처리 + if (snapshot.Monitor >= monitorCount) + { + var policy = _settings.Settings.MonitorMismatch; + if (policy == "skip") + { + results.Add($"⏭ {snapshot.Title}: 모니터 불일치, 건너뜀"); + continue; + } + // "fit" 또는 "warn" → 첫 번째 모니터에 배치 + } + + // 4. 창 위치/크기 복원 + try + { + ShowWindow(hWnd, snapshot.ShowCmd switch + { + "Maximized" => 3, + "Minimized" => 2, + _ => 9 // SW_RESTORE + }); + + if (snapshot.ShowCmd == "Normal") + { + SetWindowPos(hWnd, IntPtr.Zero, + snapshot.Rect.X, snapshot.Rect.Y, + snapshot.Rect.Width, snapshot.Rect.Height, + SWP_NOZORDER | SWP_NOACTIVATE); + } + + results.Add($"✓ {snapshot.Title}: 복원 완료"); + } + catch (Exception ex) + { + results.Add($"⚠ {snapshot.Title}: 복원 실패 ({ex.Message})"); + LogService.Warn($"창 복원 실패 (권한 문제 가능): {snapshot.Exe}"); + } + } + + LogService.Info($"프로필 '{name}' 복원: {string.Join(", ", results)}"); + return new RestoreResult(true, string.Join("\n", results)); + } + + // ─── Profile Management ────────────────────────────────────────────────── + + public bool DeleteProfile(string name) + { + var profile = _settings.Settings.Profiles + .FirstOrDefault(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + if (profile == null) return false; + _settings.Settings.Profiles.Remove(profile); + _settings.Save(); + return true; + } + + public bool RenameProfile(string oldName, string newName) + { + var profile = _settings.Settings.Profiles + .FirstOrDefault(p => p.Name.Equals(oldName, StringComparison.OrdinalIgnoreCase)); + if (profile == null) return false; + profile.Name = newName; + _settings.Save(); + return true; + } + + // ─── Helpers ───────────────────────────────────────────────────────────── + + private static IntPtr FindMatchingWindow(WindowSnapshot snapshot) + { + IntPtr found = IntPtr.Zero; + EnumWindows((hWnd, _) => + { + var path = GetProcessPath(hWnd); + if (string.Equals(path, snapshot.Exe, StringComparison.OrdinalIgnoreCase)) + { + found = hWnd; + return false; // 첫 번째 매칭 창에서 중단 + } + return true; + }, IntPtr.Zero); + return found; + } + + private static async Task WaitForWindowAsync(string exePath, TimeSpan timeout, CancellationToken ct) + { + var deadline = DateTime.UtcNow + timeout; + while (DateTime.UtcNow < deadline) + { + ct.ThrowIfCancellationRequested(); + var hWnd = FindMatchingWindow(new WindowSnapshot { Exe = exePath }); + if (hWnd != IntPtr.Zero) return hWnd; + await Task.Delay(200, ct); + } + return IntPtr.Zero; + } + + private static string GetWindowTitle(IntPtr hWnd) + { + var sb = new StringBuilder(256); + GetWindowText(hWnd, sb, sb.Capacity); + return sb.ToString(); + } + + private static string GetProcessPath(IntPtr hWnd) + { + try + { + GetWindowThreadProcessId(hWnd, out uint pid); + if (pid == 0) return ""; + var proc = Process.GetProcessById((int)pid); + return proc.MainModule?.FileName ?? ""; + } + catch (Exception) { return ""; } + } + + private static bool IsSystemWindow(IntPtr hWnd) + { + var cls = new StringBuilder(256); + GetClassName(hWnd, cls, cls.Capacity); + var name = cls.ToString(); + return name is "Shell_TrayWnd" or "Progman" or "WorkerW" or "DV2ControlHost"; + } + + private static Dictionary BuildMonitorMap() + { + var monitors = new List(); + EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, + (IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprc, IntPtr dwData) => + { + monitors.Add(hMonitor); + return true; + }, IntPtr.Zero); + + return monitors + .Select((hm, idx) => (hm, idx)) + .ToDictionary(t => t.hm, t => t.idx); + } + + private static int GetMonitorIndex(IntPtr hWnd, Dictionary map) + { + var monitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); + return map.TryGetValue(monitor, out int idx) ? idx : 0; + } + + private static int GetMonitorCount() + { + int count = 0; + EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, (IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprc, IntPtr dwData) => { count++; return true; }, IntPtr.Zero); + return count; + } + + // ─── P/Invoke ──────────────────────────────────────────────────────────── + + private const uint SWP_NOZORDER = 0x0004; + private const uint SWP_NOACTIVATE = 0x0010; + private const uint MONITOR_DEFAULTTONEAREST = 0x00000002; + + [StructLayout(LayoutKind.Sequential)] + private struct RECT { public int Left, Top, Right, Bottom; } + + [StructLayout(LayoutKind.Sequential)] + private struct WINDOWPLACEMENT + { + public uint length, flags; + public uint showCmd; + public POINT ptMinPosition, ptMaxPosition; + public RECT rcNormalPosition; + } + + [StructLayout(LayoutKind.Sequential)] + private struct POINT { public int x, y; } + + private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); + private delegate bool MonitorEnumProc(IntPtr hMonitor, IntPtr hdcMonitor, ref RECT lprcMonitor, IntPtr dwData); + + [DllImport("user32.dll")] private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); + [DllImport("user32.dll")] private static extern bool IsWindowVisible(IntPtr hWnd); + [DllImport("user32.dll")] private static extern bool IsIconic(IntPtr hWnd); + [DllImport("user32.dll")] private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); + [DllImport("user32.dll")] private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); + [DllImport("user32.dll")] private static extern bool GetWindowPlacement(IntPtr hWnd, out WINDOWPLACEMENT lpwndpl); + [DllImport("user32.dll")] private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); + [DllImport("user32.dll")] private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); + [DllImport("user32.dll")] private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); + [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + [DllImport("user32.dll")] private static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); + [DllImport("user32.dll")] private static extern bool EnumDisplayMonitors(IntPtr hdc, IntPtr lprcClip, MonitorEnumProc lpfnEnum, IntPtr dwData); +} + +public record RestoreResult(bool Success, string Message); diff --git a/src/AxCopilot/Core/FuzzyEngine.cs b/src/AxCopilot/Core/FuzzyEngine.cs new file mode 100644 index 0000000..9a7c10b --- /dev/null +++ b/src/AxCopilot/Core/FuzzyEngine.cs @@ -0,0 +1,420 @@ +using AxCopilot.Services; + +namespace AxCopilot.Core; + +/// +/// 부분 입력·오타도 유사 항목을 찾아주는 Fuzzy 검색 엔진. +/// 한글 초성 검색, 자모 분리 검색, 비연속 매칭을 지원합니다. +/// +public class FuzzyEngine +{ + private readonly IndexService _index; + + public FuzzyEngine(IndexService index) + { + _index = index; + } + + /// + /// 쿼리에 대해 유사도 순으로 정렬된 결과를 반환합니다. + /// 300개 이상 항목은 PLINQ 병렬 처리로 검색 속도를 개선합니다. + /// + public IEnumerable Search(string query, int maxResults = 7) + { + if (string.IsNullOrWhiteSpace(query)) + return Enumerable.Empty(); + + var normalized = query.Trim().ToLowerInvariant(); + var entries = _index.Entries; + + // 쿼리 언어 타입 1회 사전 분류 — 항목마다 재계산하지 않음 + bool queryHasKorean = false; + foreach (var c in normalized) + { + if ((c >= 0xAC00 && c <= 0xD7A3) || ChosungSet.Contains(c)) + { queryHasKorean = true; break; } + } + + // 300개 초과 시 PLINQ 병렬 처리 + if (entries.Count > 300) + { + return entries.AsParallel() + .Select(e => new FuzzyResult(e, CalculateScoreFast(normalized, e, queryHasKorean))) + .Where(r => r.Score > 0) + .OrderByDescending(r => r.Score) + .Take(maxResults); + } + + return entries + .Select(e => new FuzzyResult(e, CalculateScoreFast(normalized, e, queryHasKorean))) + .Where(r => r.Score > 0) + .OrderByDescending(r => r.Score) + .Take(maxResults); + } + + /// 미리 계산된 캐시 필드를 활용하는 빠른 점수 계산. + private static int CalculateScoreFast(string query, IndexEntry entry, bool queryHasKorean) + { + // 캐시가 없으면(구버전 호환) 기존 방식으로 폴백 + var targetLower = string.IsNullOrEmpty(entry.NameLower) + ? entry.Name.ToLowerInvariant() + : entry.NameLower; + + if (query.Length == 0) return 0; + + if (targetLower == query) return 1000 + entry.Score; + if (targetLower.StartsWith(query)) return 800 + entry.Score; + if (targetLower.Contains(query)) return 600 + entry.Score; + + // 순수 ASCII 쿼리 — 한글 검색 로직(자모·초성) 전체 스킵 + if (!queryHasKorean) + { + var fs = FuzzyMatch(query, targetLower); + return fs > 0 ? fs + entry.Score : 0; + } + + // 자모 분리 검색 (캐시된 NameJamo 활용) + var jamoScore = JamoContainsScoreFast( + string.IsNullOrEmpty(entry.NameJamo) ? DecomposeToJamo(targetLower) : entry.NameJamo, + query); + if (jamoScore > 0) return jamoScore + entry.Score; + + // 초성 검색 (캐시된 NameChosung 활용) + var chosungScore = ChosungMatchScoreFast( + string.IsNullOrEmpty(entry.NameChosung) ? null : entry.NameChosung, + targetLower, query); + if (chosungScore > 0) return chosungScore + entry.Score; + + // Fuzzy 매칭 + var fuzzyScore = FuzzyMatch(query, targetLower); + if (fuzzyScore > 0) return fuzzyScore + entry.Score; + + return 0; + } + + /// + /// 점수 계산: 정확 일치 > 시작 일치 > 포함 일치 > 자모 포함 > 초성 > Fuzzy + /// + internal static int CalculateScore(string query, string target, int baseScore) + { + if (query.Length == 0) return 0; + + if (target == query) return 1000 + baseScore; // 완전 일치 + if (target.StartsWith(query)) return 800 + baseScore; // 시작 일치 + if (target.Contains(query)) return 600 + baseScore; // 부분 일치 + + // 한글 자모 분리 후 부분 일치 ("모장" → 메모장) + var jamoScore = JamoContainsScore(target, query); + if (jamoScore > 0) return jamoScore + baseScore; + + // 한글 초성 검색 (순수 초성 + 혼합 쿼리 모두 지원) + var chosungScore = ChosungMatchScore(target, query); + if (chosungScore > 0) return chosungScore + baseScore; + + // 문자 순서 포함 (Fuzzy) + var fuzzyScore = FuzzyMatch(query, target); + if (fuzzyScore > 0) return fuzzyScore + baseScore; + + return 0; + } + + // ─── Fuzzy Match ──────────────────────────────────────────────────────── + + /// + /// 쿼리의 모든 문자가 target에 순서대로 포함되는지 확인 (subsequence) + /// + internal static int FuzzyMatch(string query, string target) + { + int qi = 0, ti = 0; + int score = 0; + int lastMatchIdx = -1; + + while (qi < query.Length && ti < target.Length) + { + if (query[qi] == target[ti]) + { + if (lastMatchIdx == ti - 1) score += 30; // 연속 매칭 보너스 + else score += 10; // 비연속 매칭 + + if (ti == 0) score += 15; // 시작 위치 보너스 + + lastMatchIdx = ti; + qi++; + } + ti++; + } + + return qi == query.Length ? Math.Max(score, 50) : 0; // 최소 50점 보장 + } + + // ─── 한글 자모 분리 ───────────────────────────────────────────────────── + + private static readonly char[] Chosungs = + ['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ']; + + /// 초성 O(1) 조회용 HashSet — HasChosung/IsChosung/MixedMatch에서 사용. + private static readonly HashSet ChosungSet = + new(['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ']); + + private static readonly char[] Jungsungs = + ['ㅏ','ㅐ','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅘ','ㅙ','ㅚ','ㅛ','ㅜ','ㅝ','ㅞ','ㅟ','ㅠ','ㅡ','ㅢ','ㅣ']; + + private static readonly char[] Jongsungs = + ['\0','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ']; + + /// 한글 음절을 자모로 분리 (초성+중성+종성). 비한글은 그대로 반환. + internal static string DecomposeToJamo(string text) + { + var result = new System.Text.StringBuilder(text.Length * 3); + foreach (var c in text) + { + if (c >= 0xAC00 && c <= 0xD7A3) + { + int offset = c - 0xAC00; + int cho = offset / (21 * 28); + int jung = (offset % (21 * 28)) / 28; + int jong = offset % 28; + + result.Append(Chosungs[cho]); + result.Append(Jungsungs[jung]); + if (jong > 0) result.Append(Jongsungs[jong]); + } + else + { + result.Append(c); + } + } + return result.ToString(); + } + + /// 한글 음절에서 초성만 추출. 비한글은 '\0'. + internal static char GetChosung(char hangul) + { + if (hangul < 0xAC00 || hangul > 0xD7A3) return '\0'; + int offset = hangul - 0xAC00; + return Chosungs[offset / (21 * 28)]; + } + + // ─── 자모 기반 포함 검색 ──────────────────────────────────────────────── + + /// + /// 쿼리를 자모 분리 후 target의 자모에 연속 부분 문자열로 포함되는지 확인. + /// "모장" → "ㅁㅗㅈㅏㅇ" 이 "ㅁㅔㅁㅗㅈㅏㅇ"(메모장)에 포함 → 550점 + /// + internal static int JamoContainsScore(string target, string query) + { + if (!HasKorean(query)) return 0; + + var targetJamo = DecomposeToJamo(target); + var queryJamo = DecomposeToJamo(query); + + if (queryJamo.Length == 0 || targetJamo.Length == 0) return 0; + + // 자모 연속 포함 + if (targetJamo.Contains(queryJamo)) + { + // 시작 위치가 음절 경계(초성)에 가까울수록 높은 점수 + int idx = targetJamo.IndexOf(queryJamo); + return idx == 0 ? 580 : 550; + } + + // 자모 subsequence 매칭 (비연속이지만 순서 유지) + int qi = 0; + for (int ti = 0; ti < targetJamo.Length && qi < queryJamo.Length; ti++) + { + if (queryJamo[qi] == targetJamo[ti]) qi++; + } + if (qi == queryJamo.Length) return 400; + + return 0; + } + + // ─── 초성 검색 ────────────────────────────────────────────────────────── + + /// 쿼리에 초성 문자가 하나라도 포함되어 있는지. + internal static bool HasChosung(string text) => text.Any(c => ChosungSet.Contains(c)); + + /// 문자열의 모든 문자가 초성인지. + internal static bool IsChosung(string text) => text.Length > 0 && text.All(c => ChosungSet.Contains(c)); + + /// 문자열에 한글(완성형)이 포함되어 있는지. + private static bool HasKorean(string text) => text.Any(c => c >= 0xAC00 && c <= 0xD7A3); + + /// + /// 초성 매칭 점수. 순수 초성 쿼리 + 혼합 쿼리(초성+완성형) 모두 지원. + /// 비연속 매칭도 허용 ("ㅁㅊ" → 메모장 OK). + /// + internal static int ChosungMatchScore(string target, string query) + { + // 초성이 하나도 없으면 초성 검색 아님 + if (!HasChosung(query)) return 0; + + // 타겟에서 각 글자의 초성 추출 + var targetChosungs = new List(); + var targetChars = new List(); + foreach (var c in target) + { + var cho = GetChosung(c); + if (cho != '\0') + { + targetChosungs.Add(cho); + targetChars.Add(c); + } + else if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) + { + targetChosungs.Add(c); + targetChars.Add(c); + } + } + + if (targetChosungs.Count == 0) return 0; + + // 순수 초성 쿼리 ("ㅁㅁㅈ", "ㅁㅊ") + if (IsChosung(query)) + { + // 연속 매칭 시도 + if (ContainsChosungConsecutive(targetChosungs, query)) return 520; + // 비연속(subsequence) 매칭 + if (ContainsChosungSubsequence(targetChosungs, query)) return 480; + return 0; + } + + // 혼합 쿼리 ("ㅁ장", "계ㅅ기") — 초성+완성형 혼합 + return MixedChosungMatch(targetChars, targetChosungs, query); + } + + /// 연속 초성 매칭 (기존 로직 유지) + private static bool ContainsChosungConsecutive(List targetChosungs, string query) + { + for (int i = 0; i <= targetChosungs.Count - query.Length; i++) + { + bool match = true; + for (int j = 0; j < query.Length; j++) + { + if (targetChosungs[i + j] != query[j]) { match = false; break; } + } + if (match) return true; + } + return false; + } + + /// 비연속 초성 매칭 (subsequence) + private static bool ContainsChosungSubsequence(List targetChosungs, string query) + { + int qi = 0; + for (int ti = 0; ti < targetChosungs.Count && qi < query.Length; ti++) + { + if (targetChosungs[ti] == query[qi]) qi++; + } + return qi == query.Length; + } + + /// + /// 혼합 쿼리 매칭: 초성은 초성끼리, 완성형은 완성형끼리 비교. + /// "ㅁ장" → target[i]의 초성이 'ㅁ'이고, target[j>i]가 '장'인지. + /// + private static int MixedChosungMatch(List targetChars, List targetChosungs, string query) + { + int qi = 0, ti = 0; + while (qi < query.Length && ti < targetChars.Count) + { + var qc = query[qi]; + if (ChosungSet.Contains(qc)) + { + // 쿼리 문자가 초성 → 타겟 초성과 비교 + if (targetChosungs[ti] == qc) qi++; + } + else + { + // 쿼리 문자가 완성형 → 타겟 원본 문자와 비교 + if (targetChars[ti] == qc) qi++; + } + ti++; + } + return qi == query.Length ? 460 : 0; + } + + // ─── 캐시 기반 빠른 검색 메서드 ──────────────────────────────────────────── + + /// 미리 계산된 자모 문자열을 사용하는 빠른 자모 포함 검색. + private static int JamoContainsScoreFast(string targetJamo, string query) + { + if (!HasKorean(query)) return 0; + + var queryJamo = DecomposeToJamo(query); // 쿼리는 짧으므로 매번 분해해도 빠름 + if (queryJamo.Length == 0 || targetJamo.Length == 0) return 0; + + if (targetJamo.Contains(queryJamo)) + { + int idx = targetJamo.IndexOf(queryJamo, StringComparison.Ordinal); + return idx == 0 ? 580 : 550; + } + + int qi = 0; + for (int ti = 0; ti < targetJamo.Length && qi < queryJamo.Length; ti++) + { + if (queryJamo[qi] == targetJamo[ti]) qi++; + } + return qi == queryJamo.Length ? 400 : 0; + } + + /// 미리 계산된 초성 문자열을 사용하는 빠른 초성 검색. + private static int ChosungMatchScoreFast(string? targetChosung, string targetLower, string query) + { + if (!HasChosung(query)) return 0; + + if (IsChosung(query)) + { + if (string.IsNullOrEmpty(targetChosung)) return 0; + // 연속 매칭: 단순 Contains + if (targetChosung.Contains(query, StringComparison.Ordinal)) return 520; + // 비연속 매칭 (subsequence) + int qi2 = 0; + for (int ti2 = 0; ti2 < targetChosung.Length && qi2 < query.Length; ti2++) + { + if (targetChosung[ti2] == query[qi2]) qi2++; + } + if (qi2 == query.Length) return 480; + return 0; + } + + // 혼합 쿼리(초성+완성형): List 할당 없는 인라인 매칭 + { + int qi2 = 0, ti2 = 0; + while (qi2 < query.Length && ti2 < targetLower.Length) + { + var qc = query[qi2]; + var tc = targetLower[ti2]; + if (ChosungSet.Contains(qc)) + { + // 쿼리가 초성 → 타겟 문자의 초성과 비교 + var cho = GetChosung(tc); + if (cho == '\0' && ((tc >= 'a' && tc <= 'z') || (tc >= '0' && tc <= '9'))) + cho = tc; // 영문/숫자는 초성 = 자신 + if (cho == qc) qi2++; + } + else + { + // 쿼리가 완성형 → 타겟 원본 문자와 비교 + if (tc == qc) qi2++; + } + ti2++; + } + return qi2 == query.Length ? 460 : 0; + } + } + + // ─── 하위 호환 ────────────────────────────────────────────────────────── + + /// 기존 API 호환용 — ContainsChosung(연속+비연속) + internal static bool ContainsChosung(string target, string chosungQuery) + { + var targetChosungs = target.Select(GetChosung).Where(c => c != '\0').ToList(); + if (targetChosungs.Count < chosungQuery.Length) return false; + + return ContainsChosungConsecutive(targetChosungs, chosungQuery) + || ContainsChosungSubsequence(targetChosungs, chosungQuery); + } +} + +public record FuzzyResult(IndexEntry Entry, int Score); diff --git a/src/AxCopilot/Core/HotkeyParser.cs b/src/AxCopilot/Core/HotkeyParser.cs new file mode 100644 index 0000000..c011da4 --- /dev/null +++ b/src/AxCopilot/Core/HotkeyParser.cs @@ -0,0 +1,127 @@ +namespace AxCopilot.Core; + +/// +/// "Alt+Space", "Ctrl+Shift+K" 형식의 핫키 문자열 파싱/포맷 유틸리티. +/// +public static class HotkeyParser +{ + private static readonly Dictionary _keyMap = + new(StringComparer.OrdinalIgnoreCase) + { + // 특수키 + ["Space"] = 0x20, ["Enter"] = 0x0D, ["Return"] = 0x0D, + ["Tab"] = 0x09, ["Esc"] = 0x1B, ["Escape"] = 0x1B, + ["Backspace"]= 0x08, ["Back"] = 0x08, + ["Delete"] = 0x2E, ["Del"] = 0x2E, + ["Insert"] = 0x2D, ["Ins"] = 0x2D, + ["Home"] = 0x24, ["End"] = 0x23, + ["PageUp"] = 0x21, ["PgUp"] = 0x21, + ["PageDown"] = 0x22, ["PgDn"] = 0x22, + ["PrintScreen"] = 0x2C, ["PrtSc"] = 0x2C, ["Snapshot"] = 0x2C, + ["Pause"] = 0x13, ["Break"] = 0x13, + ["ScrollLock"] = 0x91, + // 방향키 + ["Left"] = 0x25, ["Up"] = 0x26, ["Right"] = 0x27, ["Down"] = 0x28, + // 기호 + ["`"] = 0xC0, ["Grave"] = 0xC0, + ["-"] = 0xBD, ["="] = 0xBB, + ["["] = 0xDB, ["]"] = 0xDD, + ["\\"] = 0xDC, [";"] = 0xBA, + ["'"] = 0xDE, [","] = 0xBC, + ["."] = 0xBE, ["/"] = 0xBF, + }; + + static HotkeyParser() + { + // A–Z + for (char c = 'A'; c <= 'Z'; c++) + _keyMap[c.ToString()] = c; + // 0–9 + for (char c = '0'; c <= '9'; c++) + _keyMap[c.ToString()] = c; + // F1–F24 + for (int i = 1; i <= 24; i++) + _keyMap[$"F{i}"] = 0x6F + i; + // Numpad 0–9 + for (int i = 0; i <= 9; i++) + _keyMap[$"Num{i}"] = 0x60 + i; + } + + /// + /// "Alt+Space" → . 실패 시 false 반환. + /// + public static bool TryParse(string hotkey, out HotkeyDefinition result) + { + result = default; + if (string.IsNullOrWhiteSpace(hotkey)) return false; + + var parts = hotkey.Split('+', + StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + + bool ctrl = false, alt = false, shift = false, win = false; + int? vkCode = null; + + foreach (var p in parts) + { + if (p.Equals("Ctrl", StringComparison.OrdinalIgnoreCase) || + p.Equals("Control", StringComparison.OrdinalIgnoreCase)) + { ctrl = true; continue; } + + if (p.Equals("Alt", StringComparison.OrdinalIgnoreCase)) + { alt = true; continue; } + + if (p.Equals("Shift", StringComparison.OrdinalIgnoreCase)) + { shift = true; continue; } + + if (p.Equals("Win", StringComparison.OrdinalIgnoreCase) || + p.Equals("Windows", StringComparison.OrdinalIgnoreCase)) + { win = true; continue; } + + if (_keyMap.TryGetValue(p, out int vk)) + vkCode = vk; + else + return false; // 알 수 없는 키 + } + + if (vkCode == null) return false; + result = new HotkeyDefinition(vkCode.Value, ctrl, alt, shift, win); + return true; + } + + /// + /// → "Alt+Space" 형식 문자열. + /// + public static string Format(HotkeyDefinition def) + { + var parts = new List(5); + if (def.Ctrl) parts.Add("Ctrl"); + if (def.Alt) parts.Add("Alt"); + if (def.Shift) parts.Add("Shift"); + if (def.Win) parts.Add("Win"); + parts.Add(VkToName(def.VkCode)); + return string.Join("+", parts); + } + + // VK 코드 → 읽기 좋은 이름 변환 + private static string VkToName(int vk) + { + if (vk >= 0x41 && vk <= 0x5A) return ((char)vk).ToString(); // A–Z + if (vk >= 0x30 && vk <= 0x39) return ((char)vk).ToString(); // 0–9 + if (vk >= 0x70 && vk <= 0x87) return $"F{vk - 0x6F}"; // F1–F24 + if (vk >= 0x60 && vk <= 0x69) return $"Num{vk - 0x60}"; // Numpad + + // 특수키 테이블에서 긴 이름 우선 검색 + string? best = null; + foreach (var (name, code) in _keyMap) + { + if (code == vk && (best == null || name.Length > best.Length)) + best = name; + } + return best ?? $"0x{vk:X2}"; + } +} + +/// +/// 파싱된 핫키 정의. VK 코드 + 요구 수정자 키. +/// +public record struct HotkeyDefinition(int VkCode, bool Ctrl, bool Alt, bool Shift, bool Win); diff --git a/src/AxCopilot/Core/InputListener.cs b/src/AxCopilot/Core/InputListener.cs new file mode 100644 index 0000000..8e30caf --- /dev/null +++ b/src/AxCopilot/Core/InputListener.cs @@ -0,0 +1,265 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using AxCopilot.Services; + +namespace AxCopilot.Core; + +/// +/// 글로벌 키보드 훅으로 어떤 앱이 포커스를 가져도 설정된 핫키를 감지합니다. +/// WH_KEYBOARD_LL (Low-Level Keyboard Hook) 사용. +/// +public class InputListener : IDisposable +{ + private const int WH_KEYBOARD_LL = 13; + private const int WM_KEYDOWN = 0x0100; + private const int WM_SYSKEYDOWN = 0x0104; + private const int WM_KEYUP = 0x0101; + private const int WM_SYSKEYUP = 0x0105; + + // 수정자 키 VK 코드 + private const int VK_SHIFT = 0x10; + private const int VK_CONTROL = 0x11; + private const int VK_MENU = 0x12; // Alt + private const int VK_LWIN = 0x5B; + private const int VK_RWIN = 0x5C; + + private IntPtr _hookHandle = IntPtr.Zero; + private LowLevelKeyboardProc? _proc; + private int _retryCount = 0; + private const int MaxRetry = 3; + + // 핫키 발동 후 잔여 KEYUP 이벤트 억제 플래그 + // Alt+X 핫키 → Alt KEYUP이 앱 메뉴바를 활성화하는 문제 방지 + private volatile bool _suppressNextAltUp; + private volatile bool _suppressNextKeyUp; + private volatile int _suppressKeyUpVk; + + // 현재 설정된 핫키 (기본: Alt+Space) + private HotkeyDefinition _hotkey = new(0x20, false, true, false, false); + + // 글로벌 캡처 단축키 (기본: PrintScreen, 비활성) + private HotkeyDefinition _captureHotkey; + private bool _captureHotkeyEnabled; + + public event EventHandler? HotkeyTriggered; + public event EventHandler? CaptureHotkeyTriggered; + public event EventHandler? HookFailed; + + /// + /// 핫키 녹화 중일 때 true로 설정하면 핫키 이벤트를 발생시키지 않습니다. + /// + public bool SuspendHotkey { get; set; } + + /// + /// 스니펫 확장기가 설정하는 키 필터. + /// true를 반환하면 해당 키 이벤트를 소비(다른 앱으로 전달 차단)합니다. + /// 훅 콜백 스레드에서 실행되므로 빠르고 스레드 안전하게 구현해야 합니다. + /// + public Func? KeyFilter { get; set; } + + /// + /// 설정에서 읽은 핫키 문자열로 핫키를 업데이트합니다. ("Alt+Space", "Ctrl+K" 등) + /// + public void UpdateHotkey(string hotkeyStr) + { + if (HotkeyParser.TryParse(hotkeyStr, out var def)) + { + _hotkey = def; + LogService.Info($"핫키 변경: {hotkeyStr}"); + } + else + { + LogService.Warn($"핫키 파싱 실패: '{hotkeyStr}' — 기존 핫키 유지"); + } + } + + /// + /// 글로벌 캡처 단축키를 설정합니다. + /// + public void UpdateCaptureHotkey(string hotkeyStr, bool enabled) + { + _captureHotkeyEnabled = enabled; + if (enabled && HotkeyParser.TryParse(hotkeyStr, out var def)) + { + _captureHotkey = def; + LogService.Info($"캡처 단축키 활성화: {hotkeyStr}"); + } + else if (!enabled) + { + LogService.Info("캡처 단축키 비활성화"); + } + } + + public void Start() + { + _proc = HookCallback; + Register(); + } + + private void Register() + { + using var curProcess = Process.GetCurrentProcess(); + using var curModule = curProcess.MainModule!; + _hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, _proc!, + GetModuleHandle(curModule.ModuleName!), 0); + + if (_hookHandle == IntPtr.Zero) + { + var err = Marshal.GetLastWin32Error(); + LogService.Error($"Global Hook 등록 실패 (에러 코드: {err})"); + TryRetryRegister(); + } + else + { + _retryCount = 0; + LogService.Info($"Global Keyboard Hook 등록 완료 ({HotkeyParser.Format(_hotkey)})"); + } + } + + private void TryRetryRegister() + { + if (_retryCount < MaxRetry) + { + _retryCount++; + LogService.Warn($"Hook 재등록 시도 {_retryCount}/{MaxRetry}"); + Task.Delay(1000).ContinueWith(_ => Register()); + } + else + { + LogService.Error("Hook 재등록 최대 횟수 초과"); + HookFailed?.Invoke(this, EventArgs.Empty); + } + } + + /// + /// 현재 포그라운드 창이 핫키·스니펫 확장을 억제해야 하는 시스템 대화상자인지 확인합니다. + /// Windows 공통 대화상자(#32770): 파일 열기/저장, 브라우저 파일 업로드 등. + /// + private static bool IsSuppressedForegroundWindow() + { + var hwnd = GetForegroundWindow(); + if (hwnd == IntPtr.Zero) return false; + var sb = new StringBuilder(64); + GetClassName(hwnd, sb, 64); + var cls = sb.ToString(); + // #32770 = Windows 공통 대화상자 (파일 열기/저장/선택) + // SunAwtDialog = Java Swing 파일 대화상자 (일부 앱) + return cls == "#32770" || cls == "SunAwtDialog"; + } + + private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) + { + if (nCode < 0) + return CallNextHookEx(_hookHandle, nCode, wParam, lParam); + + var vkCode = Marshal.ReadInt32(lParam); + + // ─── KEYUP: 핫키 발동 후 잔여 이벤트 억제 ───────────────────────────── + // Alt+X 핫키를 누른 직후 Alt KEYUP이 일부 앱의 메뉴바를 활성화하는 문제를 방지. + // 메인 키 KEYUP도 억제하여 앱이 "키를 완전히 처리"한 것으로 착각하지 않도록 함. + if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) + { + if (_suppressNextAltUp && vkCode == VK_MENU) + { + _suppressNextAltUp = false; + return (IntPtr)1; // Alt KEYUP 억제 → 메뉴바 활성화 차단 + } + if (_suppressNextKeyUp && vkCode == _suppressKeyUpVk) + { + _suppressNextKeyUp = false; + return (IntPtr)1; // 메인 키 KEYUP 억제 + } + return CallNextHookEx(_hookHandle, nCode, wParam, lParam); + } + + // ─── 이하 KEYDOWN / SYSKEYDOWN 처리 ────────────────────────────────── + if (wParam != WM_KEYDOWN && wParam != WM_SYSKEYDOWN) + return CallNextHookEx(_hookHandle, nCode, wParam, lParam); + + // ─── 시스템 파일 대화상자에서는 핫키·스니펫 전부 비활성 ────────────── + if (IsSuppressedForegroundWindow()) + return CallNextHookEx(_hookHandle, nCode, wParam, lParam); + + // ─── 핫키 감지 ────────────────────────────────────────────────────── + if (!SuspendHotkey && vkCode == _hotkey.VkCode) + { + bool ctrlOk = !_hotkey.Ctrl || (GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0; + bool altOk = !_hotkey.Alt || (GetAsyncKeyState(VK_MENU) & 0x8000) != 0; + bool shiftOk = !_hotkey.Shift || (GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0; + bool winOk = !_hotkey.Win || (GetAsyncKeyState(VK_LWIN) & 0x8000) != 0 + || (GetAsyncKeyState(VK_RWIN) & 0x8000) != 0; + + if (ctrlOk && altOk && shiftOk && winOk) + { + HotkeyTriggered?.Invoke(this, EventArgs.Empty); + // 이후 KEYUP 억제 설정 + _suppressNextKeyUp = true; + _suppressKeyUpVk = vkCode; + if (_hotkey.Alt) _suppressNextAltUp = true; + return (IntPtr)1; + } + } + + // ─── 글로벌 캡처 단축키 감지 ───────────────────────────────────────── + if (!SuspendHotkey && _captureHotkeyEnabled && vkCode == _captureHotkey.VkCode) + { + bool ctrlOk = !_captureHotkey.Ctrl || (GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0; + bool altOk = !_captureHotkey.Alt || (GetAsyncKeyState(VK_MENU) & 0x8000) != 0; + bool shiftOk = !_captureHotkey.Shift || (GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0; + bool winOk = !_captureHotkey.Win || (GetAsyncKeyState(VK_LWIN) & 0x8000) != 0 + || (GetAsyncKeyState(VK_RWIN) & 0x8000) != 0; + + if (ctrlOk && altOk && shiftOk && winOk) + { + CaptureHotkeyTriggered?.Invoke(this, EventArgs.Empty); + _suppressNextKeyUp = true; + _suppressKeyUpVk = vkCode; + if (_captureHotkey.Alt) _suppressNextAltUp = true; + return (IntPtr)1; + } + } + + // ─── 스니펫 키 필터 ───────────────────────────────────────────────── + if (KeyFilter?.Invoke(vkCode) == true) + return (IntPtr)1; + + return CallNextHookEx(_hookHandle, nCode, wParam, lParam); + } + + public void Dispose() + { + if (_hookHandle != IntPtr.Zero) + { + UnhookWindowsHookEx(_hookHandle); + _hookHandle = IntPtr.Zero; + } + } + + // ─── P/Invoke ──────────────────────────────────────────────────────────── + + private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, + IntPtr hMod, uint dwThreadId); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool UnhookWindowsHookEx(IntPtr hhk); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr GetModuleHandle(string lpModuleName); + + [DllImport("user32.dll")] + private static extern short GetAsyncKeyState(int vKey); + + [DllImport("user32.dll")] + private static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll", CharSet = CharSet.Unicode)] + private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); +} diff --git a/src/AxCopilot/Core/PluginHost.cs b/src/AxCopilot/Core/PluginHost.cs new file mode 100644 index 0000000..d79e04b --- /dev/null +++ b/src/AxCopilot/Core/PluginHost.cs @@ -0,0 +1,238 @@ +using System.IO; +using System.IO.Compression; +using System.Reflection; +using AxCopilot.Handlers; +using AxCopilot.SDK; +using AxCopilot.Services; + +namespace AxCopilot.Core; + +/// +/// 외부 .dll 플러그인을 로드하고 CommandResolver에 등록합니다. +/// +public class PluginHost +{ + private readonly SettingsService _settings; + private readonly CommandResolver _resolver; + private readonly List _loadedPlugins = new(); + + public IReadOnlyList LoadedPlugins => _loadedPlugins; + + public PluginHost(SettingsService settings, CommandResolver resolver) + { + _settings = settings; + _resolver = resolver; + } + + /// + /// settings.json의 plugins 목록에서 .dll을 로드합니다. + /// + public void LoadAll() + { + _loadedPlugins.Clear(); + + foreach (var entry in _settings.Settings.Plugins.Where(p => p.Enabled)) + { + LoadPlugin(entry.Path); + } + + // skills 폴더의 .skill.json 파일도 로드 (JSON 스킬) + var skillsDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "skills"); + + if (Directory.Exists(skillsDir)) + { + foreach (var skillFile in Directory.EnumerateFiles(skillsDir, "*.skill.json")) + { + LoadJsonSkill(skillFile); + } + } + } + + private void LoadPlugin(string dllPath) + { + if (!File.Exists(dllPath)) + { + LogService.Warn($"플러그인 파일 없음: {dllPath}"); + return; + } + + try + { + var assembly = Assembly.LoadFrom(dllPath); + var handlerTypes = assembly.GetExportedTypes() + .Where(t => typeof(IActionHandler).IsAssignableFrom(t) && !t.IsAbstract); + + foreach (var type in handlerTypes) + { + if (Activator.CreateInstance(type) is IActionHandler handler) + { + _resolver.RegisterHandler(handler); + _loadedPlugins.Add(handler); + LogService.Info($"플러그인 로드: {handler.Metadata.Name} v{handler.Metadata.Version}"); + } + } + } + catch (Exception ex) + { + LogService.Error($"플러그인 로드 실패 ({dllPath}): {ex.Message}"); + // 플러그인 오류는 앱 전체를 중단하지 않음 + } + } + + private void LoadJsonSkill(string skillPath) + { + try + { + var skill = JsonSkillLoader.Load(skillPath); + if (skill != null) + { + _resolver.RegisterHandler(skill); + _loadedPlugins.Add(skill); + LogService.Info($"JSON 스킬 로드: {skill.Metadata.Name}"); + } + } + catch (Exception ex) + { + LogService.Error($"JSON 스킬 로드 실패 ({skillPath}): {ex.Message}"); + } + } + + /// + /// 모든 플러그인을 언로드하고 재로드합니다 (개발자 모드 핫 리로드). + /// + public void Reload() + { + LogService.Info("플러그인 전체 재로드 시작"); + LoadAll(); + } + + /// + /// 로컬 zip 파일에서 플러그인을 설치합니다. + /// zip 내 .dll 파일을 plugins 폴더에 추출하고 settings.json에 등록합니다. + /// + /// 설치된 핸들러 수 + public int InstallFromZip(string zipPath) + { + if (!File.Exists(zipPath)) + { + LogService.Warn($"플러그인 zip 파일 없음: {zipPath}"); + return 0; + } + + var pluginsDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "plugins"); + + Directory.CreateDirectory(pluginsDir); + + int installed = 0; + + try + { + using var archive = ZipFile.OpenRead(zipPath); + var pluginName = Path.GetFileNameWithoutExtension(zipPath); + var targetDir = Path.Combine(pluginsDir, pluginName); + Directory.CreateDirectory(targetDir); + + foreach (var entry in archive.Entries) + { + if (string.IsNullOrEmpty(entry.Name)) continue; // 폴더 엔트리 건너뛰기 + + var destPath = Path.Combine(targetDir, entry.Name); + + // 경로 탐색 공격 방지 + if (!Path.GetFullPath(destPath).StartsWith(Path.GetFullPath(targetDir))) + { + LogService.Warn($"플러그인 zip 경로 위험: {entry.FullName}"); + continue; + } + + entry.ExtractToFile(destPath, overwrite: true); + } + + // .dll 파일 찾아서 플러그인으로 등록 + foreach (var dllFile in Directory.EnumerateFiles(targetDir, "*.dll")) + { + // 이미 등록된 플러그인인지 확인 + if (_settings.Settings.Plugins.Any(p => p.Path == dllFile)) + continue; + + // settings.json에 등록 + _settings.Settings.Plugins.Add(new Models.PluginEntry + { + Enabled = true, + Path = dllFile, + }); + + // 즉시 로드 시도 + LoadPlugin(dllFile); + installed++; + } + + // .skill.json 파일도 skills 폴더로 복사 + var skillsDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "skills"); + Directory.CreateDirectory(skillsDir); + + foreach (var skillFile in Directory.EnumerateFiles(targetDir, "*.skill.json")) + { + var destSkill = Path.Combine(skillsDir, Path.GetFileName(skillFile)); + File.Copy(skillFile, destSkill, overwrite: true); + LoadJsonSkill(destSkill); + installed++; + } + + if (installed > 0) + _settings.Save(); + + LogService.Info($"플러그인 설치 완료: {zipPath} → {installed}개 핸들러"); + } + catch (Exception ex) + { + LogService.Error($"플러그인 zip 설치 실패: {ex.Message}"); + } + + return installed; + } + + /// + /// 설치된 플러그인을 제거합니다 (settings에서 삭제 + 파일 삭제). + /// + public bool UninstallPlugin(string dllPath) + { + try + { + var entry = _settings.Settings.Plugins.FirstOrDefault(p => p.Path == dllPath); + if (entry != null) + { + _settings.Settings.Plugins.Remove(entry); + _settings.Save(); + } + + // 플러그인 폴더 전체 삭제 (해당 dll이 있는 폴더) + var dir = Path.GetDirectoryName(dllPath); + if (dir != null && Directory.Exists(dir)) + { + var pluginsRoot = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "plugins"); + // plugins 하위 폴더인 경우만 삭제 (안전장치) + if (Path.GetFullPath(dir).StartsWith(Path.GetFullPath(pluginsRoot))) + { + Directory.Delete(dir, recursive: true); + } + } + + LogService.Info($"플러그인 제거 완료: {dllPath}"); + return true; + } + catch (Exception ex) + { + LogService.Error($"플러그인 제거 실패: {ex.Message}"); + return false; + } + } +} diff --git a/src/AxCopilot/Core/SnippetExpander.cs b/src/AxCopilot/Core/SnippetExpander.cs new file mode 100644 index 0000000..2f30d1b --- /dev/null +++ b/src/AxCopilot/Core/SnippetExpander.cs @@ -0,0 +1,252 @@ +using System.Runtime.InteropServices; +using System.Text; +using System.Windows; +using AxCopilot.Services; + +namespace AxCopilot.Core; + +/// +/// 모든 앱에서 ';키워드 + Space/Enter' 패턴을 감지해 스니펫을 자동 확장합니다. +/// InputListener.KeyFilter에 을 등록하여 사용합니다. +/// +public class SnippetExpander +{ + private readonly SettingsService _settings; + private readonly StringBuilder _buffer = new(); + private bool _tracking; + + // VK 상수 + private const ushort VK_BACK = 0x08; + private const int VK_ESCAPE = 0x1B; + private const int VK_SPACE = 0x20; + private const int VK_RETURN = 0x0D; + private const int VK_OEM_1 = 0xBA; // ; (US QWERTY) + private const int VK_SHIFT = 0x10; + private const int VK_CONTROL = 0x11; + private const int VK_MENU = 0x12; + private const ushort VK_CTRL_US = 0x11; + + // 방향키 / 기능키 — 이 키가 오면 버퍼 초기화 + private static readonly HashSet ClearKeys = new() + { + 0x21, 0x22, 0x23, 0x24, // PgUp, PgDn, End, Home + 0x25, 0x26, 0x27, 0x28, // ←↑→↓ + 0x2E, // Delete + }; + + public SnippetExpander(SettingsService settings) + { + _settings = settings; + } + + /// + /// InputListener.KeyFilter에 등록할 메서드. + /// true → 해당 키 이벤트 소비(차단), false → 통과. + /// 훅 스레드에서 호출되므로 신속히 처리해야 합니다. + /// + public bool HandleKey(int vkCode) + { + // 자동 확장 비활성화 시 즉시 통과 + if (!_settings.Settings.Launcher.SnippetAutoExpand) return false; + + // Ctrl/Alt 조합은 무시 (단축키와 충돌 방지) + if ((GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0) { _tracking = false; _buffer.Clear(); return false; } + if ((GetAsyncKeyState(VK_MENU) & 0x8000) != 0) { _tracking = false; _buffer.Clear(); return false; } + + // ─── 트리거 시작: ';' 입력 ────────────────────────────────────────── + if (vkCode == VK_OEM_1 && (GetAsyncKeyState(VK_SHIFT) & 0x8000) == 0) + { + _tracking = true; + _buffer.Clear(); + _buffer.Append(';'); + return false; // ';'는 소비하지 않고 앱으로 전달 + } + + if (!_tracking) return false; + + // ─── 영문자/숫자 — 버퍼에 추가 ───────────────────────────────────── + if ((vkCode >= 0x41 && vkCode <= 0x5A) || // A-Z + (vkCode >= 0x30 && vkCode <= 0x39) || // 0-9 + (vkCode >= 0x60 && vkCode <= 0x69) || // Numpad 0-9 + vkCode == 0xBD) // - + { + bool shifted = (GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0; + char c = VkToChar(vkCode, shifted); + if (c != '\0') _buffer.Append(char.ToLowerInvariant(c)); + return false; + } + + // ─── BackSpace — 버퍼에서 한 글자 제거 ────────────────────────────── + if (vkCode == VK_BACK) + { + if (_buffer.Length > 1) + _buffer.Remove(_buffer.Length - 1, 1); + else + { + _tracking = false; + _buffer.Clear(); + } + return false; + } + + // ─── Space / Enter — 스니펫 확장 시도 ─────────────────────────────── + if (vkCode == VK_SPACE || vkCode == VK_RETURN) + { + if (_buffer.Length > 1) // ';' 이후 한 글자 이상 + { + var keyword = _buffer.ToString(1, _buffer.Length - 1); + _tracking = false; + _buffer.Clear(); + + var snippet = _settings.Settings.Snippets.FirstOrDefault( + s => s.Key.Equals(keyword, StringComparison.OrdinalIgnoreCase)); + + if (snippet != null) + { + var expanded = ExpandVariables(snippet.Content); + var deleteCount = keyword.Length + 1; // ';' + keyword + // 트리거 키(Space/Enter) 소비 후 UI 스레드에서 확장 처리 + Application.Current.Dispatcher.BeginInvoke(() => + PasteExpansion(expanded, deleteCount)); + return true; // 트리거 키 소비 + } + } + _tracking = false; + _buffer.Clear(); + return false; + } + + // ─── Escape / 방향키 / 기능키 — 추적 중단 ─────────────────────────── + if (vkCode == VK_ESCAPE || ClearKeys.Contains(vkCode) || vkCode >= 0x70) + { + _tracking = false; + _buffer.Clear(); + } + + return false; + } + + // ─── 확장 실행 (UI 스레드) ─────────────────────────────────────────────── + + private static void PasteExpansion(string text, int deleteCount) + { + try + { + // 1. Backspace × deleteCount + var inputs = new INPUT[deleteCount * 2]; + for (int i = 0; i < deleteCount; i++) + { + inputs[i * 2] = MakeKeyInput(VK_BACK, false); + inputs[i * 2 + 1] = MakeKeyInput(VK_BACK, true); + } + SendInput((uint)inputs.Length, inputs, Marshal.SizeOf()); + + // 2. 클립보드 → Ctrl+V + Clipboard.SetText(text); + + var paste = new[] + { + MakeKeyInput(VK_CTRL_US, false), + MakeKeyInput(0x56, false), // V + MakeKeyInput(0x56, true), + MakeKeyInput(VK_CTRL_US, true), + }; + SendInput((uint)paste.Length, paste, Marshal.SizeOf()); + + LogService.Info($"스니펫 확장 완료: {deleteCount}자 삭제 후 붙여넣기"); + } + catch (Exception ex) + { + LogService.Warn($"스니펫 확장 실패: {ex.Message}"); + } + } + + private static INPUT MakeKeyInput(ushort vk, bool keyUp) + { + var input = new INPUT { type = 1 }; + input.u.ki.wVk = vk; + input.u.ki.dwFlags = keyUp ? 0x0002u : 0u; // KEYEVENTF_KEYUP + return input; + } + + // ─── 변수 치환 ──────────────────────────────────────────────────────────── + + private static string ExpandVariables(string content) + { + var now = DateTime.Now; + return content + .Replace("{date}", now.ToString("yyyy-MM-dd")) + .Replace("{time}", now.ToString("HH:mm:ss")) + .Replace("{datetime}", now.ToString("yyyy-MM-dd HH:mm:ss")) + .Replace("{year}", now.Year.ToString()) + .Replace("{month}", now.Month.ToString("D2")) + .Replace("{day}", now.Day.ToString("D2")); + } + + // ─── VK → Char 매핑 (US QWERTY 기준) ──────────────────────────────────── + + private static char VkToChar(int vk, bool shifted) + { + if (vk >= 0x41 && vk <= 0x5A) + return shifted ? (char)vk : char.ToLowerInvariant((char)vk); + if (vk >= 0x30 && vk <= 0x39) + return shifted ? ")!@#$%^&*("[vk - 0x30] : (char)vk; + if (vk >= 0x60 && vk <= 0x69) + return (char)('0' + (vk - 0x60)); + if (vk == 0xBD) + return shifted ? '_' : '-'; + return '\0'; + } + + // ─── P/Invoke ──────────────────────────────────────────────────────────── + + [DllImport("user32.dll")] + private static extern short GetAsyncKeyState(int vKey); + + [DllImport("user32.dll", SetLastError = true)] + private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); + + [StructLayout(LayoutKind.Sequential)] + private struct INPUT + { + public int type; + public InputUnion u; + } + + [StructLayout(LayoutKind.Explicit)] + private struct InputUnion + { + [FieldOffset(0)] public MOUSEINPUT mi; + [FieldOffset(0)] public KEYBDINPUT ki; + [FieldOffset(0)] public HARDWAREINPUT hi; + } + + [StructLayout(LayoutKind.Sequential)] + private struct KEYBDINPUT + { + public ushort wVk; + public ushort wScan; + public uint dwFlags; + public uint time; + public IntPtr dwExtraInfo; + } + + [StructLayout(LayoutKind.Sequential)] + private struct MOUSEINPUT + { + public int dx; + public int dy; + public uint mouseData; + public uint dwFlags; + public uint time; + public IntPtr dwExtraInfo; + } + + [StructLayout(LayoutKind.Sequential)] + private struct HARDWAREINPUT + { + public uint uMsg; + public ushort wParamL; + public ushort wParamH; + } +} diff --git a/src/AxCopilot/Handlers/AiSnippetHandler.cs b/src/AxCopilot/Handlers/AiSnippetHandler.cs new file mode 100644 index 0000000..6a64755 --- /dev/null +++ b/src/AxCopilot/Handlers/AiSnippetHandler.cs @@ -0,0 +1,104 @@ +using System.Windows; +using AxCopilot.Models; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// Phase L3-3: AI 스니펫 핸들러. "ai" 예약어로 사용합니다. +/// 예: ai email 프로젝트 일정 변경 안내 → 업무 이메일 초안 생성 +/// ai summary 이 문서의 핵심 내용 → 내용 요약 +/// ai (목록) → 등록된 AI 템플릿 목록 표시 +/// +/// AiEnabled=false이면 항목 자체를 표시하지 않습니다. +/// +public class AiSnippetHandler : IActionHandler +{ + private readonly SettingsService _settings; + private readonly SnippetTemplateService _templateService; + + public string? Prefix => "ai"; + + public PluginMetadata Metadata => new( + "AiSnippet", + "AI 스니펫 — ai [템플릿] [내용]", + "1.0", + "AX"); + + public AiSnippetHandler(SettingsService settings, SnippetTemplateService templateService) + { + _settings = settings; + _templateService = templateService; + } + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + // AI 비활성화 시 항목 표시 안 함 + if (!(_settings.Settings.AiEnabled)) + return Task.FromResult>(Array.Empty()); + + var parts = query.Trim().Split(' ', 2, StringSplitOptions.RemoveEmptyEntries); + var keyword = parts.Length > 0 ? parts[0] : ""; + var argument = parts.Length > 1 ? parts[1] : ""; + + var templates = _templateService.Search(keyword); + var items = new List(); + + if (templates.Count == 0) + { + items.Add(new LauncherItem( + "등록된 AI 템플릿 없음", + "설정 → AI 스니펫 탭에서 추가하세요", + null, null, Symbol: Symbols.Lightbulb)); + return Task.FromResult>(items); + } + + foreach (var tmpl in templates) + { + var hasArg = !string.IsNullOrWhiteSpace(argument); + items.Add(new LauncherItem( + hasArg + ? $"[AI] {tmpl.Name}: {TruncateArg(argument)}" + : $"[AI] {tmpl.Name}", + hasArg + ? $"Enter: AI가 생성 후 클립보드에 복사 · 템플릿: {tmpl.Prompt}" + : $"ai {tmpl.Keyword} [내용] · {tmpl.Prompt}", + null, + hasArg ? (object)(tmpl, argument) : null, + Symbol: Symbols.Lightbulb)); + } + + return Task.FromResult>(items); + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (!_settings.Settings.AiEnabled) return; + + if (item.Data is not (AiSnippetTemplate tmpl, string arg)) return; + + try + { + var result = await _templateService.GenerateAsync(tmpl, arg, ct); + if (string.IsNullOrWhiteSpace(result)) return; + + // 결과를 클립보드에 복사 + Application.Current.Dispatcher.Invoke(() => + { + Clipboard.SetText(result); + Services.NotificationService.Notify( + $"AI {tmpl.Name} 완료", + "결과가 클립보드에 복사되었습니다."); + }); + } + catch (Exception ex) + { + LogService.Warn($"AI 스니펫 생성 실패: {ex.Message}"); + } + } + + private static string TruncateArg(string arg) + => arg.Length > 30 ? arg[..27] + "…" : arg; +} diff --git a/src/AxCopilot/Handlers/AliasHandler.cs b/src/AxCopilot/Handlers/AliasHandler.cs new file mode 100644 index 0000000..086cb8d --- /dev/null +++ b/src/AxCopilot/Handlers/AliasHandler.cs @@ -0,0 +1,186 @@ +using System.Diagnostics; +using System.IO; +using AxCopilot.Models; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// @ prefix 핸들러: URL 열기 Alias +/// +public class UrlAliasHandler : IActionHandler +{ + private readonly SettingsService _settings; + public string? Prefix => "@"; + public PluginMetadata Metadata => new("url-alias", "URL 별칭", "1.0", "AX"); + + public UrlAliasHandler(SettingsService settings) => _settings = settings; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var aliases = _settings.Settings.Aliases + .Where(a => a.Type == "url" && + (string.IsNullOrEmpty(query) || + a.Key.Contains(query, StringComparison.OrdinalIgnoreCase))) + .Select(a => + { + // favicon 캐시 경로 조회 (없으면 백그라운드 다운로드 시작) + var faviconPath = GetFaviconPath(a.Target); + return new LauncherItem( + a.Key, + a.Description ?? a.Target, + faviconPath, + a, + a.Target, + Symbols.Globe); + }); + + return Task.FromResult>(aliases); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is AliasEntry alias) + { + var url = Environment.ExpandEnvironmentVariables(alias.Target); + if (!IsAllowedUrl(url)) + { + LogService.Warn($"허용되지 않는 URL 스킴: {url}"); + return Task.CompletedTask; + } + Process.Start(new ProcessStartInfo(url) { UseShellExecute = true }); + } + return Task.CompletedTask; + } + + // http, https, ftp, ms-settings, mailto, file 스킴만 허용 (javascript: 등 차단) + private static readonly HashSet AllowedSchemes = + new(StringComparer.OrdinalIgnoreCase) { "http", "https", "ftp", "ftps", "ms-settings", "mailto", "file" }; + + private static bool IsAllowedUrl(string url) + { + if (!Uri.TryCreate(url, UriKind.Absolute, out var uri)) return false; + return AllowedSchemes.Contains(uri.Scheme); + } + + /// favicon 캐시 파일 경로를 반환합니다. 캐시에 없으면 백그라운드 다운로드를 시작합니다. + private static string? GetFaviconPath(string url) + { + try + { + if (!url.StartsWith("http", StringComparison.OrdinalIgnoreCase)) + url = "https://" + url; + var domain = new Uri(url).Host.ToLowerInvariant(); + var cachePath = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "favicons", $"{domain}.png"); + + if (File.Exists(cachePath)) + return cachePath; + + // 백그라운드 다운로드 시작 (다음 표시 시 캐시됨) + FaviconService.GetFavicon(url); + return null; + } + catch (Exception) { return null; } + } +} + +/// +/// cd prefix 핸들러: 폴더 열기 Alias +/// +public class FolderAliasHandler : IActionHandler +{ + private readonly SettingsService _settings; + public string? Prefix => "cd"; + public PluginMetadata Metadata => new("folder-alias", "폴더 별칭", "1.0", "AX"); + + public FolderAliasHandler(SettingsService settings) => _settings = settings; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var aliases = _settings.Settings.Aliases + .Where(a => a.Type == "folder" && + (string.IsNullOrEmpty(query) || + a.Key.Contains(query, StringComparison.OrdinalIgnoreCase))) + .Select(a => new LauncherItem( + a.Key, + Environment.ExpandEnvironmentVariables(a.Target), + null, + a, + Symbol: Symbols.Folder)); + + return Task.FromResult>(aliases); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is AliasEntry alias) + { + var path = Environment.ExpandEnvironmentVariables(alias.Target); + Process.Start(new ProcessStartInfo("explorer.exe", path) { UseShellExecute = true }); + } + return Task.CompletedTask; + } +} + +/// +/// > prefix 핸들러: 터미널 명령 실행 +/// +public class BatchHandler : IActionHandler +{ + private readonly SettingsService _settings; + public string? Prefix => ">"; + public PluginMetadata Metadata => new("batch", "명령 실행", "1.0", "AX"); + + public BatchHandler(SettingsService settings) => _settings = settings; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + // 등록된 배치 Alias 표시 + 직접 입력 실행 옵션 + var items = new List(); + + var batchAliases = _settings.Settings.Aliases + .Where(a => a.Type == "batch" && + (string.IsNullOrEmpty(query) || + a.Key.Contains(query, StringComparison.OrdinalIgnoreCase))) + .Select(a => new LauncherItem(a.Key, a.Target, null, a, Symbol: Symbols.Terminal)); + + items.AddRange(batchAliases); + + // 직접 명령어 입력 허용 (큰따옴표 이스케이프로 인젝션 방지) + if (!string.IsNullOrEmpty(query)) + { + var safeQuery = query.Replace("\"", "\\\""); + items.Insert(0, new LauncherItem( + $"실행: {query}", + "PowerShell에서 직접 실행", + null, + new AliasEntry { Type = "batch", Target = $"powershell -NoProfile -Command \"{safeQuery}\"", ShowWindow = true }, + Symbol: Symbols.Terminal + )); + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is AliasEntry alias) + { + var target = Environment.ExpandEnvironmentVariables(alias.Target); + var parts = target.Split(' ', 2); + var psi = new ProcessStartInfo(parts[0]) + { + Arguments = parts.Length > 1 ? parts[1] : "", + UseShellExecute = alias.ShowWindow, + CreateNoWindow = !alias.ShowWindow, + WindowStyle = alias.ShowWindow ? ProcessWindowStyle.Normal : ProcessWindowStyle.Hidden + }; + Process.Start(psi); + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/BatchTextHandler.cs b/src/AxCopilot/Handlers/BatchTextHandler.cs new file mode 100644 index 0000000..6a7fec7 --- /dev/null +++ b/src/AxCopilot/Handlers/BatchTextHandler.cs @@ -0,0 +1,210 @@ +using System.Text; +using System.Text.RegularExpressions; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 텍스트 일괄 처리 핸들러. "batch" 프리픽스로 사용합니다. +/// 클립보드 텍스트의 각 줄에 동시에 변환을 적용합니다. +/// 예: batch prefix [텍스트] → 각 줄 앞에 [텍스트] 추가 +/// batch suffix [텍스트] → 각 줄 뒤에 [텍스트] 추가 +/// batch number → 줄번호 추가 +/// batch sort → 줄 정렬 +/// batch unique → 중복 줄 제거 +/// batch wrap " → 각 줄을 "로 감싸기 +/// batch replace A B → A를 B로 치환 +/// batch csv → 줄 → CSV 한 줄로 합치기 +/// batch split , → CSV 한 줄 → 여러 줄로 분리 +/// Enter → 결과를 클립보드에 복사. +/// +public class BatchTextHandler : IActionHandler +{ + public string? Prefix => "batch"; + + public PluginMetadata Metadata => new( + "BatchText", + "텍스트 일괄 처리 — batch", + "1.0", + "AX"); + + private static readonly (string Cmd, string Desc)[] Commands = + [ + ("prefix [텍스트]", "각 줄 앞에 텍스트 추가"), + ("suffix [텍스트]", "각 줄 뒤에 텍스트 추가"), + ("wrap [문자]", "각 줄을 지정 문자로 감싸기 (예: wrap \")"), + ("number", "줄번호 추가 (1. 2. 3. ...)"), + ("sort", "줄 오름차순 정렬"), + ("sortd", "줄 내림차순 정렬"), + ("reverse", "줄 순서 뒤집기"), + ("unique", "중복 줄 제거"), + ("trim", "각 줄 앞뒤 공백 제거"), + ("replace [A] [B]", "A를 B로 전체 치환"), + ("csv", "줄들을 쉼표로 합쳐 한 줄로"), + ("split [구분자]", "한 줄을 구분자로 분리하여 여러 줄로"), + ("indent [N]", "각 줄 앞에 공백 N개 추가"), + ("unindent", "각 줄의 선행 공백/탭 제거"), + ]; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + if (string.IsNullOrWhiteSpace(q)) + { + var items = Commands.Select(c => new LauncherItem( + $"batch {c.Cmd}", + c.Desc, + null, null, + Symbol: Symbols.Text)).ToList(); + + items.Insert(0, new LauncherItem( + "텍스트 일괄 처리", + "클립보드 텍스트의 각 줄에 변환 적용 · 명령 입력", + null, null, Symbol: Symbols.Info)); + + return Task.FromResult>(items); + } + + // 클립보드 읽기 + string? text = null; + try + { + if (Application.Current?.Dispatcher.Invoke(() => Clipboard.ContainsText()) == true) + text = Application.Current.Dispatcher.Invoke(() => Clipboard.GetText()); + } + catch (Exception) { } + + if (string.IsNullOrEmpty(text)) + { + return Task.FromResult>( + [ + new LauncherItem("클립보드에 텍스트가 없습니다", "텍스트를 복사한 후 시도하세요", + null, null, Symbol: Symbols.Warning) + ]); + } + + var lines = text.Split('\n').Select(l => l.TrimEnd('\r')).ToArray(); + var parts = q.Split(' ', 2, StringSplitOptions.TrimEntries); + var cmd = parts[0].ToLowerInvariant(); + var arg = parts.Length > 1 ? parts[1] : ""; + + string? result = null; + string? desc = null; + + try + { + switch (cmd) + { + case "prefix": + result = string.Join("\n", lines.Select(l => arg + l)); + desc = $"각 줄 앞에 '{arg}' 추가"; + break; + case "suffix": + result = string.Join("\n", lines.Select(l => l + arg)); + desc = $"각 줄 뒤에 '{arg}' 추가"; + break; + case "wrap": + var w = string.IsNullOrEmpty(arg) ? "\"" : arg; + result = string.Join("\n", lines.Select(l => w + l + w)); + desc = $"각 줄을 '{w}'로 감싸기"; + break; + case "number": + result = string.Join("\n", lines.Select((l, i) => $"{i + 1}. {l}")); + desc = "줄번호 추가"; + break; + case "sort": + result = string.Join("\n", lines.Order()); + desc = "오름차순 정렬"; + break; + case "sortd": + result = string.Join("\n", lines.OrderDescending()); + desc = "내림차순 정렬"; + break; + case "reverse": + result = string.Join("\n", lines.Reverse()); + desc = "줄 순서 뒤집기"; + break; + case "unique": + var unique = lines.Distinct().ToArray(); + result = string.Join("\n", unique); + desc = $"중복 제거: {lines.Length}줄 → {unique.Length}줄"; + break; + case "trim": + result = string.Join("\n", lines.Select(l => l.Trim())); + desc = "각 줄 공백 제거"; + break; + case "replace": + var rParts = arg.Split(' ', 2, StringSplitOptions.TrimEntries); + if (rParts.Length == 2) + { + result = text.Replace(rParts[0], rParts[1]); + desc = $"'{rParts[0]}' → '{rParts[1]}' 치환"; + } + break; + case "csv": + result = string.Join(",", lines.Select(l => l.Trim())); + desc = $"{lines.Length}줄 → CSV 한 줄"; + break; + case "split": + var sep = string.IsNullOrEmpty(arg) ? "," : arg; + result = string.Join("\n", text.Split(sep)); + desc = $"'{sep}' 기준 분리"; + break; + case "indent": + var n = int.TryParse(arg, out var indent) ? indent : 4; + var pad = new string(' ', n); + result = string.Join("\n", lines.Select(l => pad + l)); + desc = $"{n}칸 들여쓰기"; + break; + case "unindent": + result = string.Join("\n", lines.Select(l => l.TrimStart(' ', '\t'))); + desc = "선행 공백 제거"; + break; + } + } + catch (Exception ex) + { + return Task.FromResult>( + [ + new LauncherItem($"처리 오류: {ex.Message}", "입력 데이터를 확인하세요", + null, null, Symbol: Symbols.Error) + ]); + } + + if (result == null) + { + return Task.FromResult>( + [ + new LauncherItem($"알 수 없는 명령: {cmd}", "batch 만 입력하면 전체 명령 목록", + null, null, Symbol: Symbols.Warning) + ]); + } + + var preview = result.Length > 120 ? result[..117] + "…" : result; + preview = preview.Replace("\n", "↵ "); + + return Task.FromResult>( + [ + new LauncherItem( + $"[{desc}] → Enter로 클립보드 복사", + preview, + null, result, + Symbol: Symbols.Text) + ]); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text) + { + try { Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(text)); } + catch (Exception) { } + NotificationService.Notify("일괄 처리 완료", "변환 결과가 클립보드에 복사되었습니다"); + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/BookmarkHandler.cs b/src/AxCopilot/Handlers/BookmarkHandler.cs new file mode 100644 index 0000000..009252c --- /dev/null +++ b/src/AxCopilot/Handlers/BookmarkHandler.cs @@ -0,0 +1,180 @@ +using System.IO; +using System.Text.Json; +using System.Text.Json.Nodes; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// Chrome / Edge 브라우저 북마크를 검색합니다. +/// 프리픽스 없음 — 일반 퍼지 검색에 통합됩니다. +/// 지원 브라우저: Google Chrome, Microsoft Edge +/// +public class BookmarkHandler : IActionHandler +{ + public string? Prefix => null; // 퍼지 검색에 통합 + + public PluginMetadata Metadata => new( + "Bookmarks", + "Chrome / Edge 북마크 검색", + "1.0", + "AX"); + + // 캐시 (앱 세션 중 북마크가 자주 바뀌지 않으므로 한 번 로드 후 재사용) + private List? _cache; + private DateTime _cacheTime = DateTime.MinValue; + private static readonly TimeSpan CacheTtl = TimeSpan.FromMinutes(5); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(query)) + return Task.FromResult>(Array.Empty()); + + RefreshCacheIfNeeded(); + + if (_cache == null || _cache.Count == 0) + return Task.FromResult>(Array.Empty()); + + var q = query.Trim().ToLowerInvariant(); + var results = _cache + .Where(b => b.Name.ToLowerInvariant().Contains(q) + || (b.Url?.ToLowerInvariant().Contains(q) ?? false)) + .Take(8) + .Select(b => new LauncherItem( + b.Name, + b.Url ?? "", + null, + b.Url, + Symbol: Symbols.Globe)) + .ToList(); + + return Task.FromResult>(results); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string url && !string.IsNullOrWhiteSpace(url)) + { + try + { + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(url) + { UseShellExecute = true }); + } + catch (Exception ex) + { + LogService.Warn($"북마크 열기 실패: {ex.Message}"); + } + } + return Task.CompletedTask; + } + + // ─── 캐시 ──────────────────────────────────────────────────────────────── + + private void RefreshCacheIfNeeded() + { + if (_cache != null && DateTime.Now - _cacheTime < CacheTtl) return; + + var bookmarks = new List(); + + foreach (var file in GetBookmarkFiles()) + { + try + { + var json = File.ReadAllText(file); + ParseChromeBookmarks(json, bookmarks); + } + catch (Exception ex) + { + LogService.Warn($"북마크 파일 읽기 실패: {file} — {ex.Message}"); + } + } + + _cache = bookmarks; + _cacheTime = DateTime.Now; + LogService.Info($"북마크 로드 완료: {bookmarks.Count}개"); + } + + // ─── 북마크 파일 경로 ───────────────────────────────────────────────────── + + private static IEnumerable GetBookmarkFiles() + { + var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + + // Chrome (안정, 베타, 개발, 카나리아) + var chromePaths = new[] + { + Path.Combine(localAppData, "Google", "Chrome", "User Data"), + Path.Combine(localAppData, "Google", "Chrome Beta", "User Data"), + Path.Combine(localAppData, "Google", "Chrome Dev", "User Data"), + Path.Combine(localAppData, "Google", "Chrome SxS", "User Data"), + }; + + // Edge + var edgePaths = new[] + { + Path.Combine(localAppData, "Microsoft", "Edge", "User Data"), + Path.Combine(localAppData, "Microsoft", "Edge Beta", "User Data"), + Path.Combine(localAppData, "Microsoft", "Edge Dev", "User Data"), + Path.Combine(localAppData, "Microsoft", "Edge Canary", "User Data"), + }; + + foreach (var profileRoot in chromePaths.Concat(edgePaths)) + { + if (!Directory.Exists(profileRoot)) continue; + + // Default 프로파일 + var defaultBookmark = Path.Combine(profileRoot, "Default", "Bookmarks"); + if (File.Exists(defaultBookmark)) yield return defaultBookmark; + + // Profile 1, 2, ... 프로파일 + foreach (var dir in Directory.GetDirectories(profileRoot, "Profile *")) + { + var f = Path.Combine(dir, "Bookmarks"); + if (File.Exists(f)) yield return f; + } + } + } + + // ─── Chrome/Edge JSON 파싱 ─────────────────────────────────────────────── + + private static void ParseChromeBookmarks(string json, List result) + { + var doc = JsonNode.Parse(json); + var roots = doc?["roots"]; + if (roots == null) return; + + foreach (var rootKey in new[] { "bookmark_bar", "other", "synced" }) + { + var node = roots[rootKey]; + if (node != null) WalkNode(node, result); + } + } + + private static void WalkNode(JsonNode node, List result) + { + var type = node["type"]?.GetValue(); + + if (type == "url") + { + var name = node["name"]?.GetValue() ?? ""; + var url = node["url"]?.GetValue() ?? ""; + if (!string.IsNullOrWhiteSpace(name) && !string.IsNullOrWhiteSpace(url)) + result.Add(new BookmarkEntry(name, url)); + return; + } + + if (type == "folder") + { + var children = node["children"]?.AsArray(); + if (children == null) return; + foreach (var child in children) + { + if (child != null) WalkNode(child, result); + } + } + } + + private record BookmarkEntry(string Name, string? Url); +} diff --git a/src/AxCopilot/Handlers/CalculatorHandler.cs b/src/AxCopilot/Handlers/CalculatorHandler.cs new file mode 100644 index 0000000..7499add --- /dev/null +++ b/src/AxCopilot/Handlers/CalculatorHandler.cs @@ -0,0 +1,566 @@ +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; +using System.Net.Http; +using System.Text.Json; +using System.Text.RegularExpressions; +using System.Windows; + +namespace AxCopilot.Handlers; + +/// +/// 수식 계산기 핸들러. "=" 프리픽스로 사용합니다. +/// 예: = 1+2*3 → 7 +/// = sqrt(16) → 4 +/// = 100km in miles → 단위 변환 +/// = 100 USD to KRW → 통화 변환 (실시간 환율) +/// +public class CalculatorHandler : IActionHandler +{ + public string? Prefix => "="; + + public PluginMetadata Metadata => new( + "Calculator", + "수식 계산기 — = 뒤에 수식 입력", + "1.0", + "AX"); + + public async Task> GetItemsAsync(string query, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(query)) + { + return + [ + new LauncherItem( + "수식을 입력하세요", + "예: 1+2*3 · sqrt(16) · 100km in miles · 100 USD to KRW", + null, null, Symbol: Symbols.Calculator) + ]; + } + + var trimmed = query.Trim(); + + // ─── 통화 변환 우선 감지 ────────────────────────────────────────────── + if (CurrencyConverter.IsCurrencyQuery(trimmed)) + { + return await CurrencyConverter.ConvertAsync(trimmed, ct); + } + + // ─── 단위 변환 우선 감지 ────────────────────────────────────────────── + if (UnitConverter.TryConvert(trimmed, out var convertResult)) + { + return + [ + new LauncherItem( + convertResult!, + $"{trimmed} · Enter로 클립보드에 복사", + null, convertResult, Symbol: Symbols.Calculator), + ]; + } + + // ─── 수식 계산 ──────────────────────────────────────────────────────── + try + { + var value = MathEvaluator.Evaluate(trimmed); + var result = FormatResult(value); + + return + [ + new LauncherItem( + result, + $"{trimmed} = {result} · Enter로 클립보드에 복사", + null, result, Symbol: Symbols.Calculator), + ]; + } + catch (Exception ex) + { + return + [ + new LauncherItem( + "계산할 수 없습니다", + ex.Message, + null, null, Symbol: Symbols.Error) + ]; + } + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string result) + { + try { Clipboard.SetText(result); } + catch (Exception) { /* 클립보드 접근 실패 무시 */ } + } + return Task.CompletedTask; + } + + // ─── 결과 포맷 ───────────────────────────────────────────────────────── + + private static string FormatResult(double value) + { + if (double.IsNaN(value)) return "NaN"; + if (double.IsPositiveInfinity(value)) return "∞"; + if (double.IsNegativeInfinity(value)) return "-∞"; + + // 정수이고 너무 크지 않으면 천 단위 구분 없이 정수로 표시 + if (value == Math.Floor(value) && Math.Abs(value) < 1e15) + return ((long)value).ToString(); + + // 소수점 10자리까지, 불필요한 0은 제거 + return value.ToString("G10", System.Globalization.CultureInfo.InvariantCulture); + } +} + +// ─── 단위 변환 ───────────────────────────────────────────────────────────────── + +/// +/// "100km in miles", "32f in c", "5lb to kg" 형식의 단위 변환. +/// +internal static class UnitConverter +{ + // 패턴: <숫자> <단위> in|to <단위> + private static readonly Regex Pattern = new( + @"^(-?\d+(?:\.\d+)?)\s*([a-z°/²³µ]+)\s+(?:in|to)\s+([a-z°/²³µ]+)$", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + public static bool TryConvert(string input, out string? result) + { + result = null; + var m = Pattern.Match(input.Trim()); + if (!m.Success) return false; + + if (!double.TryParse(m.Groups[1].Value, + System.Globalization.NumberStyles.Float, + System.Globalization.CultureInfo.InvariantCulture, + out var value)) + return false; + + var from = m.Groups[2].Value.ToLowerInvariant(); + var to = m.Groups[3].Value.ToLowerInvariant(); + + // 온도는 비선형 → 별도 처리 + if (TryConvertTemperature(value, from, to, out var tResult)) + { + result = $"{FormatNum(tResult)} {TemperatureLabel(to)}"; + return true; + } + + // 나머지 범주(선형 변환) + foreach (var table in _tables) + { + if (table.TryGetValue(from, out var fromFactor) && + table.TryGetValue(to, out var toFactor)) + { + var converted = value * fromFactor / toFactor; + result = $"{FormatNum(converted)} {to}"; + return true; + } + } + + return false; + } + + // ─── 온도 ──────────────────────────────────────────────────────────────── + + private static bool TryConvertTemperature(double v, string from, string to, out double r) + { + r = 0; + // 섭씨 표준화 + double celsius; + switch (from) + { + case "c": case "°c": case "celsius": celsius = v; break; + case "f": case "°f": case "fahrenheit": celsius = (v - 32) * 5 / 9; break; + case "k": case "kelvin": celsius = v - 273.15; break; + default: return false; + } + switch (to) + { + case "c": case "°c": case "celsius": r = celsius; break; + case "f": case "°f": case "fahrenheit": r = celsius * 9 / 5 + 32; break; + case "k": case "kelvin": r = celsius + 273.15; break; + default: return false; + } + return true; + } + + private static string TemperatureLabel(string unit) => unit switch + { + "c" or "°c" or "celsius" => "°C", + "f" or "°f" or "fahrenheit" => "°F", + "k" or "kelvin" => "K", + _ => unit + }; + + // ─── 선형 변환 테이블 (기준 단위 = 1) ──────────────────────────────────── + + // 길이 (기준: m) + private static readonly Dictionary _length = new() + { + ["km"] = 1000, ["m"] = 1, ["cm"] = 0.01, ["mm"] = 0.001, + ["mi"] = 1609.344, ["mile"] = 1609.344, ["miles"] = 1609.344, + ["ft"] = 0.3048, ["feet"] = 0.3048, ["foot"] = 0.3048, + ["in"] = 0.0254, ["inch"] = 0.0254, ["inches"] = 0.0254, + ["yd"] = 0.9144, ["yard"] = 0.9144, ["yards"] = 0.9144, + ["nm"] = 1e-9, + }; + + // 무게 (기준: kg) + private static readonly Dictionary _weight = new() + { + ["t"] = 1000, ["ton"] = 1000, ["tonnes"] = 1000, + ["kg"] = 1, ["g"] = 0.001, ["mg"] = 1e-6, + ["lb"] = 0.453592, ["lbs"] = 0.453592, ["pound"] = 0.453592, ["pounds"] = 0.453592, + ["oz"] = 0.0283495, ["ounce"] = 0.0283495, ["ounces"] = 0.0283495, + }; + + // 속도 (기준: m/s) + private static readonly Dictionary _speed = new() + { + ["m/s"] = 1, ["mps"] = 1, + ["km/h"] = 1.0 / 3.6, ["kmh"] = 1.0 / 3.6, ["kph"] = 1.0 / 3.6, + ["mph"] = 0.44704, + ["kn"] = 0.514444, ["knot"] = 0.514444, ["knots"] = 0.514444, + }; + + // 데이터 (기준: byte) + private static readonly Dictionary _data = new() + { + ["b"] = 1, ["byte"] = 1, ["bytes"] = 1, + ["kb"] = 1024, ["kib"] = 1024, + ["mb"] = 1024 * 1024, ["mib"] = 1024 * 1024, + ["gb"] = 1024.0 * 1024 * 1024, ["gib"] = 1024.0 * 1024 * 1024, + ["tb"] = 1024.0 * 1024 * 1024 * 1024, ["tib"] = 1024.0 * 1024 * 1024 * 1024, + ["pb"] = 1024.0 * 1024 * 1024 * 1024 * 1024, + }; + + // 넓이 (기준: m²) + private static readonly Dictionary _area = new() + { + ["m²"] = 1, ["m2"] = 1, + ["km²"] = 1e6, ["km2"] = 1e6, + ["cm²"] = 1e-4, ["cm2"] = 1e-4, + ["ha"] = 10000, + ["acre"] = 4046.86, ["acres"] = 4046.86, + ["ft²"] = 0.092903, ["ft2"] = 0.092903, + }; + + private static readonly List> _tables = new() + { _length, _weight, _speed, _data, _area }; + + private static string FormatNum(double v) + { + if (v == Math.Floor(v) && Math.Abs(v) < 1e12) + return ((long)v).ToString("N0", System.Globalization.CultureInfo.CurrentCulture); + return v.ToString("G6", System.Globalization.CultureInfo.InvariantCulture); + } +} + +// ─── 수식 파서 ───────────────────────────────────────────────────────────────── + +/// +/// 재귀 하강 파서 기반 수학 수식 평가기. +/// 지원: +, -, *, /, %, ^ (거듭제곱), 괄호, 단항 음수, +/// sqrt, abs, ceil, floor, round, sin, cos, tan (도 단위), +/// log (밑 10), ln (자연로그), pi, e +/// +internal static class MathEvaluator +{ + public static double Evaluate(string expr) + { + var evaluator = new Evaluator( + expr.Replace(" ", "") + .Replace("×", "*") + .Replace("÷", "/") + .Replace(",", ",") + .ToLowerInvariant()); + return evaluator.Parse(); + } + + private class Evaluator + { + private readonly string _s; + private int _i; + + public Evaluator(string s) { _s = s; _i = 0; } + + public double Parse() + { + var result = ParseExpr(); + if (_i < _s.Length) + throw new InvalidOperationException($"예기치 않은 문자: '{_s[_i]}'"); + return result; + } + + // 덧셈 / 뺄셈 + private double ParseExpr() + { + var left = ParseTerm(); + while (_i < _s.Length && (_s[_i] == '+' || _s[_i] == '-')) + { + var op = _s[_i++]; + var right = ParseTerm(); + left = op == '+' ? left + right : left - right; + } + return left; + } + + // 곱셈 / 나눗셈 / 나머지 + private double ParseTerm() + { + var left = ParsePower(); + while (_i < _s.Length && (_s[_i] == '*' || _s[_i] == '/' || _s[_i] == '%')) + { + var op = _s[_i++]; + var right = ParsePower(); + left = op == '*' ? left * right + : op == '/' ? left / right + : left % right; + } + return left; + } + + // 거듭제곱 (오른쪽 결합) + private double ParsePower() + { + var b = ParseUnary(); + if (_i < _s.Length && _s[_i] == '^') + { + _i++; + var exp = ParseUnary(); + return Math.Pow(b, exp); + } + return b; + } + + // 단항 부호 + private double ParseUnary() + { + if (_i < _s.Length && _s[_i] == '-') { _i++; return -ParsePrimary(); } + if (_i < _s.Length && _s[_i] == '+') { _i++; return ParsePrimary(); } + return ParsePrimary(); + } + + // 리터럴 / 괄호 / 함수 호출 + private double ParsePrimary() + { + if (_i >= _s.Length) + throw new InvalidOperationException("수식이 불완전합니다."); + + // 16진수 리터럴 0x... + if (_i + 1 < _s.Length && _s[_i] == '0' && _s[_i + 1] == 'x') + { + _i += 2; + var hexStart = _i; + while (_i < _s.Length && "0123456789abcdef".Contains(_s[_i])) _i++; + return Convert.ToInt64(_s[hexStart.._i], 16); + } + + // 숫자 + if (char.IsDigit(_s[_i]) || _s[_i] == '.') + { + var start = _i; + while (_i < _s.Length && (char.IsDigit(_s[_i]) || _s[_i] == '.')) _i++; + // 과학적 표기: 1.5e3 + if (_i < _s.Length && _s[_i] == 'e') + { + _i++; + if (_i < _s.Length && (_s[_i] == '+' || _s[_i] == '-')) _i++; + while (_i < _s.Length && char.IsDigit(_s[_i])) _i++; + } + return double.Parse(_s[start.._i], + System.Globalization.NumberStyles.Float, + System.Globalization.CultureInfo.InvariantCulture); + } + + // 괄호 + if (_s[_i] == '(') + { + _i++; + var val = ParseExpr(); + if (_i < _s.Length && _s[_i] == ')') _i++; + return val; + } + + // 식별자 (상수 또는 함수) + if (char.IsLetter(_s[_i])) + { + var start = _i; + while (_i < _s.Length && (char.IsLetterOrDigit(_s[_i]) || _s[_i] == '_')) _i++; + var name = _s[start.._i]; + + // 상수 + if (name == "pi") return Math.PI; + if (name == "e") return Math.E; + if (name == "inf") return double.PositiveInfinity; + + // 함수 호출 + if (_i < _s.Length && _s[_i] == '(') + { + _i++; // ( + var arg = ParseExpr(); + // 두 번째 인자 (pow, log2 등) + double? arg2 = null; + if (_i < _s.Length && _s[_i] == ',') + { + _i++; + arg2 = ParseExpr(); + } + if (_i < _s.Length && _s[_i] == ')') _i++; + + return name switch + { + "sqrt" => Math.Sqrt(arg), + "abs" => Math.Abs(arg), + "ceil" => Math.Ceiling(arg), + "floor" => Math.Floor(arg), + "round" => arg2.HasValue ? Math.Round(arg, (int)arg2.Value) : Math.Round(arg), + "sin" => Math.Sin(arg * Math.PI / 180), // 도 단위 + "cos" => Math.Cos(arg * Math.PI / 180), + "tan" => Math.Tan(arg * Math.PI / 180), + "asin" => Math.Asin(arg) * 180 / Math.PI, + "acos" => Math.Acos(arg) * 180 / Math.PI, + "atan" => Math.Atan(arg) * 180 / Math.PI, + "log" => arg2.HasValue ? Math.Log(arg, arg2.Value) : Math.Log10(arg), + "log2" => Math.Log2(arg), + "ln" => Math.Log(arg), + "exp" => Math.Exp(arg), + "pow" => arg2.HasValue ? Math.Pow(arg, arg2.Value) : throw new InvalidOperationException("pow(x,y) 형식으로 사용하세요."), + "min" => arg2.HasValue ? Math.Min(arg, arg2.Value) : arg, + "max" => arg2.HasValue ? Math.Max(arg, arg2.Value) : arg, + _ => throw new InvalidOperationException($"알 수 없는 함수: {name}()") + }; + } + + throw new InvalidOperationException($"알 수 없는 식별자: {name}"); + } + + throw new InvalidOperationException($"예기치 않은 문자: '{_s[_i]}'"); + } + } +} + +// ─── 통화 변환 ────────────────────────────────────────────────────────────────── + +/// +/// "100 USD to KRW", "50 EUR in JPY" 형식의 통화 변환. +/// open.er-api.com 무료 API 사용 (1시간 캐시). +/// +internal static class CurrencyConverter +{ + // 패턴: <숫자> <통화코드 3자리> in|to <통화코드 3자리> + private static readonly Regex _pattern = new( + @"^(\d+(?:\.\d+)?)\s+([A-Za-z]{3})\s+(?:to|in)\s+([A-Za-z]{3})$", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + // 캐시: base currency → (fetched at, rates dict) + private static readonly Dictionary Rates)> _cache = new(); + private static readonly HttpClient _http = new() { Timeout = TimeSpan.FromSeconds(5) }; + private static readonly TimeSpan CacheTtl = TimeSpan.FromHours(1); + + // 주요 통화 이름 + private static readonly Dictionary _names = new(StringComparer.OrdinalIgnoreCase) + { + ["KRW"] = "원", ["USD"] = "달러", ["EUR"] = "유로", + ["JPY"] = "엔", ["GBP"] = "파운드", ["CNY"] = "위안", + ["HKD"] = "홍콩달러", ["SGD"] = "싱가포르달러", ["CAD"] = "캐나다달러", + ["AUD"] = "호주달러", ["CHF"] = "스위스프랑", ["TWD"] = "대만달러", + ["MXN"] = "멕시코페소", ["BRL"] = "브라질헤알", ["INR"] = "인도루피", + ["RUB"] = "루블", ["THB"] = "바트", ["VND"] = "동", + ["IDR"] = "루피아", ["MYR"] = "링깃", ["PHP"] = "페소", + ["NZD"] = "뉴질랜드달러", ["SEK"] = "크로나", ["NOK"] = "크로나(노르)", + ["DKK"] = "크로나(덴)", ["AED"] = "디르함", ["SAR"] = "리얄", + }; + + public static bool IsCurrencyQuery(string input) + => _pattern.IsMatch(input.Trim()); + + public static async Task> ConvertAsync(string input, CancellationToken ct) + { + var m = _pattern.Match(input.Trim()); + if (!m.Success) + return [new LauncherItem("통화 형식 오류", "예: 100 USD to KRW", null, null, Symbol: Symbols.Error)]; + + if (!double.TryParse(m.Groups[1].Value, + System.Globalization.NumberStyles.Float, + System.Globalization.CultureInfo.InvariantCulture, + out double amount)) + return [new LauncherItem("숫자 형식 오류", "", null, null, Symbol: Symbols.Error)]; + + var from = m.Groups[2].Value.ToUpperInvariant(); + var to = m.Groups[3].Value.ToUpperInvariant(); + + try + { + var rates = await GetRatesAsync(from, ct); + if (rates == null) + return [new LauncherItem("환율 조회 실패", "네트워크 연결을 확인하세요", null, null, Symbol: Symbols.Warning)]; + + if (!rates.TryGetValue(to, out double rate)) + return [new LauncherItem($"지원하지 않는 통화: {to}", "3자리 ISO 4217 코드를 입력하세요", null, null, Symbol: Symbols.Error)]; + + double result = amount * rate; + var fromName = _names.TryGetValue(from, out var fn) ? fn : from; + var toName = _names.TryGetValue(to, out var tn) ? tn : to; + + // 금액 포맷 + string resultStr = to == "KRW" || to == "JPY" || to == "IDR" || to == "VND" + ? result.ToString("N0", System.Globalization.CultureInfo.CurrentCulture) + : result.ToString("N2", System.Globalization.CultureInfo.CurrentCulture); + + string rateStr = rate < 0.01 + ? rate.ToString("G4", System.Globalization.CultureInfo.InvariantCulture) + : rate.ToString("N4", System.Globalization.CultureInfo.CurrentCulture); + + var display = $"{resultStr} {to}"; + + return + [ + new LauncherItem( + $"{amount:N2} {from} = {display}", + $"1 {from}({fromName}) = {rateStr} {to}({toName}) · Enter로 복사", + null, display, Symbol: Symbols.Calculator), + new LauncherItem( + $"숫자만: {resultStr}", + "Enter로 숫자만 복사", + null, resultStr, Symbol: Symbols.Calculator), + ]; + } + catch (OperationCanceledException) + { + return []; + } + catch (Exception ex) + { + LogService.Warn($"환율 조회 오류: {ex.Message}"); + return [new LauncherItem("환율 조회 실패", ex.Message, null, null, Symbol: Symbols.Warning)]; + } + } + + private static async Task?> GetRatesAsync(string baseCurrency, CancellationToken ct) + { + if (_cache.TryGetValue(baseCurrency, out var cached) && + (DateTime.Now - cached.At) < CacheTtl) + return cached.Rates; + + var url = $"https://open.er-api.com/v6/latest/{baseCurrency}"; + var json = await _http.GetStringAsync(url, ct); + + using var doc = JsonDocument.Parse(json); + var root = doc.RootElement; + + if (!root.TryGetProperty("result", out var resultEl) || + resultEl.GetString() != "success") + return null; + + if (!root.TryGetProperty("rates", out var ratesEl)) + return null; + + var rates = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var prop in ratesEl.EnumerateObject()) + rates[prop.Name] = prop.Value.GetDouble(); + + _cache[baseCurrency] = (DateTime.Now, rates); + return rates; + } +} diff --git a/src/AxCopilot/Handlers/ChatHandler.cs b/src/AxCopilot/Handlers/ChatHandler.cs new file mode 100644 index 0000000..32119f2 --- /dev/null +++ b/src/AxCopilot/Handlers/ChatHandler.cs @@ -0,0 +1,170 @@ +using AxCopilot.Models; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Views; + +namespace AxCopilot.Handlers; + +/// +/// "!" 프리픽스 핸들러. AX Agent (AI 어시스턴트) 기능. +/// ★ DEPLOY_STUB = true → 배포용 "개발 중" 표시 +/// ★ DEPLOY_STUB = false → 실제 ChatWindow 동작 +/// +public class ChatHandler : IActionHandler +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + // ┌──────────────────────────────────────────────────────────────┐ + // │ 배포 시 true, 개발 활성화 시 false 로 전환 │ + // └──────────────────────────────────────────────────────────────┘ + private const bool DEPLOY_STUB = false; + + private readonly SettingsService _settings; + private readonly object _windowLock = new(); + private ChatWindow? _chatWindow; + + public string? Prefix => "!"; + public PluginMetadata Metadata => new("ax.agent", "AX Agent", "1.0", "AX Agent — AI 어시스턴트"); + + public ChatHandler(SettingsService settings) + { + _settings = settings; + } + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + // ── 배포용 스텁 ───────────────────────────────────────────── +#pragma warning disable CS0162 // DEPLOY_STUB 플래그에 의한 의도된 비활성 코드 + if (DEPLOY_STUB) + { + var stub = new List + { + new LauncherItem( + "AX Agent (개발 중)", + "이 기능은 다음 버전에서 제공될 예정입니다. 기대해 주세요!", + null, null, Symbol: "\uE8BD") + }; + return Task.FromResult>(stub); + } +#pragma warning restore CS0162 + + // ── AI 비활성화 체크 ───────────────────────────────────────── + var appSettings = CurrentApp?.SettingsService?.Settings; + if (appSettings?.AiEnabled == false) + return Task.FromResult>(Array.Empty()); + + // ── 실제 구현 ─────────────────────────────────────────────── + var items = new List(); + var q = query.Trim(); + + if (string.IsNullOrEmpty(q)) + { + items.Add(new LauncherItem( + "AX Agent 대화하기", + "AI 비서와 대화를 시작합니다", + null, "open_chat", Symbol: "\uE8BD")); + + try + { + var storage = new ChatStorageService(); + var metas = storage.LoadAllMeta(); + foreach (var conv in metas.Take(5)) + { + var ago = FormatTimeAgo(conv.UpdatedAt); + var symbol = ChatCategory.GetSymbol(conv.Category); + items.Add(new LauncherItem( + conv.Title, + $"{ago} · 메시지 {conv.Messages.Count}개", + null, $"resume:{conv.Id}", Symbol: symbol)); + } + if (metas.Any()) + items.Add(new LauncherItem( + "새 대화 시작", + "이전 대화와 별개의 새 대화를 시작합니다", + null, "new_chat", Symbol: "\uE710")); + } + catch (Exception) { } + } + else + { + items.Add(new LauncherItem( + $"AI에게 물어보기: {(q.Length > 40 ? q[..40] + "…" : q)}", + "Enter를 누르면 AX Agent이 열리고 질문이 전송됩니다", + null, $"ask:{q}", Symbol: "\uE8BD")); + items.Add(new LauncherItem( + "AX Agent 대화하기", + "질문 없이 Agent 창만 엽니다", + null, "open_chat", Symbol: "\uE8BD")); + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { +#pragma warning disable CS0162 // DEPLOY_STUB 플래그에 의한 의도된 비활성 코드 + if (DEPLOY_STUB) return Task.CompletedTask; +#pragma warning restore CS0162 + + // AI 비활성화 시 실행 차단 + var appSettings2 = CurrentApp?.SettingsService?.Settings; + if (appSettings2?.AiEnabled == false) return Task.CompletedTask; + + var data = item.Data as string ?? "open_chat"; + + System.Windows.Application.Current.Dispatcher.Invoke(() => + { + EnsureChatWindow(); + + if (data.StartsWith("ask:")) + { + var question = data[4..]; + _chatWindow!.Show(); + _chatWindow.Activate(); + _chatWindow.SendInitialMessage(question); + } + else if (data.StartsWith("resume:")) + { + var convId = data[7..]; + _chatWindow!.Show(); + _chatWindow.Activate(); + _chatWindow.ResumeConversation(convId); + } + else if (data == "new_chat") + { + _chatWindow!.Show(); + _chatWindow.Activate(); + _chatWindow.StartNewAndFocus(); + } + else + { + _chatWindow!.Show(); + _chatWindow.Activate(); + } + }); + + return Task.CompletedTask; + } + + private void EnsureChatWindow() + { + lock (_windowLock) + { + if (_chatWindow == null || !_chatWindow.IsLoaded) + { + _chatWindow = new ChatWindow(_settings); + _chatWindow.Closed += (_, _) => { lock (_windowLock) _chatWindow = null; }; + } + } + } + + private static string FormatTimeAgo(DateTime dt) + { + var diff = DateTime.Now - dt; + if (diff.TotalMinutes < 1) return "방금 전"; + if (diff.TotalHours < 1) return $"{(int)diff.TotalMinutes}분 전"; + if (diff.TotalDays < 1) return $"{(int)diff.TotalHours}시간 전"; + if (diff.TotalDays < 7) return $"{(int)diff.TotalDays}일 전"; + return dt.ToString("yyyy-MM-dd"); + } +} diff --git a/src/AxCopilot/Handlers/ClipboardHandler.cs b/src/AxCopilot/Handlers/ClipboardHandler.cs new file mode 100644 index 0000000..1a32117 --- /dev/null +++ b/src/AxCopilot/Handlers/ClipboardHandler.cs @@ -0,0 +1,193 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; +using System.Windows; +using AxCopilot.Models; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// $ prefix 핸들러: 클립보드 텍스트 변환 +/// +public class ClipboardHandler : IActionHandler +{ + private readonly SettingsService _settings; + public string? Prefix => "$"; + public PluginMetadata Metadata => new("clipboard", "클립보드 변환", "1.0", "AX"); + + public ClipboardHandler(SettingsService settings) => _settings = settings; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var items = new List(); + + // 빌트인 변환 목록 + var builtins = GetBuiltinTransformers() + .Where(t => string.IsNullOrEmpty(query) || + t.Key.Contains(query, StringComparison.OrdinalIgnoreCase)); + + foreach (var t in builtins) + items.Add(new LauncherItem(t.Key, t.Description ?? "", null, t, Symbol: Symbols.Clipboard)); + + // 사용자 정의 변환 + var custom = _settings.Settings.ClipboardTransformers + .Where(t => string.IsNullOrEmpty(query) || + t.Key.Contains(query, StringComparison.OrdinalIgnoreCase)) + .Select(t => new LauncherItem(t.Key, t.Description ?? t.Type, null, t, Symbol: Symbols.Clipboard)); + + items.AddRange(custom); + + return Task.FromResult>(items); + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not ClipboardTransformer transformer) return; + + // 클립보드에서 텍스트 읽기 (STA 스레드 필요) + string? input = null; + Application.Current.Dispatcher.Invoke(() => + { + input = Clipboard.ContainsText() ? Clipboard.GetText() : null; + }); + + if (input == null) return; + + string? result = await TransformAsync(transformer, input, ct); + if (result == null) return; + + // 결과를 클립보드에 쓰고 이전 활성 창으로 포커스 복원 후 붙여넣기 + Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(result)); + + // 런처 호출 전 활성 창으로 포커스 복원 + var prevHwnd = WindowTracker.PreviousWindow; + if (prevHwnd != IntPtr.Zero) + SetForegroundWindow(prevHwnd); + + await Task.Delay(120, ct); + System.Windows.Forms.SendKeys.SendWait("^v"); + + LogService.Info($"클립보드 변환: '{transformer.Key}' 적용"); + } + + private static async Task TransformAsync(ClipboardTransformer t, string input, CancellationToken ct) + { + try + { + return t.Type switch + { + // ReDoS 방지: 사용자 정의 패턴에 타임아웃 적용 + "regex" when t.Pattern != null && t.Replace != null => + Regex.Replace(input, t.Pattern, t.Replace, RegexOptions.None, + TimeSpan.FromMilliseconds(t.Timeout > 0 ? t.Timeout : 5000)), + "script" when t.Command != null => + await RunScriptAsync(t.Command, input, t.Timeout, ct), + _ => ExecuteBuiltin(t.Key, input) + }; + } + catch (Exception ex) + { + LogService.Error($"변환 실패 ({t.Key}): {ex.Message}"); + return null; + } + } + + private static async Task RunScriptAsync(string command, string input, int timeoutMs, CancellationToken ct) + { + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(timeoutMs); + + var parts = command.Split(' ', 2); + var psi = new ProcessStartInfo(parts[0]) + { + Arguments = parts.Length > 1 ? parts[1] : "", + RedirectStandardInput = true, + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true, + StandardInputEncoding = Encoding.UTF8, + StandardOutputEncoding = Encoding.UTF8 + }; + + using var proc = Process.Start(psi)!; + await proc.StandardInput.WriteAsync(input); + proc.StandardInput.Close(); + return await proc.StandardOutput.ReadToEndAsync(cts.Token); + } + + // ─── 빌트인 변환 ───────────────────────────────────────────────────────── + + internal static string? ExecuteBuiltin(string key, string input) + { + return key switch + { + "$json" => FormatJson(input), + "$upper" => input.ToUpperInvariant(), + "$lower" => input.ToLowerInvariant(), + "$ts" => TryParseTimestamp(input), + "$epoch" => TryParseDate(input), + "$urle" => Uri.EscapeDataString(input), + "$urld" => Uri.UnescapeDataString(input), + "$b64e" => Convert.ToBase64String(Encoding.UTF8.GetBytes(input)), + "$b64d" => Encoding.UTF8.GetString(Convert.FromBase64String(input)), + "$md" => StripMarkdown(input), + "$trim" => input.Trim(), + "$lines" => string.Join(Environment.NewLine, input.Split('\n').Select(l => l.Trim()).Where(l => l.Length > 0)), + _ => null + }; + } + + private static string FormatJson(string input) + { + try + { + var doc = JsonDocument.Parse(input); + return JsonSerializer.Serialize(doc, new JsonSerializerOptions { WriteIndented = true }); + } + catch (Exception) { return input; } + } + + private static string? TryParseTimestamp(string input) + { + if (long.TryParse(input.Trim(), out var ts)) + { + var dt = DateTimeOffset.FromUnixTimeSeconds(ts).LocalDateTime; + return dt.ToString("yyyy-MM-dd HH:mm:ss"); + } + return null; + } + + private static string? TryParseDate(string input) + { + if (DateTime.TryParse(input.Trim(), out var dt)) + return new DateTimeOffset(dt).ToUnixTimeSeconds().ToString(); + return null; + } + + private static string StripMarkdown(string input) => + Regex.Replace(input, @"(\*\*|__)(.*?)\1|(\*|_)(.*?)\3|`(.+?)`|#{1,6}\s*", "$2$4$5"); + + [DllImport("user32.dll")] + private static extern bool SetForegroundWindow(IntPtr hWnd); + + private static IEnumerable GetBuiltinTransformers() => + [ + new() { Key = "$json", Type = "builtin", Description = "JSON 포맷팅 (들여쓰기 적용)" }, + new() { Key = "$upper", Type = "builtin", Description = "대문자 변환" }, + new() { Key = "$lower", Type = "builtin", Description = "소문자 변환" }, + new() { Key = "$ts", Type = "builtin", Description = "유닉스 타임스탬프 → 날짜 문자열" }, + new() { Key = "$epoch", Type = "builtin", Description = "날짜 문자열 → 유닉스 타임스탬프" }, + new() { Key = "$urle", Type = "builtin", Description = "URL 인코딩" }, + new() { Key = "$urld", Type = "builtin", Description = "URL 디코딩" }, + new() { Key = "$b64e", Type = "builtin", Description = "Base64 인코딩" }, + new() { Key = "$b64d", Type = "builtin", Description = "Base64 디코딩" }, + new() { Key = "$md", Type = "builtin", Description = "마크다운 문법 제거" }, + new() { Key = "$trim", Type = "builtin", Description = "앞뒤 공백 제거" }, + new() { Key = "$lines", Type = "builtin", Description = "빈 줄 제거 및 각 줄 공백 정리" }, + ]; +} diff --git a/src/AxCopilot/Handlers/ClipboardHistoryHandler.cs b/src/AxCopilot/Handlers/ClipboardHistoryHandler.cs new file mode 100644 index 0000000..da3b2ae --- /dev/null +++ b/src/AxCopilot/Handlers/ClipboardHistoryHandler.cs @@ -0,0 +1,216 @@ +using System.Runtime.InteropServices; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 클립보드 히스토리 핸들러. "#" 프리픽스로 사용합니다. +/// 예: # (빈 쿼리) → 최근 클립보드 목록 +/// # hello → "hello"가 포함된 항목 필터 +/// +public class ClipboardHistoryHandler : IActionHandler +{ + private readonly ClipboardHistoryService _historyService; + + public string? Prefix => "#"; + + public PluginMetadata Metadata => new( + "ClipboardHistory", + "클립보드 히스토리 — # 뒤에 검색어 (또는 빈 입력으로 전체 보기)", + "1.0", + "AX"); + + public ClipboardHistoryHandler(ClipboardHistoryService historyService) + { + _historyService = historyService; + } + + // 카테고리 필터 프리픽스: #url, #코드, #경로 + private static readonly Dictionary CategoryFilters = new(StringComparer.OrdinalIgnoreCase) + { + { "url", "URL" }, { "코드", "코드" }, { "code", "코드" }, + { "경로", "경로" }, { "path", "경로" }, { "핀", "핀" }, { "pin", "핀" }, + }; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var history = _historyService.History; + + if (history.Count == 0) + { + return Task.FromResult>( + [ + new LauncherItem( + "클립보드 히스토리가 없습니다", + "텍스트를 복사하면 이 곳에 기록됩니다", + null, null, Symbol: Symbols.History) + ]); + } + + var q = query.Trim().ToLowerInvariant(); + + // 카테고리 필터 감지 (예: #url, #핀) + string? catFilter = null; + foreach (var (prefix, cat) in CategoryFilters) + { + if (q == prefix || q.StartsWith(prefix + " ")) + { + catFilter = cat; + q = q.Length > prefix.Length ? q[(prefix.Length + 1)..].Trim() : ""; + break; + } + } + + var filtered = history.AsEnumerable(); + + // 카테고리 필터 적용 + if (catFilter == "핀") + filtered = filtered.Where(e => e.IsPinned); + else if (catFilter != null) + filtered = filtered.Where(e => e.Category == catFilter); + + // 텍스트 검색 + if (!string.IsNullOrEmpty(q)) + filtered = filtered.Where(e => e.Preview.ToLowerInvariant().Contains(q)); + + // 핀 항목을 상단에 배치 + var sorted = filtered + .OrderByDescending(e => e.IsPinned) + .ThenByDescending(e => e.CopiedAt); + + var items = sorted + .Select(e => + { + var pinMark = e.IsPinned ? "\uD83D\uDCCC " : ""; + var catMark = e.Category != "일반" ? $"[{e.Category}] " : ""; + return new LauncherItem( + $"{pinMark}{e.Preview}", + $"{catMark}{e.RelativeTime} · {e.CopiedAt:MM/dd HH:mm}", + null, + e, + Symbol: e.IsPinned ? Symbols.Favorite : (e.IsText ? Symbols.History : Symbols.Picture)); + }) + .ToList(); + + if (items.Count == 0) + { + items.Add(new LauncherItem( + $"'{query}'에 해당하는 항목 없음", + "#pin #url #코드 #경로 로 필터링 가능", + null, null, Symbol: Symbols.History)); + } + + return Task.FromResult>(items); + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not ClipboardEntry entry) return; + + try + { + _historyService.SuppressNextCapture(); + _historyService.PromoteEntry(entry); // 사용 시각 갱신 + 목록 맨 위로 + + if (!entry.IsText && entry.Image != null) + { + // 원본 이미지가 있으면 원본 해상도로 클립보드 복사 + var originalImg = ClipboardHistoryService.LoadOriginalImage(entry.OriginalImagePath); + Clipboard.SetImage(originalImg ?? entry.Image); + return; // 이미지는 붙여넣기 시뮬레이션 없이 클립보드만 설정 + } + + if (string.IsNullOrEmpty(entry.Text)) return; + Clipboard.SetText(entry.Text); + + var prevWindow = WindowTracker.PreviousWindow; + if (prevWindow == IntPtr.Zero) return; + + // ── 이전 창 포커스 복원 후 Ctrl+V ──────────────────────────────── + // 런처 창이 완전히 숨겨지고 이전 창이 포커스를 회복할 시간 확보 + await Task.Delay(300, ct); + + // AttachThreadInput으로 포그라운드 전환 권한 획득 후 SetForegroundWindow 호출 + // (Alt 트릭 대비: Alt 키 주입 없이 안정적으로 전환, 대상 앱 메뉴 트리거 방지) + var targetThread = GetWindowThreadProcessId(prevWindow, out _); + var currentThread = GetCurrentThreadId(); + AttachThreadInput(currentThread, targetThread, true); + SetForegroundWindow(prevWindow); + AttachThreadInput(currentThread, targetThread, false); + + // 포커스 전환이 완전히 반영될 때까지 대기 + await Task.Delay(100, ct); + + // SendInput으로 Ctrl+V 주입 + // Win32 INPUT 구조체: type(4) + 패딩(4) + union(32) = 40 bytes on x64 + // KEYBDINPUT.dwExtraInfo = ULONG_PTR → union 8바이트 정렬 필요 → offset 8에서 시작 + SendCtrlV(); + } + catch (OperationCanceledException) { } + catch (Exception ex) + { + LogService.Warn($"클립보드 히스토리 붙여넣기 실패: {ex.Message}"); + } + } + + private static void SendCtrlV() + { + const uint INPUT_KEYBOARD = 1; + const uint KEYEVENTF_KEYUP = 0x0002; + const ushort VK_CONTROL = 0x11; + const ushort VK_V = 0x56; + + var inputs = new INPUT[4]; + + // Ctrl 누름 + inputs[0].Type = INPUT_KEYBOARD; + inputs[0].ki.wVk = VK_CONTROL; + + // V 누름 + inputs[1].Type = INPUT_KEYBOARD; + inputs[1].ki.wVk = VK_V; + + // V 뗌 + inputs[2].Type = INPUT_KEYBOARD; + inputs[2].ki.wVk = VK_V; + inputs[2].ki.dwFlags = KEYEVENTF_KEYUP; + + // Ctrl 뗌 + inputs[3].Type = INPUT_KEYBOARD; + inputs[3].ki.wVk = VK_CONTROL; + inputs[3].ki.dwFlags = KEYEVENTF_KEYUP; + + SendInput((uint)inputs.Length, inputs, Marshal.SizeOf()); + } + + // ─── P/Invoke ────────────────────────────────────────────────────────── + + // Win32 INPUT 구조체 — x64에서 40바이트 + // type(4) + 패딩(4) + union은 offset 8에서 시작 (MOUSEINPUT 32바이트가 최대) + [StructLayout(LayoutKind.Explicit, Size = 40)] + private struct INPUT + { + [FieldOffset(0)] public uint Type; + [FieldOffset(8)] public KEYBDINPUT ki; + } + + // KEYBDINPUT: 2+2+4+4 = 12, dwExtraInfo(IntPtr)는 8바이트 정렬 → 패딩 포함 24바이트 + [StructLayout(LayoutKind.Sequential)] + private struct KEYBDINPUT + { + public ushort wVk; + public ushort wScan; + public uint dwFlags; + public uint time; + public IntPtr dwExtraInfo; + } + + [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); + [DllImport("user32.dll")] private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); + [DllImport("user32.dll")] private static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, [MarshalAs(UnmanagedType.Bool)] bool fAttach); + [DllImport("kernel32.dll")] private static extern uint GetCurrentThreadId(); + [DllImport("user32.dll")] private static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray)] INPUT[] pInputs, int cbSize); +} diff --git a/src/AxCopilot/Handlers/ClipboardPipeHandler.cs b/src/AxCopilot/Handlers/ClipboardPipeHandler.cs new file mode 100644 index 0000000..c57d516 --- /dev/null +++ b/src/AxCopilot/Handlers/ClipboardPipeHandler.cs @@ -0,0 +1,151 @@ +using System.Text; +using System.Text.RegularExpressions; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 클립보드 파이프라인 핸들러. "pipe" 프리픽스로 사용합니다. +/// 여러 변환을 체이닝하여 클립보드 텍스트를 한 번에 처리합니다. +/// 예: pipe upper > trim > b64e → 대문자 → 공백제거 → Base64 인코딩 +/// pipe sort > unique > number → 정렬 → 중복제거 → 줄번호 +/// pipe → 사용 가능한 필터 목록 +/// Enter → 변환 결과를 클립보드에 복사. +/// +public class ClipboardPipeHandler : IActionHandler +{ + public string? Prefix => "pipe"; + + public PluginMetadata Metadata => new( + "ClipboardPipe", + "클립보드 파이프라인 — pipe", + "1.0", + "AX"); + + private static readonly Dictionary Fn)> Filters = new(StringComparer.OrdinalIgnoreCase) + { + ["upper"] = ("대문자 변환", s => s.ToUpperInvariant()), + ["lower"] = ("소문자 변환", s => s.ToLowerInvariant()), + ["trim"] = ("앞뒤 공백 제거", s => s.Trim()), + ["trimall"] = ("모든 공백 제거", s => Regex.Replace(s, @"\s+", "", RegexOptions.None, TimeSpan.FromSeconds(1))), + ["sort"] = ("줄 정렬 (오름차순)", s => string.Join("\n", s.Split('\n').Order())), + ["sortd"] = ("줄 정렬 (내림차순)", s => string.Join("\n", s.Split('\n').OrderDescending())), + ["unique"] = ("중복 줄 제거", s => string.Join("\n", s.Split('\n').Distinct())), + ["reverse"] = ("줄 순서 뒤집기", s => string.Join("\n", s.Split('\n').Reverse())), + ["number"] = ("줄번호 추가", s => string.Join("\n", s.Split('\n').Select((l, i) => $"{i + 1}. {l}"))), + ["quote"] = ("각 줄 따옴표 감싸기", s => string.Join("\n", s.Split('\n').Select(l => $"\"{l}\""))), + ["b64e"] = ("Base64 인코딩", s => Convert.ToBase64String(Encoding.UTF8.GetBytes(s))), + ["b64d"] = ("Base64 디코딩", s => Encoding.UTF8.GetString(Convert.FromBase64String(s.Trim()))), + ["urle"] = ("URL 인코딩", s => Uri.EscapeDataString(s)), + ["urld"] = ("URL 디코딩", s => Uri.UnescapeDataString(s)), + ["md"] = ("마크다운 제거", s => Regex.Replace(s, @"[#*_`~\[\]()]", "", RegexOptions.None, TimeSpan.FromSeconds(1))), + ["lines"] = ("빈 줄 제거", s => string.Join("\n", s.Split('\n').Where(l => !string.IsNullOrWhiteSpace(l)))), + ["count"] = ("글자/단어/줄 수", s => $"글자: {s.Length} 단어: {s.Split((char[])null!, StringSplitOptions.RemoveEmptyEntries).Length} 줄: {s.Split('\n').Length}"), + ["csv"] = ("CSV → 탭 변환", s => s.Replace(',', '\t')), + ["tab"] = ("탭 → CSV 변환", s => s.Replace('\t', ',')), + }; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + if (string.IsNullOrWhiteSpace(q)) + { + var items = Filters.Select(kv => new LauncherItem( + kv.Key, + kv.Value.Desc, + null, null, + Symbol: Symbols.Clipboard)).ToList(); + + items.Insert(0, new LauncherItem( + "클립보드 파이프라인", + "필터를 > 로 연결: pipe upper > trim > b64e", + null, null, Symbol: Symbols.Info)); + + return Task.FromResult>(items); + } + + // 파이프라인 파싱 + var steps = q.Split('>') + .Select(s => s.Trim()) + .Where(s => !string.IsNullOrEmpty(s)) + .ToArray(); + + // 유효성 검사 + var invalid = steps.Where(s => !Filters.ContainsKey(s)).ToArray(); + if (invalid.Length > 0) + { + return Task.FromResult>(new[] + { + new LauncherItem( + $"알 수 없는 필터: {string.Join(", ", invalid)}", + $"사용 가능: {string.Join(", ", Filters.Keys.Take(10))} ...", + null, null, Symbol: Symbols.Warning) + }.AsEnumerable()); + } + + // 클립보드 텍스트 읽기 + string? text = null; + try + { + if (Application.Current?.Dispatcher.Invoke(() => Clipboard.ContainsText()) == true) + text = Application.Current.Dispatcher.Invoke(() => Clipboard.GetText()); + } + catch (Exception) { } + + if (string.IsNullOrEmpty(text)) + { + return Task.FromResult>(new[] + { + new LauncherItem("클립보드에 텍스트가 없습니다", "텍스트를 복사한 후 시도하세요", + null, null, Symbol: Symbols.Warning) + }.AsEnumerable()); + } + + // 파이프라인 실행 + var result = text; + var desc = new List(); + try + { + foreach (var step in steps) + { + result = Filters[step].Fn(result); + desc.Add(Filters[step].Desc); + } + } + catch (Exception ex) + { + return Task.FromResult>(new[] + { + new LauncherItem($"파이프라인 실행 오류: {ex.Message}", "입력 데이터를 확인하세요", + null, null, Symbol: Symbols.Error) + }.AsEnumerable()); + } + + var preview = result.Length > 100 ? result[..97] + "…" : result; + preview = preview.Replace("\r\n", "↵ ").Replace("\n", "↵ "); + + return Task.FromResult>(new[] + { + new LauncherItem( + $"[{string.Join(" → ", steps)}] 결과 적용", + $"{preview} · Enter로 클립보드 복사", + null, result, + Symbol: Symbols.Clipboard) + }.AsEnumerable()); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text) + { + try { Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(text)); } + catch (Exception) { } + NotificationService.Notify("파이프라인 완료", "변환 결과가 클립보드에 복사되었습니다"); + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/ColorHandler.cs b/src/AxCopilot/Handlers/ColorHandler.cs new file mode 100644 index 0000000..43728a6 --- /dev/null +++ b/src/AxCopilot/Handlers/ColorHandler.cs @@ -0,0 +1,289 @@ +using AxCopilot.SDK; +using AxCopilot.Themes; +using System.Text.RegularExpressions; +using System.Windows; + +namespace AxCopilot.Handlers; + +/// +/// 색상 변환기 핸들러. "color" 프리픽스로 사용합니다. +/// 예: color #FF5500 → HEX / RGB / HSL 모두 표시 +/// color 255,85,0 → HEX 변환 +/// color red → 색상 이름 → HEX +/// color hsl(24,100%,50%) → HSL → HEX / RGB +/// +public class ColorHandler : IActionHandler +{ + public string? Prefix => "color"; + + public PluginMetadata Metadata => new( + "Color", + "색상 변환기 — color #FF5500 · color 255,85,0 · color red", + "1.0", + "AX"); + + // ─── 색상 이름 사전 ───────────────────────────────────────────────────── + private static readonly Dictionary _namedColors = new(StringComparer.OrdinalIgnoreCase) + { + ["red"] = "#FF0000", ["빨강"] = "#FF0000", ["빨간색"] = "#FF0000", + ["green"] = "#008000", ["초록"] = "#008000", ["초록색"] = "#008000", + ["blue"] = "#0000FF", ["파랑"] = "#0000FF", ["파란색"] = "#0000FF", + ["white"] = "#FFFFFF", ["흰색"] = "#FFFFFF", ["하양"] = "#FFFFFF", + ["black"] = "#000000", ["검정"] = "#000000", ["검은색"] = "#000000", + ["yellow"] = "#FFFF00", ["노랑"] = "#FFFF00", ["노란색"] = "#FFFF00", + ["orange"] = "#FFA500", ["주황"] = "#FFA500", ["주황색"] = "#FFA500", + ["purple"] = "#800080", ["보라"] = "#800080", ["보라색"] = "#800080", + ["pink"] = "#FFC0CB", ["분홍"] = "#FFC0CB", ["분홍색"] = "#FFC0CB", + ["hotpink"] = "#FF69B4", ["핫핑크"] = "#FF69B4", + ["cyan"] = "#00FFFF", ["시안"] = "#00FFFF", + ["magenta"] = "#FF00FF", ["마젠타"] = "#FF00FF", + ["brown"] = "#A52A2A", ["갈색"] = "#A52A2A", + ["gray"] = "#808080", ["grey"] = "#808080", ["회색"] = "#808080", ["회"] = "#808080", + ["silver"] = "#C0C0C0", ["은색"] = "#C0C0C0", + ["gold"] = "#FFD700", ["금색"] = "#FFD700", + ["navy"] = "#000080", ["남색"] = "#000080", + ["teal"] = "#008080", ["틸"] = "#008080", + ["lime"] = "#00FF00", ["라임"] = "#00FF00", + ["maroon"] = "#800000", ["밤색"] = "#800000", + ["olive"] = "#808000", ["올리브"] = "#808000", + ["coral"] = "#FF7F50", ["코랄"] = "#FF7F50", + ["salmon"] = "#FA8072", ["연어색"] = "#FA8072", + ["skyblue"] = "#87CEEB", ["하늘색"] = "#87CEEB", + ["lightblue"] = "#ADD8E6", ["연파랑"] = "#ADD8E6", + ["darkblue"] = "#00008B", ["진파랑"] = "#00008B", + ["darkgreen"] = "#006400", ["진초록"] = "#006400", + ["lightgreen"] = "#90EE90", ["연초록"] = "#90EE90", + ["indigo"] = "#4B0082", ["인디고"] = "#4B0082", + ["violet"] = "#EE82EE", ["바이올렛"] = "#EE82EE", + ["beige"] = "#F5F5DC", ["베이지"] = "#F5F5DC", + ["ivory"] = "#FFFFF0", ["아이보리"] = "#FFFFF0", + ["khaki"] = "#F0E68C", ["카키"] = "#F0E68C", + ["lavender"] = "#E6E6FA", ["라벤더"] = "#E6E6FA", + ["turquoise"] = "#40E0D0", ["터키옥"] = "#40E0D0", + ["chocolate"] = "#D2691E", ["초콜릿"] = "#D2691E", + ["crimson"] = "#DC143C", ["크림슨"] = "#DC143C", + ["transparent"] = "#00000000", + }; + + // ─── 정규식 ───────────────────────────────────────────────────────────── + private static readonly Regex _hexRe = new(@"^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$"); + private static readonly Regex _rgbRe = new(@"^(?:rgb\s*\()?\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)?$", RegexOptions.IgnoreCase); + private static readonly Regex _rgbaRe = new(@"^rgba\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*([\d.]+)\s*\)$", RegexOptions.IgnoreCase); + private static readonly Regex _hslRe = new(@"^hsl\s*\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?\s*\)$", RegexOptions.IgnoreCase); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(query)) + { + return Task.FromResult>( + [ + new LauncherItem( + "색상 코드를 입력하세요", + "예: #FF5500 · 255,85,0 · red · hsl(20,100%,50%)", + null, null, Symbol: Symbols.ColorPicker) + ]); + } + + var q = query.Trim(); + var items = new List(); + + // HEX 형식 + if (_hexRe.IsMatch(q)) + { + var hex = q.TrimStart('#'); + if (hex.Length == 3) + hex = $"{hex[0]}{hex[0]}{hex[1]}{hex[1]}{hex[2]}{hex[2]}"; + + int r, g, b; + byte a = 255; + + if (hex.Length == 8) + { + a = Convert.ToByte(hex[..2], 16); + r = Convert.ToInt32(hex[2..4], 16); + g = Convert.ToInt32(hex[4..6], 16); + b = Convert.ToInt32(hex[6..8], 16); + } + else + { + r = Convert.ToInt32(hex[..2], 16); + g = Convert.ToInt32(hex[2..4], 16); + b = Convert.ToInt32(hex[4..6], 16); + } + + AddColorItems(items, r, g, b, a, $"#{hex.ToUpperInvariant()}"); + return Task.FromResult>(items); + } + + // RGB 형식 + var rgbM = _rgbRe.Match(q); + if (rgbM.Success) + { + int r = int.Parse(rgbM.Groups[1].Value); + int g = int.Parse(rgbM.Groups[2].Value); + int b = int.Parse(rgbM.Groups[3].Value); + if (r <= 255 && g <= 255 && b <= 255) + { + AddColorItems(items, r, g, b, 255, $"rgb({r},{g},{b})"); + return Task.FromResult>(items); + } + } + + // RGBA 형식 + var rgbaM = _rgbaRe.Match(q); + if (rgbaM.Success) + { + int r = int.Parse(rgbaM.Groups[1].Value); + int g = int.Parse(rgbaM.Groups[2].Value); + int b = int.Parse(rgbaM.Groups[3].Value); + double aD = double.Parse(rgbaM.Groups[4].Value, System.Globalization.CultureInfo.InvariantCulture); + byte a = (byte)Math.Clamp((int)(aD * 255), 0, 255); + if (r <= 255 && g <= 255 && b <= 255) + { + AddColorItems(items, r, g, b, a, $"rgba({r},{g},{b},{aD:G3})"); + return Task.FromResult>(items); + } + } + + // HSL 형식 + var hslM = _hslRe.Match(q); + if (hslM.Success) + { + double h = double.Parse(hslM.Groups[1].Value, System.Globalization.CultureInfo.InvariantCulture); + double s = double.Parse(hslM.Groups[2].Value, System.Globalization.CultureInfo.InvariantCulture) / 100; + double l = double.Parse(hslM.Groups[3].Value, System.Globalization.CultureInfo.InvariantCulture) / 100; + var (r, g, b) = HslToRgb(h, s, l); + AddColorItems(items, r, g, b, 255, $"hsl({h:G},{s*100:G}%,{l*100:G}%)"); + return Task.FromResult>(items); + } + + // 색상 이름 + if (_namedColors.TryGetValue(q, out var namedHex)) + { + var hex = namedHex.TrimStart('#'); + int r = Convert.ToInt32(hex[..2], 16); + int g = Convert.ToInt32(hex[2..4], 16); + int b = Convert.ToInt32(hex[4..6], 16); + AddColorItems(items, r, g, b, 255, namedHex.ToUpperInvariant()); + return Task.FromResult>(items); + } + + // 검색 모드 (일부 색상 이름 검색) + var searchQ = q.ToLowerInvariant(); + var matched = _namedColors + .Where(kv => kv.Key.Contains(searchQ, StringComparison.OrdinalIgnoreCase)) + .Take(8); + foreach (var kv in matched) + { + items.Add(new LauncherItem( + $"{kv.Key} → {kv.Value.ToUpperInvariant()}", + "Enter로 HEX 복사", + null, kv.Value.ToUpperInvariant(), Symbol: Symbols.ColorPicker)); + } + + if (!items.Any()) + { + items.Add(new LauncherItem( + "인식할 수 없는 색상", + "#RRGGBB · RGB(r,g,b) · hsl(h,s%,l%) · red 등 색상 이름", + null, null, Symbol: Symbols.Error)); + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string value) + try { Clipboard.SetText(value); } catch (Exception) { } + return Task.CompletedTask; + } + + // ─── 색상 항목 생성 ────────────────────────────────────────────────────── + + private static void AddColorItems(List items, int r, int g, int b, byte a, string source) + { + var hex = a == 255 + ? $"#{r:X2}{g:X2}{b:X2}" + : $"#{a:X2}{r:X2}{g:X2}{b:X2}"; + var rgb = a == 255 + ? $"rgb({r}, {g}, {b})" + : $"rgba({r}, {g}, {b}, {a / 255.0:G3})"; + var (h, s, l) = RgbToHsl(r, g, b); + var hsl = $"hsl({h:G3}, {s * 100:G3}%, {l * 100:G3}%)"; + var (hh, sv, v) = RgbToHsv(r, g, b); + var hsv = $"hsv({hh:G3}, {sv * 100:G3}%, {v * 100:G3}%)"; + + items.Add(new LauncherItem($"HEX → {hex.ToUpperInvariant()}", $"{source} · Enter로 복사", null, hex.ToUpperInvariant(), Symbol: Symbols.ColorPicker)); + items.Add(new LauncherItem($"RGB → {rgb}", $"{source} · Enter로 복사", null, rgb, Symbol: Symbols.ColorPicker)); + items.Add(new LauncherItem($"HSL → {hsl}", $"{source} · Enter로 복사", null, hsl, Symbol: Symbols.ColorPicker)); + items.Add(new LauncherItem($"HSV → {hsv}", $"{source} · Enter로 복사", null, hsv, Symbol: Symbols.ColorPicker)); + } + + // ─── 색상 공간 변환 ─────────────────────────────────────────────────────── + + private static (double h, double s, double l) RgbToHsl(int r, int g, int b) + { + double rf = r / 255.0, gf = g / 255.0, bf = b / 255.0; + double max = Math.Max(rf, Math.Max(gf, bf)); + double min = Math.Min(rf, Math.Min(gf, bf)); + double l = (max + min) / 2; + double h = 0, s = 0; + + if (max != min) + { + double d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + h = max == rf ? (gf - bf) / d + (gf < bf ? 6 : 0) + : max == gf ? (bf - rf) / d + 2 + : (rf - gf) / d + 4; + h /= 6; + } + return (Math.Round(h * 360, 1), Math.Round(s, 4), Math.Round(l, 4)); + } + + private static (double h, double s, double v) RgbToHsv(int r, int g, int b) + { + double rf = r / 255.0, gf = g / 255.0, bf = b / 255.0; + double max = Math.Max(rf, Math.Max(gf, bf)); + double min = Math.Min(rf, Math.Min(gf, bf)); + double v = max, s = 0, h = 0; + double d = max - min; + + if (max != 0) s = d / max; + if (d != 0) + { + h = max == rf ? (gf - bf) / d + (gf < bf ? 6 : 0) + : max == gf ? (bf - rf) / d + 2 + : (rf - gf) / d + 4; + h /= 6; + } + return (Math.Round(h * 360, 1), Math.Round(s, 4), Math.Round(v, 4)); + } + + private static (int r, int g, int b) HslToRgb(double h, double s, double l) + { + double r, g, b; + if (s == 0) { r = g = b = l; } + else + { + double q = l < 0.5 ? l * (1 + s) : l + s - l * s; + double p = 2 * l - q; + h /= 360; + r = Hue2Rgb(p, q, h + 1.0 / 3); + g = Hue2Rgb(p, q, h); + b = Hue2Rgb(p, q, h - 1.0 / 3); + } + return ((int)Math.Round(r * 255), (int)Math.Round(g * 255), (int)Math.Round(b * 255)); + } + + private static double Hue2Rgb(double p, double q, double t) + { + if (t < 0) t += 1; + if (t > 1) t -= 1; + if (t < 1.0 / 6) return p + (q - p) * 6 * t; + if (t < 1.0 / 2) return q; + if (t < 2.0 / 3) return p + (q - p) * (2.0 / 3 - t) * 6; + return p; + } +} diff --git a/src/AxCopilot/Handlers/ColorPickHandler.cs b/src/AxCopilot/Handlers/ColorPickHandler.cs new file mode 100644 index 0000000..f625c24 --- /dev/null +++ b/src/AxCopilot/Handlers/ColorPickHandler.cs @@ -0,0 +1,59 @@ +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 스포이드 색상 추출 핸들러. "pick" 프리픽스로 사용합니다. +/// 실행하면 전체 화면 스포이드 모드에 진입하고, +/// 클릭한 지점의 색상을 HEX 코드로 클립보드에 복사합니다. +/// 반투명 결과 창이 5초간 표시됩니다. +/// 예: pick → 스포이드 모드 진입 +/// +public class ColorPickHandler : IActionHandler +{ + public string? Prefix => "pick"; + + public PluginMetadata Metadata => new( + "ColorPick", + "스포이드 색상 추출 — pick", + "1.0", + "AX"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + return Task.FromResult>( + [ + new LauncherItem( + "스포이드로 화면 색상 추출", + "Enter → 스포이드 모드 진입 · 화면 아무 곳을 클릭하면 색상 코드 추출 · Esc 취소", + null, "__PICK__", + Symbol: Symbols.ColorPicker) + ]); + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not string s || s != "__PICK__") return; + + // 런처가 닫히는 동안 대기 + await Task.Delay(200, ct); + + Application.Current?.Dispatcher.Invoke(() => + { + var dropper = new Views.EyeDropperWindow(); + dropper.ShowDialog(); + + if (dropper.PickedColor.HasValue) + { + var result = new Views.ColorPickResultWindow( + dropper.PickedColor.Value, + dropper.PickX, + dropper.PickY); + result.Show(); + } + }); + } +} diff --git a/src/AxCopilot/Handlers/DateCalcHandler.cs b/src/AxCopilot/Handlers/DateCalcHandler.cs new file mode 100644 index 0000000..6dacb49 --- /dev/null +++ b/src/AxCopilot/Handlers/DateCalcHandler.cs @@ -0,0 +1,128 @@ +using System.Globalization; +using System.Text.RegularExpressions; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 날짜/시간 변환기 핸들러. "date" 프리픽스로 사용합니다. +/// 예: date → 현재 날짜/시간 + 유닉스 타임스탬프 +/// date +30d → 오늘 + 30일 +/// date -100d → 오늘 - 100일 +/// date 2026-12-25 → 해당 날짜까지 D-day + 요일 +/// date 1711584000 → 유닉스 타임스탬프 → 날짜 +/// date to unix → 현재 시각의 유닉스 타임스탬프 +/// Enter → 결과를 클립보드에 복사. +/// +public class DateCalcHandler : IActionHandler +{ + public string? Prefix => "date"; + + public PluginMetadata Metadata => new( + "DateCalc", + "날짜 계산 · D-day · 타임스탬프 변환", + "1.0", + "AX"); + + private static readonly string[] DateFormats = + ["yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMdd", "MM/dd/yyyy", "dd-MM-yyyy"]; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + var now = DateTime.Now; + var items = new List(); + + if (string.IsNullOrWhiteSpace(q)) + { + // 현재 날짜/시간 정보 + var dayName = now.ToString("dddd", new CultureInfo("ko-KR")); + items.Add(Item($"{now:yyyy-MM-dd} ({dayName})", $"{now:HH:mm:ss} · {now:yyyy-MM-dd}")); + items.Add(Item($"유닉스 타임스탬프: {new DateTimeOffset(now).ToUnixTimeSeconds()}", "현재 시각의 Unix epoch")); + items.Add(Item($"올해 {now.DayOfYear}일째 / 남은 일: {(new DateTime(now.Year, 12, 31) - now).Days}일", + $"ISO 주차: {ISOWeek.GetWeekOfYear(now)}주")); + return Task.FromResult>(items); + } + + // +30d / -100d 패턴 + var offsetMatch = Regex.Match(q, @"^([+-])(\d+)([dDwWmMyY])$"); + if (offsetMatch.Success) + { + var sign = offsetMatch.Groups[1].Value == "+" ? 1 : -1; + var val = int.Parse(offsetMatch.Groups[2].Value) * sign; + var unit = offsetMatch.Groups[3].Value.ToLowerInvariant(); + var target = unit switch + { + "d" => now.AddDays(val), + "w" => now.AddDays(val * 7), + "m" => now.AddMonths(val), + "y" => now.AddYears(val), + _ => now + }; + var dayName = target.ToString("dddd", new CultureInfo("ko-KR")); + var diff = (target.Date - now.Date).Days; + var diffStr = diff >= 0 ? $"오늘로부터 {diff}일 후" : $"오늘로부터 {Math.Abs(diff)}일 전"; + + items.Add(Item($"{target:yyyy-MM-dd} ({dayName})", diffStr)); + return Task.FromResult>(items); + } + + // 유닉스 타임스탬프 (10자리 또는 13자리 숫자) + if (Regex.IsMatch(q, @"^\d{10,13}$") && long.TryParse(q, out long epoch)) + { + var ts = epoch > 9_999_999_999 ? epoch / 1000 : epoch; // 밀리초→초 + var dt = DateTimeOffset.FromUnixTimeSeconds(ts).LocalDateTime; + var dayName = dt.ToString("dddd", new CultureInfo("ko-KR")); + items.Add(Item($"{dt:yyyy-MM-dd HH:mm:ss} ({dayName})", $"Unix {epoch} → 로컬 시간")); + return Task.FromResult>(items); + } + + // "to unix" / "unix" 키워드 + if (q.Equals("unix", StringComparison.OrdinalIgnoreCase) || + q.Equals("to unix", StringComparison.OrdinalIgnoreCase)) + { + var unix = new DateTimeOffset(now).ToUnixTimeSeconds(); + items.Add(Item($"{unix}", $"현재 시각 ({now:yyyy-MM-dd HH:mm:ss}) → Unix 타임스탬프")); + return Task.FromResult>(items); + } + + // 날짜 파싱 → D-day 계산 + if (DateTime.TryParseExact(q, DateFormats, CultureInfo.InvariantCulture, + DateTimeStyles.None, out var parsed)) + { + var dayName = parsed.ToString("dddd", new CultureInfo("ko-KR")); + var diff = (parsed.Date - now.Date).Days; + var dday = diff switch + { + 0 => "오늘", + > 0 => $"D-{diff} (앞으로 {diff}일)", + _ => $"D+{Math.Abs(diff)} ({Math.Abs(diff)}일 지남)" + }; + + items.Add(Item($"{parsed:yyyy-MM-dd} ({dayName})", dday)); + return Task.FromResult>(items); + } + + items.Add(new LauncherItem( + "날짜 형식을 인식할 수 없습니다", + "예: +30d, -100d, 2026-12-25, 1711584000, unix", + null, null, Symbol: Symbols.Warning)); + + return Task.FromResult>(items); + } + + private static LauncherItem Item(string title, string subtitle) => + new(title, $"{subtitle} · Enter로 복사", null, title, Symbol: Symbols.Clock); + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text && !string.IsNullOrWhiteSpace(text)) + { + try { Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(text)); } + catch (Exception) { } + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/DiffHandler.cs b/src/AxCopilot/Handlers/DiffHandler.cs new file mode 100644 index 0000000..c9bfdc7 --- /dev/null +++ b/src/AxCopilot/Handlers/DiffHandler.cs @@ -0,0 +1,245 @@ +using System.IO; +using System.Text; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 텍스트/파일 비교 핸들러. "diff" 프리픽스로 사용합니다. +/// 클립보드 히스토리의 최근 2개 텍스트를 줄 단위로 비교하거나, +/// 파일 2개를 지정하여 비교합니다. +/// 예: diff → 클립보드 히스토리 최근 2개 비교 +/// diff C:\a.txt C:\b.txt → 파일 비교 +/// Enter → 비교 결과를 클립보드에 복사. +/// +public class DiffHandler : IActionHandler +{ + private readonly ClipboardHistoryService? _clipHistory; + + public DiffHandler(ClipboardHistoryService? clipHistory = null) + { + _clipHistory = clipHistory; + } + + public string? Prefix => "diff"; + + public PluginMetadata Metadata => new( + "Diff", + "텍스트/파일 비교 — diff", + "1.0", + "AX"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + // 파일 비교 모드 + if (!string.IsNullOrWhiteSpace(q)) + { + // 파일 2개 지정 + var paths = q.Split(' ', 2, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); + if (paths.Length == 2 && File.Exists(paths[0]) && File.Exists(paths[1])) + { + try + { + var textA = File.ReadAllText(paths[0]); + var textB = File.ReadAllText(paths[1]); + var result = BuildDiff(textA, textB, + Path.GetFileName(paths[0]), Path.GetFileName(paths[1])); + + return Task.FromResult>( + [ + new LauncherItem( + $"파일 비교: {Path.GetFileName(paths[0])} ↔ {Path.GetFileName(paths[1])}", + $"{result.Added}줄 추가, {result.Removed}줄 삭제, {result.Same}줄 동일 · Enter로 결과 복사", + null, result.Text, + Symbol: Symbols.File) + ]); + } + catch (Exception ex) + { + return Task.FromResult>( + [ + new LauncherItem($"파일 읽기 실패: {ex.Message}", "", + null, null, Symbol: Symbols.Error) + ]); + } + } + + // 파일 1개만 있으면 안내 + if (paths.Length >= 1 && (File.Exists(paths[0]) || Directory.Exists(Path.GetDirectoryName(paths[0]) ?? ""))) + { + return Task.FromResult>( + [ + new LauncherItem( + "비교할 파일 2개의 경로를 입력하세요", + "예: diff C:\\a.txt C:\\b.txt", + null, null, Symbol: Symbols.Info) + ]); + } + } + + // 클립보드 히스토리 비교 모드 + var history = _clipHistory?.History; + if (history == null || history.Count < 2) + { + return Task.FromResult>( + [ + new LauncherItem( + "비교할 텍스트가 부족합니다", + "클립보드에 2개 이상의 텍스트를 복사하거나, diff [파일A] [파일B]로 파일 비교", + null, null, Symbol: Symbols.Info) + ]); + } + + var textEntries = history.Where(e => e.IsText).Take(2).ToList(); + if (textEntries.Count < 2) + { + return Task.FromResult>( + [ + new LauncherItem("텍스트 히스토리가 2개 미만입니다", "텍스트를 2번 이상 복사하세요", + null, null, Symbol: Symbols.Info) + ]); + } + + var older = textEntries[1]; // 이전 + var newer = textEntries[0]; // 최근 + var diff = BuildDiff(older.Text, newer.Text, + $"이전 ({older.RelativeTime})", $"최근 ({newer.RelativeTime})"); + + var items = new List + { + new( + $"클립보드 비교: +{diff.Added} -{diff.Removed} ={diff.Same}", + $"이전 복사 ↔ 최근 복사 · Enter로 결과 복사", + null, diff.Text, + Symbol: Symbols.History), + }; + + // 미리보기 (변경된 줄 최대 5개) + var changedLines = diff.Text.Split('\n') + .Where(l => l.StartsWith("+ ") || l.StartsWith("- ")) + .Take(5); + + foreach (var line in changedLines) + { + var symbol = line.StartsWith("+ ") ? "\uE710" : "\uE711"; // + or X + items.Add(new LauncherItem( + line, + "", + null, null, + Symbol: symbol)); + } + + // 파일 선택 비교 항목 + items.Add(new LauncherItem( + "파일 선택하여 비교", + "파일 선택 대화 상자에서 2개의 파일을 골라 비교합니다", + null, "__FILE_DIALOG__", + Symbol: Symbols.File)); + + return Task.FromResult>(items); + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + // 파일 선택 다이얼로그 + if (item.Data is string s && s == "__FILE_DIALOG__") + { + await Task.Delay(200, ct); // 런처 닫힘 대기 + Application.Current?.Dispatcher.Invoke(() => + { + var dlg = new Microsoft.Win32.OpenFileDialog + { + Title = "비교할 첫 번째 파일 선택", + Filter = "텍스트 파일|*.txt;*.cs;*.json;*.xml;*.md;*.csv;*.log|모든 파일|*.*" + }; + if (dlg.ShowDialog() != true) return; + var fileA = dlg.FileName; + + dlg.Title = "비교할 두 번째 파일 선택"; + if (dlg.ShowDialog() != true) return; + var fileB = dlg.FileName; + + try + { + var textA = File.ReadAllText(fileA); + var textB = File.ReadAllText(fileB); + var result = BuildDiff(textA, textB, + Path.GetFileName(fileA), Path.GetFileName(fileB)); + + Clipboard.SetText(result.Text); + NotificationService.Notify("파일 비교 완료", + $"+{result.Added} -{result.Removed} ={result.Same} · 결과 클립보드 복사됨"); + } + catch (Exception ex) + { + NotificationService.Notify("비교 실패", ex.Message); + } + }); + return; + } + + if (item.Data is string text && !string.IsNullOrWhiteSpace(text)) + { + try { Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(text)); } + catch (Exception) { } + NotificationService.Notify("비교 결과", "클립보드에 복사되었습니다"); + } + } + + // 간단한 줄 단위 diff + private static DiffResult BuildDiff(string textA, string textB, string labelA, string labelB) + { + var linesA = textA.Split('\n').Select(l => l.TrimEnd('\r')).ToArray(); + var linesB = textB.Split('\n').Select(l => l.TrimEnd('\r')).ToArray(); + + var setA = new HashSet(linesA); + var setB = new HashSet(linesB); + + var sb = new StringBuilder(); + sb.AppendLine($"--- {labelA}"); + sb.AppendLine($"+++ {labelB}"); + sb.AppendLine(); + + int added = 0, removed = 0, same = 0; + int maxLen = Math.Max(linesA.Length, linesB.Length); + + for (int i = 0; i < maxLen; i++) + { + var a = i < linesA.Length ? linesA[i] : null; + var b = i < linesB.Length ? linesB[i] : null; + + if (a == b) + { + sb.AppendLine($" {a}"); + same++; + } + else + { + if (a != null && !setB.Contains(a)) + { + sb.AppendLine($"- {a}"); + removed++; + } + if (b != null && !setA.Contains(b)) + { + sb.AppendLine($"+ {b}"); + added++; + } + if (a != null && setB.Contains(a) && a != b) + { + sb.AppendLine($" {a}"); + same++; + } + } + } + + return new DiffResult(sb.ToString(), added, removed, same); + } + + private record DiffResult(string Text, int Added, int Removed, int Same); +} diff --git a/src/AxCopilot/Handlers/EmojiHandler.cs b/src/AxCopilot/Handlers/EmojiHandler.cs new file mode 100644 index 0000000..5548f68 --- /dev/null +++ b/src/AxCopilot/Handlers/EmojiHandler.cs @@ -0,0 +1,553 @@ +using AxCopilot.SDK; +using AxCopilot.Themes; +using System.Windows; + +namespace AxCopilot.Handlers; + +/// +/// 이모지 피커 핸들러. "emoji" 프리픽스로 사용합니다. +/// 예: emoji 하트 → ❤️ 검색 +/// emoji wave → 👋 검색 +/// emoji → 자주 쓰는 이모지 목록 +/// +public class EmojiHandler : IActionHandler +{ + public string? Prefix => "emoji"; + + public PluginMetadata Metadata => new( + "Emoji", + "이모지 피커 — emoji 뒤에 이름 입력", + "1.0", + "AX"); + + // ─── 이모지 데이터베이스 (이모지, 이름(한/영), 태그) ────────────────────── + private static readonly (string Emoji, string Name, string Tags)[] _emojis = + { + // 표정 / 감정 + ("😀", "크게 웃는 얼굴", "smile happy grin 웃음 행복"), + ("😃", "웃는 얼굴", "smile happy joy 웃음"), + ("😄", "눈 웃음", "smile laugh 웃음 기쁨"), + ("😁", "히죽 웃음", "grin beam 씩 웃다"), + ("😆", "크게 웃음", "laughing 폭소"), + ("😅", "식은땀 웃음", "sweat smile 안도"), + ("🤣", "바닥 구르며 웃음", "rofl lol 빵 웃음"), + ("😂", "눈물 나게 웃음", "joy tears laugh 폭소"), + ("🙂", "살짝 웃음", "slightly smiling 미소"), + ("🙃", "거꾸로 웃음", "upside down 뒤집힌"), + ("😉", "윙크", "wink 윙크"), + ("😊", "볼 빨개진 웃음", "blush 부끄러움 미소"), + ("😇", "천사", "angel halo 천사 선량"), + ("🥰", "사랑스러운 얼굴", "love hearts 사랑 하트"), + ("😍", "하트 눈", "heart eyes 사랑 반함"), + ("🤩", "별 눈", "star struck 감동 황홀"), + ("😘", "뽀뽀", "kiss blow 키스 뽀뽀"), + ("😗", "오므린 입", "kiss whistle 키스"), + ("😚", "눈 감고 뽀뽀", "kiss 키스"), + ("😙", "볼 뽀뽀", "kiss 키스"), + ("😋", "맛있다", "yum delicious 맛 음식"), + ("😛", "혀 내밀기", "tongue out 혀 놀림"), + ("😜", "윙크하며 혀", "wink tongue 장난"), + ("🤪", "미친 표정", "zany crazy 정신없음"), + ("😝", "눈 감고 혀", "tongue 혀"), + ("🤑", "돈 눈", "money face 돈 부자"), + ("🤗", "포옹", "hugging hug 안아줘 포옹"), + ("🤭", "입 가리고", "hand over mouth 헉 깜짝"), + ("🤫", "쉿", "shushing quiet 조용 쉿"), + ("🤔", "생각 중", "thinking 고민 생각"), + ("🤐", "입 막음", "zipper mouth 비밀"), + ("🤨", "의심", "raised eyebrow 의심 의아"), + ("😐", "무표정", "neutral 무감각 무표정"), + ("😑", "표정 없음", "expressionless 냉담"), + ("😶", "입 없는 얼굴", "no mouth 침묵"), + ("😏", "비웃음", "smirk 비웃 냉소"), + ("😒", "불만", "unamused 불만 짜증"), + ("🙄", "눈 굴리기", "eye roll 어이없음"), + ("😬", "이 드러냄", "grimace 으 민망"), + ("🤥", "거짓말", "lying pinocchio 거짓말"), + ("😌", "안도/평온", "relieved 안도 평온"), + ("😔", "슬픔", "pensive sad 슬픔 우울"), + ("😪", "졸림", "sleepy 졸음"), + ("🤤", "침 흘림", "drooling 군침 식욕"), + ("😴", "잠", "sleeping sleep 수면 잠"), + ("😷", "마스크", "mask sick 마스크 아픔"), + ("🤒", "열 나는", "sick fever 열 아픔"), + ("🤕", "머리 붕대", "injured hurt 부상"), + ("🤢", "구역질", "nauseated sick 구역 메스꺼움"), + ("🤮", "토하는", "vomit 구토"), + ("🤧", "재채기", "sneezing sick 재채기 감기"), + ("🥵", "더운", "hot overheated 더움 열"), + ("🥶", "추운", "cold freezing 추움 냉기"), + ("🥴", "어지러운", "woozy 어지럼 취함"), + ("😵", "어질어질", "dizzy 어지럼 충격"), + ("🤯", "머리 폭발", "exploding head 충격 대박"), + ("🤠", "카우보이", "cowboy hat 카우보이"), + ("🥸", "변장", "disguise 변장 선글라스"), + ("😎", "쿨한", "cool sunglasses 선글라스 쿨"), + ("🤓", "공부벌레", "nerd glasses 공부 안경"), + ("🧐", "모노클", "monocle curious 고상 탐정"), + ("😕", "당황", "confused 당황 모호"), + ("😟", "걱정", "worried concern 걱정"), + ("🙁", "살짝 찡그림", "frown 슬픔"), + ("☹️", "찡그린 얼굴", "frown sad 슬픔"), + ("😮", "입 벌림", "open mouth surprised 놀람"), + ("😯", "놀람", "hushed surprised 깜짝"), + ("😲", "충격", "astonished 충격 놀람"), + ("😳", "얼굴 빨개짐", "flushed embarrassed 부끄럼 당황"), + ("🥺", "애원", "pleading eyes 부탁 눈빛"), + ("😦", "찡그리며 벌린 입", "frowning 불안"), + ("😧", "고통", "anguished 고통"), + ("😨", "무서움", "fearful scared 무서움 공포"), + ("😰", "식은땀", "anxious sweat 불안 걱정"), + ("😥", "눈물 조금", "sad disappointed 실망 눈물"), + ("😢", "울음", "cry sad 슬픔 눈물"), + ("😭", "엉엉 울음", "loudly crying sob 통곡"), + ("😱", "공포에 질림", "screaming fear 비명 공포"), + ("😖", "혼란", "confounded 혼란"), + ("😣", "힘듦", "persevering 고생"), + ("😞", "실망", "disappointed 실망"), + ("😓", "땀", "downcast sweat 땀 힘듦"), + ("😩", "피곤", "weary tired 지침 피곤"), + ("😫", "극도로 지침", "tired exhausted 탈진"), + ("🥱", "하품", "yawning bored 하품 지루함"), + ("😤", "콧김", "triumph snort 분노 콧김"), + ("😡", "화남", "angry mad 화남 분노"), + ("😠", "성남", "angry 화 성남"), + ("🤬", "욕", "cursing swearing 욕 분노"), + ("😈", "나쁜 미소", "smiling devil 악마 장난"), + ("👿", "화난 악마", "angry devil 악마"), + ("💀", "해골", "skull death 해골 죽음"), + ("☠️", "해골 십자", "skull crossbones 독"), + ("💩", "응가", "poop 똥 응가"), + ("🤡", "피에로", "clown 광대"), + ("👹", "도깨비", "ogre 도깨비 귀신"), + ("👺", "텐구", "goblin 텐구"), + ("👻", "유령", "ghost 유령 귀신"), + ("👾", "우주인", "alien monster 외계인 게임"), + ("🤖", "로봇", "robot 로봇"), + + // 손 / 몸 + ("👋", "손 흔들기", "wave waving hi bye 안녕"), + ("🤚", "손 뒤", "raised back hand 손"), + ("🖐️", "손바닥", "hand palm 다섯 손가락"), + ("✋", "손 들기", "raised hand 손 들기 멈춤"), + ("🖖", "스팍 손인사", "vulcan salute 스타트렉"), + ("👌", "오케이", "ok perfect 오케이 좋아"), + ("🤌", "손가락 모아", "pinched fingers 이탈리아"), + ("✌️", "브이", "victory peace v 브이 평화"), + ("🤞", "행운 손가락", "crossed fingers lucky 행운 기도"), + ("🤟", "아이 러브 유", "love you 사랑해"), + ("🤘", "록 손", "rock on metal 록"), + ("🤙", "전화해", "call me shaka 전화 샤카"), + ("👈", "왼쪽 가리킴", "backhand left 왼쪽"), + ("👉", "오른쪽 가리킴", "backhand right 오른쪽"), + ("👆", "위 가리킴", "backhand up 위"), + ("🖕", "욕", "middle finger 욕"), + ("👇", "아래 가리킴", "backhand down 아래"), + ("☝️", "검지 들기", "index pointing up 하나 포인트"), + ("👍", "좋아요", "thumbs up like good 좋아 최고"), + ("👎", "싫어요", "thumbs down dislike 싫어 별로"), + ("✊", "주먹", "fist punch 주먹"), + ("👊", "주먹 치기", "punch fist 주먹"), + ("🤛", "왼 주먹", "left fist 주먹"), + ("🤜", "오른 주먹", "right fist 주먹"), + ("👏", "박수", "clapping applause 박수 응원"), + ("🙌", "만세", "raising hands celebrate 만세"), + ("👐", "양손 펼침", "open hands 환영"), + ("🤲", "두 손 모음", "palms up together 기도 바람"), + ("🙏", "두 손 합장", "pray please thanks 감사 부탁 기도"), + ("✍️", "글쓰기", "writing pen 글쓰기"), + ("💅", "네일", "nail polish manicure 네일 손톱"), + ("🤳", "셀카", "selfie 셀카"), + ("💪", "근육", "muscle strong 근육 힘"), + ("🦾", "기계 팔", "mechanical arm 로봇 팔"), + ("🦿", "기계 다리", "mechanical leg 로봇 다리"), + ("🦵", "다리", "leg kick 다리"), + ("🦶", "발", "foot kick 발"), + ("👂", "귀", "ear hear 귀"), + ("🦻", "보청기 귀", "ear hearing aid 보청기"), + ("👃", "코", "nose smell 코"), + ("🫀", "심장", "heart anatomical 심장"), + ("🫁", "폐", "lungs 폐"), + ("🧠", "뇌", "brain mind 뇌 지능"), + ("🦷", "치아", "tooth dental 치아"), + ("🦴", "뼈", "bone 뼈"), + ("👀", "눈", "eyes look see 눈 보기"), + ("👁️", "한쪽 눈", "eye 눈"), + ("👅", "혀", "tongue 혀"), + ("👄", "입술", "lips mouth 입술"), + ("💋", "입맞춤", "kiss lips 키스 입술"), + ("🩸", "피", "blood drop 피 혈액"), + + // 하트 / 감정 기호 + ("❤️", "빨간 하트", "red heart love 사랑 빨강"), + ("🧡", "주황 하트", "orange heart 사랑"), + ("💛", "노란 하트", "yellow heart 사랑"), + ("💚", "초록 하트", "green heart 사랑"), + ("💙", "파란 하트", "blue heart 사랑"), + ("💜", "보라 하트", "purple heart 사랑"), + ("🖤", "검은 하트", "black heart 사랑 다크"), + ("🤍", "흰 하트", "white heart 사랑"), + ("🤎", "갈색 하트", "brown heart 사랑"), + ("💔", "깨진 하트", "broken heart 이별 상처"), + ("❣️", "느낌표 하트", "heart exclamation 사랑"), + ("💕", "두 하트", "two hearts 사랑"), + ("💞", "회전 하트", "revolving hearts 사랑"), + ("💓", "뛰는 하트", "beating heart 설렘"), + ("💗", "성장 하트", "growing heart 사랑"), + ("💖", "반짝 하트", "sparkling heart 사랑"), + ("💘", "화살 하트", "heart arrow 큐피드"), + ("💝", "리본 하트", "heart ribbon 선물 사랑"), + ("💟", "하트 장식", "heart decoration 사랑"), + ("☮️", "평화", "peace 평화"), + ("✝️", "십자가", "cross 기독교"), + ("☯️", "음양", "yin yang 음양 균형"), + ("🔮", "수정구", "crystal ball magic 마법 점"), + ("✨", "반짝임", "sparkles glitter 빛 반짝"), + ("⭐", "별", "star 별"), + ("🌟", "빛나는 별", "glowing star 별빛"), + ("💫", "현기증", "dizzy star 빙글"), + ("⚡", "번개", "lightning bolt 번개 전기"), + ("🔥", "불", "fire hot 불 열정"), + ("💥", "폭발", "explosion boom 폭발"), + ("❄️", "눈송이", "snowflake cold 눈 추위"), + ("🌈", "무지개", "rainbow 무지개"), + ("☀️", "태양", "sun sunny 태양 맑음"), + ("🌙", "달", "moon crescent 달"), + ("🌊", "파도", "wave ocean 파도 바다"), + ("💨", "바람", "wind dash 바람"), + ("💦", "물방울", "sweat droplets water 물"), + ("🌸", "벚꽃", "cherry blossom 벚꽃 봄"), + ("🌹", "장미", "rose 장미 꽃"), + ("🌺", "히비스커스", "hibiscus 꽃"), + ("🌻", "해바라기", "sunflower 해바라기"), + ("🌼", "꽃", "blossom flower 꽃"), + ("🌷", "튤립", "tulip 튤립"), + ("💐", "꽃다발", "bouquet flowers 꽃다발"), + ("🍀", "네잎클로버", "four leaf clover lucky 행운"), + ("🌿", "허브", "herb green 풀 허브"), + ("🍃", "잎사귀", "leaf 잎"), + + // 음식 + ("🍕", "피자", "pizza 피자"), + ("🍔", "햄버거", "hamburger burger 버거"), + ("🌮", "타코", "taco 타코"), + ("🍜", "라면", "ramen noodles 라면 국수"), + ("🍱", "도시락", "bento box 도시락"), + ("🍣", "초밥", "sushi 초밥"), + ("🍚", "밥", "rice 밥"), + ("🍛", "카레", "curry rice 카레"), + ("🍝", "파스타", "pasta spaghetti 파스타"), + ("🍦", "소프트 아이스크림", "ice cream soft serve 아이스크림"), + ("🎂", "생일 케이크", "cake birthday 생일 케이크"), + ("🍰", "케이크 조각", "cake slice 케이크"), + ("🧁", "컵케이크", "cupcake 컵케이크"), + ("🍩", "도넛", "donut 도넛"), + ("🍪", "쿠키", "cookie 쿠키"), + ("🍫", "초콜릿", "chocolate bar 초콜릿"), + ("🍬", "사탕", "candy 사탕"), + ("🍭", "막대 사탕", "lollipop 막대사탕"), + ("🍺", "맥주", "beer mug 맥주"), + ("🍻", "건배", "clinking beer 건배"), + ("🥂", "샴페인 건배", "champagne 샴페인 건배"), + ("🍷", "와인", "wine 와인"), + ("☕", "커피", "coffee hot 커피"), + ("🧃", "주스", "juice 주스"), + ("🥤", "음료", "drink cup 음료 컵"), + ("🧋", "버블티", "bubble tea boba 버블티"), + ("🍵", "녹차", "tea matcha 차 녹차"), + + // 동물 + ("🐶", "강아지", "dog puppy 강아지 개"), + ("🐱", "고양이", "cat kitten 고양이"), + ("🐭", "쥐", "mouse 쥐"), + ("🐹", "햄스터", "hamster 햄스터"), + ("🐰", "토끼", "rabbit bunny 토끼"), + ("🦊", "여우", "fox 여우"), + ("🐻", "곰", "bear 곰"), + ("🐼", "판다", "panda 판다"), + ("🐨", "코알라", "koala 코알라"), + ("🐯", "호랑이", "tiger 호랑이"), + ("🦁", "사자", "lion 사자"), + ("🐮", "소", "cow 소"), + ("🐷", "돼지", "pig 돼지"), + ("🐸", "개구리", "frog 개구리"), + ("🐵", "원숭이", "monkey 원숭이"), + ("🙈", "눈 가린 원숭이", "see no evil monkey 안 봐"), + ("🙉", "귀 가린 원숭이", "hear no evil monkey 안 들어"), + ("🙊", "입 가린 원숭이", "speak no evil monkey 안 말해"), + ("🐔", "닭", "chicken 닭"), + ("🐧", "펭귄", "penguin 펭귄"), + ("🐦", "새", "bird 새"), + ("🦆", "오리", "duck 오리"), + ("🦅", "독수리", "eagle 독수리"), + ("🦉", "부엉이", "owl 부엉이"), + ("🐍", "뱀", "snake 뱀"), + ("🐢", "거북이", "turtle 거북이"), + ("🦋", "나비", "butterfly 나비"), + ("🐌", "달팽이", "snail 달팽이"), + ("🐛", "애벌레", "bug caterpillar 애벌레"), + ("🐝", "꿀벌", "bee honeybee 벌"), + ("🦑", "오징어", "squid 오징어"), + ("🐙", "문어", "octopus 문어"), + ("🐠", "열대어", "tropical fish 열대어"), + ("🐡", "복어", "blowfish puffer 복어"), + ("🦈", "상어", "shark 상어"), + ("🐬", "돌고래", "dolphin 돌고래"), + ("🐳", "고래", "whale 고래"), + ("🐲", "용", "dragon 용"), + ("🦄", "유니콘", "unicorn 유니콘"), + + // 물건 / 도구 + ("📱", "스마트폰", "phone mobile smartphone 폰"), + ("💻", "노트북", "laptop computer 노트북"), + ("🖥️", "데스크톱", "desktop computer 컴퓨터"), + ("⌨️", "키보드", "keyboard 키보드"), + ("🖱️", "마우스", "mouse 마우스"), + ("🖨️", "프린터", "printer 프린터"), + ("📷", "카메라", "camera 카메라"), + ("📸", "플래시 카메라", "camera flash 사진"), + ("📹", "비디오 카메라", "video camera 동영상"), + ("🎥", "영화 카메라", "movie camera film 영화"), + ("📺", "TV", "television tv 텔레비전"), + ("📻", "라디오", "radio 라디오"), + ("🎙️", "마이크", "microphone studio 마이크"), + ("🎤", "마이크 핸드헬드", "microphone karaoke 마이크"), + ("🎧", "헤드폰", "headphones 헤드폰"), + ("📡", "안테나", "satellite antenna 안테나"), + ("🔋", "배터리", "battery 배터리"), + ("🔌", "전원 플러그", "plug electric 플러그"), + ("💡", "전구", "bulb idea light 전구 아이디어"), + ("🔦", "손전등", "flashlight torch 손전등"), + ("🕯️", "양초", "candle 양초"), + ("📚", "책", "books stack 책"), + ("📖", "열린 책", "open book read 독서"), + ("📝", "메모", "memo note pencil 메모 노트"), + ("✏️", "연필", "pencil 연필"), + ("🖊️", "펜", "pen 펜"), + ("📌", "압정", "pushpin pin 압정"), + ("📎", "클립", "paperclip 클립"), + ("✂️", "가위", "scissors cut 가위"), + ("🗂️", "파일 폴더", "card index dividers folder 파일"), + ("📁", "폴더", "folder 폴더"), + ("📂", "열린 폴더", "open folder 폴더"), + ("🗃️", "파일 박스", "card file box 서류함"), + ("🗑️", "휴지통", "wastebasket trash 휴지통"), + ("🔒", "잠금", "locked lock 잠금"), + ("🔓", "열림", "unlocked 열림"), + ("🔑", "열쇠", "key 열쇠"), + ("🗝️", "구식 열쇠", "old key 열쇠"), + ("🔨", "망치", "hammer 망치"), + ("🔧", "렌치", "wrench tool 렌치"), + ("🔩", "나사", "nut bolt 나사"), + ("⚙️", "톱니바퀴", "gear settings 설정 톱니"), + ("🛠️", "도구", "tools hammer wrench 도구"), + ("💊", "알약", "pill medicine 약 알약"), + ("💉", "주사기", "syringe injection 주사"), + ("🩺", "청진기", "stethoscope doctor 청진기"), + ("🏆", "트로피", "trophy award 트로피 우승"), + ("🥇", "금메달", "first gold medal 금메달"), + ("🥈", "은메달", "second silver 은메달"), + ("🥉", "동메달", "third bronze 동메달"), + ("🎖️", "훈장", "medal military 훈장"), + ("🎗️", "리본", "ribbon awareness 리본"), + ("🎫", "티켓", "ticket admission 티켓"), + ("🎟️", "입장권", "admission tickets 티켓"), + ("🎪", "서커스", "circus tent 서커스"), + ("🎨", "팔레트", "art palette paint 그림 예술"), + ("🎭", "연극", "performing arts theater 연극"), + ("🎬", "클래퍼보드", "clapper film 영화 촬영"), + ("🎮", "게임 컨트롤러", "video game controller 게임"), + ("🎲", "주사위", "dice game 주사위"), + ("🎯", "다트", "bullseye target dart 다트 목표"), + ("🎳", "볼링", "bowling 볼링"), + ("⚽", "축구", "soccer football 축구"), + ("🏀", "농구", "basketball 농구"), + ("🏈", "미식축구", "american football 미식축구"), + ("⚾", "야구", "baseball 야구"), + ("🎾", "테니스", "tennis 테니스"), + ("🏐", "배구", "volleyball 배구"), + ("🏉", "럭비", "rugby 럭비"), + ("🎱", "당구", "billiards pool 당구"), + ("🏓", "탁구", "ping pong table tennis 탁구"), + ("🏸", "배드민턴", "badminton 배드민턴"), + ("🥊", "권투 장갑", "boxing glove 권투"), + ("🎣", "낚시", "fishing 낚시"), + ("🏋️", "역도", "weightlifting gym 헬스 역도"), + ("🧘", "명상", "yoga meditation 명상 요가"), + + // 이동수단 + ("🚗", "자동차", "car automobile 자동차"), + ("🚕", "택시", "taxi cab 택시"), + ("🚙", "SUV", "suv car 차"), + ("🚌", "버스", "bus 버스"), + ("🚎", "무궤도 전차", "trolleybus 버스"), + ("🏎️", "레이싱카", "racing car 레이싱"), + ("🚓", "경찰차", "police car 경찰"), + ("🚑", "구급차", "ambulance 구급차"), + ("🚒", "소방차", "fire truck 소방차"), + ("🚐", "미니밴", "minibus van 밴"), + ("🚚", "트럭", "truck delivery 트럭"), + ("✈️", "비행기", "airplane flight plane 비행기"), + ("🚀", "로켓", "rocket space launch 로켓"), + ("🛸", "UFO", "flying saucer ufo 유에프오"), + ("🚁", "헬리콥터", "helicopter 헬리콥터"), + ("🚂", "기차", "train locomotive 기차"), + ("🚆", "고속열차", "train 기차"), + ("🚇", "지하철", "metro subway 지하철"), + ("⛵", "돛단배", "sailboat 요트"), + ("🚢", "배", "ship cruise 배"), + ("🚲", "자전거", "bicycle bike 자전거"), + ("🛵", "스쿠터", "scooter moped 스쿠터"), + ("🏍️", "오토바이", "motorcycle 오토바이"), + + // 장소 + ("🏠", "집", "house home 집"), + ("🏡", "마당 있는 집", "house garden 집"), + ("🏢", "빌딩", "office building 빌딩"), + ("🏣", "우체국", "post office 우체국"), + ("🏥", "병원", "hospital 병원"), + ("🏦", "은행", "bank 은행"), + ("🏨", "호텔", "hotel 호텔"), + ("🏫", "학교", "school 학교"), + ("🏪", "편의점", "convenience store shop 편의점"), + ("🏬", "백화점", "department store 백화점"), + ("🏰", "성", "castle 성"), + ("⛪", "교회", "church 교회"), + ("🕌", "모스크", "mosque 모스크"), + ("🗼", "에펠탑", "eiffel tower paris 파리"), + ("🗽", "자유의 여신상", "statue of liberty new york 뉴욕"), + ("🏔️", "산", "mountain snow 산"), + ("🌋", "화산", "volcano 화산"), + ("🗻", "후지산", "mount fuji japan 후지산"), + ("🏕️", "캠핑", "camping tent 캠핑"), + ("🏖️", "해변", "beach summer 해변 해수욕"), + ("🌏", "지구", "earth globe asia 지구"), + + // 기호 / 숫자 + ("💯", "100점", "hundred percent perfect 완벽 100"), + ("🔢", "숫자", "numbers 숫자"), + ("🆗", "OK", "ok button 오케이"), + ("🆙", "업", "up button 업"), + ("🆒", "쿨", "cool button 쿨"), + ("🆕", "새것", "new button 새"), + ("🆓", "무료", "free button 무료"), + ("🆘", "SOS", "sos emergency 긴급 구조"), + ("⚠️", "경고", "warning caution 경고 주의"), + ("🚫", "금지", "prohibited no 금지"), + ("✅", "체크", "check mark done 완료 확인"), + ("❌", "엑스", "x cross error 실패 오류"), + ("❓", "물음표", "question mark 물음표"), + ("❗", "느낌표", "exclamation mark 느낌표"), + ("➕", "더하기", "plus add 더하기"), + ("➖", "빼기", "minus subtract 빼기"), + ("➗", "나누기", "divide 나누기"), + ("✖️", "곱하기", "multiply times 곱하기"), + ("♾️", "무한대", "infinity 무한"), + ("🔁", "반복", "repeat loop 반복"), + ("🔀", "셔플", "shuffle random 랜덤"), + ("▶️", "재생", "play 재생"), + ("⏸️", "일시정지", "pause 일시정지"), + ("⏹️", "정지", "stop 정지"), + ("⏩", "빨리 감기", "fast forward 빨리감기"), + ("⏪", "되감기", "rewind 되감기"), + ("🔔", "알림", "bell notification 알림 벨"), + ("🔕", "알림 끔", "bell off 알림끔"), + ("🔊", "볼륨 크게", "loud speaker volume up 볼륨"), + ("🔇", "음소거", "muted speaker 음소거"), + ("📣", "메가폰", "megaphone loud 확성기"), + ("📢", "스피커", "loudspeaker 스피커"), + ("💬", "말풍선", "speech bubble chat 대화"), + ("💭", "생각 말풍선", "thought bubble thinking 생각"), + ("📧", "이메일", "email mail 이메일 메일"), + ("📨", "수신 봉투", "incoming envelope 수신"), + ("📩", "발신 봉투", "envelope outbox 발신"), + ("📬", "우편함", "mailbox 우편함"), + ("📦", "택배 박스", "package box parcel 택배 상자"), + ("🎁", "선물", "gift present 선물"), + ("🎀", "리본 묶음", "ribbon bow 리본"), + ("🎊", "색종이", "confetti 파티 축하"), + ("🎉", "파티 폭죽", "party popper celebrate 파티 축하"), + ("🎈", "풍선", "balloon party 풍선"), + ("🕐", "1시", "one o'clock 1시 시간"), + ("🕒", "3시", "three o'clock 3시 시간"), + ("🕔", "4시", "four o'clock 4시 시간"), + ("⏰", "알람 시계", "alarm clock 알람 시계"), + ("⏱️", "스톱워치", "stopwatch timer 스톱워치 타이머"), + ("📅", "달력", "calendar date 달력 날짜"), + ("📆", "찢는 달력", "tear-off calendar 달력"), + ("💰", "돈 가방", "money bag 돈 부자"), + ("💳", "신용카드", "credit card payment 카드 결제"), + ("💵", "달러", "dollar banknote 달러"), + ("💴", "엔화", "yen banknote 엔"), + ("💶", "유로", "euro banknote 유로"), + ("💷", "파운드", "pound banknote 파운드"), + ("📊", "막대 그래프", "bar chart graph 그래프"), + ("📈", "상승 그래프", "chart increasing trend 상승 트렌드"), + ("📉", "하락 그래프", "chart decreasing trend 하락"), + ("🔍", "돋보기", "magnifying glass search 검색 돋보기"), + ("🔎", "오른쪽 돋보기", "magnifying glass right search 검색"), + ("🏳️", "흰 깃발", "white flag 항복"), + ("🏴", "검은 깃발", "black flag 해적"), + ("🚩", "빨간 삼각기", "triangular flag 경고 깃발"), + ("🏁", "체크무늬 깃발", "chequered flag finish race 결승"), + ("🌐", "지구본", "globe internet web 인터넷 웹"), + ("⚓", "닻", "anchor 닻"), + ("🎵", "음표", "music note 음악 음표"), + ("🎶", "음표들", "musical notes 음악"), + ("🎼", "악보", "musical score 악보"), + ("🎹", "피아노", "piano keyboard 피아노"), + ("🎸", "기타", "guitar 기타"), + ("🥁", "드럼", "drum 드럼"), + ("🪗", "아코디언", "accordion 아코디언"), + ("🎷", "색소폰", "saxophone 색소폰"), + ("🎺", "트럼펫", "trumpet 트럼펫"), + ("🎻", "바이올린", "violin 바이올린"), + }; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + IEnumerable<(string Emoji, string Name, string Tags)> matches; + + if (string.IsNullOrWhiteSpace(query)) + { + // 기본 화면: 자주 쓰는 이모지 30개 + matches = _emojis.Take(30); + } + else + { + var q = query.Trim().ToLowerInvariant(); + matches = _emojis + .Where(e => e.Name.Contains(q, StringComparison.OrdinalIgnoreCase) + || e.Tags.Contains(q, StringComparison.OrdinalIgnoreCase) + || e.Emoji.Contains(q)) + .Take(20); + } + + var items = matches.Select(e => new LauncherItem( + $"{e.Emoji} {e.Name}", + "Enter로 클립보드에 복사", + null, + e.Emoji, + Symbol: Symbols.Emoji)).ToList(); + + if (!items.Any() && !string.IsNullOrWhiteSpace(query)) + { + items.Add(new LauncherItem( + "검색 결과 없음", + $"'{query}'에 해당하는 이모지가 없습니다", + null, null, Symbol: Symbols.Info)); + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string emoji) + { + try { Clipboard.SetText(emoji); } + catch (Exception) { } + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/EncodeHandler.cs b/src/AxCopilot/Handlers/EncodeHandler.cs new file mode 100644 index 0000000..a6666ef --- /dev/null +++ b/src/AxCopilot/Handlers/EncodeHandler.cs @@ -0,0 +1,208 @@ +using System.Security.Cryptography; +using System.Text; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 인코딩/해싱 변환 핸들러. "encode " 프리픽스로 사용합니다. +/// 예: encode base64 hello → aGVsbG8= +/// encode decode base64 aGVsbG8= → hello +/// encode url https://example.com → URL 인코딩 +/// encode hex hello → 68656c6c6f +/// encode md5 hello → 5d41402abc4b2a76b9719d911017c592 +/// encode sha256 hello → 2cf24dba... +/// encode sha1 hello → aaf4c61d... +/// encode (빈 쿼리) → 지원 목록 +/// +public class EncodeHandler : IActionHandler +{ + public string? Prefix => "encode "; // 뒤에 공백 포함 + + public PluginMetadata Metadata => new( + "Encoder", + "인코딩/해싱 — encode base64/url/hex/md5/sha256 텍스트", + "1.0", + "AX"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + if (string.IsNullOrWhiteSpace(q)) + return Task.FromResult(HelpItems()); + + // "decode <타입> <값>" 파턴 + if (q.StartsWith("decode ", StringComparison.OrdinalIgnoreCase)) + { + var rest = q[7..].Trim(); + return Task.FromResult(HandleDecode(rest)); + } + + // "<타입> <값>" 패턴 + var spaceIdx = q.IndexOf(' '); + if (spaceIdx < 0) + return Task.FromResult(HelpItems()); + + var type = q[..spaceIdx].Trim().ToLowerInvariant(); + var input = q[(spaceIdx + 1)..]; + + return Task.FromResult(HandleEncode(type, input)); + } + + private static IEnumerable HandleEncode(string type, string input) + { + try + { + return type switch + { + "base64" or "b64" => SingleResult("Base64 인코딩", + Convert.ToBase64String(Encoding.UTF8.GetBytes(input))), + + "url" => SingleResult("URL 인코딩", + Uri.EscapeDataString(input)), + + "hex" => SingleResult("HEX 인코딩", + Convert.ToHexString(Encoding.UTF8.GetBytes(input)).ToLowerInvariant()), + + "md5" => SingleResult("MD5 해시", + MD5Hash(input)), + + "sha1" => SingleResult("SHA-1 해시", + SHA1Hash(input)), + + "sha256" => SingleResult("SHA-256 해시", + SHA256Hash(input)), + + "sha512" => SingleResult("SHA-512 해시", + SHA512Hash(input)), + + "html" => SingleResult("HTML 엔티티 인코딩", + System.Net.WebUtility.HtmlEncode(input)), + + _ => + [ + new LauncherItem( + $"알 수 없는 타입: {type}", + "base64, url, hex, md5, sha1, sha256, sha512, html 중 선택", + null, null, Symbol: Symbols.Warning) + ] + }; + } + catch (Exception ex) + { + return + [ + new LauncherItem("변환 오류", ex.Message, null, null, Symbol: Symbols.Error) + ]; + } + } + + private static IEnumerable HandleDecode(string rest) + { + var spaceIdx = rest.IndexOf(' '); + if (spaceIdx < 0) + return [new LauncherItem("사용법: encode decode <타입> <값>", "타입: base64, url, hex, html", null, null, Symbol: Symbols.Info)]; + + var type = rest[..spaceIdx].Trim().ToLowerInvariant(); + var input = rest[(spaceIdx + 1)..]; + + try + { + return type switch + { + "base64" or "b64" => SingleResult("Base64 디코딩", + Encoding.UTF8.GetString(Convert.FromBase64String(input))), + + "url" => SingleResult("URL 디코딩", + Uri.UnescapeDataString(input)), + + "hex" => SingleResult("HEX 디코딩", + Encoding.UTF8.GetString(Convert.FromHexString(input))), + + "html" => SingleResult("HTML 엔티티 디코딩", + System.Net.WebUtility.HtmlDecode(input)), + + _ => + [ + new LauncherItem( + $"디코딩 불가 타입: {type}", + "디코딩 지원: base64, url, hex, html", + null, null, Symbol: Symbols.Warning) + ] + }; + } + catch (Exception ex) + { + return + [ + new LauncherItem("디코딩 오류", ex.Message, null, null, Symbol: Symbols.Error) + ]; + } + } + + private static IEnumerable SingleResult(string title, string result) + { + var preview = result.Length > 80 ? result[..77] + "…" : result; + return + [ + new LauncherItem( + title, + $"{preview} · Enter로 복사", + null, + result, + Symbol: Symbols.EncodeIcon) + ]; + } + + private static IEnumerable HelpItems() + { + return + [ + new LauncherItem("encode base64 <텍스트>", "Base64 인코딩/디코딩", null, null, Symbol: Symbols.EncodeIcon), + new LauncherItem("encode url <텍스트>", "URL 퍼센트 인코딩/디코딩", null, null, Symbol: Symbols.EncodeIcon), + new LauncherItem("encode hex <텍스트>", "16진수 인코딩/디코딩", null, null, Symbol: Symbols.EncodeIcon), + new LauncherItem("encode md5 <텍스트>", "MD5 해시 (단방향)", null, null, Symbol: Symbols.EncodeIcon), + new LauncherItem("encode sha256 <텍스트>", "SHA-256 해시 (단방향)", null, null, Symbol: Symbols.EncodeIcon), + new LauncherItem("encode html <텍스트>", "HTML 엔티티 인코딩/디코딩", null, null, Symbol: Symbols.EncodeIcon), + new LauncherItem("encode decode base64 <값>", "Base64 디코딩 예시", null, null, Symbol: Symbols.EncodeIcon), + ]; + } + + // ─── 해시 헬퍼 ───────────────────────────────────────────────────────────── + + private static string MD5Hash(string input) + { + var bytes = MD5.HashData(Encoding.UTF8.GetBytes(input)); + return Convert.ToHexString(bytes).ToLowerInvariant(); + } + + private static string SHA1Hash(string input) + { + var bytes = SHA1.HashData(Encoding.UTF8.GetBytes(input)); + return Convert.ToHexString(bytes).ToLowerInvariant(); + } + + private static string SHA256Hash(string input) + { + var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(input)); + return Convert.ToHexString(bytes).ToLowerInvariant(); + } + + private static string SHA512Hash(string input) + { + var bytes = SHA512.HashData(Encoding.UTF8.GetBytes(input)); + return Convert.ToHexString(bytes).ToLowerInvariant(); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text) + { + try { Clipboard.SetText(text); } catch (Exception) { } + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/EnvHandler.cs b/src/AxCopilot/Handlers/EnvHandler.cs new file mode 100644 index 0000000..d057e08 --- /dev/null +++ b/src/AxCopilot/Handlers/EnvHandler.cs @@ -0,0 +1,100 @@ +using AxCopilot.SDK; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 환경변수 조회 핸들러. "env" 프리픽스로 사용합니다. +/// 예: env → 자주 쓰는 환경변수 목록 +/// env PATH → PATH 값 표시 (Enter로 복사) +/// env java → 이름에 "java" 포함된 환경변수 검색 +/// +public class EnvHandler : IActionHandler +{ + public string? Prefix => "env"; + + public PluginMetadata Metadata => new( + "EnvVars", + "환경변수 조회 — env 뒤에 변수명 입력", + "1.0", + "AX"); + + // 자주 쓰는 환경변수 우선 표시 순서 + private static readonly string[] _priorityKeys = + [ + "PATH", "JAVA_HOME", "PYTHON_HOME", "NODE_HOME", "GOPATH", "GOROOT", + "USERPROFILE", "APPDATA", "LOCALAPPDATA", "TEMP", "TMP", + "COMPUTERNAME", "USERNAME", "USERDOMAIN", "OS", "PROCESSOR_ARCHITECTURE", + "SYSTEMROOT", "WINDIR", "PROGRAMFILES", "PROGRAMFILES(X86)", + "COMMONPROGRAMFILES", "NUMBER_OF_PROCESSORS" + ]; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + var allVars = Environment.GetEnvironmentVariables() + .Cast() + .Select(e => (Key: e.Key?.ToString() ?? "", Value: e.Value?.ToString() ?? "")) + .Where(x => !string.IsNullOrEmpty(x.Key)) + .ToList(); + + IEnumerable<(string Key, string Value)> filtered; + + if (string.IsNullOrWhiteSpace(q)) + { + // 우선순위 키를 앞에, 나머지 알파벳 순 + var prioritySet = new HashSet(_priorityKeys, StringComparer.OrdinalIgnoreCase); + var prioritized = _priorityKeys + .Where(k => allVars.Any(v => string.Equals(v.Key, k, StringComparison.OrdinalIgnoreCase))) + .Select(k => allVars.First(v => string.Equals(v.Key, k, StringComparison.OrdinalIgnoreCase))); + var rest = allVars + .Where(v => !prioritySet.Contains(v.Key)) + .OrderBy(v => v.Key); + filtered = prioritized.Concat(rest).Take(20); + } + else + { + // 키 또는 값에 쿼리 포함 검색 + filtered = allVars + .Where(v => v.Key.Contains(q, StringComparison.OrdinalIgnoreCase) + || v.Value.Contains(q, StringComparison.OrdinalIgnoreCase)) + .OrderBy(v => v.Key.StartsWith(q, StringComparison.OrdinalIgnoreCase) ? 0 : 1) + .ThenBy(v => v.Key) + .Take(20); + } + + var items = filtered.Select(v => + { + // PATH처럼 긴 값은 첫 경로만 미리보기 + var preview = v.Value.Length > 80 ? v.Value[..77] + "…" : v.Value; + // PATH 변수는 세미콜론으로 분할하여 첫 항목만 표시 + if (v.Key.Equals("PATH", StringComparison.OrdinalIgnoreCase) && v.Value.Contains(';')) + preview = v.Value.Split(';')[0] + $" (외 {v.Value.Split(';').Length - 1}개)"; + + return new LauncherItem( + v.Key, + $"{preview} · Enter로 값 복사", + null, + v.Value, + Symbol: Symbols.EnvVar); + }).ToList(); + + if (!items.Any()) + items.Add(new LauncherItem( + $"'{q}' — 환경변수 없음", + "해당 이름의 환경변수를 찾을 수 없습니다", + null, null, Symbol: Symbols.Warning)); + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string value) + { + try { System.Windows.Clipboard.SetText(value); } catch (Exception) { } + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/EverythingHandler.cs b/src/AxCopilot/Handlers/EverythingHandler.cs new file mode 100644 index 0000000..4732f28 --- /dev/null +++ b/src/AxCopilot/Handlers/EverythingHandler.cs @@ -0,0 +1,240 @@ +using System.IO; +using System.Runtime.InteropServices; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// Everything SDK를 이용한 초고속 파일 검색 핸들러. +/// "es" 프리픽스로 사용합니다. +/// +/// 예: es report → "report" 파일명 검색 +/// es *.xlsx → 엑셀 파일 검색 +/// es 회의록 → 한글 파일명 검색 +/// +/// Everything이 설치되어 있지 않으면 자동으로 비활성화됩니다. +/// +public class EverythingHandler : IActionHandler +{ + public string? Prefix => "es"; + + public PluginMetadata Metadata => new( + "EverythingSearch", + "Everything 초고속 파일 검색 — es [키워드]", + "1.0", + "AX"); + + // ─── Everything SDK P/Invoke ───────────────────────────────────────────── + + private const int EVERYTHING_OK = 0; + private const int EVERYTHING_REQUEST_FILE_NAME = 0x00000001; + private const int EVERYTHING_REQUEST_PATH = 0x00000002; + private const int EVERYTHING_REQUEST_SIZE = 0x00000010; + + [DllImport("Everything64.dll", CharSet = CharSet.Unicode)] + private static extern uint Everything_SetSearchW(string lpSearchString); + + [DllImport("Everything64.dll")] + private static extern void Everything_SetMax(uint dwMax); + + [DllImport("Everything64.dll")] + private static extern void Everything_SetRequestFlags(uint dwRequestFlags); + + [DllImport("Everything64.dll")] + private static extern bool Everything_QueryW(bool bWait); + + [DllImport("Everything64.dll")] + private static extern uint Everything_GetNumResults(); + + [DllImport("Everything64.dll")] + private static extern uint Everything_GetLastError(); + + [DllImport("Everything64.dll", CharSet = CharSet.Unicode)] + private static extern IntPtr Everything_GetResultFullPathNameW(uint nIndex, IntPtr lpString, uint nMaxCount); + + [DllImport("Everything64.dll", CharSet = CharSet.Unicode)] + private static extern void Everything_GetResultSize(uint nIndex, out long lpFileSize); + + [DllImport("Everything64.dll")] + private static extern uint Everything_GetMajorVersion(); + + // ─── 상태 ──────────────────────────────────────────────────────────────── + + private bool? _isAvailable; + + private bool IsAvailable + { + get + { + if (_isAvailable.HasValue) return _isAvailable.Value; + try + { + Everything_GetMajorVersion(); + _isAvailable = true; + } + catch (Exception) + { + _isAvailable = false; + } + return _isAvailable.Value; + } + } + + // ─── IActionHandler ────────────────────────────────────────────────────── + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + if (!IsAvailable) + { + return Task.FromResult>(new[] + { + new LauncherItem( + "Everything이 설치되어 있지 않습니다", + "voidtools.com에서 Everything을 설치하면 초고속 파일 검색을 사용할 수 있습니다", + null, null, Symbol: Symbols.Warning) + }); + } + + var q = query.Trim(); + if (string.IsNullOrWhiteSpace(q)) + { + return Task.FromResult>(new[] + { + new LauncherItem( + "Everything 파일 검색", + "검색어를 입력하세요 — 파일명, 확장자(*.xlsx), 경로 일부 등", + null, null, Symbol: Symbols.Search) + }); + } + + try + { + Everything_SetSearchW(q); + Everything_SetMax(30); + Everything_SetRequestFlags(EVERYTHING_REQUEST_FILE_NAME | EVERYTHING_REQUEST_PATH | EVERYTHING_REQUEST_SIZE); + + if (!Everything_QueryW(true)) + { + return Task.FromResult>(new[] + { + new LauncherItem( + "Everything 검색 실패", + $"오류 코드: {Everything_GetLastError()} — Everything 서비스가 실행 중인지 확인하세요", + null, null, Symbol: Symbols.Warning) + }); + } + + var count = Everything_GetNumResults(); + if (count == 0) + { + return Task.FromResult>(new[] + { + new LauncherItem( + $"검색 결과 없음: {q}", + "다른 키워드나 와일드카드(*.xlsx)를 시도해 보세요", + null, null, Symbol: Symbols.Info) + }); + } + + var items = new List(); + var buffer = Marshal.AllocHGlobal(520 * 2); // MAX_PATH * sizeof(wchar_t) + try + { + for (uint i = 0; i < count && i < 30; i++) + { + Everything_GetResultFullPathNameW(i, buffer, 520); + var fullPath = Marshal.PtrToStringUni(buffer) ?? ""; + + Everything_GetResultSize(i, out var fileSize); + var fileName = Path.GetFileName(fullPath); + var dirPath = Path.GetDirectoryName(fullPath) ?? ""; + var sizeStr = fileSize > 0 ? FormatSize(fileSize) : ""; + var subtitle = string.IsNullOrEmpty(sizeStr) ? dirPath : $"{sizeStr} · {dirPath}"; + + var symbol = Directory.Exists(fullPath) ? Symbols.Folder : GetFileSymbol(fullPath); + + items.Add(new LauncherItem(fileName, subtitle, null, fullPath, Symbol: symbol)); + } + } + finally + { + Marshal.FreeHGlobal(buffer); + } + + return Task.FromResult>(items); + } + catch (Exception ex) + { + LogService.Warn($"Everything 검색 오류: {ex.Message}"); + return Task.FromResult>(new[] + { + new LauncherItem("Everything 검색 오류", ex.Message, null, null, Symbol: Symbols.Warning) + }); + } + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not string path || string.IsNullOrEmpty(path)) return; + + try + { + if (Directory.Exists(path)) + { + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo + { + FileName = path, + UseShellExecute = true, + }); + } + else if (File.Exists(path)) + { + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo + { + FileName = path, + UseShellExecute = true, + }); + } + } + catch (Exception ex) + { + LogService.Warn($"Everything 결과 열기 실패: {ex.Message}"); + } + + await Task.CompletedTask; + } + + // ─── 헬퍼 ──────────────────────────────────────────────────────────────── + + private static string FormatSize(long bytes) + { + if (bytes < 1024) return $"{bytes} B"; + if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1} KB"; + if (bytes < 1024 * 1024 * 1024) return $"{bytes / (1024.0 * 1024):F1} MB"; + return $"{bytes / (1024.0 * 1024 * 1024):F2} GB"; + } + + private static string GetFileSymbol(string path) + { + var ext = Path.GetExtension(path).ToLowerInvariant(); + return ext switch + { + ".xlsx" or ".xls" or ".csv" => Symbols.Excel, + ".docx" or ".doc" => Symbols.Word, + ".pptx" or ".ppt" => Symbols.Slides, + ".pdf" => Symbols.Pdf, + ".png" or ".jpg" or ".jpeg" or ".gif" or ".bmp" or ".svg" => Symbols.Image, + ".mp4" or ".avi" or ".mkv" or ".mov" => Symbols.Video, + ".mp3" or ".wav" or ".flac" => Symbols.Music, + ".zip" or ".rar" or ".7z" or ".tar" or ".gz" => Symbols.Archive, + ".exe" or ".msi" => Symbols.App, + ".cs" or ".py" or ".js" or ".ts" or ".java" or ".cpp" or ".c" or ".go" => Symbols.Code, + ".json" or ".xml" or ".yaml" or ".yml" => Symbols.Config, + ".txt" or ".md" or ".log" => Symbols.TextFile, + ".html" or ".htm" or ".css" => Symbols.Web, + _ => Symbols.File, + }; + } +} diff --git a/src/AxCopilot/Handlers/FavoriteHandler.cs b/src/AxCopilot/Handlers/FavoriteHandler.cs new file mode 100644 index 0000000..a3b79e7 --- /dev/null +++ b/src/AxCopilot/Handlers/FavoriteHandler.cs @@ -0,0 +1,204 @@ +using System.Diagnostics; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 즐겨찾기(파일/폴더/경로) 핸들러. "fav" 프리픽스로 사용합니다. +/// 자주 사용하는 로컬 파일·폴더 경로를 등록하고 빠르게 실행합니다. +/// 예: fav → 전체 즐겨찾기 목록 +/// fav 보고서 → "보고서" 포함 항목 필터 +/// fav add 보고서 C:\work\report.xlsx → 즐겨찾기 추가 +/// fav del 보고서 → 즐겨찾기 삭제 +/// Enter → 파일/폴더 열기. +/// +public class FavoriteHandler : IActionHandler +{ + public string? Prefix => "fav"; + + public PluginMetadata Metadata => new( + "Favorite", + "즐겨찾기 관리 — fav", + "1.0", + "AX"); + + private static readonly string FavFile = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "favorites.json"); + + private static readonly JsonSerializerOptions JsonOpts = new() + { + WriteIndented = true, + PropertyNameCaseInsensitive = true + }; + + private List _cache = new(); + private bool _loaded; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + EnsureLoaded(); + var q = query.Trim(); + + // add 명령 + if (q.StartsWith("add ", StringComparison.OrdinalIgnoreCase)) + { + var rest = q[4..].Trim(); + var spaceIdx = rest.IndexOf(' '); + if (spaceIdx > 0) + { + var name = rest[..spaceIdx].Trim(); + var path = rest[(spaceIdx + 1)..].Trim(); + return Task.FromResult>( + [ + new LauncherItem( + $"즐겨찾기 추가: {name}", + $"경로: {path} · Enter로 추가", + null, ValueTuple.Create("__ADD__", name, path), + Symbol: Symbols.Save) + ]); + } + return Task.FromResult>( + [ + new LauncherItem( + "사용법: fav add [이름] [경로]", + "예: fav add 보고서 C:\\work\\report.xlsx", + null, null, Symbol: Symbols.Info) + ]); + } + + // del 명령 + if (q.StartsWith("del ", StringComparison.OrdinalIgnoreCase)) + { + var name = q[4..].Trim(); + var found = _cache.FirstOrDefault(b => + b.Name.Contains(name, StringComparison.OrdinalIgnoreCase)); + if (found != null) + { + return Task.FromResult>( + [ + new LauncherItem( + $"즐겨찾기 삭제: {found.Name}", + $"경로: {found.Path} · Enter로 삭제", + null, ValueTuple.Create("__DEL__", found.Name), + Symbol: Symbols.Delete) + ]); + } + return Task.FromResult>( + [ + new LauncherItem($"'{name}'에 해당하는 즐겨찾기 없음", "fav으로 전체 목록 확인", + null, null, Symbol: Symbols.Warning) + ]); + } + + // 목록/검색 + var filtered = string.IsNullOrWhiteSpace(q) + ? _cache + : _cache.Where(b => + b.Name.Contains(q, StringComparison.OrdinalIgnoreCase) || + b.Path.Contains(q, StringComparison.OrdinalIgnoreCase)).ToList(); + + if (!filtered.Any()) + { + return Task.FromResult>( + [ + new LauncherItem( + _cache.Count == 0 ? "즐겨찾기가 없습니다" : $"'{q}'에 해당하는 즐겨찾기 없음", + "fav add [이름] [경로]로 추가하세요", + null, null, Symbol: Symbols.Info) + ]); + } + + var items = filtered.Select(b => + { + var isDir = Directory.Exists(b.Path); + var isFile = File.Exists(b.Path); + var symbol = isDir ? Symbols.Folder : isFile ? Symbols.File : Symbols.Warning; + var hint = isDir ? "폴더 열기" : isFile ? "파일 열기" : "경로를 찾을 수 없음"; + return new LauncherItem(b.Name, $"{b.Path} · {hint}", null, b.Path, Symbol: symbol); + }).ToList(); + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is ValueTuple add && add.Item1 == "__ADD__") + { + AddFav(add.Item2, add.Item3); + NotificationService.Notify("AX Copilot", $"즐겨찾기 추가: {add.Item2}"); + return Task.CompletedTask; + } + + if (item.Data is ValueTuple del && del.Item1 == "__DEL__") + { + RemoveFav(del.Item2); + NotificationService.Notify("AX Copilot", $"즐겨찾기 삭제: {del.Item2}"); + return Task.CompletedTask; + } + + if (item.Data is string path) + { + if (Directory.Exists(path) || File.Exists(path)) + { + try { Process.Start(new ProcessStartInfo(path) { UseShellExecute = true }); } + catch (Exception ex) { LogService.Warn($"즐겨찾기 열기 실패: {ex.Message}"); } + } + else + { + try { Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(path)); } + catch (Exception) { } + } + } + return Task.CompletedTask; + } + + private void EnsureLoaded() + { + if (_loaded) return; + _loaded = true; + try + { + if (!File.Exists(FavFile)) return; + _cache = JsonSerializer.Deserialize>(File.ReadAllText(FavFile), JsonOpts) ?? new(); + } + catch (Exception ex) { LogService.Warn($"즐겨찾기 로드 실패: {ex.Message}"); } + } + + private void AddFav(string name, string path) + { + EnsureLoaded(); + _cache.RemoveAll(b => b.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + _cache.Insert(0, new FavEntry { Name = name, Path = path }); + Save(); + } + + private void RemoveFav(string name) + { + EnsureLoaded(); + _cache.RemoveAll(b => b.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + Save(); + } + + private void Save() + { + try + { + Directory.CreateDirectory(Path.GetDirectoryName(FavFile)!); + File.WriteAllText(FavFile, JsonSerializer.Serialize(_cache, JsonOpts)); + } + catch (Exception ex) { LogService.Warn($"즐겨찾기 저장 실패: {ex.Message}"); } + } + + private class FavEntry + { + [JsonPropertyName("name")] public string Name { get; set; } = ""; + [JsonPropertyName("path")] public string Path { get; set; } = ""; + } +} diff --git a/src/AxCopilot/Handlers/HelpHandler.cs b/src/AxCopilot/Handlers/HelpHandler.cs new file mode 100644 index 0000000..8157685 --- /dev/null +++ b/src/AxCopilot/Handlers/HelpHandler.cs @@ -0,0 +1,443 @@ +using System.Windows; +using System.Windows.Media; +using AxCopilot.SDK; +using AxCopilot.Themes; +using AxCopilot.Views; + +namespace AxCopilot.Handlers; + +/// +/// 간편 사용 설명서 핸들러. "help" 프리픽스로 사용합니다. +/// 예: help → 전체 명령어 카드 목록 +/// help 계산 → "계산" 관련 명령어 필터 +/// help clip → 클립보드 관련 명령어 필터 +/// Enter 시 해당 예시를 클립보드에 복사합니다. +/// +public class HelpHandler : IActionHandler +{ + private readonly AxCopilot.Services.SettingsService? _settings; + + public HelpHandler(AxCopilot.Services.SettingsService? settings = null) + { + _settings = settings; + } + + public string? Prefix => "help"; + + public PluginMetadata Metadata => new( + "Help", + "AX Commander 사용 설명서", + "1.0", + "AX"); + + /// 설정에서 변경된 프리픽스와 핫키를 실시간 반영한 항목 목록을 반환합니다. + private HelpEntry[] GetEntries() + { + var capPrefix = _settings?.Settings.ScreenCapture.Prefix ?? "cap"; + if (string.IsNullOrWhiteSpace(capPrefix)) capPrefix = "cap"; + var hotkey = _settings?.Settings.Hotkey ?? "Alt+Space"; + + var entries = (HelpEntry[])_baseEntries.Clone(); + for (int i = 0; i < entries.Length; i++) + { + // cap 프리픽스 동적 반영 + if (entries[i].Title == "스크린샷 캡처 (예약어 변경 가능)") + { + entries[i] = entries[i] with + { + Command = capPrefix, + Example = $"{capPrefix} screen / {capPrefix} window / {capPrefix} region / {capPrefix} scroll / (설정 → 캡처 탭)" + }; + } + // 글로벌 핫키 동적 반영 + if (entries[i].Title == "AX Commander 열기 / 닫기") + { + entries[i] = entries[i] with + { + Command = hotkey, + Example = "설정 → 핫키에서 변경 가능" + }; + } + } + return entries; + } + + // ─── 명령어 카드 데이터 ──────────────────────────────────────────────────── + // (카테고리, 예약어/명령, 제목, 설명, 예시, 심볼, 색) + private static readonly HelpEntry[] _baseEntries = + [ + // ── 검색 ──────────────────────────────────────────────────────────────── + new("검색", "", "앱 · 파일 · 북마크 퍼지 검색", + "앱 이름, 파일명, 한국어 초성, Chrome·Edge 북마크를 통합 검색", + "chrome / 보고서 / ㅅㄷ (설정) / 북마크 제목", + Symbols.Search, "#0078D4"), + + // ── 계산 & 변환 ────────────────────────────────────────────────────────── + new("계산", "=", "계산기", + "수식 계산 · 단위 변환 · 실시간 환율", + "= sqrt(144) / = 100 USD to KRW / = 15km to miles", + Symbols.Calculator, "#4B5EFC"), + + // ── 웹 검색 ────────────────────────────────────────────────────────────── + new("검색", "?", "웹 검색 (10개 엔진)", + "?n 네이버 · ?g 구글 · ?y 유튜브 · ?gh 깃허브 · ?d DuckDuckGo · ?w 위키피디아 · ?nw 나무위키 · ?nm 네이버지도 · ?ni 네이버이미지 · ?gi 구글이미지", + "? 오늘 날씨 / ?n 뉴스 / ?g python / ?nw 검색어 / ?y 음악 / ?gh axios", + Symbols.Globe, "#006EAF"), + + // ── 클립보드 ───────────────────────────────────────────────────────────── + new("클립보드", "#", "클립보드 히스토리", + "복사 이력 검색 & 재사용 · Shift+↑↓로 여러 항목 병합", + "# / # 회의록 / (Shift+↑↓ 선택 후 Shift+Enter 병합)", + Symbols.History, "#B7791F"), + + new("클립보드", "$", "클립보드 텍스트 변환 (12종)", + "현재 클립보드 내용을 즉시 변환", + "$json / $b64e / $upper / $url / $md5 / $trim", + Symbols.Clipboard, "#8764B8"), + + // ── 텍스트 스니펫 ──────────────────────────────────────────────────────── + new("텍스트", ";", "텍스트 스니펫", + "저장된 템플릿 불러오기 · 변수 치환 지원", + ";addr / ;sig / ;greet", + Symbols.Snippet, "#0F6CBD"), + + // ── 단축키 ─────────────────────────────────────────────────────────────── + new("단축키", "@", "URL 단축키", + "저장해둔 URL을 키워드로 바로 열기", + "@gh / @notion / @jira", + Symbols.Globe, "#0078D4"), + + new("단축키", "cd", "폴더 단축키", + "저장해둔 폴더를 키워드로 바로 열기", + "cd dl / cd work / cd desktop", + Symbols.Folder, "#107C10"), + + new("단축키", ">", "터미널 명령 실행", + "PowerShell 명령을 AX Commander에서 직접 실행", + "> git status / > ipconfig / > cls", + Symbols.Terminal, "#323130"), + + // ── 워크스페이스 ────────────────────────────────────────────────────────── + new("창관리", "~", "워크스페이스 저장·복원", + "현재 창 배치를 스냅샷으로 저장하고 언제든 복원", + "~save 업무 / ~restore 업무 / ~list", + Symbols.Workspace, "#C50F1F"), + + new("창관리", "snap", "창 분할 레이아웃", + "창을 화면의 특정 영역에 즉시 스냅", + "snap left / snap right / snap tl / snap full", + Symbols.SnapLayout, "#B45309"), + + new("창관리", "cap", "스크린샷 캡처 (예약어 변경 가능)", + "영역 선택 · 활성 창 · 스크롤 · 전체 화면. Shift+Enter로 지연 캡처(3/5/10초 타이머). 결과는 클립보드에 복사. 글로벌 단축키(PrintScreen 등)로 바로 캡처 가능. 설정 → 캡처 탭에서 예약어·단축키·스크롤 속도 변경", + "cap region / cap window / cap scroll / cap screen / Shift+Enter → 지연 캡처", + Symbols.CaptureIcon, "#BE185D"), + + // ── 시스템 명령 ─────────────────────────────────────────────────────────── + new("시스템", "/", "시스템 명령", + "잠금·절전·재시작·종료·타이머·알람", + "/lock / /sleep / /shutdown / /timer 5m / /alarm 14:30", + Symbols.Power, "#4A4A4A"), + + new("시스템", "info · *", "시스템 정보", + "IP · 배터리 · 볼륨 · 가동시간 · CPU · 디스크. `*` 입력으로도 동일하게 사용 가능", + "info / info ip / info battery / * / * ip", + Symbols.Computer, "#5B4E7E"), + + new("알림", "", "잠금 해제 사용시간 알림", + "PC 잠금 해제 시 오늘 누적 사용 시간과 격려 문구·명언 팝업 표시. 설정 → 알림 탭에서 활성화", + "설정 → 알림 탭: 활성화 토글 / 표시 위치(4방향) / 표시 간격(30분~4시간) / 자동 닫힘(5초~3분)", + Symbols.ReminderBell, "#EA8F00"), + + new("시스템", "kill", "프로세스 종료", + "프로세스 이름으로 검색 후 강제 종료", + "kill chrome / kill node / kill teams", + Symbols.Error, "#CC2222"), + + new("시스템", "media", "미디어 제어", + "재생·일시정지·이전·다음·볼륨 조절", + "media play / media next / media vol+ / media mute", + Symbols.MediaPlay, "#1A6B3C"), + + // ── 개발자 도구 ─────────────────────────────────────────────────────────── + new("개발", "json", "JSON 포맷 · 검증", + "클립보드의 JSON을 정렬·압축·유효성 검사", + "json → format / minify / validate", + Symbols.JsonValid, "#D97706"), + + new("개발", "encode", "인코딩 · 해싱", + "Base64 · URL · HTML · UTF-8 · MD5 · SHA256", + "encode base64 / encode url / encode sha256", + Symbols.EncodeIcon, "#6366F1"), + + new("개발", "color", "색상 변환", + "HEX ↔ RGB ↔ HSL ↔ HSV 변환 및 색상명 지원", + "color #FF5733 / color 255,87,51 / color red", + Symbols.ColorPicker, "#EC4899"), + + new("개발", "port", "포트 · 프로세스 조회", + "포트 번호로 점유 프로세스 확인", + "port 3000 / port 8080 / port 443", + Symbols.PortIcon, "#006699"), + + new("개발", "env", "환경변수 조회", + "시스템 환경변수 검색 및 클립보드 복사", + "env / env PATH / env JAVA", + Symbols.EnvVar, "#0D9488"), + + // ── 앱 관리 ─────────────────────────────────────────────────────────────── + new("앱", "emoji", "이모지 피커", + "300개+ 이모지 검색 · Enter로 클립보드 복사", + "emoji / emoji 하트 / emoji wave / emoji 불꽃", + Symbols.Emoji, "#F59E0B"), + + new("앱", "recent", "최근 파일", + "Windows 최근 파일 목록 검색 & 바로 열기", + "recent / recent 보고서 / recent xlsx", + Symbols.RecentFiles, "#059669"), + + new("앱", "note", "빠른 메모", + "간단한 메모를 저장하고 불러오기", + "note 내일 회의 10시 / note", + Symbols.Note, "#7C3AED"), + + new("앱", "uninstall","앱 제거", + "설치된 앱 검색 후 제거", + "uninstall / uninstall kakao / uninstall zoom", + Symbols.Uninstall, "#DC2626"), + + // ── 유틸리티 ──────────────────────────────────────────────────────────── + new("유틸", "pick", "스포이드 색상 추출", + "화면 아무 곳을 클릭하여 HEX 색상 코드 추출 · 돋보기로 실시간 미리보기 · 결과 반투명 창 5초 표시", + "pick → 스포이드 모드 진입 → 클릭으로 색상 추출", + Symbols.ColorPicker, "#EC4899"), + + new("유틸", "date", "날짜 계산 · D-day · 타임스탬프", + "날짜 가감(+30d), D-day 계산, Unix ↔ 날짜 변환, 요일·ISO 주차 조회", + "date / date +30d / date 2026-12-25 / date 1711584000 / date unix", + Symbols.DateIcon, "#0EA5E9"), + + new("시스템", "svc", "서비스 관리", + "Windows 서비스 검색·시작·중지·재시작 + AX 클립보드 서비스 강제 재시작", + "svc / svc spooler / svc restart clipboard", + Symbols.ServiceIcon, "#6366F1"), + + new("유틸", "pipe", "클립보드 파이프라인", + "변환을 > 로 체이닝: 대문자→공백제거→Base64 등 19종 필터 한 번에 적용", + "pipe upper > trim > b64e / pipe sort > unique > number", + Symbols.PipeIcon, "#8B5CF6"), + + new("유틸", "journal", "업무 일지 자동 생성", + "오늘 사용한 앱·명령어·활성 시간을 마크다운 요약으로 자동 생성. 스탠드업/일일 보고에 바로 사용", + "journal / journal 2026-03-25", + Symbols.JournalIcon, "#0EA5E9"), + + new("유틸", "routine", "루틴 자동화", + "등록된 루틴(앱·폴더·URL 조합)을 한 번에 순서대로 실행. 출근/퇴근/회의 전 세팅", + "routine / routine morning / routine endofday", + Symbols.RoutineIcon, "#F59E0B"), + + new("유틸", "batch", "텍스트 일괄 처리", + "클립보드 각 줄에 동시 적용: 접두사·접미사·줄번호·정렬·중복제거·따옴표·치환·CSV 변환", + "batch number / batch prefix >> / batch sort / batch replace A B", + Symbols.BatchIcon, "#10B981"), + + new("유틸", "diff", "텍스트/파일 비교", + "클립보드 최근 2개 텍스트 또는 파일 2개를 줄 단위 비교. 추가·삭제·동일 줄 하이라이트", + "diff / diff C:\\a.txt C:\\b.txt", + Symbols.DiffIcon, "#EF4444"), + + new("유틸", "win", "윈도우 포커스 스위처", + "열린 창을 타이틀·프로세스명으로 검색하여 Alt+Tab 없이 즉시 전환", + "win / win chrome / win 보고서", + Symbols.WindowIcon, "#6366F1"), + + new("시스템", "^", "Windows 실행 명령", + "Win+R 실행 창과 동일하게 명령어 실행. notepad, calc, cmd, control, mstsc 등 모든 Windows 실행 명령 지원", + "^ notepad / ^ cmd / ^ calc / ^ control / ^ mspaint", + Symbols.LaunchIcon, "#E08850"), + + new("유틸", "stats", "텍스트 통계 분석", + "클립보드 텍스트 글자·단어·줄 수, 키워드 빈도, 읽기 시간 추정", + "stats / stats 키워드 (클립보드 텍스트 분석)", + Symbols.TextStats, "#6366F1"), + + new("유틸", "fav", "즐겨찾기 (파일·폴더)", + "자주 쓰는 경로를 등록하고 빠르게 열기", + "fav / fav add 보고서 C:\\work\\report.xlsx / fav del 보고서", + Symbols.Favorite, "#F59E0B"), + + new("유틸", "rename", "파일 일괄 이름변경", + "폴더 내 파일을 패턴·변수로 일괄 이름변경. {n}순번 {date}날짜 {orig}원본명", + "rename C:\\work\\*.xlsx 보고서_{n}", + Symbols.RenameIcon, "#8B5CF6"), + + new("유틸", "monitor", "시스템 리소스 모니터", + "CPU·메모리·디스크·프로세스 실시간 현황 조회", + "monitor / monitor cpu / monitor mem / monitor disk", + Symbols.MonitorIcon, "#10B981"), + + new("유틸", "scaffold", "프로젝트 스캐폴딩", + "내장/사용자 템플릿으로 프로젝트 폴더 구조 일괄 생성", + "scaffold / scaffold webapi / scaffold C:\\new-project webapi", + Symbols.ScaffoldIcon,"#0EA5E9"), + + // ── 단축키 ─────────────────────────────────────────────────────────────── + new("키보드", "Alt+Space", "AX Commander 열기 / 닫기", + "어디서든 AX Commander를 토글", + "설정 → 핫키에서 변경 가능", + Symbols.Info, "#6B7280"), + + new("키보드", "Enter", "실행", + "선택된 항목 실행", + "", + Symbols.Info, "#6B7280"), + + new("키보드", "Shift+Enter", "Large Type / 병합 실행 / 지연 캡처", + "텍스트를 전체화면으로 표시 · 클립보드 항목 병합 · 캡처 모드에서는 지연 캡처(3초/5초/10초) 타이머 선택", + "(#모드) Shift+↑↓ 선택 후 Shift+Enter 병합 / (cap모드) Shift+Enter → 타이머 선택", + Symbols.Info, "#6B7280"), + + new("키보드", "Tab", "자동완성", + "선택 항목으로 입력 자동완성", + "", + Symbols.Info, "#6B7280"), + + new("키보드", "→ (커서 끝)", "파일 액션 메뉴", + "앱·파일 선택 후 → 키: 경로복사 · 탐색기 · 관리자 · 터미널", + "", + Symbols.Info, "#6B7280"), + + new("키보드", "Ctrl+,", "설정 열기", + "AX Copilot 설정 창", + "", + Symbols.Info, "#6B7280"), + ]; + + // ─── GetItemsAsync ───────────────────────────────────────────────────────── + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + var allEntries = GetEntries(); + + // 쿼리 없이 "help"만 입력한 경우: 전체 기능 창 여는 항목 하나만 표시 + if (string.IsNullOrEmpty(q)) + { + var cmdCount = allEntries.Count(e => e.Category != "키보드"); + var keyCount = allEntries.Count(e => e.Category == "키보드"); + return Task.FromResult>( + [ + new LauncherItem( + "AX Commander — 전체 기능 목록 보기", + $"총 {cmdCount}개 명령어 · {keyCount}개 단축키 · Enter → 기능 설명 창 열기", + null, "__HELP_OVERVIEW__", + Symbol: "\uE946") + ]); + } + + // "help 검색어" 형태: 일치하는 항목 리스트 표시 + var filtered = allEntries.Where(e => + e.Category.Contains(q, StringComparison.OrdinalIgnoreCase) || + e.Command.Contains(q, StringComparison.OrdinalIgnoreCase) || + e.Title.Contains(q, StringComparison.OrdinalIgnoreCase) || + e.Description.Contains(q, StringComparison.OrdinalIgnoreCase)); + + var items = filtered + .Select(e => new LauncherItem( + FormatTitle(e), + FormatSubtitle(e), + null, + e.Example, + Symbol: e.Symbol)) + .ToList(); + + if (items.Count == 0) + { + items.Add(new LauncherItem( + $"'{q}'에 해당하는 명령어가 없습니다", + "help만 입력하면 전체 기능 창을 열 수 있어요", + null, null, + Symbol: Symbols.Info)); + } + + return Task.FromResult>(items); + } + + // ─── ExecuteAsync ────────────────────────────────────────────────────────── + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not string s) return Task.CompletedTask; + + if (s == "__HELP_OVERVIEW__") + { + // 전체 기능 창 열기 + Application.Current.Dispatcher.Invoke(() => + { + var currentEntries = GetEntries(); + var models = currentEntries.Select(e => new HelpItemModel + { + Category = e.Category, + Command = string.IsNullOrEmpty(e.Command) ? "(퍼지 검색)" : e.Command, + Title = e.Title, + Description = e.Description, + Example = e.Example, + Symbol = e.Symbol, + ColorBrush = ParseColor(e.ColorHex) + }); + var globalHotkey = _settings?.Settings.Hotkey ?? "Alt+Space"; + new HelpDetailWindow(models, currentEntries.Count(e => e.Category != "키보드"), globalHotkey).Show(); + }); + return Task.CompletedTask; + } + + // 일반 항목: 예시를 클립보드에 복사 + if (!string.IsNullOrWhiteSpace(s)) + { + try { Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(s)); } + catch (Exception) { /* 무시 */ } + } + return Task.CompletedTask; + } + + private static SolidColorBrush ParseColor(string hex) + { + try + { + var color = (System.Windows.Media.Color) + System.Windows.Media.ColorConverter.ConvertFromString(hex); + return new SolidColorBrush(color); + } + catch (Exception) { return new SolidColorBrush(System.Windows.Media.Colors.Gray); } + } + + // ─── 헬퍼 ───────────────────────────────────────────────────────────────── + + private static string FormatTitle(HelpEntry e) + { + var prefix = string.IsNullOrEmpty(e.Command) + ? $"[{e.Category}]" + : $"[{e.Category}] {e.Command}"; + return $"{prefix} — {e.Title}"; + } + + private static string FormatSubtitle(HelpEntry e) + { + var parts = new List { e.Description }; + if (!string.IsNullOrEmpty(e.Example)) + parts.Add($"예) {e.Example}"); + return string.Join(" · ", parts); + } + + // ─── 데이터 모델 ─────────────────────────────────────────────────────────── + + private record HelpEntry( + string Category, + string Command, + string Title, + string Description, + string Example, + string Symbol, + string ColorHex); +} diff --git a/src/AxCopilot/Handlers/JournalHandler.cs b/src/AxCopilot/Handlers/JournalHandler.cs new file mode 100644 index 0000000..6e90152 --- /dev/null +++ b/src/AxCopilot/Handlers/JournalHandler.cs @@ -0,0 +1,132 @@ +using System.IO; +using System.Text; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 업무 일지 자동 생성 핸들러. "journal" 프리픽스로 사용합니다. +/// UsageStatisticsService 데이터를 기반으로 오늘/지정일의 업무 요약을 자동 생성합니다. +/// 예: journal → 오늘의 업무 일지 생성 +/// journal 2026-03-25 → 해당 날짜 일지 +/// Enter → 마크다운 형식으로 클립보드에 복사. +/// +public class JournalHandler : IActionHandler +{ + public string? Prefix => "journal"; + + public PluginMetadata Metadata => new( + "Journal", + "업무 일지 자동 생성 — journal", + "1.0", + "AX"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + DateTime targetDate; + + if (string.IsNullOrWhiteSpace(q)) + targetDate = DateTime.Today; + else if (DateTime.TryParse(q, out var parsed)) + targetDate = parsed.Date; + else + { + return Task.FromResult>( + [ + new LauncherItem("날짜 형식 오류", "예: journal 2026-03-25 또는 journal (오늘)", + null, null, Symbol: Symbols.Warning) + ]); + } + + // 날짜 범위 계산 (오늘~targetDate 간 차이) + var daysAgo = (DateTime.Today - targetDate).Days; + var allStats = UsageStatisticsService.GetStats(Math.Max(daysAgo + 1, 1)); + var stats = allStats.FirstOrDefault(s => s.Date == targetDate.ToString("yyyy-MM-dd")); + var items = new List(); + + if (stats == null) + { + items.Add(new LauncherItem( + $"{targetDate:yyyy-MM-dd} — 기록 없음", + "해당 날짜의 사용 기록이 없습니다", + null, null, Symbol: Symbols.Info)); + return Task.FromResult>(items); + } + + // 요약 생성 + var activeHours = stats.ActiveSeconds / 3600.0; + var sb = new StringBuilder(); + sb.AppendLine($"## 업무 일지 — {targetDate:yyyy-MM-dd} ({targetDate:dddd})"); + sb.AppendLine(); + sb.AppendLine($"- **PC 활성 시간**: {activeHours:F1}시간"); + sb.AppendLine($"- **런처 호출**: {stats.LauncherOpens}회"); + + if (stats.CommandUsage.Count > 0) + { + sb.AppendLine(); + sb.AppendLine("### 사용한 명령어"); + foreach (var kv in stats.CommandUsage.OrderByDescending(x => x.Value).Take(10)) + sb.AppendLine($"- `{kv.Key}` — {kv.Value}회"); + } + + sb.AppendLine(); + sb.AppendLine("---"); + sb.AppendLine($"*AX Copilot 자동 생성 · {DateTime.Now:HH:mm}*"); + + var journal = sb.ToString(); + + // 요약 카드 + var topCmds = stats.CommandUsage.OrderByDescending(x => x.Value).Take(3) + .Select(x => x.Key); + var cmdPreview = stats.CommandUsage.Count > 0 + ? $"주요 명령: {string.Join(", ", topCmds)}" + : "명령어 사용 기록 없음"; + + items.Add(new LauncherItem( + $"{targetDate:yyyy-MM-dd} 업무 일지 — 클립보드로 복사", + $"활성 {activeHours:F1}h · 런처 {stats.LauncherOpens}회 · {cmdPreview}", + null, journal, + Symbol: Symbols.Note)); + + items.Add(new LauncherItem( + $"PC 활성 시간: {activeHours:F1}시간", + "잠금 해제 시간 기준 누적", + null, $"PC 활성 시간: {activeHours:F1}시간", + Symbol: Symbols.Clock)); + + items.Add(new LauncherItem( + $"런처 호출: {stats.LauncherOpens}회", + "Alt+Space 또는 트레이 클릭", + null, $"런처 호출: {stats.LauncherOpens}회", + Symbol: Symbols.Search)); + + if (stats.CommandUsage.Count > 0) + { + foreach (var kv in stats.CommandUsage.OrderByDescending(x => x.Value).Take(5)) + { + items.Add(new LauncherItem( + $"{kv.Key} — {kv.Value}회", + "Enter로 복사", + null, $"{kv.Key}: {kv.Value}회", + Symbol: Symbols.Terminal)); + } + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text && !string.IsNullOrWhiteSpace(text)) + { + try { Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(text)); } + catch (Exception) { } + NotificationService.Notify("업무 일지", "클립보드에 복사되었습니다"); + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/JsonHandler.cs b/src/AxCopilot/Handlers/JsonHandler.cs new file mode 100644 index 0000000..4045757 --- /dev/null +++ b/src/AxCopilot/Handlers/JsonHandler.cs @@ -0,0 +1,132 @@ +using System.Text.Json; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// JSON 검증/포맷 핸들러. "json" 프리픽스로 사용합니다. +/// 예: json → 클립보드의 JSON을 파싱하여 미리보기 표시 +/// json {"a":1} → 인라인 JSON 파싱 + 미리보기 +/// json minify → 클립보드 JSON 미니파이 → 클립보드 복사 +/// json format → 클립보드 JSON 예쁘게 포맷 → 클립보드 복사 +/// +public class JsonHandler : IActionHandler +{ + public string? Prefix => "json"; + + public PluginMetadata Metadata => new( + "JsonFormatter", + "JSON 검증/포맷 — json 뒤에 내용 또는 명령 입력", + "1.0", + "AX"); + + private static readonly JsonSerializerOptions _prettyOpts = new() { WriteIndented = true }; + private static readonly JsonSerializerOptions _compactOpts = new() { WriteIndented = false }; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + // ─── 빈 쿼리 or format/minify: 클립보드에서 JSON 읽기 ───────────────── + if (string.IsNullOrWhiteSpace(q) || q.Equals("format", StringComparison.OrdinalIgnoreCase) + || q.Equals("minify", StringComparison.OrdinalIgnoreCase) + || q.Equals("min", StringComparison.OrdinalIgnoreCase)) + { + string clipText = ""; + try { clipText = Clipboard.GetText(); } catch (Exception) { } + + if (string.IsNullOrWhiteSpace(clipText)) + return Task.FromResult>( + [ + new LauncherItem( + "클립보드가 비어 있습니다", + "클립보드에 JSON 텍스트를 복사한 뒤 실행하세요", + null, null, Symbol: Symbols.Clipboard) + ]); + + return Task.FromResult(BuildItems(clipText, + isMinify: q.StartsWith("min", StringComparison.OrdinalIgnoreCase))); + } + + // ─── 인라인 JSON ────────────────────────────────────────────────────── + return Task.FromResult(BuildItems(q, isMinify: false)); + } + + private static IEnumerable BuildItems(string input, bool isMinify) + { + try + { + using var doc = JsonDocument.Parse(input, new JsonDocumentOptions + { + AllowTrailingCommas = true, + CommentHandling = JsonCommentHandling.Skip + }); + + // 포맷된 버전 + var pretty = JsonSerializer.Serialize(doc.RootElement, _prettyOpts); + var compact = JsonSerializer.Serialize(doc.RootElement, _compactOpts); + + // 루트 타입 정보 + var rootType = doc.RootElement.ValueKind switch + { + JsonValueKind.Object => $"Object ({doc.RootElement.EnumerateObject().Count()}개 키)", + JsonValueKind.Array => $"Array ({doc.RootElement.GetArrayLength()}개 항목)", + _ => doc.RootElement.ValueKind.ToString() + }; + + var targetText = isMinify ? compact : pretty; + var actionLabel = isMinify ? "미니파이" : "포맷"; + + // 미리보기 (처음 100자) + var preview = compact.Length > 100 ? compact[..97] + "…" : compact; + + return + [ + new LauncherItem( + $"✅ 유효한 JSON — {rootType}", + $"{preview} · Enter로 {actionLabel} 결과 클립보드 복사", + null, + targetText, + Symbol: Symbols.JsonValid), + + new LauncherItem( + "포맷 (Pretty Print) 복사", + $"{pretty.Length}자 · 들여쓰기 2스페이스", + null, + pretty, + Symbol: Symbols.JsonFormat), + + new LauncherItem( + "미니파이 (Minify) 복사", + $"{compact.Length}자 · 공백 제거", + null, + compact, + Symbol: Symbols.JsonMinify), + ]; + } + catch (JsonException ex) + { + var msg = ex.Message.Length > 100 ? ex.Message[..97] + "…" : ex.Message; + return + [ + new LauncherItem( + "❌ JSON 오류", + msg, + null, + null, + Symbol: Symbols.Error) + ]; + } + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text) + { + try { Clipboard.SetText(text); } catch (Exception) { } + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/JsonSkillLoader.cs b/src/AxCopilot/Handlers/JsonSkillLoader.cs new file mode 100644 index 0000000..2676993 --- /dev/null +++ b/src/AxCopilot/Handlers/JsonSkillLoader.cs @@ -0,0 +1,350 @@ +using System.IO; +using System.Net.Http; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// .skill.json 파일을 읽어 IActionHandler로 변환하는 로더. +/// JSON 스킬은 외부 API를 호출하는 동적 핸들러를 코드 없이 정의합니다. +/// +public static class JsonSkillLoader +{ + public static IActionHandler? Load(string filePath) + { + var json = File.ReadAllText(filePath); + var def = JsonSerializer.Deserialize(json, + new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); + + if (def == null) return null; + return new JsonSkillHandler(def); + } +} + +public class JsonSkillDefinition +{ + public string Id { get; set; } = ""; + public string Name { get; set; } = ""; + public string Version { get; set; } = "1.0"; + public string Prefix { get; set; } = ""; + public JsonSkillCredential? Credential { get; set; } + public JsonSkillRequest? Request { get; set; } + public JsonSkillResponse? Response { get; set; } + public JsonSkillCache? Cache { get; set; } +} + +public class JsonSkillCredential +{ + public string Type { get; set; } = "bearer_token"; // bearer_token | basic_auth + public string CredentialKey { get; set; } = ""; +} + +public class JsonSkillRequest +{ + public string Method { get; set; } = "GET"; + public string Url { get; set; } = ""; + public Dictionary? Headers { get; set; } + public object? Body { get; set; } +} + +public class JsonSkillResponse +{ + public string ResultsPath { get; set; } = "results"; + public string TitleField { get; set; } = "title"; + public string? SubtitleField { get; set; } + public string? ActionUrl { get; set; } +} + +public class JsonSkillCache +{ + public int Ttl { get; set; } = 0; // 초 단위 +} + +/// +/// JSON 스킬 정의를 기반으로 실제 HTTP 호출을 수행하는 핸들러 +/// +public class JsonSkillHandler : IActionHandler +{ + private readonly JsonSkillDefinition _def; + private readonly HttpClient _http = new(); + private List? _cache; + private DateTime _cacheExpiry = DateTime.MinValue; + + public string? Prefix => _def.Prefix; + public PluginMetadata Metadata => new(_def.Id, _def.Name, _def.Version, "JSON Skill"); + + public JsonSkillHandler(JsonSkillDefinition def) + { + _def = def; + _http.Timeout = TimeSpan.FromSeconds(3); + + // 인증 헤더 설정 + if (def.Credential?.Type == "bearer_token") + { + var token = CredentialManager.GetToken(def.Credential.CredentialKey); + if (!string.IsNullOrEmpty(token)) + _http.DefaultRequestHeaders.Authorization = + new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); + } + } + + public async Task> GetItemsAsync(string query, CancellationToken ct) + { + // 캐시 확인 + if (_cache != null && DateTime.Now < _cacheExpiry) + return _cache; + + if (_def.Request == null || _def.Response == null) + return Enumerable.Empty(); + + try + { + var url = _def.Request.Url.Replace("{{INPUT}}", Uri.EscapeDataString(query)); + + // URL 유효성 검증: http/https 스킴만 허용 + if (!Uri.TryCreate(url, UriKind.Absolute, out var parsedUrl) || + (parsedUrl.Scheme != Uri.UriSchemeHttp && parsedUrl.Scheme != Uri.UriSchemeHttps)) + { + LogService.Error($"[{_def.Name}] 유효하지 않은 URL: {url}"); + return [new LauncherItem("설정 오류", "스킬 URL이 유효하지 않습니다 (http/https만 허용)", null, null)]; + } + + var response = _def.Request.Method.ToUpper() switch + { + "POST" => await _http.PostAsync(url, BuildBody(query), ct), + _ => await _http.GetAsync(url, ct) + }; + + response.EnsureSuccessStatusCode(); + var json = await response.Content.ReadAsStringAsync(ct); + var items = ParseResults(json); + + // 캐시 저장 + if (_def.Cache?.Ttl > 0) + { + _cache = items; + _cacheExpiry = DateTime.Now.AddSeconds(_def.Cache.Ttl); + } + + return items; + } + catch (TaskCanceledException) + { + // 타임아웃 → 캐시 반환 + if (_cache != null) + { + LogService.Warn($"[{_def.Name}] API 타임아웃, 캐시 반환"); + return _cache; + } + return [new LauncherItem("네트워크 오류", "연결을 확인하세요", null, null)]; + } + catch (Exception ex) + { + LogService.Error($"[{_def.Name}] API 호출 실패: {ex.Message}"); + return [new LauncherItem($"오류: {ex.Message}", _def.Name, null, null)]; + } + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.ActionUrl != null && + Uri.TryCreate(item.ActionUrl, UriKind.Absolute, out var uri) && + (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)) + { + System.Diagnostics.Process.Start( + new System.Diagnostics.ProcessStartInfo(item.ActionUrl) { UseShellExecute = true }); + } + return Task.CompletedTask; + } + + private HttpContent BuildBody(string query) + { + var bodyJson = JsonSerializer.Serialize(_def.Request?.Body) + .Replace("\"{{INPUT}}\"", $"\"{query}\""); + return new StringContent(bodyJson, Encoding.UTF8, "application/json"); + } + + private List ParseResults(string json) + { + var items = new List(); + try + { + var root = JsonNode.Parse(json); + if (root == null) return items; + + // resultsPath로 배열 탐색 (dot notation) + var node = NavigatePath(root, _def.Response!.ResultsPath); + if (node is not JsonArray arr) return items; + + foreach (var element in arr.Take(10)) + { + if (element == null) continue; + var title = NavigatePath(element, _def.Response.TitleField)?.ToString() ?? "(제목 없음)"; + var subtitle = _def.Response.SubtitleField != null + ? NavigatePath(element, _def.Response.SubtitleField)?.ToString() ?? "" + : ""; + var actionUrl = _def.Response.ActionUrl != null + ? NavigatePath(element, _def.Response.ActionUrl)?.ToString() + : null; + + items.Add(new LauncherItem(title, subtitle, null, element, actionUrl, Symbols.Cloud)); + } + } + catch (Exception ex) + { + LogService.Error($"[{_def.Name}] 응답 파싱 실패: {ex.Message}"); + } + return items; + } + + private static JsonNode? NavigatePath(JsonNode root, string path) + { + var parts = path.Split('.'); + JsonNode? current = root; + foreach (var part in parts) + { + if (current == null) return null; + // 배열 인덱스 처리: field[0] + var bracketIdx = part.IndexOf('['); + if (bracketIdx >= 0) + { + var closingIdx = part.IndexOf(']'); + if (closingIdx < 0) return null; // 잘못된 경로 형식 (예: field[0 ) + var fieldName = part[..bracketIdx]; + var index = int.Parse(part[(bracketIdx + 1)..closingIdx]); + current = current[fieldName]?[index]; + } + else + { + current = current[part]; + } + } + return current; + } +} + +/// +/// Windows Credential Manager (advapi32.dll)를 사용해 자격증명을 안전하게 저장/조회합니다. +/// DPAPI 기반 암호화로 현재 사용자 계정에 귀속되어 저장됩니다. +/// +public static class CredentialManager +{ + private const uint CRED_TYPE_GENERIC = 1; + private const uint CRED_PERSIST_LOCAL_MACHINE = 2; + + [StructLayout(LayoutKind.Sequential)] + private struct FILETIME { public uint dwLowDateTime; public uint dwHighDateTime; } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct CREDENTIAL + { + public uint Flags; + public uint Type; + public IntPtr TargetName; + public IntPtr Comment; + public FILETIME LastWritten; + public uint CredentialBlobSize; + public IntPtr CredentialBlob; + public uint Persist; + public uint AttributeCount; + public IntPtr Attributes; + public IntPtr TargetAlias; + public IntPtr UserName; + } + + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool CredRead(string target, uint type, uint flags, out IntPtr credential); + + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool CredWrite([In] ref CREDENTIAL userCredential, uint flags); + + [DllImport("advapi32.dll", SetLastError = true)] + private static extern void CredFree(IntPtr cred); + + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool CredDelete(string target, uint type, uint flags); + + /// + /// Windows Credential Manager에서 토큰을 읽습니다. + /// 저장된 자격증명이 없으면 환경변수에서 폴백합니다. + /// + public static string? GetToken(string key) + { + if (string.IsNullOrEmpty(key)) return null; + + try + { + if (CredRead(key, CRED_TYPE_GENERIC, 0, out IntPtr ptr)) + { + try + { + var cred = Marshal.PtrToStructure(ptr); + if (cred.CredentialBlobSize > 0 && cred.CredentialBlob != IntPtr.Zero) + return Marshal.PtrToStringUni(cred.CredentialBlob, + (int)cred.CredentialBlobSize / 2); + } + finally + { + CredFree(ptr); + } + } + } + catch (Exception ex) + { + LogService.Warn($"Windows Credential Manager 읽기 실패 ({key}): {ex.Message}"); + } + + // 환경변수 폴백 (개발 환경용) + return Environment.GetEnvironmentVariable(key.ToUpperInvariant()); + } + + /// + /// Windows Credential Manager에 토큰을 DPAPI로 암호화하여 저장합니다. + /// + public static void SetToken(string key, string token) + { + if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(token)) return; + + var blob = Encoding.Unicode.GetBytes(token); + var blobPtr = Marshal.AllocHGlobal(blob.Length); + var targetPtr = Marshal.StringToCoTaskMemUni(key); + var userPtr = Marshal.StringToCoTaskMemUni(Environment.UserName); + + try + { + Marshal.Copy(blob, 0, blobPtr, blob.Length); + var cred = new CREDENTIAL + { + Type = CRED_TYPE_GENERIC, + TargetName = targetPtr, + UserName = userPtr, + CredentialBlobSize = (uint)blob.Length, + CredentialBlob = blobPtr, + Persist = CRED_PERSIST_LOCAL_MACHINE, + }; + + if (!CredWrite(ref cred, 0)) + LogService.Error($"토큰 저장 실패: {key}, 오류 코드: {Marshal.GetLastWin32Error()}"); + else + LogService.Info($"토큰 저장 완료: {key}"); + } + finally + { + Marshal.FreeHGlobal(blobPtr); + Marshal.FreeCoTaskMem(targetPtr); + Marshal.FreeCoTaskMem(userPtr); + } + } + + /// + /// Windows Credential Manager에서 자격증명을 삭제합니다. + /// + public static bool DeleteToken(string key) => + !string.IsNullOrEmpty(key) && CredDelete(key, CRED_TYPE_GENERIC, 0); +} diff --git a/src/AxCopilot/Handlers/MediaHandler.cs b/src/AxCopilot/Handlers/MediaHandler.cs new file mode 100644 index 0000000..79aa208 --- /dev/null +++ b/src/AxCopilot/Handlers/MediaHandler.cs @@ -0,0 +1,107 @@ +using System.Runtime.InteropServices; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 미디어 컨트롤 핸들러. "media" 프리픽스로 사용합니다. +/// 예: media play → 재생/일시정지 +/// media next → 다음 트랙 +/// media prev → 이전 트랙 +/// media vol+ → 볼륨 올리기 +/// media vol- → 볼륨 낮추기 +/// media mute → 음소거 토글 +/// +public class MediaHandler : IActionHandler +{ + public string? Prefix => "media"; + + public PluginMetadata Metadata => new( + "MediaControl", + "미디어 컨트롤 — media 뒤에 명령어 입력", + "1.0", + "AX"); + + // Windows 미디어/볼륨 가상 키 코드 + private const byte VK_MEDIA_PLAY_PAUSE = 0xB3; + private const byte VK_MEDIA_NEXT_TRACK = 0xB0; + private const byte VK_MEDIA_PREV_TRACK = 0xB1; + private const byte VK_VOLUME_UP = 0xAF; + private const byte VK_VOLUME_DOWN = 0xAE; + private const byte VK_VOLUME_MUTE = 0xAD; + + // KEYEVENTF flags + private const uint KEYEVENTF_EXTENDEDKEY = 0x0001; + private const uint KEYEVENTF_KEYUP = 0x0002; + + [DllImport("user32.dll", SetLastError = false)] + private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, nuint dwExtraInfo); + + // 명령어 → (제목, 설명, VK코드, 심볼) + private static readonly List<(string[] Keys, string Title, string Subtitle, byte Vk, string Symbol)> _commands = + [ + (["play", "pause", "pp"], "재생 / 일시정지", "현재 미디어 재생 또는 일시정지", VK_MEDIA_PLAY_PAUSE, Symbols.MediaPlay), + (["next", ">>"], "다음 트랙", "다음 곡으로 이동", VK_MEDIA_NEXT_TRACK, Symbols.MediaNext), + (["prev", "previous", "<<"], "이전 트랙", "이전 곡으로 이동", VK_MEDIA_PREV_TRACK, Symbols.MediaPrev), + (["vol+", "volup", "up"], "볼륨 올리기", "시스템 볼륨 증가", VK_VOLUME_UP, Symbols.VolumeUp), + (["vol-", "voldown", "down"], "볼륨 낮추기", "시스템 볼륨 감소", VK_VOLUME_DOWN, Symbols.VolumeDown), + (["mute", "음소거"], "음소거 토글", "볼륨 음소거 / 해제", VK_VOLUME_MUTE, Symbols.VolumeMute), + ]; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim().ToLowerInvariant(); + + IEnumerable<(string[] Keys, string Title, string Subtitle, byte Vk, string Symbol)> matches; + + if (string.IsNullOrEmpty(q)) + { + // 쿼리 없으면 전체 목록 표시 + matches = _commands; + } + else + { + // 입력어와 일치하는 명령 필터 + matches = _commands.Where(c => + c.Keys.Any(k => k.StartsWith(q, StringComparison.OrdinalIgnoreCase)) || + c.Title.Contains(q, StringComparison.OrdinalIgnoreCase)); + } + + var items = matches + .Select(c => new LauncherItem(c.Title, c.Subtitle, null, new MediaKeyData(c.Vk), Symbol: c.Symbol)) + .ToList(); + + if (items.Count == 0) + { + items.Add(new LauncherItem( + "알 수 없는 명령어", + "play · next · prev · vol+ · vol- · mute 중 하나를 입력하세요", + null, null, Symbol: Symbols.Warning)); + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not MediaKeyData data) return Task.CompletedTask; + + try + { + // 키 누름 → 키 뗌 + keybd_event(data.Vk, 0, KEYEVENTF_EXTENDEDKEY, 0); + keybd_event(data.Vk, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); + LogService.Info($"미디어 키 전송: VK=0x{data.Vk:X2}"); + } + catch (Exception ex) + { + LogService.Warn($"미디어 키 전송 실패: {ex.Message}"); + } + + return Task.CompletedTask; + } + + private record MediaKeyData(byte Vk); +} diff --git a/src/AxCopilot/Handlers/MonitorHandler.cs b/src/AxCopilot/Handlers/MonitorHandler.cs new file mode 100644 index 0000000..9f678c6 --- /dev/null +++ b/src/AxCopilot/Handlers/MonitorHandler.cs @@ -0,0 +1,163 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 시스템 리소스 모니터 핸들러. "monitor" 프리픽스로 사용합니다. +/// CPU, 메모리, 디스크, 프로세스 수 등 실시간 시스템 리소스 정보를 표시합니다. +/// 예: monitor → 전체 리소스 현황 +/// monitor cpu → CPU 관련 정보만 +/// monitor mem → 메모리 관련 정보만 +/// monitor disk → 디스크 사용량 +/// Enter → 결과를 클립보드에 복사. +/// +public class MonitorHandler : IActionHandler +{ + public string? Prefix => "monitor"; + + public PluginMetadata Metadata => new( + "Monitor", + "시스템 리소스 모니터 — monitor", + "1.0", + "AX"); + + [DllImport("kernel32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); + + [StructLayout(LayoutKind.Sequential)] + private struct MEMORYSTATUSEX + { + public uint dwLength; + public uint dwMemoryLoad; + public ulong ullTotalPhys; + public ulong ullAvailPhys; + public ulong ullTotalPageFile; + public ulong ullAvailPageFile; + public ulong ullTotalVirtual; + public ulong ullAvailVirtual; + public ulong ullAvailExtendedVirtual; + } + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim().ToLowerInvariant(); + var items = new List(); + + var showAll = string.IsNullOrWhiteSpace(q); + + // CPU + if (showAll || q.Contains("cpu") || q.Contains("프로세서")) + { + var cpuCount = Environment.ProcessorCount; + var processes = Process.GetProcesses().Length; + var threads = 0; + try { threads = Process.GetProcesses().Sum(p => { try { return p.Threads.Count; } catch (Exception) { return 0; } }); } + catch (Exception) { } + + items.Add(new LauncherItem( + $"CPU: {cpuCount}코어 · 프로세스 {processes}개 · 스레드 {threads:N0}개", + "Enter로 클립보드 복사", + null, $"CPU: {cpuCount}코어, 프로세스 {processes}개, 스레드 {threads:N0}개", + Symbol: Symbols.Processor)); + } + + // Memory + if (showAll || q.Contains("mem") || q.Contains("ram") || q.Contains("메모리")) + { + var mem = new MEMORYSTATUSEX { dwLength = (uint)Marshal.SizeOf() }; + GlobalMemoryStatusEx(ref mem); + var totalGB = mem.ullTotalPhys / (1024.0 * 1024 * 1024); + var usedGB = (mem.ullTotalPhys - mem.ullAvailPhys) / (1024.0 * 1024 * 1024); + var pct = mem.dwMemoryLoad; + + items.Add(new LauncherItem( + $"메모리: {usedGB:F1}GB / {totalGB:F1}GB ({pct}% 사용)", + $"사용 가능: {mem.ullAvailPhys / (1024.0 * 1024 * 1024):F1}GB · Enter로 복사", + null, $"메모리: {usedGB:F1}GB / {totalGB:F1}GB ({pct}% 사용)", + Symbol: Symbols.Memory)); + } + + // Disk + if (showAll || q.Contains("disk") || q.Contains("디스크") || q.Contains("저장")) + { + foreach (var drive in System.IO.DriveInfo.GetDrives()) + { + if (!drive.IsReady || drive.DriveType != System.IO.DriveType.Fixed) continue; + var totalGB = drive.TotalSize / (1024.0 * 1024 * 1024); + var freeGB = drive.AvailableFreeSpace / (1024.0 * 1024 * 1024); + var usedGB = totalGB - freeGB; + var pct = (int)(usedGB / totalGB * 100); + + items.Add(new LauncherItem( + $"디스크 {drive.Name.TrimEnd('\\')} {usedGB:F0}GB / {totalGB:F0}GB ({pct}%)", + $"여유: {freeGB:F1}GB · {drive.DriveFormat} · Enter로 복사", + null, $"디스크 {drive.Name}: {usedGB:F0}GB / {totalGB:F0}GB ({pct}%), 여유 {freeGB:F1}GB", + Symbol: Symbols.Storage)); + } + } + + // Uptime + if (showAll || q.Contains("uptime") || q.Contains("가동")) + { + var uptime = TimeSpan.FromMilliseconds(Environment.TickCount64); + var uptimeStr = uptime.Days > 0 + ? $"{uptime.Days}일 {uptime.Hours}시간 {uptime.Minutes}분" + : $"{uptime.Hours}시간 {uptime.Minutes}분"; + + items.Add(new LauncherItem( + $"가동 시간: {uptimeStr}", + "마지막 재시작 이후 경과 · Enter로 복사", + null, $"가동 시간: {uptimeStr}", + Symbol: Symbols.Clock)); + } + + // Top processes by memory + if (showAll || q.Contains("top") || q.Contains("프로세스")) + { + try + { + var topProcs = Process.GetProcesses() + .Where(p => { try { return p.WorkingSet64 > 0; } catch (Exception) { return false; } }) + .OrderByDescending(p => { try { return p.WorkingSet64; } catch (Exception) { return 0L; } }) + .Take(5) + .Select(p => + { + try { return $"{p.ProcessName} ({p.WorkingSet64 / (1024 * 1024)}MB)"; } + catch (Exception) { return p.ProcessName; } + }); + + items.Add(new LauncherItem( + "메모리 상위 프로세스", + string.Join(", ", topProcs), + null, $"메모리 상위: {string.Join(", ", topProcs)}", + Symbol: Symbols.Computer)); + } + catch (Exception) { } + } + + if (items.Count == 0) + { + items.Add(new LauncherItem( + $"'{q}'에 해당하는 리소스 항목 없음", + "cpu / mem / disk / uptime / top", + null, null, Symbol: Symbols.Warning)); + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text && !string.IsNullOrWhiteSpace(text)) + { + try { Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(text)); } + catch (Exception) { } + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/NoteHandler.cs b/src/AxCopilot/Handlers/NoteHandler.cs new file mode 100644 index 0000000..d29b867 --- /dev/null +++ b/src/AxCopilot/Handlers/NoteHandler.cs @@ -0,0 +1,215 @@ +using System.IO; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 빠른 메모 핸들러. "note" 프리픽스로 사용합니다. +/// 예: note → 최근 메모 10개 목록 (Enter로 클립보드 복사) +/// note 내일 회의 9시 → 메모 저장 (타임스탬프 자동 추가) +/// note clear → 전체 메모 삭제 +/// 저장 위치: %APPDATA%\AxCopilot\notes.txt +/// +public class NoteHandler : IActionHandler +{ + public string? Prefix => "note"; + + public PluginMetadata Metadata => new( + "Note", + "빠른 메모 — note 뒤에 내용 입력", + "1.0", + "AX"); + + private static readonly string NotesFile = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "notes.txt"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + // ─── 비어 있으면 최근 메모 목록 ────────────────────────────────────── + if (string.IsNullOrWhiteSpace(q)) + { + var notes = ReadNotes(); + if (!notes.Any()) + { + return Task.FromResult>( + [ + new LauncherItem( + "메모가 없습니다", + "note 뒤에 내용을 입력하면 저장됩니다", + null, null, Symbol: Symbols.Note) + ]); + } + + var items = notes.Take(10).Select(n => new LauncherItem( + n.Content.Length > 60 ? n.Content[..57] + "…" : n.Content, + $"{n.SavedAt:yyyy-MM-dd HH:mm} · Enter 복사 · Delete 삭제", + null, + n.Content, + Symbol: Symbols.Note)).ToList(); + + // 전체 삭제 항목 + items.Add(new LauncherItem( + "전체 메모 삭제", + $"총 {notes.Count}개 메모 모두 삭제 · Enter로 실행", + null, + "__CLEAR__", + Symbol: Symbols.Delete)); + + return Task.FromResult>(items); + } + + // ─── "clear" 명령 ───────────────────────────────────────────────── + if (q.Equals("clear", StringComparison.OrdinalIgnoreCase)) + { + var count = ReadNotes().Count; + return Task.FromResult>( + [ + new LauncherItem( + $"전체 메모 삭제 ({count}개)", + "모든 메모를 삭제합니다 · Enter로 실행", + null, + "__CLEAR__", + Symbol: Symbols.Delete) + ]); + } + + // ─── 새 메모 저장 미리보기 ──────────────────────────────────────────── + return Task.FromResult>( + [ + new LauncherItem( + $"메모 저장: {(q.Length > 60 ? q[..57] + "…" : q)}", + $"{DateTime.Now:yyyy-MM-dd HH:mm} · Enter로 저장", + null, + new ValueTuple("__SAVE__", q), + Symbol: Symbols.Note) + ]); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + switch (item.Data) + { + // ValueTuple 명시적 타입 매칭 (object? 패턴 안전하게) + case ValueTuple t when t.Item1 == "__SAVE__": + SaveNote(t.Item2); + NotificationService.Notify("AX Copilot", + $"메모 저장됨: {(t.Item2.Length > 30 ? t.Item2[..27] + "…" : t.Item2)}"); + break; + + case string text when text == "__CLEAR__": + ClearNotes(); + break; + + case string text: + try { Clipboard.SetText(text); } catch (Exception) { } + break; + } + return Task.CompletedTask; + } + + // ─── 파일 I/O ────────────────────────────────────────────────────────────── + + private static void SaveNote(string content) + { + try + { + Directory.CreateDirectory(Path.GetDirectoryName(NotesFile)!); + var line = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {content}{Environment.NewLine}"; + File.AppendAllText(NotesFile, line, System.Text.Encoding.UTF8); + } + catch (Exception ex) + { + LogService.Warn($"메모 저장 실패: {ex.Message}"); + } + } + + private static List ReadNotes() + { + var result = new List(); + if (!File.Exists(NotesFile)) return result; + + try + { + var lines = File.ReadAllLines(NotesFile, System.Text.Encoding.UTF8); + foreach (var line in lines.Reverse()) + { + if (string.IsNullOrWhiteSpace(line)) continue; + + // 형식: [yyyy-MM-dd HH:mm:ss] 내용 + if (line.StartsWith('[') && line.Length > 21 && line[20] == ']') + { + if (DateTime.TryParse(line[1..20], out var dt)) + { + result.Add(new NoteEntry(dt, line[22..].Trim())); + continue; + } + } + result.Add(new NoteEntry(DateTime.MinValue, line.Trim())); + } + } + catch (Exception ex) + { + LogService.Warn($"메모 읽기 실패: {ex.Message}"); + } + + return result; + } + + private static void ClearNotes() + { + try + { + if (File.Exists(NotesFile)) + File.Delete(NotesFile); + } + catch (Exception ex) + { + LogService.Warn($"메모 삭제 실패: {ex.Message}"); + } + } + + /// + /// 특정 메모 1건 삭제. content가 일치하는 가장 최근 항목을 제거합니다. + /// + public static bool DeleteNote(string content) + { + try + { + if (!File.Exists(NotesFile)) return false; + + var lines = File.ReadAllLines(NotesFile, System.Text.Encoding.UTF8).ToList(); + // 뒤에서부터 찾아 가장 최근 일치 항목 제거 + for (int i = lines.Count - 1; i >= 0; i--) + { + var line = lines[i]; + if (string.IsNullOrWhiteSpace(line)) continue; + + string extracted; + if (line.StartsWith('[') && line.Length > 21 && line[20] == ']') + extracted = line[22..].Trim(); + else + extracted = line.Trim(); + + if (extracted == content) + { + lines.RemoveAt(i); + File.WriteAllLines(NotesFile, lines, System.Text.Encoding.UTF8); + return true; + } + } + } + catch (Exception ex) + { + LogService.Warn($"메모 개별 삭제 실패: {ex.Message}"); + } + return false; + } +} + +internal record NoteEntry(DateTime SavedAt, string Content); diff --git a/src/AxCopilot/Handlers/PortHandler.cs b/src/AxCopilot/Handlers/PortHandler.cs new file mode 100644 index 0000000..84c60d8 --- /dev/null +++ b/src/AxCopilot/Handlers/PortHandler.cs @@ -0,0 +1,229 @@ +using System.Diagnostics; +using System.Net.NetworkInformation; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 포트/프로세스 점검 핸들러. "port " 프리픽스로 사용합니다. +/// 예: port → 활성 TCP 연결 목록 +/// port 8080 → 8080 포트를 점유 중인 프로세스 상세 +/// port chrome → chrome이 사용하는 포트 목록 +/// +public class PortHandler : IActionHandler +{ + public string? Prefix => "port"; + + public PluginMetadata Metadata => new( + "PortChecker", + "포트 & 프로세스 점검 — port 뒤에 포트번호 또는 프로세스명", + "1.0", + "AX"); + + // 프로세스 이름 캐시 (PID → 이름), 5초 유효 + private static readonly Dictionary _procCache = new(); + // netstat 결과 캐시 (포트 → PID), 5초 유효 — netstat 단일 실행으로 N+1 해결 + private static readonly Dictionary _pidMap = new(); + private static DateTime _cacheExpiry = DateTime.MinValue; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + RefreshProcessCache(); + + TcpConnectionInformation[] tcpConns; + + try + { + var props = IPGlobalProperties.GetIPGlobalProperties(); + tcpConns = props.GetActiveTcpConnections(); + } + catch (Exception ex) + { + LogService.Warn($"포트 조회 실패: {ex.Message}"); + return Task.FromResult>( + [ + new LauncherItem("네트워크 정보를 가져올 수 없습니다", ex.Message, null, null, Symbol: Symbols.Warning) + ]); + } + + var q = query.Trim(); + + // ─── 빈 쿼리: 활성 연결 상위 목록 ──────────────────────────────────── + if (string.IsNullOrWhiteSpace(q)) + { + var items = tcpConns + .Where(c => c.State == TcpState.Established || c.State == TcpState.Listen) + .OrderBy(c => c.LocalEndPoint.Port) + .Take(20) + .Select(c => + { + var procName = GetProcessNameForPort(c.LocalEndPoint.Port); + var state = c.State == TcpState.Listen ? "LISTEN" : "ESTABLISHED"; + return new LauncherItem( + $":{c.LocalEndPoint.Port} → {c.RemoteEndPoint}", + $"{state} · {procName} · Enter로 포트번호 복사", + null, + c.LocalEndPoint.Port.ToString(), + Symbol: Symbols.Network); + }) + .ToList(); + + if (!items.Any()) + items.Add(new LauncherItem("활성 연결 없음", "TCP 연결이 감지되지 않았습니다", null, null, Symbol: Symbols.Network)); + + return Task.FromResult>(items); + } + + // ─── 숫자: 포트 번호 검색 ───────────────────────────────────────────── + if (int.TryParse(q, out var portNum)) + { + var matches = tcpConns + .Where(c => c.LocalEndPoint.Port == portNum || c.RemoteEndPoint.Port == portNum) + .ToList(); + + if (!matches.Any()) + { + return Task.FromResult>( + [ + new LauncherItem( + $"포트 {portNum} — 사용 중 아님", + "해당 포트를 사용하는 TCP 연결이 없습니다", + null, + portNum.ToString(), + Symbol: Symbols.Info) + ]); + } + + var result = matches.Select(c => + { + var procName = GetProcessNameForPort(c.LocalEndPoint.Port); + var pid = GetPidForPort(c.LocalEndPoint.Port); + return new LauncherItem( + $":{c.LocalEndPoint.Port} ←→ {c.RemoteEndPoint}", + $"{c.State} · {procName} (PID {pid}) · Enter로 PID 복사", + null, + pid > 0 ? pid.ToString() : portNum.ToString(), + Symbol: Symbols.Network); + }).ToList(); + + return Task.FromResult>(result); + } + + // ─── 문자열: 프로세스명 검색 ────────────────────────────────────────── + var procLower = q.ToLowerInvariant(); + var procPorts = tcpConns + .Where(c => + { + var name = GetProcessNameForPort(c.LocalEndPoint.Port).ToLowerInvariant(); + return name.Contains(procLower); + }) + .Take(15) + .Select(c => + { + var procName = GetProcessNameForPort(c.LocalEndPoint.Port); + return new LauncherItem( + $"{procName} : {c.LocalEndPoint.Port} → {c.RemoteEndPoint}", + $"{c.State} · Enter로 포트번호 복사", + null, + c.LocalEndPoint.Port.ToString(), + Symbol: Symbols.Network); + }) + .ToList(); + + if (!procPorts.Any()) + procPorts.Add(new LauncherItem( + $"'{q}' — 연결 없음", + "해당 프로세스의 TCP 연결이 없습니다", + null, null, Symbol: Symbols.Warning)); + + return Task.FromResult>(procPorts); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text) + { + try { System.Windows.Clipboard.SetText(text); } catch (Exception) { } + } + return Task.CompletedTask; + } + + // ─── 프로세스/PID 캐시 헬퍼 ────────────────────────────────────────────────── + + /// + /// 프로세스 목록 + netstat PID 맵을 한 번에 갱신 (5초 캐시). + /// GetItemsAsync 진입 시 한 번만 호출하여 N+1 netstat 실행 방지. + /// + private static void RefreshProcessCache() + { + if (DateTime.Now < _cacheExpiry) return; + + _procCache.Clear(); + _pidMap.Clear(); + + // ① 프로세스 목록 (PID → 이름) + try + { + foreach (var p in Process.GetProcesses()) + { + try { _procCache[p.Id] = p.ProcessName; } + catch (Exception) { } + } + } + catch (Exception ex) + { + LogService.Warn($"프로세스 목록 갱신 실패: {ex.Message}"); + } + + // ② netstat -ano 단 1회 실행 → 포트→PID 전체 맵 구축 + try + { + var psi = new ProcessStartInfo("netstat", "-ano") + { + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true + }; + using var proc = Process.Start(psi); + if (proc != null) + { + var output = proc.StandardOutput.ReadToEnd(); + proc.WaitForExit(2000); + + foreach (var line in output.Split('\n')) + { + var parts = line.Trim().Split([' ', '\t'], StringSplitOptions.RemoveEmptyEntries); + // 형식: Proto Local Address Foreign Address State PID + if (parts.Length < 5) continue; + if (!int.TryParse(parts[^1], out var pid)) continue; + + // Local Address에서 포트 추출 (예: 0.0.0.0:8080 또는 [::]:8080) + var localAddr = parts[1]; + var colonIdx = localAddr.LastIndexOf(':'); + if (colonIdx >= 0 && int.TryParse(localAddr[(colonIdx + 1)..], out var port)) + _pidMap.TryAdd(port, pid); + } + } + } + catch (Exception ex) + { + LogService.Warn($"netstat 실행 실패: {ex.Message}"); + } + + _cacheExpiry = DateTime.Now.AddSeconds(5); + } + + private static string GetProcessNameForPort(int port) + { + var pid = GetPidForPort(port); + return pid > 0 && _procCache.TryGetValue(pid, out var name) ? name : "알 수 없음"; + } + + /// + /// 캐시된 pidMap에서 즉시 반환 — netstat를 추가로 실행하지 않음. + /// + private static int GetPidForPort(int port) + => _pidMap.TryGetValue(port, out var pid) ? pid : -1; +} diff --git a/src/AxCopilot/Handlers/ProcessHandler.cs b/src/AxCopilot/Handlers/ProcessHandler.cs new file mode 100644 index 0000000..cbce7e3 --- /dev/null +++ b/src/AxCopilot/Handlers/ProcessHandler.cs @@ -0,0 +1,127 @@ +using System.Diagnostics; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 실행 중인 프로세스를 검색하고 종료합니다. "kill " 프리픽스로 사용합니다. +/// 예: kill chrome → Chrome 프로세스 목록 표시 후 선택하면 종료 +/// kill → 현재 실행 중인 모든 사용자 프로세스 표시 +/// +public class ProcessHandler : IActionHandler +{ + public string? Prefix => "kill "; // 뒤에 공백 포함 — 오탐 방지 + + public PluginMetadata Metadata => new( + "ProcessKiller", + "프로세스 종료 — kill 뒤에 프로세스명 입력", + "1.0", + "AX"); + + // 시스템 핵심 프로세스 보호 목록 (종료 방지) + private static readonly HashSet ProtectedProcesses = new(StringComparer.OrdinalIgnoreCase) + { + "system", "smss", "csrss", "wininit", "winlogon", "services", "lsass", + "svchost", "explorer", "dwm", "fontdrvhost", "spoolsv", "registry", + }; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(query)) + { + return Task.FromResult>( + [ + new LauncherItem( + "종료할 프로세스명을 입력하세요", + "예: kill chrome · kill notepad · kill explorer", + null, null, Symbol: Symbols.Power) + ]); + } + + var q = query.Trim().ToLowerInvariant(); + + try + { + var processes = Process.GetProcesses() + .Where(p => + !ProtectedProcesses.Contains(p.ProcessName) && + p.ProcessName.ToLowerInvariant().Contains(q)) + .OrderBy(p => p.ProcessName) + .Take(12) + .ToList(); + + if (processes.Count == 0) + { + return Task.FromResult>( + [ + new LauncherItem( + $"'{query}' 프로세스를 찾을 수 없습니다", + "실행 중인 프로세스가 없거나 이름이 다릅니다", + null, null, Symbol: Symbols.Warning) + ]); + } + + // 같은 이름의 프로세스 묶기 + var grouped = processes + .GroupBy(p => p.ProcessName, StringComparer.OrdinalIgnoreCase) + .Select(g => + { + var pids = g.Select(p => p.Id).ToList(); + var memMb = g.Sum(p => + { + try { return p.WorkingSet64 / 1024 / 1024; } + catch (Exception) { return 0L; } + }); + var title = g.Count() > 1 + ? $"{g.Key} ({g.Count()}개 인스턴스)" + : g.Key; + var subtitle = $"PID: {string.Join(", ", pids)} · 메모리: {memMb} MB · Enter로 종료"; + + return new LauncherItem( + title, + subtitle, + null, + new ProcessKillData(g.Key, pids), + Symbol: Symbols.Power); + }) + .ToList(); + + return Task.FromResult>(grouped); + } + catch (Exception ex) + { + LogService.Warn($"프로세스 목록 조회 실패: {ex.Message}"); + return Task.FromResult>( + [ + new LauncherItem("프로세스 목록 조회 실패", ex.Message, null, null, Symbol: Symbols.Error) + ]); + } + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not ProcessKillData data) return Task.CompletedTask; + + int killed = 0, failed = 0; + foreach (var pid in data.Pids) + { + try + { + var proc = Process.GetProcessById(pid); + proc.Kill(entireProcessTree: false); + killed++; + } + catch (Exception) + { + failed++; + } + } + + LogService.Info($"프로세스 종료: {data.Name} — {killed}개 성공, {failed}개 실패"); + return Task.CompletedTask; + } + + private record ProcessKillData(string Name, List Pids); +} diff --git a/src/AxCopilot/Handlers/QuickLinkHandler.cs b/src/AxCopilot/Handlers/QuickLinkHandler.cs new file mode 100644 index 0000000..c739ee7 --- /dev/null +++ b/src/AxCopilot/Handlers/QuickLinkHandler.cs @@ -0,0 +1,127 @@ +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// Phase L3-4: 파라미터 퀵링크 핸들러. "ql" 예약어로 사용합니다. +/// 예: ql maps 강남역 → "maps" 키워드 URL에 "강남역" 치환 후 열기 +/// ql jira PROJ-1234 → "jira" 키워드 URL에 티켓 번호 치환 +/// ql (목록) → 등록된 퀵링크 목록 표시 +/// +/// 퀵링크는 설정 → 일반 → 퀵링크 탭에서 등록합니다. +/// +public class QuickLinkHandler : IActionHandler +{ + private readonly SettingsService _settings; + + public string? Prefix => "ql"; + + public PluginMetadata Metadata => new( + "QuickLink", + "파라미터 퀵링크 — ql [키워드] [인자]", + "1.0", + "AX"); + + public QuickLinkHandler(SettingsService settings) => _settings = settings; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var links = _settings.Settings.QuickLinks; + + // 등록된 퀵링크 없음 + if (links.Count == 0) + { + return Task.FromResult>( + [ + new LauncherItem( + "등록된 퀵링크 없음", + "설정 → 일반 → 퀵링크에서 추가하세요. 예: keyword=maps, url=https://map.naver.com/p/search/{0}", + null, null, Symbol: Symbols.Globe) + ]); + } + + var items = new List(); + var parts = query.Trim().Split(' ', 2, StringSplitOptions.RemoveEmptyEntries); + + if (parts.Length == 0) + { + // 쿼리 없음 — 전체 목록 표시 + foreach (var link in links) + { + items.Add(new LauncherItem( + link.Name.Length > 0 ? link.Name : link.Keyword, + $"ql {link.Keyword} [인자] · {link.Description} · {link.UrlTemplate}", + null, null, Symbol: Symbols.Globe)); + } + return Task.FromResult>(items); + } + + var keyword = parts[0].ToLowerInvariant(); + var argQuery = parts.Length > 1 ? parts[1] : ""; + + // 키워드로 정확 일치 검색 + var matched = links.Where(l => l.Keyword.ToLowerInvariant() == keyword).ToList(); + + if (matched.Count > 0 && !string.IsNullOrWhiteSpace(argQuery)) + { + // 인자가 있으면 URL 치환 후 실행 항목 생성 + foreach (var link in matched) + { + var url = UrlTemplateEngine.ExpandFromQuery(link.UrlTemplate, argQuery); + items.Add(new LauncherItem( + $"{(link.Name.Length > 0 ? link.Name : link.Keyword)}: {argQuery}", + url, + null, url, Symbol: Symbols.Globe)); + } + } + else + { + // 키워드 퍼지 검색 (부분 일치) + var fuzzy = links + .Where(l => l.Keyword.Contains(keyword, StringComparison.OrdinalIgnoreCase) || + l.Name.Contains(keyword, StringComparison.OrdinalIgnoreCase)) + .ToList(); + + if (fuzzy.Count == 0) + { + items.Add(new LauncherItem( + $"'{keyword}'에 해당하는 퀵링크 없음", + "설정에서 새 퀵링크를 추가하세요", + null, null, Symbol: Symbols.Globe)); + } + else + { + foreach (var link in fuzzy) + { + var hint = UrlTemplateEngine.GetPlaceholders(link.UrlTemplate); + var ph = hint.Count > 0 ? $" · 인자: {string.Join(", ", hint)}" : ""; + items.Add(new LauncherItem( + $"ql {link.Keyword}{ph}", + link.Description.Length > 0 ? link.Description : link.UrlTemplate, + null, null, Symbol: Symbols.Globe)); + } + } + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string url && !string.IsNullOrWhiteSpace(url)) + { + try + { + System.Diagnostics.Process.Start( + new System.Diagnostics.ProcessStartInfo(url) { UseShellExecute = true }); + } + catch (Exception ex) + { + LogService.Warn($"퀵링크 열기 실패: {ex.Message}"); + } + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/RecentFilesHandler.cs b/src/AxCopilot/Handlers/RecentFilesHandler.cs new file mode 100644 index 0000000..3fce5a9 --- /dev/null +++ b/src/AxCopilot/Handlers/RecentFilesHandler.cs @@ -0,0 +1,141 @@ +using System.IO; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 최근 파일 핸들러. "recent" 프리픽스로 사용합니다. +/// Windows Recent 폴더(%APPDATA%\Microsoft\Windows\Recent)의 .lnk 파일을 +/// 최근 수정 순으로 나열합니다. +/// 예: recent → 최근 20개 파일 목록 +/// recent 보고서 → 이름에 "보고서" 포함 파일 필터 +/// +public class RecentFilesHandler : IActionHandler +{ + public string? Prefix => "recent"; + + public PluginMetadata Metadata => new( + "RecentFiles", + "최근 파일 — recent 뒤에 검색어 입력", + "1.0", + "AX"); + + private static readonly string RecentFolder = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + @"Microsoft\Windows\Recent"); + + // 간단한 캐시: 10초간 유효 + private static (DateTime At, List<(string Name, string LinkPath, DateTime Modified)> Files)? _cache; + private static readonly TimeSpan CacheTtl = TimeSpan.FromSeconds(10); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + if (string.IsNullOrWhiteSpace(q)) + { + // 힌트만 표시 + } + + var files = GetRecentFiles(); + IEnumerable<(string Name, string LinkPath, DateTime Modified)> filtered = files; + + if (!string.IsNullOrWhiteSpace(q)) + { + filtered = files.Where(f => + f.Name.Contains(q, StringComparison.OrdinalIgnoreCase)); + } + + var items = filtered.Take(20).Select(f => new LauncherItem( + f.Name, + $"{f.Modified:yyyy-MM-dd HH:mm} · Enter로 열기", + null, + f.LinkPath, + Symbol: GetSymbol(f.Name))).ToList(); + + if (!items.Any()) + { + items.Add(new LauncherItem( + string.IsNullOrWhiteSpace(q) ? "최근 파일 없음" : "검색 결과 없음", + string.IsNullOrWhiteSpace(q) + ? "Windows Recent 폴더가 비어 있습니다" + : $"'{q}' 파일을 최근 목록에서 찾을 수 없습니다", + null, null, Symbol: Symbols.Info)); + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string linkPath && File.Exists(linkPath)) + { + try + { + System.Diagnostics.Process.Start( + new System.Diagnostics.ProcessStartInfo(linkPath) + { UseShellExecute = true }); + } + catch (Exception ex) + { + LogService.Warn($"최근 파일 열기 실패: {ex.Message}"); + } + } + return Task.CompletedTask; + } + + // ─── 내부 ───────────────────────────────────────────────────────────────── + + private static List<(string Name, string LinkPath, DateTime Modified)> GetRecentFiles() + { + // 캐시 유효 확인 + if (_cache.HasValue && (DateTime.Now - _cache.Value.At) < CacheTtl) + return _cache.Value.Files; + + var result = new List<(string, string, DateTime)>(); + + try + { + if (!Directory.Exists(RecentFolder)) + return result; + + var lnkFiles = Directory + .GetFiles(RecentFolder, "*.lnk") + .Select(p => (Path: p, Info: new FileInfo(p))) + .OrderByDescending(f => f.Info.LastWriteTime) + .Take(100) + .ToList(); + + foreach (var (path, info) in lnkFiles) + { + var name = Path.GetFileNameWithoutExtension(info.Name); + result.Add((name, path, info.LastWriteTime)); + } + } + catch (Exception ex) + { + LogService.Warn($"최근 파일 목록 읽기 실패: {ex.Message}"); + } + + _cache = (DateTime.Now, result); + return result; + } + + private static string GetSymbol(string name) + { + var ext = Path.GetExtension(name).ToLowerInvariant(); + return ext switch + { + ".exe" or ".msi" => Symbols.App, + ".xlsx" or ".xls" or ".csv" => Symbols.File, + ".docx" or ".doc" => Symbols.File, + ".pptx" or ".ppt" => Symbols.File, + ".pdf" => Symbols.File, + ".txt" or ".md" or ".log" => Symbols.Text, + ".jpg" or ".jpeg" or ".png" or ".gif" or ".webp" or ".bmp" => Symbols.Picture, + _ => Symbols.File + }; + } +} diff --git a/src/AxCopilot/Handlers/RenameHandler.cs b/src/AxCopilot/Handlers/RenameHandler.cs new file mode 100644 index 0000000..036d1e5 --- /dev/null +++ b/src/AxCopilot/Handlers/RenameHandler.cs @@ -0,0 +1,189 @@ +using System.Diagnostics; +using System.IO; +using System.Text.RegularExpressions; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 파일 일괄 이름변경 핸들러. "rename" 프리픽스로 사용합니다. +/// 지정된 폴더 내 파일을 패턴으로 일괄 이름변경합니다. +/// 예: rename → 사용법 안내 +/// rename C:\work\*.xlsx → 해당 폴더의 xlsx 파일 목록 +/// rename C:\work\*.xlsx 보고서_{n} → 보고서_1.xlsx, 보고서_2.xlsx ... +/// {n}=순번, {date}=오늘 날짜, {orig}=원본명 +/// Enter → 실행 전 미리보기, Shift+Enter → 실행. +/// +public class RenameHandler : IActionHandler +{ + public string? Prefix => "rename"; + + public PluginMetadata Metadata => new( + "Rename", + "파일 일괄 이름변경 — rename", + "1.0", + "AX"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + if (string.IsNullOrWhiteSpace(q)) + { + return Task.FromResult>( + [ + new LauncherItem( + "파일 일괄 이름변경", + "rename [폴더\\패턴] [새이름 템플릿]", + null, null, Symbol: Symbols.Rename), + new LauncherItem( + "사용 예시", + "rename C:\\work\\*.xlsx 보고서_{n} → 보고서_1.xlsx, 보고서_2.xlsx ...", + null, null, Symbol: Symbols.Info), + new LauncherItem( + "변수: {n} 순번, {date} 날짜, {orig} 원본명", + "rename D:\\photos\\*.jpg {date}_{n} → 2026-03-27_1.jpg ...", + null, null, Symbol: Symbols.Info), + ]); + } + + // 파싱: [경로\패턴] [템플릿] + var parts = q.Split(' ', 2, StringSplitOptions.TrimEntries); + var pattern = parts[0]; + var template = parts.Length > 1 ? parts[1] : null; + + // 경로 분리 + var dir = Path.GetDirectoryName(pattern); + var glob = Path.GetFileName(pattern); + + if (string.IsNullOrWhiteSpace(dir) || !Directory.Exists(dir)) + { + return Task.FromResult>( + [ + new LauncherItem( + "폴더를 찾을 수 없습니다", + $"경로: {dir ?? "(비어 있음)"}", + null, null, Symbol: Symbols.Warning) + ]); + } + + string[] files; + try { files = Directory.GetFiles(dir, glob); } + catch (Exception) { files = Array.Empty(); } + + if (files.Length == 0) + { + return Task.FromResult>( + [ + new LauncherItem( + "일치하는 파일이 없습니다", + $"패턴: {glob} · 폴더: {dir}", + null, null, Symbol: Symbols.Warning) + ]); + } + + Array.Sort(files); + + // 템플릿이 없으면 파일 목록만 표시 + if (string.IsNullOrWhiteSpace(template)) + { + var items = files.Take(10).Select((f, i) => new LauncherItem( + Path.GetFileName(f), + dir, + null, null, + Symbol: Symbols.File)).ToList(); + + items.Insert(0, new LauncherItem( + $"총 {files.Length}개 파일 발견", + "뒤에 새 이름 템플릿을 추가하세요 (예: 보고서_{n})", + null, null, Symbol: Symbols.Info)); + + return Task.FromResult>(items); + } + + // 미리보기 생성 + var today = DateTime.Today.ToString("yyyy-MM-dd"); + var previews = new List<(string From, string To)>(); + for (int i = 0; i < files.Length; i++) + { + var origName = Path.GetFileNameWithoutExtension(files[i]); + var ext = Path.GetExtension(files[i]); + var newName = template + .Replace("{n}", (i + 1).ToString()) + .Replace("{date}", today) + .Replace("{orig}", origName); + // 확장자 자동 유지 (템플릿에 확장자가 없으면) + if (!Path.HasExtension(newName)) + newName += ext; + previews.Add((Path.GetFileName(files[i]), newName)); + } + + var result = new List(); + + // 실행 항목 + result.Add(new LauncherItem( + $"총 {files.Length}개 파일 이름변경 실행", + $"Enter로 실행 · {previews[0].From} → {previews[0].To} ...", + null, ValueTuple.Create(dir, files, previews.Select(p => p.To).ToArray()), + Symbol: Symbols.Rename)); + + // 미리보기 (최대 8개) + foreach (var (from, to) in previews.Take(8)) + { + result.Add(new LauncherItem( + $"{from} → {to}", + "미리보기", + null, null, + Symbol: Symbols.File)); + } + + if (files.Length > 8) + { + result.Add(new LauncherItem( + $"... 외 {files.Length - 8}개", + "", + null, null, + Symbol: Symbols.Info)); + } + + return Task.FromResult>(result); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not ValueTuple data) + return Task.CompletedTask; + + var (dir, files, newNames) = data; + int renamed = 0; + int failed = 0; + + for (int i = 0; i < files.Length && i < newNames.Length; i++) + { + try + { + var dest = Path.Combine(dir, newNames[i]); + if (File.Exists(dest)) + { + failed++; + continue; + } + File.Move(files[i], dest); + renamed++; + } + catch (Exception) + { + failed++; + } + } + + var msg = failed > 0 + ? $"{renamed}개 이름변경 완료, {failed}개 실패 (이미 존재하거나 접근 불가)" + : $"{renamed}개 파일 이름변경 완료"; + NotificationService.Notify("AX Copilot", msg); + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/RoutineHandler.cs b/src/AxCopilot/Handlers/RoutineHandler.cs new file mode 100644 index 0000000..d9885fd --- /dev/null +++ b/src/AxCopilot/Handlers/RoutineHandler.cs @@ -0,0 +1,186 @@ +using System.Diagnostics; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 루틴 자동화 핸들러. "routine" 프리픽스로 사용합니다. +/// 등록된 루틴을 실행하면 앱·폴더·URL을 순서대로 일괄 실행합니다. +/// 예: routine → 등록된 루틴 목록 +/// routine morning → "morning" 루틴 실행 +/// routine add morning → 루틴 추가 안내 +/// 루틴 정의: %APPDATA%\AxCopilot\routines.json +/// +public class RoutineHandler : IActionHandler +{ + public string? Prefix => "routine"; + + public PluginMetadata Metadata => new( + "Routine", + "루틴 자동화 — routine", + "1.0", + "AX"); + + private static readonly string RoutineFile = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "routines.json"); + + private static readonly JsonSerializerOptions JsonOpts = new() { WriteIndented = true, PropertyNameCaseInsensitive = true }; + + // 내장 기본 루틴 + private static readonly RoutineDefinition[] BuiltInRoutines = + [ + new("morning", "출근 루틴", [ + new("app", "explorer.exe", "파일 탐색기"), + new("info", "info", "시스템 정보 표시"), + ]), + new("endofday", "퇴근 루틴", [ + new("cmd", "journal", "오늘 업무 일지 생성"), + ]), + ]; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + var all = LoadRoutines(); + + if (string.IsNullOrWhiteSpace(q)) + { + var items = new List + { + new("루틴 자동화", + $"총 {all.Count}개 루틴 · 이름 입력 시 실행 · routines.json에서 편집", + null, null, Symbol: Symbols.Info) + }; + + foreach (var r in all) + { + var steps = string.Join(" → ", r.Steps.Select(s => s.Label)); + items.Add(new LauncherItem( + $"[{r.Name}] {r.Description}", + $"{r.Steps.Length}단계: {steps} · Enter로 실행", + null, r, + Symbol: Symbols.Lightbulb)); + } + + return Task.FromResult>(items); + } + + // 루틴 검색/실행 + var match = all.FirstOrDefault(r => + r.Name.Equals(q, StringComparison.OrdinalIgnoreCase)); + + if (match != null) + { + var steps = string.Join(" → ", match.Steps.Select(s => s.Label)); + return Task.FromResult>( + [ + new LauncherItem( + $"[{match.Name}] 루틴 실행", + $"{match.Description} · {steps}", + null, match, + Symbol: Symbols.Lightbulb) + ]); + } + + // 부분 매칭 + var filtered = all.Where(r => + r.Name.Contains(q, StringComparison.OrdinalIgnoreCase) || + r.Description.Contains(q, StringComparison.OrdinalIgnoreCase)); + + var result = filtered.Select(r => new LauncherItem( + $"[{r.Name}] {r.Description}", + $"{r.Steps.Length}단계 · Enter로 실행", + null, r, + Symbol: Symbols.Lightbulb)).ToList(); + + if (!result.Any()) + { + result.Add(new LauncherItem( + $"'{q}' 루틴 없음", + $"routines.json에서 직접 추가하거나 routine으로 목록 확인", + null, null, Symbol: Symbols.Warning)); + } + + return Task.FromResult>(result); + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not RoutineDefinition routine) return; + + int executed = 0; + foreach (var step in routine.Steps) + { + try + { + switch (step.Type.ToLowerInvariant()) + { + case "app": + case "url": + case "folder": + Process.Start(new ProcessStartInfo(step.Target) { UseShellExecute = true }); + break; + case "cmd": + // PowerShell 명령 실행 + Process.Start(new ProcessStartInfo("powershell.exe", $"-Command \"{step.Target}\"") + { UseShellExecute = false, CreateNoWindow = true }); + break; + case "info": + // 알림으로 대체 + NotificationService.Notify("루틴", step.Label); + break; + } + executed++; + await Task.Delay(300, ct); // 앱 간 간격 + } + catch (Exception ex) + { + LogService.Warn($"루틴 단계 실행 실패: {step.Label} — {ex.Message}"); + } + } + + NotificationService.Notify("루틴 완료", $"[{routine.Name}] {executed}/{routine.Steps.Length}단계 실행 완료"); + } + + private List LoadRoutines() + { + var list = new List(BuiltInRoutines); + + try + { + if (File.Exists(RoutineFile)) + { + var json = File.ReadAllText(RoutineFile); + var user = JsonSerializer.Deserialize>(json, JsonOpts); + if (user != null) + { + // 사용자 루틴이 내장 루틴을 오버라이드 + foreach (var r in user) + { + list.RemoveAll(x => x.Name.Equals(r.Name, StringComparison.OrdinalIgnoreCase)); + list.Add(r); + } + } + } + } + catch (Exception ex) { LogService.Warn($"루틴 로드 실패: {ex.Message}"); } + + return list; + } + + internal record RoutineDefinition( + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("description")] string Description, + [property: JsonPropertyName("steps")] RoutineStep[] Steps); + + internal record RoutineStep( + [property: JsonPropertyName("type")] string Type, + [property: JsonPropertyName("target")] string Target, + [property: JsonPropertyName("label")] string Label); +} diff --git a/src/AxCopilot/Handlers/RunHandler.cs b/src/AxCopilot/Handlers/RunHandler.cs new file mode 100644 index 0000000..86751a6 --- /dev/null +++ b/src/AxCopilot/Handlers/RunHandler.cs @@ -0,0 +1,96 @@ +using System.Diagnostics; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Themes; +using AxCopilot.Views; + +namespace AxCopilot.Handlers; + +/// +/// Windows 실행(Run) 핸들러. "^" 프리픽스로 사용합니다. +/// Windows 실행 창(Win+R)에서 입력하는 것과 동일하게 작동합니다. +/// 예: ^ notepad → 메모장 실행 +/// ^ cmd → 명령 프롬프트 +/// ^ calc → 계산기 +/// ^ mspaint → 그림판 +/// ^ control → 제어판 +/// +public class RunHandler : IActionHandler +{ + public string? Prefix => "^"; + + public PluginMetadata Metadata => new( + "Run", + "Windows 실행 명령", + "1.0", + "AX Copilot"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + if (string.IsNullOrEmpty(q)) + { + return Task.FromResult>( + [ + new LauncherItem( + "Windows 실행 명령", + "Win+R 실행 창과 동일 · 명령어 입력 후 Enter", + null, null, + Symbol: Symbols.LaunchIcon), + new LauncherItem( + "^ notepad", + "메모장 실행", + null, null, Symbol: Symbols.Info), + new LauncherItem( + "^ cmd", + "명령 프롬프트", + null, null, Symbol: Symbols.Info), + new LauncherItem( + "^ control", + "제어판", + null, null, Symbol: Symbols.Info), + new LauncherItem( + "^ calc", + "계산기", + null, null, Symbol: Symbols.Info), + ]); + } + + return Task.FromResult>( + [ + new LauncherItem( + $"실행: {q}", + "Enter → Windows 실행 명령으로 실행", + null, $"__RUN__{q}", + Symbol: Symbols.LaunchIcon) + ]); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + var data = item.Data as string; + if (data == null || !data.StartsWith("__RUN__")) return Task.CompletedTask; + + var cmd = data["__RUN__".Length..].Trim(); + if (string.IsNullOrEmpty(cmd)) return Task.CompletedTask; + + try + { + Process.Start(new ProcessStartInfo(cmd) + { + UseShellExecute = true + })?.Dispose(); + } + catch (Exception ex) + { + CustomMessageBox.Show( + $"실행 실패: {ex.Message}", + "AX Copilot", + MessageBoxButton.OK, + MessageBoxImage.Error); + } + + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/ScaffoldHandler.cs b/src/AxCopilot/Handlers/ScaffoldHandler.cs new file mode 100644 index 0000000..affff00 --- /dev/null +++ b/src/AxCopilot/Handlers/ScaffoldHandler.cs @@ -0,0 +1,237 @@ +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 프로젝트 스캐폴딩 핸들러. "scaffold" 프리픽스로 사용합니다. +/// 로컬 템플릿으로 프로젝트 폴더 구조를 일괄 생성합니다. +/// 예: scaffold → 등록된 템플릿 목록 +/// scaffold webapi → "webapi" 템플릿 적용 +/// scaffold add [이름] → 현재 폴더 구조를 템플릿으로 저장 (별도 도구에서) +/// 템플릿 저장 위치: %APPDATA%\AxCopilot\templates\[이름].json +/// Enter → 대상 경로를 물어본 후 생성. +/// +public class ScaffoldHandler : IActionHandler +{ + public string? Prefix => "scaffold"; + + public PluginMetadata Metadata => new( + "Scaffold", + "프로젝트 스캐폴딩 — scaffold", + "1.0", + "AX"); + + private static readonly string TemplateDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "templates"); + + // 내장 기본 템플릿 + private static readonly ScaffoldTemplate[] BuiltInTemplates = + [ + new("webapi", "Web API 프로젝트", new[] + { + "src/Controllers/", + "src/Models/", + "src/Services/", + "src/Middleware/", + "tests/", + "docs/", + "README.md", + ".gitignore", + }), + new("console", "콘솔 애플리케이션", new[] + { + "src/", + "src/Core/", + "src/Services/", + "tests/", + "README.md", + }), + new("wpf", "WPF 데스크톱 앱", new[] + { + "src/Views/", + "src/ViewModels/", + "src/Models/", + "src/Services/", + "src/Themes/", + "src/Assets/", + "tests/", + "docs/", + }), + new("data", "데이터 파이프라인", new[] + { + "src/Extractors/", + "src/Transformers/", + "src/Loaders/", + "config/", + "scripts/", + "tests/", + "data/input/", + "data/output/", + "README.md", + }), + new("docs", "문서 프로젝트", new[] + { + "docs/", + "images/", + "templates/", + "README.md", + "CHANGELOG.md", + }), + ]; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + // 사용자 정의 템플릿 로드 + var userTemplates = LoadUserTemplates(); + var allTemplates = BuiltInTemplates.Concat(userTemplates).ToList(); + + if (string.IsNullOrWhiteSpace(q)) + { + var items = allTemplates.Select(t => new LauncherItem( + $"[{t.Name}] {t.Description}", + $"{t.Paths.Length}개 폴더/파일 · Enter → 대상 경로 입력 후 생성", + null, t, + Symbol: Symbols.Folder)).ToList(); + + items.Insert(0, new LauncherItem( + "프로젝트 스캐폴딩", + $"총 {allTemplates.Count}개 템플릿 · 이름을 입력해 필터링", + null, null, Symbol: Symbols.Info)); + + return Task.FromResult>(items); + } + + // "경로 템플릿" 형태 감지 (경로에 \ 또는 / 포함) + if (q.Contains('\\') || q.Contains('/')) + { + var spaceIdx = q.LastIndexOf(' '); + if (spaceIdx > 0) + { + var targetPath = q[..spaceIdx].Trim(); + var templateName = q[(spaceIdx + 1)..].Trim(); + var tmpl = allTemplates.FirstOrDefault(t => + t.Name.Equals(templateName, StringComparison.OrdinalIgnoreCase)); + + if (tmpl != null) + { + return Task.FromResult>( + [ + new LauncherItem( + $"[{tmpl.Name}] → {targetPath}", + $"{tmpl.Paths.Length}개 폴더/파일 생성 · Enter로 실행", + null, ValueTuple.Create(targetPath, tmpl), + Symbol: Symbols.Save) + ]); + } + } + } + + // 필터링 + var filtered = allTemplates.Where(t => + t.Name.Contains(q, StringComparison.OrdinalIgnoreCase) || + t.Description.Contains(q, StringComparison.OrdinalIgnoreCase)); + + var result = filtered.Select(t => + { + var preview = string.Join(", ", t.Paths.Take(4)); + if (t.Paths.Length > 4) preview += $" ... (+{t.Paths.Length - 4})"; + return new LauncherItem( + $"[{t.Name}] {t.Description}", + $"{preview} · 사용법: scaffold [대상경로] {t.Name}", + null, t, + Symbol: Symbols.Folder); + }).ToList(); + + if (!result.Any()) + { + result.Add(new LauncherItem( + $"'{q}'에 해당하는 템플릿 없음", + "scaffold 으로 전체 목록 확인", + null, null, Symbol: Symbols.Warning)); + } + + return Task.FromResult>(result); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is ValueTuple data) + { + var (targetPath, template) = data; + return CreateStructure(targetPath, template); + } + + if (item.Data is ScaffoldTemplate tmpl) + { + // 클립보드에 사용법 복사 + var usage = $"scaffold [대상경로] {tmpl.Name}"; + try { System.Windows.Application.Current?.Dispatcher.Invoke( + () => System.Windows.Clipboard.SetText(usage)); } + catch (Exception) { } + } + + return Task.CompletedTask; + } + + private static Task CreateStructure(string basePath, ScaffoldTemplate template) + { + try + { + int created = 0; + foreach (var path in template.Paths) + { + var fullPath = Path.Combine(basePath, path.Replace('/', Path.DirectorySeparatorChar)); + + if (path.EndsWith('/') || path.EndsWith('\\') || !Path.HasExtension(path)) + { + Directory.CreateDirectory(fullPath); + } + else + { + Directory.CreateDirectory(Path.GetDirectoryName(fullPath)!); + if (!File.Exists(fullPath)) + File.WriteAllText(fullPath, ""); + } + created++; + } + NotificationService.Notify("스캐폴딩 완료", + $"[{template.Name}] {created}개 항목 생성 → {basePath}"); + } + catch (Exception ex) + { + LogService.Error($"스캐폴딩 실패: {ex.Message}"); + NotificationService.Notify("AX Copilot", $"스캐폴딩 실패: {ex.Message}"); + } + return Task.CompletedTask; + } + + private static IEnumerable LoadUserTemplates() + { + if (!Directory.Exists(TemplateDir)) yield break; + + foreach (var file in Directory.GetFiles(TemplateDir, "*.json")) + { + ScaffoldTemplate? tmpl = null; + try + { + var json = File.ReadAllText(file); + tmpl = JsonSerializer.Deserialize(json); + } + catch (Exception) { } + if (tmpl != null) yield return tmpl; + } + } + + internal record ScaffoldTemplate( + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("description")] string Description, + [property: JsonPropertyName("paths")] string[] Paths); +} diff --git a/src/AxCopilot/Handlers/ScreenCaptureHandler.cs b/src/AxCopilot/Handlers/ScreenCaptureHandler.cs new file mode 100644 index 0000000..f83be1c --- /dev/null +++ b/src/AxCopilot/Handlers/ScreenCaptureHandler.cs @@ -0,0 +1,637 @@ +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Runtime.InteropServices; +using System.Windows.Media.Imaging; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 화면 캡처 핸들러. "cap" 프리픽스로 사용합니다. +/// +/// 예: cap → 전체 화면 캡처 +/// cap screen → 전체 화면 캡처 +/// cap window → 런처 호출 전 활성 창 캡처 +/// cap scroll → 활성 창 스크롤 캡처 (페이지 전체) +/// cap region → 마우스로 영역 선택 후 캡처 +/// 파일 저장 여부 / 경로는 설정 → 캡처 탭에서 변경 가능. +/// 기본값: 저장 안 함, 클립보드에만 복사. +/// +public class ScreenCaptureHandler : IActionHandler +{ + private readonly AxCopilot.Services.SettingsService _settings; + + public ScreenCaptureHandler(AxCopilot.Services.SettingsService settings) + { + _settings = settings; + } + + public string? Prefix => string.IsNullOrWhiteSpace(_settings.Settings.ScreenCapture.Prefix) + ? "cap" + : _settings.Settings.ScreenCapture.Prefix.Trim(); + + public PluginMetadata Metadata => new( + "ScreenCapture", + "화면 캡처 — cap screen/window/scroll/region", + "1.0", + "AX"); + + // ─── P/Invoke ────────────────────────────────────────────────────────────── + + [DllImport("user32.dll")] private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); + [DllImport("user32.dll")] private static extern bool IsWindow(IntPtr hWnd); + [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); + [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + [DllImport("user32.dll")] private static extern bool PrintWindow(IntPtr hwnd, IntPtr hdcBlt, uint nFlags); + [DllImport("user32.dll")] private static extern bool IsWindowVisible(IntPtr hWnd); + + // 스크롤/키 메시지 전송 + [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); + [DllImport("user32.dll")] private static extern IntPtr FindWindowEx(IntPtr parent, IntPtr child, string? className, string? windowText); + + [StructLayout(LayoutKind.Sequential)] + private struct RECT { public int left, top, right, bottom; } + + private const int SW_RESTORE = 9; + private const byte VK_NEXT = 0x22; // Page Down + private const uint WM_VSCROLL = 0x0115; + private const uint WM_KEYDOWN = 0x0100; + private const uint WM_KEYUP = 0x0101; + private const int SB_PAGEDOWN = 3; + + // 보안 정책: 캡처 결과는 클립보드에만 복사. 파일 저장 기능 없음. + + private static readonly (string Key, string Label, string Desc)[] _options = + [ + ("region", "영역 선택 캡처", "마우스로 드래그하여 원하는 영역만 캡처 · Shift+Enter: 타이머 캡처"), + ("window", "활성 창 캡처", "런처 호출 전 활성 창만 캡처 · Shift+Enter: 타이머 캡처"), + ("scroll", "스크롤 캡처", "활성 창을 끝까지 스크롤하며 페이지 전체 캡처 · Shift+Enter: 타이머 캡처"), + ("screen", "전체 화면 캡처", "모든 모니터를 포함한 전체 화면 · Shift+Enter: 타이머 캡처"), + ]; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim().ToLowerInvariant(); + var saveHint = "클립보드에 복사"; + + IEnumerable<(string Key, string Label, string Desc)> options = string.IsNullOrWhiteSpace(q) + ? _options + : _options.Where(o => o.Key.StartsWith(q) || o.Label.Contains(q)); + + var items = options.Select(o => new LauncherItem( + o.Label, + $"{o.Desc} · {saveHint}", + null, + o.Key, + Symbol: Symbols.CaptureIcon)).ToList(); + + if (!items.Any()) + items.Add(new LauncherItem( + $"알 수 없는 캡처 모드: {q}", + "screen / window / scroll / region", + null, null, Symbol: Symbols.Warning)); + + return Task.FromResult>(items); + } + + /// + /// 지연 캡처 타이머 선택 항목을 반환합니다. + /// Data 형식: "delay:모드:초" (예: "delay:region:3") + /// + public IEnumerable GetDelayItems(string mode) + { + var label = _options.FirstOrDefault(o => o.Key == mode).Label ?? mode; + return new[] + { + new LauncherItem($"3초 후 {label}", "Shift+Enter로 지연 캡처", null, $"delay:{mode}:3", Symbol: Symbols.Timer), + new LauncherItem($"5초 후 {label}", "Shift+Enter로 지연 캡처", null, $"delay:{mode}:5", Symbol: Symbols.Timer), + new LauncherItem($"10초 후 {label}", "Shift+Enter로 지연 캡처", null, $"delay:{mode}:10", Symbol: Symbols.Timer), + }; + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not string data) return; + + // 지연 캡처: "delay:모드:초" + if (data.StartsWith("delay:")) + { + var parts = data.Split(':'); + if (parts.Length == 3 && int.TryParse(parts[2], out var delaySec)) + { + await ExecuteDelayedCaptureAsync(parts[1], delaySec, ct); + return; + } + } + + // 런처가 닫히는 동안 잠시 대기 + await Task.Delay(150, ct); + await CaptureDirectAsync(data, ct); + } + + /// + /// 지정된 초만큼 대기 후 캡처를 실행합니다. 완료 시 알림이 표시됩니다. + /// + private async Task ExecuteDelayedCaptureAsync(string mode, int delaySec, CancellationToken ct) + { + // 런처가 닫히는 동안 잠시 대기 + await Task.Delay(200, ct); + + // 알림 없이 조용히 대기 후 캡처 + for (int i = delaySec; i > 0; i--) + { + ct.ThrowIfCancellationRequested(); + await Task.Delay(1000, ct); + } + + await CaptureDirectAsync(mode, ct); + } + + /// + /// 런처 없이 직접 캡처를 실행합니다. 글로벌 단축키용. + /// + public async Task CaptureDirectAsync(string mode, CancellationToken ct = default) + { + try + { + var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); + // 캡처 결과는 클립보드에만 복사 (보안 정책) + + switch (mode) + { + case "screen": + await CaptureScreenAsync(timestamp); + break; + case "window": + await CaptureWindowAsync(timestamp); + break; + case "scroll": + await CaptureScrollAsync(timestamp, ct); + break; + case "region": + await CaptureRegionAsync(timestamp, ct); + break; + } + } + catch (Exception ex) + { + LogService.Error($"캡처 실패: {ex.Message}"); + NotificationService.Notify("AX Copilot", $"캡처 실패: {ex.Message}"); + } + } + + /// + /// 스크롤 캡처에 사용되는 프레임 간 대기 시간(ms). 설정에서 읽기. + /// + internal int ScrollDelayMs => Math.Max(50, _settings.Settings.ScreenCapture.ScrollDelayMs); + + // ─── 전체 화면 캡처 ──────────────────────────────────────────────────────── + + private async Task CaptureScreenAsync(string timestamp) + { + var bounds = GetAllScreenBounds(); + using var bmp = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppArgb); + using var g = Graphics.FromImage(bmp); + g.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy); + + CopyToClipboard(bmp); + await Task.Delay(10); + NotificationService.Notify("화면 캡처 완료", "클립보드에 복사되었습니다"); + } + + // ─── 창 캡처 ─────────────────────────────────────────────────────────────── + + private async Task CaptureWindowAsync(string timestamp) + { + var hwnd = WindowTracker.PreviousWindow; + if (hwnd == IntPtr.Zero || !IsWindow(hwnd)) + { + NotificationService.Notify("AX Copilot", "캡처할 창이 없습니다. 런처 호출 전 창을 확인하세요."); + return; + } + + // 런처가 완전히 사라질 때까지 대기 (런처 자체가 캡처되는 버그 방지) + var launcherHwnd = GetLauncherHwnd(); + if (launcherHwnd != IntPtr.Zero) + { + for (int i = 0; i < 10 && IsWindowVisible(launcherHwnd); i++) + await Task.Delay(50); + } + + ShowWindow(hwnd, SW_RESTORE); + SetForegroundWindow(hwnd); + await Task.Delay(150); + + if (!GetWindowRect(hwnd, out var rect)) return; + + int w = rect.right - rect.left; + int h = rect.bottom - rect.top; + if (w <= 0 || h <= 0) return; + + using var bmp = CaptureWindow(hwnd, w, h, rect); + CopyToClipboard(bmp); + + NotificationService.Notify("창 캡처 완료", "클립보드에 복사되었습니다"); + } + + // ─── 스크롤 캡처 ─────────────────────────────────────────────────────────── + + private async Task CaptureScrollAsync(string timestamp, CancellationToken ct) + { + var hwnd = WindowTracker.PreviousWindow; + if (hwnd == IntPtr.Zero || !IsWindow(hwnd)) + { + NotificationService.Notify("AX Copilot", "캡처할 창이 없습니다."); + return; + } + + // 런처가 완전히 사라질 때까지 대기 + var launcherHwnd = GetLauncherHwnd(); + if (launcherHwnd != IntPtr.Zero) + { + for (int i = 0; i < 10 && IsWindowVisible(launcherHwnd); i++) + await Task.Delay(50, ct); + } + + ShowWindow(hwnd, SW_RESTORE); + SetForegroundWindow(hwnd); + await Task.Delay(200, ct); + + if (!GetWindowRect(hwnd, out var rect)) return; + int w = rect.right - rect.left; + int h = rect.bottom - rect.top; + if (w <= 0 || h <= 0) return; + + // 스크롤 가능한 자식 창 찾기 (웹브라우저, 텍스트뷰어 등) + var scrollTarget = FindScrollableChild(hwnd); + + const int maxPages = 15; + var frames = new List(); + + // 첫 프레임 + frames.Add(CaptureWindow(hwnd, w, h, rect)); + + for (int i = 0; i < maxPages - 1; i++) + { + ct.ThrowIfCancellationRequested(); + + // Page Down 전송 + if (scrollTarget != IntPtr.Zero) + SendMessage(scrollTarget, WM_VSCROLL, new IntPtr(SB_PAGEDOWN), IntPtr.Zero); + else + SendPageDown(hwnd); + + await Task.Delay(ScrollDelayMs, ct); + + // 현재 프레임 캡처 + if (!GetWindowRect(hwnd, out var newRect)) break; + var frame = CaptureWindow(hwnd, w, h, newRect); + + // 이전 프레임과 동일하면 끝 (스크롤 종료 감지) + if (frames.Count > 0 && AreSimilar(frames[^1], frame)) + { + frame.Dispose(); + break; + } + + frames.Add(frame); + } + + // 프레임들을 수직으로 이어 붙이기 (오버랩 제거) + using var stitched = StitchFrames(frames, h); + + // 각 프레임 해제 + foreach (var f in frames) f.Dispose(); + + CopyToClipboard(stitched); + NotificationService.Notify("스크롤 캡처 완료", $"{stitched.Height}px · 클립보드에 복사되었습니다"); + } + + // ─── 헬퍼: 창 캡처 (PrintWindow 우선, 실패 시 BitBlt 폴백) ────────────── + + private static Bitmap CaptureWindow(IntPtr hwnd, int w, int h, RECT rect) + { + var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb); + using var g = Graphics.FromImage(bmp); + + // PrintWindow로 창 내용 캡처 (최소화된 창도 동작) + var hdc = g.GetHdc(); + bool ok = PrintWindow(hwnd, hdc, 2); // PW_RENDERFULLCONTENT = 2 + g.ReleaseHdc(hdc); + + if (!ok) + { + // 폴백: 화면에서 BitBlt + g.CopyFromScreen(rect.left, rect.top, 0, 0, + new System.Drawing.Size(w, h), CopyPixelOperation.SourceCopy); + } + + return bmp; + } + + // ─── 헬퍼: 전체 화면 범위 ───────────────────────────────────────────────── + + private static System.Drawing.Rectangle GetAllScreenBounds() + { + var screens = System.Windows.Forms.Screen.AllScreens; + int minX = screens.Min(s => s.Bounds.X); + int minY = screens.Min(s => s.Bounds.Y); + int maxX = screens.Max(s => s.Bounds.Right); + int maxY = screens.Max(s => s.Bounds.Bottom); + return new System.Drawing.Rectangle(minX, minY, maxX - minX, maxY - minY); + } + + // ─── 헬퍼: 스크롤 가능 자식 창 찾기 ────────────────────────────────────── + + private static IntPtr FindScrollableChild(IntPtr hwnd) + { + // 공통 스크롤 가능 클래스 탐색 + foreach (var cls in new[] { "Internet Explorer_Server", "Chrome_RenderWidgetHostHWND", + "MozillaWindowClass", "RichEdit20W", "RICHEDIT50W", + "TextBox", "EDIT" }) + { + var child = FindWindowEx(hwnd, IntPtr.Zero, cls, null); + if (child != IntPtr.Zero) return child; + } + return IntPtr.Zero; + } + + // ─── 헬퍼: Page Down 키 전송 ───────────────────────────────────────────── + + private static void SendPageDown(IntPtr hwnd) + { + SendMessage(hwnd, WM_KEYDOWN, new IntPtr(VK_NEXT), IntPtr.Zero); + SendMessage(hwnd, WM_KEYUP, new IntPtr(VK_NEXT), IntPtr.Zero); + } + + // ─── 헬퍼: 두 비트맵이 유사한지 비교 (스크롤 종료 감지) ───────────────── + // LockBits를 사용하여 GetPixel 대비 ~50× 빠르게 처리. + + private static bool AreSimilar(Bitmap a, Bitmap b) + { + if (a.Width != b.Width || a.Height != b.Height) return false; + + int startY = (int)(a.Height * 0.8); + int w = a.Width; + int h = a.Height; + + var rectA = new System.Drawing.Rectangle(0, startY, w, h - startY); + var rectB = new System.Drawing.Rectangle(0, startY, w, h - startY); + + var dataA = a.LockBits(rectA, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); + var dataB = b.LockBits(rectB, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); + + try + { + int sameCount = 0; + int totalSamples = 0; + int stride = dataA.Stride; + int sampleW = w / 16 + 1; + int sampleH = (h - startY) / 8 + 1; + + unsafe + { + byte* ptrA = (byte*)dataA.Scan0.ToPointer(); + byte* ptrB = (byte*)dataB.Scan0.ToPointer(); + + for (int sy = 0; sy < sampleH; sy++) + { + int row = sy * 8; + if (row >= h - startY) break; + for (int sx = 0; sx < sampleW; sx++) + { + int col = sx * 16; + if (col >= w) break; + int idx = row * stride + col * 4; + if (Math.Abs(ptrA[idx] - ptrB[idx]) < 5 && + Math.Abs(ptrA[idx + 1] - ptrB[idx + 1]) < 5 && + Math.Abs(ptrA[idx + 2] - ptrB[idx + 2]) < 5) + sameCount++; + totalSamples++; + } + } + } + + return totalSamples > 0 && (double)sameCount / totalSamples > 0.97; + } + finally + { + a.UnlockBits(dataA); + b.UnlockBits(dataB); + } + } + + // ─── 헬퍼: 프레임 이어 붙이기 (증분만 추가) ────────────────────────────── + + private static Bitmap StitchFrames(List frames, int windowHeight) + { + if (frames.Count == 0) + return new Bitmap(1, 1); + if (frames.Count == 1) + return new Bitmap(frames[0]); + + int w = frames[0].Width; + + // 각 프레임에서 새로운 부분의 시작 Y (오버랩 제외) + var newPartStarts = new List(); // 인덱스 1부터: frames[i]에서 오버랩 이후 시작 행 + var newPartHeights = new List(); // 새로운 부분 높이 + + int totalHeight = windowHeight; // 첫 프레임은 전체 사용 + + for (int i = 1; i < frames.Count; i++) + { + int overlap = FindOverlap(frames[i - 1], frames[i]); + int newStart = overlap > 0 ? overlap : windowHeight / 5; // 오버랩 감지 실패 시 상단 20% 제거 + int newH = windowHeight - newStart; + if (newH <= 0) { newH = windowHeight / 4; newStart = windowHeight - newH; } + newPartStarts.Add(newStart); + newPartHeights.Add(newH); + totalHeight += newH; + } + + var result = new Bitmap(w, totalHeight, PixelFormat.Format32bppArgb); + using var g = Graphics.FromImage(result); + + // 첫 프레임: 전체 그리기 + g.DrawImage(frames[0], 0, 0, w, windowHeight); + + // 이후 프레임: 새로운 부분(증분)만 잘라서 붙이기 + int yPos = windowHeight; + for (int i = 1; i < frames.Count; i++) + { + int srcY = newPartStarts[i - 1]; + int srcH = newPartHeights[i - 1]; + var srcRect = new System.Drawing.Rectangle(0, srcY, w, srcH); + var dstRect = new System.Drawing.Rectangle(0, yPos, w, srcH); + g.DrawImage(frames[i], dstRect, srcRect, System.Drawing.GraphicsUnit.Pixel); + yPos += srcH; + } + + return result; + } + + // ─── 헬퍼: 두 프레임 사이 오버랩 픽셀 수 계산 (다중 행 비교) ──────────── + + private static int FindOverlap(Bitmap prev, Bitmap next) + { + int w = Math.Min(prev.Width, next.Width); + int h = prev.Height; + if (h < 16 || w < 16) return 0; + + int searchRange = (int)(h * 0.7); // 최대 70% 오버랩 탐색 + const int checkRows = 8; // 오버랩 후보당 검증할 행 수 + + var dataPrev = prev.LockBits( + new System.Drawing.Rectangle(0, 0, prev.Width, prev.Height), + ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); + var dataNext = next.LockBits( + new System.Drawing.Rectangle(0, 0, next.Width, next.Height), + ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); + + try + { + int stridePrev = dataPrev.Stride; + int strideNext = dataNext.Stride; + int bestOverlap = 0; + + unsafe + { + byte* ptrPrev = (byte*)dataPrev.Scan0.ToPointer(); + byte* ptrNext = (byte*)dataNext.Scan0.ToPointer(); + + // 큰 오버랩부터 탐색 (스크롤은 보통 1페이지 미만) + for (int overlap = searchRange; overlap > 8; overlap -= 2) + { + int prevStartY = h - overlap; + if (prevStartY < 0) continue; + + int totalMatch = 0; + int totalCheck = 0; + + // 오버랩 영역 내 여러 행을 검증 + for (int r = 0; r < checkRows; r++) + { + int rowInOverlap = r * (overlap / checkRows); + int prevRow = prevStartY + rowInOverlap; + int nextRow = rowInOverlap; + if (prevRow >= h || nextRow >= next.Height) continue; + + // 행 내 샘플 픽셀 비교 + for (int x = 4; x < w - 4; x += 12) + { + int idxP = prevRow * stridePrev + x * 4; + int idxN = nextRow * strideNext + x * 4; + if (idxP + 2 >= dataPrev.Height * stridePrev) continue; + if (idxN + 2 >= dataNext.Height * strideNext) continue; + + if (Math.Abs(ptrPrev[idxP] - ptrNext[idxN]) < 10 && + Math.Abs(ptrPrev[idxP + 1] - ptrNext[idxN + 1]) < 10 && + Math.Abs(ptrPrev[idxP + 2] - ptrNext[idxN + 2]) < 10) + totalMatch++; + totalCheck++; + } + } + + if (totalCheck > 0 && (double)totalMatch / totalCheck > 0.80) + { + bestOverlap = overlap; + break; + } + } + } + + return bestOverlap; + } + finally + { + prev.UnlockBits(dataPrev); + next.UnlockBits(dataNext); + } + } + + // ─── 영역 선택 캡처 ────────────────────────────────────────────────────── + + private async Task CaptureRegionAsync(string timestamp, CancellationToken ct) + { + // 전체 화면을 먼저 캡처 (배경으로 사용) + var bounds = GetAllScreenBounds(); + using var fullBmp = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppArgb); + using (var g = Graphics.FromImage(fullBmp)) + g.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy); + + // WPF 오버레이 창으로 영역 선택 + System.Drawing.Rectangle? selected = null; + System.Windows.Application.Current?.Dispatcher.Invoke(() => + { + var overlay = new AxCopilot.Views.RegionSelectWindow(fullBmp, bounds); + overlay.ShowDialog(); + selected = overlay.SelectedRect; + }); + + if (selected == null || selected.Value.Width < 4 || selected.Value.Height < 4) + { + NotificationService.Notify("AX Copilot", "영역 선택이 취소되었습니다."); + return; + } + + var r = selected.Value; + using var crop = new Bitmap(r.Width, r.Height, PixelFormat.Format32bppArgb); + using (var g = Graphics.FromImage(crop)) + g.DrawImage(fullBmp, new System.Drawing.Rectangle(0, 0, r.Width, r.Height), r, System.Drawing.GraphicsUnit.Pixel); + + CopyToClipboard(crop); + NotificationService.Notify("영역 캡처 완료", $"{r.Width}×{r.Height} · 클립보드에 복사되었습니다"); + + await Task.CompletedTask; + } + + // ─── 헬퍼: 클립보드에 이미지 복사 ─────────────────────────────────────── + + private static void CopyToClipboard(Bitmap bmp) + { + try + { + // WPF Clipboard에 BitmapSource로 복사 + System.Windows.Application.Current?.Dispatcher.Invoke(() => + { + using var ms = new MemoryStream(); + bmp.Save(ms, ImageFormat.Bmp); + ms.Position = 0; + var bitmapImage = new BitmapImage(); + bitmapImage.BeginInit(); + bitmapImage.StreamSource = ms; + bitmapImage.CacheOption = BitmapCacheOption.OnLoad; + bitmapImage.EndInit(); + bitmapImage.Freeze(); + System.Windows.Clipboard.SetImage(bitmapImage); + }); + } + catch (Exception ex) + { + LogService.Warn($"클립보드 이미지 복사 실패: {ex.Message}"); + } + } + + // ─── 헬퍼: 런처 창 핸들 조회 (캡처 시 런처 숨김 대기용) ─────────────── + + private static IntPtr GetLauncherHwnd() + { + try + { + IntPtr hwnd = IntPtr.Zero; + System.Windows.Application.Current?.Dispatcher.Invoke(() => + { + var launcher = System.Windows.Application.Current.Windows + .OfType() + .FirstOrDefault(w => w.GetType().Name == "LauncherWindow"); + if (launcher != null) + hwnd = new System.Windows.Interop.WindowInteropHelper(launcher).Handle; + }); + return hwnd; + } + catch (Exception) { return IntPtr.Zero; } + } +} diff --git a/src/AxCopilot/Handlers/ServiceHandler.cs b/src/AxCopilot/Handlers/ServiceHandler.cs new file mode 100644 index 0000000..e8f0188 --- /dev/null +++ b/src/AxCopilot/Handlers/ServiceHandler.cs @@ -0,0 +1,271 @@ +using System.Diagnostics; +using System.ServiceProcess; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// Windows 서비스 관리 핸들러. "svc" 프리픽스로 사용합니다. +/// 서비스 검색, 상태 조회, 시작/중지/재시작. +/// 특수 명령: svc restart clipboard → 클립보드 히스토리 서비스 강제 재시작 +/// 예: svc → 실행 중 서비스 목록 (상위 20개) +/// svc spooler → "spooler" 검색 +/// svc start [이름] → 서비스 시작 +/// svc stop [이름] → 서비스 중지 +/// svc restart clipboard → AX 클립보드 히스토리 서비스 재시작 +/// +public class ServiceHandler : IActionHandler +{ + private readonly ClipboardHistoryService? _clipboardService; + + public ServiceHandler(ClipboardHistoryService? clipboardService = null) + { + _clipboardService = clipboardService; + } + + public string? Prefix => "svc"; + + public PluginMetadata Metadata => new( + "Service", + "Windows 서비스 관리 — svc", + "1.0", + "AX"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + var items = new List(); + + // 특수: 클립보드 서비스 재시작 + if (q.Equals("restart clipboard", StringComparison.OrdinalIgnoreCase) || + q.Equals("클립보드 재시작", StringComparison.OrdinalIgnoreCase)) + { + items.Add(new LauncherItem( + "AX 클립보드 히스토리 서비스 재시작", + "클립보드 감지가 작동하지 않을 때 사용 · Enter로 실행", + null, "__RESTART_CLIPBOARD__", + Symbol: Symbols.Restart)); + return Task.FromResult>(items); + } + + // start/stop/restart 명령 + if (q.StartsWith("start ", StringComparison.OrdinalIgnoreCase) || + q.StartsWith("stop ", StringComparison.OrdinalIgnoreCase) || + q.StartsWith("restart ", StringComparison.OrdinalIgnoreCase)) + { + var parts = q.Split(' ', 2, StringSplitOptions.TrimEntries); + var action = parts[0].ToLowerInvariant(); + var svcName = parts.Length > 1 ? parts[1] : ""; + + if (!string.IsNullOrWhiteSpace(svcName)) + { + try + { + var svc = ServiceController.GetServices() + .FirstOrDefault(s => + s.ServiceName.Contains(svcName, StringComparison.OrdinalIgnoreCase) || + s.DisplayName.Contains(svcName, StringComparison.OrdinalIgnoreCase)); + + if (svc != null) + { + var actionLabel = action switch + { + "start" => "시작", + "stop" => "중지", + "restart" => "재시작", + _ => action + }; + items.Add(new LauncherItem( + $"[{actionLabel}] {svc.DisplayName}", + $"서비스명: {svc.ServiceName} · 현재 상태: {StatusText(svc.Status)} · Enter로 실행", + null, ($"__{action.ToUpperInvariant()}__", svc.ServiceName), + Symbol: action == "stop" ? Symbols.Error : Symbols.Restart)); + } + else + { + items.Add(new LauncherItem( + $"'{svcName}' 서비스를 찾을 수 없습니다", + "서비스 이름 또는 표시 이름으로 검색", + null, null, Symbol: Symbols.Warning)); + } + } + catch (Exception ex) + { + items.Add(new LauncherItem("서비스 조회 실패", ex.Message, null, null, Symbol: Symbols.Error)); + } + + return Task.FromResult>(items); + } + } + + // 서비스 검색/목록 + try + { + var services = ServiceController.GetServices(); + var filtered = string.IsNullOrWhiteSpace(q) + ? services.Where(s => s.Status == ServiceControllerStatus.Running) + .OrderBy(s => s.DisplayName).Take(20) + : services.Where(s => + s.ServiceName.Contains(q, StringComparison.OrdinalIgnoreCase) || + s.DisplayName.Contains(q, StringComparison.OrdinalIgnoreCase)) + .OrderBy(s => s.DisplayName).Take(20); + + // 클립보드 재시작 항목 항상 상단에 표시 + items.Add(new LauncherItem( + "AX 클립보드 히스토리 서비스 재시작", + "svc restart clipboard · 클립보드 감지 문제 시 사용", + null, "__RESTART_CLIPBOARD__", + Symbol: Symbols.Restart)); + + foreach (var svc in filtered) + { + var status = StatusText(svc.Status); + var symbol = svc.Status == ServiceControllerStatus.Running + ? "\uE73E" // 체크마크 + : "\uE711"; // X + + items.Add(new LauncherItem( + $"[{status}] {svc.DisplayName}", + $"{svc.ServiceName} · svc start/stop/restart {svc.ServiceName}", + null, svc.ServiceName, + Symbol: symbol)); + } + } + catch (Exception ex) + { + items.Add(new LauncherItem("서비스 조회 실패", ex.Message, null, null, Symbol: Symbols.Error)); + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + // 클립보드 서비스 재시작 + if (item.Data is string s && s == "__RESTART_CLIPBOARD__") + { + RestartClipboardService(); + return Task.CompletedTask; + } + + // Windows 서비스 제어 + if (item.Data is ValueTuple cmd) + { + var (action, svcName) = cmd; + return ExecuteServiceAction(action, svcName); + } + + // 서비스 이름 클립보드 복사 + if (item.Data is string name) + { + try { Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(name)); } + catch (Exception) { } + } + + return Task.CompletedTask; + } + + private void RestartClipboardService() + { + try + { + if (_clipboardService == null) + { + NotificationService.Notify("AX Copilot", "클립보드 서비스 참조를 찾을 수 없습니다."); + return; + } + + // Dispose 후 재초기화 + _clipboardService.Dispose(); + + // 약간의 딜레이 후 재초기화 + Application.Current?.Dispatcher.BeginInvoke(() => + { + try + { + _clipboardService.Reinitialize(); + NotificationService.Notify("AX Copilot", "클립보드 히스토리 서비스가 재시작되었습니다."); + LogService.Info("클립보드 히스토리 서비스 강제 재시작 완료"); + } + catch (Exception ex) + { + NotificationService.Notify("AX Copilot", $"클립보드 재시작 실패: {ex.Message}"); + LogService.Error($"클립보드 재시작 실패: {ex.Message}"); + } + }, System.Windows.Threading.DispatcherPriority.Background); + } + catch (Exception ex) + { + NotificationService.Notify("AX Copilot", $"클립보드 재시작 실패: {ex.Message}"); + } + } + + private static async Task ExecuteServiceAction(string action, string svcName) + { + try + { + // sc.exe를 사용하여 관리자 권한으로 실행 + var verb = action switch + { + "__START__" => "start", + "__STOP__" => "stop", + "__RESTART__" => "stop", // restart는 stop + start + _ => null + }; + + if (verb == null) return; + + var psi = new ProcessStartInfo("sc.exe", $"{verb} \"{svcName}\"") + { + Verb = "runas", + UseShellExecute = true, + CreateNoWindow = true, + WindowStyle = ProcessWindowStyle.Hidden + }; + + var proc = Process.Start(psi); + proc?.WaitForExit(5000); + + if (action == "__RESTART__") + { + await Task.Delay(1000); + var startPsi = new ProcessStartInfo("sc.exe", $"start \"{svcName}\"") + { + Verb = "runas", + UseShellExecute = true, + CreateNoWindow = true, + WindowStyle = ProcessWindowStyle.Hidden + }; + Process.Start(startPsi)?.WaitForExit(5000); + } + + var label = action switch + { + "__START__" => "시작", + "__STOP__" => "중지", + "__RESTART__" => "재시작", + _ => action + }; + NotificationService.Notify("서비스 관리", $"{svcName} {label} 요청 완료"); + } + catch (Exception ex) + { + NotificationService.Notify("AX Copilot", $"서비스 제어 실패: {ex.Message}"); + } + } + + private static string StatusText(ServiceControllerStatus status) => status switch + { + ServiceControllerStatus.Running => "실행 중", + ServiceControllerStatus.Stopped => "중지됨", + ServiceControllerStatus.StartPending => "시작 중", + ServiceControllerStatus.StopPending => "중지 중", + ServiceControllerStatus.Paused => "일시 중지", + ServiceControllerStatus.ContinuePending => "재개 중", + ServiceControllerStatus.PausePending => "일시 중지 중", + _ => status.ToString() + }; +} diff --git a/src/AxCopilot/Handlers/SnapHandler.cs b/src/AxCopilot/Handlers/SnapHandler.cs new file mode 100644 index 0000000..9fbc101 --- /dev/null +++ b/src/AxCopilot/Handlers/SnapHandler.cs @@ -0,0 +1,201 @@ +using System.Runtime.InteropServices; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 창 스냅/레이아웃 핸들러. "snap" 프리픽스로 사용합니다. +/// 런처 호출 직전의 활성 창을 대상으로 배치합니다. +/// +/// 예: snap left → 화면 왼쪽 절반 +/// snap right → 화면 오른쪽 절반 +/// snap top → 화면 위쪽 절반 +/// snap bottom → 화면 아래쪽 절반 +/// snap full → 전체 화면 (최대화) +/// snap tl → 좌상단 1/4 +/// snap tr → 우상단 1/4 +/// snap bl → 좌하단 1/4 +/// snap br → 우하단 1/4 +/// snap center → 화면 중앙 (80% 크기) +/// snap restore → 이전 크기/위치로 복원 +/// +public class SnapHandler : IActionHandler +{ + public string? Prefix => "snap"; + + public PluginMetadata Metadata => new( + "WindowSnap", + "창 배치 — 2/3/4분할, 1/3·2/3, 전체화면, 중앙, 복원", + "1.1", + "AX"); + + // ─── P/Invoke ────────────────────────────────────────────────────────────── + + [DllImport("user32.dll")] private static extern bool SetWindowPos( + IntPtr hWnd, IntPtr hWndInsertAfter, + int x, int y, int cx, int cy, uint uFlags); + + [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + + [DllImport("user32.dll")] private static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags); + + [DllImport("user32.dll")] private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi); + + [DllImport("user32.dll")] private static extern bool IsWindow(IntPtr hWnd); + + [DllImport("user32.dll")] private static extern bool IsIconic(IntPtr hWnd); + + [StructLayout(LayoutKind.Sequential)] + private struct RECT { public int left, top, right, bottom; } + + [StructLayout(LayoutKind.Sequential)] + private struct MONITORINFO + { + public int cbSize; + public RECT rcMonitor; + public RECT rcWork; // 작업표시줄 제외 영역 + public uint dwFlags; + } + + private const uint SWP_SHOWWINDOW = 0x0040; + private const uint SWP_NOZORDER = 0x0004; + private const uint MONITOR_DEFAULTTONEAREST = 0x00000002; + private const int SW_RESTORE = 9; + private const int SW_MAXIMIZE = 3; + + private static readonly (string Key, string Label, string Desc)[] _snapOptions = + [ + // ── 2분할 ── + ("left", "왼쪽 절반", "화면 왼쪽 50% 영역에 배치"), + ("right", "오른쪽 절반", "화면 오른쪽 50% 영역에 배치"), + ("top", "위쪽 절반", "화면 위쪽 50% 영역에 배치"), + ("bottom", "아래쪽 절반", "화면 아래쪽 50% 영역에 배치"), + // ── 4분할 ── + ("tl", "좌상단 1/4", "화면 좌상단 25% 영역에 배치"), + ("tr", "우상단 1/4", "화면 우상단 25% 영역에 배치"), + ("bl", "좌하단 1/4", "화면 좌하단 25% 영역에 배치"), + ("br", "우하단 1/4", "화면 우하단 25% 영역에 배치"), + // ── 3분할 (좌 50% + 우 상하) ── + ("l-rt", "좌반 + 우상", "왼쪽 50% + 오른쪽 상단 25% (2창용)"), + ("l-rb", "좌반 + 우하", "왼쪽 50% + 오른쪽 하단 25% (2창용)"), + ("r-lt", "우반 + 좌상", "오른쪽 50% + 왼쪽 상단 25% (2창용)"), + ("r-lb", "우반 + 좌하", "오른쪽 50% + 왼쪽 하단 25% (2창용)"), + // ── 3등분 (가로) ── + ("third-l", "좌측 1/3", "화면 왼쪽 33% 영역에 배치"), + ("third-c", "중앙 1/3", "화면 가운데 33% 영역에 배치"), + ("third-r", "우측 1/3", "화면 오른쪽 33% 영역에 배치"), + // ── 2/3 + 1/3 ── + ("two3-l", "좌측 2/3", "화면 왼쪽 66% 영역에 배치"), + ("two3-r", "우측 2/3", "화면 오른쪽 66% 영역에 배치"), + // ── 기타 ── + ("full", "전체 화면", "최대화"), + ("center", "화면 중앙", "화면 중앙 80% 크기로 배치"), + ("restore", "원래 크기 복원", "창을 이전 크기로 복원"), + ]; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim().ToLowerInvariant(); + var hwnd = WindowTracker.PreviousWindow; + var windowValid = hwnd != IntPtr.Zero && IsWindow(hwnd); + + var hint = windowValid ? "Enter로 현재 활성 창에 적용" : "대상 창 없음 — 런처를 열기 전 창에 적용됩니다"; + + IEnumerable<(string Key, string Label, string Desc)> options = string.IsNullOrWhiteSpace(q) + ? _snapOptions + : _snapOptions.Where(o => o.Key.StartsWith(q) || o.Label.Contains(q)); + + var items = options.Select(o => new LauncherItem( + o.Label, + $"{o.Desc} · {hint}", + null, + o.Key, + Symbol: Symbols.SnapLayout)).ToList(); + + if (!items.Any()) + items.Add(new LauncherItem( + $"알 수 없는 스냅 방향: {q}", + "left / right / tl / tr / bl / br / third-l/c/r / two3-l/r / full / center / restore", + null, null, Symbol: Symbols.Warning)); + + return Task.FromResult>(items); + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not string snapKey) return; + + var hwnd = WindowTracker.PreviousWindow; + if (hwnd == IntPtr.Zero || !IsWindow(hwnd)) return; + + // 최대화/아이콘화 상태면 먼저 복원 + if (IsIconic(hwnd)) + ShowWindow(hwnd, SW_RESTORE); + + // 잠시 대기 (런처 닫힘 애니메이션 후 적용) + await Task.Delay(80, ct); + + ApplySnap(hwnd, snapKey); + } + + private static void ApplySnap(IntPtr hwnd, string key) + { + // 창이 속한 모니터의 작업 영역 가져오기 + var hMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); + var mi = new MONITORINFO { cbSize = Marshal.SizeOf() }; + if (!GetMonitorInfo(hMonitor, ref mi)) return; + + var w = mi.rcWork; + int mw = w.right - w.left; + int mh = w.bottom - w.top; + int mx = w.left; + int my = w.top; + + if (key == "full") + { + ShowWindow(hwnd, SW_MAXIMIZE); + return; + } + + if (key == "restore") + { + ShowWindow(hwnd, SW_RESTORE); + return; + } + + var (x, y, cw, ch) = key switch + { + // 2분할 + "left" => (mx, my, mw / 2, mh), + "right" => (mx + mw / 2, my, mw / 2, mh), + "top" => (mx, my, mw, mh / 2), + "bottom" => (mx, my + mh / 2, mw, mh / 2), + // 4분할 + "tl" => (mx, my, mw / 2, mh / 2), + "tr" => (mx + mw / 2, my, mw / 2, mh / 2), + "bl" => (mx, my + mh / 2, mw / 2, mh / 2), + "br" => (mx + mw / 2, my + mh / 2, mw / 2, mh / 2), + // 3분할 (좌반 + 우상/우하) + "l-rt" => (mx + mw / 2, my, mw / 2, mh / 2), + "l-rb" => (mx + mw / 2, my + mh / 2, mw / 2, mh / 2), + "r-lt" => (mx, my, mw / 2, mh / 2), + "r-lb" => (mx, my + mh / 2, mw / 2, mh / 2), + // 3등분 + "third-l" => (mx, my, mw / 3, mh), + "third-c" => (mx + mw / 3, my, mw / 3, mh), + "third-r" => (mx + mw * 2 / 3, my, mw / 3, mh), + // 2/3 + 1/3 + "two3-l" => (mx, my, mw * 2 / 3, mh), + "two3-r" => (mx + mw / 3, my, mw * 2 / 3, mh), + // 기타 + "center" => (mx + mw / 10, my + mh / 10, mw * 8 / 10, mh * 8 / 10), + _ => (mx, my, mw, mh) + }; + + // SW_RESTORE 후 SetWindowPos — 최대화 플래그 해제 필요 + ShowWindow(hwnd, SW_RESTORE); + SetWindowPos(hwnd, IntPtr.Zero, x, y, cw, ch, SWP_SHOWWINDOW | SWP_NOZORDER); + } +} diff --git a/src/AxCopilot/Handlers/SnippetHandler.cs b/src/AxCopilot/Handlers/SnippetHandler.cs new file mode 100644 index 0000000..68cc52d --- /dev/null +++ b/src/AxCopilot/Handlers/SnippetHandler.cs @@ -0,0 +1,138 @@ +using System.Windows; +using AxCopilot.Models; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 텍스트 스니펫 핸들러. ";" 프리픽스로 사용합니다. +/// 예: ;addr → 미리 저장된 주소 텍스트를 클립보드에 복사 후 붙여넣기 +/// ;sig → 서명 텍스트 붙여넣기 +/// +public class SnippetHandler : IActionHandler +{ + private readonly SettingsService _settings; + + public string? Prefix => ";"; + + public PluginMetadata Metadata => new( + "Snippets", + "텍스트 스니펫 — ; 뒤에 키워드 입력", + "1.0", + "AX"); + + public SnippetHandler(SettingsService settings) + { + _settings = settings; + } + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var snippets = _settings.Settings.Snippets; + + if (!snippets.Any()) + { + return Task.FromResult>( + [ + new LauncherItem( + "등록된 스니펫이 없습니다", + "설정 → 스니펫 탭에서 추가하세요", + null, null, Symbol: Symbols.Snippet) + ]); + } + + var q = query.Trim().ToLowerInvariant(); + var results = snippets + .Where(s => string.IsNullOrEmpty(q) || + s.Key.ToLowerInvariant().Contains(q) || + s.Name.ToLowerInvariant().Contains(q)) + .Select(s => new LauncherItem( + s.Name.Length > 0 ? s.Name : s.Key, + TruncatePreview(s.Content), + null, + s, + Symbol: Symbols.Snippet)) + .ToList(); + + if (results.Count == 0) + { + results.Add(new LauncherItem( + $"'{query}'에 해당하는 스니펫 없음", + "설정에서 새 스니펫을 추가하세요", + null, null, Symbol: Symbols.Snippet)); + } + + return Task.FromResult>(results); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not SnippetEntry snippet) return Task.CompletedTask; + + try + { + // 변수 치환: {date}, {time}, {datetime} + var expanded = ExpandVariables(snippet.Content); + + Clipboard.SetText(expanded); + + // 100ms 후 Ctrl+V 시뮬레이션 + Task.Delay(100, ct).ContinueWith(_ => + { + System.Windows.Application.Current.Dispatcher.Invoke(() => + { + var inputs = new[] + { + new INPUT { type = 1, u = new InputUnion { ki = new KEYBDINPUT { wVk = 0x11 } } }, // Ctrl down + new INPUT { type = 1, u = new InputUnion { ki = new KEYBDINPUT { wVk = 0x56 } } }, // V down + new INPUT { type = 1, u = new InputUnion { ki = new KEYBDINPUT { wVk = 0x56, dwFlags = 0x0002 } } }, // V up + new INPUT { type = 1, u = new InputUnion { ki = new KEYBDINPUT { wVk = 0x11, dwFlags = 0x0002 } } }, // Ctrl up + }; + SendInput((uint)inputs.Length, inputs, System.Runtime.InteropServices.Marshal.SizeOf()); + }); + }, ct, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Default); + } + catch (Exception ex) + { + LogService.Warn($"스니펫 실행 실패: {ex.Message}"); + } + + return Task.CompletedTask; + } + + // ─── 변수 치환 ───────────────────────────────────────────────────────── + + private static string ExpandVariables(string content) + { + var now = DateTime.Now; + return content + .Replace("{date}", now.ToString("yyyy-MM-dd")) + .Replace("{time}", now.ToString("HH:mm:ss")) + .Replace("{datetime}", now.ToString("yyyy-MM-dd HH:mm:ss")) + .Replace("{year}", now.Year.ToString()) + .Replace("{month}", now.Month.ToString("D2")) + .Replace("{day}", now.Day.ToString("D2")); + } + + private static string TruncatePreview(string content) + { + var oneLine = content.Replace("\r\n", " ").Replace("\n", " ").Replace("\r", " "); + return oneLine.Length > 60 ? oneLine[..57] + "…" : oneLine; + } + + // ─── P/Invoke (SendInput) ────────────────────────────────────────────── + + [System.Runtime.InteropServices.DllImport("user32.dll")] + private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); + + [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] + private struct INPUT { public uint type; public InputUnion u; } + + [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit)] + private struct InputUnion { [System.Runtime.InteropServices.FieldOffset(0)] public KEYBDINPUT ki; } + + [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] + private struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } +} diff --git a/src/AxCopilot/Handlers/SystemCommandHandler.cs b/src/AxCopilot/Handlers/SystemCommandHandler.cs new file mode 100644 index 0000000..899530e --- /dev/null +++ b/src/AxCopilot/Handlers/SystemCommandHandler.cs @@ -0,0 +1,322 @@ +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using System.Windows; +using AxCopilot.Models; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; +using AxCopilot.Views; + +namespace AxCopilot.Handlers; + +/// +/// 시스템 명령 핸들러. "/" 프리픽스로 사용합니다. +/// 예: /lock → 화면 잠금 +/// /sleep → 절전 모드 +/// /shutdown → 종료 +/// /timer 5m → 5분 타이머 +/// /timer 1h30m → 1시간 30분 타이머 +/// /timer 30s 회의 → 라벨 포함 타이머 +/// /alarm 14:30 → 지정 시각 알람 +/// +public class SystemCommandHandler : IActionHandler +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + private readonly SettingsService _settings; + + public string? Prefix => "/"; + + public PluginMetadata Metadata => new( + "SystemCommands", + "시스템 명령 — / 뒤에 명령 입력", + "1.0", + "AX"); + + public SystemCommandHandler(SettingsService settings) + { + _settings = settings; + } + + // 타이머 파싱: 5m, 30s, 1h, 1h30m, 2h15m30s + private static readonly Regex _timerRe = new( + @"^(?:(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?)$", + RegexOptions.IgnoreCase | RegexOptions.Compiled); + + // 알람 파싱: 14:30, 9:00, 23:59 + private static readonly Regex _alarmRe = new( + @"^(\d{1,2}):(\d{2})$", + RegexOptions.Compiled); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var cfg = _settings.Settings.SystemCommands; + var q = query.Trim().ToLowerInvariant(); + + // ─── 타이머 ───────────────────────────────────────────────────────── + if (q.StartsWith("timer")) + { + var rest = q[5..].Trim(); + var items = new List(); + + if (string.IsNullOrEmpty(rest)) + { + items.Add(new LauncherItem("타이머 — 시간을 입력하세요", + "예: /timer 5m · /timer 1h30m · /timer 30s 회의", + null, null, Symbol: Symbols.Timer)); + return Task.FromResult>(items); + } + + // 라벨 분리: "5m 회의" → durationPart="5m", label="회의" + var parts = rest.Split(' ', 2); + var durationStr = parts[0]; + var label = parts.Length > 1 ? parts[1].Trim() : ""; + + if (TryParseTimer(durationStr, out var seconds) && seconds > 0) + { + var display = FormatDuration(seconds); + var title = string.IsNullOrEmpty(label) ? $"타이머 {display}" : $"타이머 {display} — {label}"; + items.Add(new LauncherItem( + title, + $"{display} 후 알림 · Enter로 시작", + null, + (Func)(() => StartTimerAsync(seconds, label.Length > 0 ? label : display)), + Symbol: Symbols.Timer)); + } + else + { + items.Add(new LauncherItem("형식 오류", + "예: /timer 5m · /timer 1h30m · /timer 90s", + null, null, Symbol: Symbols.Error)); + } + + return Task.FromResult>(items); + } + + // ─── 알람 ───────────────────────────────────────────────────────── + if (q.StartsWith("alarm")) + { + var rest = q[5..].Trim(); + var items = new List(); + + if (string.IsNullOrEmpty(rest)) + { + items.Add(new LauncherItem("알람 — 시각을 입력하세요", + "예: /alarm 14:30 · /alarm 9:00", + null, null, Symbol: Symbols.Timer)); + return Task.FromResult>(items); + } + + var m = _alarmRe.Match(rest.Split(' ')[0]); + if (m.Success) + { + int hour = int.Parse(m.Groups[1].Value); + int min = int.Parse(m.Groups[2].Value); + var label = rest.Contains(' ') ? rest[(rest.IndexOf(' ') + 1)..] : ""; + + if (hour is >= 0 and <= 23 && min is >= 0 and <= 59) + { + var target = DateTime.Today.AddHours(hour).AddMinutes(min); + if (target <= DateTime.Now) target = target.AddDays(1); // 내일로 + var diff = (int)(target - DateTime.Now).TotalSeconds; + var timeStr = target.ToString("HH:mm"); + + items.Add(new LauncherItem( + $"알람 {timeStr} {(target.Date > DateTime.Today ? "(내일)" : "")}", + $"{FormatDuration(diff)} 후 알림 · Enter로 시작 {(label.Length > 0 ? "— " + label : "")}".Trim(), + null, + (Func)(() => StartTimerAsync(diff, label.Length > 0 ? label : $"{timeStr} 알람")), + Symbol: Symbols.Timer)); + } + else + { + items.Add(new LauncherItem("시각 범위 오류", + "00:00 ~ 23:59 범위로 입력하세요", + null, null, Symbol: Symbols.Error)); + } + } + else + { + items.Add(new LauncherItem("형식 오류", + "예: /alarm 14:30 · /alarm 09:00", + null, null, Symbol: Symbols.Error)); + } + + return Task.FromResult>(items); + } + + // ─── 일반 시스템 명령 ──────────────────────────────────────────────── + var allCommands = new List<(string Key, string Name, string Hint, string Symbol, bool Enabled, Func Action)> + { + ("lock", "화면 잠금", "현재 세션을 잠급니다", Symbols.Lock, cfg.ShowLock, LockAsync), + ("sleep", "절전 모드", "시스템을 절전 상태로 전환합니다", Symbols.Sleep, cfg.ShowSleep, SleepAsync), + ("restart", "재시작", "컴퓨터를 재시작합니다", Symbols.Restart, cfg.ShowRestart, RestartAsync), + ("shutdown", "시스템 종료", "컴퓨터를 종료합니다", Symbols.Power, cfg.ShowShutdown, ShutdownAsync), + ("hibernate", "최대 절전", "최대 절전 모드로 전환합니다", Symbols.Sleep, cfg.ShowHibernate, HibernateAsync), + ("logout", "로그아웃", "현재 사용자 세션에서 로그아웃합니다", Symbols.Logout, cfg.ShowLogout, LogoutAsync), + ("recycle", "휴지통 비우기", "휴지통의 모든 파일을 영구 삭제합니다", Symbols.RecycleBin, cfg.ShowRecycleBin, EmptyRecycleBinAsync), + ("dock", "독 바 표시/숨기기", "화면 하단 독 바를 표시하거나 숨깁니다", Symbols.SnapLayout, true, ToggleDockAsync), + // timer/alarm은 q.StartsWith("timer"/"alarm") early return으로 처리됨 + }; + + var filtered = allCommands + .Where(c => c.Enabled) + .Where(c => string.IsNullOrEmpty(q) || + c.Key.StartsWith(q) || + c.Name.Contains(q) || + (cfg.CommandAliases.TryGetValue(c.Key, out var ca) && + ca.Any(a => a.StartsWith(q, StringComparison.OrdinalIgnoreCase)))) + .Select(c => new LauncherItem( + c.Name, + c.Hint, + null, + c.Action, + Symbol: c.Symbol)); + + return Task.FromResult>(filtered.ToList()); + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is Func action) + await action(); + } + + // ─── 타이머 구현 ───────────────────────────────────────────────────────── + + private static async Task StartTimerAsync(int totalSeconds, string label) + { + await Task.Delay(TimeSpan.FromSeconds(totalSeconds)); + NotificationService.Notify("⏰ 타이머 완료", label); + } + + private static bool TryParseTimer(string s, out int totalSeconds) + { + totalSeconds = 0; + var m = _timerRe.Match(s.ToLowerInvariant()); + if (!m.Success) return false; + + int h = m.Groups[1].Success ? int.Parse(m.Groups[1].Value) : 0; + int mn = m.Groups[2].Success ? int.Parse(m.Groups[2].Value) : 0; + int sc = m.Groups[3].Success ? int.Parse(m.Groups[3].Value) : 0; + + totalSeconds = h * 3600 + mn * 60 + sc; + return true; + } + + private static string FormatDuration(int totalSeconds) + { + int h = totalSeconds / 3600; + int m = (totalSeconds % 3600) / 60; + int s = totalSeconds % 60; + + if (h > 0 && m > 0) return $"{h}시간 {m}분"; + if (h > 0) return $"{h}시간"; + if (m > 0 && s > 0) return $"{m}분 {s}초"; + if (m > 0) return $"{m}분"; + return $"{s}초"; + } + + // ─── 시스템 명령 구현 ─────────────────────────────────────────────────── + + private static Task LockAsync() + { + LockWorkStation(); + return Task.CompletedTask; + } + + private static Task SleepAsync() + { + System.Windows.Forms.Application.SetSuspendState( + System.Windows.Forms.PowerState.Suspend, false, false); + return Task.CompletedTask; + } + + private static Task HibernateAsync() + { + System.Windows.Forms.Application.SetSuspendState( + System.Windows.Forms.PowerState.Hibernate, false, false); + return Task.CompletedTask; + } + + private static Task RestartAsync() + { + var result = CustomMessageBox.Show( + "컴퓨터를 재시작하시겠습니까?\n저장되지 않은 작업이 있으면 먼저 저장하세요.", + "재시작 확인", + MessageBoxButton.YesNo, + MessageBoxImage.Question); + + if (result == MessageBoxResult.Yes) + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo( + "shutdown", "/r /t 5 /c \"AX Copilot에 의해 재시작됩니다.\"") + { UseShellExecute = true, CreateNoWindow = true }); + + return Task.CompletedTask; + } + + private static Task ShutdownAsync() + { + var result = CustomMessageBox.Show( + "컴퓨터를 종료하시겠습니까?\n저장되지 않은 작업이 있으면 먼저 저장하세요.", + "종료 확인", + MessageBoxButton.YesNo, + MessageBoxImage.Question); + + if (result == MessageBoxResult.Yes) + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo( + "shutdown", "/s /t 5 /c \"AX Copilot에 의해 종료됩니다.\"") + { UseShellExecute = true, CreateNoWindow = true }); + + return Task.CompletedTask; + } + + private static Task LogoutAsync() + { + var result = CustomMessageBox.Show( + "로그아웃하시겠습니까?", + "로그아웃 확인", + MessageBoxButton.YesNo, + MessageBoxImage.Question); + + if (result == MessageBoxResult.Yes) + ExitWindowsEx(0, 0); // EWX_LOGOFF + + return Task.CompletedTask; + } + + private static Task EmptyRecycleBinAsync() + { + var result = CustomMessageBox.Show( + "휴지통을 비우시겠습니까?\n삭제된 파일은 복구할 수 없습니다.", + "휴지통 비우기", + MessageBoxButton.YesNo, + MessageBoxImage.Warning); + + if (result == MessageBoxResult.Yes) + SHEmptyRecycleBin(IntPtr.Zero, null, + 0x0001 | 0x0002 | 0x0004); // SHERB_NOCONFIRMATION | SHERB_NOPROGRESSUI | SHERB_NOSOUND + + return Task.CompletedTask; + } + + private static Task ToggleDockAsync() + { + System.Windows.Application.Current.Dispatcher.Invoke(() => + { + CurrentApp?.ToggleDockBar(); + }); + return Task.CompletedTask; + } + + // ─── P/Invoke ────────────────────────────────────────────────────────── + + [DllImport("user32.dll", SetLastError = true)] + private static extern bool LockWorkStation(); + + [DllImport("user32.dll", SetLastError = true)] + private static extern bool ExitWindowsEx(uint uFlags, uint dwReason); + + [DllImport("shell32.dll", CharSet = CharSet.Unicode)] + private static extern uint SHEmptyRecycleBin(IntPtr hwnd, string? pszRootPath, uint dwFlags); +} diff --git a/src/AxCopilot/Handlers/SystemInfoHandler.cs b/src/AxCopilot/Handlers/SystemInfoHandler.cs new file mode 100644 index 0000000..3fc3049 --- /dev/null +++ b/src/AxCopilot/Handlers/SystemInfoHandler.cs @@ -0,0 +1,509 @@ +using System.Diagnostics; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; +using AxCopilot.Views; + +namespace AxCopilot.Handlers; + +/// +/// 시스템 정보를 표시합니다. "info" 프리픽스로 사용합니다. +/// 예: info → 전체 시스템 정보 목록 +/// info ip → IP 주소 +/// info battery → 배터리 상태 +/// info uptime → 시스템 가동 시간 +/// info volume → 볼륨 수준 +/// +public class SystemInfoHandler : IActionHandler +{ + public string? Prefix => "info"; + + public PluginMetadata Metadata => new( + "SystemInfo", + "시스템 정보 — IP, 배터리, 볼륨, 가동시간 등", + "1.0", + "AX"); + + // ─── P/Invoke ──────────────────────────────────────────────────────────── + + [DllImport("winmm.dll")] + private static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + private struct MEMORYSTATUSEX + { + public uint dwLength; + public uint dwMemoryLoad; // % 사용 중 + public ulong ullTotalPhys; + public ulong ullAvailPhys; + public ulong ullTotalPageFile; + public ulong ullAvailPageFile; + public ulong ullTotalVirtual; + public ulong ullAvailVirtual; + public ulong ullAvailExtendedVirtual; + } + + // CPU 카운터: 앱 시작 시 백그라운드에서 사전 초기화 (UI 스레드 차단 방지) + private static volatile PerformanceCounter? _cpuCounter; + private static float _cpuCached; + private static DateTime _cpuUpdated = DateTime.MinValue; + private static readonly object _cpuLock = new(); + static SystemInfoHandler() + { + // 백그라운드에서 PerformanceCounter 초기화 (1~3초 소요, UI 스레드 차단 방지) + _ = Task.Run(() => + { + try + { + var counter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); + counter.NextValue(); // 첫 호출은 항상 0 → 초기화만 + _cpuCounter = counter; + } + catch (Exception) { /* PerformanceCounter 미지원 환경 */ } + }); + } + + private static float GetCpuUsage() + { + try + { + var counter = _cpuCounter; + if (counter == null) return -1; // 아직 초기화 중 + lock (_cpuLock) + { + if ((DateTime.Now - _cpuUpdated).TotalMilliseconds > 800) + { + _cpuCached = counter.NextValue(); + _cpuUpdated = DateTime.Now; + } + return _cpuCached; + } + } + catch (Exception) { return -1; } + } + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim().ToLowerInvariant(); + var items = new List(); + + try + { + // 어떤 카테고리를 보여줄지 결정 + bool showAll = string.IsNullOrEmpty(q); + bool showIp = showAll || q.Contains("ip") || q.Contains("네트워크") || q.Contains("network"); + bool showBat = showAll || q.Contains("bat") || q.Contains("배터리") || q.Contains("battery"); + bool showVol = showAll || q.Contains("vol") || q.Contains("볼륨") || q.Contains("volume"); + bool showUp = showAll || q.Contains("up") || q.Contains("가동") || q.Contains("uptime"); + bool showSys = showAll || q.Contains("sys") || q.Contains("시스템") || q.Contains("system") + || q.Contains("host") || q.Contains("호스트") || q.Contains("os"); + bool showUser = showAll || q.Contains("user") || q.Contains("사용자"); + bool showCpu = showAll || q.Contains("cpu") || q.Contains("프로세서") || q.Contains("processor"); + bool showRam = showAll || q.Contains("ram") || q.Contains("메모리") || q.Contains("memory"); + bool showDisk = showAll || q.Contains("disk") || q.Contains("디스크") || q.Contains("storage") || q.Contains("저장"); + bool showGfx = showAll || q.Contains("screen") || q.Contains("화면") || q.Contains("resolution") || q.Contains("display"); + + // ─── 호스트 / OS / 사용자 ──────────────────────────────────────── + if (showSys) + { + items.Add(new LauncherItem( + $"컴퓨터: {Environment.MachineName}", + $"OS: {GetOsVersion()} · Enter로 시스템 정보 열기", + null, + new InfoAction("shell", "msinfo32"), + Symbol: Symbols.Computer)); + } + + if (showUser) + { + var user = $"{Environment.UserDomainName}\\{Environment.UserName}"; + items.Add(new LauncherItem( + $"사용자: {Environment.UserName}", + $"{user} · Enter로 사용자 계정 설정 열기", + null, + new InfoAction("shell", "netplwiz"), + Symbol: Symbols.Person)); + } + + // ─── IP 주소 ──────────────────────────────────────────────────── + if (showIp) + { + var localIp = GetLocalIpAddress(); + if (localIp != null) + { + items.Add(new LauncherItem( + $"로컬 IP: {localIp}", + "LAN / Wi-Fi 주소 · Enter로 네트워크 설정 열기", + null, + new InfoAction("ms_settings", "ms-settings:network"), + Symbol: Symbols.Network)); + } + + var gateway = GetDefaultGateway(); + if (gateway != null) + { + items.Add(new LauncherItem( + $"게이트웨이: {gateway}", + "기본 게이트웨이 · Enter로 네트워크 설정 열기", + null, + new InfoAction("ms_settings", "ms-settings:network"), + Symbol: Symbols.Network)); + } + } + + // ─── 배터리 ──────────────────────────────────────────────────── + if (showBat) + { + var batItem = GetBatteryItem(); + if (batItem != null) items.Add(batItem); + } + + // ─── 볼륨 ────────────────────────────────────────────────────── + if (showVol) + { + var volItem = GetVolumeItem(); + if (volItem != null) items.Add(volItem); + } + + // ─── 가동 시간 ───────────────────────────────────────────────── + if (showUp) + { + var uptime = TimeSpan.FromMilliseconds(Environment.TickCount64); + var uptimeStr = FormatUptime(uptime); + var bootTime = DateTime.Now - uptime; + items.Add(MakeItem( + $"가동 시간: {uptimeStr}", + $"마지막 재시작: {bootTime:MM/dd HH:mm}", + uptimeStr, + Symbols.Clock)); + } + + // ─── CPU 사용률 ──────────────────────────────────────────────── + if (showCpu) + { + var cpu = GetCpuUsage(); + var cpuTitle = cpu < 0 ? "CPU: 측정 중…" : $"CPU: {(int)cpu}%"; + var cpuProc = GetProcessorName(); + items.Add(new LauncherItem( + cpuTitle, + (string.IsNullOrEmpty(cpuProc) ? "전체 CPU 사용률" : cpuProc) + " · Enter로 리소스 모니터 열기", + null, + new InfoAction("resource_mon"), + Symbol: Symbols.Processor)); + } + + // ─── 메모리 (RAM) ────────────────────────────────────────────── + if (showRam) + { + var mem = new MEMORYSTATUSEX { dwLength = (uint)Marshal.SizeOf() }; + if (GlobalMemoryStatusEx(ref mem)) + { + var totalGb = mem.ullTotalPhys / 1024.0 / 1024 / 1024; + var usedGb = (mem.ullTotalPhys - mem.ullAvailPhys) / 1024.0 / 1024 / 1024; + var pct = mem.dwMemoryLoad; + items.Add(new LauncherItem( + $"RAM: {usedGb:F1} / {totalGb:F1} GB ({pct}%)", + $"사용 중: {usedGb:F1} GB · 여유: {(mem.ullAvailPhys / 1024.0 / 1024 / 1024):F1} GB · Enter로 리소스 모니터 열기", + null, + new InfoAction("resource_mon"), + Symbol: Symbols.Memory)); + } + } + + // ─── 디스크 ──────────────────────────────────────────────────── + if (showDisk) + { + foreach (var drive in System.IO.DriveInfo.GetDrives() + .Where(d => d.IsReady && d.DriveType == System.IO.DriveType.Fixed)) + { + var totalGb = drive.TotalSize / 1024.0 / 1024 / 1024; + var freeGb = drive.AvailableFreeSpace / 1024.0 / 1024 / 1024; + var usedGb = totalGb - freeGb; + var pct = (int)(usedGb / totalGb * 100); + var label = string.IsNullOrWhiteSpace(drive.VolumeLabel) ? drive.Name.TrimEnd('\\') : drive.VolumeLabel; + items.Add(new LauncherItem( + $"드라이브 {drive.Name.TrimEnd('\\')} ({label}) — {usedGb:F0} / {totalGb:F0} GB ({pct}%)", + $"여유 공간: {freeGb:F1} GB · Enter로 탐색기 열기", + null, + new InfoAction("open_drive", drive.RootDirectory.FullName), + Symbol: Symbols.Storage)); + } + } + + // ─── 화면 해상도 ─────────────────────────────────────────────── + if (showGfx) + { + var screen = System.Windows.SystemParameters.PrimaryScreenWidth; + var screenH = System.Windows.SystemParameters.PrimaryScreenHeight; + items.Add(new LauncherItem( + $"화면: {(int)screen} × {(int)screenH}", + "기본 모니터 해상도 · Enter로 디스플레이 설정 열기", + null, + new InfoAction("ms_settings", "ms-settings:display"), + Symbol: Symbols.Computer)); + } + } + catch (Exception ex) + { + LogService.Warn($"시스템 정보 조회 오류: {ex.Message}"); + items.Add(new LauncherItem("시스템 정보 조회 실패", ex.Message, null, null, Symbol: Symbols.Error)); + } + + if (items.Count == 0) + { + items.Add(new LauncherItem( + "시스템 정보 없음", + "ip · battery · volume · uptime · system 키워드로 검색하세요", + null, null, Symbol: Symbols.Info)); + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not InfoAction action) return Task.CompletedTask; + + switch (action.Type) + { + case "copy": + // 클립보드에 복사 + if (!string.IsNullOrWhiteSpace(action.Payload)) + { + try + { + Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(action.Payload)); + LogService.Info($"클립보드 복사: {action.Payload}"); + } + catch (Exception ex) { LogService.Warn($"클립보드 복사 실패: {ex.Message}"); } + } + break; + + case "open_drive": + // 탐색기로 드라이브 열기 + if (!string.IsNullOrWhiteSpace(action.Payload)) + { + try + { + Process.Start(new ProcessStartInfo("explorer.exe", action.Payload) + { UseShellExecute = true }); + } + catch (Exception ex) { LogService.Warn($"드라이브 열기 실패: {ex.Message}"); } + } + break; + + case "resource_mon": + // CPU/RAM 실시간 모니터 창 열기 + Application.Current.Dispatcher.Invoke(() => + { + var existing = Application.Current.Windows + .OfType().FirstOrDefault(); + if (existing != null) { existing.Activate(); return; } + new ResourceMonitorWindow().Show(); + }); + break; + + case "shell": + // 셸 명령 실행 (msinfo32, netplwiz 등) + if (!string.IsNullOrWhiteSpace(action.Payload)) + { + try + { + Process.Start(new ProcessStartInfo(action.Payload) { UseShellExecute = true }); + } + catch (Exception ex) { LogService.Warn($"셸 명령 실행 실패: {ex.Message}"); } + } + break; + + case "ms_settings": + // Windows 설정 URI (ms-settings:network, ms-settings:display 등) + if (!string.IsNullOrWhiteSpace(action.Payload)) + { + try + { + Process.Start(new ProcessStartInfo(action.Payload) { UseShellExecute = true }); + } + catch (Exception ex) { LogService.Warn($"설정 열기 실패: {ex.Message}"); } + } + break; + } + return Task.CompletedTask; + } + + // ─── 액션 데이터 태그 ──────────────────────────────────────────────────── + + /// info 항목에 의미 있는 동작을 부여하기 위한 태그 + internal sealed record InfoAction(string Type, string? Payload = null); + // Type: "copy" → 클립보드 복사 (Payload = 복사할 텍스트) + // "open_drive" → 탐색기로 드라이브 열기 (Payload = 드라이브 루트) + // "resource_mon" → CPU/RAM 실시간 모니터 창 열기 + // "shell" → 셸 명령 실행 (Payload = 명령) + // "ms_settings" → ms-settings: URI 열기 (Payload = URI) + + // ─── 헬퍼 ──────────────────────────────────────────────────────────────── + + private static LauncherItem MakeItem(string title, string subtitle, string? copyValue, string symbol) => + new(title, subtitle, null, + copyValue != null ? new InfoAction("copy", copyValue) : null, + Symbol: symbol); + + private static string? GetLocalIpAddress() + { + try + { + foreach (var iface in NetworkInterface.GetAllNetworkInterfaces()) + { + if (iface.OperationalStatus != OperationalStatus.Up) continue; + if (iface.NetworkInterfaceType is NetworkInterfaceType.Loopback + or NetworkInterfaceType.Tunnel) continue; + + foreach (var addr in iface.GetIPProperties().UnicastAddresses) + { + if (addr.Address.AddressFamily == AddressFamily.InterNetwork) + return addr.Address.ToString(); + } + } + } + catch (Exception) { /* 무시 */ } + return null; + } + + private static string? GetDefaultGateway() + { + try + { + foreach (var iface in NetworkInterface.GetAllNetworkInterfaces()) + { + if (iface.OperationalStatus != OperationalStatus.Up) continue; + var gw = iface.GetIPProperties().GatewayAddresses + .FirstOrDefault(g => g.Address.AddressFamily == AddressFamily.InterNetwork); + if (gw != null) return gw.Address.ToString(); + } + } + catch (Exception) { /* 무시 */ } + return null; + } + + private static LauncherItem? GetBatteryItem() + { + try + { + var status = System.Windows.Forms.SystemInformation.PowerStatus; + var chargeLevel = status.BatteryLifePercent; + + if (chargeLevel < 0) // 배터리 없는 데스크톱 + return new LauncherItem("배터리: 해당 없음", "데스크톱 PC 또는 항상 연결됨 · Enter로 전원 설정 열기", null, + new InfoAction("ms_settings", "ms-settings:powersleep"), Symbol: Symbols.Battery); + + var pct = (int)(chargeLevel * 100); + var charging = status.PowerLineStatus == System.Windows.Forms.PowerLineStatus.Online; + var timeLeft = status.BatteryLifeRemaining >= 0 + ? $" · 잔여: {FormatUptime(TimeSpan.FromSeconds(status.BatteryLifeRemaining))}" + : ""; + + var symbol = charging ? Symbols.BatteryCharging + : pct > 50 ? Symbols.Battery + : Symbols.BatteryLow; + + return new LauncherItem( + $"배터리: {pct}%{(charging ? " ⚡ 충전 중" : "")}", + $"전원: {(charging ? "AC 연결됨" : "배터리 사용 중")}{timeLeft} · Enter로 전원 설정 열기", + null, + new InfoAction("ms_settings", "ms-settings:powersleep"), + Symbol: symbol); + } + catch (Exception) { return null; } + } + + private static LauncherItem? GetVolumeItem() + { + try + { + if (waveOutGetVolume(IntPtr.Zero, out uint vol) == 0) + { + // 왼쪽 채널 0~0xFFFF → 0~100 변환 + var left = (int)((vol & 0xFFFF) / 655.35); + var right = (int)(((vol >> 16) & 0xFFFF) / 655.35); + var avg = (left + right) / 2; + + return new LauncherItem( + $"볼륨: {avg}%", + $"L: {left}% · R: {right}% · Enter로 사운드 설정 열기", + null, + new InfoAction("ms_settings", "ms-settings:sound"), + Symbol: avg == 0 ? Symbols.VolumeMute : Symbols.VolumeUp); + } + } + catch (Exception) { /* 무시 */ } + return null; + } + + private static string GetOsVersion() + { + try + { + // registry에서 실제 Windows 버전 읽기 + using var key = Microsoft.Win32.Registry.LocalMachine + .OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"); + if (key != null) + { + var name = key.GetValue("ProductName") as string ?? "Windows"; + var build = key.GetValue("CurrentBuildNumber") as string ?? ""; + var ubr = key.GetValue("UBR"); + return ubr != null ? $"{name} (빌드 {build}.{ubr})" : $"{name} (빌드 {build})"; + } + } + catch (Exception) { /* 무시 */ } + return Environment.OSVersion.ToString(); + } + + private static string GetProcessorName() + { + try + { + using var key = Microsoft.Win32.Registry.LocalMachine + .OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0"); + return key?.GetValue("ProcessorNameString") as string ?? ""; + } + catch (Exception) { return ""; } + } + + private static string FormatUptime(TimeSpan t) + { + if (t.TotalDays >= 1) + return $"{(int)t.TotalDays}일 {t.Hours}시간 {t.Minutes}분"; + if (t.TotalHours >= 1) + return $"{t.Hours}시간 {t.Minutes}분"; + return $"{t.Minutes}분 {t.Seconds}초"; + } +} + +/// +/// * 단축키로 시스템 정보를 빠르게 조회합니다. SystemInfoHandler에 완전히 위임합니다. +/// +public class StarInfoHandler : IActionHandler +{ + private readonly SystemInfoHandler _inner = new(); + + public string? Prefix => "*"; + + public PluginMetadata Metadata => new( + "StarInfo", + "시스템 정보 빠른 조회 — * 단축키 (info와 동일)", + "1.0", + "AX"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + => _inner.GetItemsAsync(query, ct); + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + => _inner.ExecuteAsync(item, ct); +} diff --git a/src/AxCopilot/Handlers/TextStatsHandler.cs b/src/AxCopilot/Handlers/TextStatsHandler.cs new file mode 100644 index 0000000..74cebea --- /dev/null +++ b/src/AxCopilot/Handlers/TextStatsHandler.cs @@ -0,0 +1,149 @@ +using System.Text.RegularExpressions; +using System.Windows; +using AxCopilot.SDK; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 텍스트 통계 분석 핸들러. "stats" 프리픽스로 사용합니다. +/// 클립보드 텍스트의 글자 수, 단어 수, 줄 수, 키워드 빈도 등을 분석합니다. +/// 예: stats → 현재 클립보드 텍스트 분석 +/// stats 키워드 → 클립보드에서 해당 키워드 빈도 검색 +/// Enter 시 분석 결과를 클립보드에 복사합니다. +/// +public class TextStatsHandler : IActionHandler +{ + public string? Prefix => "stats"; + + public PluginMetadata Metadata => new( + "TextStats", + "텍스트 통계 분석", + "1.0", + "AX"); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + string? text = null; + try + { + if (Application.Current?.Dispatcher.Invoke(() => Clipboard.ContainsText()) == true) + text = Application.Current.Dispatcher.Invoke(() => Clipboard.GetText()); + } + catch (Exception) { } + + if (string.IsNullOrEmpty(text)) + { + return Task.FromResult>( + [ + new LauncherItem( + "클립보드에 텍스트가 없습니다", + "텍스트를 복사한 후 다시 시도하세요", + null, null, Symbol: Symbols.Info) + ]); + } + + var q = query.Trim(); + var items = new List(); + + // 기본 통계 + var charCount = text.Length; + var charNoSpace = text.Replace(" ", "").Replace("\t", "").Replace("\r", "").Replace("\n", "").Length; + var words = Regex.Split(text, @"\s+", RegexOptions.None, TimeSpan.FromSeconds(1)) + .Where(w => !string.IsNullOrWhiteSpace(w)).ToArray(); + var wordCount = words.Length; + var lines = text.Split('\n'); + var lineCount = lines.Length; + var nonEmptyLines = lines.Count(l => !string.IsNullOrWhiteSpace(l)); + var byteCount = System.Text.Encoding.UTF8.GetByteCount(text); + + // 요약 + var summary = $"글자 {charCount:N0} · 공백 제외 {charNoSpace:N0} · 단어 {wordCount:N0} · 줄 {lineCount:N0}"; + + items.Add(new LauncherItem( + $"글자 수: {charCount:N0} ({charNoSpace:N0} 공백 제외)", + $"UTF-8: {byteCount:N0} bytes · Enter로 결과 복사", + null, $"글자 수: {charCount:N0} (공백 제외: {charNoSpace:N0})", + Symbol: "\uE8D2")); + + items.Add(new LauncherItem( + $"단어 수: {wordCount:N0}", + $"공백·줄바꿈 기준 분리 · Enter로 결과 복사", + null, $"단어 수: {wordCount:N0}", + Symbol: "\uE8D2")); + + items.Add(new LauncherItem( + $"줄 수: {lineCount:N0} (비어있지 않은 줄: {nonEmptyLines:N0})", + "Enter로 결과 복사", + null, $"줄 수: {lineCount:N0} (비어있지 않은 줄: {nonEmptyLines:N0})", + Symbol: "\uE8D2")); + + // 읽기 시간 추정 (한국어 500자/분, 영어 200단어/분) + var koreanChars = text.Count(c => c >= '\uAC00' && c <= '\uD7AF'); + var readMinutes = koreanChars > charCount / 2 + ? (double)charNoSpace / 500 + : (double)wordCount / 200; + var readTime = readMinutes < 1 ? "1분 미만" : $"약 {Math.Ceiling(readMinutes)}분"; + + items.Add(new LauncherItem( + $"예상 읽기 시간: {readTime}", + koreanChars > charCount / 2 ? "한국어 기준 (500자/분)" : "영어 기준 (200단어/분)", + null, $"예상 읽기 시간: {readTime}", + Symbol: Symbols.Clock)); + + // 키워드 빈도 (상위 5개) + if (string.IsNullOrWhiteSpace(q)) + { + var freq = words + .Where(w => w.Length >= 2) + .GroupBy(w => w.ToLowerInvariant()) + .OrderByDescending(g => g.Count()) + .Take(5) + .Select(g => $"{g.Key}({g.Count()})"); + + var freqStr = string.Join(", ", freq); + if (!string.IsNullOrEmpty(freqStr)) + { + items.Add(new LauncherItem( + "상위 키워드", + freqStr, + null, $"상위 키워드: {freqStr}", + Symbol: Symbols.Search)); + } + } + else + { + // 특정 키워드 빈도 검색 + try + { + var count = Regex.Matches(text, Regex.Escape(q), RegexOptions.IgnoreCase, + TimeSpan.FromSeconds(1)).Count; + items.Insert(0, new LauncherItem( + $"'{q}' 출현 횟수: {count}회", + $"대소문자 무시 검색 · Enter로 결과 복사", + null, $"'{q}' 출현 횟수: {count}회", + Symbol: Symbols.Search)); + } + catch (Exception) { } + } + + // 전체 요약 항목 + items.Add(new LauncherItem( + "전체 요약 복사", + summary, + null, $"[텍스트 통계]\n{summary}\nUTF-8: {byteCount:N0} bytes\n읽기 시간: {readTime}", + Symbol: Symbols.Clipboard)); + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is string text && !string.IsNullOrWhiteSpace(text)) + { + try { Application.Current?.Dispatcher.Invoke(() => Clipboard.SetText(text)); } + catch (Exception) { } + } + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Handlers/UninstallHandler.cs b/src/AxCopilot/Handlers/UninstallHandler.cs new file mode 100644 index 0000000..c756d61 --- /dev/null +++ b/src/AxCopilot/Handlers/UninstallHandler.cs @@ -0,0 +1,228 @@ +using Microsoft.Win32; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 앱 제거 핸들러. "uninstall" 프리픽스로 사용합니다. +/// 예: uninstall → 설치된 앱 전체 목록 +/// uninstall chrome → "chrome" 포함 앱 필터 +/// Enter 시 해당 앱의 제거 프로그램 실행. +/// +public class UninstallHandler : IActionHandler +{ + public string? Prefix => "uninstall"; + + public PluginMetadata Metadata => new( + "Uninstall", + "앱 제거 — uninstall 뒤에 앱 이름 입력", + "1.0", + "AX"); + + // 레지스트리 언인스톨 키 경로 + private static readonly string[] _regPaths = + { + @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", + @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall", + }; + + // 캐시: 30초 + private static (DateTime At, List Apps)? _cache; + private static readonly TimeSpan CacheTtl = TimeSpan.FromSeconds(30); + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + + if (string.IsNullOrWhiteSpace(q)) + { + return Task.FromResult>( + [ + new LauncherItem( + "제거할 앱 이름을 입력하세요", + "예: uninstall chrome · uninstall office", + null, null, Symbol: Symbols.Uninstall) + ]); + } + + var apps = GetInstalledApps(); + var filtered = apps + .Where(a => a.Name.Contains(q, StringComparison.OrdinalIgnoreCase) || + (a.Publisher?.Contains(q, StringComparison.OrdinalIgnoreCase) ?? false)) + .OrderBy(a => a.Name) + .Take(12) + .ToList(); + + if (!filtered.Any()) + { + return Task.FromResult>( + [ + new LauncherItem( + "검색 결과 없음", + $"'{q}'에 해당하는 설치된 앱이 없습니다", + null, null, Symbol: Symbols.Info) + ]); + } + + var items = filtered.Select(a => new LauncherItem( + a.Name, + BuildSubtitle(a), + null, + a, + Symbol: Symbols.Uninstall)).ToList(); + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not InstalledApp app) return Task.CompletedTask; + + if (string.IsNullOrWhiteSpace(app.UninstallString)) + { + LogService.Warn($"제거 문자열 없음: {app.Name}"); + return Task.CompletedTask; + } + + try + { + // UninstallString이 "msiexec /x {GUID}" 또는 경로+args 형태 + var uninstall = app.UninstallString.Trim(); + + if (uninstall.StartsWith("msiexec", StringComparison.OrdinalIgnoreCase)) + { + // msiexec 직접 실행 + var args = uninstall.Substring("msiexec".Length).Trim(); + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo( + "msiexec.exe", args) { UseShellExecute = true }); + } + else + { + // 따옴표로 둘러싸인 경로 + 나머지 인수 분리 + string exe, arguments; + if (uninstall.StartsWith('"')) + { + var close = uninstall.IndexOf('"', 1); + exe = close > 0 ? uninstall[1..close] : uninstall; + arguments = close > 0 ? uninstall[(close + 1)..].Trim() : ""; + } + else + { + var spaceIdx = uninstall.IndexOf(' '); + if (spaceIdx > 0) + { + exe = uninstall[..spaceIdx]; + arguments = uninstall[(spaceIdx + 1)..]; + } + else + { + exe = uninstall; + arguments = ""; + } + } + + var psi = new System.Diagnostics.ProcessStartInfo(exe, arguments) + { UseShellExecute = true }; + System.Diagnostics.Process.Start(psi); + } + } + catch (Exception ex) + { + LogService.Warn($"제거 실행 실패 [{app.Name}]: {ex.Message}"); + } + + return Task.CompletedTask; + } + + // ─── 내부 ───────────────────────────────────────────────────────────────── + + private static string BuildSubtitle(InstalledApp a) + { + var parts = new List(); + if (!string.IsNullOrWhiteSpace(a.Publisher)) parts.Add(a.Publisher!); + if (!string.IsNullOrWhiteSpace(a.Version)) parts.Add($"v{a.Version}"); + if (!string.IsNullOrWhiteSpace(a.InstallDate)) parts.Add(a.InstallDate!); + parts.Add("Enter로 제거"); + return string.Join(" · ", parts); + } + + private static List GetInstalledApps() + { + if (_cache.HasValue && (DateTime.Now - _cache.Value.At) < CacheTtl) + return _cache.Value.Apps; + + var result = new List(); + var seen = new HashSet(StringComparer.OrdinalIgnoreCase); + + foreach (var root in new[] { Registry.LocalMachine, Registry.CurrentUser }) + { + foreach (var regPath in _regPaths) + { + try + { + using var key = root.OpenSubKey(regPath); + if (key == null) continue; + + foreach (var subName in key.GetSubKeyNames()) + { + try + { + using var sub = key.OpenSubKey(subName); + if (sub == null) continue; + + var name = sub.GetValue("DisplayName") as string; + var uninstall = sub.GetValue("UninstallString") as string; + + // 이름·제거 문자열 없으면 스킵, 시스템 업데이트/패치 스킵 + if (string.IsNullOrWhiteSpace(name)) continue; + if (string.IsNullOrWhiteSpace(uninstall)) continue; + if (name.StartsWith("KB", StringComparison.OrdinalIgnoreCase) && + name.Length < 12) continue; + if (!seen.Add(name)) continue; + + var systemComponent = sub.GetValue("SystemComponent"); + if (systemComponent is int sc && sc == 1) continue; + + result.Add(new InstalledApp + { + Name = name, + UninstallString = uninstall, + Publisher = sub.GetValue("Publisher") as string, + Version = sub.GetValue("DisplayVersion") as string, + InstallDate = FormatDate(sub.GetValue("InstallDate") as string), + }); + } + catch (Exception) { /* 개별 키 읽기 실패 무시 */ } + } + } + catch (Exception) { /* 레지스트리 접근 실패 무시 */ } + } + } + + result.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.OrdinalIgnoreCase)); + _cache = (DateTime.Now, result); + return result; + } + + private static string? FormatDate(string? raw) + { + // InstallDate 형식: "20230615" → "2023-06-15" + if (raw?.Length == 8 && + int.TryParse(raw, out _)) + { + return $"{raw[..4]}-{raw[4..6]}-{raw[6..8]}"; + } + return null; + } +} + +internal sealed class InstalledApp +{ + public string Name { get; init; } = ""; + public string? UninstallString { get; init; } + public string? Publisher { get; init; } + public string? Version { get; init; } + public string? InstallDate { get; init; } +} diff --git a/src/AxCopilot/Handlers/WebSearchHandler.cs b/src/AxCopilot/Handlers/WebSearchHandler.cs new file mode 100644 index 0000000..a743e9b --- /dev/null +++ b/src/AxCopilot/Handlers/WebSearchHandler.cs @@ -0,0 +1,216 @@ +using System.IO; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 웹 검색 핸들러. "?" 예약어로 사용합니다. +/// 예: ? 오늘 날씨 → 기본 검색엔진으로 검색 +/// ? github.com → URL 직접 열기 +/// ?g 파이썬 튜토리얼 → Google 검색 +/// ?n naver 뉴스 → Naver 검색 +/// ?y youtube 음악 → YouTube 검색 +/// ?g github.com → GitHub 직접 +/// +public class WebSearchHandler : IActionHandler +{ + private readonly SettingsService _settings; + + /// 내장 검색 엔진 아이콘 폴더 (Assets\SearchEngines) + private static readonly string _iconDir = Path.Combine( + Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) ?? ".", + "Assets", "SearchEngines"); + + public WebSearchHandler(SettingsService settings) => _settings = settings; + + public string? Prefix => "?"; + + public PluginMetadata Metadata => new( + "WebSearch", + "웹 검색 — ? 뒤에 검색어 또는 URL 입력", + "1.0", + "AX"); + + // 검색 엔진 단축 접두어 — Icon: 내장 PNG 파일명 (확장자 제외) + private static readonly Dictionary _engines = new() + { + ["g"] = ("Google", "https://www.google.com/search?q={0}", "google"), + ["n"] = ("Naver", "https://search.naver.com/search.naver?query={0}", "naver"), + ["y"] = ("YouTube", "https://www.youtube.com/results?search_query={0}", "youtube"), + ["gh"] = ("GitHub", "https://github.com/search?q={0}", "github"), + ["d"] = ("DuckDuckGo", "https://duckduckgo.com/?q={0}", "duckduckgo"), + ["w"] = ("Wikipedia", "https://ko.wikipedia.org/w/index.php?search={0}", "wikipedia"), + ["nm"] = ("Naver Map", "https://map.naver.com/p/search/{0}", "navermap"), + ["nw"] = ("나무위키", "https://namu.wiki/Special:Search?query={0}", "namuwiki"), + ["ni"] = ("Naver 이미지", "https://search.naver.com/search.naver?where=image&query={0}", "naver"), + ["gi"] = ("Google 이미지", "https://www.google.com/search?tbm=isch&q={0}", "google"), + }; + + /// 엔진 키에 대응하는 내장 아이콘 파일 경로를 반환합니다. 없으면 null. + private static string? GetIconPath(string engineKey) + { + if (!_engines.TryGetValue(engineKey, out var eng)) return null; + var path = Path.Combine(_iconDir, $"{eng.Icon}.png"); + return File.Exists(path) ? path : null; + } + + private string DefaultEngineKey => + _settings.Settings.Launcher.WebSearchEngine ?? "g"; + + private (string Name, string UrlTemplate, string Icon) DefaultEngine => + _engines.TryGetValue(DefaultEngineKey, out var eng) ? eng : _engines["g"]; + + private const string SecurityWarn = "⚠ 검색어가 외부로 전송됩니다 — 기밀 데이터 입력 금지"; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + // 사내 모드에서는 웹 검색 차단 + if (_settings.Settings.InternalModeEnabled) + { + return Task.FromResult>( + [ + new LauncherItem( + "웹 검색 차단됨", + "사내 모드에서는 외부 인터넷 검색이 차단됩니다. 설정에서 사외 모드를 활성화하세요.", + null, null, Symbol: Symbols.Lock) + ]); + } + + if (string.IsNullOrWhiteSpace(query)) + { + var defIcon = GetIconPath(DefaultEngineKey); + return Task.FromResult>( + [ + new LauncherItem( + "검색어를 입력하세요", + $"예: ? 오늘 날씨 · ?g python · ?y 음악 · ?n 뉴스 | {SecurityWarn}", + defIcon, null, Symbol: Symbols.Globe) + ]); + } + + var items = new List(); + var q = query.Trim(); + + // URL인 경우 직접 열기 — FaviconService로 웹에서 아이콘 가져오기 + if (IsUrl(q)) + { + var url = q.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? q : "https://" + q; + var faviconPath = GetFaviconPathForUrl(url); + items.Add(new LauncherItem( + $"열기: {q}", + $"{url} | {SecurityWarn}", + faviconPath, url, Symbol: Symbols.Globe)); + return Task.FromResult>(items); + } + + // 엔진 단축어 확인 (예: "g 파이썬" → Google 검색) + var parts = q.Split(' ', 2); + var engineKey = parts[0].ToLowerInvariant(); + if (parts.Length == 2 && _engines.TryGetValue(engineKey, out var engine)) + { + var searchQuery = parts[1].Trim(); + if (!string.IsNullOrWhiteSpace(searchQuery)) + { + var url = string.Format(engine.UrlTemplate, Uri.EscapeDataString(searchQuery)); + items.Add(new LauncherItem( + $"{engine.Name}에서 '{searchQuery}' 검색", + $"{SecurityWarn}", + GetIconPath(engineKey), url, Symbol: Symbols.Globe)); + } + } + + // 기본 엔진 검색 항목 + var defKey = DefaultEngineKey; + var def = DefaultEngine; + var defaultUrl = string.Format(def.UrlTemplate, Uri.EscapeDataString(q)); + items.Add(new LauncherItem( + $"{def.Name}에서 '{q}' 검색", + SecurityWarn, + GetIconPath(defKey), defaultUrl, Symbol: Symbols.Globe)); + + // 빠른 접속 사이트 표시 (쿼리가 짧을 때만) + if (q.Length <= 2) + { + foreach (var (key, eng) in _engines) + { + items.Add(new LauncherItem( + $"?{key} — {eng.Name}", + $"예: ?{key} {q} | {SecurityWarn}", + GetIconPath(key), null, Symbol: Symbols.Globe)); + } + } + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + // 사내 모드에서는 실행도 차단 + if (_settings.Settings.InternalModeEnabled) return Task.CompletedTask; + + if (item.Data is string url && !string.IsNullOrWhiteSpace(url)) + { + try + { + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(url) + { UseShellExecute = true }); + } + catch (Exception ex) + { + LogService.Warn($"웹 검색 열기 실패: {ex.Message}"); + } + } + return Task.CompletedTask; + } + + // ─── URL 판별 ──────────────────────────────────────────────────────────── + + private static bool IsUrl(string input) + { + if (input.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || + input.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) + return true; + + // xxx.yyy 형태 (도메인처럼 보이는 경우) + if (!input.Contains(' ') && input.Contains('.') && input.Length > 3) + { + var domainPart = input.Split('/')[0]; + var tldPart = domainPart.Split('.'); + return tldPart.Length >= 2 + && tldPart[^1].Length >= 2 + && tldPart[^1].Length <= 6 + && tldPart[^1].All(char.IsLetter); + } + + return false; + } + + // ─── URL 파비콘 가져오기 (FaviconService 연동) ───────────────────────── + + /// + /// URL에 대한 파비콘 경로를 반환합니다. + /// FaviconService 디스크 캐시에 있으면 즉시 반환, 없으면 백그라운드 다운로드를 시작합니다. + /// + private static string? GetFaviconPathForUrl(string url) + { + try + { + if (!url.StartsWith("http", StringComparison.OrdinalIgnoreCase)) + url = "https://" + url; + var domain = new Uri(url).Host.ToLowerInvariant(); + var cachePath = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "favicons", $"{domain}.png"); + + if (File.Exists(cachePath)) + return cachePath; + + // 디스크 캐시에 없으면 FaviconService를 통해 백그라운드 다운로드 시작 + FaviconService.GetFavicon(url); + return null; + } + catch (Exception) { return null; } + } +} diff --git a/src/AxCopilot/Handlers/WebSearchSummaryHandler.cs b/src/AxCopilot/Handlers/WebSearchSummaryHandler.cs new file mode 100644 index 0000000..83046a2 --- /dev/null +++ b/src/AxCopilot/Handlers/WebSearchSummaryHandler.cs @@ -0,0 +1,130 @@ +using System.Windows; +using AxCopilot.Models; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// Phase L3-2: 웹 검색 AI 요약 핸들러. "?!" 예약어로 사용합니다. +/// 예: ?! 최신 AI 동향 → 검색 쿼리에 대해 AI가 요약한 결과를 생성 +/// ?! https://... → 해당 URL의 내용을 AI가 요약 +/// +/// 조건: AiEnabled=true + InternalModeEnabled=false (사외 모드) +/// +public class WebSearchSummaryHandler : IActionHandler +{ + private readonly SettingsService _settings; + private readonly LlmService _llm; + + public string? Prefix => "?!"; + + public PluginMetadata Metadata => new( + "WebSearchSummary", + "웹 검색 AI 요약 — ?! 뒤에 검색어 또는 URL 입력", + "1.0", + "AX"); + + public WebSearchSummaryHandler(SettingsService settings, LlmService llm) + { + _settings = settings; + _llm = llm; + } + + private bool IsAvailable => + _settings.Settings.AiEnabled && !_settings.Settings.InternalModeEnabled; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + // AI 비활성화 또는 사내 모드에서는 항목 표시 안 함 + if (!IsAvailable) + return Task.FromResult>(Array.Empty()); + + if (string.IsNullOrWhiteSpace(query)) + { + return Task.FromResult>( + [ + new LauncherItem( + "웹 검색 AI 요약", + "?! [검색어 또는 URL] — AI가 검색 결과를 요약합니다", + null, null, Symbol: Symbols.Lightbulb) + ]); + } + + var q = query.Trim(); + var isUrl = q.StartsWith("http://", StringComparison.OrdinalIgnoreCase) + || q.StartsWith("https://", StringComparison.OrdinalIgnoreCase) + || (!q.Contains(' ') && q.Contains('.') && q.Length > 4); + + if (isUrl) + { + var url = q.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? q : "https://" + q; + return Task.FromResult>( + [ + new LauncherItem( + $"AI 요약: {q}", + "Enter → 페이지 내용을 AI가 요약하여 클립보드에 복사", + null, ("url", url), Symbol: Symbols.Lightbulb) + ]); + } + else + { + // 검색 쿼리 → 기본 검색엔진 URL 사용 + var searchUrl = $"https://www.google.com/search?q={Uri.EscapeDataString(q)}"; + return Task.FromResult>( + [ + new LauncherItem( + $"AI 요약: '{q}'", + "Enter → 검색어에 대한 AI 답변 생성 후 클립보드에 복사", + null, ("query", q), Symbol: Symbols.Lightbulb) + ]); + } + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (!IsAvailable) return; + + string prompt; + + switch (item.Data) + { + case ("url", string url): + var content = await ContentExtractor.ExtractAsync(url, maxChars: 3000, ct); + prompt = $"다음 웹 페이지 내용을 핵심 위주로 한국어로 요약해주세요 ({url}):\n\n{content}"; + break; + + case ("query", string q): + prompt = $"'{q}'에 대해 최신 정보를 바탕으로 핵심을 간결하게 설명해주세요."; + break; + + default: + return; + } + + try + { + var messages = new List + { + new() { Role = "system", Content = "당신은 정보를 간결하게 요약하는 전문 어시스턴트입니다. 핵심만 추려 명확하게 전달하세요." }, + new() { Role = "user", Content = prompt } + }; + + var result = await _llm.SendAsync(messages, ct); + + if (!string.IsNullOrWhiteSpace(result)) + { + Application.Current.Dispatcher.Invoke(() => + { + Clipboard.SetText(result); + NotificationService.Notify("AI 요약 완료", "결과가 클립보드에 복사되었습니다."); + }); + } + } + catch (Exception ex) + { + LogService.Warn($"웹 검색 AI 요약 실패: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Handlers/WindowSwitchHandler.cs b/src/AxCopilot/Handlers/WindowSwitchHandler.cs new file mode 100644 index 0000000..c50d16b --- /dev/null +++ b/src/AxCopilot/Handlers/WindowSwitchHandler.cs @@ -0,0 +1,129 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using AxCopilot.SDK; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// 윈도우 포커스 스위처 핸들러. "win" 프리픽스로 사용합니다. +/// 열린 창 목록을 타이틀/프로세스명으로 검색하여 즉시 전환합니다. +/// 예: win → 열린 창 목록 +/// win chrome → Chrome 창 필터 +/// win 보고서 → 타이틀에 "보고서" 포함하는 창 +/// Enter → 해당 창으로 즉시 전환. +/// +public class WindowSwitchHandler : IActionHandler +{ + public string? Prefix => "win"; + + public PluginMetadata Metadata => new( + "WindowSwitch", + "윈도우 포커스 스위처 — win", + "1.0", + "AX"); + + [DllImport("user32.dll")] private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); + [DllImport("user32.dll")] private static extern bool IsWindowVisible(IntPtr hWnd); + [DllImport("user32.dll")] private static extern int GetWindowTextLength(IntPtr hWnd); + [DllImport("user32.dll")] private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); + [DllImport("user32.dll")] private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); + [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); + [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + [DllImport("user32.dll")] private static extern bool IsIconic(IntPtr hWnd); + [DllImport("user32.dll")] private static extern IntPtr GetShellWindow(); + + private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); + private const int SW_RESTORE = 9; + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var q = query.Trim(); + var windows = GetOpenWindows(); + + if (!string.IsNullOrWhiteSpace(q)) + { + windows = windows.Where(w => + w.Title.Contains(q, StringComparison.OrdinalIgnoreCase) || + w.ProcessName.Contains(q, StringComparison.OrdinalIgnoreCase)).ToList(); + } + + if (!windows.Any()) + { + return Task.FromResult>( + [ + new LauncherItem( + string.IsNullOrWhiteSpace(q) ? "열린 창이 없습니다" : $"'{q}'에 해당하는 창 없음", + "win 뒤에 프로세스명 또는 창 제목 입력", + null, null, Symbol: Symbols.Info) + ]); + } + + var items = windows.Take(15).Select(w => new LauncherItem( + w.Title.Length > 60 ? w.Title[..57] + "…" : w.Title, + $"{w.ProcessName} · {(w.IsMinimized ? "[최소화됨] · " : "")}Enter → 전환", + null, w.Handle, + Symbol: Symbols.Computer)).ToList(); + + items.Insert(0, new LauncherItem( + $"열린 창 {windows.Count}개", + "Enter → 해당 창으로 즉시 전환", + null, null, Symbol: Symbols.Info)); + + return Task.FromResult>(items); + } + + public Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is IntPtr hwnd && hwnd != IntPtr.Zero) + { + if (IsIconic(hwnd)) + ShowWindow(hwnd, SW_RESTORE); + SetForegroundWindow(hwnd); + } + return Task.CompletedTask; + } + + private static List GetOpenWindows() + { + var list = new List(); + var shellWnd = GetShellWindow(); + var currentProcessName = Process.GetCurrentProcess().ProcessName; + + EnumWindows((hWnd, _) => + { + if (hWnd == shellWnd) return true; + if (!IsWindowVisible(hWnd)) return true; + + var titleLen = GetWindowTextLength(hWnd); + if (titleLen == 0) return true; + + var sb = new StringBuilder(titleLen + 1); + GetWindowText(hWnd, sb, sb.Capacity); + var title = sb.ToString(); + + string processName = ""; + try + { + GetWindowThreadProcessId(hWnd, out uint pid); + processName = Process.GetProcessById((int)pid).ProcessName; + } + catch (Exception) { } + + // 자기 자신 + 시스템 프로세스 제외 + if (processName == currentProcessName) + return true; + if (processName is "ApplicationFrameHost" or "ShellExperienceHost" or "SearchHost" + or "StartMenuExperienceHost" or "TextInputHost") + return true; + + list.Add(new WindowInfo(hWnd, title, processName, IsIconic(hWnd))); + return true; + }, IntPtr.Zero); + + return list; + } + + private record WindowInfo(IntPtr Handle, string Title, string ProcessName, bool IsMinimized); +} diff --git a/src/AxCopilot/Handlers/WorkspaceHandler.cs b/src/AxCopilot/Handlers/WorkspaceHandler.cs new file mode 100644 index 0000000..7a05c8f --- /dev/null +++ b/src/AxCopilot/Handlers/WorkspaceHandler.cs @@ -0,0 +1,118 @@ +using AxCopilot.Core; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.Handlers; + +/// +/// ~ prefix 핸들러: 워크스페이스 프로필 저장/복원/관리 +/// 예: ~dev, ~save dev, ~delete dev, ~rename dev work +/// +public class WorkspaceHandler : IActionHandler +{ + private readonly ContextManager _context; + private readonly SettingsService _settings; + + public string? Prefix => "~"; + public PluginMetadata Metadata => new("workspace", "워크스페이스", "1.0", "AX"); + + public WorkspaceHandler(ContextManager context, SettingsService settings) + { + _context = context; + _settings = settings; + } + + public Task> GetItemsAsync(string query, CancellationToken ct) + { + var parts = query.Trim().Split(' ', StringSplitOptions.RemoveEmptyEntries); + + // 서브 커맨드 분기 + if (parts.Length == 0 || string.IsNullOrEmpty(query)) + { + // 프로필 목록 표시 + var items = _settings.Settings.Profiles + .Select(p => new LauncherItem( + $"~{p.Name}", + $"{p.Windows.Count}개 창 | {p.CreatedAt:MM/dd HH:mm}", + null, p, Symbol: Symbols.Workspace)) + .ToList(); + + if (items.Count == 0) + items.Add(new LauncherItem("저장된 프로필 없음", "~save <이름> 으로 현재 배치를 저장하세요", null, null, Symbol: Symbols.Info)); + + return Task.FromResult>(items); + } + + var cmd = parts[0].ToLowerInvariant(); + + if (cmd == "save") + { + var name = parts.Length > 1 ? parts[1] : "default"; + return Task.FromResult>(new[] + { + new LauncherItem($"현재 창 배치를 '{name}'으로 저장", "Enter로 확인", null, + new WorkspaceAction(WorkspaceActionType.Save, name), Symbol: Symbols.Save) + }); + } + + if (cmd == "delete" && parts.Length > 1) + { + return Task.FromResult>(new[] + { + new LauncherItem($"프로필 '{parts[1]}' 삭제", "Enter로 확인 (되돌릴 수 없습니다)", null, + new WorkspaceAction(WorkspaceActionType.Delete, parts[1]), Symbol: Symbols.Delete) + }); + } + + if (cmd == "rename" && parts.Length > 2) + { + return Task.FromResult>(new[] + { + new LauncherItem($"프로필 '{parts[1]}' → '{parts[2]}'로 이름 변경", "Enter로 확인", null, + new WorkspaceAction(WorkspaceActionType.Rename, parts[1], parts[2]), Symbol: Symbols.Rename) + }); + } + + // 이름으로 프로필 검색 + var matched = _settings.Settings.Profiles + .Where(p => p.Name.Contains(query, StringComparison.OrdinalIgnoreCase)) + .Select(p => new LauncherItem( + $"~{p.Name} 복원", + $"{p.Windows.Count}개 창 | {p.CreatedAt:MM/dd HH:mm}", + null, + new WorkspaceAction(WorkspaceActionType.Restore, p.Name), + Symbol: Symbols.Restore)); + + return Task.FromResult>(matched); + } + + public async Task ExecuteAsync(LauncherItem item, CancellationToken ct) + { + if (item.Data is not WorkspaceAction action) return; + + switch (action.Type) + { + case WorkspaceActionType.Restore: + var result = await _context.RestoreProfileAsync(action.Name, ct); + LogService.Info($"복원 결과: {result.Message}"); + break; + + case WorkspaceActionType.Save: + _context.CaptureProfile(action.Name); + break; + + case WorkspaceActionType.Delete: + _context.DeleteProfile(action.Name); + break; + + case WorkspaceActionType.Rename when action.NewName != null: + _context.RenameProfile(action.Name, action.NewName); + break; + } + } +} + +public record WorkspaceAction(WorkspaceActionType Type, string Name, string? NewName = null); + +public enum WorkspaceActionType { Restore, Save, Delete, Rename } diff --git a/src/AxCopilot/Models/AppSettings.cs b/src/AxCopilot/Models/AppSettings.cs new file mode 100644 index 0000000..5f9b699 --- /dev/null +++ b/src/AxCopilot/Models/AppSettings.cs @@ -0,0 +1,1320 @@ +using System.Text.Json.Serialization; + +namespace AxCopilot.Models; + +public class AppSettings +{ + [JsonPropertyName("version")] + public string Version { get; set; } = "1.0"; + + /// + /// AI 기능 활성화 여부. false이면 ! 명령어 차단 + 설정의 AX Agent 탭 숨김. + /// 클로드 버전(AI 미포함 배포)은 false로 설정합니다. + /// + [JsonPropertyName("ai_enabled")] + public bool AiEnabled { get; set; } = false; + + /// + /// 사내 모드 활성화 여부. true(기본)이면 외부 인터넷 접속 차단. + /// false(사외 모드)이면 웹 검색, 외부 HTTP 요청 허용. + /// 사외 모드 전환은 비밀번호(axgo123!) 인증 필요. + /// + [JsonPropertyName("internal_mode_enabled")] + public bool InternalModeEnabled { get; set; } = true; + + [JsonPropertyName("hotkey")] + public string Hotkey { get; set; } = "Alt+Space"; + + [JsonPropertyName("launcher")] + public LauncherSettings Launcher { get; set; } = new(); + + [JsonPropertyName("indexPaths")] + public List IndexPaths { get; set; } = new() + { + "%USERPROFILE%\\Desktop", + "%APPDATA%\\Microsoft\\Windows\\Start Menu" + }; + + /// + /// 인덱싱할 파일 확장자 목록 (점 포함). 빈 리스트 = 모든 파일. + /// 기본값: 실행 파일 + 문서 + 이미지 + 텍스트 파일. + /// + [JsonPropertyName("indexExtensions")] + public List IndexExtensions { get; set; } = new() + { + // 실행 파일 + ".exe", ".lnk", ".bat", ".ps1", ".url", ".cmd", ".msi", + // 문서 + ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", + ".hwp", ".hwpx", + // 텍스트 + ".txt", ".md", ".csv", ".json", ".xml", ".yaml", ".yml", + ".log", ".ini", ".cfg", ".conf", + // 이미지 + ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg", ".webp", ".ico", ".tiff", + // 기타 + ".zip", ".7z", ".rar" + }; + + /// 인덱싱 속도. slow | normal | fast. 기본 normal. + [JsonPropertyName("indexSpeed")] + public string IndexSpeed { get; set; } = "normal"; // slow | normal | fast + + [JsonPropertyName("monitorMismatch")] + public string MonitorMismatch { get; set; } = "warn"; // fit | skip | warn + + [JsonPropertyName("profiles")] + public List Profiles { get; set; } = new(); + + [JsonPropertyName("aliases")] + public List Aliases { get; set; } = new(); + + [JsonPropertyName("clipboardTransformers")] + public List ClipboardTransformers { get; set; } = new(); + + [JsonPropertyName("apiAdapters")] + public List ApiAdapters { get; set; } = new(); + + [JsonPropertyName("plugins")] + public List Plugins { get; set; } = new(); + + [JsonPropertyName("snippets")] + public List Snippets { get; set; } = new(); + + [JsonPropertyName("quickLinks")] + public List QuickLinks { get; set; } = new(); + + [JsonPropertyName("aiSnippetTemplates")] + public List AiSnippetTemplates { get; set; } = new() + { + new() { Keyword = "email", Name = "업무 이메일", Prompt = "다음 상황에 맞는 업무용 이메일을 작성해주세요: {0}" }, + new() { Keyword = "summary", Name = "요약", Prompt = "다음 내용을 간결하게 요약해주세요: {0}" }, + new() { Keyword = "translate",Name = "번역", Prompt = "다음 텍스트를 자연스럽게 한국어로 번역해주세요: {0}" }, + new() { Keyword = "review", Name = "코드 리뷰", Prompt = "다음 코드를 검토하고 개선점을 제안해주세요:\n{0}" }, + new() { Keyword = "commit", Name = "커밋 메시지", Prompt = "다음 변경사항에 대한 git 커밋 메시지를 작성해주세요: {0}" }, + }; + + [JsonPropertyName("clipboardHistory")] + public ClipboardHistorySettings ClipboardHistory { get; set; } = new(); + + [JsonPropertyName("systemCommands")] + public SystemCommandSettings SystemCommands { get; set; } = new(); + + [JsonPropertyName("screenCapture")] + public ScreenCaptureSettings ScreenCapture { get; set; } = new(); + + [JsonPropertyName("reminder")] + public ReminderSettings Reminder { get; set; } = new(); + + [JsonPropertyName("llm")] + public LlmSettings Llm { get; set; } = new(); +} + +public class LauncherSettings +{ + [JsonPropertyName("opacity")] + public double Opacity { get; set; } = 0.96; + + [JsonPropertyName("maxResults")] + public int MaxResults { get; set; } = 7; + + [JsonPropertyName("theme")] + // 지원 값: system | dark | light | oled | nord | monokai | catppuccin | sepia | custom + public string Theme { get; set; } = "system"; + + [JsonPropertyName("position")] + public string Position { get; set; } = "center-top"; // center-top | center | bottom + + [JsonPropertyName("width")] + public double Width { get; set; } = 680; + + [JsonPropertyName("webSearchEngine")] + public string WebSearchEngine { get; set; } = "g"; // g | n | d | y | w + + [JsonPropertyName("snippetAutoExpand")] + public bool SnippetAutoExpand { get; set; } = true; + + [JsonPropertyName("language")] + public string Language { get; set; } = "ko"; // ko | en | ja | zh | vi + + [JsonPropertyName("customTheme")] + public CustomThemeColors? CustomTheme { get; set; } + + // ─── 기능 토글 ───────────────────────────────────────────────────────── + + /// 번호 배지(1~9) 표시 여부. Ctrl+숫자로 바로 실행. 기본 true. + [JsonPropertyName("showNumberBadges")] + public bool ShowNumberBadges { get; set; } = true; + + /// 즐겨찾기 기능 활성화. fav 접두어, Ctrl+B. 기본 true. + [JsonPropertyName("enableFavorites")] + public bool EnableFavorites { get; set; } = true; + + /// 최근 실행 기록 저장 여부. recent 접두어, Ctrl+R. 기본 true. + [JsonPropertyName("enableRecent")] + public bool EnableRecent { get; set; } = true; + + /// 액션 모드 진입 허용 여부. Ctrl+Enter / Alt+Enter / → 키. 기본 true. + [JsonPropertyName("enableActionMode")] + public bool EnableActionMode { get; set; } = true; + + /// 포커스 잃을 때 런처 자동 닫기. 기본 true. + [JsonPropertyName("closeOnFocusLost")] + public bool CloseOnFocusLost { get; set; } = true; + + /// 입력창 좌측 프리픽스 배지 표시. 기본 true. + [JsonPropertyName("showPrefixBadge")] + public bool ShowPrefixBadge { get; set; } = true; + + /// 런처 아이콘 애니메이션 효과 활성화. 기본 true. + [JsonPropertyName("enableIconAnimation")] + public bool EnableIconAnimation { get; set; } = true; + + /// 런처 안내 문구 랜덤 출력 활성화. false이면 고정 문구. 기본 true. + [JsonPropertyName("enableRandomPlaceholder")] + public bool EnableRandomPlaceholder { get; set; } = true; + + /// 런처 무지개 글로우 효과 활성화. 기본 false (성능 고려). + [JsonPropertyName("enableRainbowGlow")] + public bool EnableRainbowGlow { get; set; } = false; + + /// 선택된 아이템 상시 글로우 효과. 기본 false. + [JsonPropertyName("enableSelectionGlow")] + public bool EnableSelectionGlow { get; set; } = false; + + /// 런처 창 테두리 표시 여부. 기본 true(표시). + [JsonPropertyName("showLauncherBorder")] + public bool ShowLauncherBorder { get; set; } = true; + + /// 단축키 헬프 창에서 아이콘 색상을 테마 AccentColor 기준으로 표시. 기본 true(테마색). + [JsonPropertyName("shortcutHelpUseThemeColor")] + public bool ShortcutHelpUseThemeColor { get; set; } = true; + + // ─── 독 바 설정 ────────────────────────────────────────────────────────── + + // ─── 선택 텍스트 AI 명령 설정 ─────────────────────────────────────────── + + /// 선택 텍스트 AI 명령 활성화. 기본 true. + [JsonPropertyName("enableTextAction")] + public bool EnableTextAction { get; set; } = true; + + /// 활성화된 텍스트 AI 명령 목록. 가능한 값: translate, summarize, grammar, explain, rewrite + [JsonPropertyName("textActionCommands")] + public List TextActionCommands { get; set; } = new() { "translate", "summarize", "grammar", "explain", "rewrite" }; + + /// 번역 기본 언어. 기본 "한국어↔영어 자동". + [JsonPropertyName("textActionTranslateLanguage")] + public string TextActionTranslateLanguage { get; set; } = "auto"; + + // ─── 파일 대화상자 통합 설정 ───────────────────────────────────────────── + + /// 열기/저장 대화상자 감지 시 런처 자동 열기. 기본 false. + [JsonPropertyName("enableFileDialogIntegration")] + public bool EnableFileDialogIntegration { get; set; } = false; + + // ─── 클립보드 핀/카테고리 설정 ─────────────────────────────────────────── + + /// 클립보드 자동 카테고리 분류 활성화. 기본 true. + [JsonPropertyName("enableClipboardAutoCategory")] + public bool EnableClipboardAutoCategory { get; set; } = true; + + /// 최대 핀 고정 개수. 기본 20. + [JsonPropertyName("maxPinnedClipboardItems")] + public int MaxPinnedClipboardItems { get; set; } = 20; + + // ─── 독 바 설정 ────────────────────────────────────────────────────────── + + /// 독 바 표시 항목. 가능한 값: launcher, clipboard, capture, agent, clock, cpu, ram, quickinput + [JsonPropertyName("dockBarItems")] + public List DockBarItems { get; set; } = new() { "launcher", "clipboard", "capture", "agent", "clock", "cpu" }; + + /// 독 바 앱 시작 시 자동 표시. 기본 false. + [JsonPropertyName("dockBarAutoShow")] + public bool DockBarAutoShow { get; set; } = false; + + /// 독 바 투명도 (0.3~1.0). 기본 0.92. + [JsonPropertyName("dockBarOpacity")] + public double DockBarOpacity { get; set; } = 0.92; + + /// 독 바 무지개 글로우 효과. 기본 false. + [JsonPropertyName("dockBarRainbowGlow")] + public bool DockBarRainbowGlow { get; set; } = false; + + /// 독 바 마지막 위치 X. -1이면 중앙. + [JsonPropertyName("dockBarLeft")] + public double DockBarLeft { get; set; } = -1; + + /// 독 바 마지막 위치 Y. -1이면 하단. + [JsonPropertyName("dockBarTop")] + public double DockBarTop { get; set; } = -1; +} + +/// +/// "theme": "custom" 설정 시 사용할 사용자 정의 색상. +/// settings.json에서 직접 헥스 코드(#RRGGBB)로 지정합니다. +/// +public class CustomThemeColors +{ + [JsonPropertyName("launcherBackground")] + public string LauncherBackground { get; set; } = "#1A1B2E"; + + [JsonPropertyName("itemBackground")] + public string ItemBackground { get; set; } = "#252637"; + + [JsonPropertyName("itemSelectedBackground")] + public string ItemSelectedBackground { get; set; } = "#3B4BDB"; + + [JsonPropertyName("itemHoverBackground")] + public string ItemHoverBackground { get; set; } = "#22233A"; + + [JsonPropertyName("primaryText")] + public string PrimaryText { get; set; } = "#F0F0FF"; + + [JsonPropertyName("secondaryText")] + public string SecondaryText { get; set; } = "#7A7D9C"; + + [JsonPropertyName("placeholderText")] + public string PlaceholderText { get; set; } = "#464868"; + + [JsonPropertyName("accentColor")] + public string AccentColor { get; set; } = "#4B5EFC"; + + [JsonPropertyName("separatorColor")] + public string SeparatorColor { get; set; } = "#252637"; + + [JsonPropertyName("hintBackground")] + public string HintBackground { get; set; } = "#252637"; + + [JsonPropertyName("hintText")] + public string HintText { get; set; } = "#4B5070"; + + [JsonPropertyName("borderColor")] + public string BorderColor { get; set; } = "#2E2F4A"; + + [JsonPropertyName("scrollbarThumb")] + public string ScrollbarThumb { get; set; } = "#3A3B5A"; + + [JsonPropertyName("shadowColor")] + public string ShadowColor { get; set; } = "#000000"; + + /// 창 전체 모서리 라운딩 (0~30). 기본값 20. + [JsonPropertyName("windowCornerRadius")] + public int WindowCornerRadius { get; set; } = 20; + + /// 결과 항목 모서리 라운딩 (0~20). 기본값 10. + [JsonPropertyName("itemCornerRadius")] + public int ItemCornerRadius { get; set; } = 10; +} + +public class WorkspaceProfile +{ + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("windows")] + public List Windows { get; set; } = new(); + + [JsonPropertyName("createdAt")] + public DateTime CreatedAt { get; set; } = DateTime.Now; +} + +public class WindowSnapshot +{ + [JsonPropertyName("exe")] + public string Exe { get; set; } = ""; + + [JsonPropertyName("title")] + public string Title { get; set; } = ""; + + [JsonPropertyName("rect")] + public WindowRect Rect { get; set; } = new(); + + [JsonPropertyName("showCmd")] + public string ShowCmd { get; set; } = "Normal"; // Normal | Minimized | Maximized + + [JsonPropertyName("monitor")] + public int Monitor { get; set; } = 0; +} + +public class WindowRect +{ + [JsonPropertyName("x")] + public int X { get; set; } + + [JsonPropertyName("y")] + public int Y { get; set; } + + [JsonPropertyName("width")] + public int Width { get; set; } + + [JsonPropertyName("height")] + public int Height { get; set; } +} + +public class AliasEntry +{ + [JsonPropertyName("key")] + public string Key { get; set; } = ""; + + [JsonPropertyName("type")] + public string Type { get; set; } = "url"; // url | folder | app | batch | api | clipboard + + [JsonPropertyName("target")] + public string Target { get; set; } = ""; + + [JsonPropertyName("description")] + public string? Description { get; set; } + + [JsonPropertyName("showWindow")] + public bool ShowWindow { get; set; } = false; + + [JsonPropertyName("adapter")] + public string? Adapter { get; set; } + + [JsonPropertyName("query")] + public string? Query { get; set; } +} + +public class ClipboardTransformer +{ + [JsonPropertyName("key")] + public string Key { get; set; } = ""; + + [JsonPropertyName("type")] + public string Type { get; set; } = "regex"; // regex | script + + [JsonPropertyName("pattern")] + public string? Pattern { get; set; } + + [JsonPropertyName("replace")] + public string? Replace { get; set; } + + [JsonPropertyName("command")] + public string? Command { get; set; } + + [JsonPropertyName("timeout")] + public int Timeout { get; set; } = 5000; + + [JsonPropertyName("description")] + public string? Description { get; set; } +} + +public class ApiAdapter +{ + [JsonPropertyName("id")] + public string Id { get; set; } = ""; + + [JsonPropertyName("baseUrl")] + public string BaseUrl { get; set; } = ""; + + [JsonPropertyName("credentialKey")] + public string CredentialKey { get; set; } = ""; +} + +public class PluginEntry +{ + [JsonPropertyName("path")] + public string Path { get; set; } = ""; + + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; +} + +// ─── 스니펫 ─────────────────────────────────────────────────────────────────── + +public class SnippetEntry +{ + [JsonPropertyName("key")] + public string Key { get; set; } = ""; // 트리거 키워드 (예: addr, sig) + + [JsonPropertyName("name")] + public string Name { get; set; } = ""; // 표시 이름 + + [JsonPropertyName("content")] + public string Content { get; set; } = ""; // 확장될 전체 텍스트 +} + +// ─── 퀵링크 ────────────────────────────────────────────────────────────────── + +/// +/// 파라미터 퀵링크 항목. +/// 예: keyword="maps", urlTemplate="https://map.naver.com/p/search/{0}" +/// 사용: ql maps 강남역 → URL에 "강남역" 치환 후 브라우저 열기 +/// +public class QuickLinkEntry +{ + [JsonPropertyName("keyword")] + public string Keyword { get; set; } = ""; // 트리거 키워드 + + [JsonPropertyName("name")] + public string Name { get; set; } = ""; // 표시 이름 + + [JsonPropertyName("urlTemplate")] + public string UrlTemplate { get; set; } = ""; // {0}, {1} 또는 {query} 플레이스홀더 + + [JsonPropertyName("description")] + public string Description { get; set; } = ""; // 설명 +} + +// ─── AI 스니펫 템플릿 ───────────────────────────────────────────────────────── + +/// +/// AI 스니펫 템플릿 항목. +/// 예: keyword="email", prompt="다음 상황에 맞는 업무 이메일 작성: {0}" +/// 사용: ai email 프로젝트 일정 변경 안내 → AI가 이메일 초안 생성 +/// +public class AiSnippetTemplate +{ + [JsonPropertyName("keyword")] + public string Keyword { get; set; } = ""; + + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("prompt")] + public string Prompt { get; set; } = ""; // {0}, {query} 플레이스홀더 지원 +} + +// ─── 클립보드 히스토리 ──────────────────────────────────────────────────────── + +public class ClipboardHistorySettings +{ + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + + [JsonPropertyName("maxItems")] + public int MaxItems { get; set; } = 50; + + [JsonPropertyName("excludePatterns")] + public List ExcludePatterns { get; set; } = new() + { + @"^\d{4}[\s\-]?\d{4}[\s\-]?\d{4}[\s\-]?\d{4}$", // 카드번호 + @"^(?:\d{1,3}\.){3}\d{1,3}$" // IP 주소 + }; +} + +// ─── 시스템 명령 ────────────────────────────────────────────────────────────── + +public class SystemCommandSettings +{ + [JsonPropertyName("showLock")] public bool ShowLock { get; set; } = true; + [JsonPropertyName("showSleep")] public bool ShowSleep { get; set; } = true; + [JsonPropertyName("showRestart")] public bool ShowRestart { get; set; } = true; + [JsonPropertyName("showShutdown")] public bool ShowShutdown { get; set; } = true; + [JsonPropertyName("showHibernate")] public bool ShowHibernate { get; set; } = false; + [JsonPropertyName("showLogout")] public bool ShowLogout { get; set; } = true; + [JsonPropertyName("showRecycleBin")] public bool ShowRecycleBin { get; set; } = true; + + /// + /// 시스템 명령 별칭. key = 기본 명령어(lock/sleep 등), value = 사용자 정의 별칭 목록. + /// 예: { "lock": ["잠금", "l"] } → /잠금, /l 로도 실행 가능 + /// + [JsonPropertyName("commandAliases")] + public Dictionary> CommandAliases { get; set; } = new(); +} + +// ─── 스크린 캡처 설정 ────────────────────────────────────────────────────────── + +public class ScreenCaptureSettings +{ + /// 캡처 명령어 프리픽스. 기본값 "cap". + [JsonPropertyName("prefix")] + public string Prefix { get; set; } = "cap"; + + /// 런처를 열지 않고 글로벌 단축키로 캡처하는 기능 활성화 여부. + [JsonPropertyName("globalHotkeyEnabled")] + public bool GlobalHotkeyEnabled { get; set; } = false; + + /// 글로벌 캡처 단축키 문자열. 기본값 "PrintScreen". + [JsonPropertyName("globalHotkey")] + public string GlobalHotkey { get; set; } = "PrintScreen"; + + /// 글로벌 캡처 단축키 실행 모드. screen|window|region. + [JsonPropertyName("globalHotkeyMode")] + public string GlobalHotkeyMode { get; set; } = "screen"; + + /// 스크롤 캡처 프레임 간 대기 시간(ms). 기본값 120. + [JsonPropertyName("scrollDelayMs")] + public int ScrollDelayMs { get; set; } = 120; +} + +// ─── 잠금 해제 알림 설정 ─────────────────────────────────────────────────────── + +public class ReminderSettings +{ + /// 기능 활성화 여부. 기본값 false. + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = false; + + /// 팝업 표시 위치. top-left | top-right | bottom-left | bottom-right + [JsonPropertyName("corner")] + public string Corner { get; set; } = "bottom-right"; + + /// 알림 간격(분). 30 | 60 | 120 | 180 | 240 + [JsonPropertyName("intervalMinutes")] + public int IntervalMinutes { get; set; } = 60; + + /// 팝업 자동 닫힘 시간(초). 기본값 15. (5/10/15/20/30/60/120/180) + [JsonPropertyName("displaySeconds")] + public int DisplaySeconds { get; set; } = 15; + + /// 알림 콘텐츠 카테고리 활성화 목록. + [JsonPropertyName("enabledCategories")] + public List EnabledCategories { get; set; } = new() { "motivational" }; +} + +// ─── LLM 채팅 설정 ────────────────────────────────────────────────────────── + +public class LlmSettings +{ + /// LLM 서비스 종류. ollama | vllm | gemini | claude + [JsonPropertyName("service")] + public string Service { get; set; } = "ollama"; + + /// 엔드포인트 URL. Ollama 기본값 http://localhost:11434 + [JsonPropertyName("endpoint")] + public string Endpoint { get; set; } = "http://localhost:11434"; + + /// 모델 이름. 미설정 시 빈 문자열. + [JsonPropertyName("model")] + public string Model { get; set; } = ""; + + /// 암호화된 API 키 (사내 Ollama/vLLM 전용). DPAPI+AES로 암호화된 Base64. + [JsonPropertyName("encryptedApiKey")] + public string EncryptedApiKey { get; set; } = ""; + + /// 평문 API 키 (Gemini/Claude 등 외부 서비스). 사내 연결 제한으로 별도 암호화 없음. + [JsonPropertyName("apiKey")] + public string ApiKey { get; set; } = ""; + + /// 스트리밍 응답 활성화. 기본값 true. + [JsonPropertyName("streaming")] + public bool Streaming { get; set; } = true; + + /// 최대 컨텍스트 토큰 수. 기본값 4096. + [JsonPropertyName("maxContextTokens")] + public int MaxContextTokens { get; set; } = 4096; + + /// Phase 29: 자동 컴팩션 임계치 (%). 0이면 80% 기본값. CC auto_compact_threshold_percent 동등. + [JsonPropertyName("autoCompactThreshold")] + public int AutoCompactThreshold { get; set; } = 80; + + /// 대화 보관 기간(일). 7 | 30 | 90 | 0(무제한). 기본값 30. + [JsonPropertyName("retentionDays")] + public int RetentionDays { get; set; } = 30; + + /// Temperature. 0.0~2.0, 기본값 0.7. + [JsonPropertyName("temperature")] + public double Temperature { get; set; } = 0.7; + + /// 사내 서비스(Ollama/vLLM)용 등록 모델 목록. 별칭 + 암호화된 모델명. + [JsonPropertyName("registeredModels")] + public List RegisteredModels { get; set; } = new(); + + /// + /// API 키/모델명 암호화 활성화 여부. + /// false: 평문 저장 (내부 개발 배포용) + /// true: PortableEncrypt로 암호화 저장 (운영 배포용) + /// 기본값 false. 운영 배포 시 true로 변경. + /// + [JsonPropertyName("encryptionEnabled")] + public bool EncryptionEnabled { get; set; } = false; + + /// 프롬프트 템플릿 목록. + [JsonPropertyName("promptTemplates")] + public List PromptTemplates { get; set; } = new(); + + /// 작업 폴더 경로. 빈 문자열이면 미선택. + [JsonPropertyName("workFolder")] + public string WorkFolder { get; set; } = ""; + + /// 최근 사용한 작업 폴더 목록. + [JsonPropertyName("recentWorkFolders")] + public List RecentWorkFolders { get; set; } = new(); + + /// 최근 폴더 최대 표시 개수 (기본 10, 범위 3~30). + [JsonPropertyName("maxRecentFolders")] + public int MaxRecentFolders { get; set; } = 10; + + /// 파일 탐색기 패널 표시 여부 (코워크 탭). + [JsonPropertyName("showFileBrowser")] + public bool ShowFileBrowser { get; set; } = false; + + /// + /// 파일 접근 권한 수준. + /// Ask = 매번 확인 | Auto = 자동 허용 | Deny = 차단 + /// + [JsonPropertyName("filePermission")] + public string FilePermission { get; set; } = "Ask"; + + /// Cowork/Code 탭의 기본 파일 접근 권한. 탭 전환 시 자동 적용. + [JsonPropertyName("defaultAgentPermission")] + public string DefaultAgentPermission { get; set; } = "Ask"; + + // ── 서비스별 독립 설정 ────────────────────────────────────── + [JsonPropertyName("ollamaEndpoint")] public string OllamaEndpoint { get; set; } = "http://localhost:11434"; + [JsonPropertyName("ollamaApiKey")] public string OllamaApiKey { get; set; } = ""; + [JsonPropertyName("ollamaModel")] public string OllamaModel { get; set; } = ""; + + [JsonPropertyName("vllmEndpoint")] public string VllmEndpoint { get; set; } = ""; + [JsonPropertyName("vllmApiKey")] public string VllmApiKey { get; set; } = ""; + [JsonPropertyName("vllmModel")] public string VllmModel { get; set; } = ""; + + [JsonPropertyName("geminiApiKey")] public string GeminiApiKey { get; set; } = ""; + [JsonPropertyName("geminiModel")] public string GeminiModel { get; set; } = "gemini-2.5-flash"; + + [JsonPropertyName("claudeApiKey")] public string ClaudeApiKey { get; set; } = ""; + [JsonPropertyName("claudeModel")] public string ClaudeModel { get; set; } = "claude-sonnet-4-6"; + + // ── Cowork 에이전트 설정 ───────────────────────────────── + + /// 기본 출력 포맷. auto | xlsx | docx | html | md | csv + [JsonPropertyName("defaultOutputFormat")] + public string DefaultOutputFormat { get; set; } = "auto"; + + /// 기본 디자인 무드. modern | professional | creative 등 + [JsonPropertyName("defaultMood")] + public string DefaultMood { get; set; } = "modern"; + + /// 문서 미리보기 자동 열기. auto | manual | off + [JsonPropertyName("autoPreview")] + public string AutoPreview { get; set; } = "off"; + + /// 에이전트 최대 루프 반복 횟수. + [JsonPropertyName("maxAgentIterations")] + public int MaxAgentIterations { get; set; } = 25; + + /// 도구 실패 시 최대 재시도 횟수 (Self-Reflection). + [JsonPropertyName("maxRetryOnError")] + public int MaxRetryOnError { get; set; } = 3; + + /// 테스트-수정 자동 반복 최대 횟수. auto_fix 모드에서 사용. 기본 5. + [JsonPropertyName("maxTestFixIterations")] + public int MaxTestFixIterations { get; set; } = 5; + + /// 에이전트 로그 표시 수준. simple | detailed | debug + [JsonPropertyName("agentLogLevel")] + public string AgentLogLevel { get; set; } = "simple"; + + /// LLM이 다수 도구를 동시 호출할 때 병렬 실행 활성화. 파일 충돌 없는 도구만 병렬 실행. + [JsonPropertyName("enableParallelTools")] + public bool EnableParallelTools { get; set; } = false; + + /// 멀티패스 문서 생성 사용 여부. 긴 문서(3페이지 이상) 작성 시 개요→섹션별 상세→조립 방식으로 품질 향상. + [JsonPropertyName("enableMultiPassDocument")] + public bool EnableMultiPassDocument { get; set; } = false; + + /// + /// [Cowork] 도구 실행 후 검증 강제. + /// true: 문서 생성 도구(file_write, docx_create, html_create, xlsx_create 등) 실행 후 + /// LLM에 검증 전용 호출을 자동 삽입하여 결과물 품질을 확인합니다. + /// false: LLM이 자율적으로 검증 여부를 결정합니다 (기존 동작). + /// + [JsonPropertyName("enableCoworkVerification")] + public bool EnableCoworkVerification { get; set; } = false; + + /// + /// [Cowork] 검증 강제 시 워크스페이스 파일/폴더 참조를 채팅에서 파란색으로 강조 표시. + /// + [JsonPropertyName("enableFilePathHighlight")] + public bool EnableFilePathHighlight { get; set; } = true; + + /// 멀티패스 자동 실행 기준 (예상 페이지 수 이상일 때). 기본 3페이지. + [JsonPropertyName("multiPassThresholdPages")] + public int MultiPassThresholdPages { get; set; } = 3; + + /// 탭별 마지막 활성 대화 ID. 앱 재시작 시 마지막 대화를 자동 복원합니다. + [JsonPropertyName("lastConversationIds")] + public Dictionary LastConversationIds { get; set; } = new(); + + /// 폴더 데이터 활용 모드. active(적극) | passive(소극) | none(미활용) + [JsonPropertyName("folderDataUsage")] + public string FolderDataUsage { get; set; } = "active"; + + /// + /// 에이전트 의사결정 수준. AI가 중요한 작업 전에 사용자 확인을 요청하는 빈도. + /// minimal: 파일 삭제, 외부 명령만 확인 + /// normal: + 새 파일 생성, 여러 파일 수정, 문서 생성, Git 커밋 + /// detailed: + 모든 파일 수정에 diff 미리보기 + /// + [JsonPropertyName("agentDecisionLevel")] + public string AgentDecisionLevel { get; set; } = "detailed"; + + /// + /// 플랜 모드. 에이전트가 도구 실행 전에 구조화된 실행 계획을 먼저 생성하도록 강제. + /// off: 비활성 (기존 동작) + /// always: 항상 계획 생성 후 사용자 승인 대기 + /// auto: 복잡한 작업 감지 시 자동으로 계획 모드 진입 + /// + [JsonPropertyName("planMode")] + public string PlanMode { get; set; } = "off"; + + /// + /// 프로젝트 규칙 자동 주입 활성화. + /// true: .ax/rules/ 디렉토리의 규칙을 시스템 프롬프트에 자동 포함 + /// false: 규칙 주입 비활성 (project_rules 도구로 수동 읽기는 가능) + /// + [JsonPropertyName("enableProjectRules")] + public bool EnableProjectRules { get; set; } = true; + + // ─── 모델 폴백 ────────────────────────────────────────────────────── + + /// 모델 API 실패 시 순차 시도할 폴백 모델 리스트. (예: "gemini:gemini-2.5-flash") + [JsonPropertyName("fallbackModels")] + public List FallbackModels { get; set; } = new(); + + // ─── v1.4.0 에이전트 설정 ────────────────────────────────────────────── + + /// 서브에이전트 최대 동시 실행 수. 기본 3. + [JsonPropertyName("maxSubAgents")] + public int MaxSubAgents { get; set; } = 3; + + /// PDF 내보내기 기본 경로. 빈 문자열이면 바탕화면. + [JsonPropertyName("pdfExportPath")] + public string PdfExportPath { get; set; } = ""; + + // ─── 보안 감사 로그 ────────────────────────────────────────────────── + + /// 에이전트 도구 호출 감사 로그 활성화. 기본 true. + [JsonPropertyName("enableAuditLog")] + public bool EnableAuditLog { get; set; } = true; + + /// 에이전트 메모리 (지속적 학습) 활성화. 기본 true. + [JsonPropertyName("enableAgentMemory")] + public bool EnableAgentMemory { get; set; } = true; + + /// 폴더별 최대 메모리 항목 수. 기본 100. + [JsonPropertyName("maxMemoryEntries")] + public int MaxMemoryEntries { get; set; } = 100; + + // ─── 이미지 입력 (멀티모달) ────────────────────────────────────────── + + /// 이미지 입력(Ctrl+V 붙여넣기, 파일 첨부) 활성화. 기본 true. + [JsonPropertyName("enableImageInput")] + public bool EnableImageInput { get; set; } = true; + + /// 이미지 최대 크기(KB). 기본 5120 (5MB). + [JsonPropertyName("maxImageSizeKb")] + public int MaxImageSizeKb { get; set; } = 5120; + + // ─── 자동 모델 라우팅 ───────────────────────────────────────────── + + /// 자동 모델 라우팅 활성화. 질문 유형 감지 → 최적 모델 자동 선택. 기본 false (잠금). + [JsonPropertyName("enableAutoRouter")] + public bool EnableAutoRouter { get; set; } = false; + + /// 자동 라우팅 최소 확신도. 이 값 미만이면 기본 모델 유지. 0.5~0.95, 기본 0.7. + [JsonPropertyName("autoRouterConfidence")] + public double AutoRouterConfidence { get; set; } = 0.7; + + /// 모델별 능력 점수 설정. 인텐트 카테고리별 적합도 0.0~1.0. + [JsonPropertyName("modelCapabilities")] + public List ModelCapabilities { get; set; } = new(); + + // ─── MCP ────────────────────────────────────────────────────────── + + /// MCP 서버 설정 목록. + [JsonPropertyName("mcpServers")] + public List McpServers { get; set; } = new(); + + // ─── 시각 효과 ────────────────────────────────────────────────────── + + /// 채팅 입력창 무지개 글로우 효과 활성화. 기본 false (성능 고려). + [JsonPropertyName("enableChatRainbowGlow")] + public bool EnableChatRainbowGlow { get; set; } = false; + + // ─── 알림 ────────────────────────────────────────────────────────── + + /// 에이전트 작업 완료 시 시스템 알림 표시 여부. (Cowork/Code 공통) + [JsonPropertyName("notifyOnComplete")] + public bool NotifyOnComplete { get; set; } = false; + + /// AI 대화창에서 팁 알림 표시 여부. + [JsonPropertyName("showTips")] + public bool ShowTips { get; set; } = false; + + /// 팁 알림 자동 사라짐 시간 (초). 0이면 수동 닫기. + [JsonPropertyName("tipDurationSeconds")] + public int TipDurationSeconds { get; set; } = 5; + + // ─── 개발자 모드 ────────────────────────────────────────────────── + + /// 개발자 모드 활성화. 에이전트 워크플로우 상세 이력을 대화창에 실시간 표시. + [JsonPropertyName("devMode")] + public bool DevMode { get; set; } = false; + + /// 개발자 모드: 도구 실행 전 매번 사용자 승인 대기 (스텝 바이 스텝 디버깅). + [JsonPropertyName("devModeStepApproval")] + public bool DevModeStepApproval { get; set; } = false; + + /// 개발자 모드: 에이전트 실행 시 워크플로우 시각화 창을 자동으로 표시. + [JsonPropertyName("workflowVisualizer")] + public bool WorkflowVisualizer { get; set; } = false; + + /// 개발자 모드: 무료 티어 호출 제한 모드. 활성화하면 LLM 호출 간 딜레이를 추가하여 RPM 한도를 초과하지 않습니다. + [JsonPropertyName("freeTierMode")] + public bool FreeTierMode { get; set; } = false; + + /// 무료 티어 모드: LLM 호출 간 딜레이 (초). 기본 4초 (Gemini 무료 15 RPM ≈ 4초 간격). + [JsonPropertyName("freeTierDelaySeconds")] + public int FreeTierDelaySeconds { get; set; } = 4; + + /// 개발자 모드: 전체 누적 호출 횟수 및 토큰 합계를 상태바에 표시. + [JsonPropertyName("showTotalCallStats")] + public bool ShowTotalCallStats { get; set; } = false; + + /// 차단할 경로 패턴 목록 (에이전트 파일 접근 시 적용). + [JsonPropertyName("blockedPaths")] + public List BlockedPaths { get; set; } = new() + { + "*\\Windows\\*", "*\\Program Files\\*", "*\\Program Files (x86)\\*", + "*\\System32\\*", "*\\AppData\\Local\\*", "*Documents*", + }; + + /// 차단할 파일 확장자 목록. + [JsonPropertyName("blockedExtensions")] + public List BlockedExtensions { get; set; } = new() + { + ".exe", ".dll", ".sys", ".msi", + ".reg", ".vbs", ".com", ".scr", ".pif", + }; + + /// 사용자가 만든 커스텀 프리셋 목록. + [JsonPropertyName("customPresets")] + public List CustomPresets { get; set; } = new(); + + /// 사용자가 만든 커스텀 디자인 무드 목록. + [JsonPropertyName("customMoods")] + public List CustomMoods { get; set; } = new(); + + // ─── 도구 관리 ────────────────────────────────────────────────── + + /// 비활성화된 에이전트 도구 이름 목록. 여기에 포함된 도구는 LLM에 노출되지 않습니다. + [JsonPropertyName("disabledTools")] + public List DisabledTools { get; set; } = new(); + + /// + /// 도구별 실행 권한 오버라이드. 키: 도구 이름, 값: "ask" | "auto" | "deny". + /// 여기에 없는 도구는 전역 FilePermission 설정을 따릅니다. + /// + [JsonPropertyName("toolPermissions")] + public Dictionary ToolPermissions { get; set; } = new(); + + // ─── 에이전트 훅 시스템 ─────────────────────────────────────────── + + /// 에이전트 훅 활성화 여부. 기본 true. + [JsonPropertyName("enableToolHooks")] + public bool EnableToolHooks { get; set; } = true; + + /// 훅 스크립트 실행 타임아웃 (밀리초). 기본 10000 (10초). + [JsonPropertyName("toolHookTimeoutMs")] + public int ToolHookTimeoutMs { get; set; } = 10000; + + /// 등록된 에이전트 훅 목록. + [JsonPropertyName("agentHooks")] + public List AgentHooks { get; set; } = new(); + + // ─── 스킬 시스템 ───────────────────────────────────────────────── + + /// 스킬 시스템 활성화 여부. 기본 true. + [JsonPropertyName("enableSkillSystem")] + public bool EnableSkillSystem { get; set; } = true; + + /// 추가 스킬 폴더 경로. 빈 문자열이면 기본 폴더만 사용. + [JsonPropertyName("skillsFolderPath")] + public string SkillsFolderPath { get; set; } = ""; + + /// 슬래시 명령어 팝업 한 번에 표시할 최대 항목 수 (3~20). 기본 7. + [JsonPropertyName("slashPopupPageSize")] + public int SlashPopupPageSize { get; set; } = 7; + + /// 즐겨찾기 슬래시 명령어 목록 (팝업 상단에 고정 표시). 예: ["/review", "/summary"] + [JsonPropertyName("favoriteSlashCommands")] + public List FavoriteSlashCommands { get; set; } = new(); + + // ─── 드래그 앤 드롭 AI 처리 ────────────────────────────────────── + + /// 파일 드래그 시 AI 액션 팝업 표시 여부. 기본 true. + [JsonPropertyName("enableDragDropAiActions")] + public bool EnableDragDropAiActions { get; set; } = true; + + /// AI 액션 선택 시 자동 전송 여부. 기본 false. + [JsonPropertyName("dragDropAutoSend")] + public bool DragDropAutoSend { get; set; } = false; + + /// Code 탭 전용 설정. + [JsonPropertyName("code")] + public CodeSettings Code { get; set; } = new(); + + // ─── Phase 17-F: 권한 시스템 ──────────────────────────────────────────── + + [JsonPropertyName("permissions")] + public PermissionsConfig Permissions { get; set; } = new(); + + // ─── Phase 17-B: 이벤트 로그 ──────────────────────────────────────────── + + [JsonPropertyName("event_log")] + public EventLogConfig EventLog { get; set; } = new(); + + // ─── Phase 17-A: Reflexion ────────────────────────────────────────────── + + [JsonPropertyName("reflexion")] + public ReflexionConfig Reflexion { get; set; } = new(); + + // ─── Phase 17-C: 확장 훅 ──────────────────────────────────────────────── + + [JsonPropertyName("extended_hooks")] + public ExtendedHooksConfig ExtendedHooks { get; set; } = new(); + + // ─── Phase 17-B: Working Memory(TaskState) ────────────────────────────── + + /// 에이전트 Working Memory 활성화. 대화 압축 시에도 작업 상태 유지. 기본 true. + [JsonPropertyName("enable_task_state")] + public bool EnableTaskState { get; set; } = true; +} + +/// Code 탭 설정 — 사내 개발 환경 연동. +public class CodeSettings +{ + /// 사내 Nexus 저장소 기본 URL. 빈 문자열이면 공용 저장소 사용. + [JsonPropertyName("nexusBaseUrl")] + public string NexusBaseUrl { get; set; } = ""; + + /// NuGet 패키지 소스 URL (.NET). + [JsonPropertyName("nugetSource")] + public string NugetSource { get; set; } = "https://api.nuget.org/v3/index.json"; + + /// PyPI/Conda 패키지 소스 URL (Python). + [JsonPropertyName("pypiSource")] + public string PypiSource { get; set; } = "https://conda.anaconda.org/conda-forge"; + + /// Maven 저장소 URL (Java). + [JsonPropertyName("mavenSource")] + public string MavenSource { get; set; } = "https://repo1.maven.org/maven2"; + + /// npm 레지스트리 URL (JavaScript/Node.js). + [JsonPropertyName("npmSource")] + public string NpmSource { get; set; } = "https://registry.npmjs.org"; + + /// 선호 IDE 실행 경로. 빈 문자열이면 자동 감지. + [JsonPropertyName("preferredIdePath")] + public string PreferredIdePath { get; set; } = ""; + + /// 빌드/테스트 명령 타임아웃 (초). 기본 120초. + [JsonPropertyName("buildTimeout")] + public int BuildTimeout { get; set; } = 120; + + // ─── v1.4.0 코드 인텔리전스 설정 ───────────────────────────────────────── + + /// LSP 코드 인텔리전스 활성화. 기본 true. + [JsonPropertyName("enableLsp")] + public bool EnableLsp { get; set; } = true; + + /// 코드 시맨틱 검색 자동 인덱싱 활성화. 기본 true. + [JsonPropertyName("enableCodeIndex")] + public bool EnableCodeIndex { get; set; } = true; + + /// 인덱싱 최대 파일 크기 (KB). 기본 500. + [JsonPropertyName("codeIndexMaxFileKb")] + public int CodeIndexMaxFileKb { get; set; } = 500; + + /// 파일 수정 시 diff 뷰어 자동 표시. 기본 true. + [JsonPropertyName("enableAutoDiff")] + public bool EnableAutoDiff { get; set; } = true; + + /// AI 코드 리뷰 도구 활성화. 기본 true. + [JsonPropertyName("enableCodeReview")] + public bool EnableCodeReview { get; set; } = true; + + /// 코드 스니펫 즉시 실행 도구 활성화. 기본 true. + [JsonPropertyName("enableSnippetRunner")] + public bool EnableSnippetRunner { get; set; } = true; + + /// + /// [Code] 도구 실행 후 검증 강제. + /// true: 코드 생성/수정 도구(script_create, file_write, file_edit 등) 실행 후 + /// LLM에 검증 전용 호출을 자동 삽입하여 구문 오류, 참조 무결성을 확인합니다. + /// false: LLM이 자율적으로 검증 여부를 결정합니다 (기존 동작). + /// + [JsonPropertyName("enableCodeVerification")] + public bool EnableCodeVerification { get; set; } = false; +} + +/// Phase 17-F: 에이전트 권한 설정. +public class PermissionsConfig +{ + /// 권한 모드. default | acceptEdits | plan | bypassPermissions + [JsonPropertyName("mode")] + public string Mode { get; set; } = "default"; + + /// 허용 규칙 목록. 규칙 매칭 시 확인 없이 자동 허용. + [JsonPropertyName("allow")] + public List AllowRules { get; set; } = new(); + + /// 차단 규칙 목록. 규칙 매칭 시 즉시 차단. + [JsonPropertyName("deny")] + public List DenyRules { get; set; } = new(); +} + +/// 권한 규칙 항목 (설정 저장용). +public class PermissionRuleEntry +{ + [JsonPropertyName("tool")] + public string ToolName { get; set; } = ""; + + [JsonPropertyName("pattern")] + public string? Pattern { get; set; } + + [JsonPropertyName("behavior")] + public string Behavior { get; set; } = "allow"; // allow | deny | ask +} + +/// Phase 17-B: 이벤트 로그 설정. +public class EventLogConfig +{ + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + + [JsonPropertyName("retention_days")] + public int RetentionDays { get; set; } = 30; +} + +/// Phase 17-A: Reflexion(자기성찰) 설정. +public class ReflexionConfig +{ + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + + [JsonPropertyName("max_context_entries")] + public int MaxContextEntries { get; set; } = 5; + + [JsonPropertyName("evaluate_on_success")] + public bool EvaluateOnSuccess { get; set; } = true; +} + +/// Phase 17-C: 확장 훅 설정. +public class ExtendedHooksConfig +{ + [JsonPropertyName("user_prompt_submit")] + public List UserPromptSubmit { get; set; } = new(); + + [JsonPropertyName("pre_compact")] + public List PreCompact { get; set; } = new(); + + [JsonPropertyName("post_compact")] + public List PostCompact { get; set; } = new(); + + [JsonPropertyName("file_changed")] + public List FileChanged { get; set; } = new(); + + [JsonPropertyName("session_start")] + public List SessionStart { get; set; } = new(); + + [JsonPropertyName("session_end")] + public List SessionEnd { get; set; } = new(); + + [JsonPropertyName("permission_request")] + public List PermissionRequest { get; set; } = new(); +} + +/// 확장 훅 항목 설정. +public class ExtendedHookEntryConfig +{ + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("mode")] + public string Mode { get; set; } = "command"; // command | http | prompt | agent + + [JsonPropertyName("matcher")] + public string? Matcher { get; set; } + + [JsonPropertyName("script_path")] + public string? ScriptPath { get; set; } + + [JsonPropertyName("url")] + public string? Url { get; set; } + + [JsonPropertyName("prompt")] + public string? Prompt { get; set; } + + [JsonPropertyName("model")] + public string? Model { get; set; } + + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + + [JsonPropertyName("once")] + public bool Once { get; set; } = false; + + [JsonPropertyName("async")] + public bool IsAsync { get; set; } = false; + + [JsonPropertyName("timeout_seconds")] + public int TimeoutSeconds { get; set; } = 30; + + [JsonPropertyName("status_message")] + public string? StatusMessage { get; set; } + + [JsonPropertyName("watch_paths")] + public List WatchPaths { get; set; } = new(); +} + +/// 사용자 정의 커스텀 프리셋 (settings.json에 저장). +public class CustomPresetEntry +{ + [JsonPropertyName("id")] + public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8]; + + [JsonPropertyName("label")] + public string Label { get; set; } = ""; + + [JsonPropertyName("description")] + public string Description { get; set; } = ""; + + [JsonPropertyName("systemPrompt")] + public string SystemPrompt { get; set; } = ""; + + [JsonPropertyName("color")] + public string Color { get; set; } = "#6366F1"; + + [JsonPropertyName("symbol")] + public string Symbol { get; set; } = "\uE713"; + + /// 프리셋이 속하는 탭. "Chat" | "Cowork" | "Code" + [JsonPropertyName("tab")] + public string Tab { get; set; } = "Chat"; +} + +/// 사용자 정의 디자인 무드 (CSS 템플릿). +public class CustomMoodEntry +{ + [JsonPropertyName("key")] + public string Key { get; set; } = ""; + + [JsonPropertyName("label")] + public string Label { get; set; } = ""; + + [JsonPropertyName("icon")] + public string Icon { get; set; } = "🎯"; + + [JsonPropertyName("description")] + public string Description { get; set; } = ""; + + [JsonPropertyName("css")] + public string Css { get; set; } = ""; +} + +/// 저장된 프롬프트 템플릿. +public class PromptTemplate +{ + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("content")] + public string Content { get; set; } = ""; + + [JsonPropertyName("icon")] + public string Icon { get; set; } = "\uE8BD"; +} + +/// +/// 사내 LLM 등록 모델. 별칭(UI 표시용) + 암호화된 실제 모델명. +/// 향후 멀티 에이전트에서는 특화 업무와 연결됩니다. +/// +public class RegisteredModel +{ + /// UI에 표시할 별칭 (예: "코드 리뷰 전용", "일반 대화") + [JsonPropertyName("alias")] + public string Alias { get; set; } = ""; + + /// 실제 모델명. EncryptionEnabled=true일 때 PortableEncrypt로 암호화된 Base64 값, false일 때 평문. + [JsonPropertyName("encryptedModelName")] + public string EncryptedModelName { get; set; } = ""; + + /// 이 모델이 연결될 서비스 타입. ollama | vllm + [JsonPropertyName("service")] + public string Service { get; set; } = "ollama"; + + /// 이 모델 전용 서버 엔드포인트. 비어있으면 LlmSettings의 기본 엔드포인트 사용. + [JsonPropertyName("endpoint")] + public string Endpoint { get; set; } = ""; + + /// 이 모델 전용 API 키. 비어있으면 LlmSettings의 기본 API 키 사용. + [JsonPropertyName("apiKey")] + public string ApiKey { get; set; } = ""; + + // ── CP4D (IBM Cloud Pak for Data) 인증 ────────────────────────────── + + /// 인증 방식. bearer (기본) | cp4d + [JsonPropertyName("authType")] + public string AuthType { get; set; } = "bearer"; + + /// CP4D 인증 서버 URL (예: https://cpd-host.example.com) + [JsonPropertyName("cp4dUrl")] + public string Cp4dUrl { get; set; } = ""; + + /// CP4D 사용자 이름 + [JsonPropertyName("cp4dUsername")] + public string Cp4dUsername { get; set; } = ""; + + /// CP4D 비밀번호 또는 API 키 (EncryptionEnabled=true 시 암호화 저장) + [JsonPropertyName("cp4dPassword")] + public string Cp4dPassword { get; set; } = ""; +} + +/// +/// 자동 모델 라우팅용 모델 능력 점수. +/// 각 모델의 인텐트 카테고리별 적합도를 0.0~1.0으로 지정합니다. +/// 개발자가 하드코딩 기본값을 수정하려면 ModelRouterService.GetDefaultCapabilities()를 참조하세요. +/// +public class ModelCapability +{ + /// 서비스 타입. ollama | vllm | gemini | claude + [JsonPropertyName("service")] + public string Service { get; set; } = ""; + + /// 모델 식별자. 서비스별 모델 ID (예: "gemini-2.5-flash", "claude-sonnet-4-6") + [JsonPropertyName("model")] + public string Model { get; set; } = ""; + + /// UI 표시용 별칭. + [JsonPropertyName("alias")] + public string Alias { get; set; } = ""; + + /// 인텐트 카테고리별 적합도 점수. key=카테고리명, value=0.0~1.0 + [JsonPropertyName("scores")] + public Dictionary Scores { get; set; } = new(); + + /// 라우팅 후보에 포함 여부. + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; +} + +/// 에이전트 훅 설정 항목. 도구 실행 전/후 사용자 스크립트 실행. +public class AgentHookEntry +{ + /// 훅 이름 (UI 표시용). + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + /// 대상 도구 이름. "*" = 모든 도구, 특정 도구명 = 해당 도구만. + [JsonPropertyName("toolName")] + public string ToolName { get; set; } = "*"; + + /// 실행 타이밍. "pre" = 도구 실행 전, "post" = 도구 실행 후. + [JsonPropertyName("timing")] + public string Timing { get; set; } = "post"; + + /// 실행할 스크립트 경로 (.bat, .ps1, .cmd). + [JsonPropertyName("scriptPath")] + public string ScriptPath { get; set; } = ""; + + /// 스크립트에 전달할 추가 인수 (선택). + [JsonPropertyName("arguments")] + public string Arguments { get; set; } = ""; + + /// 활성화 여부. + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; +} diff --git a/src/AxCopilot/Models/ChatModels.cs b/src/AxCopilot/Models/ChatModels.cs new file mode 100644 index 0000000..a8ff9ae --- /dev/null +++ b/src/AxCopilot/Models/ChatModels.cs @@ -0,0 +1,159 @@ +using System.Text.Json.Serialization; + +namespace AxCopilot.Models; + +/// 대화 주제 카테고리. +public static class ChatCategory +{ + public const string General = "일반"; + public const string Management = "경영"; + public const string HR = "인사"; + public const string Finance = "재무"; + public const string RnD = "연구개발"; + public const string Product = "제품분석"; + public const string Yield = "수율분석"; + public const string MfgTech = "제조기술"; + public const string System = "시스템"; + + public static readonly (string Key, string Label, string Symbol, string Color)[] All = + { + (General, "일반", "\uE8BD", "#6B7280"), // Chat – gray + (Management, "경영", "\uE902", "#8B5CF6"), // Briefcase – purple + (HR, "인사", "\uE716", "#0EA5E9"), // People – sky blue + (Finance, "재무", "\uE8C7", "#D97706"), // Money – amber/orange + (RnD, "연구개발", "\uE9A8", "#3B82F6"), // Research – blue + (Product, "제품분석", "\uE9D9", "#EC4899"), // Design – pink + (Yield, "수율분석", "\uE9F9", "#F59E0B"), // Analytics – amber + (MfgTech, "제조기술", "\uE90F", "#10B981"), // Manufacturing – emerald + (System, "시스템", "\uE770", "#EF4444"), // IT System – red + }; + + public static string GetSymbol(string? category) + { + if (string.IsNullOrEmpty(category)) return "\uE8BD"; + foreach (var (key, _, symbol, _) in All) + if (key == category) return symbol; + return "\uE8BD"; + } + + public static string GetColor(string? category) + { + if (string.IsNullOrEmpty(category)) return "#6B7280"; + foreach (var (key, _, _, color) in All) + if (key == category) return color; + return "#6B7280"; + } +} + +/// 하나의 대화(세션). 복수의 메시지를 포함합니다. +public class ChatConversation +{ + [JsonPropertyName("id")] + public string Id { get; set; } = Guid.NewGuid().ToString("N"); + + [JsonPropertyName("title")] + public string Title { get; set; } = "새 대화"; + + [JsonPropertyName("createdAt")] + public DateTime CreatedAt { get; set; } = DateTime.Now; + + [JsonPropertyName("updatedAt")] + public DateTime UpdatedAt { get; set; } = DateTime.Now; + + [JsonPropertyName("pinned")] + public bool Pinned { get; set; } = false; + + /// 대화가 속한 탭. "Chat" | "Cowork" | "Code". + [JsonPropertyName("tab")] + public string Tab { get; set; } = "Chat"; + + /// 대화 주제. ChatCategory 상수 중 하나. + [JsonPropertyName("category")] + public string Category { get; set; } = ChatCategory.General; + + /// 사용자가 보이지 않는 시스템 명령어 (대화별 커스텀 프롬프트). + [JsonPropertyName("systemCommand")] + public string SystemCommand { get; set; } = ""; + + /// 대화에 연결된 작업 폴더 경로. + [JsonPropertyName("workFolder")] + public string WorkFolder { get; set; } = ""; + + /// 첫 사용자 메시지 요약 (검색용, 최대 100자). 저장 시 자동 갱신. + [JsonPropertyName("preview")] + public string Preview { get; set; } = ""; + + /// 분기 원본 대화 ID. null이면 원본 대화. + [JsonPropertyName("parentId")] + public string? ParentId { get; set; } + + /// 분기 라벨 (예: "대안 A", "접근법 2"). + [JsonPropertyName("branchLabel")] + public string? BranchLabel { get; set; } + + /// 분기 시점의 메시지 인덱스 (parentId의 Messages[index] 이후부터 분기). + [JsonPropertyName("branchAtIndex")] + public int? BranchAtIndex { get; set; } + + // ─── 대화별 설정 (하단 바에서 변경, 대화마다 독립 저장) ─── + + /// 파일 접근 권한. null이면 전역 설정 사용. "Auto" | "Ask" | "Deny" + [JsonPropertyName("permission")] + public string? Permission { get; set; } + + /// 데이터 활용 모드. null이면 전역 설정 사용. "active" | "passive" | "none" + [JsonPropertyName("dataUsage")] + public string? DataUsage { get; set; } + + /// 출력 포맷. null이면 전역 설정 사용. + [JsonPropertyName("outputFormat")] + public string? OutputFormat { get; set; } + + /// 무드/디자인 템플릿. null이면 전역 설정 사용. + [JsonPropertyName("mood")] + public string? Mood { get; set; } + + [JsonPropertyName("messages")] + public List Messages { get; set; } = new(); +} + +/// 대화 내 개별 메시지. +public class ChatMessage +{ + [JsonPropertyName("role")] + public string Role { get; set; } = "user"; // "user" | "assistant" | "system" + + [JsonPropertyName("content")] + public string Content { get; set; } = ""; + + [JsonPropertyName("timestamp")] + public DateTime Timestamp { get; set; } = DateTime.Now; + + /// 피드백 상태. null=없음, "like", "dislike" + [JsonPropertyName("feedback")] + public string? Feedback { get; set; } + + /// 첨부된 파일 경로 목록. + [JsonPropertyName("attachedFiles")] + public List? AttachedFiles { get; set; } + + /// 첨부된 이미지 목록. base64 인코딩된 이미지 데이터. + [JsonPropertyName("images")] + public List? Images { get; set; } +} + +/// 이미지 첨부 데이터. LLM Vision API에 전달되는 base64 인코딩 이미지. +public class ImageAttachment +{ + /// base64 인코딩된 이미지 데이터. + [JsonPropertyName("base64")] + public string Base64 { get; set; } = ""; + + /// MIME 타입. image/png, image/jpeg 등. + [JsonPropertyName("mimeType")] + public string MimeType { get; set; } = "image/png"; + + /// 원본 파일명 또는 설명. + [JsonPropertyName("fileName")] + public string FileName { get; set; } = ""; +} diff --git a/src/AxCopilot/Models/DailyUsageStats.cs b/src/AxCopilot/Models/DailyUsageStats.cs new file mode 100644 index 0000000..6a0540a --- /dev/null +++ b/src/AxCopilot/Models/DailyUsageStats.cs @@ -0,0 +1,42 @@ +using System.Text.Json.Serialization; + +namespace AxCopilot.Models; + +/// +/// 하루치 사용 통계. %APPDATA%\AxCopilot\stats\YYYY-MM-DD.json 에 저장됩니다. +/// +public class DailyUsageStats +{ + [JsonPropertyName("date")] + public string Date { get; set; } = ""; + + /// 런처가 호출된 횟수 (단축키 누름 횟수) + [JsonPropertyName("launcherOpens")] + public int LauncherOpens { get; set; } + + /// 명령어별 실행 횟수. key = 프리픽스 포함 명령 문자열 (예: "/lock", "calc") + [JsonPropertyName("commandUsage")] + public Dictionary CommandUsage { get; set; } = new(); + + /// PC 잠금 해제 후 활성 상태였던 누적 시간 (초) + [JsonPropertyName("activeSeconds")] + public int ActiveSeconds { get; set; } + + // ─── AX Agent 통계 ────────────────────────────────────────────────── + + /// 탭별 대화 횟수. key = "Chat" | "Cowork" | "Code" + [JsonPropertyName("chatCounts")] + public Dictionary ChatCounts { get; set; } = new(); + + /// 일별 총 사용 토큰 수 (Prompt + Completion). + [JsonPropertyName("totalTokens")] + public long TotalTokens { get; set; } + + /// 일별 프롬프트 토큰 수. + [JsonPropertyName("promptTokens")] + public long PromptTokens { get; set; } + + /// 일별 완료 토큰 수. + [JsonPropertyName("completionTokens")] + public long CompletionTokens { get; set; } +} diff --git a/src/AxCopilot/Models/McpSettings.cs b/src/AxCopilot/Models/McpSettings.cs new file mode 100644 index 0000000..563eac9 --- /dev/null +++ b/src/AxCopilot/Models/McpSettings.cs @@ -0,0 +1,46 @@ +using System.Text.Json.Serialization; + +namespace AxCopilot.Models; + +/// MCP 서버 연결 설정. +public class McpServerEntry +{ + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("command")] + public string Command { get; set; } = ""; + + [JsonPropertyName("args")] + public List Args { get; set; } = new(); + + [JsonPropertyName("env")] + public Dictionary Env { get; set; } = new(); + + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + + /// 연결 방식: stdio | sse + [JsonPropertyName("transport")] + public string Transport { get; set; } = "stdio"; + + /// SSE 방식일 때 서버 URL. + [JsonPropertyName("url")] + public string? Url { get; set; } +} + +/// MCP 도구 정의 (서버에서 수신). +public class McpToolDefinition +{ + public string Name { get; set; } = ""; + public string Description { get; set; } = ""; + public string ServerName { get; set; } = ""; + public Dictionary Parameters { get; set; } = new(); +} + +public class McpParameterDef +{ + public string Type { get; set; } = "string"; + public string Description { get; set; } = ""; + public bool Required { get; set; } = false; +} diff --git a/src/AxCopilot/Security/AntiTamper.cs b/src/AxCopilot/Security/AntiTamper.cs new file mode 100644 index 0000000..5b8910a --- /dev/null +++ b/src/AxCopilot/Security/AntiTamper.cs @@ -0,0 +1,155 @@ +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.Reflection; +using System.Runtime.InteropServices; +using AxCopilot.Views; + +namespace AxCopilot.Security; + +/// +/// 런타임 디컴파일/디버깅 방지 모듈. +/// - 디버거 감지 (관리형 + 네이티브) +/// - 알려진 디컴파일러 프로세스 감지 +/// - 어셈블리 무결성 검증 +/// +internal static class AntiTamper +{ + [DllImport("kernel32.dll")] + private static extern bool IsDebuggerPresent(); + + [DllImport("kernel32.dll")] + private static extern bool CheckRemoteDebuggerPresent(IntPtr hProcess, ref bool isDebuggerPresent); + + /// 보안 감지를 건너뛰는 사내 IP 대역 (프리픽스 매칭) + private static readonly string[] TrustedIpPrefixes = + [ + "11.99.", "11.90.", "11.96.", "12.25.", "12.23.", "12.24." + ]; + + /// 알려진 .NET 디컴파일러/리버싱 도구 프로세스명 + private static readonly string[] KnownDebuggers = + [ + "dnspy", "dnspy-x86", "ilspy", "dotpeek", "de4dot", + "ollydbg", "x64dbg", "x32dbg", "windbg", + "ida", "ida64", "ghidra", "cheatengine", + "processhacker", "fiddler", "wireshark" + ]; + + /// + /// 앱 시작 시 호출. 디버거/디컴파일러가 감지되면 경고 후 종료합니다. + /// Release 빌드에서만 활성화됩니다. + /// + public static void Check() + { +#if !DEBUG + // 사내 네트워크(신뢰 IP 대역)에서는 보안 감지 건너뛰기 + if (IsTrustedNetwork()) return; + + if (IsBeingDebugged()) + { + CustomMessageBox.Show( + "보안 정책에 의해 디버거가 연결된 상태에서는 실행할 수 없습니다.", + "AX Copilot — 보안", + System.Windows.MessageBoxButton.OK, + System.Windows.MessageBoxImage.Warning); + Environment.Exit(1); + } + + if (IsDecompilerRunning()) + { + CustomMessageBox.Show( + "보안 정책에 의해 리버싱 도구가 실행 중인 환경에서는 실행할 수 없습니다.", + "AX Copilot — 보안", + System.Windows.MessageBoxButton.OK, + System.Windows.MessageBoxImage.Warning); + Environment.Exit(1); + } +#endif + } + + /// 관리형 + 네이티브 디버거 감지 + private static bool IsBeingDebugged() + { + // 1. 관리형 디버거 (.NET Attach) + if (Debugger.IsAttached) return true; + + // 2. 네이티브 디버거 (OllyDbg, x64dbg 등) + try { if (IsDebuggerPresent()) return true; } catch (Exception) { } + + // 3. 원격 디버거 + try + { + bool remoteDebugger = false; + CheckRemoteDebuggerPresent(Process.GetCurrentProcess().Handle, ref remoteDebugger); + if (remoteDebugger) return true; + } + catch (Exception) { } + + return false; + } + + /// 알려진 디컴파일러/리버싱 프로세스가 실행 중인지 확인 + private static bool IsDecompilerRunning() + { + try + { + var procs = Process.GetProcesses(); + foreach (var proc in procs) + { + try + { + var name = proc.ProcessName.ToLowerInvariant(); + foreach (var debugger in KnownDebuggers) + { + if (name.Contains(debugger)) + return true; + } + } + catch (Exception) { /* 접근 권한 없는 프로세스 무시 */ } + } + } + catch (Exception) { } + return false; + } + + /// 현재 PC의 IP가 사내 신뢰 대역에 포함되는지 확인 + private static bool IsTrustedNetwork() + { + try + { + var addresses = Dns.GetHostAddresses(Dns.GetHostName()); + foreach (var addr in addresses) + { + if (addr.AddressFamily != AddressFamily.InterNetwork) continue; + var ip = addr.ToString(); + foreach (var prefix in TrustedIpPrefixes) + { + if (ip.StartsWith(prefix)) + return true; + } + } + } + catch (Exception) { /* 네트워크 조회 실패 시 신뢰하지 않음 */ } + return false; + } + + /// + /// 어셈블리 강력한 이름(Strong Name) 검증. + /// 서명된 어셈블리가 변조되었는지 간단히 확인합니다. + /// + public static bool VerifyAssemblyIntegrity() + { + try + { + var asm = Assembly.GetExecutingAssembly(); + var name = asm.GetName(); + // 버전이 변조되지 않았는지 기본 확인 + return name.Version != null && name.Name == "AxCopilot"; + } + catch (Exception) + { + return false; + } + } +} diff --git a/src/AxCopilot/Security/ObfuscationAttributes.cs b/src/AxCopilot/Security/ObfuscationAttributes.cs new file mode 100644 index 0000000..df66a12 --- /dev/null +++ b/src/AxCopilot/Security/ObfuscationAttributes.cs @@ -0,0 +1,10 @@ +using System.Reflection; + +// ─── 어셈블리 레벨 난독화 지시 ───────────────────────────────────────────── +// Obfuscar, ConfuserEx, Dotfuscator 등의 도구가 이 속성을 읽어 난독화를 적용합니다. +// 도구 없이도 빌드에 영향 없음. + +// 전체 어셈블리에 대해 난독화 적용 표시 +[assembly: Obfuscation(Feature = "renaming", Exclude = false)] +// XAML 바인딩에 사용되는 public 프로퍼티는 난독화에서 제외해야 합니다. +// 이는 각 ViewModel 클래스에서 [Obfuscation(Exclude = true)]로 개별 지정합니다. diff --git a/src/AxCopilot/Services/Agent/AgentEventLog.cs b/src/AxCopilot/Services/Agent/AgentEventLog.cs new file mode 100644 index 0000000..cdb63e4 --- /dev/null +++ b/src/AxCopilot/Services/Agent/AgentEventLog.cs @@ -0,0 +1,133 @@ +using System.IO; +using System.Runtime.CompilerServices; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace AxCopilot.Services.Agent; + +public enum AgentEventLogType +{ + SessionStart, SessionEnd, + UserMessage, AssistantMessage, + ToolRequest, ToolResult, + HookFired, HookResult, + SkillActivated, SkillCompleted, + CompactionTriggered, CompactionCompleted, + SubagentSpawned, SubagentCompleted, + ReflexionSaved, + Error +} + +public record AgentEventRecord +{ + [JsonPropertyName("seq")] + public long SeqNo { get; init; } + + [JsonPropertyName("id")] + public string EventId { get; init; } = Guid.NewGuid().ToString("N")[..12]; + + [JsonPropertyName("parent_id")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public string? ParentEventId { get; init; } + + [JsonPropertyName("session_id")] + public string SessionId { get; init; } = ""; + + [JsonPropertyName("type")] + public AgentEventLogType Type { get; init; } + + [JsonPropertyName("ts")] + public DateTime Timestamp { get; init; } = DateTime.UtcNow; + + [JsonPropertyName("payload")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public string? Payload { get; init; } +} + +/// +/// JSONL 기반 에이전트 이벤트 로그. +/// 저장: %APPDATA%\AxCopilot\sessions\{sessionId}\events.jsonl +/// +public class AgentEventLog : IDisposable +{ + private static readonly string BaseDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "sessions"); + + private static readonly JsonSerializerOptions _json = new() + { + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + + private readonly string _filePath; + private readonly string _sessionId; + private long _seq; + private readonly SemaphoreSlim _lock = new(1, 1); + + public AgentEventLog(string sessionId) + { + _sessionId = sessionId; + var dir = Path.Combine(BaseDir, sessionId); + Directory.CreateDirectory(dir); + _filePath = Path.Combine(dir, "events.jsonl"); + } + + public async Task AppendAsync(AgentEventLogType type, string? payload = null, string? parentId = null) + { + var record = new AgentEventRecord + { + SeqNo = System.Threading.Interlocked.Increment(ref _seq), + SessionId = _sessionId, + Type = type, + ParentEventId = parentId, + Payload = payload + }; + + await _lock.WaitAsync(); + try + { + var line = JsonSerializer.Serialize(record, _json); + await File.AppendAllTextAsync(_filePath, line + "\n"); + } + finally { _lock.Release(); } + } + + public async IAsyncEnumerable ReadAllAsync([EnumeratorCancellation] CancellationToken ct = default) + { + if (!File.Exists(_filePath)) yield break; + var lines = await File.ReadAllLinesAsync(_filePath, ct); + foreach (var line in lines) + { + if (string.IsNullOrWhiteSpace(line)) continue; + AgentEventRecord? record = null; + try { record = JsonSerializer.Deserialize(line, _json); } + catch (Exception) { } + if (record != null) yield return record; + } + } + + public async IAsyncEnumerable ReadFromAsync(long fromSeq, [EnumeratorCancellation] CancellationToken ct = default) + { + await foreach (var r in ReadAllAsync(ct)) + if (r.SeqNo >= fromSeq) yield return r; + } + + public void Dispose() => _lock.Dispose(); + + /// 보관 기간 초과 세션 정리. + public static void CleanOldSessions(int retentionDays) + { + if (!Directory.Exists(BaseDir)) return; + var cutoff = DateTime.UtcNow.AddDays(-retentionDays); + foreach (var dir in Directory.GetDirectories(BaseDir)) + { + try + { + var info = new DirectoryInfo(dir); + if (info.LastWriteTimeUtc < cutoff) + Directory.Delete(dir, true); + } + catch (Exception) { } + } + } +} diff --git a/src/AxCopilot/Services/Agent/AgentHookRunner.cs b/src/AxCopilot/Services/Agent/AgentHookRunner.cs new file mode 100644 index 0000000..30f9316 --- /dev/null +++ b/src/AxCopilot/Services/Agent/AgentHookRunner.cs @@ -0,0 +1,179 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.Json; +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent; + +/// +/// 에이전트 도구 실행 전/후에 사용자 정의 스크립트(bat/ps1/cmd)를 실행하는 훅 러너. +/// +/// 환경 변수로 도구 정보를 전달: +/// AX_TOOL_NAME — 도구 이름 +/// AX_TOOL_TIMING — pre | post +/// AX_TOOL_INPUT — 도구 입력 JSON (최대 4KB) +/// AX_TOOL_OUTPUT — 도구 출력 (post만, 최대 4KB) +/// AX_TOOL_SUCCESS — true | false (post만) +/// AX_WORK_FOLDER — 작업 폴더 경로 +/// +/// +public static class AgentHookRunner +{ + private const int MaxEnvValueLength = 4096; + + /// + /// 지정된 타이밍(pre/post)에 해당하는 훅을 모두 실행합니다. + /// + /// 설정에 등록된 전체 훅 목록 + /// 실행된 도구 이름 + /// "pre" 또는 "post" + /// 도구 입력 JSON + /// 도구 출력 (post만) + /// 도구 실행 성공 여부 (post만) + /// 작업 폴더 경로 + /// 스크립트 타임아웃 (밀리초) + /// 취소 토큰 + /// 각 훅의 실행 결과 (이름, 성공여부, 출력/에러) + public static async Task> RunAsync( + IReadOnlyList hooks, + string toolName, + string timing, + string? toolInput = null, + string? toolOutput = null, + bool success = true, + string? workFolder = null, + int timeoutMs = 10000, + CancellationToken ct = default) + { + var results = new List(); + if (hooks == null || hooks.Count == 0) return results; + + foreach (var hook in hooks) + { + if (!hook.Enabled) continue; + if (!string.Equals(hook.Timing, timing, StringComparison.OrdinalIgnoreCase)) continue; + + // 도구 이름 매칭: "*" = 전체, 그 외 정확 매칭 (대소문자 무시) + if (hook.ToolName != "*" && + !string.Equals(hook.ToolName, toolName, StringComparison.OrdinalIgnoreCase)) + continue; + + var result = await ExecuteHookAsync(hook, toolName, timing, toolInput, toolOutput, success, workFolder, timeoutMs, ct); + results.Add(result); + } + + return results; + } + + private static async Task ExecuteHookAsync( + AgentHookEntry hook, + string toolName, + string timing, + string? toolInput, + string? toolOutput, + bool success, + string? workFolder, + int timeoutMs, + CancellationToken ct) + { + try + { + if (string.IsNullOrWhiteSpace(hook.ScriptPath)) + return new HookExecutionResult(hook.Name, false, "스크립트 경로가 비어 있습니다."); + + var scriptPath = Environment.ExpandEnvironmentVariables(hook.ScriptPath); + if (!File.Exists(scriptPath)) + return new HookExecutionResult(hook.Name, false, $"스크립트를 찾을 수 없습니다: {scriptPath}"); + + var ext = Path.GetExtension(scriptPath).ToLowerInvariant(); + string fileName; + string arguments; + + switch (ext) + { + case ".ps1": + fileName = "powershell.exe"; + arguments = $"-NoProfile -ExecutionPolicy Bypass -File \"{scriptPath}\""; + break; + case ".bat": + case ".cmd": + fileName = "cmd.exe"; + arguments = $"/c \"{scriptPath}\""; + break; + default: + return new HookExecutionResult(hook.Name, false, $"지원하지 않는 스크립트 확장자: {ext} (.bat/.cmd/.ps1만 허용)"); + } + + // 사용자 정의 추가 인수 + if (!string.IsNullOrWhiteSpace(hook.Arguments)) + arguments += $" {hook.Arguments}"; + + var psi = new ProcessStartInfo + { + FileName = fileName, + Arguments = arguments, + WorkingDirectory = workFolder ?? Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + }; + + // 환경 변수로 도구 정보 전달 + psi.EnvironmentVariables["AX_TOOL_NAME"] = toolName; + psi.EnvironmentVariables["AX_TOOL_TIMING"] = timing; + psi.EnvironmentVariables["AX_TOOL_INPUT"] = Truncate(toolInput, MaxEnvValueLength); + psi.EnvironmentVariables["AX_WORK_FOLDER"] = workFolder ?? ""; + + if (string.Equals(timing, "post", StringComparison.OrdinalIgnoreCase)) + { + psi.EnvironmentVariables["AX_TOOL_OUTPUT"] = Truncate(toolOutput, MaxEnvValueLength); + psi.EnvironmentVariables["AX_TOOL_SUCCESS"] = success ? "true" : "false"; + } + + using var process = new Process { StartInfo = psi }; + var stdOut = new StringBuilder(); + var stdErr = new StringBuilder(); + + process.OutputDataReceived += (_, e) => { if (e.Data != null) stdOut.AppendLine(e.Data); }; + process.ErrorDataReceived += (_, e) => { if (e.Data != null) stdErr.AppendLine(e.Data); }; + + process.Start(); + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(timeoutMs); + + try + { + await process.WaitForExitAsync(cts.Token); + } + catch (OperationCanceledException) + { + try { process.Kill(true); } catch (Exception) { } + return new HookExecutionResult(hook.Name, false, $"타임아웃 ({timeoutMs}ms 초과)"); + } + + var exitCode = process.ExitCode; + var output = stdOut.ToString().TrimEnd(); + var error = stdErr.ToString().TrimEnd(); + + if (exitCode != 0) + return new HookExecutionResult(hook.Name, false, $"종료 코드 {exitCode}: {(string.IsNullOrEmpty(error) ? output : error)}"); + + return new HookExecutionResult(hook.Name, true, string.IsNullOrEmpty(output) ? "(정상 완료)" : output); + } + catch (Exception ex) + { + return new HookExecutionResult(hook.Name, false, $"훅 실행 예외: {ex.Message}"); + } + } + + private static string Truncate(string? value, int maxLen) + => string.IsNullOrEmpty(value) ? "" : (value.Length <= maxLen ? value : value[..maxLen]); +} + +/// 훅 실행 결과. +public record HookExecutionResult(string HookName, bool Success, string Output); diff --git a/src/AxCopilot/Services/Agent/AgentLoopService.cs b/src/AxCopilot/Services/Agent/AgentLoopService.cs new file mode 100644 index 0000000..739c646 --- /dev/null +++ b/src/AxCopilot/Services/Agent/AgentLoopService.cs @@ -0,0 +1,1823 @@ +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Text.Json; +using AxCopilot.Models; +using AxCopilot.Services; + +namespace AxCopilot.Services.Agent; + +/// +/// 에이전트 루프 엔진: LLM과 대화하며 도구/스킬을 실행하는 반복 루프. +/// 계획 → 도구 실행 → 관찰 → 재평가 패턴을 구현합니다. +/// +public class AgentLoopService +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + // ─── Phase 33-A: 매직 넘버 상수화 ─────────────────────────────────── + private static class Defaults + { + // 반복 제어 + public const int MaxIterations = 25; + public const int MaxRetryOnError = 3; + public const int MaxTestFixIterations = 5; + public const int MaxPlanRegenerationRetries = 3; + public const int MaxToolExecutionRetries = 2; + public const int MaxPostDocPlanRetries = 2; + public const int FreeTierDelaySeconds = 4; + + // 컨텍스트 관리 + public const int AutoCompactThresholdPercent = 80; + public const double ContextCompressionTargetRatio = 0.6; + public const int ToolCallThresholdForExpansion = 15; + + // 텍스트 절단 길이 + public const int QueryNameMaxLength = 40; + public const int QueryTitleMaxLength = 60; + public const int ThinkingTextMaxLength = 150; + public const int VerificationSummaryMaxLength = 300; + public const int LogSummaryMaxLength = 200; + public const int ToolResultTruncateLength = 4000; + } + + private readonly LlmService _llm; + private readonly ToolRegistry _tools; + private readonly SettingsService _settings; + private readonly SessionManager? _sessionManager; // Phase 33-D: DI 기반 + + /// 에이전트 이벤트 스트림 (UI 바인딩용). + public ObservableCollection Events { get; } = new(); + + /// 현재 루프 실행 중 여부. + public bool IsRunning { get; private set; } + + /// 이벤트 발생 시 UI 스레드에서 호출할 디스패처. + public Action? Dispatcher { get; set; } + + /// Ask 모드 권한 확인 콜백. (toolName, filePath) → bool + public Func>? AskPermissionCallback { get; set; } + + /// 에이전트 질문 콜백 (UserAskTool 전용). (질문, 선택지, 기본값) → 응답. + public Func, string, Task>? UserAskCallback { get; set; } + + /// 현재 활성 탭 (파일명 타임스탬프 등 탭별 동작 제어용). + public string ActiveTab { get; set; } = "Chat"; + + /// 현재 대화 ID (감사 로그 기록용). + private string _conversationId = ""; + + /// 문서 생성 폴백 재시도 여부 (루프당 1회만). + private bool _docFallbackAttempted; + + /// 현재 세션 ID (AgentEventLog 기록용). + private string _sessionId = ""; + + /// 현재 세션 이벤트 로그 (비동기 JSONL 기록). + private AgentEventLog? _eventLog; + + /// 위임 에이전트 도구 참조 (서브에이전트 실행기 주입용). + private DelegateAgentTool? _delegateAgentTool; + + /// 일시정지 제어용 세마포어. 1이면 진행, 0이면 대기. + private readonly SemaphoreSlim _pauseSemaphore = new(1, 1); + + /// 현재 일시정지 상태 여부. + public bool IsPaused { get; private set; } + + /// + /// 사용자 의사결정 콜백. 계획 제시 후 사용자 승인을 대기합니다. + /// (planSummary, options) → 선택된 옵션 텍스트. null이면 승인(계속 진행). + /// + public Func, Task>? UserDecisionCallback { get; set; } + + /// 에이전트 이벤트 발생 시 호출되는 콜백 (UI 표시용). + public event Action? EventOccurred; + + public AgentLoopService(LlmService llm, ToolRegistry tools, SettingsService settings, + SessionManager? sessionManager = null) + { + _llm = llm; + _tools = tools; + _settings = settings; + _sessionManager = sessionManager; + + // DelegateAgentTool에 서브에이전트 실행기 주입 + _delegateAgentTool = tools.Get("delegate") as DelegateAgentTool; + _delegateAgentTool?.SetSubAgentRunner(RunSubAgentAsync); + } + + /// + /// 에이전트 루프를 일시정지합니다. + /// 다음 반복 시작 시점에서 대기 상태가 됩니다. + /// + public async Task PauseAsync() + { + if (IsPaused || !IsRunning) return; + // 세마포어를 획득하여 루프가 다음 반복에서 대기하게 함 + await _pauseSemaphore.WaitAsync().ConfigureAwait(false); + IsPaused = true; + EmitEvent(AgentEventType.Paused, "", "에이전트가 일시정지되었습니다"); + } + + /// + /// 일시정지된 에이전트 루프를 재개합니다. + /// + public void Resume() + { + if (!IsPaused) return; + IsPaused = false; + try + { + _pauseSemaphore.Release(); + } + catch (SemaphoreFullException) + { + // 이미 릴리즈된 상태 — 무시 + } + EmitEvent(AgentEventType.Resumed, "", "에이전트가 재개되었습니다"); + } + + /// + /// 에이전트 루프를 실행합니다. + /// 사용자 메시지를 LLM에 전달하고, LLM이 도구를 호출하면 실행 후 결과를 다시 LLM에 피드백합니다. + /// LLM이 더 이상 도구를 호출하지 않으면 (텍스트만 반환) 루프를 종료합니다. + /// + /// 대화 메시지 목록 (시스템 프롬프트 포함) + /// 취소 토큰 + /// 최종 텍스트 응답 + public async Task RunAsync(List messages, CancellationToken ct = default) + { + if (IsRunning) throw new InvalidOperationException("에이전트가 이미 실행 중입니다."); + + IsRunning = true; + _docFallbackAttempted = false; + _sessionId = Guid.NewGuid().ToString("N")[..12]; + _eventLog = null; + // Phase 33-F: ActiveTab 스냅샷 — 루프 중 외부 변경에 의한 레이스 컨디션 방지 + var activeTabSnapshot = ActiveTab ?? "Chat"; + var llm = _settings.Settings.Llm; + if (llm.EventLog?.Enabled ?? true) + { + _eventLog = new AgentEventLog(_sessionId); + _ = _eventLog.AppendAsync(AgentEventLogType.SessionStart, + JsonSerializer.Serialize(new { tab = activeTabSnapshot, model = llm.Model ?? "" })); + } + var baseMax = llm.MaxAgentIterations > 0 ? llm.MaxAgentIterations : Defaults.MaxIterations; + var maxIterations = baseMax; + var maxRetry = llm.MaxRetryOnError > 0 ? llm.MaxRetryOnError : Defaults.MaxRetryOnError; + var iteration = 0; + + // 사용자 원본 요청 캡처 (문서 생성 폴백 판단용) + var userQuery = messages.LastOrDefault(m => m.Role == "user")?.Content ?? ""; + var consecutiveErrors = 0; // Self-Reflection: 연속 오류 카운터 + var totalToolCalls = 0; // 복잡도 추정용 + + // 통계 수집 + var statsStart = DateTime.Now; + var statsSuccessCount = 0; + var statsFailCount = 0; + var statsInputTokens = 0; + var statsOutputTokens = 0; + var statsUsedTools = new List(); + + // Task Decomposition: 계획 단계 추적 + var planSteps = new List(); + var currentStep = 0; + var planExtracted = false; + var planExecutionRetry = 0; // 계획 승인 후 도구 미호출 재시도 카운터 + var documentPlanCalled = false; // document_plan 도구 호출 여부 + var postDocumentPlanRetry = 0; // document_plan 후 terminal 도구 미호출 재시도 카운터 + string? documentPlanPath = null; // document_plan이 제안한 파일명 + string? documentPlanTitle = null; // document_plan이 제안한 문서 제목 + string? documentPlanScaffold = null; // document_plan이 생성한 body 골격 HTML + + // 플랜 모드 설정 + var planMode = llm.PlanMode ?? "off"; // off | always | auto + + var context = BuildContext(activeTabSnapshot); + + try + { + // ── 플랜 모드 "always": 첫 번째 호출은 계획만 생성 (도구 없이) ── + if (planMode == "always") + { + iteration++; + EmitEvent(AgentEventType.Thinking, "", "실행 계획 생성 중..."); + + // 계획 생성 전용 시스템 지시를 임시 추가 + var planInstruction = new ChatMessage + { + Role = "user", + Content = "[System] 도구를 호출하지 마세요. 먼저 실행 계획을 번호 매긴 단계로 작성하세요. " + + "각 단계에 사용할 도구와 대상을 구체적으로 명시하세요. " + + "계획만 제시하고 실행은 하지 마세요." + }; + messages.Add(planInstruction); + + // 도구 없이 텍스트만 요청 + string planText; + try + { + planText = await _llm.SendAsync(messages, ct); + } + catch (Exception ex) + { + EmitEvent(AgentEventType.Error, "", $"LLM 오류: {ex.Message}"); + return $"⚠ LLM 오류: {ex.Message}"; + } + + // 계획 지시 메시지 제거 (실제 실행 시 혼란 방지) + messages.Remove(planInstruction); + + // 계획 추출 + planSteps = TaskDecomposer.ExtractSteps(planText); + planExtracted = true; + + if (planSteps.Count > 0) + { + EmitEvent(AgentEventType.Planning, "", $"작업 계획: {planSteps.Count}단계", + steps: planSteps); + + // 사용자 승인 대기 + if (UserDecisionCallback != null) + { + var decision = await UserDecisionCallback( + planText, + new List { "승인", "수정 요청", "취소" }); + + if (decision == "취소") + { + EmitEvent(AgentEventType.Complete, "", "사용자가 작업을 취소했습니다"); + return "작업이 취소되었습니다."; + } + else if (decision != null && decision != "승인") + { + // 수정 요청 — 피드백으로 계획 재생성 + messages.Add(new ChatMessage { Role = "assistant", Content = planText }); + messages.Add(new ChatMessage { Role = "user", Content = decision + "\n위 피드백을 반영하여 실행 계획을 다시 작성하세요." }); + + // 재생성 루프 + for (int retry = 0; retry < Defaults.MaxPlanRegenerationRetries; retry++) + { + try { planText = await _llm.SendAsync(messages, ct); } + catch (Exception ex) { LogService.Warn($"[AgentLoop] 계획 재생성 실패: {ex.Message}"); break; } + + planSteps = TaskDecomposer.ExtractSteps(planText); + if (planSteps.Count > 0) + { + EmitEvent(AgentEventType.Planning, "", $"수정된 계획: {planSteps.Count}단계", + steps: planSteps); + } + + decision = await UserDecisionCallback( + planText, + new List { "승인", "수정 요청", "취소" }); + + if (decision == "취소") + { + EmitEvent(AgentEventType.Complete, "", "사용자가 작업을 취소했습니다"); + return "작업이 취소되었습니다."; + } + if (decision == null || decision == "승인") break; + + // 재수정 + messages.Add(new ChatMessage { Role = "assistant", Content = planText }); + messages.Add(new ChatMessage { Role = "user", Content = decision + "\n위 피드백을 반영하여 실행 계획을 다시 작성하세요." }); + } + } + } + + + + // 승인된 계획을 컨텍스트에 포함하여 실행 유도 + // 도구 호출을 명확히 강제하여 텍스트 응답만 반환하는 경우 방지 + messages.Add(new ChatMessage { Role = "assistant", Content = planText }); + + // 1차 계획의 단계들을 document_plan의 sections_hint로 전달하도록 지시 + // → BuildSections() 하드코딩 대신 LLM이 잡은 섹션 구조가 문서에 반영됨 + var planSectionsHint = planSteps.Count > 0 + ? string.Join(", ", planSteps) + : ""; + var sectionInstruction = !string.IsNullOrEmpty(planSectionsHint) + ? $"document_plan 도구를 호출할 때 sections_hint 파라미터에 위 계획의 섹션/단계를 그대로 넣으세요: \"{planSectionsHint}\"" + : ""; + + messages.Add(new ChatMessage { Role = "user", + Content = "계획이 승인되었습니다. 지금 즉시 1단계부터 도구(tool)를 호출하여 실행을 시작하세요. " + + "텍스트로 설명하지 말고 반드시 도구를 호출하세요." + + (string.IsNullOrEmpty(sectionInstruction) ? "" : "\n" + sectionInstruction) }); + } + else + { + // 계획 추출 실패 — assistant 응답으로 추가하고 일반 모드로 진행 + if (!string.IsNullOrEmpty(planText)) + messages.Add(new ChatMessage { Role = "assistant", Content = planText }); + } + } + + while (iteration < maxIterations && !ct.IsCancellationRequested) + { + iteration++; + + // ── 일시정지 체크포인트: Pause() 호출 시 여기서 대기 ── + await _pauseSemaphore.WaitAsync(ct).ConfigureAwait(false); + try + { + // 즉시 릴리즈 — 다음 반복에서도 다시 획득할 수 있도록 + _pauseSemaphore.Release(); + } + catch (SemaphoreFullException) + { + // PauseAsync가 아직 세마포어를 보유 중이 아닌 경우 — 무시 + } + + // Phase 33-C: 통합 컨텍스트 관리 — ContextCondenser + AutoCompactMonitor 병합 + // 1단계: 기본 압축 (MaxContextTokens 초과 시) + // 2단계: 사용량 임계치 초과 시 적극적 압축 (목표 60%) + if (llm.MaxContextTokens > 0) + { + var condensed = await ContextCondenser.CondenseIfNeededAsync( + messages, _llm, llm.MaxContextTokens, ct); + if (condensed) + EmitEvent(AgentEventType.Thinking, "", "컨텍스트 압축 완료 — 입력 토큰을 절감했습니다"); + + // 임계치 기반 적극적 압축 (이전 LLM 호출의 토큰 사용량 기준) + if (!condensed && _llm.LastTokenUsage != null) + { + var threshold = llm.AutoCompactThreshold > 0 + ? llm.AutoCompactThreshold + : Defaults.AutoCompactThresholdPercent; + var monitor = new AutoCompactMonitor(threshold); + if (monitor.ShouldCompact(_llm.LastTokenUsage.PromptTokens, llm.MaxContextTokens)) + { + var usagePct = AutoCompactMonitor.CalculateUsagePercent( + _llm.LastTokenUsage.PromptTokens, llm.MaxContextTokens); + EmitEvent(AgentEventType.Thinking, "", + $"⚠ 컨텍스트 사용량 {usagePct}% — 적극적 컴팩션 실행"); + var targetTokens = (int)(llm.MaxContextTokens * Defaults.ContextCompressionTargetRatio); + var compacted = await ContextCondenser.CondenseIfNeededAsync( + messages, _llm, targetTokens, ct); + if (compacted) + EmitEvent(AgentEventType.Thinking, "", "적극적 컴팩션 완료"); + } + } + } + + EmitEvent(AgentEventType.Thinking, "", $"LLM에 요청 중... (반복 {iteration}/{maxIterations})"); + + // 무료 티어 모드: LLM 호출 간 딜레이 (RPM 한도 초과 방지) + if (llm.FreeTierMode && iteration > 1) + { + var delaySec = llm.FreeTierDelaySeconds > 0 ? llm.FreeTierDelaySeconds : Defaults.FreeTierDelaySeconds; + EmitEvent(AgentEventType.Thinking, "", $"무료 티어 모드: {delaySec}초 대기 중..."); + await Task.Delay(delaySec * 1000, ct); + } + + // LLM에 도구 정의와 함께 요청 + List blocks; + try + { + // Phase 29-B: ToolEnvironmentContext를 사용하여 IConditionalTool 필터링 적용 + var toolEnv = new ToolEnvironmentContext + { + Settings = _settings.Settings, + ActiveTab = activeTabSnapshot, + WorkFolder = llm.WorkFolder, + HasGitRepo = !string.IsNullOrEmpty(llm.WorkFolder) + && System.IO.Directory.Exists(System.IO.Path.Combine(llm.WorkFolder, ".git")), + AiEnabled = _settings.Settings.AiEnabled, + InternalModeEnabled = _settings.Settings.InternalModeEnabled, + }; + var activeTools = _tools.GetActiveTools(llm.DisabledTools, toolEnv); + blocks = await _llm.SendWithToolsAsync(messages, activeTools, ct); + } + catch (NotSupportedException) + { + // Function Calling 미지원 서비스 → 일반 텍스트 응답으로 대체 + var textResp = await _llm.SendAsync(messages, ct); + return textResp; + } + catch (ToolCallNotSupportedException ex) + { + // 서버가 도구 호출을 400으로 거부 → 도구 없이 일반 응답으로 폴백 + LogService.Warn($"[AgentLoop] 도구 호출 거부됨, 일반 응답으로 폴백: {ex.Message}"); + EmitEvent(AgentEventType.Thinking, "", "도구 호출이 거부되어 일반 응답으로 전환합니다…"); + + // document_plan이 완료됐지만 html_create 미실행 → 조기 종료 전에 앱이 직접 생성 + if (documentPlanCalled && !string.IsNullOrEmpty(documentPlanScaffold) && !_docFallbackAttempted) + { + _docFallbackAttempted = true; + EmitEvent(AgentEventType.Thinking, "", "앱에서 직접 문서를 생성합니다..."); + try + { + var bodyRequest = new List + { + new() { Role = "user", + Content = $"아래 HTML 골격의 각 h2 섹션에 주석의 핵심 항목을 참고하여 " + + $"풍부한 내용을 채워 완전한 HTML body를 출력하세요. " + + $"도구를 호출하지 말고 HTML 코드만 출력하세요.\n\n" + + $"주제: {documentPlanTitle ?? userQuery}\n\n" + + $"골격:\n{documentPlanScaffold}" } + }; + var bodyText = await _llm.SendAsync(bodyRequest, ct); + if (!string.IsNullOrEmpty(bodyText)) + { + var htmlTool = _tools.Get("html_create"); + if (htmlTool != null) + { + var fallbackPath = documentPlanPath; + if (string.IsNullOrEmpty(fallbackPath)) + { + var safe = userQuery.Length > 40 ? userQuery[..40] : userQuery; + foreach (var c in System.IO.Path.GetInvalidFileNameChars()) + safe = safe.Replace(c, '_'); + fallbackPath = $"{safe.Trim()}.html"; + } + var argsJson = System.Text.Json.JsonSerializer.SerializeToElement(new + { + path = fallbackPath, + title = documentPlanTitle ?? userQuery, + body = bodyText, + toc = true, + numbered = true, + mood = "professional", + cover = new { title = documentPlanTitle ?? userQuery, author = "AX Copilot Agent" } + }); + var htmlResult = await htmlTool.ExecuteAsync(argsJson, context, ct); + if (htmlResult.Success) + { + EmitEvent(AgentEventType.ToolResult, "html_create", + $"✅ 보고서 파일 생성: {System.IO.Path.GetFileName(htmlResult.FilePath ?? "")}", + filePath: htmlResult.FilePath); + EmitEvent(AgentEventType.Complete, "", "에이전트 작업 완료"); + return htmlResult.Output; + } + } + } + } + catch (Exception docEx) + { + LogService.Warn($"[AgentLoop] document_plan 직접 생성 실패: {docEx.Message}"); + } + } + + try + { + var textResp = await _llm.SendAsync(messages, ct); + return textResp; + } + catch (Exception fallbackEx) + { + EmitEvent(AgentEventType.Error, "", $"LLM 오류: {fallbackEx.Message}"); + return $"⚠ LLM 오류 (도구 호출 실패 후 폴백도 실패): {fallbackEx.Message}"; + } + } + catch (Exception ex) + { + EmitEvent(AgentEventType.Error, "", $"LLM 오류: {ex.Message}"); + return $"⚠ LLM 오류: {ex.Message}"; + } + + // 응답에서 텍스트와 도구 호출 분리 + var textParts = new List(); + var toolCalls = new List(); + + foreach (var block in blocks) + { + if (block.Type == "text" && !string.IsNullOrWhiteSpace(block.Text)) + textParts.Add(block.Text); + else if (block.Type == "tool_use") + toolCalls.Add(block); + } + + // 텍스트 부분 + var textResponse = string.Join("\n", textParts); + + // Task Decomposition: 첫 번째 텍스트 응답에서 계획 단계 추출 + if (!planExtracted && !string.IsNullOrEmpty(textResponse)) + { + planSteps = TaskDecomposer.ExtractSteps(textResponse); + planExtracted = true; + + if (planSteps.Count > 0) + { + EmitEvent(AgentEventType.Planning, "", $"작업 계획: {planSteps.Count}단계", + steps: planSteps); + + // 플랜 모드 "auto"에서만 승인 대기 + // - auto: 계획 감지 시 승인 대기 (단, 도구 호출이 함께 있으면 이미 실행 중이므로 스킵) + // - off/always: 승인창 띄우지 않음 (off=자동 진행, always=앞에서 이미 처리됨) + var requireApproval = planMode == "auto" && toolCalls.Count == 0; + + if (requireApproval && UserDecisionCallback != null) + { + var decision = await UserDecisionCallback( + textResponse, + new List { "승인", "수정 요청", "취소" }); + + if (decision == "취소") + { + EmitEvent(AgentEventType.Complete, "", "사용자가 작업을 취소했습니다"); + return "작업이 취소되었습니다."; + } + else if (decision != null && decision != "승인") + { + // 수정 요청 — 사용자 피드백을 메시지에 추가 + messages.Add(new ChatMessage { Role = "user", Content = decision }); + EmitEvent(AgentEventType.Thinking, "", "사용자 피드백 반영 중..."); + planExtracted = false; // 재추출 허용 + continue; // 루프 재시작 — LLM이 수정된 계획으로 재응답 + } + // 승인(null) — 그대로 진행 + + } + } + } + + // Thinking UI: 텍스트 응답 중 도구 호출이 있으면 "사고 과정"으로 표시 + if (!string.IsNullOrEmpty(textResponse) && toolCalls.Count > 0) + { + var thinkingSummary = textResponse.Length > Defaults.ThinkingTextMaxLength + ? textResponse[..Defaults.ThinkingTextMaxLength] + "…" + : textResponse; + EmitEvent(AgentEventType.Thinking, "", thinkingSummary); + } + + // 도구 호출이 없으면 루프 종료 — 단, 문서 생성 요청인데 파일이 미생성이면 자동 저장 + if (toolCalls.Count == 0) + { + // 계획이 있고 도구가 아직 한 번도 실행되지 않은 경우 → LLM이 도구 대신 텍스트로만 응답한 것 + // "계획이 승인됐으니 도구를 호출하라"는 메시지를 추가하여 재시도 (최대 2회) + if (planSteps.Count > 0 && totalToolCalls == 0 && planExecutionRetry < 2) + { + planExecutionRetry++; + if (!string.IsNullOrEmpty(textResponse)) + messages.Add(new ChatMessage { Role = "assistant", Content = textResponse }); + messages.Add(new ChatMessage { Role = "user", + Content = "도구를 호출하지 않았습니다. 계획 1단계를 지금 즉시 도구(tool call)로 실행하세요. " + + "설명 없이 도구 호출만 하세요." }); + EmitEvent(AgentEventType.Thinking, "", $"도구 미호출 감지 — 실행 재시도 {planExecutionRetry}/2..."); + continue; // 루프 재시작 + } + + // document_plan은 호출됐지만 terminal 문서 도구(html_create 등)가 미호출인 경우 → 재시도 (최대 2회) + if (documentPlanCalled && postDocumentPlanRetry < 2) + { + postDocumentPlanRetry++; + if (!string.IsNullOrEmpty(textResponse)) + messages.Add(new ChatMessage { Role = "assistant", Content = textResponse }); + messages.Add(new ChatMessage { Role = "user", + Content = "html_create 도구를 호출하지 않았습니다. " + + "document_plan 결과의 body 골격을 바탕으로 각 섹션에 충분한 내용을 채워서 " + + "html_create 도구를 지금 즉시 호출하세요. 설명 없이 도구 호출만 하세요." }); + EmitEvent(AgentEventType.Thinking, "", $"html_create 미호출 재시도 {postDocumentPlanRetry}/2..."); + continue; // 루프 재시작 + } + + // 재시도도 모두 소진 → 앱이 직접 본문 생성 후 html_create 강제 실행 + if (documentPlanCalled && !string.IsNullOrEmpty(documentPlanScaffold) && !_docFallbackAttempted) + { + _docFallbackAttempted = true; + EmitEvent(AgentEventType.Thinking, "", "LLM이 html_create를 호출하지 않아 앱에서 직접 문서를 생성합니다..."); + try + { + // 도구 없이 LLM에게 HTML body 내용만 요청 + var bodyRequest = new List + { + new() { Role = "user", + Content = $"아래 HTML 골격의 각 h2 섹션에 주석()의 핵심 항목을 참고하여 " + + $"풍부한 내용을 채워 완전한 HTML body를 출력하세요. " + + $"도구를 호출하지 말고 HTML 코드만 출력하세요.\n\n" + + $"주제: {documentPlanTitle ?? userQuery}\n\n" + + $"골격:\n{documentPlanScaffold}" } + }; + var bodyText = await _llm.SendAsync(bodyRequest, ct); + if (!string.IsNullOrEmpty(bodyText)) + { + var htmlTool = _tools.Get("html_create"); + if (htmlTool != null) + { + // 파일명 정규화 + var fallbackPath = documentPlanPath; + if (string.IsNullOrEmpty(fallbackPath)) + { + var safe = userQuery.Length > 40 ? userQuery[..40] : userQuery; + foreach (var c in System.IO.Path.GetInvalidFileNameChars()) + safe = safe.Replace(c, '_'); + fallbackPath = $"{safe.Trim()}.html"; + } + var argsJson = System.Text.Json.JsonSerializer.SerializeToElement(new + { + path = fallbackPath, + title = documentPlanTitle ?? userQuery, + body = bodyText, + toc = true, + numbered = true, + mood = "professional", + cover = new { title = documentPlanTitle ?? userQuery, author = "AX Copilot Agent" } + }); + var htmlResult = await htmlTool.ExecuteAsync(argsJson, context, ct); + if (htmlResult.Success) + { + EmitEvent(AgentEventType.ToolResult, "html_create", + $"✅ 보고서 파일 생성: {System.IO.Path.GetFileName(htmlResult.FilePath ?? "")}", + filePath: htmlResult.FilePath); + textResponse = htmlResult.Output; + } + } + } + } + catch (Exception ex) + { + EmitEvent(AgentEventType.Thinking, "", $"직접 생성 실패: {ex.Message}"); + } + } + + // LLM이 도구를 한 번도 호출하지 않고 텍스트만 반환 + 문서 생성 요청이면 → 앱이 직접 HTML 파일로 저장 + // 주의: 이미 도구가 실행된 경우(totalToolCalls > 0)에는 폴백하지 않음 (중복 파일 방지) + if (!_docFallbackAttempted && totalToolCalls == 0 + && !string.IsNullOrEmpty(textResponse) + && IsDocumentCreationRequest(userQuery)) + { + _docFallbackAttempted = true; + var savedPath = AutoSaveAsHtml(textResponse, userQuery, context); + if (savedPath != null) + { + EmitEvent(AgentEventType.ToolResult, "html_create", + $"✅ 보고서 파일 자동 생성: {System.IO.Path.GetFileName(savedPath)}", + filePath: savedPath); + textResponse += $"\n\n📄 파일이 저장되었습니다: {savedPath}"; + } + } + + if (!string.IsNullOrEmpty(textResponse)) + messages.Add(new ChatMessage { Role = "assistant", Content = textResponse }); + EmitEvent(AgentEventType.Complete, "", "에이전트 작업 완료"); + return textResponse; + } + + // 도구 호출이 있을 때: assistant 메시지에 text + tool_use 블록을 모두 기록 + // (Claude API는 assistant 메시지에 tool_use가 포함되어야 tool_result를 매칭함) + var contentBlocks = new List(); + if (!string.IsNullOrEmpty(textResponse)) + contentBlocks.Add(new { type = "text", text = textResponse }); + foreach (var tc in toolCalls) + contentBlocks.Add(new { type = "tool_use", id = tc.ToolId, name = tc.ToolName, input = tc.ToolInput }); + var assistantContent = JsonSerializer.Serialize(new { _tool_use_blocks = contentBlocks }); + messages.Add(new ChatMessage { Role = "assistant", Content = assistantContent }); + + // 도구 실행 (병렬 모드: 읽기 전용 도구끼리 동시 실행) + var parallelEnabled = llm.EnableParallelTools && toolCalls.Count > 1; + if (parallelEnabled) + { + var (parallelBatch, sequentialBatch) = ClassifyToolCalls(toolCalls); + if (parallelBatch.Count > 1) + { + var pState = new ParallelState + { + CurrentStep = currentStep, TotalToolCalls = totalToolCalls, + MaxIterations = maxIterations, ConsecutiveErrors = consecutiveErrors, + StatsSuccessCount = statsSuccessCount, StatsFailCount = statsFailCount, + StatsInputTokens = statsInputTokens, StatsOutputTokens = statsOutputTokens, + }; + await ExecuteToolsInParallelAsync(parallelBatch, messages, context, planSteps, + pState, baseMax, maxRetry, llm, iteration, ct, statsUsedTools); + currentStep = pState.CurrentStep; totalToolCalls = pState.TotalToolCalls; + maxIterations = pState.MaxIterations; consecutiveErrors = pState.ConsecutiveErrors; + statsSuccessCount = pState.StatsSuccessCount; statsFailCount = pState.StatsFailCount; + statsInputTokens = pState.StatsInputTokens; statsOutputTokens = pState.StatsOutputTokens; + } + // 병렬 배치 실행 후 순차 배치 실행 + toolCalls = sequentialBatch; + if (toolCalls.Count == 0) continue; + } + + // Phase 33-B: 도구 실행 루프 — ProcessSingleToolCallAsync로 위임 + var execState = new ToolExecutionState + { + CurrentStep = currentStep, + TotalToolCalls = totalToolCalls, + MaxIterations = maxIterations, + BaseMax = baseMax, + MaxRetry = maxRetry, + ConsecutiveErrors = consecutiveErrors, + StatsSuccessCount = statsSuccessCount, + StatsFailCount = statsFailCount, + StatsInputTokens = statsInputTokens, + StatsOutputTokens = statsOutputTokens, + StatsUsedTools = statsUsedTools, + PlanSteps = planSteps, + DocumentPlanCalled = documentPlanCalled, + DocumentPlanPath = documentPlanPath, + DocumentPlanTitle = documentPlanTitle, + DocumentPlanScaffold = documentPlanScaffold, + }; + var loopBreak = false; + foreach (var call in toolCalls) + { + if (ct.IsCancellationRequested) break; + var (action, returnValue) = await ProcessSingleToolCallAsync( + call, messages, context, execState, toolCalls, activeTabSnapshot, iteration, ct); + if (action == ToolCallAction.Return) + return returnValue ?? ""; + if (action == ToolCallAction.Break) { loopBreak = true; break; } + } + // 상태 동기화 + currentStep = execState.CurrentStep; + totalToolCalls = execState.TotalToolCalls; + maxIterations = execState.MaxIterations; + consecutiveErrors = execState.ConsecutiveErrors; + statsSuccessCount = execState.StatsSuccessCount; + statsFailCount = execState.StatsFailCount; + statsInputTokens = execState.StatsInputTokens; + statsOutputTokens = execState.StatsOutputTokens; + documentPlanCalled = execState.DocumentPlanCalled; + documentPlanPath = execState.DocumentPlanPath; + documentPlanTitle = execState.DocumentPlanTitle; + documentPlanScaffold = execState.DocumentPlanScaffold; + if (loopBreak) break; + } + + if (iteration >= maxIterations) + { + EmitEvent(AgentEventType.Error, "", $"최대 반복 횟수 도달 ({maxIterations}회)"); + return "⚠ 에이전트가 최대 반복 횟수에 도달했습니다."; + } + + return "(취소됨)"; + } + finally + { + // 세션 종료 이벤트 기록 + if (_eventLog != null) + _ = _eventLog.AppendAsync(AgentEventLogType.SessionEnd, + JsonSerializer.Serialize(new { totalToolCalls, iteration })); + + IsRunning = false; + + // 일시정지 상태 리셋 + if (IsPaused) + { + IsPaused = false; + try { _pauseSemaphore.Release(); } + catch (SemaphoreFullException) { } + } + + // Phase 33-D: SessionManager — DI 기반 세션 자동 저장 + if (_sessionManager != null) + { + try + { + var capturedTab = activeTabSnapshot; + var session = new AgentSession + { + Id = _sessionId ?? Guid.NewGuid().ToString("N")[..12], + Name = userQuery.Length > Defaults.QueryNameMaxLength + ? userQuery[..Defaults.QueryNameMaxLength] + "…" : userQuery, + Tab = capturedTab, + WorkFolder = llm.WorkFolder ?? "", + Model = llm.Model ?? "", + Messages = messages, + Tags = new List { capturedTab }, + CreatedAt = statsStart, + UpdatedAt = DateTime.UtcNow, + }; + await _sessionManager.SaveSessionAsync(session); + } + catch (Exception ex) + { + EmitEvent(AgentEventType.Error, "", $"세션 저장 실패: {ex.Message}"); + } + } + + // 통계 기록 (도구 호출이 1회 이상인 세션만) + if (totalToolCalls > 0) + { + var durationMs = (long)(DateTime.Now - statsStart).TotalMilliseconds; + + AgentStatsService.RecordSession(new AgentStatsService.AgentSessionRecord + { + Timestamp = statsStart, + Tab = activeTabSnapshot, + Model = _settings.Settings.Llm.Model ?? "", + ToolCalls = totalToolCalls, + SuccessCount = statsSuccessCount, + FailCount = statsFailCount, + InputTokens = statsInputTokens, + OutputTokens = statsOutputTokens, + DurationMs = durationMs, + UsedTools = statsUsedTools, + }); + + // 전체 호출·토큰 합계 표시 (개발자 모드 설정) + if (llm.ShowTotalCallStats) + { + var totalTokens = statsInputTokens + statsOutputTokens; + var durationSec = durationMs / 1000.0; + var toolList = string.Join(", ", statsUsedTools); + var summary = $"📊 전체 통계: LLM {iteration}회 호출 | 도구 {totalToolCalls}회 (성공 {statsSuccessCount}, 실패 {statsFailCount}) | " + + $"토큰 {statsInputTokens:N0}→{statsOutputTokens:N0} (합계 {totalTokens:N0}) | " + + $"소요 {durationSec:F1}초 | 사용 도구: {toolList}"; + EmitEvent(AgentEventType.StepDone, "total_stats", summary); + } + } + } + } + + /// LLM 텍스트 응답을 HTML 보고서 파일로 자동 저장합니다. + private string? AutoSaveAsHtml(string textContent, string userQuery, AgentContext context) + { + try + { + // 파일명 생성 — 동사/명령어를 제거하여 깔끔한 파일명 만들기 + var title = userQuery.Length > Defaults.QueryTitleMaxLength ? userQuery[..Defaults.QueryTitleMaxLength] : userQuery; + // 파일명에 불필요한 동사/명령어 제거 + var removeWords = new[] { "작성해줘", "작성해 줘", "만들어줘", "만들어 줘", "써줘", "써 줘", + "생성해줘", "생성해 줘", "작성해", "만들어", "생성해", "해줘", "해 줘", "부탁해" }; + var safeTitle = title; + foreach (var w in removeWords) + safeTitle = safeTitle.Replace(w, "", StringComparison.OrdinalIgnoreCase); + foreach (var c in System.IO.Path.GetInvalidFileNameChars()) + safeTitle = safeTitle.Replace(c, '_'); + safeTitle = safeTitle.Trim().TrimEnd('.').Trim(); + + var fileName = $"{safeTitle}.html"; + var fullPath = FileReadTool.ResolvePath(fileName, context.WorkFolder); + if (context.ActiveTab == "Cowork") + fullPath = AgentContext.EnsureTimestampedPath(fullPath); + + var dir = System.IO.Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) System.IO.Directory.CreateDirectory(dir); + + // 텍스트 → HTML 변환 + var css = TemplateService.GetCss("professional"); + var htmlBody = ConvertTextToHtml(textContent); + + var html = $@" + + + +{EscapeHtml(title)} + + + +
+

{EscapeHtml(title)}

+
작성일: {DateTime.Now:yyyy-MM-dd} | AX Copilot 자동 생성
+{htmlBody} +
+ +"; + + System.IO.File.WriteAllText(fullPath, html, System.Text.Encoding.UTF8); + LogService.Info($"[AgentLoop] 문서 자동 저장 완료: {fullPath}"); + return fullPath; + } + catch (Exception ex) + { + LogService.Warn($"[AgentLoop] 문서 자동 저장 실패: {ex.Message}"); + return null; + } + } + + /// LLM 텍스트(마크다운 형식)를 HTML로 변환합니다. + private static string ConvertTextToHtml(string text) + { + var sb = new System.Text.StringBuilder(); + var lines = text.Split('\n'); + var inList = false; + var listType = "ul"; + + foreach (var rawLine in lines) + { + var line = rawLine.TrimEnd(); + + // 빈 줄 + if (string.IsNullOrWhiteSpace(line)) + { + if (inList) { sb.AppendLine($""); inList = false; } + continue; + } + + // 마크다운 제목 + if (line.StartsWith("### ")) + { + if (inList) { sb.AppendLine($""); inList = false; } + sb.AppendLine($"

{EscapeHtml(line[4..])}

"); + continue; + } + if (line.StartsWith("## ")) + { + if (inList) { sb.AppendLine($""); inList = false; } + sb.AppendLine($"

{EscapeHtml(line[3..])}

"); + continue; + } + if (line.StartsWith("# ")) + { + if (inList) { sb.AppendLine($""); inList = false; } + sb.AppendLine($"

{EscapeHtml(line[2..])}

"); + continue; + } + + // 번호 리스트 (1. 2. 등) - 대제목급이면 h2로 + if (System.Text.RegularExpressions.Regex.IsMatch(line, @"^\d+\.\s+\S")) + { + var content = System.Text.RegularExpressions.Regex.Replace(line, @"^\d+\.\s+", ""); + // 짧고 제목 같으면 h2, 길면 리스트 + if (content.Length < 80 && !content.Contains('.') && !line.StartsWith(" ")) + { + if (inList) { sb.AppendLine($""); inList = false; } + sb.AppendLine($"

{EscapeHtml(line)}

"); + } + else + { + if (!inList) { sb.AppendLine("
    "); inList = true; listType = "ol"; } + sb.AppendLine($"
  1. {EscapeHtml(content)}
  2. "); + } + continue; + } + + // 불릿 리스트 + if (line.TrimStart().StartsWith("- ") || line.TrimStart().StartsWith("* ") || line.TrimStart().StartsWith("• ")) + { + var content = line.TrimStart()[2..].Trim(); + if (!inList) { sb.AppendLine("
      "); inList = true; listType = "ul"; } + sb.AppendLine($"
    • {EscapeHtml(content)}
    • "); + continue; + } + + // 일반 텍스트 + if (inList) { sb.AppendLine($""); inList = false; } + sb.AppendLine($"

      {EscapeHtml(line)}

      "); + } + + if (inList) sb.AppendLine($""); + return sb.ToString(); + } + + private static string EscapeHtml(string text) + => text.Replace("&", "&").Replace("<", "<").Replace(">", ">"); + + /// 사용자 요청이 문서/보고서 생성인지 판단합니다. + private static bool IsDocumentCreationRequest(string query) + { + if (string.IsNullOrWhiteSpace(query)) return false; + // 문서 생성 관련 키워드 패턴 + var keywords = new[] + { + "보고서", "리포트", "report", "문서", "작성해", "써줘", "써 줘", "만들어", + "분석서", "제안서", "기획서", "회의록", "매뉴얼", "가이드", + "excel", "엑셀", "docx", "word", "html", "pptx", "ppt", + "프레젠테이션", "발표자료", "슬라이드" + }; + var q = query.ToLowerInvariant(); + return keywords.Any(k => q.Contains(k, StringComparison.OrdinalIgnoreCase)); + } + + /// 문서 생성 도구인지 확인합니다 (Cowork 검증 대상). + private static bool IsDocumentCreationTool(string toolName) + { + return toolName is "file_write" or "docx_create" or "html_create" + or "excel_create" or "csv_create" or "script_create" or "pptx_create"; + } + + /// + /// 이 도구가 성공하면 작업이 완료된 것으로 간주해 루프를 즉시 종료합니다. + /// Ollama 등 멀티턴 tool_result 미지원 모델에서 불필요한 추가 LLM 호출과 "도구 호출 거부" 오류를 방지합니다. + /// document_assemble/html_create/docx_create 같은 최종 파일 생성 도구가 해당합니다. + /// + private static bool IsTerminalDocumentTool(string toolName) + { + return toolName is "html_create" or "docx_create" or "excel_create" + or "pptx_create" or "document_assemble" or "csv_create"; + } + + /// 코드 생성/수정 도구인지 확인합니다 (Code 검증 대상). + private static bool IsCodeVerificationTarget(string toolName) + { + return toolName is "file_write" or "file_edit" or "script_create" + or "process"; // 빌드/테스트 실행 결과 검증 + } + + /// + /// 문서 생성 도구 실행 후 검증 전용 LLM 호출을 삽입합니다. + /// LLM에게 생성된 파일을 읽고 품질을 평가하도록 강제합니다. + /// OpenHands 등 오픈소스에서는 이런 강제 검증이 없으며, AX Copilot 차별화 포인트입니다. + /// + /// 읽기 전용 검증 도구 목록 (file_read만 허용) + private static readonly HashSet VerificationAllowedTools = ["file_read", "directory_list"]; + + private async Task RunPostToolVerificationAsync( + List messages, string toolName, ToolResult result, + AgentContext context, CancellationToken ct) + { + EmitEvent(AgentEventType.Thinking, "", "🔍 생성 결과물 검증 중..."); + + // 생성된 파일 경로 추출 + var filePath = result.FilePath ?? ""; + var fileRef = string.IsNullOrEmpty(filePath) ? "방금 생성한 결과물" : $"파일 '{filePath}'"; + + // 탭별 검증 프롬프트 생성 — 읽기 + 보고만 (수정 금지) + var isCodeTab = context.ActiveTab == "Code"; + var checkList = isCodeTab + ? " - 구문 오류가 없는가?\n" + + " - 참조하는 클래스/메서드/변수가 존재하는가?\n" + + " - 코딩 컨벤션이 일관적인가?\n" + + " - 에지 케이스 처리가 누락되지 않았는가?" + : " - 사용자 요청에 맞는 내용이 모두 포함되었는가?\n" + + " - 구조와 형식이 올바른가?\n" + + " - 누락된 섹션이나 불완전한 내용이 없는가?\n" + + " - 한국어 맞춤법/표현이 자연스러운가?"; + + var verificationPrompt = new ChatMessage + { + Role = "user", + Content = $"[System:Verification] {fileRef}을 검증하세요.\n" + + "1. file_read 도구로 생성된 파일의 내용을 읽으세요.\n" + + "2. 다음 항목을 확인하세요:\n" + + checkList + "\n" + + "3. 결과를 간단히 보고하세요. 문제가 있으면 구체적으로 무엇이 잘못되었는지 설명하세요.\n" + + "⚠️ 중요: 이 단계에서는 파일을 직접 수정하지 마세요. 보고만 하세요." + }; + + // 검증 메시지를 임시로 추가 (검증 완료 후 전부 제거) + var insertIndex = messages.Count; + messages.Add(verificationPrompt); + var addedMessages = new List { verificationPrompt }; + + try + { + // 읽기 전용 도구만 제공 (file_write, file_edit 등 쓰기 도구 차단) + var allTools = _tools.GetActiveTools(_settings.Settings.Llm.DisabledTools); + var readOnlyTools = allTools + .Where(t => VerificationAllowedTools.Contains(t.Name)) + .ToList(); + + var verifyBlocks = await _llm.SendWithToolsAsync(messages, readOnlyTools, ct); + + // 검증 응답 처리 + var verifyText = new List(); + var verifyToolCalls = new List(); + + foreach (var block in verifyBlocks) + { + if (block.Type == "text" && !string.IsNullOrWhiteSpace(block.Text)) + verifyText.Add(block.Text); + else if (block.Type == "tool_use") + verifyToolCalls.Add(block); + } + + var verifyResponse = string.Join("\n", verifyText); + + // file_read 도구 호출 처리 (읽기만 허용) + if (verifyToolCalls.Count > 0) + { + var contentBlocks = new List(); + if (!string.IsNullOrEmpty(verifyResponse)) + contentBlocks.Add(new { type = "text", text = verifyResponse }); + foreach (var tc in verifyToolCalls) + contentBlocks.Add(new { type = "tool_use", id = tc.ToolId, name = tc.ToolName, input = tc.ToolInput }); + var assistantContent = System.Text.Json.JsonSerializer.Serialize(new { _tool_use_blocks = contentBlocks }); + var assistantMsg = new ChatMessage { Role = "assistant", Content = assistantContent }; + messages.Add(assistantMsg); + addedMessages.Add(assistantMsg); + + foreach (var tc in verifyToolCalls) + { + var tool = _tools.Get(tc.ToolName); + if (tool == null) + { + var errMsg = LlmService.CreateToolResultMessage(tc.ToolId, tc.ToolName, "검증 단계에서는 읽기 도구만 사용 가능합니다."); + messages.Add(errMsg); + addedMessages.Add(errMsg); + continue; + } + + EmitEvent(AgentEventType.ToolCall, tc.ToolName, $"[검증] {FormatToolCallSummary(tc)}"); + try + { + var input = tc.ToolInput ?? System.Text.Json.JsonDocument.Parse("{}").RootElement; + var verifyResult = await tool.ExecuteAsync(input, context, ct); + var toolMsg = LlmService.CreateToolResultMessage( + tc.ToolId, tc.ToolName, TruncateOutput(verifyResult.Output, Defaults.ToolResultTruncateLength)); + messages.Add(toolMsg); + addedMessages.Add(toolMsg); + } + catch (Exception ex) + { + var errMsg = LlmService.CreateToolResultMessage( + tc.ToolId, tc.ToolName, $"검증 도구 실행 오류: {ex.Message}"); + messages.Add(errMsg); + addedMessages.Add(errMsg); + } + } + + // file_read 결과를 받은 후 최종 검증 판단을 받기 위해 한 번 더 호출 + var finalBlocks = await _llm.SendWithToolsAsync(messages, readOnlyTools, ct); + verifyResponse = string.Join("\n", + finalBlocks.Where(b => b.Type == "text" && !string.IsNullOrWhiteSpace(b.Text)).Select(b => b.Text)); + } + + // 검증 결과를 이벤트로 표시 + if (!string.IsNullOrEmpty(verifyResponse)) + { + var summary = verifyResponse.Length > Defaults.VerificationSummaryMaxLength ? verifyResponse[..Defaults.VerificationSummaryMaxLength] + "…" : verifyResponse; + EmitEvent(AgentEventType.Thinking, "", $"✅ 검증 결과: {summary}"); + + // 문제가 발견된 경우: 검증 보고서를 컨텍스트에 남겨서 다음 루프에서 자연스럽게 수정 + var hasIssues = verifyResponse.Contains("문제") || verifyResponse.Contains("수정") || + verifyResponse.Contains("누락") || verifyResponse.Contains("오류") || + verifyResponse.Contains("잘못") || verifyResponse.Contains("부족"); + if (hasIssues) + { + // 검증 관련 임시 메시지를 모두 제거 + foreach (var msg in addedMessages) + messages.Remove(msg); + + // 검증 보고서만 간결하게 남기기 (다음 루프에서 LLM이 자연스럽게 수정) + messages.Add(new ChatMessage + { + Role = "user", + Content = $"[System] 방금 생성한 {fileRef}에 대한 자동 검증 결과, 다음 문제가 발견되었습니다:\n{verifyResponse}\n\n위 문제를 수정해 주세요." + }); + return; + } + } + } + catch (Exception ex) + { + EmitEvent(AgentEventType.Error, "", $"검증 LLM 호출 실패: {ex.Message}"); + } + + // 검증 통과 또는 실패: 임시 메시지 전부 제거 (컨텍스트 오염 방지) + foreach (var msg in addedMessages) + messages.Remove(msg); + } + + private AgentContext BuildContext(string? tabOverride = null) + { + var llm = _settings.Settings.Llm; + return new AgentContext + { + Settings = _settings.Settings, + WorkFolder = llm.WorkFolder, + Permission = llm.FilePermission, + BlockedPaths = llm.BlockedPaths, + BlockedExtensions = llm.BlockedExtensions, + AskPermission = AskPermissionCallback, + UserDecision = UserDecisionCallback, + UserAskCallback = UserAskCallback, + ToolPermissions = llm.ToolPermissions ?? new(), + ActiveTab = tabOverride ?? ActiveTab ?? "Chat", + DevMode = llm.DevMode, + DevModeStepApproval = llm.DevModeStepApproval, + }; + } + + private void EmitEvent(AgentEventType type, string toolName, string summary, + string? filePath = null, int stepCurrent = 0, int stepTotal = 0, List? steps = null, + long elapsedMs = 0, int inputTokens = 0, int outputTokens = 0, + string? toolInput = null, int iteration = 0) + { + // AgentLogLevel에 따라 이벤트 필터링 + var logLevel = _settings.Settings.Llm.AgentLogLevel; + + // simple: ToolCall, ToolResult, Error, Complete, StepStart, StepDone, Decision만 + if (logLevel == "simple" && type is AgentEventType.Thinking or AgentEventType.Planning) + return; + + // simple: Summary 200자 제한 + if (logLevel == "simple" && summary.Length > 200) + summary = summary[..200] + "…"; + + // debug 아닌 경우 ToolInput 제거 + if (logLevel != "debug") + toolInput = null; + + var evt = new AgentEvent + { + Type = type, + ToolName = toolName, + Summary = summary, + FilePath = filePath, + Success = type != AgentEventType.Error, + StepCurrent = stepCurrent, + StepTotal = stepTotal, + Steps = steps, + ElapsedMs = elapsedMs, + InputTokens = inputTokens, + OutputTokens = outputTokens, + ToolInput = toolInput, + Iteration = iteration, + }; + + if (Dispatcher != null) + Dispatcher(() => { Events.Add(evt); EventOccurred?.Invoke(evt); }); + else + { + Events.Add(evt); + EventOccurred?.Invoke(evt); + } + } + + /// 영향 범위 기반 의사결정 체크. 확인이 필요하면 메시지를 반환, 불필요하면 null. + private string? CheckDecisionRequired(LlmService.ContentBlock call, AgentContext context) + { + var level = _settings.Settings.Llm.AgentDecisionLevel ?? "normal"; + var toolName = call.ToolName ?? ""; + var input = call.ToolInput; + + // Git 커밋 — 수준에 관계없이 무조건 확인 + if (toolName == "git_tool") + { + var action = input?.TryGetProperty("action", out var a) == true ? a.GetString() : ""; + if (action == "commit") + { + var msg = input?.TryGetProperty("args", out var m) == true ? m.GetString() : ""; + return $"Git 커밋을 실행하시겠습니까?\n\n커밋 메시지: {msg}"; + } + } + + // minimal: 파일 삭제, 외부 명령만 + if (level == "minimal") + { + // process 도구 (외부 명령 실행) + if (toolName == "process") + { + var cmd = input?.TryGetProperty("command", out var c) == true ? c.GetString() : ""; + return $"외부 명령을 실행하시겠습니까?\n\n명령: {cmd}"; + } + return null; + } + + // normal: + 새 파일 생성, 여러 파일 수정, 문서 생성, 외부 명령 + if (level == "normal" || level == "detailed") + { + // 외부 명령 실행 + if (toolName == "process") + { + var cmd = input?.TryGetProperty("command", out var c) == true ? c.GetString() : ""; + return $"외부 명령을 실행하시겠습니까?\n\n명령: {cmd}"; + } + + // 새 파일 생성 + if (toolName == "file_write") + { + var path = input?.TryGetProperty("file_path", out var p) == true ? p.GetString() : ""; + if (!string.IsNullOrEmpty(path)) + { + var fullPath = System.IO.Path.IsPathRooted(path) ? path + : System.IO.Path.Combine(context.WorkFolder, path ?? ""); + if (!System.IO.File.Exists(fullPath)) + return $"새 파일을 생성하시겠습니까?\n\n경로: {path}"; + } + } + + // 문서 생성 (Excel, Word, HTML 등) + if (toolName is "excel_create" or "docx_create" or "html_create" or "csv_create" or "script_create") + { + var path = input?.TryGetProperty("file_path", out var p) == true ? p.GetString() : ""; + return $"문서를 생성하시겠습니까?\n\n도구: {toolName}\n경로: {path}"; + } + + // 빌드/테스트 실행 + if (toolName is "build_run" or "test_loop") + { + var action = input?.TryGetProperty("action", out var a) == true ? a.GetString() : ""; + return $"빌드/테스트를 실행하시겠습니까?\n\n도구: {toolName}\n액션: {action}"; + } + } + + // detailed: 모든 파일 수정 + if (level == "detailed") + { + if (toolName is "file_write" or "file_edit") + { + var path = input?.TryGetProperty("file_path", out var p) == true ? p.GetString() : ""; + return $"파일을 수정하시겠습니까?\n\n경로: {path}"; + } + } + + return null; + } + + private static string FormatToolCallSummary(LlmService.ContentBlock call) + { + if (call.ToolInput == null) return call.ToolName; + try + { + // 주요 파라미터만 표시 + var input = call.ToolInput.Value; + if (input.TryGetProperty("path", out var path)) + return $"{call.ToolName}: {path.GetString()}"; + if (input.TryGetProperty("command", out var cmd)) + return $"{call.ToolName}: {cmd.GetString()}"; + if (input.TryGetProperty("pattern", out var pat)) + return $"{call.ToolName}: {pat.GetString()}"; + return call.ToolName; + } + catch (Exception) { return call.ToolName; } + } + + private static string TruncateOutput(string output, int maxLength) + { + if (output.Length <= maxLength) return output; + return output[..maxLength] + "\n... (출력 잘림)"; + } + + // ─── 병렬 도구 실행 ────────────────────────────────────────────────── + + // 읽기 전용 도구 (파일 상태를 변경하지 않음) + private static readonly HashSet ReadOnlyTools = new(StringComparer.OrdinalIgnoreCase) + { + "file_read", "glob", "grep_tool", "folder_map", "document_read", + "search_codebase", "code_search", "env_tool", "datetime_tool", + "dev_env_detect", "memory", "skill_manager", "json_tool", + "regex_tool", "base64_tool", "hash_tool", "image_analyze", + }; + + /// 도구 호출을 병렬 가능 / 순차 필수로 분류합니다. + private static (List Parallel, List Sequential) + ClassifyToolCalls(List calls) + { + var parallel = new List(); + var sequential = new List(); + + foreach (var call in calls) + { + if (ReadOnlyTools.Contains(call.ToolName ?? "")) + parallel.Add(call); + else + sequential.Add(call); + } + + // 읽기 전용 도구가 1개뿐이면 병렬화 의미 없음 + if (parallel.Count <= 1) + { + sequential.InsertRange(0, parallel); + parallel.Clear(); + } + + return (parallel, sequential); + } + + // ─── Phase 33-B: 도구 실행 루프 상태 (RunAsync에서 추출) ───────────── + /// 도구 실행 루프의 가변 상태. 메서드 간 공유. + private class ToolExecutionState + { + public int CurrentStep; + public int TotalToolCalls; + public int MaxIterations; + public int BaseMax; + public int MaxRetry; + public int ConsecutiveErrors; + public int StatsSuccessCount; + public int StatsFailCount; + public int StatsInputTokens; + public int StatsOutputTokens; + public List StatsUsedTools = new(); + public List PlanSteps = new(); + public bool DocumentPlanCalled; + public string? DocumentPlanPath; + public string? DocumentPlanTitle; + public string? DocumentPlanScaffold; + } + + /// 병렬 실행용 가변 상태 (ToolExecutionState의 서브셋). TODO: ToolExecutionState로 통합 예정. + private class ParallelState + { + public int CurrentStep; + public int TotalToolCalls; + public int MaxIterations; + public int ConsecutiveErrors; + public int StatsSuccessCount; + public int StatsFailCount; + public int StatsInputTokens; + public int StatsOutputTokens; + } + + /// + /// Phase 33-B: 단일 도구 호출을 처리합니다 (RunAsync에서 추출). + /// 훅 실행 → 도구 실행 → 결과 처리 → 검증까지 단일 도구 라이프사이클. + /// + /// LoopAction: Continue=다음 도구, Break=루프 중단, Return=값 반환. + private async Task<(ToolCallAction Action, string? ReturnValue)> ProcessSingleToolCallAsync( + LlmService.ContentBlock call, + List messages, + AgentContext context, + ToolExecutionState state, + List toolCalls, + string activeTabSnapshot, + int iteration, + CancellationToken ct) + { + var llm = _settings.Settings.Llm; + var tool = _tools.Get(call.ToolName); + if (tool == null) + { + var errResult = $"알 수 없는 도구: {call.ToolName}"; + EmitEvent(AgentEventType.Error, call.ToolName, errResult); + messages.Add(LlmService.CreateToolResultMessage(call.ToolId, call.ToolName, errResult)); + return (ToolCallAction.Continue, null); + } + + // Task Decomposition: 단계 진행률 추적 + if (state.PlanSteps.Count > 0) + { + var summary = FormatToolCallSummary(call); + var newStep = TaskDecomposer.EstimateCurrentStep( + state.PlanSteps, call.ToolName, summary, state.CurrentStep); + if (newStep != state.CurrentStep) + { + state.CurrentStep = newStep; + EmitEvent(AgentEventType.StepStart, "", state.PlanSteps[state.CurrentStep], + stepCurrent: state.CurrentStep + 1, stepTotal: state.PlanSteps.Count); + } + } + + // 개발자 모드: 도구 호출 파라미터 상세 표시 + if (context.DevMode) + { + var paramJson = call.ToolInput?.ToString() ?? "{}"; + if (paramJson.Length > 500) paramJson = paramJson[..500] + "..."; + EmitEvent(AgentEventType.Thinking, call.ToolName, + $"[DEV] 도구 호출: {call.ToolName}\n파라미터: {paramJson}"); + } + + // 이벤트 로그 기록 + if (_eventLog != null) + _ = _eventLog.AppendAsync(AgentEventLogType.ToolRequest, + JsonSerializer.Serialize(new { toolName = call.ToolName, iteration })); + + EmitEvent(AgentEventType.ToolCall, call.ToolName, FormatToolCallSummary(call)); + + // 개발자 모드: 스텝 바이 스텝 승인 + if (context.DevModeStepApproval && UserDecisionCallback != null) + { + var decision = await UserDecisionCallback( + $"[DEV] 도구 '{call.ToolName}' 실행을 승인하시겠습니까?\n{FormatToolCallSummary(call)}", + new List { "승인", "건너뛰기", "중단" }); + if (decision == "중단") + { + EmitEvent(AgentEventType.Complete, "", "[DEV] 사용자가 실행을 중단했습니다"); + return (ToolCallAction.Return, "사용자가 개발자 모드에서 실행을 중단했습니다."); + } + if (decision == "건너뛰기") + { + messages.Add(LlmService.CreateToolResultMessage( + call.ToolId, call.ToolName, "[SKIPPED by developer] 사용자가 이 도구 실행을 건너뛰었습니다.")); + return (ToolCallAction.Continue, null); + } + } + + // 영향 범위 기반 의사결정 체크 + var decisionRequired = CheckDecisionRequired(call, context); + if (decisionRequired != null && UserDecisionCallback != null) + { + var decision = await UserDecisionCallback( + decisionRequired, + new List { "승인", "건너뛰기", "취소" }); + if (decision == "취소") + { + EmitEvent(AgentEventType.Complete, "", "사용자가 작업을 취소했습니다"); + return (ToolCallAction.Return, "사용자가 작업을 취소했습니다."); + } + if (decision == "건너뛰기") + { + messages.Add(LlmService.CreateToolResultMessage( + call.ToolId, call.ToolName, "[SKIPPED] 사용자가 이 작업을 건너뛰었습니다.")); + return (ToolCallAction.Continue, null); + } + } + + // ── Pre-Hook 실행 ── + await RunToolHooksAsync(llm, call, context, "pre", ct); + + // ── 도구 실행 ── + ToolResult result; + var sw = Stopwatch.StartNew(); + try + { + var input = call.ToolInput ?? JsonDocument.Parse("{}").RootElement; + result = await tool.ExecuteAsync(input, context, ct); + } + catch (OperationCanceledException) + { + EmitEvent(AgentEventType.Complete, "", "사용자가 작업을 취소했습니다."); + return (ToolCallAction.Return, "사용자가 작업을 취소했습니다."); + } + catch (Exception ex) + { + result = ToolResult.Fail($"도구 실행 오류: {ex.Message}"); + } + sw.Stop(); + + // ── Post-Hook 실행 ── + await RunToolHooksAsync(llm, call, context, "post", ct, result); + + // 개발자 모드: 도구 결과 상세 표시 + if (context.DevMode) + { + EmitEvent(AgentEventType.Thinking, call.ToolName, + $"[DEV] 결과: {(result.Success ? "성공" : "실패")}\n{TruncateOutput(result.Output, 500)}"); + } + + var tokenUsage = _llm.LastTokenUsage; + EmitEvent( + result.Success ? AgentEventType.ToolResult : AgentEventType.Error, + call.ToolName, + TruncateOutput(result.Output, 200), + result.FilePath, + elapsedMs: sw.ElapsedMilliseconds, + inputTokens: tokenUsage?.PromptTokens ?? 0, + outputTokens: tokenUsage?.CompletionTokens ?? 0, + toolInput: call.ToolInput?.ToString(), + iteration: iteration); + + // 통계 수집 + if (result.Success) state.StatsSuccessCount++; else state.StatsFailCount++; + state.StatsInputTokens += tokenUsage?.PromptTokens ?? 0; + state.StatsOutputTokens += tokenUsage?.CompletionTokens ?? 0; + if (!state.StatsUsedTools.Contains(call.ToolName)) + state.StatsUsedTools.Add(call.ToolName); + + // 감사 로그 기록 + if (llm.EnableAuditLog) + { + AuditLogService.LogToolCall( + _conversationId, activeTabSnapshot, + call.ToolName, + call.ToolInput.ToString() ?? "", + TruncateOutput(result.Output, 500), + result.FilePath, result.Success); + } + + // 이벤트 로그 + if (_eventLog != null) + _ = _eventLog.AppendAsync(AgentEventLogType.ToolResult, + JsonSerializer.Serialize(new + { + toolName = call.ToolName, + success = result.Success, + outputLength = result.Output?.Length ?? 0 + })); + + state.TotalToolCalls++; + + // 동적 반복 한도 확장 + if (state.TotalToolCalls > Defaults.ToolCallThresholdForExpansion && state.MaxIterations < state.BaseMax * 2) + state.MaxIterations = Math.Min(state.BaseMax * 2, 50); + + // 테스트-수정 루프 예산 확장 + if (call.ToolName == "test_loop" && (result.Output?.Contains("[AUTO_FIX:") ?? false)) + { + var testFixMax = llm.MaxTestFixIterations > 0 ? llm.MaxTestFixIterations : Defaults.MaxTestFixIterations; + var testFixBudget = state.BaseMax + testFixMax * 3; + if (state.MaxIterations < testFixBudget) + state.MaxIterations = Math.Min(testFixBudget, 60); + } + + // UI 스레드가 이벤트를 렌더링할 시간 확보 + await Task.Delay(80, ct); + + // Self-Reflection: 도구 실패 시 반성 프롬프트 추가 + if (!result.Success) + { + state.ConsecutiveErrors++; + if (state.ConsecutiveErrors <= state.MaxRetry) + { + var reflectionMsg = $"[Tool '{call.ToolName}' failed: {TruncateOutput(result.Output ?? "", 500)}]\n" + + $"Analyze why this failed. Consider: wrong parameters, wrong file path, missing prerequisites. " + + $"Try a different approach. (Error {state.ConsecutiveErrors}/{state.MaxRetry})"; + messages.Add(LlmService.CreateToolResultMessage(call.ToolId, call.ToolName, reflectionMsg)); + EmitEvent(AgentEventType.Thinking, "", $"Self-Reflection: 실패 분석 후 재시도 ({state.ConsecutiveErrors}/{state.MaxRetry})"); + } + else + { + messages.Add(LlmService.CreateToolResultMessage( + call.ToolId, call.ToolName, + $"[FAILED after {state.MaxRetry} retries] {TruncateOutput(result.Output ?? "", 500)}\n" + + "Stop retrying this tool. Explain the error to the user and suggest alternative approaches.")); + + // 에이전트 메모리에 실패 원인 저장 + try + { + var memSvc = CurrentApp?.MemoryService; + if (memSvc != null && (_settings.Settings.Llm.EnableAgentMemory)) + { + memSvc.Add("correction", + $"도구 '{call.ToolName}' 반복 실패: {TruncateOutput(result.Output ?? "", Defaults.LogSummaryMaxLength)}", + $"conv:{_conversationId}", context.WorkFolder); + } + } + catch (Exception ex) { LogService.Warn($"[AgentLoop] 에이전트 메모리 저장 실패: {ex.Message}"); } + } + } + else + { + state.ConsecutiveErrors = 0; + + // ToolResultSizer 적용 + var sizedResult = ToolResultSizer.Apply(result.Output ?? "", call.ToolName); + messages.Add(LlmService.CreateToolResultMessage(call.ToolId, call.ToolName, sizedResult.Output)); + + // document_plan 호출 플래그 + 메타데이터 저장 + if (call.ToolName == "document_plan" && result.Success) + { + state.DocumentPlanCalled = true; + try + { + var planJson = JsonDocument.Parse(result.Output ?? "{}"); + if (planJson.RootElement.TryGetProperty("path", out var p)) + state.DocumentPlanPath = p.GetString(); + if (planJson.RootElement.TryGetProperty("title", out var t)) + state.DocumentPlanTitle = t.GetString(); + if (planJson.RootElement.TryGetProperty("body", out var b)) + state.DocumentPlanScaffold = b.GetString(); + } + catch (Exception) { /* document_plan JSON 파싱 실패 — 선택적 메타데이터이므로 무시 */ } + + // html_create 즉시 호출 유도 + var toolHint = (result.Output?.Contains("document_assemble") ?? false) ? "document_assemble" : + (result.Output?.Contains("file_write") ?? false) ? "file_write" : "html_create"; + messages.Add(new ChatMessage { Role = "user", + Content = $"document_plan이 완료되었습니다. " + + $"위 결과의 body/sections의 [내용...] 부분을 실제 상세 내용으로 모두 채워서 " + + $"{toolHint} 도구를 지금 즉시 호출하세요. " + + $"각 섹션마다 반드시 충분한 내용을 작성하고, 설명 없이 도구를 바로 호출하세요." }); + EmitEvent(AgentEventType.Thinking, "", $"문서 개요 완성 — {toolHint} 호출 중..."); + } + + // 단일 문서 생성 도구 성공 → 즉시 루프 종료 + if (result.Success && IsTerminalDocumentTool(call.ToolName) && toolCalls.Count == 1) + { + var shouldVerify2 = activeTabSnapshot == "Code" + ? llm.Code.EnableCodeVerification && IsCodeVerificationTarget(call.ToolName) + : llm.EnableCoworkVerification && IsDocumentCreationTool(call.ToolName); + if (shouldVerify2) + { + await RunPostToolVerificationAsync(messages, call.ToolName, result, context, ct); + } + EmitEvent(AgentEventType.Complete, "", "에이전트 작업 완료"); + return (ToolCallAction.Return, result.Output ?? ""); + } + + // Post-Tool Verification: 탭별 검증 강제 + var shouldVerify = activeTabSnapshot == "Code" + ? llm.Code.EnableCodeVerification && IsCodeVerificationTarget(call.ToolName) + : llm.EnableCoworkVerification && IsDocumentCreationTool(call.ToolName); + if (shouldVerify && result.Success) + { + await RunPostToolVerificationAsync(messages, call.ToolName, result, context, ct); + } + } + + return (ToolCallAction.Continue, null); + } + + /// 도구 호출 처리 후 루프 제어 액션. + private enum ToolCallAction { Continue, Break, Return } + + /// Phase 33-B: 도구 훅(Pre/Post) 실행 헬퍼. + private async Task RunToolHooksAsync( + Models.LlmSettings llm, LlmService.ContentBlock call, + AgentContext context, string phase, CancellationToken ct, + ToolResult? result = null) + { + if (!llm.EnableToolHooks || llm.AgentHooks.Count == 0) return; + try + { + var hookResults = await AgentHookRunner.RunAsync( + llm.AgentHooks, call.ToolName, phase, + toolInput: call.ToolInput.ToString(), + toolOutput: result != null ? TruncateOutput(result.Output, 2048) : null, + success: result?.Success ?? false, + workFolder: context.WorkFolder, + timeoutMs: llm.ToolHookTimeoutMs, + ct: ct); + foreach (var pr in hookResults.Where(r => !r.Success)) + EmitEvent(AgentEventType.Error, call.ToolName, $"[Hook:{pr.HookName}] {pr.Output}"); + } + catch (Exception ex) { LogService.Warn($"[AgentLoop] {phase}ToolUse 훅 실패: {ex.Message}"); } + } + + /// DelegateAgentTool에서 호출하는 서브에이전트 실행기. + private async Task RunSubAgentAsync(string agentType, string task, string workFolder, CancellationToken ct) + { + try + { + var systemPrompt = $"당신은 전문 {agentType} 에이전트입니다. 주어진 작업을 수행하세요."; + var msgs = new List + { + new() { Role = "system", Content = systemPrompt }, + new() { Role = "user", Content = task } + }; + + // 서브에이전트는 간단한 텍스트 응답으로 처리 (도구 호출 없이) + var response = await _llm.SendAsync(msgs, ct); + return response; + } + catch (Exception ex) + { + return $"서브에이전트 실행 오류: {ex.Message}"; + } + } + + /// 읽기 전용 도구들을 병렬 실행합니다. + private async Task ExecuteToolsInParallelAsync( + List calls, + List messages, + AgentContext context, + List planSteps, + ParallelState state, + int baseMax, int maxRetry, + Models.LlmSettings llm, + int iteration, + CancellationToken ct, + List statsUsedTools) + { + EmitEvent(AgentEventType.Thinking, "", $"읽기 전용 도구 {calls.Count}개를 병렬 실행 중..."); + + var tasks = calls.Select(async call => + { + var tool = _tools.Get(call.ToolName); + if (tool == null) + return (call, ToolResult.Fail($"알 수 없는 도구: {call.ToolName}"), 0L); + + var sw = System.Diagnostics.Stopwatch.StartNew(); + try + { + var input = call.ToolInput ?? JsonDocument.Parse("{}").RootElement; + var result = await tool.ExecuteAsync(input, context, ct); + sw.Stop(); + return (call, result, sw.ElapsedMilliseconds); + } + catch (Exception ex) + { + sw.Stop(); + return (call, ToolResult.Fail($"도구 실행 오류: {ex.Message}"), sw.ElapsedMilliseconds); + } + }).ToList(); + + var results = await Task.WhenAll(tasks); + + // 결과를 순서대로 메시지에 추가 + foreach (var (call, result, elapsed) in results) + { + EmitEvent( + result.Success ? AgentEventType.ToolResult : AgentEventType.Error, + call.ToolName, + TruncateOutput(result.Output, 200), + result.FilePath, + elapsedMs: elapsed, + iteration: iteration); + + if (result.Success) state.StatsSuccessCount++; else state.StatsFailCount++; + if (!statsUsedTools.Contains(call.ToolName)) + statsUsedTools.Add(call.ToolName); + + state.TotalToolCalls++; + messages.Add(LlmService.CreateToolResultMessage( + call.ToolId, call.ToolName, TruncateOutput(result.Output, Defaults.ToolResultTruncateLength))); + + if (!result.Success) + { + state.ConsecutiveErrors++; + if (state.ConsecutiveErrors > maxRetry) + { + messages.Add(LlmService.CreateToolResultMessage( + call.ToolId, call.ToolName, + $"[FAILED after retries] {TruncateOutput(result.Output, 500)}")); + } + } + else + { + state.ConsecutiveErrors = 0; + } + + // 감사 로그 + if (llm.EnableAuditLog) + { + AuditLogService.LogToolCall( + _conversationId, context.ActiveTab ?? "", + call.ToolName, + call.ToolInput?.ToString() ?? "", + TruncateOutput(result.Output, 500), + result.FilePath, result.Success); + } + } + } +} diff --git a/src/AxCopilot/Services/Agent/AgentReplayService.cs b/src/AxCopilot/Services/Agent/AgentReplayService.cs new file mode 100644 index 0000000..48c42a7 --- /dev/null +++ b/src/AxCopilot/Services/Agent/AgentReplayService.cs @@ -0,0 +1,104 @@ +using System.IO; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 18-B: 에이전트 세션 이벤트 로그를 읽어 재생(replay)을 지원합니다. +/// AgentEventLog의 JSONL 파일을 순서대로 읽어 UI에 이벤트 스트림을 전달합니다. +/// +public class AgentReplayService +{ + private readonly string _sessionsDir; + + public AgentReplayService() + { + _sessionsDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "sessions"); + } + + /// 저장된 세션 목록 반환 (최신순). + public IReadOnlyList GetSessions() + { + if (!Directory.Exists(_sessionsDir)) return new List(); + + var sessions = new List(); + foreach (var dir in Directory.GetDirectories(_sessionsDir)) + { + var logFile = Path.Combine(dir, "events.jsonl"); + if (!File.Exists(logFile)) continue; + + var sessionId = Path.GetFileName(dir); + var info = new FileInfo(logFile); + sessions.Add(new ReplaySessionInfo + { + SessionId = sessionId, + LogFilePath = logFile, + CreatedAt = info.CreationTime, + FileSizeBytes = info.Length + }); + } + + return sessions.OrderByDescending(s => s.CreatedAt).ToList(); + } + + /// + /// 세션 이벤트를 순서대로 재생합니다. + /// 각 이벤트마다 onEvent 콜백을 호출하고, delayMs 간격으로 재생. + /// + public async Task ReplayAsync( + string sessionId, + Func onEvent, + int delayMs = 300, + CancellationToken ct = default) + { + var logFile = Path.Combine(_sessionsDir, sessionId, "events.jsonl"); + if (!File.Exists(logFile)) return; + + var log = new AgentEventLog(sessionId); + await foreach (var record in log.ReadAllAsync(ct)) + { + if (ct.IsCancellationRequested) break; + await onEvent(record); + if (delayMs > 0) + await Task.Delay(delayMs, ct); + } + } + + /// 세션의 모든 이벤트를 한 번에 로드합니다 (타임라인 뷰용). + public async Task> LoadAllEventsAsync( + string sessionId, + CancellationToken ct = default) + { + var logFile = Path.Combine(_sessionsDir, sessionId, "events.jsonl"); + if (!File.Exists(logFile)) return new List(); + + var records = new List(); + var log = new AgentEventLog(sessionId); + await foreach (var record in log.ReadAllAsync(ct)) + { + if (ct.IsCancellationRequested) break; + records.Add(record); + } + return records; + } + + /// 오래된 세션 정리 (AgentEventLog 위임). + public void CleanOldSessions(int retentionDays = 30) + => AgentEventLog.CleanOldSessions(retentionDays); +} + +/// 재생 가능한 세션 정보. +public record ReplaySessionInfo +{ + public string SessionId { get; init; } = ""; + public string LogFilePath { get; init; } = ""; + public DateTime CreatedAt { get; init; } + public long FileSizeBytes { get; init; } + + public string DisplayName => $"세션 {SessionId} ({CreatedAt:MM-dd HH:mm})"; + public string FileSizeLabel => FileSizeBytes < 1024 + ? $"{FileSizeBytes}B" + : $"{FileSizeBytes / 1024}KB"; +} diff --git a/src/AxCopilot/Services/Agent/AgentTypeMemoryRepository.cs b/src/AxCopilot/Services/Agent/AgentTypeMemoryRepository.cs new file mode 100644 index 0000000..3dfcbf3 --- /dev/null +++ b/src/AxCopilot/Services/Agent/AgentTypeMemoryRepository.cs @@ -0,0 +1,65 @@ +using System.IO; +using System.Text; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 18-A: 에이전트 타입별 영속 메모리. +/// 저장: %APPDATA%\AxCopilot\agent-memory\{agentType}\MEMORY.md +/// 동일 타입 에이전트 재실행 시 이전 학습 유지. +/// +public class AgentTypeMemoryRepository : IAgentMemoryRepository +{ + private static readonly string BaseDir = System.IO.Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "agent-memory"); + + /// 에이전트 타입 메모리 로드. + public async Task LoadMemoryAsync(string agentType) + { + var path = GetPath(agentType); + if (!File.Exists(path)) return null; + return await File.ReadAllTextAsync(path, Encoding.UTF8); + } + + /// 에이전트 타입 메모리 전체 저장. + public async Task SaveMemoryAsync(string agentType, string content) + { + Directory.CreateDirectory(GetDir(agentType)); + await File.WriteAllTextAsync(GetPath(agentType), content, Encoding.UTF8); + } + + /// 학습 내용을 기존 메모리에 추가. + public async Task AppendLearnAsync(string agentType, string learning) + { + var existing = await LoadMemoryAsync(agentType) ?? "# 에이전트 메모리\n"; + var entry = $"\n- [{DateTime.Now:yyyy-MM-dd HH:mm}] {learning}"; + await SaveMemoryAsync(agentType, existing + entry); + } + + /// 등록된 에이전트 타입 목록. + public IReadOnlyList GetAgentTypes() + { + if (!Directory.Exists(BaseDir)) return Array.Empty(); + return Directory.GetDirectories(BaseDir) + .Select(d => System.IO.Path.GetFileName(d) ?? "") + .Where(n => !string.IsNullOrEmpty(n)) + .ToList(); + } + + /// 에이전트 타입 메모리 삭제. + public void DeleteMemory(string agentType) + { + var dir = GetDir(agentType); + if (Directory.Exists(dir)) Directory.Delete(dir, true); + } + + private static string GetDir(string agentType) + => System.IO.Path.Combine(BaseDir, SanitizeAgentType(agentType)); + + private static string GetPath(string agentType) + => System.IO.Path.Combine(GetDir(agentType), "MEMORY.md"); + + private static string SanitizeAgentType(string agentType) + => string.Concat(agentType.Where(c => char.IsLetterOrDigit(c) || c == '_' || c == '-')); +} diff --git a/src/AxCopilot/Services/Agent/AutoCompactMonitor.cs b/src/AxCopilot/Services/Agent/AutoCompactMonitor.cs new file mode 100644 index 0000000..ca2a5f7 --- /dev/null +++ b/src/AxCopilot/Services/Agent/AutoCompactMonitor.cs @@ -0,0 +1,38 @@ +namespace AxCopilot.Services.Agent; + +/// +/// Phase 23: 자동 컴팩션 모니터. +/// 에이전트 루프 반복마다 컨텍스트 토큰 사용량을 확인하고, +/// 임계치 초과 시 자동으로 대화를 요약���니다. +/// +public class AutoCompactMonitor +{ + private readonly int _thresholdPercent; + + /// 자동 컴팩션 모니터를 생성합니다. + /// 컨텍스트 사용량 임계치 (기본 80%) + public AutoCompactMonitor(int thresholdPercent = 80) + { + _thresholdPercent = Math.Clamp(thresholdPercent, 50, 95); + } + + /// + /// 현재 토큰 사용량을 확인하고 컴팩션이 필요한지 판단합니다. + /// + /// 현재 사용 중인 토큰 수 + /// 모델의 최대 컨텍스트 토큰 수 + /// true면 컴팩션 필요 + public bool ShouldCompact(int currentTokens, int maxTokens) + { + if (maxTokens <= 0) return false; + var usagePercent = (int)((double)currentTokens / maxTokens * 100); + return usagePercent >= _thresholdPercent; + } + + /// 현재 사용률을 계산합니다 (0~100). + public static int CalculateUsagePercent(int currentTokens, int maxTokens) + { + if (maxTokens <= 0) return 0; + return (int)((double)currentTokens / maxTokens * 100); + } +} diff --git a/src/AxCopilot/Services/Agent/AutoContextCollector.cs b/src/AxCopilot/Services/Agent/AutoContextCollector.cs new file mode 100644 index 0000000..2536819 --- /dev/null +++ b/src/AxCopilot/Services/Agent/AutoContextCollector.cs @@ -0,0 +1,120 @@ +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 17-G: 사용자 메시지에서 파일 참조를 감지하여 자동으로 컨텍스트에 추가. +/// @파일명 멘션, 경로 패턴, 확장자 기반 감지. +/// +public static class AutoContextCollector +{ + // Patterns to detect file references + // 1. @mention: @filename.ext or @path/to/file + // 2. explicit paths: C:\path\file.ext or /path/to/file.ext + // 3. quoted filenames: "filename.ext" or 'filename.ext' + // 4. code-like references: `filename.ext` + + private static readonly Regex AtMentionPattern = new(@"@([\w./\\-]+\.\w+)", RegexOptions.Compiled); + private static readonly Regex AbsolutePathPattern = new(@"[A-Za-z]:\\[\w\\./\s-]+\.\w+|/[\w/.-]+\.\w+", RegexOptions.Compiled); + private static readonly Regex QuotedFilePattern = new(@"""([\w./\\-]+\.\w{1,10})""|'([\w./\\-]+\.\w{1,10})'", RegexOptions.Compiled); + private static readonly Regex BacktickFilePattern = new(@"`([\w./\\-]+\.\w{1,10})`", RegexOptions.Compiled); + + // Common code file extensions to match bare names + private static readonly HashSet CodeExtensions = new(StringComparer.OrdinalIgnoreCase) + { + ".cs", ".py", ".js", ".ts", ".tsx", ".jsx", ".java", ".cpp", ".c", ".h", ".go", + ".rs", ".rb", ".php", ".swift", ".kt", ".scala", ".dart", ".vue", ".svelte", + ".html", ".css", ".scss", ".json", ".xml", ".yaml", ".yml", ".toml", ".ini", + ".md", ".txt", ".sql", ".sh", ".bat", ".ps1", ".dockerfile", ".gitignore" + }; + + /// + /// 사용자 메시지에서 파일 참조를 추출합니다. + /// + /// 감지된 파일 경로/이름 목록 (중복 제거) + public static IReadOnlyList ExtractFileReferences(string userMessage) + { + if (string.IsNullOrWhiteSpace(userMessage)) return new List(); + + var found = new HashSet(StringComparer.OrdinalIgnoreCase); + + // @mention + foreach (Match m in AtMentionPattern.Matches(userMessage)) + found.Add(m.Groups[1].Value.TrimStart('@')); + + // absolute paths + foreach (Match m in AbsolutePathPattern.Matches(userMessage)) + found.Add(m.Value.Trim()); + + // quoted filenames + foreach (Match m in QuotedFilePattern.Matches(userMessage)) + { + var val = m.Groups[1].Success ? m.Groups[1].Value : m.Groups[2].Value; + if (!string.IsNullOrEmpty(val)) found.Add(val); + } + + // backtick references + foreach (Match m in BacktickFilePattern.Matches(userMessage)) + found.Add(m.Groups[1].Value); + + // filter: only keep entries with recognized extensions + return found.Where(f => { + var ext = System.IO.Path.GetExtension(f); + return CodeExtensions.Contains(ext); + }).ToList(); + } + + /// + /// 파일 참조가 실제 파일로 존재하는지 확인하고, 존재하면 내용 로드. + /// workFolder를 기준으로 상대 경로 해석. + /// + public static async Task> ResolveAndLoadAsync( + IEnumerable references, string workFolder, int maxFileSizeBytes = 32768) + { + var results = new List<(string, string)>(); + foreach (var reference in references) + { + try + { + // Try absolute first, then relative to workFolder + var fullPath = System.IO.Path.IsPathRooted(reference) + ? reference + : System.IO.Path.Combine(workFolder, reference); + + if (!System.IO.File.Exists(fullPath)) continue; + + var info = new System.IO.FileInfo(fullPath); + if (info.Length > maxFileSizeBytes) continue; // too large + + var content = await System.IO.File.ReadAllTextAsync(fullPath, System.Text.Encoding.UTF8); + results.Add((fullPath, content)); + } + catch (Exception) { } + } + return results; + } + + /// + /// 해결된 파일 내용을 시스템 프롬프트 주입용 텍스트로 빌드. + /// + public static string BuildContextInjection(IReadOnlyList<(string Path, string Content)> files) + { + if (files.Count == 0) return string.Empty; + var sb = new System.Text.StringBuilder("## 참조된 파일 컨텍스트\n\n"); + foreach (var (path, content) in files) + { + var name = System.IO.Path.GetFileName(path); + var ext = System.IO.Path.GetExtension(path).TrimStart('.').ToLowerInvariant(); + sb.AppendLine($"### `{name}`"); + sb.AppendLine($"```{ext}"); + // Truncate very large content + if (content.Length > 8000) + sb.AppendLine(content[..8000] + "\n... (이하 생략)"); + else + sb.AppendLine(content); + sb.AppendLine("```"); + sb.AppendLine(); + } + return sb.ToString(); + } +} diff --git a/src/AxCopilot/Services/Agent/AxMdIncludeResolver.cs b/src/AxCopilot/Services/Agent/AxMdIncludeResolver.cs new file mode 100644 index 0000000..475e253 --- /dev/null +++ b/src/AxCopilot/Services/Agent/AxMdIncludeResolver.cs @@ -0,0 +1,80 @@ +using System.IO; +using System.Text; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 17-E: AX.md 및 .ax/rules/*.md의 @파일경로 지시어를 재귀 해석. +/// 최대 5단계 깊이, 순환 참조 감지. +/// +public class AxMdIncludeResolver +{ + private const int MaxDepth = 5; + public const long OversizeWarningChars = 40_000; + + private static readonly Regex _includePattern = + new(@"^@(.+)$", RegexOptions.Multiline | RegexOptions.Compiled); + + /// @파일경로 지시어를 재귀 해석하여 최종 텍스트 반환. + public async Task ResolveAsync( + string content, + string basePath, + int depth = 0, + HashSet? visited = null) + { + if (depth >= MaxDepth) return content; + visited ??= new HashSet(StringComparer.OrdinalIgnoreCase); + + var lines = content.Split('\n'); + var result = new StringBuilder(); + + foreach (var line in lines) + { + var trimmed = line.TrimEnd('\r'); + var match = _includePattern.Match(trimmed); + + if (match.Success) + { + var includePath = match.Groups[1].Value.Trim(); + var fullPath = Path.IsPathRooted(includePath) + ? includePath + : Path.GetFullPath(Path.Combine(basePath, includePath)); + + if (visited.Contains(fullPath)) + { + result.AppendLine($""); + continue; + } + + if (!File.Exists(fullPath)) + { + result.AppendLine($""); + continue; + } + + visited.Add(fullPath); + var includedContent = await File.ReadAllTextAsync(fullPath, Encoding.UTF8); + + // 재귀 해석 + var resolved = await ResolveAsync( + includedContent, + Path.GetDirectoryName(fullPath) ?? basePath, + depth + 1, + visited); + + result.AppendLine(resolved); + visited.Remove(fullPath); // 병렬 포함 지원을 위해 방문 후 제거 + } + else + { + result.AppendLine(trimmed); + } + } + + return result.ToString(); + } + + /// 파일이 40,000자 임계값을 초과하는지 확인. + public static bool IsOversized(string content) => content.Length > OversizeWarningChars; +} diff --git a/src/AxCopilot/Services/Agent/BackgroundAgentService.cs b/src/AxCopilot/Services/Agent/BackgroundAgentService.cs new file mode 100644 index 0000000..2c86f31 --- /dev/null +++ b/src/AxCopilot/Services/Agent/BackgroundAgentService.cs @@ -0,0 +1,118 @@ +using System.Collections.Concurrent; +using System.IO; + +namespace AxCopilot.Services.Agent; + +public enum BackgroundAgentStatus { Pending, Running, Completed, Failed } + +public class BackgroundAgentTask +{ + public string Id { get; init; } = ""; + public string AgentType { get; init; } = ""; + public string Description { get; init; } = ""; + public string Context { get; init; } = ""; + public string WorkingDirectory { get; init; } = ""; + public BackgroundAgentStatus Status { get; set; } = BackgroundAgentStatus.Pending; + public string? Result { get; set; } + public string? Error { get; set; } + public DateTime StartedAt { get; init; } = DateTime.UtcNow; + public DateTime? CompletedAt { get; set; } +} + +public class AgentCompletedEventArgs : EventArgs +{ + public BackgroundAgentTask Task { get; init; } = null!; + public string? Result { get; init; } + public string? Error { get; init; } +} + +/// +/// Phase 18-A: 비동기 서브에이전트 실행 + 완료 알림. +/// 완료 시 AgentCompleted 이벤트 발화 → 트레이 알림 연결. +/// +public class BackgroundAgentService +{ + private const int MaxResultLength = 100_000; + private readonly ConcurrentDictionary _running = new(); + private readonly AgentTypeMemoryRepository _memoryRepo; + + /// 에이전트 완료 시 발화. UI 스레드에서 처리 주의. + public event EventHandler? AgentCompleted; + + public BackgroundAgentService(AgentTypeMemoryRepository memoryRepo) + { + _memoryRepo = memoryRepo; + } + + /// 백그라운드 에이전트 작업 시작. 즉시 반환, 완료 시 AgentCompleted 이벤트. + public string Start( + string agentType, + string description, + string context, + string workingDirectory, + Func> agentRunner, + CancellationToken ct = default) + { + var id = Guid.NewGuid().ToString("N")[..8]; + var task = new BackgroundAgentTask + { + Id = id, + AgentType = agentType, + Description = description, + Context = context, + WorkingDirectory = workingDirectory, + Status = BackgroundAgentStatus.Pending, + }; + _running[id] = task; + + _ = Task.Run(async () => + { + task.Status = BackgroundAgentStatus.Running; + try + { + // 에이전트 타입별 메모리 로드 + var memory = await _memoryRepo.LoadMemoryAsync(agentType); + var fullContext = string.IsNullOrEmpty(memory) + ? context + : context + $"\n\n## 이전 학습:\n{memory}"; + + var result = await agentRunner(agentType, description, fullContext, ct); + + // 결과 크기 제한 + if (result.Length > MaxResultLength) + result = result[..MaxResultLength] + "\n\n[결과가 100,000자를 초과하여 잘림]"; + + task.Result = result; + task.Status = BackgroundAgentStatus.Completed; + task.CompletedAt = DateTime.UtcNow; + + AgentCompleted?.Invoke(this, new AgentCompletedEventArgs + { + Task = task, Result = result + }); + } + catch (Exception ex) + { + task.Status = BackgroundAgentStatus.Failed; + task.Error = ex.Message; + task.CompletedAt = DateTime.UtcNow; + + AgentCompleted?.Invoke(this, new AgentCompletedEventArgs + { + Task = task, Error = ex.Message + }); + } + finally { _running.TryRemove(id, out _); } + }, ct); + + return id; + } + + /// 현재 실행 중인 에이전트 목록. + public IReadOnlyList GetActive() + => _running.Values.ToList(); + + /// 에이전트 ID로 상태 확인. + public BackgroundAgentTask? GetById(string id) + => _running.TryGetValue(id, out var t) ? t : null; +} diff --git a/src/AxCopilot/Services/Agent/Base64Tool.cs b/src/AxCopilot/Services/Agent/Base64Tool.cs new file mode 100644 index 0000000..fc9401d --- /dev/null +++ b/src/AxCopilot/Services/Agent/Base64Tool.cs @@ -0,0 +1,88 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// Base64/URL 인코딩·디코딩 도구. +public class Base64Tool : IAgentTool +{ + public string Name => "base64_tool"; + public string Description => + "Encode or decode Base64 and URL strings. Actions: " + + "'b64encode' — encode text to Base64; " + + "'b64decode' — decode Base64 to text; " + + "'urlencode' — URL-encode text; " + + "'urldecode' — URL-decode text; " + + "'b64file' — encode a file to Base64 (max 5MB)."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action to perform", + Enum = ["b64encode", "b64decode", "urlencode", "urldecode", "b64file"], + }, + ["text"] = new() + { + Type = "string", + Description = "Text to encode/decode", + }, + ["file_path"] = new() + { + Type = "string", + Description = "File path for b64file action", + }, + }, + Required = ["action"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + var text = args.TryGetProperty("text", out var t) ? t.GetString() ?? "" : ""; + + try + { + return Task.FromResult(action switch + { + "b64encode" => ToolResult.Ok(Convert.ToBase64String(Encoding.UTF8.GetBytes(text))), + "b64decode" => ToolResult.Ok(Encoding.UTF8.GetString(Convert.FromBase64String(text))), + "urlencode" => ToolResult.Ok(Uri.EscapeDataString(text)), + "urldecode" => ToolResult.Ok(Uri.UnescapeDataString(text)), + "b64file" => EncodeFile(args, context), + _ => ToolResult.Fail($"Unknown action: {action}"), + }); + } + catch (FormatException) + { + return Task.FromResult(ToolResult.Fail("Invalid Base64 string")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"오류: {ex.Message}")); + } + } + + private static ToolResult EncodeFile(JsonElement args, AgentContext context) + { + if (!args.TryGetProperty("file_path", out var fp)) + return ToolResult.Fail("'file_path' is required for b64file action"); + var path = fp.GetString() ?? ""; + if (!Path.IsPathRooted(path)) path = Path.Combine(context.WorkFolder, path); + if (!File.Exists(path)) return ToolResult.Fail($"File not found: {path}"); + + var info = new FileInfo(path); + if (info.Length > 5 * 1024 * 1024) + return ToolResult.Fail($"File too large ({info.Length / 1024}KB). Max 5MB."); + + var bytes = File.ReadAllBytes(path); + var b64 = Convert.ToBase64String(bytes); + if (b64.Length > 10000) + return ToolResult.Ok($"Base64 ({b64.Length} chars, first 500):\n{b64[..500]}..."); + return ToolResult.Ok(b64); + } +} diff --git a/src/AxCopilot/Services/Agent/BatchSkill.cs b/src/AxCopilot/Services/Agent/BatchSkill.cs new file mode 100644 index 0000000..6f63b81 --- /dev/null +++ b/src/AxCopilot/Services/Agent/BatchSkill.cs @@ -0,0 +1,99 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 배치파일(.bat) / PowerShell 스크립트(.ps1)를 생성하는 내장 스킬. +/// 파일 생성만 수행하며 자동 실행하지 않습니다. +/// 시스템 수준 명령(레지스트리, 서비스, 드라이버 등)은 차단합니다. +/// +public class BatchSkill : IAgentTool +{ + public string Name => "script_create"; + public string Description => "Create a batch (.bat) or PowerShell (.ps1) script file. The script is ONLY created, NOT executed. System-level commands are blocked."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Output file path (.bat or .ps1). Relative to work folder." }, + ["content"] = new() { Type = "string", Description = "Script content. Each line should have Korean comments explaining the command." }, + ["description"] = new() { Type = "string", Description = "Brief description of what this script does." }, + }, + Required = ["path", "content"] + }; + + // 시스템 수준 명령 차단 목록 + private static readonly string[] BlockedCommands = + [ + "reg ", "reg.exe", "regedit", + "sc ", "sc.exe", + "net stop", "net start", "net user", + "bcdedit", "diskpart", "format ", + "shutdown", "schtasks", + "wmic", "powercfg", + "Set-Service", "Stop-Service", "Start-Service", + "New-Service", "Remove-Service", + "Set-ItemProperty.*HKLM", "Set-ItemProperty.*HKCU", + "Remove-Item.*-Recurse.*-Force", + ]; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var content = args.GetProperty("content").GetString() ?? ""; + var desc = args.TryGetProperty("description", out var d) ? d.GetString() ?? "" : ""; + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (context.ActiveTab == "Cowork") fullPath = AgentContext.EnsureTimestampedPath(fullPath); + + // 확장자 검증 + var ext = Path.GetExtension(fullPath).ToLowerInvariant(); + if (ext != ".bat" && ext != ".ps1" && ext != ".cmd") + return ToolResult.Fail("지원하는 스크립트 형식: .bat, .cmd, .ps1"); + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + + // 시스템 명령 차단 검사 + var contentLower = content.ToLowerInvariant(); + foreach (var blocked in BlockedCommands) + { + if (contentLower.Contains(blocked.ToLowerInvariant())) + return ToolResult.Fail($"시스템 수준 명령이 포함되어 차단됨: {blocked.Trim()}"); + } + + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + try + { + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + // 파일 상단에 설명 주석 추가 + var sb = new StringBuilder(); + if (!string.IsNullOrEmpty(desc)) + { + var commentPrefix = ext == ".ps1" ? "#" : "REM"; + sb.AppendLine($"{commentPrefix} === {desc} ==="); + sb.AppendLine($"{commentPrefix} 이 스크립트는 AX Copilot에 의해 생성되었습니다."); + sb.AppendLine($"{commentPrefix} 실행 전 내용을 반드시 확인하세요."); + sb.AppendLine(); + } + sb.Append(content); + + await File.WriteAllTextAsync(fullPath, sb.ToString(), new UTF8Encoding(false), ct); + + return ToolResult.Ok( + $"스크립트 파일 생성 완료: {fullPath}\n형식: {ext}, 설명: {(string.IsNullOrEmpty(desc) ? "(없음)" : desc)}\n⚠ 자동 실행되지 않습니다. 내용을 확인한 후 직접 실행하세요.", + fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"스크립트 생성 실패: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/Agent/BuildRunTool.cs b/src/AxCopilot/Services/Agent/BuildRunTool.cs new file mode 100644 index 0000000..386189e --- /dev/null +++ b/src/AxCopilot/Services/Agent/BuildRunTool.cs @@ -0,0 +1,206 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 프로젝트 빌드/테스트 실행 도구. +/// 작업 폴더의 프로젝트 타입을 자동 감지하고 적절한 빌드/테스트 명령을 실행합니다. +/// 사내 환경에서 설치된 도구만 사용하며, 빌더를 직접 설치하지 않습니다. +/// +public class BuildRunTool : IAgentTool +{ + public string Name => "build_run"; + public string Description => + "Detect project type and run build/test commands. " + + "Supports: .NET (dotnet), Maven (mvn), Gradle, Node.js (npm), Python (pytest), CMake, Make. " + + "Actions: detect (show project type), build, test, run, custom (run arbitrary command with longer timeout)."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action to perform: detect, build, test, run, lint, format, custom", + Enum = ["detect", "build", "test", "run", "lint", "format", "custom"], + }, + ["command"] = new() + { + Type = "string", + Description = "Custom command to execute (required for action='custom')", + }, + ["project_path"] = new() + { + Type = "string", + Description = "Subdirectory within work folder (optional, defaults to work folder root)", + }, + }, + Required = ["action"] + }; + + // ProcessTool과 동일한 위험 명령 패턴 + private static readonly string[] DangerousPatterns = + [ + "format ", "del /s", "rd /s", "rmdir /s", "rm -rf", + "Remove-Item -Recurse -Force", + "Stop-Computer", "Restart-Computer", + "shutdown", "taskkill /f", + "reg delete", "reg add", + "net user", "net localgroup", + "schtasks /create", "schtasks /delete", + ]; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var action = args.GetProperty("action").GetString() ?? "detect"; + var customCmd = args.TryGetProperty("command", out var cmd) ? cmd.GetString() ?? "" : ""; + var subPath = args.TryGetProperty("project_path", out var pp) ? pp.GetString() ?? "" : ""; + + var workDir = context.WorkFolder; + if (!string.IsNullOrEmpty(subPath)) + workDir = Path.Combine(workDir, subPath); + + if (string.IsNullOrEmpty(workDir) || !Directory.Exists(workDir)) + return ToolResult.Fail($"작업 폴더가 유효하지 않습니다: {workDir}"); + + // 프로젝트 타입 감지 + var project = DetectProjectType(workDir); + + if (action == "detect") + { + if (project == null) + return ToolResult.Ok($"프로젝트 감지 실패: {workDir}\n알려진 프로젝트 마커 파일이 없습니다."); + return ToolResult.Ok( + $"프로젝트 감지 완료:\n" + + $" 타입: {project.Type}\n" + + $" 마커: {project.Marker}\n" + + $" 빌드: {project.BuildCommand}\n" + + $" 테스트: {project.TestCommand}\n" + + $" 실행: {project.RunCommand}\n" + + $" 린트: {(string.IsNullOrEmpty(project.LintCommand) ? "(미지원)" : project.LintCommand)}\n" + + $" 포맷: {(string.IsNullOrEmpty(project.FormatCommand) ? "(미지원)" : project.FormatCommand)}\n" + + $" 경로: {workDir}"); + } + + // 실행할 명령 결정 + string? command; + if (action == "custom") + { + if (string.IsNullOrWhiteSpace(customCmd)) + return ToolResult.Fail("custom 액션에는 command 파라미터가 필요합니다."); + command = customCmd; + } + else if (project == null) + { + return ToolResult.Fail("프로젝트 타입을 감지할 수 없습니다. action='custom'으로 직접 명령을 지정하세요."); + } + else + { + command = action switch + { + "build" => project.BuildCommand, + "test" => project.TestCommand, + "run" => project.RunCommand, + "lint" => string.IsNullOrEmpty(project.LintCommand) ? null : project.LintCommand, + "format" => string.IsNullOrEmpty(project.FormatCommand) ? null : project.FormatCommand, + _ => project.BuildCommand, + }; + if (command == null) + return ToolResult.Fail($"이 프로젝트 타입({project.Type})에서 '{action}' 작업은 지원되지 않습니다."); + } + + // 위험 명령 검사 + foreach (var pattern in DangerousPatterns) + { + if (command.Contains(pattern, StringComparison.OrdinalIgnoreCase)) + return ToolResult.Fail($"차단된 명령 패턴: {pattern}"); + } + + // 쓰기 권한 확인 + if (!await context.CheckWritePermissionAsync(Name, workDir)) + return ToolResult.Fail("빌드 실행 권한이 거부되었습니다."); + + // 명령 실행 (ProcessTool 패턴) + var timeout = context.Llm?.Code?.BuildTimeout ?? 120; + try + { + var psi = new ProcessStartInfo("cmd.exe", $"/C {command}") + { + WorkingDirectory = workDir, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + StandardErrorEncoding = Encoding.UTF8, + }; + + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(timeout)); + + using var proc = Process.Start(psi); + if (proc == null) return ToolResult.Fail("프로세스 시작 실패"); + + var stdoutTask = proc.StandardOutput.ReadToEndAsync(cts.Token); + var stderrTask = proc.StandardError.ReadToEndAsync(cts.Token); + + await proc.WaitForExitAsync(cts.Token); + var stdout = await stdoutTask; + var stderr = await stderrTask; + + // 출력 제한 (8000자) + if (stdout.Length > 8000) stdout = stdout[..8000] + "\n... (출력 잘림)"; + if (stderr.Length > 4000) stderr = stderr[..4000] + "\n... (출력 잘림)"; + + var sb = new StringBuilder(); + sb.AppendLine($"[{action}] {command}"); + sb.AppendLine($"[Exit code: {proc.ExitCode}]"); + if (!string.IsNullOrWhiteSpace(stdout)) sb.AppendLine(stdout); + if (!string.IsNullOrWhiteSpace(stderr)) sb.AppendLine($"[stderr]\n{stderr}"); + + return proc.ExitCode == 0 + ? ToolResult.Ok(sb.ToString()) + : ToolResult.Fail(sb.ToString()); + } + catch (OperationCanceledException) + { + return ToolResult.Fail($"빌드 타임아웃 ({timeout}초 초과): {command}"); + } + catch (Exception ex) + { + return ToolResult.Fail($"실행 오류: {ex.Message}"); + } + } + + private record ProjectInfo(string Type, string Marker, string BuildCommand, string TestCommand, string RunCommand, string LintCommand, string FormatCommand); + + private static ProjectInfo? DetectProjectType(string dir) + { + if (Directory.GetFiles(dir, "*.sln").Length > 0) + return new(".NET Solution", "*.sln", "dotnet build", "dotnet test", "dotnet run", "dotnet format --verify-no-changes", "dotnet format"); + if (Directory.GetFiles(dir, "*.csproj").Length > 0) + return new(".NET Project", "*.csproj", "dotnet build", "dotnet test", "dotnet run", "dotnet format --verify-no-changes", "dotnet format"); + if (File.Exists(Path.Combine(dir, "pom.xml"))) + return new("Maven", "pom.xml", "mvn compile", "mvn test", "mvn exec:java", "mvn checkstyle:check", ""); + if (Directory.GetFiles(dir, "build.gradle*").Length > 0) + return new("Gradle", "build.gradle", "gradle build", "gradle test", "gradle run", "gradle check", ""); + if (File.Exists(Path.Combine(dir, "package.json"))) + return new("Node.js", "package.json", "npm run build", "npm test", "npm start", "npx eslint .", "npx prettier --write ."); + if (File.Exists(Path.Combine(dir, "CMakeLists.txt"))) + return new("CMake", "CMakeLists.txt", "cmake --build build", "ctest --test-dir build", "", "", ""); + if (File.Exists(Path.Combine(dir, "pyproject.toml"))) + return new("Python (pyproject)", "pyproject.toml", "python -m build", "python -m pytest", "python -m", "python -m ruff check .", "python -m black ."); + if (File.Exists(Path.Combine(dir, "setup.py"))) + return new("Python (setup.py)", "setup.py", "python setup.py build", "python -m pytest", "python", "python -m ruff check .", "python -m black ."); + if (File.Exists(Path.Combine(dir, "Makefile"))) + return new("Make", "Makefile", "make", "make test", "make run", "make lint", "make format"); + if (Directory.GetFiles(dir, "*.py").Length > 0) + return new("Python Scripts", "*.py", "", "python -m pytest", "python", "python -m ruff check .", "python -m black ."); + + return null; + } +} diff --git a/src/AxCopilot/Services/Agent/ChartSkill.cs b/src/AxCopilot/Services/Agent/ChartSkill.cs new file mode 100644 index 0000000..28bae7d --- /dev/null +++ b/src/AxCopilot/Services/Agent/ChartSkill.cs @@ -0,0 +1,537 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// CSS/SVG 기반 차트를 HTML 파일로 생성하는 스킬. +/// bar, line, pie(donut), radar, area 차트를 지원하며 TemplateService 무드 스타일을 적용합니다. +/// +public class ChartSkill : IAgentTool +{ + public string Name => "chart_create"; + public string Description => + "Create a styled HTML chart document with CSS/SVG-based charts. " + + "Supports chart types: bar, horizontal_bar, stacked_bar, line, area, pie, donut, radar, progress, comparison. " + + "Multiple charts can be placed in one document using the 'charts' array. " + + "Applies design mood from TemplateService (modern, professional, creative, etc.)."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Output file path (.html). Relative to work folder." }, + ["title"] = new() { Type = "string", Description = "Document title" }, + ["charts"] = new() + { + Type = "array", + Description = "Array of chart objects. Each chart: " + + "{\"type\": \"bar|horizontal_bar|stacked_bar|line|area|pie|donut|radar|progress|comparison\", " + + "\"title\": \"Chart Title\", " + + "\"labels\": [\"A\",\"B\",\"C\"], " + + "\"datasets\": [{\"name\": \"Series1\", \"values\": [10,20,30], \"color\": \"#4B5EFC\"}], " + + "\"unit\": \"%\"}", + Items = new ToolProperty { Type = "object" }, + }, + ["mood"] = new() { Type = "string", Description = "Design mood: modern, professional, creative, dark, dashboard, etc. Default: dashboard" }, + ["layout"] = new() { Type = "string", Description = "Chart layout: 'single' (one per row) or 'grid' (2-column grid). Default: single" }, + }, + Required = ["path", "title", "charts"] + }; + + // 기본 차트 팔레트 + private static readonly string[] Palette = + [ + "#4B5EFC", "#10B981", "#F59E0B", "#EF4444", "#8B5CF6", + "#06B6D4", "#EC4899", "#84CC16", "#F97316", "#6366F1", + ]; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? "chart.html"; + var title = args.GetProperty("title").GetString() ?? "Chart"; + var mood = args.TryGetProperty("mood", out var m) ? m.GetString() ?? "dashboard" : "dashboard"; + var layout = args.TryGetProperty("layout", out var l) ? l.GetString() ?? "single" : "single"; + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (context.ActiveTab == "Cowork") fullPath = AgentContext.EnsureTimestampedPath(fullPath); + if (!fullPath.EndsWith(".html", StringComparison.OrdinalIgnoreCase)) + fullPath += ".html"; + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + if (!args.TryGetProperty("charts", out var chartsEl) || chartsEl.ValueKind != JsonValueKind.Array) + return ToolResult.Fail("charts 파라미터가 필요합니다 (배열 형식)."); + + var chartCount = chartsEl.GetArrayLength(); + var body = new StringBuilder(); + + body.AppendLine($"

      {Escape(title)}

      "); + + if (layout == "grid" && chartCount > 1) + body.AppendLine("
      "); + + int chartIdx = 0; + foreach (var chartEl in chartsEl.EnumerateArray()) + { + var chartHtml = RenderChart(chartEl, chartIdx); + body.AppendLine("
      "); + body.AppendLine(chartHtml); + body.AppendLine("
      "); + chartIdx++; + } + + if (layout == "grid" && chartCount > 1) + body.AppendLine("
      "); + + var css = TemplateService.GetCss(mood) + "\n" + ChartCss; + + var html = $@" + + + + +{Escape(title)} + + + +
      +{body} +
      + +"; + + await File.WriteAllTextAsync(fullPath, html, Encoding.UTF8, ct); + return ToolResult.Ok($"차트 문서 생성 완료: {fullPath} ({chartCount}개 차트)", fullPath); + } + + private string RenderChart(JsonElement chart, int idx) + { + var type = chart.TryGetProperty("type", out var t) ? t.GetString() ?? "bar" : "bar"; + var chartTitle = chart.TryGetProperty("title", out var ct) ? ct.GetString() ?? "" : ""; + var unit = chart.TryGetProperty("unit", out var u) ? u.GetString() ?? "" : ""; + var labels = ParseStringArray(chart, "labels"); + var datasets = ParseDatasets(chart); + + var sb = new StringBuilder(); + if (!string.IsNullOrEmpty(chartTitle)) + sb.AppendLine($"

      {Escape(chartTitle)}

      "); + + switch (type) + { + case "bar": + sb.Append(RenderBarChart(labels, datasets, unit, false)); + break; + case "horizontal_bar": + sb.Append(RenderBarChart(labels, datasets, unit, true)); + break; + case "stacked_bar": + sb.Append(RenderStackedBar(labels, datasets, unit)); + break; + case "line": + case "area": + sb.Append(RenderLineChart(labels, datasets, unit, type == "area")); + break; + case "pie": + case "donut": + sb.Append(RenderPieChart(labels, datasets, type == "donut")); + break; + case "progress": + sb.Append(RenderProgressChart(labels, datasets, unit)); + break; + case "comparison": + sb.Append(RenderComparisonChart(labels, datasets, unit)); + break; + case "radar": + sb.Append(RenderRadarChart(labels, datasets)); + break; + default: + sb.Append(RenderBarChart(labels, datasets, unit, false)); + break; + } + + // 범례 + if (datasets.Count > 1) + { + sb.AppendLine("
      "); + foreach (var ds in datasets) + sb.AppendLine($"{Escape(ds.Name)}"); + sb.AppendLine("
      "); + } + + return sb.ToString(); + } + + // ─── Bar Chart ─────────────────────────────────────────────────────── + + private static string RenderBarChart(List labels, List datasets, string unit, bool horizontal) + { + var maxVal = datasets.SelectMany(d => d.Values).DefaultIfEmpty(1).Max(); + if (maxVal <= 0) maxVal = 1; + var sb = new StringBuilder(); + + if (horizontal) + { + sb.AppendLine("
      "); + for (int i = 0; i < labels.Count; i++) + { + var val = datasets.Count > 0 && i < datasets[0].Values.Count ? datasets[0].Values[i] : 0; + var pct = (int)(val / maxVal * 100); + var color = datasets.Count > 0 ? datasets[0].Color : Palette[0]; + sb.AppendLine($"
      {Escape(labels[i])}"); + sb.AppendLine($"
      "); + sb.AppendLine($"{val:G}{unit}
      "); + } + sb.AppendLine("
      "); + } + else + { + sb.AppendLine("
      "); + sb.AppendLine("
      "); + for (int i = 0; i < labels.Count; i++) + { + sb.AppendLine("
      "); + foreach (var ds in datasets) + { + var val = i < ds.Values.Count ? ds.Values[i] : 0; + var pct = (int)(val / maxVal * 100); + sb.AppendLine($"
      "); + } + sb.AppendLine($"
      {Escape(labels[i])}
      "); + sb.AppendLine("
      "); + } + sb.AppendLine("
      "); + } + + return sb.ToString(); + } + + // ─── Stacked Bar ───────────────────────────────────────────────────── + + private static string RenderStackedBar(List labels, List datasets, string unit) + { + var sb = new StringBuilder(); + sb.AppendLine("
      "); + for (int i = 0; i < labels.Count; i++) + { + var total = datasets.Sum(ds => i < ds.Values.Count ? ds.Values[i] : 0); + sb.AppendLine($"
      {Escape(labels[i])}"); + sb.AppendLine("
      "); + foreach (var ds in datasets) + { + var val = i < ds.Values.Count ? ds.Values[i] : 0; + var pct = total > 0 ? (int)(val / total * 100) : 0; + sb.AppendLine($"
      "); + } + sb.AppendLine($"
      {total:G}{unit}
      "); + } + sb.AppendLine("
      "); + return sb.ToString(); + } + + // ─── Line / Area Chart (SVG) ───────────────────────────────────────── + + private static string RenderLineChart(List labels, List datasets, string unit, bool isArea) + { + var allVals = datasets.SelectMany(d => d.Values).ToList(); + var maxVal = allVals.DefaultIfEmpty(1).Max(); + var minVal = allVals.DefaultIfEmpty(0).Min(); + if (maxVal <= minVal) maxVal = minVal + 1; + + int w = 600, h = 300, padL = 50, padR = 20, padT = 20, padB = 40; + var chartW = w - padL - padR; + var chartH = h - padT - padB; + var n = labels.Count; + + var sb = new StringBuilder(); + sb.AppendLine($""); + + // Y축 그리드 + for (int i = 0; i <= 4; i++) + { + var y = padT + chartH - (chartH * i / 4.0); + var val = minVal + (maxVal - minVal) * i / 4.0; + sb.AppendLine($""); + sb.AppendLine($"{val:G3}{unit}"); + } + + // X축 라벨 + for (int i = 0; i < n; i++) + { + var x = padL + (n > 1 ? chartW * i / (double)(n - 1) : chartW / 2.0); + sb.AppendLine($"{Escape(labels[i])}"); + } + + // 데이터셋 + foreach (var ds in datasets) + { + var points = new List<(double x, double y)>(); + for (int i = 0; i < Math.Min(n, ds.Values.Count); i++) + { + var x = padL + (n > 1 ? chartW * i / (double)(n - 1) : chartW / 2.0); + var y = padT + chartH - ((ds.Values[i] - minVal) / (maxVal - minVal) * chartH); + points.Add((x, y)); + } + + var pathData = string.Join(" ", points.Select((p, i) => $"{(i == 0 ? "M" : "L")}{p.x:F1},{p.y:F1}")); + + if (isArea && points.Count > 1) + { + var areaPath = pathData + $" L{points.Last().x:F1},{padT + chartH} L{points.First().x:F1},{padT + chartH} Z"; + sb.AppendLine($""); + } + + sb.AppendLine($""); + + // 데이터 포인트 + foreach (var (px, py) in points) + sb.AppendLine($""); + } + + sb.AppendLine(""); + return sb.ToString(); + } + + // ─── Pie / Donut Chart (SVG) ───────────────────────────────────────── + + private static string RenderPieChart(List labels, List datasets, bool isDonut) + { + var values = datasets.Count > 0 ? datasets[0].Values : new List(); + var total = values.Sum(); + if (total <= 0) total = 1; + + int cx = 150, cy = 150, r = 120; + var sb = new StringBuilder(); + sb.AppendLine($"
      "); + sb.AppendLine($""); + + double startAngle = -90; + for (int i = 0; i < Math.Min(values.Count, labels.Count); i++) + { + var pct = values[i] / total; + var angle = pct * 360; + var endAngle = startAngle + angle; + + var x1 = cx + r * Math.Cos(startAngle * Math.PI / 180); + var y1 = cy + r * Math.Sin(startAngle * Math.PI / 180); + var x2 = cx + r * Math.Cos(endAngle * Math.PI / 180); + var y2 = cy + r * Math.Sin(endAngle * Math.PI / 180); + var largeArc = angle > 180 ? 1 : 0; + + var color = i < Palette.Length ? Palette[i] : Palette[i % Palette.Length]; + sb.AppendLine($""); + startAngle = endAngle; + } + + if (isDonut) + sb.AppendLine($""); + + sb.AppendLine(""); + + // 범례 + sb.AppendLine("
      "); + for (int i = 0; i < Math.Min(values.Count, labels.Count); i++) + { + var color = i < Palette.Length ? Palette[i] : Palette[i % Palette.Length]; + var pct = values[i] / total * 100; + sb.AppendLine($"
      {Escape(labels[i])} ({pct:F1}%)
      "); + } + sb.AppendLine("
      "); + + return sb.ToString(); + } + + // ─── Progress Chart ────────────────────────────────────────────────── + + private static string RenderProgressChart(List labels, List datasets, string unit) + { + var values = datasets.Count > 0 ? datasets[0].Values : new List(); + var sb = new StringBuilder(); + for (int i = 0; i < Math.Min(labels.Count, values.Count); i++) + { + var pct = Math.Clamp(values[i], 0, 100); + var color = i < Palette.Length ? Palette[i] : Palette[i % Palette.Length]; + if (datasets.Count > 0 && !string.IsNullOrEmpty(datasets[0].Color)) + color = datasets[0].Color; + sb.AppendLine($"
      {Escape(labels[i])}{values[i]:G}{unit}
      "); + sb.AppendLine($"
      "); + } + return sb.ToString(); + } + + // ─── Comparison Chart ──────────────────────────────────────────────── + + private static string RenderComparisonChart(List labels, List datasets, string unit) + { + var sb = new StringBuilder(); + sb.AppendLine(""); + sb.AppendLine(""); + foreach (var ds in datasets) + sb.AppendLine($""); + sb.AppendLine(""); + for (int i = 0; i < labels.Count; i++) + { + sb.Append($""); + foreach (var ds in datasets) + { + var val = i < ds.Values.Count ? ds.Values[i] : 0; + sb.Append($""); + } + sb.AppendLine(""); + } + sb.AppendLine("
      항목{Escape(ds.Name)}
      {Escape(labels[i])}{val:G}{unit}
      "); + return sb.ToString(); + } + + // ─── Radar Chart (SVG) ─────────────────────────────────────────────── + + private static string RenderRadarChart(List labels, List datasets) + { + int cx = 150, cy = 150, r = 110; + var n = labels.Count; + if (n < 3) return "

      레이더 차트는 최소 3개 항목이 필요합니다.

      "; + + var sb = new StringBuilder(); + sb.AppendLine($""); + + // 그리드 + for (int level = 1; level <= 4; level++) + { + var lr = r * level / 4.0; + var points = string.Join(" ", Enumerable.Range(0, n).Select(i => + { + var angle = (360.0 / n * i - 90) * Math.PI / 180; + return $"{cx + lr * Math.Cos(angle):F1},{cy + lr * Math.Sin(angle):F1}"; + })); + sb.AppendLine($""); + } + + // 축선 + 라벨 + for (int i = 0; i < n; i++) + { + var angle = (360.0 / n * i - 90) * Math.PI / 180; + var x = cx + r * Math.Cos(angle); + var y = cy + r * Math.Sin(angle); + sb.AppendLine($""); + var lx = cx + (r + 16) * Math.Cos(angle); + var ly = cy + (r + 16) * Math.Sin(angle); + sb.AppendLine($"{Escape(labels[i])}"); + } + + // 데이터 + var maxVal = datasets.SelectMany(d => d.Values).DefaultIfEmpty(1).Max(); + if (maxVal <= 0) maxVal = 1; + foreach (var ds in datasets) + { + var points = string.Join(" ", Enumerable.Range(0, n).Select(i => + { + var val = i < ds.Values.Count ? ds.Values[i] : 0; + var dr = r * val / maxVal; + var angle = (360.0 / n * i - 90) * Math.PI / 180; + return $"{cx + dr * Math.Cos(angle):F1},{cy + dr * Math.Sin(angle):F1}"; + })); + sb.AppendLine($""); + } + + sb.AppendLine(""); + return sb.ToString(); + } + + // ─── Helpers ───────────────────────────────────────────────────────── + + private static List ParseStringArray(JsonElement parent, string prop) + { + if (!parent.TryGetProperty(prop, out var arr) || arr.ValueKind != JsonValueKind.Array) + return new(); + return arr.EnumerateArray().Select(e => e.GetString() ?? "").ToList(); + } + + private List ParseDatasets(JsonElement chart) + { + if (!chart.TryGetProperty("datasets", out var dsArr) || dsArr.ValueKind != JsonValueKind.Array) + { + // datasets 없으면 values 배열에서 단일 데이터셋 생성 + if (chart.TryGetProperty("values", out var vals) && vals.ValueKind == JsonValueKind.Array) + { + return new() + { + new Dataset + { + Name = "Data", + Values = vals.EnumerateArray().Select(v => v.TryGetDouble(out var d) ? d : 0).ToList(), + Color = Palette[0], + } + }; + } + return new(); + } + + var list = new List(); + int colorIdx = 0; + foreach (var ds in dsArr.EnumerateArray()) + { + var name = ds.TryGetProperty("name", out var n) ? n.GetString() ?? $"Series{colorIdx + 1}" : $"Series{colorIdx + 1}"; + var color = ds.TryGetProperty("color", out var c) ? c.GetString() ?? Palette[colorIdx % Palette.Length] : Palette[colorIdx % Palette.Length]; + var values = new List(); + if (ds.TryGetProperty("values", out var v) && v.ValueKind == JsonValueKind.Array) + values = v.EnumerateArray().Select(e => e.TryGetDouble(out var d) ? d : 0).ToList(); + list.Add(new Dataset { Name = name, Values = values, Color = color }); + colorIdx++; + } + return list; + } + + private static string Escape(string s) => + s.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("\"", """); + + private static string FormatSize(long bytes) => + bytes switch { < 1024 => $"{bytes}B", < 1048576 => $"{bytes / 1024.0:F1}KB", _ => $"{bytes / 1048576.0:F1}MB" }; + + private sealed class Dataset + { + public string Name { get; init; } = ""; + public List Values { get; init; } = new(); + public string Color { get; init; } = "#4B5EFC"; + } + + // ─── Chart CSS ─────────────────────────────────────────────────────── + + private const string ChartCss = @" +/* Vertical Bar Chart */ +.vbar-chart { margin: 16px 0; } +.vbar-bars { display: flex; align-items: flex-end; gap: 8px; height: 220px; padding: 0 8px; border-bottom: 2px solid #E5E7EB; } +.vbar-group { flex: 1; display: flex; gap: 3px; align-items: flex-end; position: relative; } +.vbar-bar { flex: 1; min-width: 18px; border-radius: 4px 4px 0 0; transition: opacity 0.2s; cursor: default; } +.vbar-bar:hover { opacity: 0.8; } +.vbar-label { text-align: center; font-size: 11px; color: #6B7280; margin-top: 6px; position: absolute; bottom: -24px; left: 0; right: 0; } + +/* Horizontal Bar Chart */ +.hbar-chart { margin: 12px 0; } +.hbar-row { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; } +.hbar-label { min-width: 80px; text-align: right; font-size: 12px; color: #374151; font-weight: 500; } +.hbar-track { flex: 1; height: 22px; background: #F3F4F6; border-radius: 6px; overflow: hidden; } +.hbar-fill { height: 100%; border-radius: 6px; transition: width 0.6s ease; } +.hbar-value { min-width: 50px; font-size: 12px; color: #6B7280; font-weight: 600; } + +/* Line/Area Chart */ +.line-chart-svg { width: 100%; max-width: 600px; height: auto; } + +/* Legend */ +.chart-legend { display: flex; gap: 16px; flex-wrap: wrap; margin-top: 12px; padding-top: 8px; border-top: 1px solid #F3F4F6; } +.legend-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #374151; } +.legend-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; } + +/* Pie Legend */ +.pie-legend { display: flex; flex-direction: column; gap: 6px; } +.pie-legend-item { display: flex; align-items: center; gap: 8px; font-size: 13px; color: #374151; } +"; +} diff --git a/src/AxCopilot/Services/Agent/CheckpointTool.cs b/src/AxCopilot/Services/Agent/CheckpointTool.cs new file mode 100644 index 0000000..0fe1338 --- /dev/null +++ b/src/AxCopilot/Services/Agent/CheckpointTool.cs @@ -0,0 +1,384 @@ +using System.IO; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 파일 시스템 체크포인트(스냅샷)를 생성/복원/삭제하는 도구. +/// 작업 폴더의 텍스트 파일을 .ax/checkpoints/ 에 백업하여 undo/rollback을 지원합니다. +/// +public class CheckpointTool : IAgentTool +{ + public string Name => "checkpoint"; + + public string Description => + "Create, list, or restore file system checkpoints for undo/rollback. " + + "Checkpoints capture text files in the working folder as snapshots. " + + "- action=\"create\": Create a new checkpoint (name optional)\n" + + "- action=\"list\": List all checkpoints\n" + + "- action=\"restore\": Restore files from a checkpoint (id or name required, requires user approval)\n" + + "- action=\"delete\": Delete a checkpoint (id required)"; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "create | list | restore | delete", + Enum = ["create", "list", "restore", "delete"], + }, + ["name"] = new() + { + Type = "string", + Description = "Checkpoint name (for create/restore)", + }, + ["id"] = new() + { + Type = "integer", + Description = "Checkpoint ID (for restore/delete)", + }, + }, + Required = ["action"], + }; + + private const int MaxCheckpoints = 10; + private const long MaxFileSize = 5 * 1024 * 1024; // 5MB + + private static readonly HashSet SkipDirs = new(StringComparer.OrdinalIgnoreCase) + { + "bin", "obj", "node_modules", ".git", ".vs", ".ax", "packages", + "Debug", "Release", "TestResults", ".idea", "__pycache__", + }; + + private static readonly HashSet TextExtensions = new(StringComparer.OrdinalIgnoreCase) + { + ".cs", ".py", ".js", ".ts", ".java", ".cpp", ".c", ".h", ".hpp", + ".xml", ".json", ".yaml", ".yml", ".md", ".txt", ".csv", ".html", ".htm", + ".css", ".sql", ".sh", ".bat", ".ps1", ".config", ".ini", ".xaml", + ".csproj", ".sln", ".props", ".targets", ".editorconfig", ".gitignore", + ".tsx", ".jsx", ".vue", ".svelte", ".scss", ".less", ".toml", ".env", + ".razor", ".proto", ".graphql", ".rs", ".go", ".rb", ".php", ".swift", + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + if (!args.TryGetProperty("action", out var actionEl)) + return ToolResult.Fail("action이 필요합니다."); + var action = actionEl.GetString() ?? ""; + + if (string.IsNullOrEmpty(context.WorkFolder)) + return ToolResult.Fail("작업 폴더가 설정되지 않았습니다."); + + var checkpointDir = Path.Combine(context.WorkFolder, ".ax", "checkpoints"); + + return action switch + { + "create" => await CreateCheckpoint(args, context, checkpointDir, ct), + "list" => ListCheckpoints(checkpointDir), + "restore" => await RestoreCheckpoint(args, context, checkpointDir, ct), + "delete" => DeleteCheckpoint(args, checkpointDir), + _ => ToolResult.Fail($"알 수 없는 액션: {action}. create | list | restore | delete 중 선택하세요."), + }; + } + + private async Task CreateCheckpoint(JsonElement args, AgentContext context, string checkpointDir, CancellationToken ct) + { + var name = args.TryGetProperty("name", out var n) ? n.GetString() ?? "unnamed" : "unnamed"; + // 이름에서 파일 시스템 비안전 문자 제거 + name = string.Join("_", name.Split(Path.GetInvalidFileNameChars())); + + var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); + var folderName = $"{timestamp}_{name}"; + var cpDir = Path.Combine(checkpointDir, folderName); + + try + { + Directory.CreateDirectory(cpDir); + + // 추적 대상 텍스트 파일 수집 + var files = CollectTextFiles(context.WorkFolder); + if (files.Count == 0) + return ToolResult.Fail("체크포인트할 텍스트 파일이 없습니다."); + + var manifest = new CheckpointManifest + { + Name = name, + CreatedAt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + WorkFolder = context.WorkFolder, + Files = [], + }; + + foreach (var file in files) + { + ct.ThrowIfCancellationRequested(); + + var relativePath = Path.GetRelativePath(context.WorkFolder, file); + var destPath = Path.Combine(cpDir, relativePath); + var destDir = Path.GetDirectoryName(destPath); + if (!string.IsNullOrEmpty(destDir) && !Directory.Exists(destDir)) + Directory.CreateDirectory(destDir); + + await CopyFileAsync(file, destPath, ct); + + // SHA256 해시 계산 + var hash = await ComputeHashAsync(file, ct); + manifest.Files.Add(new FileEntry { Path = relativePath, Hash = hash }); + } + + // manifest.json 저장 + var manifestJson = JsonSerializer.Serialize(manifest, new JsonSerializerOptions + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }); + await File.WriteAllTextAsync(Path.Combine(cpDir, "manifest.json"), manifestJson, ct); + + // 최대 개수 초과 시 가장 오래된 체크포인트 삭제 + CleanupOldCheckpoints(checkpointDir); + + return ToolResult.Ok($"체크포인트 생성 완료: {folderName}\n파일 수: {manifest.Files.Count}"); + } + catch (Exception ex) + { + return ToolResult.Fail($"체크포인트 생성 오류: {ex.Message}"); + } + } + + private static ToolResult ListCheckpoints(string checkpointDir) + { + if (!Directory.Exists(checkpointDir)) + return ToolResult.Ok("저장된 체크포인트가 없습니다."); + + var dirs = Directory.GetDirectories(checkpointDir) + .OrderByDescending(d => d) + .ToList(); + + if (dirs.Count == 0) + return ToolResult.Ok("저장된 체크포인트가 없습니다."); + + var sb = new StringBuilder(); + sb.AppendLine($"체크포인트 {dirs.Count}개:"); + for (var i = 0; i < dirs.Count; i++) + { + var dirName = Path.GetFileName(dirs[i]); + var manifestPath = Path.Combine(dirs[i], "manifest.json"); + var fileCount = 0; + var createdAt = ""; + + if (File.Exists(manifestPath)) + { + try + { + var json = File.ReadAllText(manifestPath); + var manifest = JsonSerializer.Deserialize(json); + fileCount = manifest?.Files.Count ?? 0; + createdAt = manifest?.CreatedAt ?? ""; + } + catch (Exception) { /* manifest 읽기 실패 무시 */ } + } + + sb.AppendLine($" [{i}] {dirName} — 파일 {fileCount}개{(string.IsNullOrEmpty(createdAt) ? "" : $", {createdAt}")}"); + } + + return ToolResult.Ok(sb.ToString()); + } + + private async Task RestoreCheckpoint(JsonElement args, AgentContext context, string checkpointDir, CancellationToken ct) + { + if (!Directory.Exists(checkpointDir)) + return ToolResult.Fail("저장된 체크포인트가 없습니다."); + + var dirs = Directory.GetDirectories(checkpointDir) + .OrderByDescending(d => d) + .ToList(); + + if (dirs.Count == 0) + return ToolResult.Fail("저장된 체크포인트가 없습니다."); + + // ID 또는 이름으로 체크포인트 찾기 + string? targetDir = null; + + if (args.TryGetProperty("id", out var idEl)) + { + var id = idEl.ValueKind == JsonValueKind.Number ? idEl.GetInt32() : int.TryParse(idEl.GetString(), out var parsed) ? parsed : -1; + if (id >= 0 && id < dirs.Count) + targetDir = dirs[id]; + } + + if (targetDir == null && args.TryGetProperty("name", out var nameEl)) + { + var name = nameEl.GetString() ?? ""; + targetDir = dirs.FirstOrDefault(d => Path.GetFileName(d).Contains(name, StringComparison.OrdinalIgnoreCase)); + } + + if (targetDir == null) + return ToolResult.Fail("체크포인트를 찾을 수 없습니다. id 또는 name을 확인하세요."); + + // 사용자 승인 요청 + if (context.AskPermission != null) + { + var approved = await context.AskPermission("checkpoint_restore", $"체크포인트 복원: {Path.GetFileName(targetDir)}"); + if (!approved) + return ToolResult.Ok("사용자가 복원을 거부했습니다."); + } + + try + { + var manifestPath = Path.Combine(targetDir, "manifest.json"); + if (!File.Exists(manifestPath)) + return ToolResult.Fail("체크포인트 매니페스트를 찾을 수 없습니다."); + + var manifestJson = await File.ReadAllTextAsync(manifestPath, ct); + var manifest = JsonSerializer.Deserialize(manifestJson); + if (manifest == null) + return ToolResult.Fail("매니페스트 파싱 오류"); + + var restoredCount = 0; + foreach (var entry in manifest.Files) + { + ct.ThrowIfCancellationRequested(); + + var srcPath = Path.Combine(targetDir, entry.Path); + var destPath = Path.Combine(context.WorkFolder, entry.Path); + + if (!File.Exists(srcPath)) continue; + + var destDir = Path.GetDirectoryName(destPath); + if (!string.IsNullOrEmpty(destDir) && !Directory.Exists(destDir)) + Directory.CreateDirectory(destDir); + + await CopyFileAsync(srcPath, destPath, ct); + restoredCount++; + } + + return ToolResult.Ok($"체크포인트 복원 완료: {Path.GetFileName(targetDir)}\n복원 파일 수: {restoredCount}/{manifest.Files.Count}"); + } + catch (Exception ex) + { + return ToolResult.Fail($"체크포인트 복원 오류: {ex.Message}"); + } + } + + private static ToolResult DeleteCheckpoint(JsonElement args, string checkpointDir) + { + if (!Directory.Exists(checkpointDir)) + return ToolResult.Fail("저장된 체크포인트가 없습니다."); + + var dirs = Directory.GetDirectories(checkpointDir) + .OrderByDescending(d => d) + .ToList(); + + if (!args.TryGetProperty("id", out var idEl)) + return ToolResult.Fail("삭제할 체크포인트 id가 필요합니다."); + + var id = idEl.ValueKind == JsonValueKind.Number ? idEl.GetInt32() : int.TryParse(idEl.GetString(), out var parsed) ? parsed : -1; + if (id < 0 || id >= dirs.Count) + return ToolResult.Fail($"잘못된 체크포인트 ID: {id}. 0~{dirs.Count - 1} 범위를 사용하세요."); + + try + { + var target = dirs[id]; + var name = Path.GetFileName(target); + Directory.Delete(target, recursive: true); + return ToolResult.Ok($"체크포인트 삭제됨: {name}"); + } + catch (Exception ex) + { + return ToolResult.Fail($"체크포인트 삭제 오류: {ex.Message}"); + } + } + + #region Helpers + + private List CollectTextFiles(string workFolder) + { + var files = new List(); + CollectFilesRecursive(workFolder, workFolder, files); + return files; + } + + private void CollectFilesRecursive(string dir, string rootDir, List files) + { + var dirName = Path.GetFileName(dir); + if (dir != rootDir && SkipDirs.Contains(dirName)) + return; + + try + { + foreach (var file in Directory.GetFiles(dir)) + { + var ext = Path.GetExtension(file); + if (!TextExtensions.Contains(ext)) continue; + + var fi = new FileInfo(file); + if (fi.Length > MaxFileSize) continue; + + files.Add(file); + } + + foreach (var subDir in Directory.GetDirectories(dir)) + CollectFilesRecursive(subDir, rootDir, files); + } + catch (UnauthorizedAccessException) { /* 접근 불가 디렉토리 무시 */ } + } + + private static async Task CopyFileAsync(string src, string dest, CancellationToken ct) + { + var buffer = new byte[81920]; + await using var srcStream = new FileStream(src, FileMode.Open, FileAccess.Read, FileShare.Read, buffer.Length, useAsync: true); + await using var destStream = new FileStream(dest, FileMode.Create, FileAccess.Write, FileShare.None, buffer.Length, useAsync: true); + int bytesRead; + while ((bytesRead = await srcStream.ReadAsync(buffer, ct)) > 0) + await destStream.WriteAsync(buffer.AsMemory(0, bytesRead), ct); + } + + private static async Task ComputeHashAsync(string filePath, CancellationToken ct) + { + using var sha256 = SHA256.Create(); + await using var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 81920, useAsync: true); + var hash = await sha256.ComputeHashAsync(stream, ct); + return Convert.ToHexString(hash).ToLowerInvariant(); + } + + private static void CleanupOldCheckpoints(string checkpointDir) + { + if (!Directory.Exists(checkpointDir)) return; + var dirs = Directory.GetDirectories(checkpointDir) + .OrderBy(d => d) + .ToList(); + + while (dirs.Count > MaxCheckpoints) + { + try + { + Directory.Delete(dirs[0], recursive: true); + dirs.RemoveAt(0); + } + catch (Exception) { break; } + } + } + + #endregion + + #region Models + + private class CheckpointManifest + { + public string Name { get; set; } = ""; + public string CreatedAt { get; set; } = ""; + public string WorkFolder { get; set; } = ""; + public List Files { get; set; } = []; + } + + private class FileEntry + { + public string Path { get; set; } = ""; + public string Hash { get; set; } = ""; + } + + #endregion +} diff --git a/src/AxCopilot/Services/Agent/ClipboardTool.cs b/src/AxCopilot/Services/Agent/ClipboardTool.cs new file mode 100644 index 0000000..3a95abd --- /dev/null +++ b/src/AxCopilot/Services/Agent/ClipboardTool.cs @@ -0,0 +1,90 @@ +using System.Text.Json; +using System.Windows; + +namespace AxCopilot.Services.Agent; + +/// +/// Windows 클립보드 읽기·쓰기 도구. +/// 에이전트가 클립보드를 통해 데이터를 주고받을 수 있게 합니다. +/// +public class ClipboardTool : IAgentTool +{ + public string Name => "clipboard_tool"; + public string Description => + "Read or write the Windows clipboard. Actions: " + + "'read' — get current clipboard text content; " + + "'write' — set clipboard text content; " + + "'has_text' — check if clipboard contains text; " + + "'has_image' — check if clipboard contains an image."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action to perform", + Enum = ["read", "write", "has_text", "has_image"], + }, + ["text"] = new() + { + Type = "string", + Description = "Text to write to clipboard (required for 'write' action)", + }, + }, + Required = ["action"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + + try + { + // 클립보드는 STA 스레드에서만 접근 가능 + ToolResult? result = null; + Application.Current.Dispatcher.Invoke(() => + { + result = action switch + { + "read" => ReadClipboard(), + "write" => WriteClipboard(args), + "has_text" => ToolResult.Ok(Clipboard.ContainsText() ? "true" : "false"), + "has_image" => ToolResult.Ok(Clipboard.ContainsImage() ? "true" : "false"), + _ => ToolResult.Fail($"Unknown action: {action}"), + }; + }); + return Task.FromResult(result ?? ToolResult.Fail("클립보드 접근 실패")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"클립보드 오류: {ex.Message}")); + } + } + + private static ToolResult ReadClipboard() + { + if (!Clipboard.ContainsText()) + return ToolResult.Ok("(clipboard is empty or contains non-text data)"); + + var text = Clipboard.GetText(); + if (string.IsNullOrEmpty(text)) + return ToolResult.Ok("(empty)"); + + if (text.Length > 10000) + return ToolResult.Ok(text[..10000] + $"\n\n... (truncated, total {text.Length} chars)"); + + return ToolResult.Ok(text); + } + + private static ToolResult WriteClipboard(JsonElement args) + { + if (!args.TryGetProperty("text", out var textProp)) + return ToolResult.Fail("'text' parameter is required for write action"); + + var text = textProp.GetString() ?? ""; + Clipboard.SetText(text); + return ToolResult.Ok($"✓ Clipboard updated ({text.Length} chars)"); + } +} diff --git a/src/AxCopilot/Services/Agent/CodeReviewTool.cs b/src/AxCopilot/Services/Agent/CodeReviewTool.cs new file mode 100644 index 0000000..6b8367b --- /dev/null +++ b/src/AxCopilot/Services/Agent/CodeReviewTool.cs @@ -0,0 +1,428 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// AI 코드 리뷰 도구. +/// Git diff 분석, 파일 정적 검사, PR 요약 생성을 지원합니다. +/// LLM이 구조화된 분석 결과를 바탕으로 상세한 리뷰를 작성합니다. +/// +public class CodeReviewTool : IAgentTool +{ + public string Name => "code_review"; + + public string Description => + "코드 리뷰를 수행합니다. Git diff 분석, 파일 정적 검사, PR 요약을 생성합니다.\n" + + "action별 기능:\n" + + "- diff_review: git diff 출력을 분석하여 이슈/개선점을 구조화\n" + + "- file_review: 특정 파일의 코드 품질을 정적 검사\n" + + "- pr_summary: 변경사항을 PR 설명 형식으로 요약"; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new ToolProperty + { + Type = "string", + Description = "리뷰 유형: diff_review (diff 분석), file_review (파일 검사), pr_summary (PR 요약)", + Enum = ["diff_review", "file_review", "pr_summary"] + }, + ["target"] = new ToolProperty + { + Type = "string", + Description = "대상 지정. diff_review: '--staged' 또는 빈값(working tree). file_review: 파일 경로. pr_summary: 브랜치명(선택)." + }, + ["focus"] = new ToolProperty + { + Type = "string", + Description = "리뷰 초점: all (전체), bugs (버그), performance (성능), security (보안), style (스타일). 기본 all.", + Enum = ["all", "bugs", "performance", "security", "style"] + }, + }, + Required = ["action"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + if (!(context.Llm?.Code?.EnableCodeReview ?? true)) + return ToolResult.Ok("코드 리뷰가 비활성 상태입니다. 설정 → AX Agent → 코드에서 활성화하세요."); + + var action = args.TryGetProperty("action", out var a) ? a.GetString() ?? "" : ""; + var target = args.TryGetProperty("target", out var t) ? t.GetString() ?? "" : ""; + var focus = args.TryGetProperty("focus", out var f) ? f.GetString() ?? "all" : "all"; + + if (string.IsNullOrEmpty(context.WorkFolder)) + return ToolResult.Fail("작업 폴더가 설정되어 있지 않습니다."); + + return action switch + { + "diff_review" => await DiffReviewAsync(context, target, focus, ct), + "file_review" => await FileReviewAsync(context, target, focus, ct), + "pr_summary" => await PrSummaryAsync(context, target, ct), + _ => ToolResult.Fail($"지원하지 않는 action: {action}. diff_review, file_review, pr_summary 중 선택하세요.") + }; + } + + // ─── diff_review ───────────────────────────────────────────────────────── + + private async Task DiffReviewAsync(AgentContext ctx, string target, string focus, CancellationToken ct) + { + var diffArgs = string.IsNullOrEmpty(target) ? "diff" : $"diff {target}"; + var diffResult = await RunGitAsync(ctx.WorkFolder, diffArgs, ct); + if (diffResult == null) return ToolResult.Fail("Git을 찾을 수 없습니다."); + if (string.IsNullOrWhiteSpace(diffResult)) + return ToolResult.Ok("변경사항이 없습니다. (clean working tree)"); + + // diff 파싱 + var files = ParseDiffFiles(diffResult); + var sb = new StringBuilder(); + sb.AppendLine("═══ Code Review Report (diff_review) ═══\n"); + + // 통계 + int totalAdded = 0, totalRemoved = 0; + foreach (var file in files) + { + totalAdded += file.Added; + totalRemoved += file.Removed; + } + sb.AppendLine($"📊 파일 {files.Count}개 변경 | +{totalAdded} 추가 -{totalRemoved} 삭제\n"); + sb.AppendLine($"🔍 리뷰 초점: {focus}\n"); + + foreach (var file in files) + { + sb.AppendLine($"─── {file.Path} ({file.Status}) ───"); + sb.AppendLine($" 변경: +{file.Added} -{file.Removed}"); + + // 정적 패턴 검사 + var issues = AnalyzeDiffHunks(file.Hunks, focus); + if (issues.Count > 0) + { + foreach (var issue in issues) + sb.AppendLine($" [{issue.Severity}] Line {issue.Line}: {issue.Message}"); + } + else + { + sb.AppendLine(" [OK] 정적 검사에서 특이사항 없음"); + } + sb.AppendLine(); + } + + sb.AppendLine("═══ 위 분석 결과를 바탕으로 상세한 코드 리뷰를 작성하세요. ═══"); + return ToolResult.Ok(sb.ToString()); + } + + // ─── file_review ───────────────────────────────────────────────────────── + + private async Task FileReviewAsync(AgentContext ctx, string target, string focus, CancellationToken ct) + { + if (string.IsNullOrEmpty(target)) + return ToolResult.Fail("file_review에는 target(파일 경로)이 필요합니다."); + + var fullPath = Path.IsPathRooted(target) ? target : Path.Combine(ctx.WorkFolder, target); + if (!File.Exists(fullPath)) + return ToolResult.Fail($"파일을 찾을 수 없습니다: {target}"); + if (!ctx.IsPathAllowed(fullPath)) + return ToolResult.Fail($"접근이 차단된 경로입니다: {target}"); + + var content = await File.ReadAllTextAsync(fullPath, ct); + var lines = content.Split('\n'); + + var sb = new StringBuilder(); + sb.AppendLine($"═══ Code Review Report (file_review) ═══\n"); + sb.AppendLine($"📁 파일: {target}"); + sb.AppendLine($"📏 {lines.Length}줄 | 🔍 초점: {focus}\n"); + + var issues = AnalyzeFile(lines, focus); + + if (issues.Count > 0) + { + sb.AppendLine($"⚠️ 발견된 이슈 {issues.Count}개:\n"); + foreach (var issue in issues) + sb.AppendLine($" [{issue.Severity}] Line {issue.Line}: {issue.Message}"); + } + else + { + sb.AppendLine("✅ 정적 검사에서 특이사항 없음"); + } + + // 파일 앞부분 제공 (LLM이 상세 리뷰할 수 있도록) + sb.AppendLine($"\n─── 파일 내용 (처음 200줄) ───"); + var preview = string.Join('\n', lines.Take(200)); + sb.AppendLine(preview); + if (lines.Length > 200) + sb.AppendLine($"\n... ({lines.Length - 200}줄 생략)"); + + sb.AppendLine("\n═══ 위 분석 결과와 코드를 바탕으로 상세한 리뷰를 작성하세요. ═══"); + return ToolResult.Ok(sb.ToString()); + } + + // ─── pr_summary ────────────────────────────────────────────────────────── + + private async Task PrSummaryAsync(AgentContext ctx, string target, CancellationToken ct) + { + var sb = new StringBuilder(); + sb.AppendLine("═══ PR Summary Data ═══\n"); + + // git log + var logArgs = string.IsNullOrEmpty(target) + ? "log --oneline -20" + : $"log --oneline {target}..HEAD"; + var log = await RunGitAsync(ctx.WorkFolder, logArgs, ct); + if (!string.IsNullOrWhiteSpace(log)) + { + sb.AppendLine("📋 커밋 이력:"); + sb.AppendLine(log); + sb.AppendLine(); + } + + // git diff --stat + var statArgs = string.IsNullOrEmpty(target) ? "diff --stat" : $"diff --stat {target}..HEAD"; + var stat = await RunGitAsync(ctx.WorkFolder, statArgs, ct); + if (!string.IsNullOrWhiteSpace(stat)) + { + sb.AppendLine("📊 변경 통계:"); + sb.AppendLine(stat); + sb.AppendLine(); + } + + // git status + var status = await RunGitAsync(ctx.WorkFolder, "status --short", ct); + if (!string.IsNullOrWhiteSpace(status)) + { + sb.AppendLine("📁 현재 상태:"); + sb.AppendLine(status); + sb.AppendLine(); + } + + sb.AppendLine("═══ 위 데이터를 바탕으로 PR 제목과 설명(Summary, Changes, Test Plan)을 작성하세요. ═══"); + return ToolResult.Ok(sb.ToString()); + } + + // ─── 정적 분석 ────────────────────────────────────────────────────────── + + private static List AnalyzeDiffHunks(List hunks, string focus) + { + var issues = new List(); + int lineNum = 0; + + foreach (var line in hunks) + { + // @@ -a,b +c,d @@ 에서 라인 번호 추출 + var hunkMatch = Regex.Match(line, @"@@ -\d+(?:,\d+)? \+(\d+)"); + if (hunkMatch.Success) + { + lineNum = int.Parse(hunkMatch.Groups[1].Value); + continue; + } + + if (!line.StartsWith('+') || line.StartsWith("+++")) continue; + lineNum++; + + var content = line[1..]; + + if (focus is "all" or "bugs") + { + if (Regex.IsMatch(content, @"catch\s*\{?\s*\}")) + issues.Add(new(lineNum, "WARNING", "빈 catch 블록 — 예외가 무시됩니다")); + if (Regex.IsMatch(content, @"\.Result\b|\.Wait\(\)")) + issues.Add(new(lineNum, "WARNING", "동기 대기 (.Result/.Wait()) — 데드락 위험")); + if (Regex.IsMatch(content, @"==\s*null") && content.Contains('.')) + issues.Add(new(lineNum, "INFO", "null 비교 — null 조건 연산자(?.) 사용 검토")); + } + + if (focus is "all" or "security") + { + if (Regex.IsMatch(content, @"(password|secret|token|api_?key)\s*=\s*""[^""]+""", RegexOptions.IgnoreCase)) + issues.Add(new(lineNum, "CRITICAL", "하드코딩된 비밀번호/키 감지")); + if (Regex.IsMatch(content, @"(TODO|FIXME|HACK|XXX)\b", RegexOptions.IgnoreCase)) + issues.Add(new(lineNum, "INFO", $"TODO/FIXME 마커 발견: {content.Trim()}")); + } + + if (focus is "all" or "performance") + { + if (Regex.IsMatch(content, @"new\s+List<.*>\(\).*\.Add\(") || Regex.IsMatch(content, @"\.ToList\(\).*\.Where\(")) + issues.Add(new(lineNum, "INFO", "불필요한 컬렉션 할당 가능성")); + if (Regex.IsMatch(content, @"string\s*\+\s*=|"".*""\s*\+\s*""")) + issues.Add(new(lineNum, "INFO", "문자열 연결 — StringBuilder 사용 검토")); + } + + if (focus is "all" or "style") + { + if (content.Length > 150) + issues.Add(new(lineNum, "STYLE", $"긴 라인 ({content.Length}자) — 가독성 저하")); + } + } + + return issues; + } + + private static List AnalyzeFile(string[] lines, string focus) + { + var issues = new List(); + + // 메서드 길이 추정 (중괄호 카운팅) + int braceDepth = 0, methodStart = 0; + bool inMethod = false; + + for (int i = 0; i < lines.Length; i++) + { + var line = lines[i]; + var lineNum = i + 1; + var trimmed = line.TrimStart(); + + // 메서드 시작 감지 (간단 휴리스틱) + if (Regex.IsMatch(trimmed, @"(public|private|protected|internal|static|async|override)\s+.*\(.*\)\s*\{?\s*$") && !trimmed.Contains(';')) + { + inMethod = true; + methodStart = lineNum; + } + + if (trimmed.Contains('{')) braceDepth++; + if (trimmed.Contains('}')) + { + braceDepth--; + if (inMethod && braceDepth <= 1) + { + var methodLen = lineNum - methodStart; + if (methodLen > 60 && (focus is "all" or "style")) + issues.Add(new(methodStart, "STYLE", $"긴 메서드 ({methodLen}줄) — 분할 검토")); + inMethod = false; + } + } + + if (focus is "all" or "bugs") + { + if (Regex.IsMatch(trimmed, @"catch\s*(\(\s*Exception)?\s*\)?\s*\{\s*\}")) + issues.Add(new(lineNum, "WARNING", "빈 catch 블록")); + if (Regex.IsMatch(trimmed, @"\.Result\b|\.Wait\(\)")) + issues.Add(new(lineNum, "WARNING", "동기 대기 (.Result/.Wait()) — 데드락 위험")); + } + + if (focus is "all" or "security") + { + if (Regex.IsMatch(trimmed, @"(password|secret|token|api_?key)\s*=\s*""[^""]+""", RegexOptions.IgnoreCase)) + issues.Add(new(lineNum, "CRITICAL", "하드코딩된 비밀번호/키")); + if (Regex.IsMatch(trimmed, @"(TODO|FIXME|HACK|XXX)\b", RegexOptions.IgnoreCase)) + issues.Add(new(lineNum, "INFO", $"마커: {trimmed.Trim()}")); + } + + if (focus is "all" or "performance") + { + if (Regex.IsMatch(trimmed, @"string\s*\+\s*=")) + issues.Add(new(lineNum, "INFO", "루프 내 문자열 연결 — StringBuilder 검토")); + } + + if (focus is "all" or "style") + { + if (line.Length > 150) + issues.Add(new(lineNum, "STYLE", $"긴 라인 ({line.Length}자)")); + } + } + + // 파일 전체 크기 + if (lines.Length > 500 && (focus is "all" or "style")) + issues.Add(new(1, "STYLE", $"큰 파일 ({lines.Length}줄) — 클래스 분할 검토")); + + return issues; + } + + // ─── Git 실행 헬퍼 ────────────────────────────────────────────────────── + + private static async Task RunGitAsync(string workDir, string args, CancellationToken ct) + { + var gitPath = FindGit(); + if (gitPath == null) return null; + + try + { + var psi = new ProcessStartInfo(gitPath, args) + { + WorkingDirectory = workDir, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + StandardErrorEncoding = Encoding.UTF8, + }; + + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(30)); + + using var proc = Process.Start(psi); + if (proc == null) return null; + + var stdout = await proc.StandardOutput.ReadToEndAsync(cts.Token); + await proc.WaitForExitAsync(cts.Token); + + return stdout.Length > 12000 ? stdout[..12000] + "\n... (출력 잘림)" : stdout; + } + catch (Exception) { return null; } + } + + private static string? FindGit() + { + var paths = new[] { "git", @"C:\Program Files\Git\bin\git.exe", @"C:\Program Files (x86)\Git\bin\git.exe" }; + foreach (var p in paths) + { + try + { + var psi = new ProcessStartInfo(p, "--version") + { RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; + using var proc = Process.Start(psi); + proc?.WaitForExit(3000); + if (proc?.ExitCode == 0) return p; + } + catch (Exception) { } + } + return null; + } + + // ─── Diff 파서 ────────────────────────────────────────────────────────── + + private static List ParseDiffFiles(string diff) + { + var files = new List(); + DiffFile? current = null; + + foreach (var line in diff.Split('\n')) + { + if (line.StartsWith("diff --git")) + { + current = new DiffFile(); + files.Add(current); + // "diff --git a/path b/path" → path 추출 + var parts = line.Split(" b/"); + current.Path = parts.Length > 1 ? parts[1].Trim() : line; + } + else if (current != null) + { + if (line.StartsWith("new file")) current.Status = "added"; + else if (line.StartsWith("deleted file")) current.Status = "deleted"; + else if (line.StartsWith("@@") || line.StartsWith("+") || line.StartsWith("-")) + { + current.Hunks.Add(line); + if (line.StartsWith("+") && !line.StartsWith("+++")) current.Added++; + if (line.StartsWith("-") && !line.StartsWith("---")) current.Removed++; + } + } + } + return files; + } + + private class DiffFile + { + public string Path { get; set; } = ""; + public string Status { get; set; } = "modified"; + public int Added { get; set; } + public int Removed { get; set; } + public List Hunks { get; } = new(); + } + + private record ReviewIssue(int Line, string Severity, string Message); +} diff --git a/src/AxCopilot/Services/Agent/CodeSearchTool.cs b/src/AxCopilot/Services/Agent/CodeSearchTool.cs new file mode 100644 index 0000000..e103c67 --- /dev/null +++ b/src/AxCopilot/Services/Agent/CodeSearchTool.cs @@ -0,0 +1,107 @@ +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 코드베이스 시맨틱 검색 도구. +/// 프로젝트 파일을 TF-IDF로 인덱싱하고, 자연어 질문으로 관련 코드를 찾습니다. +/// SQLite에 인덱스를 영속 저장하여 증분 업데이트와 빠른 재시작을 지원합니다. +/// +public class CodeSearchTool : IAgentTool +{ + public string Name => "search_codebase"; + + public string Description => + "코드베이스를 시맨틱 검색합니다. 자연어 질문으로 관련 있는 코드를 찾습니다.\n" + + "예: '사용자 인증 로직', '데이터베이스 연결 설정', '에러 핸들링 패턴'\n" + + "인덱스는 영속 저장되어 변경된 파일만 증분 업데이트합니다."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["query"] = new ToolProperty + { + Type = "string", + Description = "검색할 내용 (자연어 또는 키워드)" + }, + ["max_results"] = new ToolProperty + { + Type = "integer", + Description = "최대 결과 수 (기본 5)" + }, + ["reindex"] = new ToolProperty + { + Type = "boolean", + Description = "true면 기존 인덱스를 버리고 전체 재인덱싱 (기본 false)" + }, + }, + Required = new() { "query" } + }; + + private static CodeIndexService? _indexService; + private static string _lastWorkFolder = ""; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + // 설정 체크 + if (!(context.Llm?.Code?.EnableCodeIndex ?? true)) + return ToolResult.Ok("코드 시맨틱 검색이 비활성 상태입니다. 설정 → AX Agent → 코드에서 활성화하세요."); + + var query = args.TryGetProperty("query", out var q) ? q.GetString() ?? "" : ""; + var maxResults = args.TryGetProperty("max_results", out var m) ? m.GetInt32() : 5; + var reindex = args.TryGetProperty("reindex", out var ri) && ri.GetBoolean(); + + if (string.IsNullOrWhiteSpace(query)) + return ToolResult.Fail("query가 필요합니다."); + + if (string.IsNullOrEmpty(context.WorkFolder)) + return ToolResult.Fail("작업 폴더가 설정되어 있지 않습니다."); + + // 작업 폴더가 바뀌면 인덱스 서비스 재생성 + if (_indexService == null || _lastWorkFolder != context.WorkFolder || reindex) + { + _indexService?.Dispose(); + _indexService = new CodeIndexService(); + _lastWorkFolder = context.WorkFolder; + + // 기존 sqlite 인덱스 로드 시도 (앱 재시작 시 즉시 사용 가능) + if (!reindex) + _indexService.TryLoadExisting(context.WorkFolder); + } + + // 증분 인덱싱 (신규/변경 파일만 처리) + if (!_indexService.IsIndexed || reindex) + { + await _indexService.IndexAsync(context.WorkFolder, ct); + if (!_indexService.IsIndexed) + return ToolResult.Fail("코드 인덱싱에 실패했습니다."); + } + + var results = _indexService.Search(query, maxResults); + if (results.Count == 0) + return ToolResult.Ok($"'{query}'에 대한 관련 코드를 찾지 못했습니다. 다른 키워드로 검색해보세요."); + + var sb = new StringBuilder(); + sb.AppendLine($"'{query}' 검색 결과 ({results.Count}개, 인덱스 {_indexService.ChunkCount}개 청크):\n"); + foreach (var r in results) + { + sb.AppendLine($"📁 {r.FilePath} (line {r.StartLine}-{r.EndLine}, score {r.Score:F3})"); + sb.AppendLine("```"); + sb.AppendLine(r.Preview); + sb.AppendLine("```"); + sb.AppendLine(); + } + + return ToolResult.Ok(sb.ToString()); + } + + /// 인덱스를 강제 재빌드합니다. + public static void InvalidateIndex() + { + _indexService?.Dispose(); + _indexService = null; + _lastWorkFolder = ""; + } +} diff --git a/src/AxCopilot/Services/Agent/CompoundCommandParser.cs b/src/AxCopilot/Services/Agent/CompoundCommandParser.cs new file mode 100644 index 0000000..9678604 --- /dev/null +++ b/src/AxCopilot/Services/Agent/CompoundCommandParser.cs @@ -0,0 +1,131 @@ +using System.Text; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 19-B-EXT: 복합 Bash 명령 파서. +/// &&, ||, ;, | 로 연결된 복합 명령을 서브커맨드로 분리합니다. +/// 각 서브커맨드를 독립적으로 권한 검사하여, 하나라도 차단되면 전체를 차단합니다. +/// +public static class CompoundCommandParser +{ + /// + /// 복합 명령을 서브커맨드 목록으로 분리합니다. + /// 따옴표, 서브셸 내부는 분리하지 않습니다. + /// + public static IReadOnlyList Parse(string command) + { + if (string.IsNullOrWhiteSpace(command)) + return Array.Empty(); + + var result = new List(); + var current = new StringBuilder(); + var inSingleQuote = false; + var inDoubleQuote = false; + var parenDepth = 0; + + for (var i = 0; i < command.Length; i++) + { + var ch = command[i]; + var next = i + 1 < command.Length ? command[i + 1] : '\0'; + + // 따옴표 토글 + if (ch == '\'' && !inDoubleQuote) { inSingleQuote = !inSingleQuote; current.Append(ch); continue; } + if (ch == '"' && !inSingleQuote) { inDoubleQuote = !inDoubleQuote; current.Append(ch); continue; } + + // 서브셸 괄호 추적 + if (!inSingleQuote && !inDoubleQuote) + { + if (ch == '(') parenDepth++; + if (ch == ')' && parenDepth > 0) parenDepth--; + } + + // 분리자 검출 (따옴표/서브셸 밖에서만) + if (!inSingleQuote && !inDoubleQuote && parenDepth == 0) + { + // && 또는 || + if ((ch == '&' && next == '&') || (ch == '|' && next == '|')) + { + FlushCurrent(result, current); + i++; // 두 글자 연산자 건너뜀 + continue; + } + + // ; (세미콜��) + if (ch == ';') + { + FlushCurrent(result, current); + continue; + } + + // | (파이프 — 단독 |만, || 아닌 경우) + if (ch == '|' && next != '|') + { + FlushCurrent(result, current); + continue; + } + } + + current.Append(ch); + } + + FlushCurrent(result, current); + return result; + } + + /// + /// 복합 명령의 각 서브커맨드를 독립 권한 검사합니다. + /// 하나라도 Deny면 전체 Deny. 모두 Allow면 Allow. 그 외 Ask. + /// + public static PermissionDecision EvaluateCompound( + string command, + Func evaluateSingle) + { + var subCommands = Parse(command); + if (subCommands.Count == 0) return PermissionDecision.Ask; + + var allAllow = true; + foreach (var sub in subCommands) + { + var decision = evaluateSingle(sub.Trim()); + if (decision == PermissionDecision.Deny) + return PermissionDecision.Deny; + if (decision != PermissionDecision.Allow) + allAllow = false; + } + + return allAllow ? PermissionDecision.Allow : PermissionDecision.Ask; + } + + /// 항상 에스컬레이션(차단 후보)되는 위험 패턴 목���. + public static readonly string[] DangerousPatterns = + { + "rm -rf /", + "chmod 777", + "> ~/.bashrc", + "> ~/.zshrc", + ".claude/", + ".git/config", + ".git/hooks", + "sed -i", + }; + + /// 명령이 위험 패턴에 해당하는지 확인합니다. + public static bool IsDangerousCommand(string command) + { + foreach (var pattern in DangerousPatterns) + { + if (command.Contains(pattern, StringComparison.OrdinalIgnoreCase)) + return true; + } + return false; + } + + private static void FlushCurrent(List result, StringBuilder current) + { + var trimmed = current.ToString().Trim(); + if (trimmed.Length > 0) + result.Add(trimmed); + current.Clear(); + } +} diff --git a/src/AxCopilot/Services/Agent/ContextCondenser.cs b/src/AxCopilot/Services/Agent/ContextCondenser.cs new file mode 100644 index 0000000..4165974 --- /dev/null +++ b/src/AxCopilot/Services/Agent/ContextCondenser.cs @@ -0,0 +1,243 @@ +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent; + +/// +/// 컨텍스트 윈도우 관리: 대화가 길어지면 이전 메시지를 요약하여 압축합니다. +/// MemGPT/OpenHands의 LLMSummarizingCondenser 패턴을 경량 구현. +/// +/// 2단계 압축 전략: +/// 1단계 — 도구 결과 자르기: 대용량 tool_result 출력을 핵심만 남기고 축약 (LLM 호출 없음) +/// 2단계 — 이전 대화 요약: 오래된 메시지를 LLM으로 요약하여 교체 (LLM 1회 호출) +/// +public static class ContextCondenser +{ + /// 도구 결과 1개당 최대 유지 길이 (자) + private const int MaxToolResultChars = 1500; + + /// 요약 시 유지할 최근 메시지 수 + private const int RecentKeepCount = 6; + + /// 모델별 입력 토큰 한도 (대략). 정확한 값은 중요하지 않음 — 안전 마진으로 70% 적용. + private static int GetModelInputLimit(string service, string model) + { + var key = $"{service}:{model}".ToLowerInvariant(); + return key switch + { + _ when key.Contains("claude") => 180_000, // Claude 200K + _ when key.Contains("gemini-2.5") => 900_000, // Gemini 1M + _ when key.Contains("gemini-2.0") => 900_000, + _ when key.Contains("gemini") => 900_000, + _ when key.Contains("gpt-4") => 120_000, // GPT-4 128K + _ => 16_000, // Ollama/vLLM 로컬 모델 기본값 + }; + } + + /// + /// 메시지 목록의 토큰이 모델 한도에 근접하면 자동 압축합니다. + /// 1단계: 도구 결과 축약 (빠르고 LLM 호출 없음) + /// 2단계: 이전 대화 LLM 요약 (토큰이 여전히 높으면) + /// + public static async Task CondenseIfNeededAsync( + List messages, LlmService llm, int maxOutputTokens, CancellationToken ct = default) + { + if (messages.Count < 6) return false; + + // 현재 모델의 입력 토큰 한도 + var settings = llm.GetCurrentModelInfo(); + var inputLimit = GetModelInputLimit(settings.service, settings.model); + var threshold = (int)(inputLimit * 0.65); // 65%에서 압축 시작 + + var currentTokens = TokenEstimator.EstimateMessages(messages); + if (currentTokens < threshold) return false; + + bool didCompress = false; + + // ── 1단계: 도구 결과 축약 (LLM 호출 없음, 즉시 실행) ── + didCompress |= TruncateToolResults(messages); + + // 1단계 후 다시 추정 + currentTokens = TokenEstimator.EstimateMessages(messages); + if (currentTokens < threshold) return didCompress; + + // ── 2단계: 이전 대화 LLM 요약 ── + didCompress |= await SummarizeOldMessagesAsync(messages, llm, ct); + + if (didCompress) + { + var afterTokens = TokenEstimator.EstimateMessages(messages); + LogService.Info($"Context Condenser: {currentTokens} → {afterTokens} 토큰 (절감 {currentTokens - afterTokens})"); + } + + return didCompress; + } + + /// + /// 1단계: 대용량 도구 결과를 축약합니다. + /// tool_result JSON이나 긴 파일 내용 등을 핵심만 남기고 자릅니다. + /// + private static bool TruncateToolResults(List messages) + { + bool truncated = false; + + // 최근 RecentKeepCount개는 건드리지 않음 (방금 실행한 도구 결과는 유지) + var cutoff = Math.Max(0, messages.Count - RecentKeepCount); + + for (int i = 0; i < cutoff; i++) + { + var msg = messages[i]; + if (msg.Content == null) continue; + + // tool_result 메시지의 대용량 출력 축약 + if (msg.Content.StartsWith("{\"type\":\"tool_result\"") && msg.Content.Length > MaxToolResultChars) + { + // JSON 구조를 유지하되 output 부분만 축약 + messages[i] = new ChatMessage + { + Role = msg.Role, + Content = TruncateToolResultJson(msg.Content), + Timestamp = msg.Timestamp, + }; + truncated = true; + } + // assistant의 도구 호출 블록 내 긴 텍스트도 축약 + else if (msg.Role == "assistant" && msg.Content.Length > MaxToolResultChars * 2 && + msg.Content.StartsWith("{\"_tool_use_blocks\"")) + { + // 도구 호출 구조는 유지, 텍스트 블록만 축약 + if (msg.Content.Length > MaxToolResultChars * 3) + { + messages[i] = new ChatMessage + { + Role = msg.Role, + Content = msg.Content[..(MaxToolResultChars * 2)] + "...[축약됨]\"]}", + Timestamp = msg.Timestamp, + }; + truncated = true; + } + } + // 일반 assistant/user 메시지 중 비정상적으로 긴 것 (예: 파일 내용 전체 붙여넣기) + else if (msg.Content.Length > MaxToolResultChars * 3 && msg.Role != "system") + { + messages[i] = new ChatMessage + { + Role = msg.Role, + Content = msg.Content[..MaxToolResultChars] + "\n\n...[이전 내용 축약됨 — 원본 " + + $"{msg.Content.Length:N0}자 중 {MaxToolResultChars:N0}자 유지]", + Timestamp = msg.Timestamp, + }; + truncated = true; + } + } + + return truncated; + } + + /// tool_result JSON 내의 output 값을 축약합니다. + private static string TruncateToolResultJson(string json) + { + // 간단한 문자열 처리로 output 부분만 축약 (JSON 파서 없이) + const string marker = "\"output\":\""; + var idx = json.IndexOf(marker, StringComparison.Ordinal); + if (idx < 0) return json[..Math.Min(json.Length, MaxToolResultChars)] + "...[축약됨]}"; + + var outputStart = idx + marker.Length; + // output 끝 찾기 (이스케이프된 따옴표 고려) + var outputEnd = outputStart; + while (outputEnd < json.Length) + { + if (json[outputEnd] == '\\') { outputEnd += 2; continue; } + if (json[outputEnd] == '"') break; + outputEnd++; + } + + var outputLen = outputEnd - outputStart; + if (outputLen <= MaxToolResultChars) return json; // 이미 짧음 + + // 앞부분 + "...[축약됨]" + 뒷부분 + var keepLen = MaxToolResultChars / 2; + var prefix = json[..outputStart]; + var outputText = json[outputStart..outputEnd]; + var suffix = json[outputEnd..]; + + return prefix + + outputText[..keepLen] + + "\\n...[축약됨: " + $"{outputLen:N0}" + "자 중 " + $"{MaxToolResultChars:N0}" + "자 유지]\\n" + + outputText[^keepLen..] + + suffix; + } + + /// + /// 2단계: 오래된 메시지를 LLM으로 요약합니다. + /// 시스템 메시지 + 최근 N개는 유지하고, 나머지를 요약으로 교체합니다. + /// + private static async Task SummarizeOldMessagesAsync( + List messages, LlmService llm, CancellationToken ct) + { + var systemMsg = messages.FirstOrDefault(m => m.Role == "system"); + var systemCount = systemMsg != null ? 1 : 0; + var nonSystemMessages = messages.Where(m => m.Role != "system").ToList(); + + var keepCount = Math.Min(RecentKeepCount, nonSystemMessages.Count); + var recentMessages = nonSystemMessages.Skip(nonSystemMessages.Count - keepCount).ToList(); + var oldMessages = nonSystemMessages.Take(nonSystemMessages.Count - keepCount).ToList(); + + if (oldMessages.Count < 3) return false; + + // 요약 대상 텍스트 구성 + var sb = new System.Text.StringBuilder(); + sb.AppendLine("다음 대화 기록을 간결하게 요약하세요."); + sb.AppendLine("반드시 유지할 정보: 사용자 요청, 핵심 결정 사항, 생성/수정된 파일 경로, 작업 진행 상황, 중요한 결과."); + sb.AppendLine("제거할 정보: 도구 실행의 상세 출력, 반복되는 내용, 중간 사고 과정."); + sb.AppendLine("요약은 대화와 동일한 언어로 작성하세요. 글머리 기호(-)로 핵심 사항만 나열하세요.\n---"); + + foreach (var m in oldMessages) + { + var content = m.Content ?? ""; + if (content.StartsWith("{\"_tool_use_blocks\"")) + content = "[도구 호출]"; + else if (content.StartsWith("{\"type\":\"tool_result\"")) + content = "[도구 결과]"; + else if (content.Length > 300) + content = content[..300] + "..."; + + sb.AppendLine($"[{m.Role}]: {content}"); + } + + try + { + var summaryMessages = new List + { + new() { Role = "user", Content = sb.ToString() } + }; + + var summary = await llm.SendAsync(summaryMessages, ct); + if (string.IsNullOrEmpty(summary)) return false; + + // 메시지 재구성: system + 요약 + 최근 메시지 + messages.Clear(); + if (systemMsg != null) messages.Add(systemMsg); + + messages.Add(new ChatMessage + { + Role = "user", + Content = $"[이전 대화 요약 — {oldMessages.Count}개 메시지 압축]\n{summary}", + Timestamp = DateTime.Now, + }); + messages.Add(new ChatMessage + { + Role = "assistant", + Content = "이전 대화 내용을 확인했습니다. 이어서 작업하겠습니다.", + Timestamp = DateTime.Now, + }); + + messages.AddRange(recentMessages); + return true; + } + catch (Exception ex) + { + LogService.Warn($"Context Condenser 요약 실패: {ex.Message}"); + return false; + } + } +} diff --git a/src/AxCopilot/Services/Agent/CoordinatorPlan.cs b/src/AxCopilot/Services/Agent/CoordinatorPlan.cs new file mode 100644 index 0000000..8bd37e1 --- /dev/null +++ b/src/AxCopilot/Services/Agent/CoordinatorPlan.cs @@ -0,0 +1,39 @@ +using System.Text.Json.Serialization; + +namespace AxCopilot.Services.Agent; + +/// Phase 18-A: 코디네이터 에이전트 실행 계획. +public class CoordinatorPlan +{ + [JsonPropertyName("original_request")] + public string OriginalRequest { get; init; } = ""; + + [JsonPropertyName("tasks")] + public List Tasks { get; init; } = new(); +} + +public enum SubTaskStatus { Pending, Running, Completed, Failed } + +public class CoordinatorSubTask +{ + [JsonPropertyName("id")] + public string Id { get; set; } = Guid.NewGuid().ToString("N")[..6]; + + [JsonPropertyName("agent_type")] + public string AgentType { get; set; } = "implementer"; + + [JsonPropertyName("description")] + public string Description { get; set; } = ""; + + [JsonPropertyName("dependencies")] + public List Dependencies { get; set; } = new(); // 선행 SubTask Id 목록 + + [JsonIgnore] + public SubTaskStatus Status { get; set; } = SubTaskStatus.Pending; + + [JsonIgnore] + public string? Result { get; set; } + + [JsonIgnore] + public string? Error { get; set; } +} diff --git a/src/AxCopilot/Services/Agent/CsvSkill.cs b/src/AxCopilot/Services/Agent/CsvSkill.cs new file mode 100644 index 0000000..bd7f5d3 --- /dev/null +++ b/src/AxCopilot/Services/Agent/CsvSkill.cs @@ -0,0 +1,93 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// CSV (.csv) 파일을 생성하는 내장 스킬. +/// LLM이 헤더와 데이터 행을 전달하면 CSV 파일을 생성합니다. +/// +public class CsvSkill : IAgentTool +{ + public string Name => "csv_create"; + public string Description => "Create a CSV (.csv) file with structured data. Provide headers and rows as JSON arrays."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Output file path (.csv). Relative to work folder." }, + ["headers"] = new() { Type = "array", Description = "Column headers as JSON array of strings.", Items = new() { Type = "string" } }, + ["rows"] = new() { Type = "array", Description = "Data rows as JSON array of arrays.", Items = new() { Type = "array", Items = new() { Type = "string" } } }, + ["encoding"] = new() { Type = "string", Description = "File encoding: 'utf-8' (default) or 'euc-kr'." }, + }, + Required = ["path", "headers", "rows"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var encodingName = args.TryGetProperty("encoding", out var enc) ? enc.GetString() ?? "utf-8" : "utf-8"; + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (context.ActiveTab == "Cowork") fullPath = AgentContext.EnsureTimestampedPath(fullPath); + if (!fullPath.EndsWith(".csv", StringComparison.OrdinalIgnoreCase)) + fullPath += ".csv"; + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + try + { + var headers = args.GetProperty("headers"); + var rows = args.GetProperty("rows"); + + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + Encoding fileEncoding; + try { fileEncoding = Encoding.GetEncoding(encodingName); } + catch (Exception) { fileEncoding = new UTF8Encoding(true); } + + var sb = new StringBuilder(); + + // 헤더 + var headerValues = new List(); + foreach (var h in headers.EnumerateArray()) + headerValues.Add(EscapeCsvField(h.GetString() ?? "")); + sb.AppendLine(string.Join(",", headerValues)); + + // 데이터 + int rowCount = 0; + foreach (var row in rows.EnumerateArray()) + { + var fields = new List(); + foreach (var cell in row.EnumerateArray()) + fields.Add(EscapeCsvField(cell.ToString())); + sb.AppendLine(string.Join(",", fields)); + rowCount++; + } + + await File.WriteAllTextAsync(fullPath, sb.ToString(), fileEncoding, ct); + + return ToolResult.Ok( + $"CSV 파일 생성 완료: {fullPath}\n열: {headerValues.Count}, 행: {rowCount}, 인코딩: {encodingName}", + fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"CSV 생성 실패: {ex.Message}"); + } + } + + private static string EscapeCsvField(string field) + { + if (field.Contains(',') || field.Contains('"') || field.Contains('\n') || field.Contains('\r')) + return $"\"{field.Replace("\"", "\"\"")}\""; + return field; + } +} diff --git a/src/AxCopilot/Services/Agent/DataPivotTool.cs b/src/AxCopilot/Services/Agent/DataPivotTool.cs new file mode 100644 index 0000000..6586a2f --- /dev/null +++ b/src/AxCopilot/Services/Agent/DataPivotTool.cs @@ -0,0 +1,358 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// CSV/JSON 데이터를 그룹화, 피벗, 집계하는 도구. +/// LINQ 기반 순수 C# 구현으로 외부 의존성 없음. +/// +public class DataPivotTool : IAgentTool +{ + public string Name => "data_pivot"; + public string Description => + "Group, pivot, and aggregate CSV/JSON data without external dependencies. " + + "Supports: group_by columns, aggregate functions (sum/avg/count/min/max), " + + "filter conditions, sorting, and output as table/csv/json."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["source_path"] = new() { Type = "string", Description = "Path to CSV or JSON data file." }, + ["group_by"] = new() + { + Type = "array", + Description = "Column names to group by.", + Items = new() { Type = "string" } + }, + ["aggregates"] = new() + { + Type = "array", + Description = "Aggregation specs: [{\"column\": \"sales\", \"function\": \"sum\"}, ...]. " + + "Functions: sum, avg, count, min, max.", + Items = new() { Type = "object" } + }, + ["filter"] = new() + { + Type = "string", + Description = "Optional filter expression: 'column == value' or 'column > 100'. " + + "Supports: ==, !=, >, <, >=, <=, contains. " + + "Multiple conditions: 'region == Seoul AND year >= 2025'." + }, + ["sort_by"] = new() { Type = "string", Description = "Column name to sort results by. Prefix with '-' for descending." }, + ["top_n"] = new() { Type = "integer", Description = "Limit results to top N rows. Default: all rows." }, + ["output_format"] = new() + { + Type = "string", + Description = "Output format: table (markdown), csv, json. Default: table", + Enum = ["table", "csv", "json"] + }, + }, + Required = ["source_path"] + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var sourcePath = args.GetProperty("source_path").GetString() ?? ""; + var fullPath = FileReadTool.ResolvePath(sourcePath, context.WorkFolder); + + if (!context.IsPathAllowed(fullPath)) + return Task.FromResult(ToolResult.Fail($"경로 접근 차단: {fullPath}")); + if (!File.Exists(fullPath)) + return Task.FromResult(ToolResult.Fail($"파일 없음: {fullPath}")); + + try + { + // 데이터 로드 + var ext = Path.GetExtension(fullPath).ToLowerInvariant(); + List> data; + + if (ext == ".json") + data = LoadJson(fullPath); + else + data = LoadCsv(fullPath); + + if (data.Count == 0) + return Task.FromResult(ToolResult.Fail("데이터가 비어있습니다.")); + + var originalCount = data.Count; + + // 필터 적용 + if (args.TryGetProperty("filter", out var filterEl)) + { + var filterStr = filterEl.GetString() ?? ""; + if (!string.IsNullOrWhiteSpace(filterStr)) + data = ApplyFilter(data, filterStr); + } + + // 그룹화 & 집계 + List> result; + if (args.TryGetProperty("group_by", out var groupEl) && groupEl.ValueKind == JsonValueKind.Array) + { + var groupCols = new List(); + foreach (var g in groupEl.EnumerateArray()) + groupCols.Add(g.GetString() ?? ""); + + var aggregates = new List<(string Column, string Function)>(); + if (args.TryGetProperty("aggregates", out var aggEl) && aggEl.ValueKind == JsonValueKind.Array) + { + foreach (var agg in aggEl.EnumerateArray()) + { + var col = agg.TryGetProperty("column", out var c) ? c.GetString() ?? "" : ""; + var func = agg.TryGetProperty("function", out var f) ? f.GetString() ?? "count" : "count"; + if (!string.IsNullOrEmpty(col)) + aggregates.Add((col, func)); + } + } + + result = GroupAndAggregate(data, groupCols, aggregates); + } + else + { + result = data; + } + + // 정렬 + if (args.TryGetProperty("sort_by", out var sortEl)) + { + var sortBy = sortEl.GetString() ?? ""; + if (!string.IsNullOrWhiteSpace(sortBy)) + result = ApplySort(result, sortBy); + } + + // Top N + if (args.TryGetProperty("top_n", out var topEl) && topEl.TryGetInt32(out var topN) && topN > 0) + result = result.Take(topN).ToList(); + + // 출력 포맷 + var outputFormat = args.TryGetProperty("output_format", out var ofmt) ? ofmt.GetString() ?? "table" : "table"; + var output = FormatOutput(result, outputFormat); + + return Task.FromResult(ToolResult.Ok( + $"📊 데이터 피벗 완료: {originalCount}행 → 필터 후 {data.Count}행 → 결과 {result.Count}행\n\n{output}")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"데이터 피벗 실패: {ex.Message}")); + } + } + + private static List> LoadCsv(string path) + { + var lines = File.ReadAllLines(path, Encoding.UTF8); + if (lines.Length < 2) return new(); + + var headers = ParseCsvLine(lines[0]); + var data = new List>(); + + for (int i = 1; i < lines.Length; i++) + { + if (string.IsNullOrWhiteSpace(lines[i])) continue; + var values = ParseCsvLine(lines[i]); + var row = new Dictionary(StringComparer.OrdinalIgnoreCase); + for (int j = 0; j < headers.Count && j < values.Count; j++) + row[headers[j]] = values[j]; + data.Add(row); + } + + return data; + } + + private static List ParseCsvLine(string line) + { + var result = new List(); + var sb = new StringBuilder(); + bool inQuote = false; + + for (int i = 0; i < line.Length; i++) + { + var c = line[i]; + if (c == '"') { inQuote = !inQuote; continue; } + if (c == ',' && !inQuote) + { + result.Add(sb.ToString().Trim()); + sb.Clear(); + continue; + } + sb.Append(c); + } + result.Add(sb.ToString().Trim()); + return result; + } + + private static List> LoadJson(string path) + { + var json = File.ReadAllText(path, Encoding.UTF8); + var doc = JsonDocument.Parse(json); + var data = new List>(); + + var arr = doc.RootElement.ValueKind == JsonValueKind.Array + ? doc.RootElement + : doc.RootElement.TryGetProperty("data", out var d) ? d : doc.RootElement; + + if (arr.ValueKind != JsonValueKind.Array) return data; + + foreach (var item in arr.EnumerateArray()) + { + var row = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var prop in item.EnumerateObject()) + row[prop.Name] = prop.Value.ToString(); + data.Add(row); + } + return data; + } + + private static List> ApplyFilter(List> data, string filter) + { + var conditions = filter.Split(new[] { " AND ", " and " }, StringSplitOptions.TrimEntries); + var result = data; + + foreach (var cond in conditions) + { + var match = Regex.Match(cond, @"(\w+)\s*(==|!=|>=|<=|>|<|contains)\s*(.+)"); + if (!match.Success) continue; + + var col = match.Groups[1].Value; + var op = match.Groups[2].Value; + var val = match.Groups[3].Value.Trim().Trim('\'', '"'); + + result = result.Where(row => + { + if (!row.TryGetValue(col, out var cellVal)) return false; + return op switch + { + "==" => cellVal.Equals(val, StringComparison.OrdinalIgnoreCase), + "!=" => !cellVal.Equals(val, StringComparison.OrdinalIgnoreCase), + "contains" => cellVal.Contains(val, StringComparison.OrdinalIgnoreCase), + ">" => double.TryParse(cellVal, out var a) && double.TryParse(val, out var b) && a > b, + "<" => double.TryParse(cellVal, out var a2) && double.TryParse(val, out var b2) && a2 < b2, + ">=" => double.TryParse(cellVal, out var a3) && double.TryParse(val, out var b3) && a3 >= b3, + "<=" => double.TryParse(cellVal, out var a4) && double.TryParse(val, out var b4) && a4 <= b4, + _ => true + }; + }).ToList(); + } + + return result; + } + + private static List> GroupAndAggregate( + List> data, + List groupCols, + List<(string Column, string Function)> aggregates) + { + var groups = data.GroupBy(row => + { + var key = new StringBuilder(); + foreach (var col in groupCols) + { + row.TryGetValue(col, out var val); + key.Append(val ?? "").Append('|'); + } + return key.ToString(); + }); + + var result = new List>(); + foreach (var group in groups) + { + var row = new Dictionary(StringComparer.OrdinalIgnoreCase); + + // 그룹 키 컬럼 + var first = group.First(); + foreach (var col in groupCols) + row[col] = first.TryGetValue(col, out var v) ? v : ""; + + // 집계 컬럼 + foreach (var (aggCol, func) in aggregates) + { + var values = group + .Select(r => r.TryGetValue(aggCol, out var v) ? v : "") + .Where(v => double.TryParse(v, out _)) + .Select(v => double.Parse(v)) + .ToList(); + + var aggResult = func.ToLowerInvariant() switch + { + "sum" => values.Sum(), + "avg" or "average" => values.Count > 0 ? values.Average() : 0, + "min" => values.Count > 0 ? values.Min() : 0, + "max" => values.Count > 0 ? values.Max() : 0, + "count" => group.Count(), + _ => (double)group.Count() + }; + + var label = $"{aggCol}_{func}"; + row[label] = func == "count" ? ((int)aggResult).ToString() : aggResult.ToString("F2"); + } + + // count 집계가 없으면 기본 count 추가 + if (aggregates.Count == 0) + row["count"] = group.Count().ToString(); + + result.Add(row); + } + + return result; + } + + private static List> ApplySort(List> data, string sortBy) + { + bool desc = sortBy.StartsWith('-'); + var col = sortBy.TrimStart('-'); + + return (desc + ? data.OrderByDescending(r => GetSortKey(r, col)) + : data.OrderBy(r => GetSortKey(r, col)) + ).ToList(); + } + + private static object GetSortKey(Dictionary row, string col) + { + if (!row.TryGetValue(col, out var val)) return ""; + if (double.TryParse(val, out var num)) return num; + return val; + } + + private static string FormatOutput(List> data, string format) + { + if (data.Count == 0) return "(결과 없음)"; + + var columns = data.SelectMany(r => r.Keys).Distinct().ToList(); + + switch (format) + { + case "json": + return JsonSerializer.Serialize(data, new JsonSerializerOptions + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }); + + case "csv": + var csvSb = new StringBuilder(); + csvSb.AppendLine(string.Join(",", columns)); + foreach (var row in data) + { + var vals = columns.Select(c => row.TryGetValue(c, out var v) ? $"\"{v}\"" : "\"\""); + csvSb.AppendLine(string.Join(",", vals)); + } + return csvSb.ToString(); + + default: // table (markdown) + var sb = new StringBuilder(); + // 헤더 + sb.AppendLine("| " + string.Join(" | ", columns) + " |"); + sb.AppendLine("| " + string.Join(" | ", columns.Select(_ => "---")) + " |"); + // 행 + foreach (var row in data) + { + var vals = columns.Select(c => row.TryGetValue(c, out var v) ? v : ""); + sb.AppendLine("| " + string.Join(" | ", vals) + " |"); + } + return sb.ToString(); + } + } +} diff --git a/src/AxCopilot/Services/Agent/DateTimeTool.cs b/src/AxCopilot/Services/Agent/DateTimeTool.cs new file mode 100644 index 0000000..c626f85 --- /dev/null +++ b/src/AxCopilot/Services/Agent/DateTimeTool.cs @@ -0,0 +1,197 @@ +using System.Globalization; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 날짜·시간 변환, 타임존, 기간 계산 유틸리티 도구. +public class DateTimeTool : IAgentTool +{ + public string Name => "datetime_tool"; + public string Description => + "Date/time utility tool. Actions: " + + "'now' — get current date/time in various formats; " + + "'parse' — parse a date string into standard format; " + + "'diff' — calculate difference between two dates; " + + "'add' — add/subtract days/hours/minutes to a date; " + + "'epoch' — convert between Unix epoch and datetime; " + + "'format' — format a date into specified pattern."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action to perform", + Enum = ["now", "parse", "diff", "add", "epoch", "format"], + }, + ["date"] = new() + { + Type = "string", + Description = "Date string (for parse/diff/add/format/epoch). For epoch: Unix timestamp in seconds.", + }, + ["date2"] = new() + { + Type = "string", + Description = "Second date string (for diff action)", + }, + ["amount"] = new() + { + Type = "string", + Description = "Amount to add (for add action). E.g. '7' for 7 days", + }, + ["unit"] = new() + { + Type = "string", + Description = "Unit for add action", + Enum = ["days", "hours", "minutes", "seconds", "months", "years"], + }, + ["pattern"] = new() + { + Type = "string", + Description = "Format pattern (for format action). E.g. 'yyyy-MM-dd HH:mm:ss', 'ddd MMM d yyyy'", + }, + }, + Required = ["action"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + + try + { + return Task.FromResult(action switch + { + "now" => Now(), + "parse" => Parse(args), + "diff" => Diff(args), + "add" => Add(args), + "epoch" => Epoch(args), + "format" => FormatDate(args), + _ => ToolResult.Fail($"Unknown action: {action}"), + }); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"DateTime 오류: {ex.Message}")); + } + } + + private static ToolResult Now() + { + var now = DateTime.Now; + var utc = DateTime.UtcNow; + var epoch = new DateTimeOffset(utc).ToUnixTimeSeconds(); + return ToolResult.Ok( + $"Local: {now:yyyy-MM-dd HH:mm:ss (ddd)} ({TimeZoneInfo.Local.DisplayName})\n" + + $"UTC: {utc:yyyy-MM-dd HH:mm:ss}\n" + + $"ISO: {now:O}\n" + + $"Epoch: {epoch}\n" + + $"Week: {CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(now, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)}"); + } + + private static ToolResult Parse(JsonElement args) + { + var dateStr = args.TryGetProperty("date", out var d) ? d.GetString() ?? "" : ""; + if (string.IsNullOrEmpty(dateStr)) return ToolResult.Fail("'date' parameter is required"); + + if (!DateTime.TryParse(dateStr, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) && + !DateTime.TryParse(dateStr, CultureInfo.CurrentCulture, DateTimeStyles.None, out dt)) + return ToolResult.Fail($"Cannot parse date: '{dateStr}'"); + + return ToolResult.Ok( + $"Parsed: {dt:yyyy-MM-dd HH:mm:ss}\n" + + $"Day: {dt:dddd}\n" + + $"ISO: {dt:O}\n" + + $"Epoch: {new DateTimeOffset(dt).ToUnixTimeSeconds()}"); + } + + private static ToolResult Diff(JsonElement args) + { + var d1 = args.TryGetProperty("date", out var v1) ? v1.GetString() ?? "" : ""; + var d2 = args.TryGetProperty("date2", out var v2) ? v2.GetString() ?? "" : ""; + if (string.IsNullOrEmpty(d1) || string.IsNullOrEmpty(d2)) + return ToolResult.Fail("'date' and 'date2' parameters are required"); + + if (!DateTime.TryParse(d1, out var dt1)) return ToolResult.Fail($"Cannot parse date: '{d1}'"); + if (!DateTime.TryParse(d2, out var dt2)) return ToolResult.Fail($"Cannot parse date: '{d2}'"); + + var diff = dt2 - dt1; + return ToolResult.Ok( + $"From: {dt1:yyyy-MM-dd HH:mm:ss}\n" + + $"To: {dt2:yyyy-MM-dd HH:mm:ss}\n\n" + + $"Difference:\n" + + $" {Math.Abs(diff.TotalDays):F1} days\n" + + $" {Math.Abs(diff.TotalHours):F1} hours\n" + + $" {Math.Abs(diff.TotalMinutes):F0} minutes\n" + + $" {Math.Abs(diff.TotalSeconds):F0} seconds\n" + + $" ({(diff.TotalDays >= 0 ? "forward" : "backward")})"); + } + + private static ToolResult Add(JsonElement args) + { + var dateStr = args.TryGetProperty("date", out var dv) ? dv.GetString() ?? "" : ""; + var amountStr = args.TryGetProperty("amount", out var av) ? av.GetString() ?? "0" : "0"; + var unit = args.TryGetProperty("unit", out var uv) ? uv.GetString() ?? "days" : "days"; + + if (string.IsNullOrEmpty(dateStr)) return ToolResult.Fail("'date' parameter is required"); + if (!DateTime.TryParse(dateStr, out var dt)) return ToolResult.Fail($"Cannot parse date: '{dateStr}'"); + if (!double.TryParse(amountStr, out var amount)) return ToolResult.Fail($"Invalid amount: '{amountStr}'"); + + var result = unit switch + { + "days" => dt.AddDays(amount), + "hours" => dt.AddHours(amount), + "minutes" => dt.AddMinutes(amount), + "seconds" => dt.AddSeconds(amount), + "months" => dt.AddMonths((int)amount), + "years" => dt.AddYears((int)amount), + _ => dt.AddDays(amount), + }; + + return ToolResult.Ok( + $"Original: {dt:yyyy-MM-dd HH:mm:ss}\n" + + $"Added: {amount} {unit}\n" + + $"Result: {result:yyyy-MM-dd HH:mm:ss} ({result:dddd})"); + } + + private static ToolResult Epoch(JsonElement args) + { + var input = args.TryGetProperty("date", out var dv) ? dv.GetString() ?? "" : ""; + if (string.IsNullOrEmpty(input)) return ToolResult.Fail("'date' parameter is required"); + + // 숫자면 epoch → datetime + if (long.TryParse(input, out var epoch)) + { + var dt = DateTimeOffset.FromUnixTimeSeconds(epoch); + return ToolResult.Ok( + $"Epoch: {epoch}\n" + + $"UTC: {dt.UtcDateTime:yyyy-MM-dd HH:mm:ss}\n" + + $"Local: {dt.LocalDateTime:yyyy-MM-dd HH:mm:ss}"); + } + + // 문자열이면 datetime → epoch + if (DateTime.TryParse(input, out var parsed)) + { + var e = new DateTimeOffset(parsed).ToUnixTimeSeconds(); + return ToolResult.Ok( + $"Date: {parsed:yyyy-MM-dd HH:mm:ss}\n" + + $"Epoch: {e}"); + } + + return ToolResult.Fail($"Cannot parse: '{input}'"); + } + + private static ToolResult FormatDate(JsonElement args) + { + var dateStr = args.TryGetProperty("date", out var dv) ? dv.GetString() ?? "" : ""; + var pattern = args.TryGetProperty("pattern", out var pv) ? pv.GetString() ?? "yyyy-MM-dd" : "yyyy-MM-dd"; + + if (string.IsNullOrEmpty(dateStr)) return ToolResult.Fail("'date' parameter is required"); + if (!DateTime.TryParse(dateStr, out var dt)) return ToolResult.Fail($"Cannot parse date: '{dateStr}'"); + + return ToolResult.Ok(dt.ToString(pattern, CultureInfo.InvariantCulture)); + } +} diff --git a/src/AxCopilot/Services/Agent/DelegateAgentTool.cs b/src/AxCopilot/Services/Agent/DelegateAgentTool.cs new file mode 100644 index 0000000..9c08a60 --- /dev/null +++ b/src/AxCopilot/Services/Agent/DelegateAgentTool.cs @@ -0,0 +1,131 @@ +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 18-A: 전문 서브에이전트에 작업 위임 도구. +/// IAgentTool 구현. ToolRegistry.CreateDefault()에 등록 필요. +/// +public class DelegateAgentTool : IAgentTool, IConditionalTool +{ + /// AI 비활성화 시 서브에이전트 위임 불가. + public bool IsEnabled(ToolEnvironmentContext env) => env.AiEnabled; + + public string Name => "delegate"; + public string Description => + "전문 에이전트에 작업을 위임합니다. " + + "researcher(조사/검색), code-reviewer(코드리뷰), implementer(구현), " + + "security-auditor(보안감사), doc-writer(문서작성) 중 선택."; + + public ToolParameterSchema Parameters => new() + { + Properties = new Dictionary + { + ["agent_type"] = new() + { + Type = "string", + Description = "위임할 에이전트 유형", + Enum = new List + { + "researcher", "code-reviewer", "implementer", + "security-auditor", "doc-writer" + } + }, + ["task"] = new() + { + Type = "string", + Description = "에이전트에게 전달할 작업 설명" + }, + ["context"] = new() + { + Type = "string", + Description = "에이전트에게 전달할 추가 컨텍스트 (파일 내용, 배경 정보 등)" + }, + ["isolation"] = new() + { + Type = "string", + Description = "격리 수준: none(기본) | worktree(git worktree 격리)", + Enum = new List { "none", "worktree" } + } + }, + Required = new List { "agent_type", "task" } + }; + + private readonly BackgroundAgentService _bgService; + private readonly IAgentMemoryRepository _memoryRepo; + private readonly WorktreeManager? _worktreeManager; + + // 서브에이전트 실행 함수 (AgentLoopService에서 주입) + private Func>? _subAgentRunner; + + public DelegateAgentTool( + BackgroundAgentService bgService, + IAgentMemoryRepository memoryRepo, + WorktreeManager? worktreeManager = null) + { + _bgService = bgService; + _memoryRepo = memoryRepo; + _worktreeManager = worktreeManager; + } + + /// 서브에이전트 실행 함수를 주입합니다 (AgentLoopService에서 호출). + public void SetSubAgentRunner(Func> runner) + => _subAgentRunner = runner; + + public async Task ExecuteAsync( + JsonElement args, + AgentContext context, + CancellationToken ct = default) + { + var agentType = args.TryGetProperty("agent_type", out var at) ? at.GetString() ?? "researcher" : "researcher"; + var task = args.TryGetProperty("task", out var t) ? t.GetString() ?? "" : ""; + var ctx = args.TryGetProperty("context", out var c) ? c.GetString() ?? "" : ""; + var isolation = args.TryGetProperty("isolation", out var iso) ? iso.GetString() ?? "none" : "none"; + + if (string.IsNullOrWhiteSpace(task)) + return ToolResult.Fail("작업 설명(task)이 필요합니다."); + + if (_subAgentRunner == null) + return ToolResult.Fail("서브에이전트 실행기가 설정되지 않았습니다."); + + // worktree 격리 + Worktree? worktree = null; + if (isolation == "worktree" && _worktreeManager != null && !string.IsNullOrEmpty(context.WorkFolder)) + { + var branchName = $"ax-{agentType}-{DateTime.UtcNow:yyMMddHHmm}"; + worktree = await _worktreeManager.CreateAsync(context.WorkFolder, branchName, ct); + } + + var workDir = worktree?.Path ?? context.WorkFolder; + + // 에이전트 타입별 메모리 로드 + 컨텍스트 보강 + var memory = await _memoryRepo.LoadMemoryAsync(agentType); + var fullContext = string.IsNullOrEmpty(memory) + ? ctx + : ctx + $"\n\n## 이전 학습:\n{memory}"; + + // 서브에이전트 실행 (동기 대기) + try + { + var result = await _subAgentRunner(agentType, task, fullContext, ct); + + // 결과 크기 제한 + if (result.Length > 100_000) + result = result[..100_000] + "\n\n[결과가 100,000자를 초과하여 잘림]"; + + // worktree 정리 (완료 후) + if (worktree != null) + await _worktreeManager!.DisposeWorktreeAsync(worktree, keepBranch: false, ct); + + return ToolResult.Ok($"[{agentType}] 완료:\n\n{result}"); + } + catch (Exception ex) + { + if (worktree != null) + try { await _worktreeManager!.DisposeWorktreeAsync(worktree, ct: CancellationToken.None); } + catch (Exception) { } + + return ToolResult.Fail($"[{agentType}] 실행 실패: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/Agent/DevEnvDetectTool.cs b/src/AxCopilot/Services/Agent/DevEnvDetectTool.cs new file mode 100644 index 0000000..3c82ec4 --- /dev/null +++ b/src/AxCopilot/Services/Agent/DevEnvDetectTool.cs @@ -0,0 +1,217 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.Json; +using Microsoft.Win32; + +namespace AxCopilot.Services.Agent; + +/// +/// 개발 환경 감지 도구. +/// IDE, 언어 런타임, 빌드 도구의 설치 여부와 경로를 자동 감지합니다. +/// 사내 환경에서 설치된 도구만 사용하도록 LLM에 정보를 제공합니다. +/// +public class DevEnvDetectTool : IAgentTool +{ + public string Name => "dev_env_detect"; + public string Description => + "Detect installed development tools on this machine. " + + "Returns: IDEs (VS Code, Visual Studio, IntelliJ, PyCharm), " + + "language runtimes (dotnet, python/conda, java, node, gcc/g++), " + + "and build tools (MSBuild, Maven, Gradle, CMake, npm/yarn). " + + "Use this before running build/test commands to know what's available."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["category"] = new() + { + Type = "string", + Description = "Detection category: all (default), ides, runtimes, build_tools", + Enum = ["all", "ides", "runtimes", "build_tools"], + }, + }, + Required = [] + }; + + // 60초 캐시 + private static (DateTime Time, string Result)? _cache; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var category = args.TryGetProperty("category", out var cat) ? cat.GetString() ?? "all" : "all"; + + // 캐시 확인 + if (_cache.HasValue && (DateTime.UtcNow - _cache.Value.Time).TotalSeconds < 60) + return Task.FromResult(ToolResult.Ok(_cache.Value.Result)); + + var sb = new StringBuilder(); + sb.AppendLine("=== 개발 환경 감지 보고서 ===\n"); + + if (category is "all" or "ides") + { + sb.AppendLine("## IDE"); + DetectIde(sb, "VS Code", DetectVsCode); + DetectIde(sb, "Visual Studio", DetectVisualStudio); + DetectIde(sb, "IntelliJ IDEA", () => DetectJetBrains("IntelliJ")); + DetectIde(sb, "PyCharm", () => DetectJetBrains("PyCharm")); + sb.AppendLine(); + } + + if (category is "all" or "runtimes") + { + sb.AppendLine("## Language Runtimes"); + DetectCommand(sb, "dotnet", "dotnet --version", "DOTNET_ROOT"); + DetectCommand(sb, "python", "python --version", "PYTHON_HOME"); + DetectCommand(sb, "conda", "conda --version", "CONDA_PREFIX"); + DetectCommand(sb, "java", "java -version", "JAVA_HOME"); + DetectCommand(sb, "node", "node --version", "NODE_HOME"); + DetectCommand(sb, "npm", "npm --version", null); + DetectCommand(sb, "gcc", "gcc --version", null); + DetectCommand(sb, "g++", "g++ --version", null); + sb.AppendLine(); + } + + if (category is "all" or "build_tools") + { + sb.AppendLine("## Build Tools"); + DetectCommand(sb, "MSBuild", "msbuild -version", null); + DetectCommand(sb, "Maven", "mvn --version", "MAVEN_HOME"); + DetectCommand(sb, "Gradle", "gradle --version", "GRADLE_HOME"); + DetectCommand(sb, "CMake", "cmake --version", null); + DetectCommand(sb, "yarn", "yarn --version", null); + DetectCommand(sb, "pip", "pip --version", null); + sb.AppendLine(); + } + + var result = sb.ToString(); + _cache = (DateTime.UtcNow, result); + return Task.FromResult(ToolResult.Ok(result)); + } + + private static void DetectIde(StringBuilder sb, string name, Func detector) + { + var path = detector(); + sb.AppendLine(path != null ? $" ✅ {name}: {path}" : $" ❌ {name}: 미설치"); + } + + private static void DetectCommand(StringBuilder sb, string name, string versionCmd, string? envVar) + { + // 환경변수 확인 + string? envPath = null; + if (envVar != null) + envPath = Environment.GetEnvironmentVariable(envVar); + + // where.exe로 PATH 확인 + var wherePath = RunQuick("where.exe", name); + var version = ""; + + if (wherePath != null) + { + // 버전 확인 + var parts = versionCmd.Split(' ', 2); + var verOutput = RunQuick(parts[0], parts.Length > 1 ? parts[1] : ""); + if (verOutput != null) + version = verOutput.Split('\n')[0].Trim(); + } + + if (wherePath != null) + sb.AppendLine($" ✅ {name}: {version} ({wherePath.Split('\n')[0].Trim()})"); + else if (envPath != null) + sb.AppendLine($" ⚠ {name}: 환경변수만 ({envVar}={envPath})"); + else + sb.AppendLine($" ❌ {name}: 미설치"); + } + + private static string? RunQuick(string exe, string args) + { + try + { + var psi = new ProcessStartInfo(exe, args) + { + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + }; + using var proc = Process.Start(psi); + if (proc == null) return null; + var output = proc.StandardOutput.ReadToEnd(); + var error = proc.StandardError.ReadToEnd(); + proc.WaitForExit(5000); + var result = string.IsNullOrWhiteSpace(output) ? error : output; + return string.IsNullOrWhiteSpace(result) ? null : result.Trim(); + } + catch (Exception) { return null; } + } + + private static string? DetectVsCode() + { + // PATH 확인 + var where = RunQuick("where.exe", "code"); + if (where != null) return where.Split('\n')[0].Trim(); + + // 기본 설치 경로 + var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + var defaultPath = Path.Combine(localAppData, "Programs", "Microsoft VS Code", "Code.exe"); + return File.Exists(defaultPath) ? defaultPath : null; + } + + private static string? DetectVisualStudio() + { + try + { + // 레지스트리에서 Visual Studio 설치 경로 검색 + using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio\SxS\VS7"); + if (key != null) + { + foreach (var name in key.GetValueNames().OrderByDescending(n => n)) + { + var path = key.GetValue(name)?.ToString(); + if (!string.IsNullOrEmpty(path) && Directory.Exists(path)) + return $"Visual Studio {name} ({path})"; + } + } + + // WOW6432Node 확인 + using var key32 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7"); + if (key32 != null) + { + foreach (var name in key32.GetValueNames().OrderByDescending(n => n)) + { + var path = key32.GetValue(name)?.ToString(); + if (!string.IsNullOrEmpty(path) && Directory.Exists(path)) + return $"Visual Studio {name} ({path})"; + } + } + } + catch (Exception) { } + + // devenv.exe PATH 확인 + var where = RunQuick("where.exe", "devenv"); + return where != null ? where.Split('\n')[0].Trim() : null; + } + + private static string? DetectJetBrains(string product) + { + try + { + using var key = Registry.LocalMachine.OpenSubKey($@"SOFTWARE\JetBrains\{product}"); + if (key != null) + { + var subKeys = key.GetSubKeyNames().OrderByDescending(n => n).ToArray(); + if (subKeys.Length > 0) + { + using var verKey = key.OpenSubKey(subKeys[0]); + var installDir = verKey?.GetValue("InstallDir")?.ToString() + ?? verKey?.GetValue("")?.ToString(); + if (!string.IsNullOrEmpty(installDir)) + return $"{product} {subKeys[0]} ({installDir})"; + } + } + } + catch (Exception) { } + return null; + } +} diff --git a/src/AxCopilot/Services/Agent/DiffPreviewTool.cs b/src/AxCopilot/Services/Agent/DiffPreviewTool.cs new file mode 100644 index 0000000..e8af040 --- /dev/null +++ b/src/AxCopilot/Services/Agent/DiffPreviewTool.cs @@ -0,0 +1,168 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 파일 변경 사항을 미리 보여주고 사용자 승인을 받는 도구. +/// 통합 diff를 생성하여 "[PREVIEW_PENDING]" 접두사와 함께 반환합니다. +/// +public class DiffPreviewTool : IAgentTool +{ + public string Name => "diff_preview"; + + public string Description => + "Preview file changes before applying them. Shows a unified diff and waits for user approval. " + + "If approved, writes the new content to the file. If rejected, no changes are made. " + + "The diff output is prefixed with [PREVIEW_PENDING] so the UI can show an approval panel."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() + { + Type = "string", + Description = "File path to modify", + }, + ["new_content"] = new() + { + Type = "string", + Description = "Proposed new content for the file", + }, + ["description"] = new() + { + Type = "string", + Description = "Description of the changes (optional)", + }, + }, + Required = ["path", "new_content"], + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var rawPath = args.GetProperty("path").GetString() ?? ""; + var newContent = args.GetProperty("new_content").GetString() ?? ""; + var description = args.TryGetProperty("description", out var d) ? d.GetString() ?? "" : ""; + + var path = Path.IsPathRooted(rawPath) ? rawPath : Path.Combine(context.WorkFolder, rawPath); + + if (!context.IsPathAllowed(path)) + return ToolResult.Fail($"경로 접근 차단: {path}"); + + try + { + // 원본 파일 읽기 (없으면 새 파일 생성으로 처리) + var originalContent = ""; + var isNewFile = !File.Exists(path); + if (!isNewFile) + originalContent = await File.ReadAllTextAsync(path, ct); + + // 통합 diff 생성 + var originalLines = originalContent.Split('\n').Select(l => l.TrimEnd('\r')).ToArray(); + var newLines = newContent.Split('\n').Select(l => l.TrimEnd('\r')).ToArray(); + var diff = GenerateUnifiedDiff(originalLines, newLines, path); + + var sb = new StringBuilder(); + sb.AppendLine("[PREVIEW_PENDING]"); + + if (!string.IsNullOrEmpty(description)) + sb.AppendLine($"변경 설명: {description}"); + + sb.AppendLine($"파일: {path}"); + sb.AppendLine(isNewFile ? "상태: 새 파일 생성" : "상태: 기존 파일 수정"); + sb.AppendLine(); + + if (string.IsNullOrEmpty(diff)) + sb.AppendLine("변경 사항 없음 — 내용이 동일합니다."); + else + sb.Append(diff); + + // 쓰기 권한 확인 (AskPermission 콜백 사용 — CustomMessageBox) + if (!await context.CheckWritePermissionAsync("diff_preview", path)) + return ToolResult.Ok($"사용자가 파일 변경을 거부했습니다.\n\n{sb}"); + + // 디렉토리 생성 + var dir = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) + Directory.CreateDirectory(dir); + + await File.WriteAllTextAsync(path, newContent, ct); + return ToolResult.Ok($"변경 사항이 적용되었습니다: {path}\n\n{sb}", path); + } + catch (Exception ex) + { + return ToolResult.Fail($"미리보기 오류: {ex.Message}"); + } + } + + private static string GenerateUnifiedDiff(string[] original, string[] modified, string filePath) + { + var sb = new StringBuilder(); + sb.AppendLine($"--- {filePath} (원본)"); + sb.AppendLine($"+++ {filePath} (수정)"); + + // 간단한 LCS 기반 diff + var lcs = ComputeLcs(original, modified); + int oi = 0, mi = 0, ci = 0; + var hunks = new List<(int os, int oe, int ms, int me)>(); + + while (oi < original.Length || mi < modified.Length) + { + if (ci < lcs.Count && oi < original.Length && mi < modified.Length + && original[oi] == lcs[ci] && modified[mi] == lcs[ci]) + { + oi++; mi++; ci++; + } + else + { + var hos = oi; + var hms = mi; + while (oi < original.Length && (ci >= lcs.Count || original[oi] != lcs[ci])) + oi++; + while (mi < modified.Length && (ci >= lcs.Count || modified[mi] != lcs[ci])) + mi++; + hunks.Add((hos, oi, hms, mi)); + } + } + + if (hunks.Count == 0) return ""; + + foreach (var (os, oe, ms, me) in hunks) + { + sb.AppendLine($"@@ -{os + 1},{oe - os} +{ms + 1},{me - ms} @@"); + for (var i = os; i < oe; i++) + sb.AppendLine($"-{original[i]}"); + for (var i = ms; i < me; i++) + sb.AppendLine($"+{modified[i]}"); + } + + return sb.ToString(); + } + + private static List ComputeLcs(string[] a, string[] b) + { + var m = a.Length; + var n = b.Length; + + // 메모리 절약: 큰 파일은 전체를 diff로 표시 + if ((long)m * n > 10_000_000) + return []; + + var dp = new int[m + 1, n + 1]; + for (var i = m - 1; i >= 0; i--) + for (var j = n - 1; j >= 0; j--) + dp[i, j] = a[i] == b[j] ? dp[i + 1, j + 1] + 1 : Math.Max(dp[i + 1, j], dp[i, j + 1]); + + var result = new List(); + int x = 0, y = 0; + while (x < m && y < n) + { + if (a[x] == b[y]) { result.Add(a[x]); x++; y++; } + else if (dp[x + 1, y] >= dp[x, y + 1]) x++; + else y++; + } + return result; + } +} diff --git a/src/AxCopilot/Services/Agent/DiffTool.cs b/src/AxCopilot/Services/Agent/DiffTool.cs new file mode 100644 index 0000000..782f677 --- /dev/null +++ b/src/AxCopilot/Services/Agent/DiffTool.cs @@ -0,0 +1,158 @@ +using System.IO; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 두 텍스트 또는 파일을 비교하여 통합 diff 결과를 출력하는 도구. +/// +public class DiffTool : IAgentTool +{ + public string Name => "diff_tool"; + public string Description => + "Compare two texts or files and output a unified diff. " + + "Use 'text' mode to compare two text strings directly, " + + "or 'file' mode to compare two files by path."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["mode"] = new() + { + Type = "string", + Description = "Comparison mode", + Enum = ["text", "file"], + }, + ["left"] = new() + { + Type = "string", + Description = "Left text content or file path", + }, + ["right"] = new() + { + Type = "string", + Description = "Right text content or file path", + }, + ["left_label"] = new() + { + Type = "string", + Description = "Label for left side (optional, default: 'left')", + }, + ["right_label"] = new() + { + Type = "string", + Description = "Label for right side (optional, default: 'right')", + }, + }, + Required = ["mode", "left", "right"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var mode = args.GetProperty("mode").GetString() ?? "text"; + var left = args.GetProperty("left").GetString() ?? ""; + var right = args.GetProperty("right").GetString() ?? ""; + var leftLabel = args.TryGetProperty("left_label", out var ll) ? ll.GetString() ?? "left" : "left"; + var rightLabel = args.TryGetProperty("right_label", out var rl) ? rl.GetString() ?? "right" : "right"; + + try + { + if (mode == "file") + { + var leftPath = Path.IsPathRooted(left) ? left : Path.Combine(context.WorkFolder, left); + var rightPath = Path.IsPathRooted(right) ? right : Path.Combine(context.WorkFolder, right); + + if (!File.Exists(leftPath)) return Task.FromResult(ToolResult.Fail($"Left file not found: {leftPath}")); + if (!File.Exists(rightPath)) return Task.FromResult(ToolResult.Fail($"Right file not found: {rightPath}")); + + left = File.ReadAllText(leftPath); + right = File.ReadAllText(rightPath); + leftLabel = Path.GetFileName(leftPath); + rightLabel = Path.GetFileName(rightPath); + } + + var leftLines = left.Split('\n').Select(l => l.TrimEnd('\r')).ToArray(); + var rightLines = right.Split('\n').Select(l => l.TrimEnd('\r')).ToArray(); + + var diff = GenerateUnifiedDiff(leftLines, rightLines, leftLabel, rightLabel); + if (string.IsNullOrEmpty(diff)) + return Task.FromResult(ToolResult.Ok("No differences found — files/texts are identical.")); + + if (diff.Length > 10000) diff = diff[..10000] + "\n... (truncated)"; + return Task.FromResult(ToolResult.Ok(diff)); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"Diff 오류: {ex.Message}")); + } + } + + private static string GenerateUnifiedDiff(string[] left, string[] right, string leftLabel, string rightLabel) + { + // 간단한 LCS 기반 diff + var lcs = ComputeLcs(left, right); + var sb = new System.Text.StringBuilder(); + sb.AppendLine($"--- {leftLabel}"); + sb.AppendLine($"+++ {rightLabel}"); + + int li = 0, ri = 0, ci = 0; + var hunks = new List<(int ls, int le, int rs, int re)>(); + + // hunk 수집 + while (li < left.Length || ri < right.Length) + { + if (ci < lcs.Count && li < left.Length && ri < right.Length && left[li] == lcs[ci] && right[ri] == lcs[ci]) + { + li++; ri++; ci++; + } + else + { + var hls = li; var hrs = ri; + while (li < left.Length && (ci >= lcs.Count || left[li] != lcs[ci])) + li++; + while (ri < right.Length && (ci >= lcs.Count || right[ri] != lcs[ci])) + ri++; + hunks.Add((hls, li, hrs, ri)); + } + } + + if (hunks.Count == 0) return ""; + + // 출력 + foreach (var (ls, le, rs, re) in hunks) + { + var contextStart = Math.Max(0, ls - 3); + sb.AppendLine($"@@ -{ls + 1},{le - ls} +{rs + 1},{re - rs} @@"); + for (var i = ls; i < le; i++) + sb.AppendLine($"-{left[i]}"); + for (var i = rs; i < re; i++) + sb.AppendLine($"+{right[i]}"); + } + + return sb.ToString(); + } + + private static List ComputeLcs(string[] a, string[] b) + { + var m = a.Length; var n = b.Length; + // 메모리 절약을 위해 큰 파일은 제한 + if ((long)m * n > 10_000_000) + return new List(); // 너무 큰 경우 전체를 diff로 표시 + + var dp = new int[m + 1, n + 1]; + for (var i = m - 1; i >= 0; i--) + for (var j = n - 1; j >= 0; j--) + dp[i, j] = a[i] == b[j] ? dp[i + 1, j + 1] + 1 : Math.Max(dp[i + 1, j], dp[i, j + 1]); + + var result = new List(); + int x = 0, y = 0; + while (x < m && y < n) + { + if (a[x] == b[y]) { result.Add(a[x]); x++; y++; } + else if (dp[x + 1, y] >= dp[x, y + 1]) x++; + else y++; + } + return result; + } +} diff --git a/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs b/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs new file mode 100644 index 0000000..7a870d3 --- /dev/null +++ b/src/AxCopilot/Services/Agent/DocumentAssemblerTool.cs @@ -0,0 +1,370 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 여러 섹션의 내용을 하나의 완성된 문서로 조립하는 도구. +/// 멀티패스 문서 생성의 3단계: 개별 생성된 섹션들을 최종 문서로 결합합니다. +/// +public class DocumentAssemblerTool : IAgentTool +{ + + public string Name => "document_assemble"; + public string Description => + "Assemble multiple individually-written sections into a single complete document. " + + "Use this after writing each section separately with document_plan. " + + "Supports HTML, DOCX, and Markdown output. " + + "Automatically adds table of contents, cover page, and section numbering for HTML. " + + "After assembly, the document is auto-validated for quality issues."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Output file path. Relative to work folder." }, + ["title"] = new() { Type = "string", Description = "Document title" }, + ["sections"] = new() + { + Type = "array", + Description = "Array of section objects: [{\"heading\": \"1. 개요\", \"content\": \"HTML or markdown body...\", \"level\": 1}]. " + + "content should be the detailed text for each section.", + Items = new() { Type = "object" } + }, + ["format"] = new() + { + Type = "string", + Description = "Output format: html, docx, markdown. Default: html", + Enum = ["html", "docx", "markdown"] + }, + ["mood"] = new() + { + Type = "string", + Description = "Design theme for HTML output: modern, professional, creative, corporate, dashboard, etc. Default: professional" + }, + ["toc"] = new() { Type = "boolean", Description = "Auto-generate table of contents. Default: true" }, + ["cover_subtitle"] = new() { Type = "string", Description = "Subtitle for cover page. If provided, a cover page is added." }, + ["header"] = new() { Type = "string", Description = "Header text for DOCX output." }, + ["footer"] = new() { Type = "string", Description = "Footer text for DOCX output. Use {page} for page number." }, + }, + Required = ["path", "title", "sections"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var title = args.GetProperty("title").GetString() ?? "Document"; + var format = args.TryGetProperty("format", out var fmt) ? fmt.GetString() ?? "html" : "html"; + var mood = args.TryGetProperty("mood", out var m) ? m.GetString() ?? "professional" : "professional"; + var useToc = !args.TryGetProperty("toc", out var tocVal) || tocVal.GetBoolean(); // default true + var coverSubtitle = args.TryGetProperty("cover_subtitle", out var cs) ? cs.GetString() : null; + var headerText = args.TryGetProperty("header", out var hdr) ? hdr.GetString() : null; + var footerText = args.TryGetProperty("footer", out var ftr) ? ftr.GetString() : null; + + if (!args.TryGetProperty("sections", out var sectionsEl) || sectionsEl.ValueKind != JsonValueKind.Array) + return ToolResult.Fail("sections 배열이 필요합니다."); + + var sections = new List<(string Heading, string Content, int Level)>(); + foreach (var sec in sectionsEl.EnumerateArray()) + { + var heading = sec.TryGetProperty("heading", out var h) ? h.GetString() ?? "" : ""; + var content = sec.TryGetProperty("content", out var c) ? c.GetString() ?? "" : ""; + var level = sec.TryGetProperty("level", out var lv) ? lv.GetInt32() : 1; + if (!string.IsNullOrWhiteSpace(heading) || !string.IsNullOrWhiteSpace(content)) + sections.Add((heading, content, level)); + } + + if (sections.Count == 0) + return ToolResult.Fail("조립할 섹션이 없습니다."); + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (context.ActiveTab == "Cowork") fullPath = AgentContext.EnsureTimestampedPath(fullPath); + + // 확장자 자동 추가 + var ext = format switch + { + "docx" => ".docx", + "markdown" => ".md", + _ => ".html" + }; + if (!fullPath.EndsWith(ext, StringComparison.OrdinalIgnoreCase)) + fullPath += ext; + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + try + { + string resultMsg; + switch (format) + { + case "docx": + resultMsg = AssembleDocx(fullPath, title, sections, headerText, footerText); + break; + case "markdown": + resultMsg = AssembleMarkdown(fullPath, title, sections); + break; + default: + resultMsg = AssembleHtml(fullPath, title, sections, mood, useToc, coverSubtitle); + break; + } + + // 품질 요약 통계 + var totalChars = sections.Sum(s => s.Content.Length); + var totalWords = sections.Sum(s => EstimateWordCount(s.Content)); + var pageEstimate = Math.Max(1, totalWords / 500); + + return ToolResult.Ok( + $"✅ 문서 조립 완료: {Path.GetFileName(fullPath)}\n" + + $" 섹션: {sections.Count}개 | 글자: {totalChars:N0} | 단어: ~{totalWords:N0} | 예상 페이지: ~{pageEstimate}\n" + + $"{resultMsg}", fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"문서 조립 실패: {ex.Message}"); + } + } + + private string AssembleHtml(string path, string title, List<(string Heading, string Content, int Level)> sections, + string mood, bool toc, string? coverSubtitle) + { + var sb = new StringBuilder(); + var style = TemplateService.GetCss(mood); + var moodInfo = TemplateService.GetMood(mood); + + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine($"{Escape(title)}"); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + + // 커버 페이지 + if (!string.IsNullOrWhiteSpace(coverSubtitle)) + { + sb.AppendLine("
      "); + sb.AppendLine($"

      {Escape(title)}

      "); + sb.AppendLine($"
      {Escape(coverSubtitle)}
      "); + sb.AppendLine($"
      {DateTime.Now:yyyy년 MM월 dd일}
      "); + sb.AppendLine("
      "); + } + + sb.AppendLine("
      "); + + if (string.IsNullOrWhiteSpace(coverSubtitle)) + sb.AppendLine($"

      {Escape(title)}

      "); + + // TOC 생성 + if (toc && sections.Count > 1) + { + sb.AppendLine("
      "); + sb.AppendLine("

      📋 목차

      "); + sb.AppendLine("
        "); + for (int i = 0; i < sections.Count; i++) + { + var indent = sections[i].Level > 1 ? " style=\"padding-left:20px\"" : ""; + sb.AppendLine($"{Escape(sections[i].Heading)}"); + } + sb.AppendLine("
      "); + sb.AppendLine("
      "); + } + + // 섹션 본문 + for (int i = 0; i < sections.Count; i++) + { + var (heading, content, level) = sections[i]; + var tag = level <= 1 ? "h2" : "h3"; + sb.AppendLine($"<{tag} id=\"section-{i + 1}\">{Escape(heading)}"); + sb.AppendLine($"
      {content}
      "); + } + + sb.AppendLine("
      "); + sb.AppendLine(""); + sb.AppendLine(""); + + File.WriteAllText(path, sb.ToString(), Encoding.UTF8); + + var issues = ValidateBasic(sb.ToString()); + return issues.Count > 0 + ? $" ⚠ 품질 검증 이슈 {issues.Count}건: {string.Join("; ", issues)}" + : " ✓ 품질 검증 통과"; + } + + private string AssembleDocx(string path, string title, List<(string Heading, string Content, int Level)> sections, + string? headerText, string? footerText) + { + // DOCX 조립: DocxSkill의 sections 형식으로 변환하여 OpenXML 사용 + using var doc = DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Create( + path, DocumentFormat.OpenXml.WordprocessingDocumentType.Document); + + var mainPart = doc.AddMainDocumentPart(); + mainPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document(); + var body = mainPart.Document.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Body()); + + // 제목 + var titlePara = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); + var titleRun = new DocumentFormat.OpenXml.Wordprocessing.Run(); + titleRun.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.RunProperties + { + Bold = new DocumentFormat.OpenXml.Wordprocessing.Bold(), + FontSize = new DocumentFormat.OpenXml.Wordprocessing.FontSize { Val = "48" } + }); + titleRun.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text(title)); + titlePara.AppendChild(titleRun); + body.AppendChild(titlePara); + + // 빈 줄 + body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph()); + + // 각 섹션 + foreach (var (heading, content, level) in sections) + { + // 섹션 제목 + var headPara = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); + var headRun = new DocumentFormat.OpenXml.Wordprocessing.Run(); + headRun.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.RunProperties + { + Bold = new DocumentFormat.OpenXml.Wordprocessing.Bold(), + FontSize = new DocumentFormat.OpenXml.Wordprocessing.FontSize { Val = level <= 1 ? "32" : "28" }, + Color = new DocumentFormat.OpenXml.Wordprocessing.Color { Val = "2B579A" }, + }); + headRun.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text(heading)); + headPara.AppendChild(headRun); + body.AppendChild(headPara); + + // 섹션 본문 (줄 단위 분할) + var lines = StripHtmlTags(content).Split('\n', StringSplitOptions.RemoveEmptyEntries); + foreach (var line in lines) + { + var para = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); + var run = new DocumentFormat.OpenXml.Wordprocessing.Run(); + run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text(line.Trim()) + { + Space = DocumentFormat.OpenXml.SpaceProcessingModeValues.Preserve + }); + para.AppendChild(run); + body.AppendChild(para); + } + + // 섹션 간 빈 줄 + body.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Paragraph()); + } + + return " ✓ DOCX 조립 완료"; + } + + private string AssembleMarkdown(string path, string title, List<(string Heading, string Content, int Level)> sections) + { + var sb = new StringBuilder(); + sb.AppendLine($"# {title}"); + sb.AppendLine(); + sb.AppendLine($"*작성일: {DateTime.Now:yyyy-MM-dd}*"); + sb.AppendLine(); + + // TOC + if (sections.Count > 1) + { + sb.AppendLine("## 목차"); + sb.AppendLine(); + foreach (var (heading, _, _) in sections) + { + var anchor = heading.Replace(" ", "-").ToLowerInvariant(); + sb.AppendLine($"- [{heading}](#{anchor})"); + } + sb.AppendLine(); + sb.AppendLine("---"); + sb.AppendLine(); + } + + foreach (var (heading, content, level) in sections) + { + var prefix = level <= 1 ? "##" : "###"; + sb.AppendLine($"{prefix} {heading}"); + sb.AppendLine(); + sb.AppendLine(StripHtmlTags(content)); + sb.AppendLine(); + } + + File.WriteAllText(path, sb.ToString(), Encoding.UTF8); + return " ✓ Markdown 조립 완료"; + } + + private static int EstimateWordCount(string text) + { + if (string.IsNullOrWhiteSpace(text)) return 0; + var plain = StripHtmlTags(text); + // 한국어: 글자 수 / 3 ≈ 단어 수, 영어: 공백 분리 + var spaces = plain.Count(c => c == ' '); + var koreanChars = plain.Count(c => c >= 0xAC00 && c <= 0xD7A3); + return spaces + 1 + koreanChars / 3; + } + + private static string StripHtmlTags(string html) + { + if (string.IsNullOrEmpty(html)) return ""; + return System.Text.RegularExpressions.Regex.Replace(html, "<[^>]+>", " ") + .Replace(" ", " ") + .Replace("&", "&") + .Replace("<", "<") + .Replace(">", ">") + .Replace(" ", " ") + .Trim(); + } + + private static List ValidateBasic(string html) + { + var issues = new List(); + if (html.Length < 500) + issues.Add("문서 내용이 매우 짧습니다 (500자 미만)"); + + // 빈 섹션 검사 + var emptySectionPattern = new System.Text.RegularExpressions.Regex( + @"]*>[^<]+\s*
      \s*
      ", + System.Text.RegularExpressions.RegexOptions.IgnoreCase); + var emptyMatches = emptySectionPattern.Matches(html); + if (emptyMatches.Count > 0) + issues.Add($"빈 섹션 {emptyMatches.Count}개 발견"); + + // 플레이스홀더 검사 + if (html.Contains("[TODO]", StringComparison.OrdinalIgnoreCase) || + html.Contains("[PLACEHOLDER]", StringComparison.OrdinalIgnoreCase) || + html.Contains("Lorem ipsum", StringComparison.OrdinalIgnoreCase)) + issues.Add("플레이스홀더 텍스트가 남아있습니다"); + + return issues; + } + + private static string Escape(string text) + { + return text.Replace("&", "&").Replace("<", "<").Replace(">", ">"); + } +} diff --git a/src/AxCopilot/Services/Agent/DocumentPlannerTool.cs b/src/AxCopilot/Services/Agent/DocumentPlannerTool.cs new file mode 100644 index 0000000..f7dd5fe --- /dev/null +++ b/src/AxCopilot/Services/Agent/DocumentPlannerTool.cs @@ -0,0 +1,598 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 문서 개요(Outline)를 구조화된 JSON으로 생성하는 도구. +/// - 멀티패스(고품질) ON : 개요만 반환 → LLM이 섹션별로 상세 작성 → document_assemble로 조립 +/// - 멀티패스(고품질) OFF: 개요 + 기본 문서를 즉시 로컬 파일로 저장 (LLM 호출 최소) +/// +public class DocumentPlannerTool : IAgentTool +{ + private static bool IsMultiPassEnabled(AgentContext context) + { + return context.Llm?.EnableMultiPassDocument ?? false; + } + + private static string GetFolderDataUsage(AgentContext context) + { + return context.Llm?.FolderDataUsage ?? "none"; + } + + public string Name => "document_plan"; + public string Description => + "Create a structured document outline/plan and optionally generate the document file immediately. " + + "Use this BEFORE generating long documents (3+ pages). " + + "When multi-pass mode is OFF, this tool directly creates and saves a document file with section headings and key points. " + + "When multi-pass mode is ON, returns a plan for section-by-section writing via document_assemble."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["topic"] = new() + { + Type = "string", + Description = "Document topic or full user request describing what the document should cover." + }, + ["document_type"] = new() + { + Type = "string", + Description = "Type of document: report, proposal, analysis, manual, minutes, presentation, guide. Default: report", + Enum = ["report", "proposal", "analysis", "manual", "minutes", "presentation", "guide"] + }, + ["target_pages"] = new() + { + Type = "integer", + Description = "Target number of pages (1 page ≈ 500 words). Default: 5" + }, + ["format"] = new() + { + Type = "string", + Description = "Output document format: html, docx, markdown. Default: html", + Enum = ["html", "docx", "markdown"] + }, + ["sections_hint"] = new() + { + Type = "string", + Description = "Optional hint for desired sections/structure (e.g. '서론, 현황분석, 문제점, 개선방안, 결론')" + }, + ["reference_summary"] = new() + { + Type = "string", + Description = "Optional summary of reference data already read via file_read (to incorporate into plan)" + }, + }, + Required = ["topic"] + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var topic = args.GetProperty("topic").GetString() ?? ""; + var docType = args.TryGetProperty("document_type", out var dt) ? dt.GetString() ?? "report" : "report"; + var targetPages = args.TryGetProperty("target_pages", out var tp) ? tp.GetInt32() : 5; + var format = args.TryGetProperty("format", out var fmt) ? fmt.GetString() ?? "html" : "html"; + var sectionsHint = args.TryGetProperty("sections_hint", out var sh) ? sh.GetString() ?? "" : ""; + var refSummary = args.TryGetProperty("reference_summary", out var rs) ? rs.GetString() ?? "" : ""; + + if (string.IsNullOrWhiteSpace(topic)) + return Task.FromResult(ToolResult.Fail("topic이 비어있습니다.")); + + if (targetPages < 1) targetPages = 1; + if (targetPages > 50) targetPages = 50; + + var highQuality = IsMultiPassEnabled(context); + var folderDataUsage = GetFolderDataUsage(context); + + // 고품질 모드: 목표 페이지와 단어 수를 1.5배 확장 + var effectivePages = highQuality ? (int)Math.Ceiling(targetPages * 1.5) : targetPages; + var totalWords = effectivePages * 500; + + var sections = BuildSections(docType, effectivePages, sectionsHint, refSummary); + DistributeWordCount(sections, totalWords); + + // 폴더 데이터 활용 모드: 먼저 파일을 읽어야 하므로 별도 처리 + if (folderDataUsage is "active" or "passive") + return ExecuteSinglePassWithData(topic, docType, format, effectivePages, totalWords, sections, folderDataUsage, refSummary); + + // 일반/고품질 모드 모두 동일 구조: + // 개요 반환 + document_assemble 즉시 호출 지시 + return ExecuteWithAssembleInstructions(topic, docType, format, effectivePages, totalWords, sections, highQuality); + } + + // ─── 통합: 포맷별 body 골격 생성 + 즉시 호출 가능한 도구 파라미터 제시 ────── + + private Task ExecuteWithAssembleInstructions(string topic, string docType, string format, + int targetPages, int totalWords, List sections, bool highQuality) + { + var safeTitle = SanitizeFileName(topic); + var ext = format switch { "docx" => ".docx", "markdown" => ".md", _ => ".html" }; + var suggestedFileName = $"{safeTitle}{ext}"; + var label = highQuality ? "[고품질]" : "[표준]"; + + switch (format) + { + case "markdown": + return ExecuteWithMarkdownScaffold(topic, suggestedFileName, sections, targetPages, totalWords, label); + case "docx": + return ExecuteWithDocxScaffold(topic, suggestedFileName, sections, targetPages, totalWords, label); + default: // html + return ExecuteWithHtmlScaffold(topic, suggestedFileName, sections, targetPages, totalWords, label); + } + } + + /// html_create 즉시 호출 가능한 body 골격 반환. 섹션 구조만 고정하고 내부 시각화는 LLM이 자유롭게 선택. + private Task ExecuteWithHtmlScaffold(string topic, string fileName, + List sections, int targetPages, int totalWords, string label) + { + var bodySb = new StringBuilder(); + foreach (var s in sections) + { + // 키포인트 내용을 분석해 적합한 HTML 요소를 제안 (강제 아님) + var elementHints = SuggestHtmlElements(s.KeyPoints); + + bodySb.AppendLine($"

      {Escape(s.Heading)}

      "); + bodySb.AppendLine($""); + // 섹션 내부는 완전히 비워둠 — LLM이 내용과 구조를 모두 결정 + bodySb.AppendLine(); + } + + var output = new StringBuilder(); + output.AppendLine($"📋 문서 개요 생성 완료 {label} ({sections.Count}개 섹션, {targetPages}페이지/{totalWords}단어)"); + output.AppendLine(); + output.AppendLine("## 즉시 실행: html_create 호출"); + output.AppendLine($"path: \"{fileName}\""); + output.AppendLine($"title: \"{topic}\""); + output.AppendLine("toc: true, numbered: true, mood: \"professional\""); + output.AppendLine($"cover: {{\"title\": \"{topic}\", \"author\": \"AX Copilot Agent\"}}"); + output.AppendLine(); + output.AppendLine("body에 아래 섹션 구조를 기반으로 각 섹션의 내용과 시각화를 자유롭게 작성하세요:"); + output.AppendLine("(주석의 '활용 가능 요소'는 참고용이며, 내용에 맞게 다른 요소를 써도 됩니다)"); + output.AppendLine(); + output.AppendLine("--- body 시작 ---"); + output.Append(bodySb); + output.AppendLine("--- body 끝 ---"); + output.AppendLine(); + output.AppendLine("⚠ html_create를 지금 즉시 호출하세요. 모든 섹션에 충분한 실제 내용을 작성하세요."); + + return Task.FromResult(ToolResult.Ok(output.ToString())); + } + + /// 키포인트 키워드를 분석해 적합한 HTML 시각화 요소를 제안합니다. + private static string SuggestHtmlElements(List keyPoints) + { + var joined = string.Join(" ", keyPoints).ToLowerInvariant(); + var hints = new List(); + + // 숫자/통계/비교 데이터 → 테이블 또는 차트 + if (ContainsAny(joined, "매출", "실적", "통계", "수치", "비교", "현황", "지표", "점유율", "비율", "순위", "성과")) + { + hints.Add("table(데이터 정리)"); + hints.Add("div.chart-bar(수치 시각화)"); + } + // SWOT/강약점/리스크 → 그리드 + 콜아웃 + if (ContainsAny(joined, "강점", "약점", "기회", "위협", "swot", "리스크", "문제점", "장점", "단점")) + { + hints.Add("div.grid-2(항목 대비)"); + hints.Add("callout-warning/callout-tip"); + } + // 전략/제안/방향 → 콜아웃 + 배지 + if (ContainsAny(joined, "전략", "제안", "방안", "계획", "방향", "로드맵", "목표")) + { + hints.Add("callout-info(핵심 전략)"); + hints.Add("span.badge-blue/green(구분 배지)"); + } + // 일정/단계/프로세스 → 타임라인 + if (ContainsAny(joined, "일정", "단계", "절차", "프로세스", "과정", "순서", "연혁", "역사")) + hints.Add("div.timeline(단계/일정)"); + // 진행률/달성도 → 진행 바 + if (ContainsAny(joined, "달성", "진행", "완료", "목표 대비", "진척")) + hints.Add("div.progress(달성률)"); + // 카드형 항목 나열 + if (ContainsAny(joined, "종류", "유형", "분류", "구성", "항목", "요소", "구분")) + hints.Add("div.grid-3.card(항목 카드)"); + // 인용/핵심 메시지 + if (ContainsAny(joined, "핵심", "요약", "결론", "시사점", "포인트")) + hints.Add("blockquote(핵심 메시지)"); + + // 기본 (항상 포함) + hints.Add("p/ul/ol(일반 서술)"); + + // 중복 제거, 최대 4개 + return string.Join(" | ", hints.Distinct().Take(4)); + } + + private static bool ContainsAny(string text, params string[] keywords) + => keywords.Any(k => text.Contains(k)); + + /// document_assemble 즉시 호출 가능한 sections 골격 반환 (docx용). + private Task ExecuteWithDocxScaffold(string topic, string fileName, + List sections, int targetPages, int totalWords, string label) + { + var sectionsTemplate = sections.Select(s => new + { + heading = s.Heading, + content = $"[{s.Heading} 내용을 {s.TargetWords}단어 이상으로 작성. 핵심 항목: {string.Join(", ", s.KeyPoints)}]", + level = s.Level, + }); + var json = JsonSerializer.Serialize(new + { + path = fileName, + title = topic, + format = "docx", + cover_subtitle = "AX Copilot Agent", + sections = sectionsTemplate, + }, _jsonOptions); + + var output = new StringBuilder(); + output.AppendLine($"📋 문서 개요 생성 완료 {label} ({sections.Count}개 섹션, {targetPages}페이지/{totalWords}단어)"); + output.AppendLine("아래 document_assemble 파라미터에서 각 sections[].content의 [내용...] 부분을 실제 내용으로 채워서 즉시 호출하세요."); + output.AppendLine(); + output.AppendLine("## 즉시 실행: document_assemble 호출 파라미터"); + output.AppendLine(json); + output.AppendLine("⚠ 주의: 설명하지 말고 document_assemble 도구를 지금 즉시 호출하세요."); + + return Task.FromResult(ToolResult.Ok(output.ToString())); + } + + /// html_create(markdown body) 즉시 호출 가능한 골격 반환. + private Task ExecuteWithMarkdownScaffold(string topic, string fileName, + List sections, int targetPages, int totalWords, string label) + { + var mdSb = new StringBuilder(); + mdSb.AppendLine($"# {topic}"); + mdSb.AppendLine(); + mdSb.AppendLine($"*작성일: {DateTime.Now:yyyy-MM-dd}*"); + mdSb.AppendLine(); + foreach (var s in sections) + { + mdSb.AppendLine($"## {s.Heading}"); + mdSb.AppendLine(); + mdSb.AppendLine($""); + mdSb.AppendLine($"[{s.Heading} 내용을 {s.TargetWords}단어 이상으로 상세히 작성하세요]"); + mdSb.AppendLine(); + } + + var output = new StringBuilder(); + output.AppendLine($"📋 문서 개요 생성 완료 {label} ({sections.Count}개 섹션, {targetPages}페이지/{totalWords}단어)"); + output.AppendLine("아래 file_write 파라미터에서 각 섹션의 [내용...] 부분을 실제 내용으로 채워서 즉시 호출하세요."); + output.AppendLine(); + output.AppendLine("## 즉시 실행: file_write 호출"); + output.AppendLine($"- path: \"{fileName}\""); + output.AppendLine("- content (각 [내용...] 부분을 실제 내용으로 교체):"); + output.AppendLine(mdSb.ToString()); + output.AppendLine("⚠ 주의: 설명하지 말고 file_write 도구를 지금 즉시 호출하세요. 모든 섹션에 실제 내용을 작성하세요."); + + return Task.FromResult(ToolResult.Ok(output.ToString())); + } + + // ─── 싱글패스 + 폴더 데이터 활용: 개요 반환 + LLM이 데이터 읽고 직접 저장 ── + + private Task ExecuteSinglePassWithData(string topic, string docType, string format, + int targetPages, int totalWords, List sections, string folderDataUsage, string refSummary) + { + var ext = format switch { "docx" => ".docx", "markdown" => ".md", _ => ".html" }; + var createTool = format switch { "docx" => "docx_create", "markdown" => "file_write", _ => "html_create" }; + var safeTitle = SanitizeFileName(topic); + var suggestedPath = $"{safeTitle}{ext}"; + + // reference_summary가 이미 있으면 데이터 읽기 단계를 건너뛸 수 있음 + var hasRefData = !string.IsNullOrWhiteSpace(refSummary); + + var plan = new + { + topic, + document_type = docType, + format, + target_pages = targetPages, + estimated_total_words = totalWords, + suggested_file_name = suggestedPath, + sections, + reference_data = hasRefData ? refSummary : null as string, + instructions = new + { + mode = "single-pass-with-data", + folder_data_usage = folderDataUsage, + step1 = hasRefData + ? "Reference data is already provided above. Skip to step 3." + : "Use folder_map to scan the work folder, then use document_read to read RELEVANT files only.", + step2 = hasRefData + ? "(skipped)" + : "Summarize the key findings from the folder documents relevant to the topic.", + step3 = $"Write the COMPLETE document content covering ALL sections above, incorporating folder data.", + step4 = $"Save the document using {createTool} with the path '{suggestedPath}'. " + + "Write ALL sections in a SINGLE tool call. Do NOT split into multiple calls.", + note = "Minimize LLM calls. Read data → write complete document → save. Maximum 3 iterations." + } + }; + + var json = JsonSerializer.Serialize(plan, _jsonOptions); + + var dataNote = hasRefData + ? "참조 데이터가 이미 제공되었습니다. 바로 문서를 작성하세요." + : $"폴더 데이터 활용 모드({folderDataUsage})가 활성화되어 있습니다. 먼저 관련 데이터를 읽은 후 문서를 작성하세요."; + + return Task.FromResult(ToolResult.Ok( + $"📋 문서 개요가 생성되었습니다 [싱글패스+데이터활용] ({sections.Count}개 섹션, 목표 {targetPages}페이지/{totalWords}단어).\n" + + $"{dataNote}\n" + + $"작성 완료 후 {createTool}로 '{suggestedPath}' 파일에 저장하세요.\n\n{json}")); + } + + // ─── HTML 생성 ─────────────────────────────────────────────────────────── + + private static void GenerateHtml(string path, string title, string docType, List sections) + { + var css = TemplateService.GetCss("professional"); + var sb = new StringBuilder(); + + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine($"{Escape(title)}"); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine("
      "); + sb.AppendLine($"

      {Escape(title)}

      "); + sb.AppendLine($"
      문서 유형: {Escape(GetDocTypeLabel(docType))} | 작성일: {DateTime.Now:yyyy-MM-dd} | 섹션: {sections.Count}개
      "); + + // 목차 + if (sections.Count > 1) + { + sb.AppendLine("
      "); + sb.AppendLine("

      📋 목차

      "); + sb.AppendLine(""); + sb.AppendLine("
      "); + } + + // 섹션 본문 + for (int i = 0; i < sections.Count; i++) + { + var sec = sections[i]; + sb.AppendLine($"

      {Escape(sec.Heading)}

      "); + sb.AppendLine("
      "); + foreach (var kp in sec.KeyPoints) + { + sb.AppendLine($"
      "); + sb.AppendLine($"▸ {Escape(kp)}"); + sb.AppendLine($"

      {Escape(kp)}에 대한 상세 내용을 여기에 작성합니다. (목표: 약 {sec.TargetWords / Math.Max(1, sec.KeyPoints.Count)}단어)

      "); + sb.AppendLine("
      "); + } + sb.AppendLine("
      "); + } + + sb.AppendLine("
      "); + sb.AppendLine(""); + sb.AppendLine(""); + + File.WriteAllText(path, sb.ToString(), Encoding.UTF8); + } + + // ─── DOCX 생성 ────────────────────────────────────────────────────────── + + private static void GenerateDocx(string path, string title, List sections) + { + using var doc = DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Create( + path, DocumentFormat.OpenXml.WordprocessingDocumentType.Document); + + var mainPart = doc.AddMainDocumentPart(); + mainPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document(); + var body = mainPart.Document.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Body()); + + // 제목 + AddDocxParagraph(body, title, bold: true, fontSize: "48"); + AddDocxParagraph(body, $"작성일: {DateTime.Now:yyyy-MM-dd}", fontSize: "20", color: "888888"); + AddDocxParagraph(body, ""); // 빈 줄 + + foreach (var sec in sections) + { + AddDocxParagraph(body, sec.Heading, bold: true, fontSize: "32", color: "2B579A"); + foreach (var kp in sec.KeyPoints) + { + AddDocxParagraph(body, $"▸ {kp}", bold: true, fontSize: "22"); + AddDocxParagraph(body, $"{kp}에 대한 상세 내용을 여기에 작성합니다."); + } + AddDocxParagraph(body, ""); // 섹션 간 빈 줄 + } + } + + private static void AddDocxParagraph(DocumentFormat.OpenXml.Wordprocessing.Body body, + string text, bool bold = false, string fontSize = "22", string? color = null) + { + var para = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); + var run = new DocumentFormat.OpenXml.Wordprocessing.Run(); + var props = new DocumentFormat.OpenXml.Wordprocessing.RunProperties + { + FontSize = new DocumentFormat.OpenXml.Wordprocessing.FontSize { Val = fontSize } + }; + if (bold) props.Bold = new DocumentFormat.OpenXml.Wordprocessing.Bold(); + if (color != null) props.Color = new DocumentFormat.OpenXml.Wordprocessing.Color { Val = color }; + run.AppendChild(props); + run.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Text(text) + { + Space = DocumentFormat.OpenXml.SpaceProcessingModeValues.Preserve + }); + para.AppendChild(run); + body.AppendChild(para); + } + + // ─── Markdown 생성 ────────────────────────────────────────────────────── + + private static void GenerateMarkdown(string path, string title, List sections) + { + var sb = new StringBuilder(); + sb.AppendLine($"# {title}"); + sb.AppendLine(); + sb.AppendLine($"*작성일: {DateTime.Now:yyyy-MM-dd}*"); + sb.AppendLine(); + + // 목차 + if (sections.Count > 1) + { + sb.AppendLine("## 목차"); + sb.AppendLine(); + foreach (var sec in sections) + sb.AppendLine($"- [{sec.Heading}](#{sec.Heading.Replace(" ", "-").ToLowerInvariant()})"); + sb.AppendLine(); + sb.AppendLine("---"); + sb.AppendLine(); + } + + foreach (var sec in sections) + { + sb.AppendLine($"## {sec.Heading}"); + sb.AppendLine(); + foreach (var kp in sec.KeyPoints) + { + sb.AppendLine($"### ▸ {kp}"); + sb.AppendLine(); + sb.AppendLine($"{kp}에 대한 상세 내용을 여기에 작성합니다."); + sb.AppendLine(); + } + } + + File.WriteAllText(path, sb.ToString(), Encoding.UTF8); + } + + // ─── 헬퍼 ──────────────────────────────────────────────────────────────── + + private static List BuildSections(string docType, int pages, string hint, string refSummary) + { + if (!string.IsNullOrWhiteSpace(hint)) + { + var hintSections = hint.Split(new[] { ',', '/', '→', '\n' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + var result = new List(); + for (int i = 0; i < hintSections.Length; i++) + { + result.Add(new SectionPlan + { + Id = $"sec-{i + 1}", + Heading = $"{i + 1}. {hintSections[i].TrimStart("0123456789. ".ToCharArray())}", + Level = 1, + KeyPoints = [$"{hintSections[i]} 관련 핵심 내용을 상세히 작성"], + }); + } + return result; + } + + return docType switch + { + "proposal" => new List + { + new() { Id = "sec-1", Heading = "1. 개요", Level = 1, KeyPoints = ["배경", "목적", "범위"] }, + new() { Id = "sec-2", Heading = "2. 현황 분석", Level = 1, KeyPoints = ["현재 상황", "문제점 식별"] }, + new() { Id = "sec-3", Heading = "3. 제안 내용", Level = 1, KeyPoints = ["핵심 제안", "기대 효과", "실행 방안"] }, + new() { Id = "sec-4", Heading = "4. 추진 일정", Level = 1, KeyPoints = ["단계별 일정", "마일스톤"] }, + new() { Id = "sec-5", Heading = "5. 소요 자원", Level = 1, KeyPoints = ["인력", "예산", "장비"] }, + new() { Id = "sec-6", Heading = "6. 기대 효과 및 결론", Level = 1, KeyPoints = ["정량적 효과", "정성적 효과", "결론"] }, + }, + "analysis" => new List + { + new() { Id = "sec-1", Heading = "1. 분석 개요", Level = 1, KeyPoints = ["분석 목적", "분석 범위", "방법론"] }, + new() { Id = "sec-2", Heading = "2. 데이터 현황", Level = 1, KeyPoints = ["데이터 출처", "기본 통계", "데이터 품질"] }, + new() { Id = "sec-3", Heading = "3. 정량 분석", Level = 1, KeyPoints = ["수치 분석", "추세", "비교"] }, + new() { Id = "sec-4", Heading = "4. 정성 분석", Level = 1, KeyPoints = ["패턴", "인사이트", "이상치"] }, + new() { Id = "sec-5", Heading = "5. 종합 해석", Level = 1, KeyPoints = ["핵심 발견", "시사점"] }, + new() { Id = "sec-6", Heading = "6. 결론 및 권장사항", Level = 1, KeyPoints = ["결론", "조치 방안", "추가 분석 필요 항목"] }, + }, + "manual" or "guide" => new List + { + new() { Id = "sec-1", Heading = "1. 소개", Level = 1, KeyPoints = ["목적", "대상 독자", "사전 요구사항"] }, + new() { Id = "sec-2", Heading = "2. 시작하기", Level = 1, KeyPoints = ["설치", "초기 설정", "기본 사용법"] }, + new() { Id = "sec-3", Heading = "3. 주요 기능", Level = 1, KeyPoints = ["기능별 상세 설명", "사용 예시"] }, + new() { Id = "sec-4", Heading = "4. 고급 기능", Level = 1, KeyPoints = ["고급 설정", "커스터마이징", "자동화"] }, + new() { Id = "sec-5", Heading = "5. 문제 해결", Level = 1, KeyPoints = ["자주 묻는 질문", "에러 대응", "지원 정보"] }, + }, + "minutes" => new List + { + new() { Id = "sec-1", Heading = "1. 회의 정보", Level = 1, KeyPoints = ["일시", "참석자", "장소"] }, + new() { Id = "sec-2", Heading = "2. 안건 및 논의", Level = 1, KeyPoints = ["안건별 논의 내용", "주요 의견"] }, + new() { Id = "sec-3", Heading = "3. 결정 사항", Level = 1, KeyPoints = ["합의 내용", "변경 사항"] }, + new() { Id = "sec-4", Heading = "4. 액션 아이템", Level = 1, KeyPoints = ["담당자", "기한", "세부 내용"] }, + new() { Id = "sec-5", Heading = "5. 다음 회의", Level = 1, KeyPoints = ["예정일", "주요 안건"] }, + }, + _ => new List + { + new() { Id = "sec-1", Heading = "1. 개요", Level = 1, KeyPoints = ["배경", "목적", "범위"] }, + new() { Id = "sec-2", Heading = "2. 현황", Level = 1, KeyPoints = ["현재 상태", "주요 지표"] }, + new() { Id = "sec-3", Heading = "3. 분석", Level = 1, KeyPoints = ["데이터 분석", "비교", "추세"] }, + new() { Id = "sec-4", Heading = "4. 주요 발견", Level = 1, KeyPoints = ["핵심 인사이트", "문제점", "기회"] }, + new() { Id = "sec-5", Heading = "5. 제안", Level = 1, KeyPoints = ["개선 방안", "실행 계획"] }, + new() { Id = "sec-6", Heading = "6. 결론", Level = 1, KeyPoints = ["요약", "기대 효과", "향후 과제"] }, + }, + }; + } + + private static void DistributeWordCount(List sections, int totalWords) + { + if (sections.Count == 0) return; + var weights = new double[sections.Count]; + for (int i = 0; i < sections.Count; i++) + weights[i] = (i == 0 || i == sections.Count - 1) ? 0.7 : 1.2; + + var totalWeight = weights.Sum(); + for (int i = 0; i < sections.Count; i++) + sections[i].TargetWords = Math.Max(100, (int)(totalWords * weights[i] / totalWeight)); + } + + private static string SanitizeFileName(string name) + { + var safe = name.Length > 60 ? name[..60] : name; + foreach (var c in Path.GetInvalidFileNameChars()) + safe = safe.Replace(c, '_'); + return safe.Trim().TrimEnd('.'); + } + + private static string GetDocTypeLabel(string docType) => docType switch + { + "proposal" => "제안서", + "analysis" => "분석 보고서", + "manual" or "guide" => "매뉴얼/가이드", + "minutes" => "회의록", + "presentation" => "프레젠테이션", + _ => "보고서", + }; + + private static string Escape(string text) + => text.Replace("&", "&").Replace("<", "<").Replace(">", ">"); + + private static readonly JsonSerializerOptions _jsonOptions = new() + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }; + + private class SectionPlan + { + public string Id { get; set; } = ""; + public string Heading { get; set; } = ""; + public int Level { get; set; } = 1; + public int TargetWords { get; set; } = 300; + public List KeyPoints { get; set; } = new(); + } +} diff --git a/src/AxCopilot/Services/Agent/DocumentReaderTool.cs b/src/AxCopilot/Services/Agent/DocumentReaderTool.cs new file mode 100644 index 0000000..d53bb98 --- /dev/null +++ b/src/AxCopilot/Services/Agent/DocumentReaderTool.cs @@ -0,0 +1,571 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using UglyToad.PdfPig; + +namespace AxCopilot.Services.Agent; + +/// +/// 문서 파일을 읽어 텍스트로 반환하는 도구. +/// PDF, DOCX, XLSX, CSV, TXT, BibTeX, RIS 등 다양한 형식을 지원합니다. +/// +public class DocumentReaderTool : IAgentTool +{ + public string Name => "document_read"; + public string Description => + "Read a document file and extract its text content. " + + "Supports: PDF (.pdf), Word (.docx), Excel (.xlsx), CSV (.csv), text (.txt/.log/.json/.xml/.md), " + + "BibTeX (.bib), RIS (.ris). " + + "For large files, use 'offset' to read from a specific character position (chunked reading). " + + "For large PDFs, use 'pages' parameter to read specific page ranges (e.g., '1-5', '10-20'). " + + "Use 'section' parameter with value 'references' to extract only the references/bibliography section from a PDF."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Document file path (absolute or relative to work folder)" }, + ["max_chars"] = new() { Type = "integer", Description = "Maximum characters to extract per chunk. Default: 8000. Use smaller values for summaries." }, + ["offset"] = new() { Type = "integer", Description = "Character offset to start reading from. Default: 0. Use this to read the next chunk of a large file (value from 'next_offset' in previous response)." }, + ["sheet"] = new() { Type = "string", Description = "For Excel files: sheet name or 1-based index. Default: first sheet." }, + ["pages"] = new() { Type = "string", Description = "For PDF files: page range to read (e.g., '1-5', '3', '10-20'). Default: all pages." }, + ["section"] = new() { Type = "string", Description = "Extract specific section. 'references' = extract references/bibliography from PDF. 'abstract' = extract abstract." }, + }, + Required = ["path"] + }; + + private static readonly HashSet TextExtensions = new(StringComparer.OrdinalIgnoreCase) + { + ".txt", ".log", ".json", ".xml", ".md", ".csv", ".tsv", + ".yaml", ".yml", ".ini", ".cfg", ".conf", ".properties", + ".html", ".htm", ".css", ".js", ".ts", ".py", ".cs", ".java", + ".sql", ".sh", ".bat", ".ps1", ".r", ".m", + }; + + private const int DefaultMaxChars = 8000; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + if (!args.TryGetProperty("path", out var pathEl)) + return ToolResult.Fail("path가 필요합니다."); + var path = pathEl.GetString() ?? ""; + var maxChars = args.TryGetProperty("max_chars", out var mc) ? GetIntValue(mc, DefaultMaxChars) : DefaultMaxChars; + var offset = args.TryGetProperty("offset", out var off) ? GetIntValue(off, 0) : 0; + var sheetParam = args.TryGetProperty("sheet", out var sh) ? sh.GetString() ?? "" : ""; + var pagesParam = args.TryGetProperty("pages", out var pg) ? pg.GetString() ?? "" : ""; + var sectionParam = args.TryGetProperty("section", out var sec) ? sec.GetString() ?? "" : ""; + + if (maxChars < 100) maxChars = DefaultMaxChars; + if (offset < 0) offset = 0; + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + + if (!File.Exists(fullPath)) + return ToolResult.Fail($"파일이 존재하지 않습니다: {fullPath}"); + + var ext = Path.GetExtension(fullPath).ToLowerInvariant(); + + try + { + // 전체 텍스트 추출 (offset > 0이면 전체를 추출해서 잘라야 함) + var extractMax = offset > 0 ? offset + maxChars + 100 : maxChars; + var text = ext switch + { + ".pdf" => await Task.Run(() => ReadPdf(fullPath, extractMax, pagesParam, sectionParam), ct), + ".docx" => await Task.Run(() => ReadDocx(fullPath, extractMax), ct), + ".xlsx" => await Task.Run(() => ReadXlsx(fullPath, sheetParam, extractMax), ct), + ".bib" => await Task.Run(() => ReadBibTeX(fullPath, extractMax), ct), + ".ris" => await Task.Run(() => ReadRis(fullPath, extractMax), ct), + _ when TextExtensions.Contains(ext) => await ReadTextFile(fullPath, extractMax, ct), + _ => null, + }; + + if (text == null) + return ToolResult.Fail($"지원하지 않는 파일 형식: {ext}"); + + var totalExtracted = text.Length; + + // offset 적용 — 청크 분할 읽기 + if (offset > 0) + { + if (offset >= text.Length) + return ToolResult.Ok($"[{Path.GetFileName(fullPath)}] offset {offset}은 문서 끝을 초과합니다 (전체 {text.Length}자).", fullPath); + text = text[offset..]; + } + + // maxChars 자르기 + var hasMore = text.Length > maxChars; + if (hasMore) + text = text[..maxChars]; + + var fileInfo = new FileInfo(fullPath); + var header = $"[{Path.GetFileName(fullPath)}] ({ext.TrimStart('.')}, {FormatSize(fileInfo.Length)})"; + + if (offset > 0) + header += $" — offset {offset}부터 {maxChars}자 읽음"; + + if (hasMore) + { + var nextOffset = offset + maxChars; + header += $"\n⚡ 추가 내용이 있습니다. 다음 청크를 읽으려면 offset={nextOffset}을 사용하세요."; + } + else if (offset > 0) + { + header += " — 문서 끝까지 읽음 ✓"; + } + else if (totalExtracted >= maxChars) + { + header += $" — 처음 {maxChars}자만 추출됨. 계속 읽으려면 offset={maxChars}을 사용하거나, pages 파라미터로 특정 페이지를 지정하세요."; + } + + return ToolResult.Ok($"{header}\n\n{text}", fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"문서 읽기 실패: {ex.Message}"); + } + } + + // ─── PDF ──────────────────────────────────────────────────────────────── + + private static string ReadPdf(string path, int maxChars, string pagesParam, string sectionParam) + { + var sb = new StringBuilder(); + using var doc = PdfDocument.Open(path); + var totalPages = doc.NumberOfPages; + sb.AppendLine($"PDF: {totalPages}페이지"); + sb.AppendLine(); + + // 페이지 범위 파싱 + var (startPage, endPage) = ParsePageRange(pagesParam, totalPages); + + // 섹션 추출 모드 + if (string.Equals(sectionParam, "references", StringComparison.OrdinalIgnoreCase)) + return ExtractReferences(doc, totalPages, maxChars); + if (string.Equals(sectionParam, "abstract", StringComparison.OrdinalIgnoreCase)) + return ExtractAbstract(doc, totalPages, maxChars); + + sb.AppendLine($"읽는 범위: {startPage}-{endPage} / {totalPages} 페이지"); + sb.AppendLine(); + + for (int i = startPage; i <= endPage && sb.Length < maxChars; i++) + { + var page = doc.GetPage(i); + var pageText = page.Text; + + if (!string.IsNullOrWhiteSpace(pageText)) + { + sb.AppendLine($"--- Page {i} ---"); + sb.AppendLine(pageText.Trim()); + sb.AppendLine(); + } + } + + return Truncate(sb.ToString(), maxChars); + } + + private static (int start, int end) ParsePageRange(string pagesParam, int totalPages) + { + if (string.IsNullOrWhiteSpace(pagesParam)) + return (1, totalPages); + + // "5" → page 5 only + if (int.TryParse(pagesParam.Trim(), out var single)) + return (Math.Max(1, single), Math.Min(single, totalPages)); + + // "3-10" → pages 3 to 10 + var parts = pagesParam.Split('-', StringSplitOptions.TrimEntries); + if (parts.Length == 2 && + int.TryParse(parts[0], out var s) && + int.TryParse(parts[1], out var e)) + { + return (Math.Max(1, s), Math.Min(e, totalPages)); + } + + return (1, totalPages); + } + + /// PDF에서 References/Bibliography 섹션을 추출합니다. + private static string ExtractReferences(PdfDocument doc, int totalPages, int maxChars) + { + var sb = new StringBuilder(); + sb.AppendLine("=== References / Bibliography ==="); + sb.AppendLine(); + + // 뒤에서부터 References 섹션 시작점을 찾습니다 + var refPatterns = new[] + { + @"(?i)^\s*(References|Bibliography|Works\s+Cited|Literature\s+Cited|참고\s*문헌|참조|인용\s*문헌)\s*$", + @"(?i)^(References|Bibliography|참고문헌)\s*\n", + }; + + bool found = false; + for (int i = totalPages; i >= Math.Max(1, totalPages - 10) && !found; i--) + { + var pageText = doc.GetPage(i).Text; + if (string.IsNullOrWhiteSpace(pageText)) continue; + + foreach (var pattern in refPatterns) + { + var match = Regex.Match(pageText, pattern, RegexOptions.Multiline); + if (match.Success) + { + // References 시작 지점부터 끝까지 추출 + var refStart = match.Index; + sb.AppendLine($"(Page {i}부터 시작)"); + sb.AppendLine(pageText[refStart..].Trim()); + + // 이후 페이지도 포함 + for (int j = i + 1; j <= totalPages && sb.Length < maxChars; j++) + { + var nextText = doc.GetPage(j).Text; + if (!string.IsNullOrWhiteSpace(nextText)) + sb.AppendLine(nextText.Trim()); + } + found = true; + break; + } + } + } + + if (!found) + { + // References 헤더를 못 찾으면 마지막 3페이지를 반환 + sb.AppendLine("(References 섹션 헤더를 찾지 못했습니다. 마지막 3페이지를 반환합니다.)"); + sb.AppendLine(); + for (int i = Math.Max(1, totalPages - 2); i <= totalPages && sb.Length < maxChars; i++) + { + var pageText = doc.GetPage(i).Text; + if (!string.IsNullOrWhiteSpace(pageText)) + { + sb.AppendLine($"--- Page {i} ---"); + sb.AppendLine(pageText.Trim()); + sb.AppendLine(); + } + } + } + + // 개별 참고문헌 항목 파싱 시도 + var rawRefs = sb.ToString(); + var parsed = ParseReferenceEntries(rawRefs); + if (parsed.Count > 0) + { + var result = new StringBuilder(); + result.AppendLine($"=== References ({parsed.Count}개 항목) ===\n"); + for (int i = 0; i < parsed.Count; i++) + { + result.AppendLine($"[{i + 1}] {parsed[i]}"); + } + return Truncate(result.ToString(), maxChars); + } + + return Truncate(rawRefs, maxChars); + } + + /// PDF에서 Abstract 섹션을 추출합니다. + private static string ExtractAbstract(PdfDocument doc, int totalPages, int maxChars) + { + var sb = new StringBuilder(); + sb.AppendLine("=== Abstract ==="); + sb.AppendLine(); + + // 첫 3페이지에서 Abstract 찾기 + for (int i = 1; i <= Math.Min(3, totalPages); i++) + { + var pageText = doc.GetPage(i).Text; + if (string.IsNullOrWhiteSpace(pageText)) continue; + + var match = Regex.Match(pageText, + @"(?i)(Abstract|초록|요약)\s*\n(.*?)(?=\n\s*(Keywords|Introduction|1\.|서론|키워드|핵심어)\s*[\n:])", + RegexOptions.Singleline); + + if (match.Success) + { + sb.AppendLine(match.Groups[2].Value.Trim()); + return Truncate(sb.ToString(), maxChars); + } + } + + // 찾지 못하면 첫 페이지 반환 + sb.AppendLine("(Abstract 섹션을 찾지 못했습니다. 첫 페이지를 반환합니다.)"); + var firstPage = doc.GetPage(1).Text; + if (!string.IsNullOrWhiteSpace(firstPage)) + sb.AppendLine(firstPage.Trim()); + + return Truncate(sb.ToString(), maxChars); + } + + /// 참고문헌 텍스트에서 개별 항목을 파싱합니다. + private static List ParseReferenceEntries(string text) + { + var entries = new List(); + + // [1], [2] 형태의 번호 매기기 + var numbered = Regex.Split(text, @"\n\s*\[(\d+)\]\s*"); + if (numbered.Length > 3) + { + for (int i = 2; i < numbered.Length; i += 2) + { + var entry = numbered[i].Trim().Replace("\n", " ").Replace(" ", " "); + if (entry.Length > 10) + entries.Add(entry); + } + return entries; + } + + // 1. 2. 3. 형태 + var dotNumbered = Regex.Split(text, @"\n\s*(\d+)\.\s+"); + if (dotNumbered.Length > 5) + { + for (int i = 2; i < dotNumbered.Length; i += 2) + { + var entry = dotNumbered[i].Trim().Replace("\n", " ").Replace(" ", " "); + if (entry.Length > 10) + entries.Add(entry); + } + return entries; + } + + return entries; + } + + // ─── BibTeX ───────────────────────────────────────────────────────────── + + private static string ReadBibTeX(string path, int maxChars) + { + var content = File.ReadAllText(path, Encoding.UTF8); + var sb = new StringBuilder(); + + var entryPattern = new Regex( + @"@(\w+)\s*\{\s*([^,\s]+)\s*,\s*(.*?)\n\s*\}", + RegexOptions.Singleline); + + var fieldPattern = new Regex( + @"(\w+)\s*=\s*[\{""](.*?)[\}""]", + RegexOptions.Singleline); + + var matches = entryPattern.Matches(content); + sb.AppendLine($"BibTeX: {matches.Count}개 항목"); + sb.AppendLine(); + + int idx = 0; + foreach (Match m in matches) + { + if (sb.Length >= maxChars) break; + idx++; + + var entryType = m.Groups[1].Value; + var citeKey = m.Groups[2].Value; + var body = m.Groups[3].Value; + + sb.AppendLine($"[{idx}] @{entryType}{{{citeKey}}}"); + + var fields = fieldPattern.Matches(body); + foreach (Match f in fields) + { + var fieldName = f.Groups[1].Value.ToLower(); + var fieldValue = f.Groups[2].Value.Trim(); + + // 핵심 필드만 표시 + if (fieldName is "author" or "title" or "journal" or "booktitle" + or "year" or "volume" or "number" or "pages" or "doi" + or "publisher" or "url") + { + sb.AppendLine($" {fieldName}: {fieldValue}"); + } + } + sb.AppendLine(); + } + + if (matches.Count == 0) + { + sb.AppendLine("(BibTeX 항목을 파싱하지 못했습니다. 원문을 반환합니다.)"); + sb.AppendLine(Truncate(content, maxChars - sb.Length)); + } + + return Truncate(sb.ToString(), maxChars); + } + + // ─── RIS ──────────────────────────────────────────────────────────────── + + private static string ReadRis(string path, int maxChars) + { + var lines = File.ReadAllLines(path, Encoding.UTF8); + var sb = new StringBuilder(); + + var entries = new List>>(); + Dictionary>? current = null; + + foreach (var line in lines) + { + if (line.StartsWith("TY -")) + { + current = new Dictionary>(); + entries.Add(current); + } + else if (line.StartsWith("ER -")) + { + current = null; + continue; + } + + if (current != null && line.Length >= 6 && line[2] == ' ' && line[3] == ' ' && line[4] == '-' && line[5] == ' ') + { + var tag = line[..2].Trim(); + var value = line[6..].Trim(); + if (!current.ContainsKey(tag)) + current[tag] = new List(); + current[tag].Add(value); + } + } + + sb.AppendLine($"RIS: {entries.Count}개 항목"); + sb.AppendLine(); + + // RIS 태그 → 사람이 읽을 수 있는 이름 + var tagNames = new Dictionary + { + ["TY"] = "Type", ["AU"] = "Author", ["TI"] = "Title", ["T1"] = "Title", + ["JO"] = "Journal", ["JF"] = "Journal", ["PY"] = "Year", ["Y1"] = "Year", + ["VL"] = "Volume", ["IS"] = "Issue", ["SP"] = "Start Page", ["EP"] = "End Page", + ["DO"] = "DOI", ["UR"] = "URL", ["PB"] = "Publisher", ["AB"] = "Abstract", + ["KW"] = "Keyword", ["SN"] = "ISSN/ISBN", + }; + + for (int i = 0; i < entries.Count && sb.Length < maxChars; i++) + { + sb.AppendLine($"[{i + 1}]"); + var entry = entries[i]; + foreach (var (tag, values) in entry) + { + var label = tagNames.GetValueOrDefault(tag, tag); + if (tag is "AU" or "KW") + sb.AppendLine($" {label}: {string.Join("; ", values)}"); + else + sb.AppendLine($" {label}: {string.Join(" ", values)}"); + } + sb.AppendLine(); + } + + return Truncate(sb.ToString(), maxChars); + } + + // ─── DOCX ─────────────────────────────────────────────────────────────── + + private static string ReadDocx(string path, int maxChars) + { + var sb = new StringBuilder(); + using var doc = WordprocessingDocument.Open(path, false); + var body = doc.MainDocumentPart?.Document.Body; + if (body == null) return "(빈 문서)"; + + foreach (var para in body.Elements()) + { + var text = para.InnerText; + if (!string.IsNullOrWhiteSpace(text)) + { + sb.AppendLine(text); + if (sb.Length >= maxChars) break; + } + } + + return Truncate(sb.ToString(), maxChars); + } + + // ─── XLSX ─────────────────────────────────────────────────────────────── + + private static string ReadXlsx(string path, string sheetParam, int maxChars) + { + var sb = new StringBuilder(); + using var doc = SpreadsheetDocument.Open(path, false); + var workbook = doc.WorkbookPart; + if (workbook == null) return "(빈 스프레드시트)"; + + var sheets = workbook.Workbook.Sheets?.Elements().ToList() ?? []; + if (sheets.Count == 0) return "(시트 없음)"; + + sb.AppendLine($"Excel: {sheets.Count}개 시트 ({string.Join(", ", sheets.Select(s => s.Name?.Value))})"); + sb.AppendLine(); + + Sheet? targetSheet = null; + if (!string.IsNullOrEmpty(sheetParam)) + { + if (int.TryParse(sheetParam, out var idx) && idx >= 1 && idx <= sheets.Count) + targetSheet = sheets[idx - 1]; + else + targetSheet = sheets.FirstOrDefault(s => + string.Equals(s.Name?.Value, sheetParam, StringComparison.OrdinalIgnoreCase)); + } + targetSheet ??= sheets[0]; + + var sheetId = targetSheet.Id?.Value; + if (sheetId == null) return "(시트 ID 없음)"; + + var wsPart = (WorksheetPart)workbook.GetPartById(sheetId); + var sharedStrings = workbook.SharedStringTablePart?.SharedStringTable + .Elements().ToList() ?? []; + + var rows = wsPart.Worksheet.Descendants().ToList(); + sb.AppendLine($"[{targetSheet.Name?.Value}] ({rows.Count} rows)"); + + foreach (var row in rows) + { + var cells = row.Elements().ToList(); + var values = new List(); + foreach (var cell in cells) + values.Add(GetCellValue(cell, sharedStrings)); + sb.AppendLine(string.Join("\t", values)); + if (sb.Length >= maxChars) break; + } + + return Truncate(sb.ToString(), maxChars); + } + + private static string GetCellValue(Cell cell, List sharedStrings) + { + var value = cell.CellValue?.Text ?? ""; + if (cell.DataType?.Value == CellValues.SharedString) + { + if (int.TryParse(value, out var idx) && idx >= 0 && idx < sharedStrings.Count) + return sharedStrings[idx].InnerText; + } + return value; + } + + // ─── Text ─────────────────────────────────────────────────────────────── + + private static async Task ReadTextFile(string path, int maxChars, CancellationToken ct) + { + var text = await File.ReadAllTextAsync(path, Encoding.UTF8, ct); + return Truncate(text, maxChars); + } + + // ─── Helpers ──────────────────────────────────────────────────────────── + + private static string Truncate(string text, int maxChars) + { + if (text.Length <= maxChars) return text; + return text[..maxChars] + "\n\n... (내용 잘림 — pages 또는 section 파라미터로 특정 부분을 읽을 수 있습니다)"; + } + + private static string FormatSize(long bytes) => bytes switch + { + < 1024 => $"{bytes} B", + < 1024 * 1024 => $"{bytes / 1024.0:F1} KB", + _ => $"{bytes / (1024.0 * 1024.0):F1} MB", + }; + + /// JsonElement에서 int를 안전하게 추출합니다. string/integer 양쪽 호환. + private static int GetIntValue(JsonElement el, int defaultValue) + { + if (el.ValueKind == JsonValueKind.Number) return el.GetInt32(); + if (el.ValueKind == JsonValueKind.String && int.TryParse(el.GetString(), out var v)) return v; + return defaultValue; + } +} diff --git a/src/AxCopilot/Services/Agent/DocumentReviewTool.cs b/src/AxCopilot/Services/Agent/DocumentReviewTool.cs new file mode 100644 index 0000000..090d9d7 --- /dev/null +++ b/src/AxCopilot/Services/Agent/DocumentReviewTool.cs @@ -0,0 +1,161 @@ +using System.IO; +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// 생성된 문서를 자동 검증하는 도구. +/// HTML/Markdown/텍스트 파일의 구조적 완성도, 날짜 정합성, 빈 섹션 등을 점검합니다. +/// +public class DocumentReviewTool : IAgentTool +{ + public string Name => "document_review"; + public string Description => + "Review a generated document for quality issues. " + + "Checks: empty sections, placeholder text, date consistency, missing headings, broken HTML tags, " + + "content completeness. Returns a structured review report with issues found and suggestions."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Path to the document to review" }, + ["expected_sections"] = new() + { + Type = "array", + Description = "Optional list of expected section titles to verify presence", + Items = new() { Type = "string" }, + }, + }, + Required = ["path"] + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + if (!args.TryGetProperty("path", out var pathEl)) + return Task.FromResult(ToolResult.Fail("path가 필요합니다.")); + var path = pathEl.GetString() ?? ""; + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + + if (!context.IsPathAllowed(fullPath)) + return Task.FromResult(ToolResult.Fail($"경로 접근 차단: {fullPath}")); + if (!File.Exists(fullPath)) + return Task.FromResult(ToolResult.Fail($"파일 없음: {fullPath}")); + + var content = File.ReadAllText(fullPath); + var ext = Path.GetExtension(fullPath).ToLowerInvariant(); + var issues = new List(); + var stats = new List(); + + // 기본 통계 + var lineCount = content.Split('\n').Length; + var charCount = content.Length; + stats.Add($"파일: {Path.GetFileName(fullPath)} ({charCount:N0}자, {lineCount}줄)"); + + // 1. 빈 콘텐츠 검사 + if (string.IsNullOrWhiteSpace(content)) + { + issues.Add("[CRITICAL] 파일 내용이 비어있습니다"); + return Task.FromResult(ToolResult.Ok(FormatReport(stats, issues, []), fullPath)); + } + + // 2. 플레이스홀더 텍스트 검사 + var placeholders = new[] { "TODO", "TBD", "FIXME", "Lorem ipsum", "[여기에", "[INSERT", "placeholder", "예시 텍스트" }; + foreach (var ph in placeholders) + { + if (content.Contains(ph, StringComparison.OrdinalIgnoreCase)) + issues.Add($"[WARNING] 플레이스홀더 텍스트 발견: \"{ph}\""); + } + + // 3. 날짜 정합성 (미래 날짜, 너무 오래된 날짜) + var datePattern = new Regex(@"\d{4}[-년.]\s*\d{1,2}[-월.]\s*\d{1,2}[일]?"); + foreach (Match m in datePattern.Matches(content)) + { + var cleaned = Regex.Replace(m.Value, @"[년월일\s]", "-").TrimEnd('-'); + if (DateTime.TryParse(cleaned, out var dt)) + { + if (dt > DateTime.Now.AddDays(365)) + issues.Add($"[WARNING] 미래 날짜 감지: {m.Value}"); + else if (dt < DateTime.Now.AddYears(-50)) + issues.Add($"[INFO] 매우 오래된 날짜: {m.Value}"); + } + } + + // 4. HTML 전용 검사 + if (ext is ".html" or ".htm") + { + // 빈 섹션 (h2/h3 뒤에 내용 없이 바로 다음 h2/h3) + var emptySection = Regex.Matches(content, @"]*>.*?\s* 0) + issues.Add($"[WARNING] 빈 섹션 {emptySection.Count}개 감지 (헤딩 뒤 내용 없음)"); + + // 닫히지 않은 태그 + var openTags = Regex.Matches(content, @"<(table|div|section|article)\b[^/]*>").Count; + var closeTags = Regex.Matches(content, @"").Count; + if (openTags != closeTags) + issues.Add($"[WARNING] HTML 태그 불균형: 열림 {openTags}개, 닫힘 {closeTags}개"); + + // 이미지 alt 텍스트 누락 + var imgNoAlt = Regex.Matches(content, @"]*\balt\s*=)[^>]*>"); + if (imgNoAlt.Count > 0) + issues.Add($"[INFO] alt 속성 없는 이미지 {imgNoAlt.Count}개"); + + // 제목 태그 수 + var h1Count = Regex.Matches(content, @" s.Length > 20) + .GroupBy(s => s.Trim()) + .Where(g => g.Count() >= 3); + foreach (var dup in sentences.Take(3)) + issues.Add($"[WARNING] 반복 텍스트 ({dup.Count()}회): \"{dup.Key[..Math.Min(50, dup.Key.Length)]}...\""); + + var suggestions = new List(); + if (issues.Count == 0) + suggestions.Add("문서 검증 통과 — 구조적 이슈가 발견되지 않았습니다."); + else + { + suggestions.Add($"총 {issues.Count}개 이슈 발견. 수정 후 다시 검증하세요."); + if (issues.Any(i => i.Contains("플레이스홀더"))) + suggestions.Add("플레이스홀더를 실제 내용으로 교체하세요."); + if (issues.Any(i => i.Contains("빈 섹션"))) + suggestions.Add("빈 섹션에 내용을 추가하거나 불필요한 헤딩을 제거하세요."); + } + + return Task.FromResult(ToolResult.Ok(FormatReport(stats, issues, suggestions), fullPath)); + } + + private static string FormatReport(List stats, List issues, List suggestions) + { + var sb = new System.Text.StringBuilder(); + sb.AppendLine("=== 문서 검증 보고서 ===\n"); + foreach (var s in stats) sb.AppendLine($"📊 {s}"); + sb.AppendLine(); + if (issues.Count == 0) + sb.AppendLine("✅ 이슈 없음 — 문서가 정상입니다."); + else + { + sb.AppendLine($"⚠ 발견된 이슈 ({issues.Count}건):"); + foreach (var i in issues) sb.AppendLine($" {i}"); + } + sb.AppendLine(); + foreach (var s in suggestions) sb.AppendLine($"💡 {s}"); + return sb.ToString(); + } +} diff --git a/src/AxCopilot/Services/Agent/DocxSkill.cs b/src/AxCopilot/Services/Agent/DocxSkill.cs new file mode 100644 index 0000000..20482a5 --- /dev/null +++ b/src/AxCopilot/Services/Agent/DocxSkill.cs @@ -0,0 +1,543 @@ +using System.IO; +using System.Text.Json; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Wordprocessing; + +namespace AxCopilot.Services.Agent; + +/// +/// Word (.docx) 문서를 생성하는 내장 스킬. +/// 테이블, 텍스트 스타일링, 머리글/바닥글, 페이지 나누기 등 고급 기능을 지원합니다. +/// +public class DocxSkill : IAgentTool +{ + public string Name => "docx_create"; + public string Description => "Create a rich Word (.docx) document. " + + "Supports: sections with heading+body, tables with optional header styling, " + + "text formatting (bold, italic, color, highlight, shading), " + + "headers/footers with page numbers, page breaks between sections, " + + "and numbered/bulleted lists."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Output file path (.docx). Relative to work folder." }, + ["title"] = new() { Type = "string", Description = "Document title (optional)." }, + ["sections"] = new() + { + Type = "array", + Description = "Array of content blocks. Each block is one of:\n" + + "• Section: {\"heading\": \"...\", \"body\": \"...\", \"level\": 1|2}\n" + + "• Table: {\"type\": \"table\", \"headers\": [\"A\",\"B\"], \"rows\": [[\"1\",\"2\"]], \"style\": \"striped|plain\"}\n" + + "• PageBreak: {\"type\": \"pagebreak\"}\n" + + "• List: {\"type\": \"list\", \"style\": \"bullet|number\", \"items\": [\"item1\", \"item2\"]}\n" + + "Body text supports inline formatting: **bold**, *italic*, `code`.", + Items = new() { Type = "object" } + }, + ["header"] = new() { Type = "string", Description = "Header text shown at top of every page (optional)." }, + ["footer"] = new() { Type = "string", Description = "Footer text. Use {page} for page number. Default: 'AX Copilot · {page}' if header is set." }, + ["page_numbers"] = new() { Type = "boolean", Description = "Show page numbers in footer. Default: true if header or footer is set." }, + }, + Required = ["path", "sections"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var title = args.TryGetProperty("title", out var t) ? t.GetString() ?? "" : ""; + var headerText = args.TryGetProperty("header", out var hdr) ? hdr.GetString() : null; + var footerText = args.TryGetProperty("footer", out var ftr) ? ftr.GetString() : null; + var showPageNumbers = args.TryGetProperty("page_numbers", out var pn) ? pn.GetBoolean() : + (headerText != null || footerText != null); + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (context.ActiveTab == "Cowork") fullPath = AgentContext.EnsureTimestampedPath(fullPath); + if (!fullPath.EndsWith(".docx", StringComparison.OrdinalIgnoreCase)) + fullPath += ".docx"; + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + try + { + var sections = args.GetProperty("sections"); + + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + using var doc = WordprocessingDocument.Create(fullPath, WordprocessingDocumentType.Document); + var mainPart = doc.AddMainDocumentPart(); + mainPart.Document = new Document(); + var body = mainPart.Document.AppendChild(new Body()); + + // 머리글/바닥글 설정 + if (headerText != null || footerText != null || showPageNumbers) + AddHeaderFooter(mainPart, body, headerText, footerText, showPageNumbers); + + // 제목 + if (!string.IsNullOrEmpty(title)) + { + body.Append(CreateTitleParagraph(title)); + // 제목 아래 구분선 + body.Append(new Paragraph( + new ParagraphProperties + { + ParagraphBorders = new ParagraphBorders( + new BottomBorder { Val = BorderValues.Single, Size = 6, Color = "4472C4", Space = 1 }), + SpacingBetweenLines = new SpacingBetweenLines { After = "300" }, + })); + } + + int sectionCount = 0; + int tableCount = 0; + foreach (var section in sections.EnumerateArray()) + { + var blockType = section.TryGetProperty("type", out var bt) ? bt.GetString()?.ToLower() : null; + + if (blockType == "pagebreak") + { + body.Append(CreatePageBreak()); + continue; + } + + if (blockType == "table") + { + body.Append(CreateTable(section)); + tableCount++; + continue; + } + + if (blockType == "list") + { + AppendList(body, section); + continue; + } + + // 일반 섹션 (heading + body) + var heading = section.TryGetProperty("heading", out var h) ? h.GetString() ?? "" : ""; + var bodyText = section.TryGetProperty("body", out var b) ? b.GetString() ?? "" : ""; + var level = section.TryGetProperty("level", out var lv) ? lv.GetInt32() : 1; + + if (!string.IsNullOrEmpty(heading)) + body.Append(CreateHeadingParagraph(heading, level)); + + if (!string.IsNullOrEmpty(bodyText)) + { + foreach (var line in bodyText.Split('\n')) + { + body.Append(CreateBodyParagraph(line)); + } + } + sectionCount++; + } + + mainPart.Document.Save(); + + var parts = new List(); + if (!string.IsNullOrEmpty(title)) parts.Add($"제목: {title}"); + if (sectionCount > 0) parts.Add($"섹션: {sectionCount}개"); + if (tableCount > 0) parts.Add($"테이블: {tableCount}개"); + if (headerText != null) parts.Add("머리글"); + if (showPageNumbers) parts.Add("페이지번호"); + + return ToolResult.Ok( + $"Word 문서 생성 완료: {fullPath}\n{string.Join(", ", parts)}", + fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"Word 문서 생성 실패: {ex.Message}"); + } + } + + // ═══════════════════════════════════════════════════ + // 제목/소제목/본문 단락 생성 + // ═══════════════════════════════════════════════════ + + private static Paragraph CreateTitleParagraph(string text) + { + var para = new Paragraph(); + para.ParagraphProperties = new ParagraphProperties + { + Justification = new Justification { Val = JustificationValues.Center }, + SpacingBetweenLines = new SpacingBetweenLines { After = "100" }, + }; + var run = new Run(new Text(text)); + run.RunProperties = new RunProperties + { + Bold = new Bold(), + FontSize = new FontSize { Val = "44" }, // 22pt + Color = new Color { Val = "1F3864" }, + }; + para.Append(run); + return para; + } + + private static Paragraph CreateHeadingParagraph(string text, int level) + { + var para = new Paragraph(); + var fontSize = level <= 1 ? "32" : "26"; // 16pt / 13pt + var color = level <= 1 ? "2E74B5" : "404040"; + + para.ParagraphProperties = new ParagraphProperties + { + SpacingBetweenLines = new SpacingBetweenLines { Before = level <= 1 ? "360" : "240", After = "120" }, + }; + + // 레벨1 소제목에 하단 테두리 추가 + if (level <= 1) + { + para.ParagraphProperties.ParagraphBorders = new ParagraphBorders( + new BottomBorder { Val = BorderValues.Single, Size = 4, Color = "B4C6E7", Space = 1 }); + } + + var run = new Run(new Text(text)); + run.RunProperties = new RunProperties + { + Bold = new Bold(), + FontSize = new FontSize { Val = fontSize }, + Color = new Color { Val = color }, + }; + para.Append(run); + return para; + } + + private static Paragraph CreateBodyParagraph(string text) + { + var para = new Paragraph(); + para.ParagraphProperties = new ParagraphProperties + { + SpacingBetweenLines = new SpacingBetweenLines { Line = "360" }, // 1.5배 줄간격 + }; + + // 인라인 서식 파싱: **bold**, *italic*, `code` + AppendFormattedRuns(para, text); + return para; + } + + /// **bold**, *italic*, `code` 인라인 서식을 Run으로 변환 + private static void AppendFormattedRuns(Paragraph para, string text) + { + // 패턴: **bold** | *italic* | `code` | 일반텍스트 + var regex = new System.Text.RegularExpressions.Regex( + @"\*\*(.+?)\*\*|\*(.+?)\*|`(.+?)`"); + int lastIndex = 0; + + foreach (System.Text.RegularExpressions.Match match in regex.Matches(text)) + { + // 매치 전 일반 텍스트 + if (match.Index > lastIndex) + para.Append(CreateRun(text[lastIndex..match.Index])); + + if (match.Groups[1].Success) // **bold** + { + var run = CreateRun(match.Groups[1].Value); + run.RunProperties ??= new RunProperties(); + run.RunProperties.Bold = new Bold(); + para.Append(run); + } + else if (match.Groups[2].Success) // *italic* + { + var run = CreateRun(match.Groups[2].Value); + run.RunProperties ??= new RunProperties(); + run.RunProperties.Italic = new Italic(); + para.Append(run); + } + else if (match.Groups[3].Success) // `code` + { + var run = CreateRun(match.Groups[3].Value); + run.RunProperties ??= new RunProperties(); + run.RunProperties.RunFonts = new RunFonts { Ascii = "Consolas", HighAnsi = "Consolas" }; + run.RunProperties.FontSize = new FontSize { Val = "20" }; + run.RunProperties.Shading = new Shading + { + Val = ShadingPatternValues.Clear, + Fill = "F2F2F2", + Color = "auto" + }; + para.Append(run); + } + + lastIndex = match.Index + match.Length; + } + + // 나머지 텍스트 + if (lastIndex < text.Length) + para.Append(CreateRun(text[lastIndex..])); + + // 빈 텍스트인 경우 빈 Run 추가 + if (lastIndex == 0 && text.Length == 0) + para.Append(CreateRun("")); + } + + private static Run CreateRun(string text) + { + var run = new Run(new Text(text) { Space = SpaceProcessingModeValues.Preserve }); + run.RunProperties = new RunProperties + { + FontSize = new FontSize { Val = "22" }, // 11pt + }; + return run; + } + + // ═══════════════════════════════════════════════════ + // 테이블 생성 + // ═══════════════════════════════════════════════════ + + private static Table CreateTable(JsonElement section) + { + var headers = section.TryGetProperty("headers", out var hArr) ? hArr : default; + var rows = section.TryGetProperty("rows", out var rArr) ? rArr : default; + var tableStyle = section.TryGetProperty("style", out var ts) ? ts.GetString() ?? "striped" : "striped"; + + var table = new Table(); + + // 테이블 속성 — 테두리 + 전체 너비 + var tblProps = new TableProperties( + new TableBorders( + new TopBorder { Val = BorderValues.Single, Size = 4, Color = "D9D9D9" }, + new BottomBorder { Val = BorderValues.Single, Size = 4, Color = "D9D9D9" }, + new LeftBorder { Val = BorderValues.Single, Size = 4, Color = "D9D9D9" }, + new RightBorder { Val = BorderValues.Single, Size = 4, Color = "D9D9D9" }, + new InsideHorizontalBorder { Val = BorderValues.Single, Size = 4, Color = "D9D9D9" }, + new InsideVerticalBorder { Val = BorderValues.Single, Size = 4, Color = "D9D9D9" } + ), + new TableWidth { Width = "5000", Type = TableWidthUnitValues.Pct } + ); + table.AppendChild(tblProps); + + // 헤더 행 + if (headers.ValueKind == JsonValueKind.Array) + { + var headerRow = new TableRow(); + foreach (var h in headers.EnumerateArray()) + { + var cell = new TableCell(); + cell.TableCellProperties = new TableCellProperties + { + Shading = new Shading { Val = ShadingPatternValues.Clear, Fill = "2E74B5", Color = "auto" }, + TableCellVerticalAlignment = new TableCellVerticalAlignment { Val = TableVerticalAlignmentValues.Center }, + }; + var para = new Paragraph(new Run(new Text(h.GetString() ?? "")) + { + RunProperties = new RunProperties + { + Bold = new Bold(), + FontSize = new FontSize { Val = "20" }, + Color = new Color { Val = "FFFFFF" }, + } + }); + para.ParagraphProperties = new ParagraphProperties + { + SpacingBetweenLines = new SpacingBetweenLines { Before = "40", After = "40" }, + }; + cell.Append(para); + headerRow.Append(cell); + } + table.Append(headerRow); + } + + // 데이터 행 + if (rows.ValueKind == JsonValueKind.Array) + { + int rowIdx = 0; + foreach (var row in rows.EnumerateArray()) + { + var dataRow = new TableRow(); + foreach (var cellVal in row.EnumerateArray()) + { + var cell = new TableCell(); + + // striped 스타일: 짝수행에 배경색 + if (tableStyle == "striped" && rowIdx % 2 == 0) + { + cell.TableCellProperties = new TableCellProperties + { + Shading = new Shading { Val = ShadingPatternValues.Clear, Fill = "F2F7FB", Color = "auto" }, + }; + } + + var para = new Paragraph(new Run(new Text(cellVal.ToString()) { Space = SpaceProcessingModeValues.Preserve }) + { + RunProperties = new RunProperties { FontSize = new FontSize { Val = "20" } } + }); + para.ParagraphProperties = new ParagraphProperties + { + SpacingBetweenLines = new SpacingBetweenLines { Before = "20", After = "20" }, + }; + cell.Append(para); + dataRow.Append(cell); + } + table.Append(dataRow); + rowIdx++; + } + } + + return table; + } + + // ═══════════════════════════════════════════════════ + // 리스트 (번호/불릿) + // ═══════════════════════════════════════════════════ + + private static void AppendList(Body body, JsonElement section) + { + var items = section.TryGetProperty("items", out var arr) ? arr : default; + var listStyle = section.TryGetProperty("style", out var ls) ? ls.GetString() ?? "bullet" : "bullet"; + + if (items.ValueKind != JsonValueKind.Array) return; + + int idx = 1; + foreach (var item in items.EnumerateArray()) + { + var text = item.GetString() ?? item.ToString(); + var prefix = listStyle == "number" ? $"{idx}. " : "• "; + + var para = new Paragraph(); + para.ParagraphProperties = new ParagraphProperties + { + Indentation = new Indentation { Left = "720" }, // 0.5 inch + SpacingBetweenLines = new SpacingBetweenLines { Line = "320" }, + }; + + var prefixRun = new Run(new Text(prefix) { Space = SpaceProcessingModeValues.Preserve }); + prefixRun.RunProperties = new RunProperties + { + FontSize = new FontSize { Val = "22" }, + Bold = listStyle == "number" ? new Bold() : null, + }; + para.Append(prefixRun); + + var textRun = new Run(new Text(text) { Space = SpaceProcessingModeValues.Preserve }); + textRun.RunProperties = new RunProperties { FontSize = new FontSize { Val = "22" } }; + para.Append(textRun); + + body.Append(para); + idx++; + } + } + + // ═══════════════════════════════════════════════════ + // 페이지 나누기 + // ═══════════════════════════════════════════════════ + + private static Paragraph CreatePageBreak() + { + var para = new Paragraph(); + var run = new Run(new Break { Type = BreakValues.Page }); + para.Append(run); + return para; + } + + // ═══════════════════════════════════════════════════ + // 머리글/바닥글 + // ═══════════════════════════════════════════════════ + + private static void AddHeaderFooter(MainDocumentPart mainPart, Body body, + string? headerText, string? footerText, bool showPageNumbers) + { + // 머리글 + if (!string.IsNullOrEmpty(headerText)) + { + var headerPart = mainPart.AddNewPart(); + var header = new Header(); + var para = new Paragraph(new Run(new Text(headerText)) + { + RunProperties = new RunProperties + { + FontSize = new FontSize { Val = "18" }, // 9pt + Color = new Color { Val = "808080" }, + } + }); + para.ParagraphProperties = new ParagraphProperties + { + Justification = new Justification { Val = JustificationValues.Right }, + }; + header.Append(para); + headerPart.Header = header; + + // SectionProperties에 머리글 연결 + var secProps = body.GetFirstChild() ?? body.AppendChild(new SectionProperties()); + secProps.Append(new HeaderReference + { + Type = HeaderFooterValues.Default, + Id = mainPart.GetIdOfPart(headerPart) + }); + } + + // 바닥글 + if (!string.IsNullOrEmpty(footerText) || showPageNumbers) + { + var footerPart = mainPart.AddNewPart(); + var footer = new Footer(); + var para = new Paragraph(); + para.ParagraphProperties = new ParagraphProperties + { + Justification = new Justification { Val = JustificationValues.Center }, + }; + + var displayText = footerText ?? "AX Copilot"; + + if (showPageNumbers) + { + // 바닥글 텍스트 + 페이지 번호 + if (displayText.Contains("{page}")) + { + var parts = displayText.Split("{page}"); + para.Append(CreateFooterRun(parts[0])); + para.Append(CreatePageNumberRun()); + if (parts.Length > 1) + para.Append(CreateFooterRun(parts[1])); + } + else + { + para.Append(CreateFooterRun(displayText + " · ")); + para.Append(CreatePageNumberRun()); + } + } + else + { + para.Append(CreateFooterRun(displayText)); + } + + footer.Append(para); + footerPart.Footer = footer; + + var secProps = body.GetFirstChild() ?? body.AppendChild(new SectionProperties()); + secProps.Append(new FooterReference + { + Type = HeaderFooterValues.Default, + Id = mainPart.GetIdOfPart(footerPart) + }); + } + } + + private static Run CreateFooterRun(string text) => + new(new Text(text) { Space = SpaceProcessingModeValues.Preserve }) + { + RunProperties = new RunProperties + { + FontSize = new FontSize { Val = "16" }, + Color = new Color { Val = "999999" }, + } + }; + + private static Run CreatePageNumberRun() + { + var run = new Run(); + run.RunProperties = new RunProperties + { + FontSize = new FontSize { Val = "16" }, + Color = new Color { Val = "999999" }, + }; + run.Append(new FieldChar { FieldCharType = FieldCharValues.Begin }); + run.Append(new FieldCode(" PAGE ") { Space = SpaceProcessingModeValues.Preserve }); + run.Append(new FieldChar { FieldCharType = FieldCharValues.End }); + return run; + } +} diff --git a/src/AxCopilot/Services/Agent/EncodingTool.cs b/src/AxCopilot/Services/Agent/EncodingTool.cs new file mode 100644 index 0000000..0f5e553 --- /dev/null +++ b/src/AxCopilot/Services/Agent/EncodingTool.cs @@ -0,0 +1,189 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 파일 인코딩 감지 및 변환 도구. +public class EncodingTool : IAgentTool +{ + public string Name => "encoding_tool"; + public string Description => + "Detect and convert file text encoding. Actions: " + + "'detect' — detect file encoding (UTF-8, EUC-KR, etc.); " + + "'convert' — convert file from one encoding to another; " + + "'list' — list common encoding names."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action: detect, convert, list", + Enum = ["detect", "convert", "list"], + }, + ["path"] = new() + { + Type = "string", + Description = "File path", + }, + ["from_encoding"] = new() + { + Type = "string", + Description = "Source encoding name (e.g. 'euc-kr', 'shift-jis'). Auto-detected if omitted.", + }, + ["to_encoding"] = new() + { + Type = "string", + Description = "Target encoding name (default: 'utf-8')", + }, + }, + Required = ["action"], + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + + if (action == "list") + return ListEncodings(); + + var rawPath = args.TryGetProperty("path", out var pv) ? pv.GetString() ?? "" : ""; + if (string.IsNullOrEmpty(rawPath)) + return ToolResult.Fail("'path'가 필요합니다."); + + var path = Path.IsPathRooted(rawPath) ? rawPath : Path.Combine(context.WorkFolder, rawPath); + if (!context.IsPathAllowed(path)) + return ToolResult.Fail($"경로 접근 차단: {path}"); + if (!File.Exists(path)) + return ToolResult.Fail($"파일 없음: {path}"); + + try + { + return action switch + { + "detect" => DetectEncoding(path), + "convert" => await ConvertEncoding(path, args, context), + _ => ToolResult.Fail($"Unknown action: {action}"), + }; + } + catch (Exception ex) + { + return ToolResult.Fail($"인코딩 처리 오류: {ex.Message}"); + } + } + + private static ToolResult DetectEncoding(string path) + { + var bytes = File.ReadAllBytes(path); + var detected = DetectEncodingFromBytes(bytes); + var sb = new StringBuilder(); + sb.AppendLine($"File: {Path.GetFileName(path)}"); + sb.AppendLine($"Size: {bytes.Length:N0} bytes"); + sb.AppendLine($"Detected Encoding: {detected.EncodingName}"); + sb.AppendLine($"Code Page: {detected.CodePage}"); + sb.AppendLine($"BOM Present: {HasBom(bytes)}"); + return ToolResult.Ok(sb.ToString()); + } + + private static async Task ConvertEncoding(string path, JsonElement args, AgentContext context) + { + var toName = args.TryGetProperty("to_encoding", out var te) ? te.GetString() ?? "utf-8" : "utf-8"; + + // 쓰기 권한 확인 + var allowed = await context.CheckWritePermissionAsync("encoding_tool", path); + if (!allowed) return ToolResult.Fail("파일 쓰기 권한이 거부되었습니다."); + + // 소스 인코딩 결정 + Encoding fromEnc; + if (args.TryGetProperty("from_encoding", out var fe) && !string.IsNullOrEmpty(fe.GetString())) + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + fromEnc = Encoding.GetEncoding(fe.GetString()!); + } + else + { + var rawBytes = File.ReadAllBytes(path); + fromEnc = DetectEncodingFromBytes(rawBytes); + } + + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + var toEnc = Encoding.GetEncoding(toName); + + var content = File.ReadAllText(path, fromEnc); + File.WriteAllText(path, content, toEnc); + + return ToolResult.Ok( + $"변환 완료: {fromEnc.EncodingName} → {toEnc.EncodingName}\nFile: {path}", + filePath: path); + } + + private static ToolResult ListEncodings() + { + var sb = new StringBuilder(); + sb.AppendLine("주요 인코딩 목록:"); + sb.AppendLine(" utf-8 — UTF-8 (유니코드, 기본)"); + sb.AppendLine(" utf-16 — UTF-16 LE"); + sb.AppendLine(" utf-16BE — UTF-16 BE"); + sb.AppendLine(" euc-kr — EUC-KR (한국어)"); + sb.AppendLine(" ks_c_5601-1987 — 한글 완성형"); + sb.AppendLine(" shift_jis — Shift-JIS (일본어)"); + sb.AppendLine(" gb2312 — GB2312 (중국어 간체)"); + sb.AppendLine(" iso-8859-1 — Latin-1 (서유럽)"); + sb.AppendLine(" ascii — US-ASCII"); + sb.AppendLine(" utf-32 — UTF-32"); + return ToolResult.Ok(sb.ToString()); + } + + private static Encoding DetectEncodingFromBytes(byte[] bytes) + { + // BOM 감지 + if (bytes.Length >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) + return Encoding.UTF8; + if (bytes.Length >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE) + return Encoding.Unicode; // UTF-16 LE + if (bytes.Length >= 2 && bytes[0] == 0xFE && bytes[1] == 0xFF) + return Encoding.BigEndianUnicode; + + // 간단한 UTF-8 유효성 검사 + if (IsValidUtf8(bytes)) + return Encoding.UTF8; + + // 한국어 환경 기본값 + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + try { return Encoding.GetEncoding("euc-kr"); } + catch (Exception) { return Encoding.Default; } + } + + private static bool IsValidUtf8(byte[] bytes) + { + var i = 0; + var hasMultibyte = false; + while (i < bytes.Length) + { + if (bytes[i] <= 0x7F) { i++; continue; } + int extra; + if ((bytes[i] & 0xE0) == 0xC0) extra = 1; + else if ((bytes[i] & 0xF0) == 0xE0) extra = 2; + else if ((bytes[i] & 0xF8) == 0xF0) extra = 3; + else return false; + + if (i + extra >= bytes.Length) return false; + for (var j = 1; j <= extra; j++) + if ((bytes[i + j] & 0xC0) != 0x80) return false; + hasMultibyte = true; + i += extra + 1; + } + return hasMultibyte || bytes.Length < 100; // 순수 ASCII도 UTF-8으로 간주 + } + + private static bool HasBom(byte[] bytes) + { + if (bytes.Length >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) return true; + if (bytes.Length >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE) return true; + if (bytes.Length >= 2 && bytes[0] == 0xFE && bytes[1] == 0xFF) return true; + return false; + } +} diff --git a/src/AxCopilot/Services/Agent/EnvTool.cs b/src/AxCopilot/Services/Agent/EnvTool.cs new file mode 100644 index 0000000..5bcfb27 --- /dev/null +++ b/src/AxCopilot/Services/Agent/EnvTool.cs @@ -0,0 +1,127 @@ +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 환경변수 읽기·쓰기 도구. +/// 현재 프로세스 범위에서만 동작하며 시스템 환경변수는 변경하지 않습니다. +/// +public class EnvTool : IAgentTool +{ + public string Name => "env_tool"; + public string Description => + "Read or set environment variables (process scope only). Actions: " + + "'get' — read an environment variable value; " + + "'set' — set an environment variable (process scope, not permanent); " + + "'list' — list all environment variables; " + + "'expand' — expand %VAR% references in a string."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action to perform", + Enum = ["get", "set", "list", "expand"], + }, + ["name"] = new() + { + Type = "string", + Description = "Variable name (for get/set)", + }, + ["value"] = new() + { + Type = "string", + Description = "Variable value (for set) or string to expand (for expand)", + }, + ["filter"] = new() + { + Type = "string", + Description = "Filter pattern for list action (case-insensitive substring match)", + }, + }, + Required = ["action"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + + try + { + return Task.FromResult(action switch + { + "get" => Get(args), + "set" => Set(args), + "list" => ListVars(args), + "expand" => Expand(args), + _ => ToolResult.Fail($"Unknown action: {action}"), + }); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"환경변수 오류: {ex.Message}")); + } + } + + private static ToolResult Get(JsonElement args) + { + if (!args.TryGetProperty("name", out var n)) + return ToolResult.Fail("'name' parameter is required for get action"); + var name = n.GetString() ?? ""; + var value = Environment.GetEnvironmentVariable(name); + return value != null + ? ToolResult.Ok($"{name}={value}") + : ToolResult.Ok($"{name} is not set"); + } + + private static ToolResult Set(JsonElement args) + { + if (!args.TryGetProperty("name", out var n)) + return ToolResult.Fail("'name' parameter is required for set action"); + if (!args.TryGetProperty("value", out var v)) + return ToolResult.Fail("'value' parameter is required for set action"); + + var name = n.GetString() ?? ""; + var value = v.GetString() ?? ""; + Environment.SetEnvironmentVariable(name, value, EnvironmentVariableTarget.Process); + return ToolResult.Ok($"✓ Set {name}={value} (process scope)"); + } + + private static ToolResult ListVars(JsonElement args) + { + var filter = args.TryGetProperty("filter", out var f) ? f.GetString() ?? "" : ""; + var vars = Environment.GetEnvironmentVariables(); + var entries = new List(); + + foreach (System.Collections.DictionaryEntry entry in vars) + { + var key = entry.Key?.ToString() ?? ""; + var val = entry.Value?.ToString() ?? ""; + if (!string.IsNullOrEmpty(filter) && + !key.Contains(filter, StringComparison.OrdinalIgnoreCase) && + !val.Contains(filter, StringComparison.OrdinalIgnoreCase)) + continue; + + // 긴 값은 자르기 + if (val.Length > 120) val = val[..120] + "..."; + entries.Add($"{key}={val}"); + } + + entries.Sort(StringComparer.OrdinalIgnoreCase); + var result = $"Environment variables ({entries.Count}):\n" + string.Join("\n", entries); + if (result.Length > 8000) result = result[..8000] + "\n... (truncated)"; + return ToolResult.Ok(result); + } + + private static ToolResult Expand(JsonElement args) + { + if (!args.TryGetProperty("value", out var v)) + return ToolResult.Fail("'value' parameter is required for expand action"); + var input = v.GetString() ?? ""; + var expanded = Environment.ExpandEnvironmentVariables(input); + return ToolResult.Ok(expanded); + } +} diff --git a/src/AxCopilot/Services/Agent/ExcelSkill.cs b/src/AxCopilot/Services/Agent/ExcelSkill.cs new file mode 100644 index 0000000..7f62cca --- /dev/null +++ b/src/AxCopilot/Services/Agent/ExcelSkill.cs @@ -0,0 +1,406 @@ +using System.IO; +using System.Text.Json; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace AxCopilot.Services.Agent; + +/// +/// Excel (.xlsx) 문서를 생성하는 내장 스킬. +/// 셀 서식(색상/테두리/볼드), 수식, 열 너비, 셀 병합, 틀 고정 등을 지원합니다. +/// +public class ExcelSkill : IAgentTool +{ + public string Name => "excel_create"; + public string Description => "Create a styled Excel (.xlsx) file. " + + "Supports: header styling (bold white text on blue background), " + + "striped rows, column auto-width, formulas (=SUM, =AVERAGE, etc), " + + "cell merge, freeze panes (freeze header row), and number formatting."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Output file path (.xlsx). Relative to work folder." }, + ["sheet_name"] = new() { Type = "string", Description = "Sheet name. Default: 'Sheet1'." }, + ["headers"] = new() { Type = "array", Description = "Column headers as JSON array of strings.", Items = new() { Type = "string" } }, + ["rows"] = new() { Type = "array", Description = "Data rows as JSON array of arrays. Use string starting with '=' for formulas (e.g. '=SUM(A2:A10)').", Items = new() { Type = "array", Items = new() { Type = "string" } } }, + ["style"] = new() { Type = "string", Description = "Table style: 'styled' (blue header, striped rows, borders) or 'plain'. Default: 'styled'" }, + ["col_widths"] = new() { Type = "array", Description = "Column widths as JSON array of numbers (in characters). e.g. [15, 10, 20]. Auto-fit if omitted.", Items = new() { Type = "number" } }, + ["freeze_header"] = new() { Type = "boolean", Description = "Freeze the header row. Default: true for styled." }, + ["merges"] = new() { Type = "array", Description = "Cell merge ranges. e.g. [\"A1:C1\", \"D5:D8\"]", Items = new() { Type = "string" } }, + ["summary_row"] = new() { Type = "object", Description = "Auto-generate summary row. {\"label\": \"합계\", \"columns\": {\"B\": \"SUM\", \"C\": \"AVERAGE\"}}. Adds formulas at bottom." }, + }, + Required = ["path", "headers", "rows"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var sheetName = args.TryGetProperty("sheet_name", out var sn) ? sn.GetString() ?? "Sheet1" : "Sheet1"; + var tableStyle = args.TryGetProperty("style", out var st) ? st.GetString() ?? "styled" : "styled"; + var isStyled = tableStyle != "plain"; + var freezeHeader = args.TryGetProperty("freeze_header", out var fh) ? fh.GetBoolean() : isStyled; + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (context.ActiveTab == "Cowork") fullPath = AgentContext.EnsureTimestampedPath(fullPath); + if (!fullPath.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase)) + fullPath += ".xlsx"; + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + try + { + var headers = args.GetProperty("headers"); + var rows = args.GetProperty("rows"); + + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + using var spreadsheet = SpreadsheetDocument.Create(fullPath, SpreadsheetDocumentType.Workbook); + + var workbookPart = spreadsheet.AddWorkbookPart(); + workbookPart.Workbook = new Workbook(); + + // Stylesheet 추가 (서식용) + var stylesPart = workbookPart.AddNewPart(); + stylesPart.Stylesheet = CreateStylesheet(isStyled); + stylesPart.Stylesheet.Save(); + + var worksheetPart = workbookPart.AddNewPart(); + worksheetPart.Worksheet = new Worksheet(); + + // 열 너비 설정 + var colCount = headers.GetArrayLength(); + var columns = CreateColumns(args, colCount); + if (columns != null) + worksheetPart.Worksheet.Append(columns); + + var sheetData = new SheetData(); + worksheetPart.Worksheet.Append(sheetData); + + var sheets = workbookPart.Workbook.AppendChild(new Sheets()); + sheets.Append(new Sheet + { + Id = workbookPart.GetIdOfPart(worksheetPart), + SheetId = 1, + Name = sheetName, + }); + + // 헤더 행 (styleIndex 1 = 볼드 흰색 + 파란배경) + var headerRow = new Row { RowIndex = 1 }; + int colIdx = 0; + foreach (var h in headers.EnumerateArray()) + { + var cellRef = GetCellReference(colIdx, 0); + var cell = new Cell + { + CellReference = cellRef, + DataType = CellValues.String, + CellValue = new CellValue(h.GetString() ?? ""), + StyleIndex = isStyled ? (uint)1 : 0, + }; + headerRow.Append(cell); + colIdx++; + } + sheetData.Append(headerRow); + + // 데이터 행 + int rowCount = 0; + uint rowNum = 2; + foreach (var row in rows.EnumerateArray()) + { + var dataRow = new Row { RowIndex = rowNum }; + int ci = 0; + foreach (var cellVal in row.EnumerateArray()) + { + var cellRef = GetCellReference(ci, (int)rowNum - 1); + var cell = new Cell { CellReference = cellRef }; + + // striped 스타일: 짝수행 + if (isStyled && rowCount % 2 == 0) + cell.StyleIndex = 2; // 연한 파란 배경 + + var strVal = cellVal.ToString(); + + // 수식 (=으로 시작) + if (strVal.StartsWith('=')) + { + cell.CellFormula = new CellFormula(strVal); + cell.DataType = null; // 수식은 DataType 없음 + } + else if (cellVal.ValueKind == JsonValueKind.Number) + { + cell.DataType = CellValues.Number; + cell.CellValue = new CellValue(cellVal.GetDouble().ToString()); + } + else + { + cell.DataType = CellValues.String; + cell.CellValue = new CellValue(strVal); + } + + dataRow.Append(cell); + ci++; + } + sheetData.Append(dataRow); + rowCount++; + rowNum++; + } + + // 요약 행 (summary_row) + if (args.TryGetProperty("summary_row", out var summary)) + AddSummaryRow(sheetData, summary, rowNum, colCount, rowCount, isStyled); + + // 셀 병합 + if (args.TryGetProperty("merges", out var merges) && merges.ValueKind == JsonValueKind.Array) + { + var mergeCells = new MergeCells(); + foreach (var merge in merges.EnumerateArray()) + { + var range = merge.GetString(); + if (!string.IsNullOrEmpty(range)) + mergeCells.Append(new MergeCell { Reference = range }); + } + if (mergeCells.HasChildren) + worksheetPart.Worksheet.InsertAfter(mergeCells, sheetData); + } + + // 틀 고정 (헤더 행) + if (freezeHeader) + { + var sheetViews = new SheetViews(new SheetView( + new Pane + { + VerticalSplit = 1, + TopLeftCell = "A2", + ActivePane = PaneValues.BottomLeft, + State = PaneStateValues.Frozen + }, + new Selection + { + Pane = PaneValues.BottomLeft, + ActiveCell = "A2", + SequenceOfReferences = new ListValue { InnerText = "A2" } + }) + { TabSelected = true, WorkbookViewId = 0 }); + + var insertBefore = (OpenXmlElement?)worksheetPart.Worksheet.GetFirstChild() + ?? worksheetPart.Worksheet.GetFirstChild(); + worksheetPart.Worksheet.InsertBefore(sheetViews, insertBefore); + } + + workbookPart.Workbook.Save(); + + var features = new List(); + if (isStyled) features.Add("스타일 적용"); + if (freezeHeader) features.Add("틀 고정"); + if (args.TryGetProperty("merges", out _)) features.Add("셀 병합"); + if (args.TryGetProperty("summary_row", out _)) features.Add("요약행"); + var featureStr = features.Count > 0 ? $" [{string.Join(", ", features)}]" : ""; + + return ToolResult.Ok( + $"Excel 파일 생성 완료: {fullPath}\n시트: {sheetName}, 열: {colCount}, 행: {rowCount}{featureStr}", + fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"Excel 생성 실패: {ex.Message}"); + } + } + + // ═══════════════════════════════════════════════════ + // Stylesheet (셀 서식) + // ═══════════════════════════════════════════════════ + + private static Stylesheet CreateStylesheet(bool isStyled) + { + var stylesheet = new Stylesheet(); + + // Fonts + var fonts = new Fonts( + new Font( // 0: 기본 + new FontSize { Val = 11 }, + new FontName { Val = "맑은 고딕" } + ), + new Font( // 1: 볼드 흰색 (헤더용) + new Bold(), + new FontSize { Val = 11 }, + new Color { Rgb = "FFFFFFFF" }, + new FontName { Val = "맑은 고딕" } + ), + new Font( // 2: 볼드 (요약행용) + new Bold(), + new FontSize { Val = 11 }, + new FontName { Val = "맑은 고딕" } + ) + ); + stylesheet.Append(fonts); + + // Fills + var fills = new Fills( + new Fill(new PatternFill { PatternType = PatternValues.None }), // 0: none (필수) + new Fill(new PatternFill { PatternType = PatternValues.Gray125 }), // 1: gray125 (필수) + new Fill(new PatternFill // 2: 파란 헤더 배경 + { + PatternType = PatternValues.Solid, + ForegroundColor = new ForegroundColor { Rgb = "FF2E74B5" }, + BackgroundColor = new BackgroundColor { Indexed = 64 } + }), + new Fill(new PatternFill // 3: 연한 파란 (striped) + { + PatternType = PatternValues.Solid, + ForegroundColor = new ForegroundColor { Rgb = "FFF2F7FB" }, + BackgroundColor = new BackgroundColor { Indexed = 64 } + }), + new Fill(new PatternFill // 4: 연한 회색 (요약행) + { + PatternType = PatternValues.Solid, + ForegroundColor = new ForegroundColor { Rgb = "FFE8E8E8" }, + BackgroundColor = new BackgroundColor { Indexed = 64 } + }) + ); + stylesheet.Append(fills); + + // Borders + var borders = new Borders( + new Border( // 0: 테두리 없음 + new LeftBorder(), new RightBorder(), + new TopBorder(), new BottomBorder(), new DiagonalBorder() + ), + new Border( // 1: 얇은 테두리 + new LeftBorder(new Color { Rgb = "FFD9D9D9" }) { Style = BorderStyleValues.Thin }, + new RightBorder(new Color { Rgb = "FFD9D9D9" }) { Style = BorderStyleValues.Thin }, + new TopBorder(new Color { Rgb = "FFD9D9D9" }) { Style = BorderStyleValues.Thin }, + new BottomBorder(new Color { Rgb = "FFD9D9D9" }) { Style = BorderStyleValues.Thin }, + new DiagonalBorder() + ) + ); + stylesheet.Append(borders); + + // CellFormats + var cellFormats = new CellFormats( + new CellFormat // 0: 기본 + { + FontId = 0, FillId = 0, BorderId = isStyled ? (uint)1 : 0, ApplyBorder = isStyled + }, + new CellFormat // 1: 헤더 (볼드 흰색 + 파란배경 + 테두리) + { + FontId = 1, FillId = 2, BorderId = 1, + ApplyFont = true, ApplyFill = true, ApplyBorder = true, + Alignment = new Alignment { Horizontal = HorizontalAlignmentValues.Center, Vertical = VerticalAlignmentValues.Center } + }, + new CellFormat // 2: striped 행 (연한 파란 배경) + { + FontId = 0, FillId = 3, BorderId = 1, + ApplyFill = true, ApplyBorder = true + }, + new CellFormat // 3: 요약행 (볼드 + 회색 배경) + { + FontId = 2, FillId = 4, BorderId = 1, + ApplyFont = true, ApplyFill = true, ApplyBorder = true + } + ); + stylesheet.Append(cellFormats); + + return stylesheet; + } + + // ═══════════════════════════════════════════════════ + // 열 너비 + // ═══════════════════════════════════════════════════ + + private static Columns? CreateColumns(JsonElement args, int colCount) + { + var hasWidths = args.TryGetProperty("col_widths", out var widthsArr) && widthsArr.ValueKind == JsonValueKind.Array; + + // col_widths가 없으면 기본 너비 15 적용 + var columns = new Columns(); + for (int i = 0; i < colCount; i++) + { + double width = 15; // 기본 너비 + if (hasWidths && i < widthsArr.GetArrayLength()) + width = widthsArr[i].GetDouble(); + + columns.Append(new Column + { + Min = (uint)(i + 1), + Max = (uint)(i + 1), + Width = width, + CustomWidth = true, + }); + } + + return columns; + } + + // ═══════════════════════════════════════════════════ + // 요약 행 + // ═══════════════════════════════════════════════════ + + private static void AddSummaryRow(SheetData sheetData, JsonElement summary, + uint rowNum, int colCount, int dataRowCount, bool isStyled) + { + var label = summary.TryGetProperty("label", out var lbl) ? lbl.GetString() ?? "합계" : "합계"; + var colFormulas = summary.TryGetProperty("columns", out var cols) ? cols : default; + + var summaryRow = new Row { RowIndex = rowNum }; + + // 첫 번째 열에 라벨 + var labelCell = new Cell + { + CellReference = GetCellReference(0, (int)rowNum - 1), + DataType = CellValues.String, + CellValue = new CellValue(label), + StyleIndex = isStyled ? (uint)3 : 0, + }; + summaryRow.Append(labelCell); + + // 나머지 열에 수식 또는 빈 셀 + for (int ci = 1; ci < colCount; ci++) + { + var colLetter = GetColumnLetter(ci); + var cell = new Cell + { + CellReference = GetCellReference(ci, (int)rowNum - 1), + StyleIndex = isStyled ? (uint)3 : 0, + }; + + if (colFormulas.ValueKind == JsonValueKind.Object && + colFormulas.TryGetProperty(colLetter, out var funcName)) + { + var func = funcName.GetString()?.ToUpper() ?? "SUM"; + var startRow = 2; + var endRow = startRow + dataRowCount - 1; + cell.CellFormula = new CellFormula($"={func}({colLetter}{startRow}:{colLetter}{endRow})"); + } + + summaryRow.Append(cell); + } + + sheetData.Append(summaryRow); + } + + // ═══════════════════════════════════════════════════ + // 유틸리티 + // ═══════════════════════════════════════════════════ + + private static string GetColumnLetter(int colIndex) + { + var result = ""; + while (colIndex >= 0) + { + result = (char)('A' + colIndex % 26) + result; + colIndex = colIndex / 26 - 1; + } + return result; + } + + private static string GetCellReference(int colIndex, int rowIndex) + => $"{GetColumnLetter(colIndex)}{rowIndex + 1}"; +} diff --git a/src/AxCopilot/Services/Agent/ExtendedHookRunner.cs b/src/AxCopilot/Services/Agent/ExtendedHookRunner.cs new file mode 100644 index 0000000..743ba9d --- /dev/null +++ b/src/AxCopilot/Services/Agent/ExtendedHookRunner.cs @@ -0,0 +1,370 @@ +using System.Diagnostics; +using System.IO; +using System.Net.Http; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 확장 훅 러너 (Phase 17-C). +/// 기존 AgentHookRunner(pre/post 스크립트)를 대체·보완. +/// 새 이벤트 종류(SessionStart, FileChanged 등)와 실행 모드(Http, Prompt, Agent) 지원. +/// +public static class ExtendedHookRunner +{ + private static readonly HttpClient _http = new() { Timeout = TimeSpan.FromSeconds(60) }; + + private static readonly JsonSerializerOptions _json = new() + { + PropertyNameCaseInsensitive = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + + /// 지정 이벤트의 훅을 모두 실행하고 결과를 병합하여 반환. + public static async Task RunEventAsync( + IReadOnlyList hooks, + HookContext context, + CancellationToken ct = default) + { + if (hooks == null || hooks.Count == 0) + return new ExtendedHookResult(); + + var matchingHooks = hooks + .Where(h => h.Enabled && h.Event == context.Event) + .Where(h => MatchesTool(h.Matcher, context.ToolName)) + .Where(h => EvaluateCondition(h.Condition, context)) + .ToList(); + + if (matchingHooks.Count == 0) + return new ExtendedHookResult(); + + // Once 훅 처리: 실행 후 비활성화 목록 수집 + var toDisable = new List(); + + // 비동기 훅: fire-and-forget (asyncRewake는 결과를 모니터링) + var asyncHooks = matchingHooks.Where(h => h.IsAsync || h.AsyncRewake).ToList(); + foreach (var hook in asyncHooks) + { + if (hook.AsyncRewake) + { + // Phase 25-B: asyncRewake — 비동기 실행하되 exit code 2 시 rewake 콜백 호출 + _ = Task.Run(async () => + { + try + { + var result = await ExecuteSingleAsync(hook, context, CancellationToken.None); + if (result.Block) + { + // exit code 2 = rewake → AdditionalContext를 통해 대화 재활성화 + AsyncRewakeTriggered?.Invoke(null, new AsyncRewakeEventArgs + { + HookName = hook.Name, + AdditionalContext = result.BlockReason ?? result.AdditionalContext, + SessionId = context.SessionId, + }); + } + } + catch (Exception) { } + }); + } + else + { + _ = Task.Run(async () => + { + try { await ExecuteSingleAsync(hook, context, CancellationToken.None); } + catch (Exception) { } + }); + } + if (hook.Once) toDisable.Add(hook); + } + + // 동기 훅: 순차 실행, 결과 병합 + var syncHooks = matchingHooks.Where(h => !h.IsAsync).ToList(); + string? combinedContext = null; + string? updatedInput = null; + ExtendedPermissionDecision? permDecision = null; + List? watchPaths = null; + bool anyBlocked = false; + string? blockReason = null; + + foreach (var hook in syncHooks) + { + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(hook.TimeoutSeconds)); + + try + { + var result = await ExecuteSingleAsync(hook, context, cts.Token); + + if (result.Block) { anyBlocked = true; blockReason = result.BlockReason; break; } + if (result.AdditionalContext != null) + combinedContext = (combinedContext ?? "") + "\n" + result.AdditionalContext; + if (result.UpdatedInput != null) updatedInput = result.UpdatedInput; + if (result.PermissionDecision.HasValue) permDecision = result.PermissionDecision; + if (result.WatchPaths != null) + { + watchPaths ??= new List(); + watchPaths.AddRange(result.WatchPaths); + } + if (hook.Once) toDisable.Add(hook); + } + catch (OperationCanceledException) { } + catch (Exception) { } + } + + // Once 훅 비활성화 + foreach (var h in toDisable) h.Enabled = false; + + return new ExtendedHookResult + { + Block = anyBlocked, + BlockReason = blockReason, + AdditionalContext = combinedContext?.Trim(), + UpdatedInput = updatedInput, + PermissionDecision = permDecision, + WatchPaths = watchPaths, + }; + } + + private static async Task ExecuteSingleAsync( + ExtendedHookEntry hook, + HookContext context, + CancellationToken ct) + { + return hook.Mode switch + { + HookExecutionMode.Command => await RunCommandHookAsync(hook, context, ct), + HookExecutionMode.Http => await RunHttpHookAsync(hook, context, ct), + HookExecutionMode.Prompt => new ExtendedHookResult(), // LLM 검사는 LlmService 필요 — 외부에서 처리 + HookExecutionMode.Agent => new ExtendedHookResult(), // 미니 에이전트는 AgentLoopService 필요 — 외부 처리 + _ => new ExtendedHookResult() + }; + } + + private static async Task RunCommandHookAsync( + ExtendedHookEntry hook, + HookContext context, + CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(hook.ScriptPath)) + return new ExtendedHookResult(); + + var scriptPath = Environment.ExpandEnvironmentVariables(hook.ScriptPath); + if (!File.Exists(scriptPath)) + return new ExtendedHookResult(); + + var ext = Path.GetExtension(scriptPath).ToLowerInvariant(); + string fileName, args; + switch (ext) + { + case ".ps1": + fileName = "powershell.exe"; + args = $"-NoProfile -ExecutionPolicy Bypass -File \"{scriptPath}\""; + break; + case ".bat": case ".cmd": + fileName = "cmd.exe"; + args = $"/c \"{scriptPath}\""; + break; + default: + return new ExtendedHookResult(); + } + if (!string.IsNullOrWhiteSpace(hook.Arguments)) args += " " + hook.Arguments; + + var psi = new ProcessStartInfo + { + FileName = fileName, Arguments = args, + WorkingDirectory = context.WorkFolder.Length > 0 ? context.WorkFolder + : Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), + UseShellExecute = false, CreateNoWindow = true, + RedirectStandardOutput = true, RedirectStandardError = true, + }; + SetEnvVars(psi, context); + + using var process = new Process { StartInfo = psi }; + var stdout = new StringBuilder(); + var stderr = new StringBuilder(); + process.OutputDataReceived += (_, e) => { if (e.Data != null) stdout.AppendLine(e.Data); }; + process.ErrorDataReceived += (_, e) => { if (e.Data != null) stderr.AppendLine(e.Data); }; + process.Start(); + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + try { await process.WaitForExitAsync(ct); } + catch (OperationCanceledException) { try { process.Kill(true); } catch (Exception) { } return new ExtendedHookResult(); } + + // exit code 2 → Block + if (process.ExitCode == 2) + return new ExtendedHookResult { Block = true, BlockReason = stderr.ToString().Trim().Length > 0 ? stderr.ToString().Trim() : stdout.ToString().Trim() }; + + // JSON 출력 파싱 + var output = stdout.ToString().Trim(); + if (output.StartsWith("{")) + { + try + { + using var doc = JsonDocument.Parse(output); + var root = doc.RootElement; + return new ExtendedHookResult + { + AdditionalContext = root.TryGetProperty("additionalContext", out var ac) ? ac.GetString() : null, + UpdatedInput = root.TryGetProperty("updatedInput", out var ui) ? ui.GetString() : null, + }; + } + catch (Exception) { } + } + + return new ExtendedHookResult { AdditionalContext = output.Length > 0 ? output : null }; + } + + private static async Task RunHttpHookAsync( + ExtendedHookEntry hook, + HookContext context, + CancellationToken ct) + { + if (string.IsNullOrWhiteSpace(hook.Url)) return new ExtendedHookResult(); + + try + { + var payload = JsonSerializer.Serialize(new + { + @event = context.Event.ToString(), + tool_name = context.ToolName, + tool_input = context.ToolInput, + tool_output = context.ToolOutput, + user_message = context.UserMessage, + session_id = context.SessionId, + work_folder = context.WorkFolder, + }, _json); + + using var req = new HttpRequestMessage(HttpMethod.Post, hook.Url); + req.Content = new StringContent(payload, Encoding.UTF8, "application/json"); + foreach (var (k, v) in hook.Headers) req.Headers.TryAddWithoutValidation(k, v); + + var resp = await _http.SendAsync(req, ct); + if (!resp.IsSuccessStatusCode) return new ExtendedHookResult(); + + var body = await resp.Content.ReadAsStringAsync(ct); + if (body.StartsWith("{")) + { + using var doc = JsonDocument.Parse(body); + var root = doc.RootElement; + var block = root.TryGetProperty("block", out var b) && b.GetBoolean(); + return new ExtendedHookResult + { + Block = block, + AdditionalContext = root.TryGetProperty("additionalContext", out var ac) ? ac.GetString() : null, + UpdatedInput = root.TryGetProperty("updatedInput", out var ui) ? ui.GetString() : null, + }; + } + } + catch (Exception) { } + return new ExtendedHookResult(); + } + + private static void SetEnvVars(ProcessStartInfo psi, HookContext context) + { + // Phase 17-C-EXT: HookEnvironmentBuilder로 CC 호환 변수 자동 주입 + var envVars = HookEnvironmentBuilder.Build(context); + foreach (var (key, value) in envVars) + psi.EnvironmentVariables[key] = value; + + // 하위 호환: 기존 변수 유지 + psi.EnvironmentVariables["AX_WORK_FOLDER"] = context.WorkFolder; + psi.EnvironmentVariables["AX_TOOL_TIMING"] = context.Event == HookEventKind.PreToolUse ? "pre" : "post"; + psi.EnvironmentVariables["AX_TOOL_SUCCESS"] = context.ToolSuccess ? "true" : "false"; + } + + private static bool MatchesTool(string? matcher, string? toolName) + { + if (string.IsNullOrEmpty(matcher) || matcher == "*") return true; + if (string.IsNullOrEmpty(toolName)) return false; + return string.Equals(matcher, toolName, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Phase 25-A: 훅 조건부 실행. + /// CC의 `if` 필드와 동등. 간단한 조건식을 평가합니다. + /// 형식: "field == value", "field != value", "field contains value" + /// 지원 필드: tool_name, event, session_id, work_folder, active_tab + /// + private static bool EvaluateCondition(string? condition, HookContext context) + { + if (string.IsNullOrEmpty(condition)) return true; + + // 여러 조건을 && 로 연결 지원 + var parts = condition.Split("&&", StringSplitOptions.TrimEntries); + return parts.All(part => EvaluateSingleCondition(part, context)); + } + + private static bool EvaluateSingleCondition(string condition, HookContext context) + { + // "field operator value" 파싱 + string field, op, value; + + if (condition.Contains("!=")) + { + var idx = condition.IndexOf("!=", StringComparison.Ordinal); + field = condition[..idx].Trim(); + op = "!="; + value = condition[(idx + 2)..].Trim().Trim('"', '\''); + } + else if (condition.Contains("==")) + { + var idx = condition.IndexOf("==", StringComparison.Ordinal); + field = condition[..idx].Trim(); + op = "=="; + value = condition[(idx + 2)..].Trim().Trim('"', '\''); + } + else if (condition.Contains(" contains ", StringComparison.OrdinalIgnoreCase)) + { + var idx = condition.IndexOf(" contains ", StringComparison.OrdinalIgnoreCase); + field = condition[..idx].Trim(); + op = "contains"; + value = condition[(idx + 10)..].Trim().Trim('"', '\''); + } + else + { + // 파싱 불가 → 안전하게 통과 + return true; + } + + var fieldValue = ResolveField(field, context) ?? ""; + + return op switch + { + "==" => fieldValue.Equals(value, StringComparison.OrdinalIgnoreCase), + "!=" => !fieldValue.Equals(value, StringComparison.OrdinalIgnoreCase), + "contains" => fieldValue.Contains(value, StringComparison.OrdinalIgnoreCase), + _ => true + }; + } + + private static string? ResolveField(string field, HookContext context) + { + return field.ToLowerInvariant() switch + { + "tool_name" or "toolname" => context.ToolName, + "event" or "hook_event" => context.Event.ToString(), + "session_id" or "sessionid" => context.SessionId, + "work_folder" or "workfolder" or "cwd" => context.WorkFolder, + "user_message" or "usermessage" => context.UserMessage, + "changed_file" or "changedfile" => context.ChangedFilePath, + _ => null + }; + } + + /// Phase 25-B: asyncRewake 훅이 완료되어 대화 재활성화가 필요할 때 발생. + public static event EventHandler? AsyncRewakeTriggered; + + private static string Truncate(string? value, int max) + => string.IsNullOrEmpty(value) ? "" : (value.Length <= max ? value : value[..max]); +} + +/// Phase 25-B: asyncRewake 이벤트 인자. +public class AsyncRewakeEventArgs : EventArgs +{ + public string HookName { get; init; } = ""; + public string? AdditionalContext { get; init; } + public string SessionId { get; init; } = ""; +} diff --git a/src/AxCopilot/Services/Agent/FileEditTool.cs b/src/AxCopilot/Services/Agent/FileEditTool.cs new file mode 100644 index 0000000..9595a25 --- /dev/null +++ b/src/AxCopilot/Services/Agent/FileEditTool.cs @@ -0,0 +1,125 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 파일의 특정 부분을 수정하는 도구 (old_string → new_string 패턴). +public class FileEditTool : IAgentTool +{ + public string Name => "file_edit"; + public string Description => "Edit a file by replacing an exact string match. Set replace_all=true to replace all occurrences; otherwise old_string must be unique."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "File path to edit" }, + ["old_string"] = new() { Type = "string", Description = "Exact string to find and replace" }, + ["new_string"] = new() { Type = "string", Description = "Replacement string" }, + ["replace_all"] = new() { Type = "boolean", Description = "Replace all occurrences (default false). If false, old_string must be unique." }, + }, + Required = ["path", "old_string", "new_string"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var oldStr = args.GetProperty("old_string").GetString() ?? ""; + var newStr = args.GetProperty("new_string").GetString() ?? ""; + var replaceAll = args.TryGetProperty("replace_all", out var ra) && ra.GetBoolean(); + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + + if (!File.Exists(fullPath)) + return ToolResult.Fail($"파일이 존재하지 않습니다: {fullPath}"); + + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + try + { + var content = await File.ReadAllTextAsync(fullPath, Encoding.UTF8, ct); + + var count = CountOccurrences(content, oldStr); + if (count == 0) + return ToolResult.Fail($"old_string을 파일에서 찾을 수 없습니다."); + if (!replaceAll && count > 1) + return ToolResult.Fail($"old_string이 {count}번 발견됩니다. replace_all=true로 전체 교체하거나, 고유한 문자열을 지정하세요."); + + // Diff Preview: 변경 내용을 컨텍스트와 함께 표시 + var diffPreview = GenerateDiff(content, oldStr, newStr, fullPath); + + var updated = content.Replace(oldStr, newStr); + await File.WriteAllTextAsync(fullPath, updated, Encoding.UTF8, ct); + + var msg = replaceAll && count > 1 + ? $"파일 수정 완료: {fullPath} ({count}곳 전체 교체)" + : $"파일 수정 완료: {fullPath}"; + return ToolResult.Ok($"{msg}\n\n{diffPreview}", fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"파일 수정 실패: {ex.Message}"); + } + } + + /// 변경 전/후 diff를 생성합니다 (unified diff 스타일). + private static string GenerateDiff(string content, string oldStr, string newStr, string filePath) + { + var lines = content.Split('\n'); + var matchIdx = content.IndexOf(oldStr, StringComparison.Ordinal); + if (matchIdx < 0) return ""; + + // 변경 시작 줄 번호 계산 + var startLine = content[..matchIdx].Count(c => c == '\n'); + var oldLines = oldStr.Split('\n'); + var newLines = newStr.Split('\n'); + + var sb = new StringBuilder(); + var fileName = Path.GetFileName(filePath); + sb.AppendLine($"--- {fileName} (before)"); + sb.AppendLine($"+++ {fileName} (after)"); + + // 컨텍스트 라인 수 + const int ctx = 2; + var ctxStart = Math.Max(0, startLine - ctx); + var ctxEnd = Math.Min(lines.Length - 1, startLine + oldLines.Length - 1 + ctx); + + sb.AppendLine($"@@ -{ctxStart + 1},{ctxEnd - ctxStart + 1} @@"); + + // 앞쪽 컨텍스트 + for (int i = ctxStart; i < startLine; i++) + sb.AppendLine($" {lines[i].TrimEnd('\r')}"); + + // 삭제 라인 + foreach (var line in oldLines) + sb.AppendLine($"-{line.TrimEnd('\r')}"); + + // 추가 라인 + foreach (var line in newLines) + sb.AppendLine($"+{line.TrimEnd('\r')}"); + + // 뒤쪽 컨텍스트 + var afterEnd = startLine + oldLines.Length; + for (int i = afterEnd; i <= ctxEnd && i < lines.Length; i++) + sb.AppendLine($" {lines[i].TrimEnd('\r')}"); + + return sb.ToString().TrimEnd(); + } + + private static int CountOccurrences(string text, string search) + { + if (string.IsNullOrEmpty(search)) return 0; + int count = 0, idx = 0; + while ((idx = text.IndexOf(search, idx, StringComparison.Ordinal)) != -1) + { + count++; + idx += search.Length; + } + return count; + } +} diff --git a/src/AxCopilot/Services/Agent/FileInfoTool.cs b/src/AxCopilot/Services/Agent/FileInfoTool.cs new file mode 100644 index 0000000..65f320d --- /dev/null +++ b/src/AxCopilot/Services/Agent/FileInfoTool.cs @@ -0,0 +1,98 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 파일/폴더 메타 정보(크기, 수정일, 줄 수 등) 조회 도구. +public class FileInfoTool : IAgentTool +{ + public string Name => "file_info"; + public string Description => + "Get file or directory metadata without reading contents. " + + "Returns: size, created/modified dates, line count (files), item count (directories), encoding hint."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() + { + Type = "string", + Description = "File or directory path", + }, + }, + Required = ["path"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var rawPath = args.GetProperty("path").GetString() ?? ""; + var path = Path.IsPathRooted(rawPath) ? rawPath : Path.Combine(context.WorkFolder, rawPath); + + if (!context.IsPathAllowed(path)) + return Task.FromResult(ToolResult.Fail($"경로 접근 차단: {path}")); + + try + { + if (File.Exists(path)) + { + var fi = new FileInfo(path); + var sb = new StringBuilder(); + sb.AppendLine($"Type: File"); + sb.AppendLine($"Path: {fi.FullName}"); + sb.AppendLine($"Size: {FormatSize(fi.Length)} ({fi.Length:N0} bytes)"); + sb.AppendLine($"Extension: {fi.Extension}"); + sb.AppendLine($"Created: {fi.CreationTime:yyyy-MM-dd HH:mm:ss}"); + sb.AppendLine($"Modified: {fi.LastWriteTime:yyyy-MM-dd HH:mm:ss}"); + sb.AppendLine($"ReadOnly: {fi.IsReadOnly}"); + + // 텍스트 파일이면 줄 수 카운트 (최대 100만 줄까지) + var textExts = new HashSet(StringComparer.OrdinalIgnoreCase) + { ".cs", ".py", ".js", ".ts", ".java", ".cpp", ".c", ".h", ".xml", ".json", + ".yaml", ".yml", ".md", ".txt", ".csv", ".html", ".htm", ".css", ".sql", + ".sh", ".bat", ".ps1", ".config", ".ini", ".log", ".xaml" }; + if (textExts.Contains(fi.Extension) && fi.Length < 50 * 1024 * 1024) + { + var lineCount = File.ReadLines(path).Take(1_000_000).Count(); + sb.AppendLine($"Lines: {lineCount:N0}{(lineCount >= 1_000_000 ? "+" : "")}"); + } + + return Task.FromResult(ToolResult.Ok(sb.ToString())); + } + + if (Directory.Exists(path)) + { + var di = new DirectoryInfo(path); + var files = di.GetFiles("*", SearchOption.TopDirectoryOnly); + var dirs = di.GetDirectories(); + var totalSize = files.Sum(f => f.Length); + + var sb = new StringBuilder(); + sb.AppendLine($"Type: Directory"); + sb.AppendLine($"Path: {di.FullName}"); + sb.AppendLine($"Files: {files.Length}"); + sb.AppendLine($"Subdirectories: {dirs.Length}"); + sb.AppendLine($"Total Size (top-level files): {FormatSize(totalSize)}"); + sb.AppendLine($"Created: {di.CreationTime:yyyy-MM-dd HH:mm:ss}"); + sb.AppendLine($"Modified: {di.LastWriteTime:yyyy-MM-dd HH:mm:ss}"); + + return Task.FromResult(ToolResult.Ok(sb.ToString())); + } + + return Task.FromResult(ToolResult.Fail($"경로를 찾을 수 없습니다: {path}")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"정보 조회 오류: {ex.Message}")); + } + } + + private static string FormatSize(long bytes) => bytes switch + { + < 1024 => $"{bytes}B", + < 1024 * 1024 => $"{bytes / 1024.0:F1}KB", + < 1024L * 1024 * 1024 => $"{bytes / (1024.0 * 1024):F1}MB", + _ => $"{bytes / (1024.0 * 1024 * 1024):F2}GB", + }; +} diff --git a/src/AxCopilot/Services/Agent/FileManageTool.cs b/src/AxCopilot/Services/Agent/FileManageTool.cs new file mode 100644 index 0000000..df62b61 --- /dev/null +++ b/src/AxCopilot/Services/Agent/FileManageTool.cs @@ -0,0 +1,137 @@ +using System.IO; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 파일/폴더 이동·복사·이름변경·삭제·디렉토리 생성 도구. +public class FileManageTool : IAgentTool +{ + public string Name => "file_manage"; + public string Description => + "Manage files and directories. Actions: " + + "'move' — move file/folder to destination; " + + "'copy' — copy file/folder to destination; " + + "'rename' — rename file/folder; " + + "'delete' — delete file (requires Ask permission); " + + "'mkdir' — create directory recursively."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action to perform", + Enum = ["move", "copy", "rename", "delete", "mkdir"], + }, + ["path"] = new() + { + Type = "string", + Description = "Source file/folder path", + }, + ["destination"] = new() + { + Type = "string", + Description = "Destination path (for move/copy/rename)", + }, + }, + Required = ["action", "path"], + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + var rawPath = args.GetProperty("path").GetString() ?? ""; + var dest = args.TryGetProperty("destination", out var d) ? d.GetString() ?? "" : ""; + + var path = Path.IsPathRooted(rawPath) ? rawPath : Path.Combine(context.WorkFolder, rawPath); + + if (!context.IsPathAllowed(path)) + return ToolResult.Fail($"경로 접근 차단: {path}"); + + try + { + switch (action) + { + case "mkdir": + Directory.CreateDirectory(path); + return ToolResult.Ok($"디렉토리 생성: {path}"); + + case "delete": + if (context.AskPermission != null) + { + var allowed = await context.AskPermission("file_manage(delete)", path); + if (!allowed) return ToolResult.Fail("사용자가 삭제를 거부했습니다."); + } + if (File.Exists(path)) + { + File.Delete(path); + return ToolResult.Ok($"파일 삭제: {path}", filePath: path); + } + if (Directory.Exists(path)) + { + Directory.Delete(path, recursive: true); + return ToolResult.Ok($"폴더 삭제: {path}", filePath: path); + } + return ToolResult.Fail($"경로를 찾을 수 없습니다: {path}"); + + case "move": + case "copy": + case "rename": + if (string.IsNullOrEmpty(dest)) + return ToolResult.Fail($"'{action}' 작업에는 'destination'이 필요합니다."); + + var destPath = Path.IsPathRooted(dest) ? dest : Path.Combine(context.WorkFolder, dest); + if (!context.IsPathAllowed(destPath)) + return ToolResult.Fail($"대상 경로 접근 차단: {destPath}"); + + // 대상 디렉토리 자동 생성 + var destDir = Path.GetDirectoryName(destPath); + if (!string.IsNullOrEmpty(destDir) && !Directory.Exists(destDir)) + Directory.CreateDirectory(destDir); + + if (action == "rename") + { + // rename: 같은 폴더 내 이름 변경 + var dir = Path.GetDirectoryName(path) ?? context.WorkFolder; + destPath = Path.Combine(dir, dest); + } + + if (File.Exists(path)) + { + if (action == "copy") + File.Copy(path, destPath, overwrite: true); + else + File.Move(path, destPath, overwrite: true); + return ToolResult.Ok($"{action}: {path} → {destPath}", filePath: destPath); + } + if (Directory.Exists(path)) + { + if (action == "copy") + CopyDirectory(path, destPath); + else + Directory.Move(path, destPath); + return ToolResult.Ok($"{action}: {path} → {destPath}", filePath: destPath); + } + return ToolResult.Fail($"소스 경로를 찾을 수 없습니다: {path}"); + + default: + return ToolResult.Fail($"Unknown action: {action}"); + } + } + catch (Exception ex) + { + return ToolResult.Fail($"파일 관리 오류: {ex.Message}"); + } + } + + private static void CopyDirectory(string src, string dst) + { + Directory.CreateDirectory(dst); + foreach (var file in Directory.GetFiles(src)) + File.Copy(file, Path.Combine(dst, Path.GetFileName(file)), true); + foreach (var dir in Directory.GetDirectories(src)) + CopyDirectory(dir, Path.Combine(dst, Path.GetFileName(dir))); + } +} diff --git a/src/AxCopilot/Services/Agent/FileReadTool.cs b/src/AxCopilot/Services/Agent/FileReadTool.cs new file mode 100644 index 0000000..d527f0c --- /dev/null +++ b/src/AxCopilot/Services/Agent/FileReadTool.cs @@ -0,0 +1,67 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 파일 내용을 읽어 반환하는 도구. +public class FileReadTool : IAgentTool +{ + public string Name => "file_read"; + public string Description => "Read the contents of a file. Returns the text content with line numbers."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "File path to read (absolute or relative to work folder)" }, + ["offset"] = new() { Type = "integer", Description = "Starting line number (1-based). Optional, default 1." }, + ["limit"] = new() { Type = "integer", Description = "Maximum number of lines to read. Optional, default 500." }, + }, + Required = ["path"] + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + if (!args.TryGetProperty("path", out var pathEl)) + return Task.FromResult(ToolResult.Fail("path가 필요합니다.")); + var path = pathEl.GetString() ?? ""; + var offset = args.TryGetProperty("offset", out var ofs) ? ofs.GetInt32() : 1; + var limit = args.TryGetProperty("limit", out var lim) ? lim.GetInt32() : 500; + + var fullPath = ResolvePath(path, context.WorkFolder); + + if (!context.IsPathAllowed(fullPath)) + return Task.FromResult(ToolResult.Fail($"경로 접근 차단: {fullPath}")); + + if (!File.Exists(fullPath)) + return Task.FromResult(ToolResult.Fail($"파일이 존재하지 않습니다: {fullPath}")); + + try + { + var lines = File.ReadAllLines(fullPath, Encoding.UTF8); + var total = lines.Length; + var startIdx = Math.Max(0, offset - 1); + var endIdx = Math.Min(total, startIdx + limit); + + var sb = new StringBuilder(); + sb.AppendLine($"[{fullPath}] ({total} lines, showing {startIdx + 1}-{endIdx})"); + for (int i = startIdx; i < endIdx; i++) + sb.AppendLine($"{i + 1,5}\t{lines[i]}"); + + return Task.FromResult(ToolResult.Ok(sb.ToString(), fullPath)); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"파일 읽기 실패: {ex.Message}")); + } + } + + internal static string ResolvePath(string path, string workFolder) + { + if (Path.IsPathRooted(path)) return Path.GetFullPath(path); + if (!string.IsNullOrEmpty(workFolder)) + return Path.GetFullPath(Path.Combine(workFolder, path)); + return Path.GetFullPath(path); + } +} diff --git a/src/AxCopilot/Services/Agent/FileWatchTool.cs b/src/AxCopilot/Services/Agent/FileWatchTool.cs new file mode 100644 index 0000000..4e55d7a --- /dev/null +++ b/src/AxCopilot/Services/Agent/FileWatchTool.cs @@ -0,0 +1,182 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 지정 경로의 파일 변경을 감지하고 변경 내역을 반환하는 도구. +/// FileSystemInfo의 타임스탬프 기반으로 최근 변경 파일을 조회합니다. +/// +public class FileWatchTool : IAgentTool +{ + public string Name => "file_watch"; + public string Description => + "Detect recent file changes in a folder. Returns a list of created, modified, and deleted files " + + "since a given time. Useful for monitoring data folders, detecting log updates, " + + "or tracking file system changes."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() + { + Type = "string", + Description = "Folder path to watch. Relative to work folder." + }, + ["pattern"] = new() + { + Type = "string", + Description = "File pattern filter (e.g. '*.csv', '*.log', '*.xlsx'). Default: '*' (all files)" + }, + ["since"] = new() + { + Type = "string", + Description = "Time threshold: ISO 8601 datetime (e.g. '2026-03-30T09:00:00') " + + "or relative duration ('1h', '6h', '24h', '7d', '30d'). Default: '24h'" + }, + ["recursive"] = new() + { + Type = "boolean", + Description = "Search subdirectories recursively. Default: true" + }, + ["include_size"] = new() + { + Type = "boolean", + Description = "Include file sizes in output. Default: true" + }, + ["top_n"] = new() + { + Type = "integer", + Description = "Limit results to most recent N files. Default: 50" + }, + }, + Required = ["path"] + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var pattern = args.TryGetProperty("pattern", out var patEl) ? patEl.GetString() ?? "*" : "*"; + var sinceStr = args.TryGetProperty("since", out var sinceEl) ? sinceEl.GetString() ?? "24h" : "24h"; + var recursive = !args.TryGetProperty("recursive", out var recEl) || recEl.GetBoolean(); // default true + var includeSize = !args.TryGetProperty("include_size", out var sizeEl) || sizeEl.GetBoolean(); + var topN = args.TryGetProperty("top_n", out var topEl) && topEl.TryGetInt32(out var n) ? n : 50; + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (!context.IsPathAllowed(fullPath)) + return Task.FromResult(ToolResult.Fail($"경로 접근 차단: {fullPath}")); + if (!Directory.Exists(fullPath)) + return Task.FromResult(ToolResult.Fail($"폴더 없음: {fullPath}")); + + try + { + var since = ParseSince(sinceStr); + var searchOpt = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; + + var files = Directory.GetFiles(fullPath, pattern, searchOpt) + .Select(f => new FileInfo(f)) + .Where(fi => fi.LastWriteTime >= since || fi.CreationTime >= since) + .OrderByDescending(fi => fi.LastWriteTime) + .Take(topN) + .ToList(); + + if (files.Count == 0) + return Task.FromResult(ToolResult.Ok( + $"📂 {sinceStr} 이내 변경된 파일이 없습니다. (경로: {path}, 패턴: {pattern})")); + + var sb = new StringBuilder(); + sb.AppendLine($"📂 파일 변경 감지: {files.Count}개 파일 ({sinceStr} 이내)"); + sb.AppendLine($" 경로: {path} | 패턴: {pattern}"); + sb.AppendLine(); + + // 생성/수정 분류 + var created = files.Where(f => f.CreationTime >= since && f.CreationTime == f.LastWriteTime).ToList(); + var modified = files.Where(f => f.LastWriteTime >= since && f.CreationTime < since).ToList(); + var recentlyCreated = files.Where(f => f.CreationTime >= since && f.CreationTime != f.LastWriteTime).ToList(); + + if (created.Count > 0) + { + sb.AppendLine($"🆕 신규 생성 ({created.Count}개):"); + foreach (var f in created) + AppendFileInfo(sb, f, fullPath, includeSize); + sb.AppendLine(); + } + + if (modified.Count > 0) + { + sb.AppendLine($"✏️ 수정됨 ({modified.Count}개):"); + foreach (var f in modified) + AppendFileInfo(sb, f, fullPath, includeSize); + sb.AppendLine(); + } + + if (recentlyCreated.Count > 0) + { + sb.AppendLine($"📝 생성 후 수정됨 ({recentlyCreated.Count}개):"); + foreach (var f in recentlyCreated) + AppendFileInfo(sb, f, fullPath, includeSize); + sb.AppendLine(); + } + + // 요약 통계 + var totalSize = files.Sum(f => f.Length); + sb.AppendLine($"── 요약: 총 {files.Count}개 파일, {FormatSize(totalSize)}"); + + // 파일 유형별 분포 + var byExt = files.GroupBy(f => f.Extension.ToLowerInvariant()) + .OrderByDescending(g => g.Count()) + .Take(10); + sb.Append(" 유형: "); + sb.AppendLine(string.Join(", ", byExt.Select(g => $"{g.Key}({g.Count()})"))); + + return Task.FromResult(ToolResult.Ok(sb.ToString())); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"파일 감시 실패: {ex.Message}")); + } + } + + private static DateTime ParseSince(string since) + { + if (DateTime.TryParse(since, out var dt)) + return dt; + + // 상대 시간: "1h", "24h", "7d", "30d" + var match = System.Text.RegularExpressions.Regex.Match(since, @"^(\d+)(h|d|m)$"); + if (match.Success) + { + var amount = int.Parse(match.Groups[1].Value); + var unit = match.Groups[2].Value; + return unit switch + { + "h" => DateTime.Now.AddHours(-amount), + "d" => DateTime.Now.AddDays(-amount), + "m" => DateTime.Now.AddMinutes(-amount), + _ => DateTime.Now.AddHours(-24) + }; + } + + return DateTime.Now.AddHours(-24); // default: 24시간 + } + + private static void AppendFileInfo(StringBuilder sb, FileInfo f, string basePath, bool includeSize) + { + var relPath = Path.GetRelativePath(basePath, f.FullName); + var timeStr = f.LastWriteTime.ToString("MM-dd HH:mm"); + if (includeSize) + sb.AppendLine($" {relPath} ({FormatSize(f.Length)}, {timeStr})"); + else + sb.AppendLine($" {relPath} ({timeStr})"); + } + + private static string FormatSize(long bytes) + { + if (bytes < 1024) return $"{bytes}B"; + if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1}KB"; + if (bytes < 1024 * 1024 * 1024) return $"{bytes / (1024.0 * 1024):F1}MB"; + return $"{bytes / (1024.0 * 1024 * 1024):F2}GB"; + } +} diff --git a/src/AxCopilot/Services/Agent/FileWatcherService.cs b/src/AxCopilot/Services/Agent/FileWatcherService.cs new file mode 100644 index 0000000..08d0d4f --- /dev/null +++ b/src/AxCopilot/Services/Agent/FileWatcherService.cs @@ -0,0 +1,73 @@ +using System.IO; + +namespace AxCopilot.Services.Agent; + +/// +/// 파일 시스템 감시 서비스. +/// SessionStart 훅의 watchPaths에 등록된 경로를 모니터링하고 +/// 변경 시 FileChanged 이벤트를 발생시킵니다. +/// +public class FileWatcherService : IDisposable +{ + private readonly List _watchers = new(); + private readonly List> _callbacks = new(); + + /// 파일 변경 콜백을 등록합니다. + public void RegisterCallback(Action onChanged) + => _callbacks.Add(onChanged); + + /// glob 패턴 경로를 감시 목록에 추가. + public void Watch(string pattern, Action onChanged) + { + try + { + // 패턴에서 디렉토리와 파일 패턴 분리 + var (dir, filePattern) = SplitPattern(pattern); + if (!Directory.Exists(dir)) return; + + var watcher = new FileSystemWatcher(dir) + { + Filter = filePattern.Replace("**", "*"), + IncludeSubdirectories = pattern.Contains("**"), + NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName, + EnableRaisingEvents = true + }; + + void Handler(object _, FileSystemEventArgs e) + { + try { onChanged(e.FullPath); } + catch (Exception) { } + } + + watcher.Changed += Handler; + watcher.Created += Handler; + _watchers.Add(watcher); + } + catch (Exception) { } + } + + /// 모든 등록된 감시 경로 제거. + public void ClearAll() + { + foreach (var w in _watchers) { w.EnableRaisingEvents = false; w.Dispose(); } + _watchers.Clear(); + } + + private static (string dir, string pattern) SplitPattern(string glob) + { + var parts = glob.Replace('/', '\\').Split('\\'); + var dirParts = parts.TakeWhile(p => !p.Contains('*')).ToArray(); + var patternParts = parts.SkipWhile(p => !p.Contains('*')).ToArray(); + + var dir = dirParts.Length > 0 ? string.Join('\\', dirParts) : "."; + if (!Path.IsPathRooted(dir)) dir = Path.GetFullPath(dir); + var pattern = patternParts.Length > 0 ? string.Join('\\', patternParts) : "*"; + + return (dir, pattern); + } + + public void Dispose() + { + ClearAll(); + } +} diff --git a/src/AxCopilot/Services/Agent/FileWriteTool.cs b/src/AxCopilot/Services/Agent/FileWriteTool.cs new file mode 100644 index 0000000..79d329c --- /dev/null +++ b/src/AxCopilot/Services/Agent/FileWriteTool.cs @@ -0,0 +1,51 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 파일 전체를 새로 쓰는 도구. 새 파일 생성 또는 기존 파일 덮어쓰기. +public class FileWriteTool : IAgentTool +{ + public string Name => "file_write"; + public string Description => "Write content to a file. Creates new file or overwrites existing. Parent directories are created automatically."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "File path to write (absolute or relative to work folder)" }, + ["content"] = new() { Type = "string", Description = "Content to write to the file" }, + }, + Required = ["path", "content"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var content = args.GetProperty("content").GetString() ?? ""; + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + try + { + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) + Directory.CreateDirectory(dir); + + await File.WriteAllTextAsync(fullPath, content, Encoding.UTF8, ct); + var lines = content.Split('\n').Length; + return ToolResult.Ok($"파일 저장 완료: {fullPath} ({lines} lines, {content.Length} chars)", fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"파일 쓰기 실패: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/Agent/FolderMapTool.cs b/src/AxCopilot/Services/Agent/FolderMapTool.cs new file mode 100644 index 0000000..2ef6ffc --- /dev/null +++ b/src/AxCopilot/Services/Agent/FolderMapTool.cs @@ -0,0 +1,171 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 작업 폴더의 디렉토리 트리 구조를 생성하는 도구. +/// LLM이 프로젝트 전체 구조를 파악하고 적절한 파일을 찾을 수 있도록 돕습니다. +/// +public class FolderMapTool : IAgentTool +{ + public string Name => "folder_map"; + public string Description => + "Generate a directory tree map of the work folder or a specified subfolder. " + + "Shows folders and files in a tree structure. Use this to understand the project layout before reading or editing files."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Subdirectory to map. Optional, defaults to work folder root." }, + ["depth"] = new() { Type = "integer", Description = "Maximum depth to traverse (1-10). Default: 3." }, + ["include_files"] = new() { Type = "boolean", Description = "Whether to include files. Default: true." }, + ["pattern"] = new() { Type = "string", Description = "File extension filter (e.g. '.cs', '.py'). Optional, shows all files if omitted." }, + }, + Required = [] + }; + + // 무시할 디렉토리 (빌드 산출물, 패키지 캐시 등) + private static readonly HashSet IgnoredDirs = new(StringComparer.OrdinalIgnoreCase) + { + "bin", "obj", "node_modules", ".git", ".vs", ".idea", ".vscode", + "__pycache__", ".mypy_cache", ".pytest_cache", "dist", "build", + "packages", ".nuget", "TestResults", "coverage", ".next", + "target", ".gradle", ".cargo", + }; + + private const int MaxEntries = 500; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var subPath = args.TryGetProperty("path", out var p) ? p.GetString() ?? "" : ""; + var depth = 3; + if (args.TryGetProperty("depth", out var d)) + { + if (d.ValueKind == JsonValueKind.Number) depth = d.GetInt32(); + else if (d.ValueKind == JsonValueKind.String && int.TryParse(d.GetString(), out var dv)) depth = dv; + } + var depthStr = depth.ToString(); + var includeFiles = true; + if (args.TryGetProperty("include_files", out var inc)) + { + if (inc.ValueKind == JsonValueKind.True || inc.ValueKind == JsonValueKind.False) + includeFiles = inc.GetBoolean(); + else + includeFiles = !string.Equals(inc.GetString(), "false", StringComparison.OrdinalIgnoreCase); + } + var extFilter = args.TryGetProperty("pattern", out var pat) ? pat.GetString() ?? "" : ""; + + if (!int.TryParse(depthStr, out var maxDepth) || maxDepth < 1) + maxDepth = 3; + maxDepth = Math.Min(maxDepth, 10); + + var baseDir = string.IsNullOrEmpty(subPath) + ? context.WorkFolder + : FileReadTool.ResolvePath(subPath, context.WorkFolder); + + if (string.IsNullOrEmpty(baseDir) || !Directory.Exists(baseDir)) + return Task.FromResult(ToolResult.Fail($"디렉토리가 존재하지 않습니다: {baseDir}")); + + if (!context.IsPathAllowed(baseDir)) + return Task.FromResult(ToolResult.Fail($"경로 접근 차단: {baseDir}")); + + try + { + var sb = new StringBuilder(); + var dirName = Path.GetFileName(baseDir); + if (string.IsNullOrEmpty(dirName)) dirName = baseDir; + sb.AppendLine($"{dirName}/"); + + int entryCount = 0; + BuildTree(sb, baseDir, "", 0, maxDepth, includeFiles, extFilter, context, ref entryCount); + + if (entryCount >= MaxEntries) + sb.AppendLine($"\n... ({MaxEntries}개 항목 제한 도달, depth 또는 pattern을 조정하세요)"); + + var summary = $"폴더 맵 생성 완료 ({entryCount}개 항목, 깊이 {maxDepth})"; + return Task.FromResult(ToolResult.Ok($"{summary}\n\n{sb}")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"폴더 맵 생성 실패: {ex.Message}")); + } + } + + private static void BuildTree( + StringBuilder sb, string dir, string prefix, int currentDepth, int maxDepth, + bool includeFiles, string extFilter, AgentContext context, ref int entryCount) + { + if (currentDepth >= maxDepth || entryCount >= MaxEntries) return; + + // 하위 디렉토리 + List subDirs; + try + { + subDirs = new DirectoryInfo(dir).GetDirectories() + .Where(d => !d.Attributes.HasFlag(FileAttributes.Hidden) + && !IgnoredDirs.Contains(d.Name)) + .OrderBy(d => d.Name) + .ToList(); + } + catch (Exception) { return; } // 접근 불가 디렉토리 무시 + + // 하위 파일 + List files = []; + if (includeFiles) + { + try + { + files = new DirectoryInfo(dir).GetFiles() + .Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden) + && (string.IsNullOrEmpty(extFilter) + || f.Extension.Equals(extFilter, StringComparison.OrdinalIgnoreCase))) + .OrderBy(f => f.Name) + .ToList(); + } + catch (Exception) { /* ignore */ } + } + + var totalItems = subDirs.Count + files.Count; + var index = 0; + + // 디렉토리 출력 + foreach (var sub in subDirs) + { + if (entryCount >= MaxEntries) break; + index++; + var isLast = index == totalItems; + var connector = isLast ? "└── " : "├── "; + var childPrefix = isLast ? " " : "│ "; + + sb.AppendLine($"{prefix}{connector}{sub.Name}/"); + entryCount++; + + if (context.IsPathAllowed(sub.FullName)) + BuildTree(sb, sub.FullName, prefix + childPrefix, currentDepth + 1, maxDepth, + includeFiles, extFilter, context, ref entryCount); + } + + // 파일 출력 + foreach (var file in files) + { + if (entryCount >= MaxEntries) break; + index++; + var isLast = index == totalItems; + var connector = isLast ? "└── " : "├── "; + + var sizeStr = FormatSize(file.Length); + sb.AppendLine($"{prefix}{connector}{file.Name} ({sizeStr})"); + entryCount++; + } + } + + private static string FormatSize(long bytes) => bytes switch + { + < 1024 => $"{bytes} B", + < 1024 * 1024 => $"{bytes / 1024.0:F1} KB", + _ => $"{bytes / (1024.0 * 1024.0):F1} MB", + }; +} diff --git a/src/AxCopilot/Services/Agent/FormatConvertTool.cs b/src/AxCopilot/Services/Agent/FormatConvertTool.cs new file mode 100644 index 0000000..8da07df --- /dev/null +++ b/src/AxCopilot/Services/Agent/FormatConvertTool.cs @@ -0,0 +1,193 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; +using Markdig; + +namespace AxCopilot.Services.Agent; + +/// +/// 문서 포맷 변환 도구. +/// Markdown → HTML, HTML → 텍스트, CSV → HTML 테이블 등 경량 변환을 수행합니다. +/// 복잡한 변환(DOCX↔HTML)은 원본 파일을 읽고 적절한 생성 스킬(docx_create, html_create)로 +/// 재생성하도록 LLM에 안내합니다. +/// +public class FormatConvertTool : IAgentTool +{ + public string Name => "format_convert"; + public string Description => + "Convert a document between formats. Supports: " + + "md→html (Markdown to styled HTML with mood CSS), " + + "html→text (strip HTML tags to plain text), " + + "csv→html (CSV to HTML table). " + + "For complex conversions (docx↔html, xlsx↔csv), read the source with document_read/file_read, " + + "then use the appropriate creation skill (html_create, docx_create, etc.)."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["source"] = new() { Type = "string", Description = "Source file path to convert" }, + ["target"] = new() { Type = "string", Description = "Target output file path (extension determines format)" }, + ["mood"] = new() { Type = "string", Description = "Design mood for HTML output (default: modern). Only used for md→html conversion." }, + }, + Required = ["source", "target"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var source = args.GetProperty("source").GetString() ?? ""; + var target = args.GetProperty("target").GetString() ?? ""; + var mood = args.TryGetProperty("mood", out var m) ? m.GetString() ?? "modern" : "modern"; + + var srcPath = FileReadTool.ResolvePath(source, context.WorkFolder); + var tgtPath = FileReadTool.ResolvePath(target, context.WorkFolder); + if (context.ActiveTab == "Cowork") tgtPath = AgentContext.EnsureTimestampedPath(tgtPath); + + if (!context.IsPathAllowed(srcPath)) + return ToolResult.Fail($"소스 경로 접근 차단: {srcPath}"); + if (!context.IsPathAllowed(tgtPath)) + return ToolResult.Fail($"대상 경로 접근 차단: {tgtPath}"); + if (!File.Exists(srcPath)) + return ToolResult.Fail($"소스 파일 없음: {srcPath}"); + + if (!await context.CheckWritePermissionAsync("format_convert", tgtPath)) + return ToolResult.Fail("쓰기 권한이 거부되었습니다."); + + var srcExt = Path.GetExtension(srcPath).ToLowerInvariant(); + var tgtExt = Path.GetExtension(tgtPath).ToLowerInvariant(); + var convKey = $"{srcExt}→{tgtExt}"; + + try + { + var srcContent = await File.ReadAllTextAsync(srcPath, ct); + + string result; + switch (convKey) + { + case ".md→.html": + var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build(); + var bodyHtml = Markdown.ToHtml(srcContent, pipeline); + var css = TemplateService.GetCss(mood); + result = $"\n\n\n\n" + + $"\n\n\n
      \n{bodyHtml}\n
      \n\n"; + break; + + case ".html→.txt" or ".htm→.txt": + result = StripHtmlTags(srcContent); + break; + + case ".csv→.html": + result = CsvToHtmlTable(srcContent, mood); + break; + + case ".md→.txt": + result = StripMarkdown(srcContent); + break; + + default: + return ToolResult.Fail( + $"직접 변환 미지원: {convKey}\n" + + "대안: source를 file_read/document_read로 읽은 뒤, " + + "적절한 생성 스킬(html_create, docx_create, excel_create 등)을 사용하세요."); + } + + var dir = Path.GetDirectoryName(tgtPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + await File.WriteAllTextAsync(tgtPath, result, ct); + + var srcName = Path.GetFileName(srcPath); + var tgtName = Path.GetFileName(tgtPath); + return ToolResult.Ok( + $"변환 완료: {srcName} → {tgtName}\n" + + $"변환 유형: {convKey}\n" + + $"출력 크기: {result.Length:N0}자", + tgtPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"변환 오류: {ex.Message}"); + } + } + + private static string StripHtmlTags(string html) + { + // script/style 제거 + var cleaned = Regex.Replace(html, @"<(script|style)[^>]*>.*?", "", RegexOptions.Singleline | RegexOptions.IgnoreCase); + // 줄바꿈 태그 처리 + cleaned = Regex.Replace(cleaned, @"", "\n", RegexOptions.IgnoreCase); + cleaned = Regex.Replace(cleaned, @"", "\n", RegexOptions.IgnoreCase); + // 태그 제거 + cleaned = Regex.Replace(cleaned, @"<[^>]+>", ""); + // HTML 엔티티 디코딩 + cleaned = System.Net.WebUtility.HtmlDecode(cleaned); + // 연속 빈줄 정리 + cleaned = Regex.Replace(cleaned, @"\n{3,}", "\n\n"); + return cleaned.Trim(); + } + + private static string StripMarkdown(string md) + { + var result = md; + result = Regex.Replace(result, @"^#{1,6}\s+", "", RegexOptions.Multiline); // 헤딩 + result = Regex.Replace(result, @"\*\*(.+?)\*\*", "$1"); // 볼드 + result = Regex.Replace(result, @"\*(.+?)\*", "$1"); // 이탤릭 + result = Regex.Replace(result, @"`(.+?)`", "$1"); // 인라인 코드 + result = Regex.Replace(result, @"^\s*[-*+]\s+", "", RegexOptions.Multiline); // 리스트 + result = Regex.Replace(result, @"^\s*\d+\.\s+", "", RegexOptions.Multiline); // 번호 리스트 + result = Regex.Replace(result, @"\[(.+?)\]\(.+?\)", "$1"); // 링크 + return result.Trim(); + } + + private static string CsvToHtmlTable(string csv, string mood) + { + var lines = csv.Split('\n', StringSplitOptions.RemoveEmptyEntries); + if (lines.Length == 0) return "

      빈 CSV 파일

      "; + + var cssStr = TemplateService.GetCss(mood); + var sb = new StringBuilder(); + sb.AppendLine("\n\n\n"); + sb.AppendLine($"\n\n\n
      "); + sb.AppendLine(""); + + var headers = ParseCsvLine(lines[0]); + foreach (var h in headers) sb.Append($""); + sb.AppendLine(""); + + for (int i = 1; i < Math.Min(lines.Length, 1001); i++) + { + var vals = ParseCsvLine(lines[i]); + sb.Append(""); + foreach (var v in vals) sb.Append($""); + sb.AppendLine(""); + } + + sb.AppendLine("
      {System.Net.WebUtility.HtmlEncode(h)}
      {System.Net.WebUtility.HtmlEncode(v)}
      \n
      \n\n"); + return sb.ToString(); + } + + private static string[] ParseCsvLine(string line) + { + var fields = new List(); + var current = new StringBuilder(); + bool inQuotes = false; + for (int i = 0; i < line.Length; i++) + { + var c = line[i]; + if (inQuotes) + { + if (c == '"' && i + 1 < line.Length && line[i + 1] == '"') { current.Append('"'); i++; } + else if (c == '"') inQuotes = false; + else current.Append(c); + } + else + { + if (c == '"') inQuotes = true; + else if (c == ',') { fields.Add(current.ToString()); current.Clear(); } + else current.Append(c); + } + } + fields.Add(current.ToString()); + return fields.ToArray(); + } +} diff --git a/src/AxCopilot/Services/Agent/GitTool.cs b/src/AxCopilot/Services/Agent/GitTool.cs new file mode 100644 index 0000000..91f91ed --- /dev/null +++ b/src/AxCopilot/Services/Agent/GitTool.cs @@ -0,0 +1,206 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// Git 버전 관리 도구. +/// 사내 GitHub Enterprise 환경을 고려하여 안전한 Git 작업을 지원합니다. +/// push/force push는 차단되며, 사용자가 직접 수행해야 합니다. +/// +public class GitTool : IAgentTool, IConditionalTool +{ + /// 작업 폴더에 .git이 있을 때만 활성화. + public bool IsEnabled(ToolEnvironmentContext env) => env.HasGitRepo; + + public string Name => "git_tool"; + public string Description => + "Execute safe Git operations. Supports: status, diff, log, add, commit, branch, checkout. " + + "Push operations are blocked for safety — user must push manually. " + + "Works with enterprise GitHub (on-premise) repositories."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Git action: status, diff, log, add, commit, branch, checkout, stash, remote", + Enum = ["status", "diff", "log", "add", "commit", "branch", "checkout", "stash", "remote"], + }, + ["args"] = new() + { + Type = "string", + Description = "Additional arguments. For commit: commit message. For add: file path(s). For log: '--oneline -10'. For diff: file path or '--staged'.", + }, + }, + Required = ["action"] + }; + + // 차단 명령 패턴 — 원격 수정 및 위험 작업 + private static readonly string[] BlockedPatterns = + [ + "push", "push --force", "push -f", + "pull", "fetch", + "reset --hard", "clean -f", + "rebase", "merge", + "remote add", "remote remove", "remote set-url", + "branch -D", "branch -d", + "tag -d", "tag -D", + ]; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + if (!args.TryGetProperty("action", out var actionEl)) + return ToolResult.Fail("action이 필요합니다."); + var action = actionEl.GetString() ?? "status"; + var extraArgs = args.TryGetProperty("args", out var a) ? a.GetString() ?? "" : ""; + + var workDir = context.WorkFolder; + if (string.IsNullOrEmpty(workDir) || !Directory.Exists(workDir)) + return ToolResult.Fail("작업 폴더가 설정되지 않았습니다."); + + // Git 설치 확인 + var gitPath = FindGit(); + if (gitPath == null) + return ToolResult.Fail("Git이 설치되어 있지 않습니다. PATH에 git이 있는지 확인하세요."); + + // Git 저장소 확인 + if (!Directory.Exists(Path.Combine(workDir, ".git"))) + { + // 상위 디렉토리에서 .git 확인 (서브디렉토리 작업 지원) + var checkDir = workDir; + bool found = false; + while (!string.IsNullOrEmpty(checkDir)) + { + if (Directory.Exists(Path.Combine(checkDir, ".git"))) { found = true; break; } + var parent = Directory.GetParent(checkDir)?.FullName; + if (parent == checkDir) break; + checkDir = parent; + } + if (!found) + return ToolResult.Fail("현재 작업 폴더는 Git 저장소가 아닙니다."); + } + + // 명령 구성 + var gitCommand = action switch + { + "status" => "status --short --branch", + "diff" => string.IsNullOrEmpty(extraArgs) ? "diff" : $"diff {extraArgs}", + "log" => string.IsNullOrEmpty(extraArgs) ? "log --oneline -15" : $"log {extraArgs}", + "add" => string.IsNullOrEmpty(extraArgs) ? "add -A" : $"add {extraArgs}", + "commit" => string.IsNullOrEmpty(extraArgs) + ? null // 커밋 메시지 필수 + : $"commit -m \"{extraArgs.Replace("\"", "\\\"")}\"", + "branch" => string.IsNullOrEmpty(extraArgs) ? "branch -a" : $"branch {extraArgs}", + "checkout" => string.IsNullOrEmpty(extraArgs) ? null : $"checkout {extraArgs}", + "stash" => string.IsNullOrEmpty(extraArgs) ? "stash list" : $"stash {extraArgs}", + "remote" => "remote -v", + _ => null, + }; + + if (gitCommand == null) + { + if (action == "commit") + return ToolResult.Fail("커밋 메시지가 필요합니다. args에 커밋 메시지를 지정하세요."); + if (action == "checkout") + return ToolResult.Fail("체크아웃할 브랜치/파일을 args에 지정하세요."); + return ToolResult.Fail($"알 수 없는 액션: {action}"); + } + + // 위험 명령 차단 + var fullCmd = $"git {gitCommand}"; + foreach (var pattern in BlockedPatterns) + { + if (fullCmd.Contains(pattern, StringComparison.OrdinalIgnoreCase)) + return ToolResult.Fail( + $"안전을 위해 '{pattern}' 작업은 차단됩니다.\n" + + "원격 저장소 작업(push/pull/fetch)과 이력 변경 작업은 사용자가 직접 수행하세요."); + } + + // 쓰기 작업은 권한 확인 + var writeActions = new HashSet { "add", "commit", "checkout", "stash" }; + if (writeActions.Contains(action)) + { + if (!await context.CheckWritePermissionAsync(Name, workDir)) + return ToolResult.Fail("Git 쓰기 권한이 거부되었습니다."); + } + + // Git 커밋 — 현재 비활성 (향후 활성화 예정) + // 의사결정 수준에서 무조건 확인을 받더라도, 커밋 자체를 차단합니다. + if (action == "commit") + { + return ToolResult.Fail( + "Git 커밋 기능은 현재 비활성 상태입니다.\n" + + "안전을 위해 커밋은 사용자가 직접 수행하세요.\n" + + "향후 버전에서 활성화될 예정입니다."); + } + + // 명령 실행 + try + { + var psi = new ProcessStartInfo(gitPath, gitCommand) + { + WorkingDirectory = workDir, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + StandardErrorEncoding = Encoding.UTF8, + }; + + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(30)); + + using var proc = Process.Start(psi); + if (proc == null) return ToolResult.Fail("Git 프로세스 시작 실패"); + + var stdout = await proc.StandardOutput.ReadToEndAsync(cts.Token); + var stderr = await proc.StandardError.ReadToEndAsync(cts.Token); + await proc.WaitForExitAsync(cts.Token); + + // 출력 제한 + if (stdout.Length > 8000) stdout = stdout[..8000] + "\n... (출력 잘림)"; + + var sb = new StringBuilder(); + sb.AppendLine($"[git {action}] Exit code: {proc.ExitCode}"); + if (!string.IsNullOrWhiteSpace(stdout)) sb.Append(stdout); + if (!string.IsNullOrWhiteSpace(stderr) && proc.ExitCode != 0) sb.AppendLine($"\n[stderr] {stderr.Trim()}"); + + return proc.ExitCode == 0 + ? ToolResult.Ok(sb.ToString()) + : ToolResult.Fail(sb.ToString()); + } + catch (OperationCanceledException) + { + return ToolResult.Fail("Git 명령 타임아웃 (30초)"); + } + catch (Exception ex) + { + return ToolResult.Fail($"Git 실행 오류: {ex.Message}"); + } + } + + private static string? FindGit() + { + try + { + var psi = new ProcessStartInfo("where.exe", "git") + { + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true, + }; + using var proc = Process.Start(psi); + if (proc == null) return null; + var output = proc.StandardOutput.ReadToEnd().Trim(); + proc.WaitForExit(5000); + return string.IsNullOrWhiteSpace(output) ? null : output.Split('\n')[0].Trim(); + } + catch (Exception) { return null; } + } +} diff --git a/src/AxCopilot/Services/Agent/GlobTool.cs b/src/AxCopilot/Services/Agent/GlobTool.cs new file mode 100644 index 0000000..825e383 --- /dev/null +++ b/src/AxCopilot/Services/Agent/GlobTool.cs @@ -0,0 +1,69 @@ +using System.IO; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 파일 패턴 검색 도구. glob 패턴으로 파일 목록을 반환합니다. +public class GlobTool : IAgentTool +{ + public string Name => "glob"; + public string Description => "Find files matching a glob pattern (e.g. '**/*.cs', 'src/**/*.json'). Returns matching file paths."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["pattern"] = new() { Type = "string", Description = "Glob pattern to match files (e.g. '**/*.cs', '*.txt')" }, + ["path"] = new() { Type = "string", Description = "Directory to search in. Optional, defaults to work folder." }, + }, + Required = ["pattern"] + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var pattern = args.GetProperty("pattern").GetString() ?? ""; + var searchPath = args.TryGetProperty("path", out var p) ? p.GetString() ?? "" : ""; + + var baseDir = string.IsNullOrEmpty(searchPath) + ? context.WorkFolder + : FileReadTool.ResolvePath(searchPath, context.WorkFolder); + + if (string.IsNullOrEmpty(baseDir) || !Directory.Exists(baseDir)) + return Task.FromResult(ToolResult.Fail($"디렉토리가 존재하지 않습니다: {baseDir}")); + + if (!context.IsPathAllowed(baseDir)) + return Task.FromResult(ToolResult.Fail($"경로 접근 차단: {baseDir}")); + + try + { + // glob 패턴을 Directory.EnumerateFiles용으로 변환 + var searchPattern = ExtractSearchPattern(pattern); + var recursive = pattern.Contains("**") || pattern.Contains('/') || pattern.Contains('\\'); + var option = recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; + + var files = Directory.EnumerateFiles(baseDir, searchPattern, option) + .Where(f => context.IsPathAllowed(f)) + .OrderBy(f => f) + .Take(200) + .ToList(); + + if (files.Count == 0) + return Task.FromResult(ToolResult.Ok($"패턴 '{pattern}'에 일치하는 파일이 없습니다.")); + + var result = string.Join("\n", files.Select(f => Path.GetRelativePath(baseDir, f))); + return Task.FromResult(ToolResult.Ok($"{files.Count}개 파일 발견:\n{result}")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"검색 실패: {ex.Message}")); + } + } + + private static string ExtractSearchPattern(string globPattern) + { + // **/*.cs → *.cs, src/**/*.json → *.json + var parts = globPattern.Replace('/', '\\').Split('\\'); + var last = parts[^1]; + return string.IsNullOrEmpty(last) || last == "**" ? "*" : last; + } +} diff --git a/src/AxCopilot/Services/Agent/GrepTool.cs b/src/AxCopilot/Services/Agent/GrepTool.cs new file mode 100644 index 0000000..ff28051 --- /dev/null +++ b/src/AxCopilot/Services/Agent/GrepTool.cs @@ -0,0 +1,133 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// 파일 내용 텍스트 검색 도구. 정규식을 지원합니다. +public class GrepTool : IAgentTool +{ + public string Name => "grep"; + public string Description => "Search file contents for a pattern (regex supported). Returns matching lines with file paths and line numbers."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["pattern"] = new() { Type = "string", Description = "Search pattern (regex supported)" }, + ["path"] = new() { Type = "string", Description = "File or directory to search in. Optional, defaults to work folder." }, + ["glob"] = new() { Type = "string", Description = "File pattern filter (e.g. '*.cs', '*.json'). Optional." }, + ["context_lines"] = new() { Type = "integer", Description = "Number of context lines before/after each match (0-5). Default 0." }, + ["case_sensitive"] = new() { Type = "boolean", Description = "Case-sensitive search. Default false (case-insensitive)." }, + }, + Required = ["pattern"] + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var pattern = args.GetProperty("pattern").GetString() ?? ""; + var searchPath = args.TryGetProperty("path", out var p) ? p.GetString() ?? "" : ""; + var globFilter = args.TryGetProperty("glob", out var g) ? g.GetString() ?? "" : ""; + var contextLines = args.TryGetProperty("context_lines", out var cl) ? Math.Clamp(cl.GetInt32(), 0, 5) : 0; + var caseSensitive = args.TryGetProperty("case_sensitive", out var cs) && cs.GetBoolean(); + + var baseDir = string.IsNullOrEmpty(searchPath) + ? context.WorkFolder + : FileReadTool.ResolvePath(searchPath, context.WorkFolder); + + if (string.IsNullOrEmpty(baseDir)) + return Task.FromResult(ToolResult.Fail("작업 폴더가 설정되지 않았습니다.")); + + try + { + var regexOpts = RegexOptions.Compiled | (caseSensitive ? RegexOptions.None : RegexOptions.IgnoreCase); + var regex = new Regex(pattern, regexOpts, TimeSpan.FromSeconds(5)); + + var filePattern = string.IsNullOrEmpty(globFilter) ? "*" : globFilter; + + IEnumerable files; + if (File.Exists(baseDir)) + files = [baseDir]; + else if (Directory.Exists(baseDir)) + files = Directory.EnumerateFiles(baseDir, filePattern, SearchOption.AllDirectories); + else + return Task.FromResult(ToolResult.Fail($"경로가 존재하지 않습니다: {baseDir}")); + + var sb = new StringBuilder(); + int matchCount = 0; + int fileCount = 0; + const int maxMatches = 100; + + foreach (var file in files) + { + if (ct.IsCancellationRequested) break; + if (!context.IsPathAllowed(file)) continue; + if (IsBinaryFile(file)) continue; + + try + { + var lines = File.ReadAllLines(file, Encoding.UTF8); + bool fileHit = false; + for (int i = 0; i < lines.Length && matchCount < maxMatches; i++) + { + if (regex.IsMatch(lines[i])) + { + if (!fileHit) + { + var rel = Directory.Exists(context.WorkFolder) + ? Path.GetRelativePath(context.WorkFolder, file) + : file; + sb.AppendLine($"\n{rel}:"); + fileHit = true; + fileCount++; + } + // 컨텍스트 라인 (before) + if (contextLines > 0) + { + for (int c = Math.Max(0, i - contextLines); c < i; c++) + sb.AppendLine($" {c + 1} {lines[c].TrimEnd()}"); + } + sb.AppendLine($" {i + 1}: {lines[i].TrimEnd()}"); + // 컨텍스트 라인 (after) + if (contextLines > 0) + { + for (int c = i + 1; c <= Math.Min(lines.Length - 1, i + contextLines); c++) + sb.AppendLine($" {c + 1} {lines[c].TrimEnd()}"); + sb.AppendLine(" ---"); + } + matchCount++; + } + } + } + catch (Exception) { /* 읽기 실패 파일 무시 */ } + + if (matchCount >= maxMatches) break; + } + + if (matchCount == 0) + return Task.FromResult(ToolResult.Ok($"패턴 '{pattern}'에 일치하는 결과가 없습니다.")); + + var header = $"{fileCount}개 파일에서 {matchCount}개 일치{(matchCount >= maxMatches ? " (제한 도달)" : "")}:"; + return Task.FromResult(ToolResult.Ok(header + sb)); + } + catch (RegexParseException) + { + return Task.FromResult(ToolResult.Fail($"잘못된 정규식 패턴: {pattern}")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"검색 실패: {ex.Message}")); + } + } + + private static bool IsBinaryFile(string path) + { + var ext = Path.GetExtension(path).ToLowerInvariant(); + return ext is ".exe" or ".dll" or ".zip" or ".7z" or ".rar" or ".tar" or ".gz" + or ".png" or ".jpg" or ".jpeg" or ".gif" or ".bmp" or ".ico" or ".webp" + or ".pdf" or ".docx" or ".xlsx" or ".pptx" + or ".mp3" or ".mp4" or ".avi" or ".mov" or ".mkv" + or ".psd" or ".msi" or ".iso" or ".bin" or ".dat" or ".db"; + } +} diff --git a/src/AxCopilot/Services/Agent/HashTool.cs b/src/AxCopilot/Services/Agent/HashTool.cs new file mode 100644 index 0000000..e248411 --- /dev/null +++ b/src/AxCopilot/Services/Agent/HashTool.cs @@ -0,0 +1,85 @@ +using System.IO; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 파일·텍스트 MD5/SHA256 해시 계산 도구. +public class HashTool : IAgentTool +{ + public string Name => "hash_tool"; + public string Description => + "Compute hash digests for text or files. " + + "Supports MD5, SHA1, SHA256, SHA512. " + + "Use 'text' mode for inline text or 'file' mode for file path."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["mode"] = new() + { + Type = "string", + Description = "Input mode", + Enum = ["text", "file"], + }, + ["input"] = new() + { + Type = "string", + Description = "Text to hash or file path", + }, + ["algorithm"] = new() + { + Type = "string", + Description = "Hash algorithm (default: sha256)", + Enum = ["md5", "sha1", "sha256", "sha512"], + }, + }, + Required = ["mode", "input"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var mode = args.GetProperty("mode").GetString() ?? "text"; + var input = args.GetProperty("input").GetString() ?? ""; + var algo = args.TryGetProperty("algorithm", out var a) ? a.GetString() ?? "sha256" : "sha256"; + + try + { + byte[] data; + string label; + + if (mode == "file") + { + var path = Path.IsPathRooted(input) ? input : Path.Combine(context.WorkFolder, input); + if (!File.Exists(path)) + return Task.FromResult(ToolResult.Fail($"File not found: {path}")); + data = File.ReadAllBytes(path); + label = Path.GetFileName(path); + } + else + { + data = Encoding.UTF8.GetBytes(input); + label = $"text ({data.Length} bytes)"; + } + + using var hasher = algo switch + { + "md5" => (HashAlgorithm)MD5.Create(), + "sha1" => SHA1.Create(), + "sha256" => SHA256.Create(), + "sha512" => SHA512.Create(), + _ => SHA256.Create(), + }; + + var hash = hasher.ComputeHash(data); + var hex = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); + return Task.FromResult(ToolResult.Ok($"{algo.ToUpperInvariant()}({label}):\n{hex}")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"해시 오류: {ex.Message}")); + } + } +} diff --git a/src/AxCopilot/Services/Agent/HierarchicalMemoryService.cs b/src/AxCopilot/Services/Agent/HierarchicalMemoryService.cs new file mode 100644 index 0000000..aadaa59 --- /dev/null +++ b/src/AxCopilot/Services/Agent/HierarchicalMemoryService.cs @@ -0,0 +1,124 @@ +using System.IO; +using System.Text; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 30-C: CC 동등 4-layer 계층 메모리 통합 조회 서비스. +/// +/// 우선순위 (낮→높): +/// 1. Managed — %PROGRAMDATA%\AxCopilot\AX.md (전사 공통, IT 관리) +/// 2. User — %APPDATA%\AxCopilot\AX.md + rules\*.md (개인 전역) +/// 3. Project — {WorkFolder}\AX.md + .ax\rules\*.md (팀 공유, git 커밋) +/// 4. Local — {WorkFolder}\AX.local.md (개인 프로젝트별, gitignore) +/// +/// CC의 getMemoryFiles() + getUserContext()와 동등한 기능을 제공합니다. +/// +public class HierarchicalMemoryService +{ + /// 메모리 계층 레벨. + public enum MemoryLevel { Managed, User, Project, Local } + + /// 로드된 메모리 파일 한 건. + public record MemoryFile(MemoryLevel Level, string FilePath, string Content); + + private static readonly string ManagedDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), + "AxCopilot"); + + private static readonly string UserDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot"); + + /// + /// 4-layer 메모리를 전부 수집하여 반환합니다. + /// 하위 레벨이 상위 레벨보다 우선합니다. + /// + public IReadOnlyList CollectAll(string? workFolder) + { + var result = new List(); + + // Layer 1: Managed + CollectFromDir(result, MemoryLevel.Managed, ManagedDir); + + // Layer 2: User + CollectFromDir(result, MemoryLevel.User, UserDir); + CollectRules(result, MemoryLevel.User, Path.Combine(UserDir, "rules")); + + // Layer 3: Project + if (!string.IsNullOrEmpty(workFolder) && Directory.Exists(workFolder)) + { + CollectFromDir(result, MemoryLevel.Project, workFolder); + CollectRules(result, MemoryLevel.Project, Path.Combine(workFolder, ".ax", "rules")); + } + + // Layer 4: Local + if (!string.IsNullOrEmpty(workFolder)) + { + var localMd = Path.Combine(workFolder, "AX.local.md"); + if (File.Exists(localMd)) + result.Add(new MemoryFile(MemoryLevel.Local, localMd, ReadSafe(localMd))); + } + + return result; + } + + /// + /// 모든 계층의 메모리를 하나의 문자열로 병합합니다. + /// 시스템 프롬프트에 직접 삽입할 수 있는 형태입니다. + /// + public string BuildMergedContext(string? workFolder, int maxChars = 40_000) + { + var files = CollectAll(workFolder); + if (files.Count == 0) return string.Empty; + + var sb = new StringBuilder(); + foreach (var file in files) + { + if (sb.Length + file.Content.Length > maxChars) + { + // 초과 시 잘라서 추가 + var remaining = maxChars - sb.Length; + if (remaining > 100) + { + sb.AppendLine($"# [{file.Level}] {Path.GetFileName(file.FilePath)} (일부)"); + sb.AppendLine(file.Content[..remaining]); + } + break; + } + + sb.AppendLine($"# [{file.Level}] {Path.GetFileName(file.FilePath)}"); + sb.AppendLine(file.Content); + sb.AppendLine(); + } + + return sb.ToString(); + } + + /// 특정 레벨의 메모리만 조회합니다. + public IReadOnlyList GetByLevel(string? workFolder, MemoryLevel level) + => CollectAll(workFolder).Where(f => f.Level == level).ToList(); + + private static void CollectFromDir(List result, MemoryLevel level, string dir) + { + var axMd = Path.Combine(dir, "AX.md"); + if (File.Exists(axMd)) + result.Add(new MemoryFile(level, axMd, ReadSafe(axMd))); + } + + private static void CollectRules(List result, MemoryLevel level, string rulesDir) + { + if (!Directory.Exists(rulesDir)) return; + + foreach (var mdFile in Directory.GetFiles(rulesDir, "*.md").OrderBy(f => f)) + { + result.Add(new MemoryFile(level, mdFile, ReadSafe(mdFile))); + } + } + + private static string ReadSafe(string path) + { + try { return File.ReadAllText(path, Encoding.UTF8); } + catch (Exception) { return $"[파일 읽기 실패: {path}]"; } + } +} diff --git a/src/AxCopilot/Services/Agent/HookEnvironmentBuilder.cs b/src/AxCopilot/Services/Agent/HookEnvironmentBuilder.cs new file mode 100644 index 0000000..7b1c8f0 --- /dev/null +++ b/src/AxCopilot/Services/Agent/HookEnvironmentBuilder.cs @@ -0,0 +1,102 @@ +using System.IO; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 17-C-EXT: 훅 환경변수 빌더. +/// 훅 실행 시 셸 환경변수를 자동 주입��니다. +/// Claude Code 호환 변수($CLAUDE_*)와 AX 전용 변수($AX_*)를 모두 제공합니다. +/// +public static class HookEnvironmentBuilder +{ + /// HookContext에서 셸 환경변수 딕셔너리를 생성합니다. + public static Dictionary Build(HookContext context) + { + var env = new Dictionary(StringComparer.OrdinalIgnoreCase); + + // ── 공통 변수 ── + env["AX_SESSION_ID"] = context.SessionId; + env["AX_HOOK_EVENT"] = context.Event.ToString(); + env["AX_CWD"] = context.WorkFolder; + + // ── 도구 관련 (PreToolUse, PostToolUse, PostToolUseFailure) ── + if (!string.IsNullOrEmpty(context.ToolName)) + { + env["AX_TOOL_NAME"] = context.ToolName; + env["CLAUDE_TOOL_NAME"] = context.ToolName; // CC 호환 + } + + if (!string.IsNullOrEmpty(context.ToolInput)) + { + env["AX_TOOL_INPUT"] = context.ToolInput; + env["CLAUDE_TOOL_INPUT"] = context.ToolInput; // CC 호환 + } + + if (!string.IsNullOrEmpty(context.ToolOutput)) + { + env["AX_TOOL_OUTPUT"] = Truncate(context.ToolOutput, 4000); + } + + // ── 파일 경로 (Write, Edit 도구 시 — ToolInput에서 추출) ── + var filePath = ExtractFilePath(context.ToolName, context.ToolInput); + if (!string.IsNullOrEmpty(filePath)) + { + env["AX_FILE_PATH"] = filePath; + env["CLAUDE_FILE_PATH"] = filePath; // CC 호환 + } + + // ── 파일 변경 (FileChanged 이벤트) ── + if (!string.IsNullOrEmpty(context.ChangedFilePath)) + { + env["AX_CHANGED_FILE"] = context.ChangedFilePath; + } + + // ── CwdChanged 전용: CLAUDE_ENV_FILE ── + if (context.Event == HookEventKind.CwdChanged) + { + var envFile = Path.Combine(Path.GetTempPath(), "AxCopilot", + $"env_{context.SessionId}.txt"); + var envDir = Path.GetDirectoryName(envFile); + if (!string.IsNullOrEmpty(envDir) && !Directory.Exists(envDir)) + Directory.CreateDirectory(envDir); + + env["CLAUDE_ENV_FILE"] = envFile; + env["AX_ENV_FILE"] = envFile; + } + + // ── 사용자 프롬프트 (UserPromptSubmit) ── + if (!string.IsNullOrEmpty(context.UserMessage)) + { + env["AX_USER_PROMPT"] = Truncate(context.UserMessage, 2000); + } + + return env; + } + + /// 도구 입력에서 파일 경로를 추출합니다 (file_write, file_edit 도구). + private static string? ExtractFilePath(string? toolName, string? toolInput) + { + if (string.IsNullOrEmpty(toolName) || string.IsNullOrEmpty(toolInput)) + return null; + + // file_write, file_edit, script_create 등에서 path/file_path 추출 + if (toolName is "file_write" or "file_edit" or "script_create" + or "file_manage" or "file_read") + { + try + { + var doc = System.Text.Json.JsonDocument.Parse(toolInput); + if (doc.RootElement.TryGetProperty("path", out var pathProp)) + return pathProp.GetString(); + if (doc.RootElement.TryGetProperty("file_path", out var fp)) + return fp.GetString(); + } + catch (Exception) { } + } + + return null; + } + + private static string Truncate(string text, int maxLength) + => text.Length <= maxLength ? text : text[..maxLength]; +} diff --git a/src/AxCopilot/Services/Agent/HookTypes.cs b/src/AxCopilot/Services/Agent/HookTypes.cs new file mode 100644 index 0000000..3ab26d4 --- /dev/null +++ b/src/AxCopilot/Services/Agent/HookTypes.cs @@ -0,0 +1,130 @@ +using System.Text.Json.Serialization; + +namespace AxCopilot.Services.Agent; + +/// 훅 이벤트 종류. 기존 pre/post 타이밍 외 세션·파일·권한 이벤트 추가. +public enum HookEventKind +{ + // 기존 (Timing 기반에서 이벤트 기반으로 통합) + PreToolUse, + PostToolUse, + PostToolUseFailure, // Phase 25: 도구 실행 실패 후 (CC 동등) + AgentStop, + + // 신규 Phase 17-C + Stop, // Phase 25: 모델 턴 종료 직전 (CC 동등, exit 2=계속) + UserPromptSubmit, + PreCompact, + PostCompact, + FileChanged, + CwdChanged, + SessionStart, + SessionEnd, + ConfigChange, + PermissionRequest, + PreSkillExecute, + PostSkillExecute, + SubagentStart, + SubagentStop, +} + +/// 훅 실행 방식. +public enum HookExecutionMode +{ + Command, // 외부 스크립트 (bat/ps1/cmd) — 기존 + Http, // HTTP POST 웹훅 + Prompt, // LLM 검사 (소형 모델) + Agent, // 미니 에이전트 루프 +} + +/// 확장된 훅 정의 (Phase 17-C). 기존 AgentHookEntry와 병행. +public class ExtendedHookEntry +{ + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("event")] + public HookEventKind Event { get; set; } = HookEventKind.PostToolUse; + + [JsonPropertyName("matcher")] + public string? Matcher { get; set; } // 도구 이름 패턴 (* = 모두) + + [JsonPropertyName("mode")] + public HookExecutionMode Mode { get; set; } = HookExecutionMode.Command; + + // Command 모드 + [JsonPropertyName("script_path")] + public string? ScriptPath { get; set; } + + [JsonPropertyName("arguments")] + public string? Arguments { get; set; } + + // Http 모드 + [JsonPropertyName("url")] + public string? Url { get; set; } + + [JsonPropertyName("headers")] + public Dictionary Headers { get; set; } = new(); + + // Prompt 모드 + [JsonPropertyName("prompt")] + public string? Prompt { get; set; } + + [JsonPropertyName("model")] + public string? Model { get; set; } + + // 공통 속성 + [JsonPropertyName("enabled")] + public bool Enabled { get; set; } = true; + + [JsonPropertyName("once")] + public bool Once { get; set; } = false; // 한 번 실행 후 비활성화 + + [JsonPropertyName("async")] + public bool IsAsync { get; set; } = false; // 비동기 (결과 기다리지 않음) + + /// Phase 25-B: 비동기 + exit code 2 시 대화 재활성화. CC asyncRewake 동등. + [JsonPropertyName("async_rewake")] + public bool AsyncRewake { get; set; } = false; + + [JsonPropertyName("timeout_seconds")] + public int TimeoutSeconds { get; set; } = 30; + + [JsonPropertyName("status_message")] + public string? StatusMessage { get; set; } // 실행 중 표시 메시지 + + [JsonPropertyName("condition")] + public string? Condition { get; set; } // 조건 (예: "permission_mode == acceptEdits") + + [JsonPropertyName("watch_paths")] + public List WatchPaths { get; set; } = new(); // SessionStart 훅의 감시 경로 +} + +/// 훅 실행 컨텍스트. +public class HookContext +{ + public HookEventKind Event { get; init; } + public string? ToolName { get; init; } + public string? ToolInput { get; init; } + public string? ToolOutput { get; init; } + public bool ToolSuccess { get; init; } + public string? UserMessage { get; init; } + public string? ChangedFilePath { get; init; } + public string SessionId { get; init; } = ""; + public string WorkFolder { get; init; } = ""; +} + +/// 확장된 훅 실행 결과. +public record ExtendedHookResult +{ + public bool Block { get; init; } = false; + public string? BlockReason { get; init; } + public string? AdditionalContext { get; init; } // 시스템 프롬프트에 추가 + public string? UpdatedInput { get; init; } // 수정된 도구 입력 + public ExtendedPermissionDecision? PermissionDecision { get; init; } + public IReadOnlyList? WatchPaths { get; init; } + public string? StatusMessage { get; init; } + public bool Once { get; init; } = false; // 이 훅을 한 번만 실행 후 비활성화 +} + +public enum ExtendedPermissionDecision { Allow, Deny, Ask } diff --git a/src/AxCopilot/Services/Agent/HtmlSkill.cs b/src/AxCopilot/Services/Agent/HtmlSkill.cs new file mode 100644 index 0000000..3c51f0f --- /dev/null +++ b/src/AxCopilot/Services/Agent/HtmlSkill.cs @@ -0,0 +1,249 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// HTML (.html) 보고서를 생성하는 내장 스킬. +/// 테마 무드(mood)를 선택하면 TemplateService에서 해당 CSS를 가져와 적용합니다. +/// TOC, 커버 페이지, 섹션 번호 등 고급 문서 기능을 지원합니다. +/// +public class HtmlSkill : IAgentTool +{ + public string Name => "html_create"; + public string Description => "Create a styled HTML (.html) document with rich formatting. " + + "Supports: table of contents (toc), cover page, callouts (.callout-info/warning/tip/danger), " + + "badges (.badge-blue/green/red/yellow/purple), CSS bar charts (.chart-bar), " + + "progress bars (.progress), timelines (.timeline), grid layouts (.grid-2/3/4), " + + "and auto section numbering. " + + "Available moods: modern, professional, creative, minimal, elegant, dark, colorful, corporate, magazine, dashboard."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Output file path (.html). Relative to work folder." }, + ["title"] = new() { Type = "string", Description = "Document title (shown in browser tab and header)" }, + ["body"] = new() { Type = "string", Description = "HTML body content. Use semantic tags: h2/h3 for sections, " + + "div.callout-info/warning/tip/danger for callouts, span.badge-blue/green/red for badges, " + + "div.chart-bar>div.bar-item for charts, div.grid-2/3/4 for grid layouts, " + + "div.timeline>div.timeline-item for timelines, div.progress for progress bars." }, + ["mood"] = new() { Type = "string", Description = "Design template mood: modern, professional, creative, minimal, elegant, dark, colorful, corporate, magazine, dashboard. Default: modern" }, + ["style"] = new() { Type = "string", Description = "Optional additional CSS. Appended after mood+shared CSS." }, + ["toc"] = new() { Type = "boolean", Description = "Auto-generate table of contents from h2/h3 headings. Default: false" }, + ["numbered"] = new() { Type = "boolean", Description = "Auto-number h2/h3 sections (1., 1-1., etc). Default: false" }, + ["cover"] = new() + { + Type = "object", + Description = "Cover page config: {\"title\": \"...\", \"subtitle\": \"...\", \"author\": \"...\", \"date\": \"...\", \"gradient\": \"#hex1,#hex2\"}. Omit to skip cover page." + }, + }, + Required = ["path", "title", "body"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var title = args.GetProperty("title").GetString() ?? "Report"; + var body = args.GetProperty("body").GetString() ?? ""; + var customStyle = args.TryGetProperty("style", out var s) ? s.GetString() : null; + var mood = args.TryGetProperty("mood", out var m) ? m.GetString() ?? "modern" : "modern"; + var useToc = args.TryGetProperty("toc", out var tocVal) && tocVal.GetBoolean(); + var useNumbered = args.TryGetProperty("numbered", out var numVal) && numVal.GetBoolean(); + var hasCover = args.TryGetProperty("cover", out var coverVal) && coverVal.ValueKind == JsonValueKind.Object; + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (context.ActiveTab == "Cowork") fullPath = AgentContext.EnsureTimestampedPath(fullPath); + if (!fullPath.EndsWith(".html", StringComparison.OrdinalIgnoreCase) && + !fullPath.EndsWith(".htm", StringComparison.OrdinalIgnoreCase)) + fullPath += ".html"; + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + try + { + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + // 스타일 결정: mood CSS + shared CSS + custom + var style = TemplateService.GetCss(mood); + if (!string.IsNullOrEmpty(customStyle)) + style += "\n" + customStyle; + + var moodInfo = TemplateService.GetMood(mood); + var moodLabel = moodInfo != null ? $" · {moodInfo.Icon} {moodInfo.Label}" : ""; + + // 섹션 번호 자동 부여 — h2, h3에 class="numbered" 추가 + if (useNumbered) + body = AddNumberedClass(body); + + // h2/h3에서 id 속성 자동 부여 (TOC 앵커용) + body = EnsureHeadingIds(body); + + // TOC 생성 + var tocHtml = useToc ? GenerateToc(body) : ""; + + // 커버 페이지 생성 + var coverHtml = hasCover ? GenerateCover(coverVal, title) : ""; + + var sb = new StringBuilder(); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine($"{Escape(title)}"); + sb.AppendLine($""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine("
      "); + + // 커버 페이지 + if (!string.IsNullOrEmpty(coverHtml)) + { + sb.AppendLine(coverHtml); + } + else + { + // 커버가 없으면 기존 방식의 제목+메타 + sb.AppendLine($"

      {Escape(title)}

      "); + sb.AppendLine($"
      생성: {DateTime.Now:yyyy-MM-dd HH:mm} | AX Copilot{moodLabel}
      "); + } + + // TOC + if (!string.IsNullOrEmpty(tocHtml)) + sb.AppendLine(tocHtml); + + // 본문 + sb.AppendLine(body); + + sb.AppendLine("
      "); + sb.AppendLine(""); + sb.AppendLine(""); + + await File.WriteAllTextAsync(fullPath, sb.ToString(), Encoding.UTF8, ct); + + var features = new List(); + if (useToc) features.Add("목차"); + if (useNumbered) features.Add("섹션번호"); + if (hasCover) features.Add("커버페이지"); + var featureStr = features.Count > 0 ? $" [{string.Join(", ", features)}]" : ""; + + return ToolResult.Ok( + $"HTML 문서 생성 완료: {fullPath} (디자인: {mood}{featureStr})", + fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"HTML 생성 실패: {ex.Message}"); + } + } + + /// h2, h3 태그에 id 속성이 없으면 자동 부여 + private static string EnsureHeadingIds(string html) + { + int counter = 0; + return Regex.Replace(html, @"<(h[23])(\s[^>]*)?>", match => + { + var tag = match.Groups[1].Value; + var attrs = match.Groups[2].Value; + counter++; + + // 이미 id가 있으면 그대로 + if (attrs.Contains("id=", StringComparison.OrdinalIgnoreCase)) + return match.Value; + + return $"<{tag}{attrs} id=\"section-{counter}\">"; + }); + } + + /// h2, h3에 class="numbered" 추가 + private static string AddNumberedClass(string html) + { + return Regex.Replace(html, @"<(h[23])(\s[^>]*)?>", match => + { + var tag = match.Groups[1].Value; + var attrs = match.Groups[2].Value; + + // 이미 numbered 클래스가 있으면 그대로 + if (attrs.Contains("numbered", StringComparison.OrdinalIgnoreCase)) + return match.Value; + + // 기존 class 속성에 추가 + if (Regex.IsMatch(attrs, @"class\s*=\s*""", RegexOptions.IgnoreCase)) + return Regex.Replace(match.Value, @"class\s*=\s*""", "class=\"numbered "); + + return $"<{tag}{attrs} class=\"numbered\">"; + }); + } + + /// body HTML에서 h2/h3을 파싱해 목차 HTML 생성 + private static string GenerateToc(string html) + { + var headings = Regex.Matches(html, @"<(h[23])[^>]*id=""([^""]+)""[^>]*>(.*?)", + RegexOptions.IgnoreCase | RegexOptions.Singleline); + + if (headings.Count == 0) return ""; + + var sb = new StringBuilder(); + sb.AppendLine(""); + return sb.ToString(); + } + + /// cover 객체에서 커버 페이지 HTML 생성 + private static string GenerateCover(JsonElement cover, string fallbackTitle) + { + var coverTitle = cover.TryGetProperty("title", out var ct) ? ct.GetString() ?? fallbackTitle : fallbackTitle; + var subtitle = cover.TryGetProperty("subtitle", out var sub) ? sub.GetString() ?? "" : ""; + var author = cover.TryGetProperty("author", out var auth) ? auth.GetString() ?? "" : ""; + var date = cover.TryGetProperty("date", out var dt) ? dt.GetString() ?? DateTime.Now.ToString("yyyy-MM-dd") : DateTime.Now.ToString("yyyy-MM-dd"); + var gradient = cover.TryGetProperty("gradient", out var grad) ? grad.GetString() : null; + + var styleAttr = ""; + if (!string.IsNullOrEmpty(gradient) && gradient.Contains(',')) + { + var colors = gradient.Split(','); + styleAttr = $" style=\"background: linear-gradient(135deg, {colors[0].Trim()} 0%, {colors[1].Trim()} 100%)\""; + } + + var sb = new StringBuilder(); + sb.AppendLine($"
      "); + sb.AppendLine($"

      {Escape(coverTitle)}

      "); + if (!string.IsNullOrEmpty(subtitle)) + sb.AppendLine($"
      {Escape(subtitle)}
      "); + sb.AppendLine("
      "); + + var metaParts = new List(); + if (!string.IsNullOrEmpty(author)) metaParts.Add(author); + metaParts.Add(date); + metaParts.Add("AX Copilot"); + sb.AppendLine($"
      {Escape(string.Join(" · ", metaParts))}
      "); + + sb.AppendLine("
      "); + return sb.ToString(); + } + + private static string Escape(string s) => + s.Replace("&", "&").Replace("<", "<").Replace(">", ">"); +} diff --git a/src/AxCopilot/Services/Agent/HttpTool.cs b/src/AxCopilot/Services/Agent/HttpTool.cs new file mode 100644 index 0000000..260ef69 --- /dev/null +++ b/src/AxCopilot/Services/Agent/HttpTool.cs @@ -0,0 +1,148 @@ +using System.Net.Http; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 로컬/사내 HTTP API 호출 도구. +/// GET/POST/PUT/DELETE 요청, JSON 파싱, 헤더 설정을 지원합니다. +/// +public class HttpTool : IAgentTool +{ + public string Name => "http_tool"; + public string Description => + "Make HTTP requests to local or internal APIs. " + + "Supports GET, POST, PUT, DELETE methods with JSON body and custom headers. " + + "Only allows localhost and internal network addresses (security restriction). " + + "Use this for testing APIs, fetching data from internal services, or webhooks."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["method"] = new() + { + Type = "string", + Description = "HTTP method", + Enum = ["GET", "POST", "PUT", "DELETE", "PATCH"], + }, + ["url"] = new() + { + Type = "string", + Description = "Request URL (localhost or internal network only)", + }, + ["body"] = new() + { + Type = "string", + Description = "Request body (JSON string, for POST/PUT/PATCH)", + }, + ["headers"] = new() + { + Type = "string", + Description = "Custom headers as JSON object, e.g. {\"Authorization\": \"Bearer token\"}", + }, + ["timeout"] = new() + { + Type = "string", + Description = "Request timeout in seconds (default: 30, max: 120)", + }, + }, + Required = ["method", "url"], + }; + + private static readonly HttpClient _client = new() { Timeout = TimeSpan.FromSeconds(30) }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var method = args.GetProperty("method").GetString()?.ToUpperInvariant() ?? "GET"; + var url = args.GetProperty("url").GetString() ?? ""; + var body = args.TryGetProperty("body", out var b) ? b.GetString() ?? "" : ""; + var headers = args.TryGetProperty("headers", out var h) ? h.GetString() ?? "" : ""; + var timeout = args.TryGetProperty("timeout", out var t) ? int.TryParse(t.GetString(), out var ts) ? Math.Min(ts, 120) : 30 : 30; + + // 네트워크 모드별 접속 제어 + var internalMode = context.Settings?.InternalModeEnabled ?? true; + if (internalMode && !IsAllowedHost(url)) + return ToolResult.Fail("사내 모드에서는 외부 URL에 접속할 수 없습니다. 설정에서 사외 모드를 활성화하거나, localhost·사내 네트워크 주소만 사용하세요."); + + try + { + var httpMethod = new HttpMethod(method); + using var request = new HttpRequestMessage(httpMethod, url); + + // 헤더 설정 + if (!string.IsNullOrEmpty(headers)) + { + using var headerDoc = JsonDocument.Parse(headers); + foreach (var prop in headerDoc.RootElement.EnumerateObject()) + request.Headers.TryAddWithoutValidation(prop.Name, prop.Value.GetString()); + } + + // 본문 설정 + if (!string.IsNullOrEmpty(body) && method is "POST" or "PUT" or "PATCH") + request.Content = new StringContent(body, Encoding.UTF8, "application/json"); + + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(timeout)); + + using var response = await _client.SendAsync(request, cts.Token); + + var statusCode = (int)response.StatusCode; + var responseBody = await response.Content.ReadAsStringAsync(cts.Token); + + // 응답 포맷팅 + var sb = new StringBuilder(); + sb.AppendLine($"HTTP {statusCode} {response.ReasonPhrase}"); + sb.AppendLine($"Content-Type: {response.Content.Headers.ContentType}"); + sb.AppendLine(); + + // JSON이면 포맷 + if (response.Content.Headers.ContentType?.MediaType?.Contains("json") == true) + { + try + { + using var doc = JsonDocument.Parse(responseBody); + responseBody = JsonSerializer.Serialize(doc.RootElement, new JsonSerializerOptions { WriteIndented = true }); + } + catch (Exception) { /* not valid JSON, keep raw */ } + } + + if (responseBody.Length > 8000) + responseBody = responseBody[..8000] + $"\n... (truncated, total {responseBody.Length} chars)"; + + sb.Append(responseBody); + return ToolResult.Ok(sb.ToString()); + } + catch (TaskCanceledException) + { + return ToolResult.Fail($"요청 시간 초과 ({timeout}초)"); + } + catch (Exception ex) + { + return ToolResult.Fail($"HTTP 요청 실패: {ex.Message}"); + } + } + + private static bool IsAllowedHost(string url) + { + if (!Uri.TryCreate(url, UriKind.Absolute, out var uri)) return false; + var host = uri.Host; + + if (host is "localhost" or "127.0.0.1" or "::1") return true; + + // 사내 네트워크 대역 + if (System.Net.IPAddress.TryParse(host, out var ip)) + { + var bytes = ip.GetAddressBytes(); + if (bytes.Length == 4) + { + if (bytes[0] == 10) return true; // 10.0.0.0/8 + if (bytes[0] == 172 && bytes[1] >= 16 && bytes[1] <= 31) return true; // 172.16.0.0/12 + if (bytes[0] == 192 && bytes[1] == 168) return true; // 192.168.0.0/16 + } + } + + return false; + } +} diff --git a/src/AxCopilot/Services/Agent/IAgentMemoryRepository.cs b/src/AxCopilot/Services/Agent/IAgentMemoryRepository.cs new file mode 100644 index 0000000..e3a8588 --- /dev/null +++ b/src/AxCopilot/Services/Agent/IAgentMemoryRepository.cs @@ -0,0 +1,24 @@ +namespace AxCopilot.Services.Agent; + +/// +/// Phase 30-B: 에이전트 타입별 메모리 저장소 인터페이스 (DIP). +/// 구체 구현()에 의존하지 않고 +/// 인터페이스에만 의존하여 테스트 가능성과 확장성을 확보합니다. +/// +public interface IAgentMemoryRepository +{ + /// 에이전트 타입 메모리를 로드합니다. + Task LoadMemoryAsync(string agentType); + + /// 에이전트 타입 메모리를 저장합니다. + Task SaveMemoryAsync(string agentType, string content); + + /// 학습 내용을 기존 메모리에 추가합니다. + Task AppendLearnAsync(string agentType, string learning); + + /// 등록된 에이전트 타입 목록을 반환합니다. + IReadOnlyList GetAgentTypes(); + + /// 에이전트 타입 메모리를 삭제합니다. + void DeleteMemory(string agentType); +} diff --git a/src/AxCopilot/Services/Agent/IAgentTool.cs b/src/AxCopilot/Services/Agent/IAgentTool.cs new file mode 100644 index 0000000..5254e15 --- /dev/null +++ b/src/AxCopilot/Services/Agent/IAgentTool.cs @@ -0,0 +1,241 @@ +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent; + +/// +/// 에이전트 도구의 공통 인터페이스. +/// LLM function calling을 통해 호출되며, JSON 파라미터를 받아 결과를 반환합니다. +/// +public interface IAgentTool +{ + /// LLM에 노출되는 도구 이름 (snake_case). 예: "file_read" + string Name { get; } + + /// LLM에 전달되는 도구 설명. + string Description { get; } + + /// LLM function calling용 파라미터 JSON Schema. + ToolParameterSchema Parameters { get; } + + /// 도구를 실행하고 결과를 반환합니다. + /// LLM이 생성한 JSON 파라미터 + /// 실행 컨텍스트 (작업 폴더, 권한 등) + /// 취소 토큰 + Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default); +} + +/// 도구 실행 결과. +public class ToolResult +{ + /// 성공 여부. + public bool Success { get; init; } + + /// 결과 텍스트 (LLM에 피드백). + public string Output { get; init; } = ""; + + /// 생성/수정된 파일 경로 (UI 표시용). + public string? FilePath { get; init; } + + /// 오류 메시지 (실패 시). + public string? Error { get; init; } + + public static ToolResult Ok(string output, string? filePath = null) => + new() { Success = true, Output = output, FilePath = filePath }; + + public static ToolResult Fail(string error) => + new() { Success = false, Output = error, Error = error }; +} + +/// 도구 파라미터 JSON Schema (LLM function calling용). +public class ToolParameterSchema +{ + [JsonPropertyName("type")] + public string Type { get; init; } = "object"; + + [JsonPropertyName("properties")] + public Dictionary Properties { get; init; } = new(); + + [JsonPropertyName("required")] + public List Required { get; init; } = new(); +} + +/// 파라미터 속성 정의. +public class ToolProperty +{ + [JsonPropertyName("type")] + public string Type { get; init; } = "string"; + + [JsonPropertyName("description")] + public string Description { get; init; } = ""; + + [JsonPropertyName("enum")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public List? Enum { get; init; } + + /// array 타입일 때 항목 스키마. Gemini API 필수. + [JsonPropertyName("items")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public ToolProperty? Items { get; init; } +} + +/// 에이전트 실행 컨텍스트. +public class AgentContext +{ + /// 앱 설정 참조 — Application.Current as App 서비스 로케이터 패턴 대체. + public AppSettings? Settings { get; init; } + + /// LLM 설정 바로가기. + public LlmSettings? Llm => Settings?.Llm; + + /// 작업 폴더 경로. + public string WorkFolder { get; init; } = ""; + + /// 파일 접근 권한. Ask | Auto | Deny + public string Permission { get; init; } = "Ask"; + + /// 도구별 권한 오버라이드. 키: 도구명, 값: "ask" | "auto" | "deny". + public Dictionary ToolPermissions { get; init; } = new(); + + /// 차단 경로 패턴 목록. + public List BlockedPaths { get; init; } = new(); + + /// 차단 확장자 목록. + public List BlockedExtensions { get; init; } = new(); + + /// 현재 활성 탭. "Chat" | "Cowork" | "Code". + public string ActiveTab { get; init; } = "Chat"; + + /// 개발자 모드: 상세 이력 표시. + public bool DevMode { get; init; } + + /// 개발자 모드: 도구 실행 전 매번 사용자 승인 대기. + public bool DevModeStepApproval { get; init; } + + /// 권한 확인 콜백 (Ask 모드). 반환값: true=승인, false=거부. + public Func>? AskPermission { get; init; } + + /// 사용자 의사결정 콜백. (질문, 선택지) → 사용자 응답 문자열. + public Func, Task>? UserDecision { get; init; } + + /// 에이전트 질문 콜백 (UserAskTool 전용). (질문, 선택지, 기본값) → 사용자 응답. + public Func, string, Task>? UserAskCallback { get; init; } + + /// 경로가 허용되는지 확인합니다. + public bool IsPathAllowed(string path) + { + var fullPath = Path.GetFullPath(path); + + // 차단 확장자 검사 + var ext = Path.GetExtension(fullPath).ToLowerInvariant(); + if (BlockedExtensions.Any(e => string.Equals(e, ext, StringComparison.OrdinalIgnoreCase))) + return false; + + // 차단 경로 패턴 검사 + foreach (var pattern in BlockedPaths) + { + // 간단한 와일드카드 매칭: *\Windows\* → fullPath에 \Windows\ 포함 시 차단 + var clean = pattern.Replace("*", ""); + if (!string.IsNullOrEmpty(clean) && fullPath.Contains(clean, StringComparison.OrdinalIgnoreCase)) + return false; + } + + // 작업 폴더 제한: 작업 폴더가 설정되어 있으면 하위 경로만 허용 + if (!string.IsNullOrEmpty(WorkFolder)) + { + var workFull = Path.GetFullPath(WorkFolder); + if (!fullPath.StartsWith(workFull, StringComparison.OrdinalIgnoreCase)) + return false; + } + + return true; + } + + /// + /// 파일 경로에 타임스탬프를 추가합니다. + /// 예: report.html → report_20260328_1430.html + /// 동일 이름 파일이 이미 존재하면 자동으로 타임스탬프를 붙입니다. + /// + public static string EnsureTimestampedPath(string fullPath) + { + var dir = Path.GetDirectoryName(fullPath) ?? ""; + var name = Path.GetFileNameWithoutExtension(fullPath); + var ext = Path.GetExtension(fullPath); + var stamp = DateTime.Now.ToString("yyyyMMdd_HHmm"); + + // 이미 타임스탬프가 포함된 파일명이면 그대로 사용 + if (System.Text.RegularExpressions.Regex.IsMatch(name, @"_\d{8}_\d{4}$")) + return fullPath; + + var timestamped = Path.Combine(dir, $"{name}_{stamp}{ext}"); + return timestamped; + } + + /// 파일 쓰기/수정 권한을 확인합니다. 도구별 권한 오버라이드를 우선 적용합니다. + public async Task CheckWritePermissionAsync(string toolName, string filePath) + { + // 도구별 권한 오버라이드 확인 + var effectivePerm = Permission; + if (ToolPermissions.TryGetValue(toolName, out var toolPerm)) + effectivePerm = toolPerm; + + if (string.Equals(effectivePerm, "Deny", StringComparison.OrdinalIgnoreCase)) return false; + if (string.Equals(effectivePerm, "Auto", StringComparison.OrdinalIgnoreCase)) return true; + // Ask 모드 + if (AskPermission != null) + return await AskPermission(toolName, filePath); + return false; + } +} + +/// 에이전트 이벤트 (UI 표시용). +public class AgentEvent +{ + public DateTime Timestamp { get; init; } = DateTime.Now; + public AgentEventType Type { get; init; } + public string ToolName { get; init; } = ""; + public string Summary { get; init; } = ""; + public string? FilePath { get; init; } + public bool Success { get; init; } = true; + + /// Task Decomposition: 현재 단계 / 전체 단계 (진행률 표시용). + public int StepCurrent { get; init; } + public int StepTotal { get; init; } + /// Task Decomposition: 단계 목록. + public List? Steps { get; init; } + + // ── 워크플로우 분석기용 확장 필드 ── + + /// 도구 실행 소요 시간 (ms). 0이면 미측정. + public long ElapsedMs { get; init; } + + /// 이번 LLM 호출의 입력 토큰 수. + public int InputTokens { get; init; } + + /// 이번 LLM 호출의 출력 토큰 수. + public int OutputTokens { get; init; } + + /// 도구 파라미터 JSON (debug 모드에서만 기록). + public string? ToolInput { get; init; } + + /// 현재 에이전트 루프 반복 번호. + public int Iteration { get; init; } +} + +public enum AgentEventType +{ + Thinking, // LLM 사고 중 + Planning, // 작업 계획 수립 + StepStart, // 단계 시작 + StepDone, // 단계 완료 + ToolCall, // 도구 호출 + ToolResult, // 도구 결과 + SkillCall, // 스킬 호출 + Error, // 오류 + Complete, // 완료 + Decision, // 사용자 의사결정 대기 + Paused, // 에이전트 일시정지 + Resumed, // 에이전트 재개 +} diff --git a/src/AxCopilot/Services/Agent/IConditionalTool.cs b/src/AxCopilot/Services/Agent/IConditionalTool.cs new file mode 100644 index 0000000..8f1a9be --- /dev/null +++ b/src/AxCopilot/Services/Agent/IConditionalTool.cs @@ -0,0 +1,41 @@ +namespace AxCopilot.Services.Agent; + +/// +/// Phase 23: 조건부 도구 인터페이스 (ISP). +/// 도구가 현재 환경에서 사용 가능한지 자가 판단합니다. +/// IAgentTool을 구현하는 도구가 추가로 이 인터페이스를 구현하면, +/// ToolRegistry에서 도구 목록 생성 시 자동 필터링됩니다. +/// +public interface IConditionalTool +{ + /// 현재 환경에서 이 도구가 사용 가능한지 확인합니다. + bool IsEnabled(ToolEnvironmentContext env); +} + +/// 도구 활성화 판단에 사용되는 환경 컨텍스트. +public class ToolEnvironmentContext +{ + /// 앱 설정. + public Models.AppSettings? Settings { get; init; } + + /// 현재 활성 탭. "Chat" | "Cowork" | "Code". + public string ActiveTab { get; init; } = "Chat"; + + /// 작업 폴더 경로. + public string? WorkFolder { get; init; } + + /// 작업 폴더에 git 저장소가 있는지 여부. + public bool HasGitRepo { get; init; } + + /// Python 런타임 사용 가능 여부. + public bool HasPythonRuntime { get; init; } + + /// Node.js 런타임 사�� 가능 여부. + public bool HasNodeRuntime { get; init; } + + /// AI 기능 활성화 여부. + public bool AiEnabled { get; init; } + + /// 사내 모드 (외부 인터넷 차단) 여부. + public bool InternalModeEnabled { get; init; } +} diff --git a/src/AxCopilot/Services/Agent/ImageAnalyzeTool.cs b/src/AxCopilot/Services/Agent/ImageAnalyzeTool.cs new file mode 100644 index 0000000..a164b10 --- /dev/null +++ b/src/AxCopilot/Services/Agent/ImageAnalyzeTool.cs @@ -0,0 +1,150 @@ +using System.IO; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 이미지를 분석하여 내용 설명, 텍스트 추출, 차트 데이터 해석을 수행하는 도구. +/// LLM 멀티모달 API를 활용합니다. +/// +public class ImageAnalyzeTool : IAgentTool +{ + public string Name => "image_analyze"; + public string Description => + "Analyze an image using LLM multimodal vision. " + + "Tasks: describe (general description), extract_text (OCR-like text extraction), " + + "extract_data (extract structured data like tables/charts from image), " + + "compare (compare two images and describe differences)."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["image_path"] = new() + { + Type = "string", + Description = "Path to the image file (.png, .jpg, .jpeg, .bmp, .gif, .webp)." + }, + ["task"] = new() + { + Type = "string", + Description = "Analysis task: describe, extract_text, extract_data, compare. Default: describe", + Enum = ["describe", "extract_text", "extract_data", "compare"] + }, + ["compare_path"] = new() + { + Type = "string", + Description = "Path to second image for comparison (only used with task=compare)." + }, + ["question"] = new() + { + Type = "string", + Description = "Optional specific question about the image." + }, + ["language"] = new() + { + Type = "string", + Description = "Response language: ko (Korean), en (English). Default: ko" + }, + }, + Required = ["image_path"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var imagePath = args.GetProperty("image_path").GetString() ?? ""; + var task = args.TryGetProperty("task", out var taskEl) ? taskEl.GetString() ?? "describe" : "describe"; + var question = args.TryGetProperty("question", out var qEl) ? qEl.GetString() ?? "" : ""; + var language = args.TryGetProperty("language", out var langEl) ? langEl.GetString() ?? "ko" : "ko"; + + var fullPath = FileReadTool.ResolvePath(imagePath, context.WorkFolder); + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + if (!File.Exists(fullPath)) + return ToolResult.Fail($"파일 없음: {fullPath}"); + + // 지원 이미지 형식 확인 + var ext = Path.GetExtension(fullPath).ToLowerInvariant(); + if (!IsImageExtension(ext)) + return ToolResult.Fail($"지원하지 않는 이미지 형식: {ext}"); + + // 이미지를 base64로 인코딩 + var imageBytes = await File.ReadAllBytesAsync(fullPath, ct); + var base64 = Convert.ToBase64String(imageBytes); + var mimeType = ext switch + { + ".png" => "image/png", + ".jpg" or ".jpeg" => "image/jpeg", + ".gif" => "image/gif", + ".webp" => "image/webp", + ".bmp" => "image/bmp", + _ => "image/png" + }; + + // 파일 크기 제한 (10MB) + if (imageBytes.Length > 10 * 1024 * 1024) + return ToolResult.Fail("이미지 크기가 10MB를 초과합니다."); + + // 비교 모드: 두 번째 이미지 + string? compareBase64 = null; + string? compareMime = null; + if (task == "compare" && args.TryGetProperty("compare_path", out var cpEl)) + { + var comparePath = FileReadTool.ResolvePath(cpEl.GetString() ?? "", context.WorkFolder); + if (File.Exists(comparePath) && context.IsPathAllowed(comparePath)) + { + var compareBytes = await File.ReadAllBytesAsync(comparePath, ct); + compareBase64 = Convert.ToBase64String(compareBytes); + var compareExt = Path.GetExtension(comparePath).ToLowerInvariant(); + compareMime = compareExt switch + { + ".png" => "image/png", + ".jpg" or ".jpeg" => "image/jpeg", + ".gif" => "image/gif", + ".webp" => "image/webp", + _ => "image/png" + }; + } + } + + // 프롬프트 구성 + var langPrompt = language == "en" ? "Respond in English." : "한국어로 응답하세요."; + var prompt = task switch + { + "extract_text" => + $"이 이미지에서 모든 텍스트를 추출하세요. 원본 레이아웃을 최대한 유지하세요. {langPrompt}", + "extract_data" => + $"이 이미지에서 구조화된 데이터를 추출하세요. 테이블, 차트, 그래프 등의 데이터를 " + + $"CSV 또는 JSON 형식으로 변환하세요. 차트의 경우 각 항목의 값을 추정하세요. {langPrompt}", + "compare" => + $"두 이미지를 비교하고 차이점을 설명하세요. {langPrompt}", + _ => string.IsNullOrEmpty(question) + ? $"이 이미지의 내용을 상세하게 설명하세요. 주요 요소, 텍스트, 레이아웃, 색상 등을 포함하세요. {langPrompt}" + : $"{question} {langPrompt}" + }; + + // LLM에 이미지 분석 요청을 위한 결과 생성 + // 실제 LLM 호출은 에이전트 루프에서 수행하므로, 여기서는 이미지 정보와 프롬프트를 반환 + var info = new System.Text.StringBuilder(); + info.AppendLine($"🖼 이미지 분석 준비 완료"); + info.AppendLine($" 파일: {Path.GetFileName(fullPath)}"); + info.AppendLine($" 크기: {imageBytes.Length / 1024}KB"); + info.AppendLine($" 형식: {mimeType}"); + info.AppendLine($" 작업: {task}"); + info.AppendLine(); + info.AppendLine($"[IMAGE_BASE64:{mimeType}]{base64}[/IMAGE_BASE64]"); + + if (compareBase64 != null) + info.AppendLine($"[IMAGE_BASE64:{compareMime}]{compareBase64}[/IMAGE_BASE64]"); + + info.AppendLine(); + info.AppendLine($"분석 프롬프트: {prompt}"); + + return ToolResult.Ok(info.ToString()); + } + + private static bool IsImageExtension(string ext) + { + return ext is ".png" or ".jpg" or ".jpeg" or ".gif" or ".bmp" or ".webp"; + } +} diff --git a/src/AxCopilot/Services/Agent/JsonTool.cs b/src/AxCopilot/Services/Agent/JsonTool.cs new file mode 100644 index 0000000..25e26c5 --- /dev/null +++ b/src/AxCopilot/Services/Agent/JsonTool.cs @@ -0,0 +1,231 @@ +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// JSON 파싱·변환·검증·포맷팅 도구. +/// jq 스타일 경로 쿼리, 유효성 검사, 포맷 변환을 지원합니다. +/// +public class JsonTool : IAgentTool +{ + public string Name => "json_tool"; + public string Description => + "JSON processing tool. Actions: " + + "'validate' — check if text is valid JSON and report errors; " + + "'format' — pretty-print or minify JSON; " + + "'query' — extract value by dot-path (e.g. 'data.users[0].name'); " + + "'keys' — list top-level keys; " + + "'convert' — convert between JSON/CSV (flat arrays only)."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action to perform", + Enum = ["validate", "format", "query", "keys", "convert"], + }, + ["json"] = new() + { + Type = "string", + Description = "JSON text to process", + }, + ["path"] = new() + { + Type = "string", + Description = "Dot-path for query action (e.g. 'data.items[0].name')", + }, + ["minify"] = new() + { + Type = "string", + Description = "For format action: 'true' to minify, 'false' to pretty-print (default)", + }, + ["target_format"] = new() + { + Type = "string", + Description = "For convert action: target format", + Enum = ["csv"], + }, + }, + Required = ["action", "json"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + var json = args.GetProperty("json").GetString() ?? ""; + + try + { + return Task.FromResult(action switch + { + "validate" => Validate(json), + "format" => Format(json, args.TryGetProperty("minify", out var m) && m.GetString() == "true"), + "query" => Query(json, args.TryGetProperty("path", out var p) ? p.GetString() ?? "" : ""), + "keys" => Keys(json), + "convert" => Convert(json, args.TryGetProperty("target_format", out var tf) ? tf.GetString() ?? "csv" : "csv"), + _ => ToolResult.Fail($"Unknown action: {action}"), + }); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"JSON 처리 오류: {ex.Message}")); + } + } + + private static ToolResult Validate(string json) + { + try + { + using var doc = JsonDocument.Parse(json); + var root = doc.RootElement; + var kind = root.ValueKind switch + { + JsonValueKind.Object => $"Object ({root.EnumerateObject().Count()} keys)", + JsonValueKind.Array => $"Array ({root.GetArrayLength()} items)", + _ => root.ValueKind.ToString(), + }; + return ToolResult.Ok($"✓ Valid JSON — {kind}"); + } + catch (JsonException ex) + { + return ToolResult.Ok($"✗ Invalid JSON — {ex.Message}"); + } + } + + private static ToolResult Format(string json, bool minify) + { + using var doc = JsonDocument.Parse(json); + var opts = new JsonSerializerOptions { WriteIndented = !minify }; + var result = JsonSerializer.Serialize(doc.RootElement, opts); + if (result.Length > 8000) result = result[..8000] + "\n... (truncated)"; + return ToolResult.Ok(result); + } + + private static ToolResult Query(string json, string path) + { + if (string.IsNullOrEmpty(path)) + return ToolResult.Fail("path parameter is required for query action"); + + using var doc = JsonDocument.Parse(json); + var current = doc.RootElement; + + foreach (var segment in ParsePath(path)) + { + if (segment.IsIndex) + { + if (current.ValueKind != JsonValueKind.Array || segment.Index >= current.GetArrayLength()) + return ToolResult.Fail($"Array index [{segment.Index}] out of range"); + current = current[segment.Index]; + } + else + { + if (current.ValueKind != JsonValueKind.Object || !current.TryGetProperty(segment.Key, out var prop)) + return ToolResult.Fail($"Key '{segment.Key}' not found"); + current = prop; + } + } + + var value = current.ValueKind switch + { + JsonValueKind.String => current.GetString() ?? "", + JsonValueKind.Number => current.GetRawText(), + JsonValueKind.True => "true", + JsonValueKind.False => "false", + JsonValueKind.Null => "null", + _ => JsonSerializer.Serialize(current, new JsonSerializerOptions { WriteIndented = true }), + }; + if (value.Length > 5000) value = value[..5000] + "\n... (truncated)"; + return ToolResult.Ok(value); + } + + private static ToolResult Keys(string json) + { + using var doc = JsonDocument.Parse(json); + if (doc.RootElement.ValueKind != JsonValueKind.Object) + return ToolResult.Fail("Root element is not an object"); + + var keys = doc.RootElement.EnumerateObject().Select(p => + { + var type = p.Value.ValueKind switch + { + JsonValueKind.Object => "object", + JsonValueKind.Array => $"array[{p.Value.GetArrayLength()}]", + JsonValueKind.String => "string", + JsonValueKind.Number => "number", + JsonValueKind.True or JsonValueKind.False => "boolean", + _ => "null", + }; + return $" {p.Name}: {type}"; + }); + return ToolResult.Ok($"Keys ({doc.RootElement.EnumerateObject().Count()}):\n{string.Join("\n", keys)}"); + } + + private static ToolResult Convert(string json, string targetFormat) + { + if (targetFormat != "csv") + return ToolResult.Fail($"Unsupported target format: {targetFormat}"); + + using var doc = JsonDocument.Parse(json); + if (doc.RootElement.ValueKind != JsonValueKind.Array) + return ToolResult.Fail("JSON must be an array for CSV conversion"); + + var arr = doc.RootElement; + if (arr.GetArrayLength() == 0) + return ToolResult.Ok("(empty array)"); + + // 모든 키 수집 + var allKeys = new List(); + foreach (var item in arr.EnumerateArray()) + { + if (item.ValueKind != JsonValueKind.Object) + return ToolResult.Fail("All array items must be objects for CSV conversion"); + foreach (var prop in item.EnumerateObject()) + if (!allKeys.Contains(prop.Name)) allKeys.Add(prop.Name); + } + + var sb = new System.Text.StringBuilder(); + sb.AppendLine(string.Join(",", allKeys.Select(k => $"\"{k}\""))); + foreach (var item in arr.EnumerateArray()) + { + var values = allKeys.Select(k => + { + if (!item.TryGetProperty(k, out var v)) return "\"\""; + return v.ValueKind == JsonValueKind.String + ? $"\"{v.GetString()?.Replace("\"", "\"\"") ?? ""}\"" + : v.GetRawText(); + }); + sb.AppendLine(string.Join(",", values)); + } + var result = sb.ToString(); + if (result.Length > 8000) result = result[..8000] + "\n... (truncated)"; + return ToolResult.Ok(result); + } + + private record PathSegment(string Key, int Index, bool IsIndex); + + private static List ParsePath(string path) + { + var segments = new List(); + foreach (var part in path.Split('.')) + { + var bracketIdx = part.IndexOf('['); + if (bracketIdx >= 0) + { + var key = part[..bracketIdx]; + if (!string.IsNullOrEmpty(key)) + segments.Add(new PathSegment(key, 0, false)); + var idxStr = part[(bracketIdx + 1)..].TrimEnd(']'); + if (int.TryParse(idxStr, out var idx)) + segments.Add(new PathSegment("", idx, true)); + } + else + { + segments.Add(new PathSegment(part, 0, false)); + } + } + return segments; + } +} diff --git a/src/AxCopilot/Services/Agent/LspTool.cs b/src/AxCopilot/Services/Agent/LspTool.cs new file mode 100644 index 0000000..6cfa897 --- /dev/null +++ b/src/AxCopilot/Services/Agent/LspTool.cs @@ -0,0 +1,200 @@ +using System.IO; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// LSP 기반 코드 인텔리전스 도구. +/// 정의 이동(goto_definition), 참조 검색(find_references), 심볼 목록(symbols) 3가지 액션을 제공합니다. +/// +public class LspTool : IAgentTool, IDisposable +{ + public string Name => "lsp_code_intel"; + + public string Description => + "코드 인텔리전스 도구. 정의 이동, 참조 검색, 심볼 목록을 제공합니다.\n" + + "- action=\"goto_definition\": 심볼의 정의 위치를 찾습니다 (파일, 라인, 컬럼)\n" + + "- action=\"find_references\": 심볼이 사용된 모든 위치를 찾습니다\n" + + "- action=\"symbols\": 파일 내 모든 심볼(클래스, 메서드, 필드 등)을 나열합니다\n" + + "file_path, line, character 파라미터가 필요합니다 (line과 character는 0-based)."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new ToolProperty + { + Type = "string", + Description = "수행할 작업: goto_definition | find_references | symbols", + Enum = new() { "goto_definition", "find_references", "symbols" } + }, + ["file_path"] = new ToolProperty + { + Type = "string", + Description = "대상 파일 경로 (절대 또는 작업 폴더 기준 상대 경로)" + }, + ["line"] = new ToolProperty + { + Type = "integer", + Description = "대상 라인 번호 (0-based). symbols 액션에서는 불필요." + }, + ["character"] = new ToolProperty + { + Type = "integer", + Description = "라인 내 문자 위치 (0-based). symbols 액션에서는 불필요." + }, + }, + Required = new() { "action", "file_path" } + }; + + // 언어별 LSP 클라이언트 캐시 + private readonly Dictionary _clients = new(); + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + // 설정 체크 + if (!(context.Llm?.Code?.EnableLsp ?? true)) + return ToolResult.Ok("LSP 코드 인텔리전스가 비활성 상태입니다. 설정 → AX Agent → 코드에서 활성화하세요."); + + var action = args.TryGetProperty("action", out var a) ? a.GetString() ?? "" : ""; + var filePath = args.TryGetProperty("file_path", out var f) ? f.GetString() ?? "" : ""; + var line = args.TryGetProperty("line", out var l) ? l.GetInt32() : 0; + var character = args.TryGetProperty("character", out var ch) ? ch.GetInt32() : 0; + + if (string.IsNullOrEmpty(filePath)) + return ToolResult.Fail("file_path가 필요합니다."); + + // 절대 경로 변환 + if (!Path.IsPathRooted(filePath) && !string.IsNullOrEmpty(context.WorkFolder)) + filePath = Path.Combine(context.WorkFolder, filePath); + + if (!File.Exists(filePath)) + return ToolResult.Fail($"파일을 찾을 수 없습니다: {filePath}"); + + // 언어 감지 + var language = DetectLanguage(filePath); + if (language == null) + return ToolResult.Fail($"지원하지 않는 파일 형식: {Path.GetExtension(filePath)}"); + + // LSP 클라이언트 시작 (캐시) + var client = await GetOrCreateClientAsync(language, context.WorkFolder, ct); + if (client == null || !client.IsConnected) + return ToolResult.Fail($"{language} 언어 서버를 시작할 수 없습니다. 해당 언어 서버가 설치되어 있는지 확인하세요."); + + try + { + return action switch + { + "goto_definition" => await GotoDefinitionAsync(client, filePath, line, character, ct), + "find_references" => await FindReferencesAsync(client, filePath, line, character, ct), + "symbols" => await GetSymbolsAsync(client, filePath, ct), + _ => ToolResult.Fail($"알 수 없는 액션: {action}. goto_definition | find_references | symbols 중 선택하세요.") + }; + } + catch (Exception ex) + { + return ToolResult.Fail($"LSP 오류: {ex.Message}"); + } + } + + private async Task GotoDefinitionAsync(LspClientService client, string filePath, int line, int character, CancellationToken ct) + { + var loc = await client.GotoDefinitionAsync(filePath, line, character, ct); + if (loc == null) + return ToolResult.Ok("정의를 찾을 수 없습니다 (해당 위치에 심볼이 없거나 외부 라이브러리일 수 있습니다)."); + + // 정의 위치의 코드를 읽어서 컨텍스트 제공 + var contextCode = ReadCodeContext(loc.FilePath, loc.Line, 3); + return ToolResult.Ok( + $"정의 위치: {loc}\n\n```\n{contextCode}\n```", + loc.FilePath); + } + + private async Task FindReferencesAsync(LspClientService client, string filePath, int line, int character, CancellationToken ct) + { + var locations = await client.FindReferencesAsync(filePath, line, character, ct); + if (locations.Count == 0) + return ToolResult.Ok("참조를 찾을 수 없습니다."); + + var sb = new System.Text.StringBuilder(); + sb.AppendLine($"총 {locations.Count}개 참조:"); + foreach (var loc in locations.Take(30)) + sb.AppendLine($" {loc}"); + if (locations.Count > 30) + sb.AppendLine($" ... 외 {locations.Count - 30}개"); + + return ToolResult.Ok(sb.ToString()); + } + + private async Task GetSymbolsAsync(LspClientService client, string filePath, CancellationToken ct) + { + var symbols = await client.GetDocumentSymbolsAsync(filePath, ct); + if (symbols.Count == 0) + return ToolResult.Ok("심볼을 찾을 수 없습니다."); + + var sb = new System.Text.StringBuilder(); + sb.AppendLine($"총 {symbols.Count}개 심볼:"); + foreach (var sym in symbols) + sb.AppendLine($" {sym}"); + + return ToolResult.Ok(sb.ToString()); + } + + private async Task GetOrCreateClientAsync(string language, string workFolder, CancellationToken ct) + { + if (_clients.TryGetValue(language, out var existing) && existing.IsConnected) + return existing; + + var client = new LspClientService(language); + var started = await client.StartAsync(workFolder, ct); + if (!started) + { + client.Dispose(); + return null; + } + + _clients[language] = client; + return client; + } + + private static string? DetectLanguage(string filePath) + { + var ext = Path.GetExtension(filePath).ToLowerInvariant(); + return ext switch + { + ".cs" => "csharp", + ".ts" or ".tsx" => "typescript", + ".js" or ".jsx" => "javascript", + ".py" => "python", + ".cpp" or ".cc" or ".cxx" or ".c" or ".h" or ".hpp" => "cpp", + ".java" => "java", + _ => null + }; + } + + public void Dispose() + { + foreach (var client in _clients.Values) + client.Dispose(); + _clients.Clear(); + } + + private static string ReadCodeContext(string filePath, int targetLine, int contextLines) + { + try + { + var lines = File.ReadAllLines(filePath); + var start = Math.Max(0, targetLine - contextLines); + var end = Math.Min(lines.Length - 1, targetLine + contextLines); + + var sb = new System.Text.StringBuilder(); + for (int i = start; i <= end; i++) + { + var marker = i == targetLine ? ">>>" : " "; + sb.AppendLine($"{marker} {i + 1,4}: {lines[i]}"); + } + return sb.ToString().TrimEnd(); + } + catch (Exception) { return "(코드를 읽을 수 없습니다)"; } + } +} diff --git a/src/AxCopilot/Services/Agent/MarkdownSkill.cs b/src/AxCopilot/Services/Agent/MarkdownSkill.cs new file mode 100644 index 0000000..f8b6bce --- /dev/null +++ b/src/AxCopilot/Services/Agent/MarkdownSkill.cs @@ -0,0 +1,69 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// Markdown (.md) 문서를 생성하는 내장 스킬. +/// LLM이 마크다운 내용을 전달하면 파일로 저장합니다. +/// +public class MarkdownSkill : IAgentTool +{ + public string Name => "markdown_create"; + public string Description => "Create a Markdown (.md) document file. Provide the content in Markdown format."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Output file path (.md). Relative to work folder." }, + ["content"] = new() { Type = "string", Description = "Markdown content to write" }, + ["title"] = new() { Type = "string", Description = "Optional document title. If provided, prepends '# title' at the top." }, + }, + Required = ["path", "content"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var content = args.GetProperty("content").GetString() ?? ""; + var title = args.TryGetProperty("title", out var t) ? t.GetString() : null; + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (context.ActiveTab == "Cowork") fullPath = AgentContext.EnsureTimestampedPath(fullPath); + if (!fullPath.EndsWith(".md", StringComparison.OrdinalIgnoreCase)) + fullPath += ".md"; + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + try + { + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + var sb = new StringBuilder(); + if (!string.IsNullOrEmpty(title)) + { + sb.AppendLine($"# {title}"); + sb.AppendLine(); + } + sb.Append(content); + + await File.WriteAllTextAsync(fullPath, sb.ToString(), Encoding.UTF8, ct); + + var lines = sb.ToString().Split('\n').Length; + return ToolResult.Ok( + $"Markdown 문서 저장 완료: {fullPath} ({lines} lines)", + fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"Markdown 저장 실패: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/Agent/MathTool.cs b/src/AxCopilot/Services/Agent/MathTool.cs new file mode 100644 index 0000000..f0a46ad --- /dev/null +++ b/src/AxCopilot/Services/Agent/MathTool.cs @@ -0,0 +1,66 @@ +using System.Data; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 수학 수식을 계산하는 도구. +public class MathTool : IAgentTool +{ + public string Name => "math_eval"; + public string Description => + "Evaluate a mathematical expression and return the result. " + + "Supports: +, -, *, /, %, parentheses, and common math operations. " + + "Use for calculations, unit conversions, and numeric analysis."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["expression"] = new() + { + Type = "string", + Description = "Mathematical expression to evaluate (e.g. '(100 * 1.08) / 3')", + }, + ["precision"] = new() + { + Type = "integer", + Description = "Decimal places for rounding (default: 6)", + }, + }, + Required = ["expression"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var expression = args.GetProperty("expression").GetString() ?? ""; + var precision = args.TryGetProperty("precision", out var p) ? p.GetInt32() : 6; + + if (string.IsNullOrWhiteSpace(expression)) + return Task.FromResult(ToolResult.Fail("수식이 비어 있습니다.")); + + try + { + // DataTable.Compute를 사용한 안전한 수식 평가 + var sanitized = expression + .Replace("^", " ") // XOR 방지 — ** 패턴은 아래에서 처리 + .Replace("Math.", "") + .Replace("System.", ""); + + // 기본 보안 검사: 알파벳 함수 호출 차단 + if (System.Text.RegularExpressions.Regex.IsMatch(sanitized, @"[a-zA-Z]{3,}")) + return Task.FromResult(ToolResult.Fail("함수 호출은 지원하지 않습니다. 기본 사칙연산만 가능합니다.")); + + var dt = new DataTable(); + var result = dt.Compute(sanitized, null); + var value = Convert.ToDouble(result); + var rounded = Math.Round(value, precision); + + return Task.FromResult(ToolResult.Ok( + $"Expression: {expression}\nResult: {rounded}")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"수식 평가 오류: {ex.Message}")); + } + } +} diff --git a/src/AxCopilot/Services/Agent/McpTool.cs b/src/AxCopilot/Services/Agent/McpTool.cs new file mode 100644 index 0000000..b7cc5d0 --- /dev/null +++ b/src/AxCopilot/Services/Agent/McpTool.cs @@ -0,0 +1,77 @@ +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// MCP 서버의 도구를 에이전트 도구로 래핑합니다. +/// 하나의 McpTool 인스턴스가 하나의 MCP 도구를 나타냅니다. +/// +public class McpTool : IAgentTool +{ + private readonly McpClientService _client; + private readonly Models.McpToolDefinition _def; + + public McpTool(McpClientService client, Models.McpToolDefinition def) + { + _client = client; + _def = def; + } + + public string Name => $"mcp_{_def.ServerName}_{_def.Name}"; + public string Description => $"[MCP:{_def.ServerName}] {_def.Description}"; + + public ToolParameterSchema Parameters + { + get + { + var schema = new ToolParameterSchema + { + Properties = new(), + Required = new(), + }; + foreach (var (name, param) in _def.Parameters) + { + schema.Properties[name] = new ToolProperty + { + Type = param.Type, + Description = param.Description, + }; + if (param.Required) schema.Required.Add(name); + } + return schema; + } + } + + public async Task ExecuteAsync( + JsonElement args, AgentContext context, CancellationToken ct = default) + { + try + { + if (!_client.IsConnected) + return ToolResult.Fail($"MCP 서버 '{_def.ServerName}'에 연결되어 있지 않습니다."); + + var arguments = new Dictionary(); + if (args.ValueKind == JsonValueKind.Object) + { + foreach (var prop in args.EnumerateObject()) + { + arguments[prop.Name] = prop.Value.ValueKind switch + { + JsonValueKind.String => prop.Value.GetString()!, + JsonValueKind.Number => prop.Value.GetDouble(), + JsonValueKind.True => true, + JsonValueKind.False => false, + _ => prop.Value.ToString(), + }; + } + } + + var result = await _client.CallToolAsync(_def.Name, arguments, ct); + return ToolResult.Ok(result); + } + catch (Exception ex) + { + return ToolResult.Fail($"MCP 도구 실행 실패: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/Agent/MemoryTool.cs b/src/AxCopilot/Services/Agent/MemoryTool.cs new file mode 100644 index 0000000..0da4db6 --- /dev/null +++ b/src/AxCopilot/Services/Agent/MemoryTool.cs @@ -0,0 +1,123 @@ +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 에이전트 메모리 관리 도구. +/// 프로젝트 규칙, 사용자 선호도, 학습 내용을 저장/검색/삭제합니다. +/// +public class MemoryTool : IAgentTool +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + public string Name => "memory"; + + public string Description => + "프로젝트 규칙, 사용자 선호도, 학습 내용을 저장하고 검색합니다.\n" + + "대화 간 지속되는 메모리로, 새 대화에서도 이전에 학습한 내용을 활용할 수 있습니다.\n" + + "- action=\"save\": 새 메모리 저장 (type, content 필수)\n" + + "- action=\"search\": 관련 메모리 검색 (query 필수)\n" + + "- action=\"list\": 현재 메모리 전체 목록\n" + + "- action=\"delete\": 메모리 삭제 (id 필수)\n" + + "type 종류: rule(프로젝트 규칙), preference(사용자 선호), fact(사실), correction(실수 교정)"; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() { Type = "string", Description = "save | search | list | delete" }, + ["type"] = new() { Type = "string", Description = "메모리 유형: rule | preference | fact | correction. save 시 필수." }, + ["content"] = new() { Type = "string", Description = "저장할 내용. save 시 필수." }, + ["query"] = new() { Type = "string", Description = "검색 쿼리. search 시 필수." }, + ["id"] = new() { Type = "string", Description = "메모리 ID. delete 시 필수." }, + }, + Required = ["action"] + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + // 설정 체크 + if (!(context.Llm?.EnableAgentMemory ?? true)) + return Task.FromResult(ToolResult.Ok("에이전트 메모리가 비활성 상태입니다. 설정에서 활성화하세요.")); + + var memoryService = CurrentApp?.MemoryService; + if (memoryService == null) + return Task.FromResult(ToolResult.Fail("메모리 서비스를 사용할 수 없습니다.")); + + if (!args.TryGetProperty("action", out var actionEl)) + return Task.FromResult(ToolResult.Fail("action이 필요합니다.")); + var action = actionEl.GetString() ?? ""; + + return Task.FromResult(action switch + { + "save" => ExecuteSave(args, memoryService, context), + "search" => ExecuteSearch(args, memoryService), + "list" => ExecuteList(memoryService), + "delete" => ExecuteDelete(args, memoryService), + _ => ToolResult.Fail($"알 수 없는 액션: {action}. save | search | list | delete 중 선택하세요."), + }); + } + + private static ToolResult ExecuteSave(JsonElement args, AgentMemoryService svc, AgentContext context) + { + var type = args.TryGetProperty("type", out var t) ? t.GetString() ?? "fact" : "fact"; + var content = args.TryGetProperty("content", out var c) ? c.GetString() ?? "" : ""; + + if (string.IsNullOrWhiteSpace(content)) + return ToolResult.Fail("content가 필요합니다."); + + var validTypes = new[] { "rule", "preference", "fact", "correction" }; + if (!validTypes.Contains(type)) + return ToolResult.Fail($"잘못된 type: {type}. rule | preference | fact | correction 중 선택하세요."); + + var workFolder = string.IsNullOrEmpty(context.WorkFolder) ? null : context.WorkFolder; + var entry = svc.Add(type, content, $"agent:{context.ActiveTab}", workFolder); + return ToolResult.Ok($"메모리 저장됨 [{entry.Type}] (ID: {entry.Id}): {entry.Content}"); + } + + private static ToolResult ExecuteSearch(JsonElement args, AgentMemoryService svc) + { + var query = args.TryGetProperty("query", out var q) ? q.GetString() ?? "" : ""; + if (string.IsNullOrWhiteSpace(query)) + return ToolResult.Fail("query가 필요합니다."); + + var results = svc.GetRelevant(query, 10); + if (results.Count == 0) + return ToolResult.Ok("관련 메모리가 없습니다."); + + var sb = new StringBuilder(); + sb.AppendLine($"관련 메모리 {results.Count}개:"); + foreach (var e in results) + sb.AppendLine($" [{e.Type}] {e.Content} (사용 {e.UseCount}회, ID: {e.Id})"); + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult ExecuteList(AgentMemoryService svc) + { + var all = svc.All; + if (all.Count == 0) + return ToolResult.Ok("저장된 메모리가 없습니다."); + + var sb = new StringBuilder(); + sb.AppendLine($"전체 메모리 {all.Count}개:"); + foreach (var group in all.GroupBy(e => e.Type)) + { + sb.AppendLine($"\n[{group.Key}]"); + foreach (var e in group.OrderByDescending(e => e.UseCount)) + sb.AppendLine($" • {e.Content} (사용 {e.UseCount}회, ID: {e.Id})"); + } + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult ExecuteDelete(JsonElement args, AgentMemoryService svc) + { + var id = args.TryGetProperty("id", out var i) ? i.GetString() ?? "" : ""; + if (string.IsNullOrWhiteSpace(id)) + return ToolResult.Fail("id가 필요합니다."); + + return svc.Remove(id) + ? ToolResult.Ok($"메모리 삭제됨 (ID: {id})") + : ToolResult.Fail($"해당 ID의 메모리를 찾을 수 없습니다: {id}"); + } +} diff --git a/src/AxCopilot/Services/Agent/MultiReadTool.cs b/src/AxCopilot/Services/Agent/MultiReadTool.cs new file mode 100644 index 0000000..a1c89a9 --- /dev/null +++ b/src/AxCopilot/Services/Agent/MultiReadTool.cs @@ -0,0 +1,94 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 여러 파일을 한 번에 읽어 결합 반환하는 도구. +public class MultiReadTool : IAgentTool +{ + public string Name => "multi_read"; + public string Description => + "Read multiple files in a single call (max 10). " + + "Returns concatenated contents with file headers. " + + "More efficient than calling file_read multiple times."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["paths"] = new() + { + Type = "array", + Description = "List of file paths to read (max 10)", + Items = new() { Type = "string", Description = "File path" }, + }, + ["max_lines"] = new() + { + Type = "integer", + Description = "Max lines per file (default 200)", + }, + }, + Required = ["paths"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var maxLines = args.TryGetProperty("max_lines", out var ml) ? ml.GetInt32() : 200; + if (maxLines <= 0) maxLines = 200; + + if (!args.TryGetProperty("paths", out var pathsEl) || pathsEl.ValueKind != JsonValueKind.Array) + return Task.FromResult(ToolResult.Fail("'paths'는 문자열 배열이어야 합니다.")); + + var paths = new List(); + foreach (var p in pathsEl.EnumerateArray()) + { + var s = p.GetString(); + if (!string.IsNullOrEmpty(s)) paths.Add(s); + } + + if (paths.Count == 0) + return Task.FromResult(ToolResult.Fail("읽을 파일이 없습니다.")); + if (paths.Count > 10) + return Task.FromResult(ToolResult.Fail("최대 10개 파일만 지원합니다.")); + + var sb = new StringBuilder(); + var readCount = 0; + + foreach (var rawPath in paths) + { + var path = Path.IsPathRooted(rawPath) ? rawPath : Path.Combine(context.WorkFolder, rawPath); + + sb.AppendLine($"═══ {Path.GetFileName(path)} ═══"); + sb.AppendLine($"Path: {path}"); + + if (!context.IsPathAllowed(path)) + { + sb.AppendLine("[접근 차단됨]"); + } + else if (!File.Exists(path)) + { + sb.AppendLine("[파일 없음]"); + } + else + { + try + { + var lines = File.ReadLines(path).Take(maxLines).ToList(); + for (var i = 0; i < lines.Count; i++) + sb.AppendLine($"{i + 1}\t{lines[i]}"); + if (lines.Count >= maxLines) + sb.AppendLine($"... (이후 생략, max_lines={maxLines})"); + readCount++; + } + catch (Exception ex) + { + sb.AppendLine($"[읽기 오류: {ex.Message}]"); + } + } + sb.AppendLine(); + } + + return Task.FromResult(ToolResult.Ok($"{readCount}/{paths.Count}개 파일 읽기 완료.\n\n{sb}")); + } +} diff --git a/src/AxCopilot/Services/Agent/NotifyTool.cs b/src/AxCopilot/Services/Agent/NotifyTool.cs new file mode 100644 index 0000000..e0d1440 --- /dev/null +++ b/src/AxCopilot/Services/Agent/NotifyTool.cs @@ -0,0 +1,153 @@ +using System.Text.Json; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Threading; +using AxCopilot.Views; + +namespace AxCopilot.Services.Agent; + +/// +/// Windows 알림 전송 도구. +/// 장시간 작업 완료 알림, 사용자 확인 요청 등을 트레이 또는 앱 내 토스트로 표시합니다. +/// +public class NotifyTool : IAgentTool +{ + public string Name => "notify_tool"; + public string Description => + "Send a notification to the user. Use this when: " + + "a long-running task completes, an important result needs attention, " + + "or you want to inform the user of something. " + + "The notification appears as an in-app toast message."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["title"] = new() + { + Type = "string", + Description = "Notification title (short, 1-2 words)", + }, + ["message"] = new() + { + Type = "string", + Description = "Notification message (detail text)", + }, + ["level"] = new() + { + Type = "string", + Description = "Notification level: info (default), success, warning, error", + Enum = ["info", "success", "warning", "error"], + }, + }, + Required = ["title", "message"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var title = args.GetProperty("title").GetString() ?? "알림"; + var message = args.GetProperty("message").GetString() ?? ""; + var level = args.TryGetProperty("level", out var lv) ? lv.GetString() ?? "info" : "info"; + + try + { + Application.Current.Dispatcher.Invoke(() => + { + ShowToast(title, message, level); + }); + return Task.FromResult(ToolResult.Ok($"✓ Notification sent: [{level}] {title}")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"알림 전송 실패: {ex.Message}")); + } + } + + private static void ShowToast(string title, string message, string level) + { + var mainWindow = Application.Current.MainWindow; + if (mainWindow == null) return; + + var (iconChar, iconColor) = level switch + { + "success" => ("\uE73E", "#34D399"), + "warning" => ("\uE7BA", "#F59E0B"), + "error" => ("\uEA39", "#F87171"), + _ => ("\uE946", "#4B5EFC"), // info + }; + + var toast = new Border + { + Background = new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)), + CornerRadius = new CornerRadius(10), + Padding = new Thickness(16, 12, 16, 12), + Margin = new Thickness(0, 0, 20, 20), + MinWidth = 280, + MaxWidth = 400, + HorizontalAlignment = HorizontalAlignment.Right, + VerticalAlignment = VerticalAlignment.Bottom, + Effect = new System.Windows.Media.Effects.DropShadowEffect + { + BlurRadius = 16, + ShadowDepth = 4, + Opacity = 0.4, + Color = Colors.Black, + }, + }; + + var content = new StackPanel(); + + // 타이틀 행 + var titleRow = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 0, 0, 4) }; + titleRow.Children.Add(new TextBlock + { + Text = iconChar, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, + Foreground = ThemeResourceHelper.HexBrush(iconColor), + Margin = new Thickness(0, 0, 8, 0), + VerticalAlignment = VerticalAlignment.Center, + }); + titleRow.Children.Add(new TextBlock + { + Text = title, + FontSize = 13, + FontWeight = FontWeights.SemiBold, + Foreground = Brushes.White, + VerticalAlignment = VerticalAlignment.Center, + }); + content.Children.Add(titleRow); + + // 메시지 + if (!string.IsNullOrEmpty(message)) + { + content.Children.Add(new TextBlock + { + Text = message.Length > 200 ? message[..200] + "..." : message, + FontSize = 12, + Foreground = new SolidColorBrush(Color.FromRgb(0xAA, 0xAA, 0xCC)), + TextWrapping = TextWrapping.Wrap, + }); + } + + toast.Child = content; + + // 기존 Grid/Panel에 추가 + if (mainWindow.Content is Grid grid) + { + Grid.SetRowSpan(toast, grid.RowDefinitions.Count > 0 ? grid.RowDefinitions.Count : 1); + Grid.SetColumnSpan(toast, grid.ColumnDefinitions.Count > 0 ? grid.ColumnDefinitions.Count : 1); + grid.Children.Add(toast); + + // 5초 후 자동 제거 (페이드 아웃) + var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) }; + timer.Tick += (_, _) => + { + timer.Stop(); + grid.Children.Remove(toast); + }; + timer.Start(); + } + } +} diff --git a/src/AxCopilot/Services/Agent/OpenExternalTool.cs b/src/AxCopilot/Services/Agent/OpenExternalTool.cs new file mode 100644 index 0000000..cc9758c --- /dev/null +++ b/src/AxCopilot/Services/Agent/OpenExternalTool.cs @@ -0,0 +1,70 @@ +using System.Diagnostics; +using System.IO; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// 파일/URL을 시스템 기본 앱으로 여는 도구. +public class OpenExternalTool : IAgentTool +{ + public string Name => "open_external"; + public string Description => + "Open a file with its default application or open a URL in the default browser. " + + "Also supports opening a folder in File Explorer. " + + "Use after creating documents, reports, or charts for the user to view."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() + { + Type = "string", + Description = "File path, directory path, or URL to open", + }, + }, + Required = ["path"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var rawPath = args.GetProperty("path").GetString() ?? ""; + if (string.IsNullOrWhiteSpace(rawPath)) + return Task.FromResult(ToolResult.Fail("경로가 비어 있습니다.")); + + try + { + // URL인 경우 + if (rawPath.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || + rawPath.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) + { + Process.Start(new ProcessStartInfo(rawPath) { UseShellExecute = true }); + return Task.FromResult(ToolResult.Ok($"URL 열기: {rawPath}")); + } + + // 파일/폴더 경로 + var path = Path.IsPathRooted(rawPath) ? rawPath : Path.Combine(context.WorkFolder, rawPath); + + if (!context.IsPathAllowed(path)) + return Task.FromResult(ToolResult.Fail($"경로 접근 차단: {path}")); + + if (File.Exists(path)) + { + Process.Start(new ProcessStartInfo(path) { UseShellExecute = true }); + return Task.FromResult(ToolResult.Ok($"파일 열기: {path}", filePath: path)); + } + + if (Directory.Exists(path)) + { + Process.Start(new ProcessStartInfo("explorer.exe", path)); + return Task.FromResult(ToolResult.Ok($"폴더 열기: {path}", filePath: path)); + } + + return Task.FromResult(ToolResult.Fail($"경로를 찾을 수 없습니다: {path}")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"열기 오류: {ex.Message}")); + } + } +} diff --git a/src/AxCopilot/Services/Agent/PathBasedSkillActivator.cs b/src/AxCopilot/Services/Agent/PathBasedSkillActivator.cs new file mode 100644 index 0000000..62b00fc --- /dev/null +++ b/src/AxCopilot/Services/Agent/PathBasedSkillActivator.cs @@ -0,0 +1,59 @@ +using System.IO; +using System.Text; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 17-D: 파일 경로에 따라 적용할 스킬을 자동 선택. +/// SKILL.md의 paths: 프론트매터 패턴 지원. +/// +public class PathBasedSkillActivator +{ + /// 현재 작업 중인 파일 경로 기반으로 활성 스킬 목록 반환. + public IReadOnlyList GetActiveSkillsForFile( + IReadOnlyList allSkills, string filePath) + { + if (string.IsNullOrEmpty(filePath)) return Array.Empty(); + + return allSkills + .Where(s => s.GetPathPatterns().Count > 0 && + s.GetPathPatterns().Any(p => GlobMatcher.IsMatch(filePath, p))) + .ToList(); + } + + /// 활성 스킬의 컨텍스트를 시스템 프롬프트 주입용 텍스트로 빌드. + public string BuildSkillContextInjection(IReadOnlyList skills) + { + if (skills.Count == 0) return string.Empty; + var sb = new StringBuilder(); + sb.AppendLine("## 현재 파일에 자동 적용된 스킬"); + foreach (var skill in skills) + { + sb.AppendLine($"### {skill.Label}"); + sb.AppendLine(skill.SystemPrompt); + sb.AppendLine(); + } + return sb.ToString(); + } +} + +/// glob 패턴 매처. ** 와일드카드 및 *.ext 패턴 지원. +public static class GlobMatcher +{ + public static bool IsMatch(string path, string pattern) + { + if (string.IsNullOrEmpty(pattern) || pattern == "*") return true; + path = path.Replace('\\', '/'); + pattern = pattern.Replace('\\', '/'); + + // ** → 임의의 경로 세그먼트 + var regexPattern = "^" + Regex.Escape(pattern) + .Replace("\\*\\*/", "(.+/)?") + .Replace("\\*\\*", ".*") + .Replace("\\*", "[^/]*") + .Replace("\\?", "[^/]") + "$"; + + return Regex.IsMatch(path, regexPattern, RegexOptions.IgnoreCase); + } +} diff --git a/src/AxCopilot/Services/Agent/PathScopedRuleInjector.cs b/src/AxCopilot/Services/Agent/PathScopedRuleInjector.cs new file mode 100644 index 0000000..2756742 --- /dev/null +++ b/src/AxCopilot/Services/Agent/PathScopedRuleInjector.cs @@ -0,0 +1,164 @@ +using System.IO; +using System.Text; + +namespace AxCopilot.Services.Agent; + +/// 규칙 파일의 프론트매터. +public record RuleFrontmatter +{ + public string Name { get; init; } = ""; + public IReadOnlyList Paths { get; init; } = Array.Empty(); + // 빈 배열 → 항상 적용 + // ["src/**/*.py"] → Python 파일 작업 시만 적용 +} + +/// 로드된 규칙 파일. +public record RuleFile +{ + public string FilePath { get; init; } = ""; + public RuleFrontmatter Frontmatter { get; init; } = new(); + public string Body { get; init; } = ""; +} + +/// +/// Phase 17-E: .ax/rules/*.md의 paths: 프론트매터 기반 경로 범위 규칙 주입. +/// 현재 작업 파일에 맞는 규칙만 시스템 프롬프트에 주입. +/// +public class PathScopedRuleInjector +{ + private readonly string _rulesDir; + private List? _cachedRules; + + public PathScopedRuleInjector(string projectRoot) + { + _rulesDir = Path.Combine(projectRoot, ".ax", "rules"); + } + + /// 규칙 파일 로드/캐시 갱신. + public async Task LoadRulesAsync() + { + if (!Directory.Exists(_rulesDir)) + { + _cachedRules = new List(); + return; + } + + var rules = new List(); + foreach (var file in Directory.GetFiles(_rulesDir, "*.md")) + { + try + { + var rule = await ParseRuleFileAsync(file); + if (rule != null) rules.Add(rule); + } + catch (Exception) { } + } + _cachedRules = rules; + } + + /// 현재 파일 경로에 맞는 규칙 반환. + public IReadOnlyList GetActiveRulesForFile(string currentFilePath) + { + if (_cachedRules == null) return new List(); + var normalized = currentFilePath.Replace('\\', '/'); + return _cachedRules.Where(r => + r.Frontmatter.Paths.Count == 0 || // paths 없으면 항상 적용 + r.Frontmatter.Paths.Any(p => GlobMatcher.IsMatch(normalized, p))).ToList(); + } + + /// 모든 규칙을 로드 (경로 필터 없이 전체 적용 — 비경로 규칙용). + public IReadOnlyList GetGlobalRules() + => (_cachedRules ?? new List()) + .Where(r => r.Frontmatter.Paths.Count == 0).ToList(); + + /// 시스템 프롬프트 주입용 텍스트 빌드. + public string BuildInjection(IReadOnlyList rules) + { + if (rules.Count == 0) return string.Empty; + var sb = new StringBuilder("## 프로젝트 규칙\n\n"); + foreach (var rule in rules) + { + if (!string.IsNullOrEmpty(rule.Frontmatter.Name)) + sb.AppendLine($"### {rule.Frontmatter.Name}"); + sb.AppendLine(rule.Body); + sb.AppendLine(); + } + return sb.ToString(); + } + + /// 규칙 파일의 크기 경고 여부 확인. + public IReadOnlyList GetOversizedRuleFiles() + => (_cachedRules ?? new List()) + .Where(r => r.Body.Length > AxMdIncludeResolver.OversizeWarningChars) + .Select(r => Path.GetFileName(r.FilePath)) + .ToList(); + + private static async Task ParseRuleFileAsync(string filePath) + { + var content = await File.ReadAllTextAsync(filePath, Encoding.UTF8); + + string frontmatterText = ""; + string body = content; + + if (content.TrimStart().StartsWith("---")) + { + var first = content.IndexOf("---", StringComparison.Ordinal); + var second = content.IndexOf("---", first + 3, StringComparison.Ordinal); + if (second > 0) + { + frontmatterText = content[(first + 3)..second].Trim(); + body = content[(second + 3)..].Trim(); + } + } + + var frontmatter = ParseFrontmatter(frontmatterText); + return new RuleFile + { + FilePath = filePath, + Frontmatter = frontmatter, + Body = body + }; + } + + private static RuleFrontmatter ParseFrontmatter(string text) + { + var name = ""; + var paths = new List(); + bool inPaths = false; + + foreach (var line in text.Split('\n')) + { + var trimmed = line.TrimEnd('\r'); + var ci = trimmed.IndexOf(':'); + + if (inPaths) + { + if (trimmed.TrimStart().StartsWith("-")) + { + var pat = trimmed.TrimStart().TrimStart('-').Trim().Trim('"', '\''); + if (!string.IsNullOrEmpty(pat)) paths.Add(pat); + continue; + } + else if (!string.IsNullOrWhiteSpace(trimmed) && ci > 0) + { + inPaths = false; + } + } + + if (ci <= 0) continue; + var key = trimmed[..ci].Trim().ToLowerInvariant(); + var value = trimmed[(ci + 1)..].Trim().Trim('"', '\''); + + switch (key) + { + case "name": name = value; break; + case "paths": + if (!string.IsNullOrEmpty(value)) paths.Add(value); + else inPaths = true; + break; + } + } + + return new RuleFrontmatter { Name = name, Paths = paths }; + } +} diff --git a/src/AxCopilot/Services/Agent/PermissionSystem.cs b/src/AxCopilot/Services/Agent/PermissionSystem.cs new file mode 100644 index 0000000..11fc0b1 --- /dev/null +++ b/src/AxCopilot/Services/Agent/PermissionSystem.cs @@ -0,0 +1,223 @@ +using System.Text.Json.Serialization; + +namespace AxCopilot.Services.Agent; + +/// Phase 17-F: 권한 모드. +public enum PermissionMode +{ + Default, // 잠재적으로 위험한 작업에 확인 요청 (기존 Ask 모드) + AcceptEdits, // 파일 편집 자동승인, bash/process 확인 유지 (신규) + Plan, // 읽기 전용, 쓰기 차단 (기존) + BypassPermissions, // 모든 확인 건너뜀 (기존 Auto 모드, 자동화 전용) +} + +/// 권한 동작. +public enum PermissionBehavior { Allow, Deny, Ask } + +/// 권한 규칙 하나. 도구명 + 입력 패턴 기반 자동 허용/차단. +public class PermissionRule +{ + /// 도구 이름. "process", "file_edit", "mcp__server__tool" 등. + [JsonPropertyName("tool")] + public string ToolName { get; set; } = ""; + + /// 도구 입력 패턴. null이면 모든 입력에 매칭. "git *", "rm -rf *" 등. + [JsonPropertyName("pattern")] + public string? Pattern { get; set; } + + /// 동작: Allow | Deny | Ask + [JsonPropertyName("behavior")] + public PermissionBehavior Behavior { get; set; } = PermissionBehavior.Allow; +} + +/// 권한 결정. +public enum PermissionDecision { Allow, Deny, Ask } + +// ── Chain of Responsibility 패턴 ────────────────────────────────────────── + +/// 권한 처리기 추상 기반 클래스. +public abstract class PermissionHandler +{ + protected PermissionHandler? _next; + + public PermissionHandler SetNext(PermissionHandler next) + { + _next = next; + return next; + } + + public abstract PermissionDecision? Handle(string toolName, string input); +} + +/// Deny 규칙 핸들러. +public class DenyRuleHandler : PermissionHandler +{ + private readonly IReadOnlyList _rules; + + public DenyRuleHandler(IReadOnlyList rules) + => _rules = rules; + + public override PermissionDecision? Handle(string toolName, string input) + { + if (_rules.Any(r => r.Behavior == PermissionBehavior.Deny && Matches(r, toolName, input))) + return PermissionDecision.Deny; + return _next?.Handle(toolName, input); + } + + private static bool Matches(PermissionRule rule, string toolName, string input) + { + if (!toolName.Equals(rule.ToolName, StringComparison.OrdinalIgnoreCase) && + !toolName.StartsWith(rule.ToolName, StringComparison.OrdinalIgnoreCase)) + return false; + if (rule.Pattern == null) return true; + return GlobMatcher.IsMatch(input, rule.Pattern); + } +} + +/// Allow 규칙 핸들러. +public class AllowRuleHandler : PermissionHandler +{ + private readonly IReadOnlyList _rules; + + public AllowRuleHandler(IReadOnlyList rules) + => _rules = rules; + + public override PermissionDecision? Handle(string toolName, string input) + { + if (_rules.Any(r => r.Behavior == PermissionBehavior.Allow && Matches(r, toolName, input))) + return PermissionDecision.Allow; + return _next?.Handle(toolName, input); + } + + private static bool Matches(PermissionRule rule, string toolName, string input) + { + if (!toolName.Equals(rule.ToolName, StringComparison.OrdinalIgnoreCase) && + !toolName.StartsWith(rule.ToolName, StringComparison.OrdinalIgnoreCase)) + return false; + if (rule.Pattern == null) return true; + return GlobMatcher.IsMatch(input, rule.Pattern); + } +} + +/// AcceptEdits 모드 핸들러: 파일 편집 도구 자동 승인. +public class AcceptEditsHandler : PermissionHandler +{ + private readonly PermissionMode _mode; + + private static readonly HashSet _editTools = new(StringComparer.OrdinalIgnoreCase) + { + "file_edit", "file_write", "script_create", + "docx_create", "html_create", "xlsx_create", "pptx_create", "csv_create", + }; + + public AcceptEditsHandler(PermissionMode mode) => _mode = mode; + + public override PermissionDecision? Handle(string toolName, string input) + { + if (_mode == PermissionMode.AcceptEdits && _editTools.Contains(toolName)) + return PermissionDecision.Allow; + return _next?.Handle(toolName, input); + } +} + +/// Plan 모드 핸들러: 쓰기 작업 차단. +public class PlanModeHandler : PermissionHandler +{ + private readonly PermissionMode _mode; + + private static readonly HashSet _writeTools = new(StringComparer.OrdinalIgnoreCase) + { + "file_edit", "file_write", "file_delete", "script_create", + "process", "bash", "build_run", + "docx_create", "html_create", "xlsx_create", "pptx_create", + }; + + public PlanModeHandler(PermissionMode mode) => _mode = mode; + + public override PermissionDecision? Handle(string toolName, string input) + { + if (_mode == PermissionMode.Plan && _writeTools.Contains(toolName)) + return PermissionDecision.Deny; + return _next?.Handle(toolName, input); + } +} + +/// BypassPermissions 모드 핸들러: 모두 허용. +public class BypassHandler : PermissionHandler +{ + private readonly PermissionMode _mode; + public BypassHandler(PermissionMode mode) => _mode = mode; + + public override PermissionDecision? Handle(string toolName, string input) + { + if (_mode == PermissionMode.BypassPermissions) + return PermissionDecision.Allow; + return _next?.Handle(toolName, input); + } +} + +/// +/// 권한 결정 서비스. +/// Chain: Deny규칙 → Allow규칙 → AcceptEdits/Plan/Bypass모드 → 기본(Ask) +/// +public class PermissionDecisionService +{ + private readonly PermissionHandler _chain; + private readonly PermissionMode _mode; + + public PermissionDecisionService( + PermissionMode mode, + IReadOnlyList allowRules, + IReadOnlyList denyRules) + { + _mode = mode; + + var denyHandler = new DenyRuleHandler(denyRules); + var allowHandler = new AllowRuleHandler(allowRules); + var acceptEditsHandler = new AcceptEditsHandler(mode); + var planHandler = new PlanModeHandler(mode); + var bypassHandler = new BypassHandler(mode); + + // Chain 조립 + denyHandler + .SetNext(allowHandler) + .SetNext(acceptEditsHandler) + .SetNext(planHandler) + .SetNext(bypassHandler); + + _chain = denyHandler; + } + + public PermissionDecision Decide(string toolName, string input) + { + // Phase 19-B-EXT: Bash/process 복합 명령은 서브커맨드별 개별 검사 + if (IsBashTool(toolName) && !string.IsNullOrWhiteSpace(input)) + { + // 위험 패턴 즉시 차단 + if (CompoundCommandParser.IsDangerousCommand(input)) + return PermissionDecision.Deny; + + return CompoundCommandParser.EvaluateCompound( + input, + sub => _chain.Handle(toolName, sub) ?? PermissionDecision.Ask); + } + + return _chain.Handle(toolName, input) ?? PermissionDecision.Ask; + } + + private static bool IsBashTool(string toolName) + => toolName is "process" or "bash" or "build_run"; + + /// MCP 도구 허용 여부 확인. mcp__server 및 mcp__server__tool 패턴 처리. + public bool IsMcpToolAllowed(string serverName, string toolName) + { + var fullName = $"mcp__{serverName}__{toolName}"; + var serverPattern = $"mcp__{serverName}"; + + if (Decide(fullName, string.Empty) == PermissionDecision.Deny) return false; + if (Decide(serverPattern, string.Empty) == PermissionDecision.Deny) return false; + return true; + } + + public PermissionMode Mode => _mode; +} diff --git a/src/AxCopilot/Services/Agent/PlaybookTool.cs b/src/AxCopilot/Services/Agent/PlaybookTool.cs new file mode 100644 index 0000000..29784a4 --- /dev/null +++ b/src/AxCopilot/Services/Agent/PlaybookTool.cs @@ -0,0 +1,324 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 성공적인 실행 흐름을 재사용 가능한 플레이북으로 저장/관리하는 도구. +/// .ax/playbooks/ 에 JSON 파일로 저장됩니다. +/// +public class PlaybookTool : IAgentTool +{ + public string Name => "playbook"; + + public string Description => + "Save, list, describe, or delete execution playbooks. " + + "A playbook captures a successful task workflow for reuse.\n" + + "- action=\"save\": Save a new playbook (name, description, steps required)\n" + + "- action=\"list\": List all saved playbooks\n" + + "- action=\"describe\": Show full playbook details (id required)\n" + + "- action=\"delete\": Delete a playbook (id required)"; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "save | list | describe | delete", + Enum = ["save", "list", "describe", "delete"], + }, + ["name"] = new() + { + Type = "string", + Description = "Playbook name (for save)", + }, + ["description"] = new() + { + Type = "string", + Description = "What this playbook does (for save)", + }, + ["steps"] = new() + { + Type = "array", + Description = "List of step descriptions (for save)", + Items = new() { Type = "string", Description = "Step description" }, + }, + ["tools_used"] = new() + { + Type = "array", + Description = "List of tool names used in this workflow (for save)", + Items = new() { Type = "string", Description = "Tool name" }, + }, + ["id"] = new() + { + Type = "integer", + Description = "Playbook ID (for describe/delete)", + }, + }, + Required = ["action"], + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + if (!args.TryGetProperty("action", out var actionEl)) + return ToolResult.Fail("action이 필요합니다."); + var action = actionEl.GetString() ?? ""; + + if (string.IsNullOrEmpty(context.WorkFolder)) + return ToolResult.Fail("작업 폴더가 설정되지 않았습니다."); + + var playbookDir = Path.Combine(context.WorkFolder, ".ax", "playbooks"); + + return action switch + { + "save" => await SavePlaybook(args, playbookDir, ct), + "list" => ListPlaybooks(playbookDir), + "describe" => await DescribePlaybook(args, playbookDir, ct), + "delete" => DeletePlaybook(args, playbookDir), + _ => ToolResult.Fail($"알 수 없는 액션: {action}. save | list | describe | delete 중 선택하세요."), + }; + } + + private static async Task SavePlaybook(JsonElement args, string playbookDir, CancellationToken ct) + { + var name = args.TryGetProperty("name", out var n) ? n.GetString() ?? "" : ""; + var description = args.TryGetProperty("description", out var d) ? d.GetString() ?? "" : ""; + + if (string.IsNullOrWhiteSpace(name)) + return ToolResult.Fail("플레이북 name이 필요합니다."); + if (string.IsNullOrWhiteSpace(description)) + return ToolResult.Fail("플레이북 description이 필요합니다."); + + // steps 파싱 + var steps = new List(); + if (args.TryGetProperty("steps", out var stepsEl) && stepsEl.ValueKind == JsonValueKind.Array) + { + foreach (var step in stepsEl.EnumerateArray()) + { + var s = step.GetString(); + if (!string.IsNullOrWhiteSpace(s)) + steps.Add(s); + } + } + + if (steps.Count == 0) + return ToolResult.Fail("최소 1개 이상의 step이 필요합니다."); + + // tools_used 파싱 + var toolsUsed = new List(); + if (args.TryGetProperty("tools_used", out var toolsEl) && toolsEl.ValueKind == JsonValueKind.Array) + { + foreach (var tool in toolsEl.EnumerateArray()) + { + var t = tool.GetString(); + if (!string.IsNullOrWhiteSpace(t)) + toolsUsed.Add(t); + } + } + + try + { + Directory.CreateDirectory(playbookDir); + + // 다음 ID 결정 + var nextId = GetNextId(playbookDir); + + // 파일명에서 비안전 문자 제거 + var safeName = string.Join("_", name.Split(Path.GetInvalidFileNameChars())); + var fileName = $"{nextId}_{safeName}.json"; + + var playbook = new PlaybookData + { + Id = nextId, + Name = name, + Description = description, + Steps = steps, + ToolsUsed = toolsUsed, + CreatedAt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + }; + + var json = JsonSerializer.Serialize(playbook, new JsonSerializerOptions + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }); + + var filePath = Path.Combine(playbookDir, fileName); + await File.WriteAllTextAsync(filePath, json, ct); + + return ToolResult.Ok($"플레이북 저장 완료: [{nextId}] {name}\n단계 수: {steps.Count}, 사용 도구: {toolsUsed.Count}개"); + } + catch (Exception ex) + { + return ToolResult.Fail($"플레이북 저장 오류: {ex.Message}"); + } + } + + private static ToolResult ListPlaybooks(string playbookDir) + { + if (!Directory.Exists(playbookDir)) + return ToolResult.Ok("저장된 플레이북이 없습니다."); + + var files = Directory.GetFiles(playbookDir, "*.json") + .OrderBy(f => f) + .ToList(); + + if (files.Count == 0) + return ToolResult.Ok("저장된 플레이북이 없습니다."); + + var sb = new StringBuilder(); + sb.AppendLine($"플레이북 {files.Count}개:"); + + foreach (var file in files) + { + try + { + var json = File.ReadAllText(file); + var pb = JsonSerializer.Deserialize(json); + if (pb != null) + sb.AppendLine($" [{pb.Id}] {pb.Name} — {pb.Description} ({pb.Steps.Count}단계, {pb.CreatedAt})"); + } + catch (Exception) + { + sb.AppendLine($" [?] {Path.GetFileName(file)} — 파싱 오류"); + } + } + + return ToolResult.Ok(sb.ToString()); + } + + private static async Task DescribePlaybook(JsonElement args, string playbookDir, CancellationToken ct) + { + if (!args.TryGetProperty("id", out var idEl)) + return ToolResult.Fail("플레이북 id가 필요합니다."); + + var id = idEl.ValueKind == JsonValueKind.Number ? idEl.GetInt32() : int.TryParse(idEl.GetString(), out var parsed) ? parsed : -1; + var playbook = await FindPlaybookById(playbookDir, id, ct); + + if (playbook == null) + return ToolResult.Fail($"ID {id}의 플레이북을 찾을 수 없습니다."); + + var sb = new StringBuilder(); + sb.AppendLine($"플레이북: {playbook.Name} (ID: {playbook.Id})"); + sb.AppendLine($"설명: {playbook.Description}"); + sb.AppendLine($"생성일: {playbook.CreatedAt}"); + sb.AppendLine(); + + sb.AppendLine("단계:"); + for (var i = 0; i < playbook.Steps.Count; i++) + sb.AppendLine($" {i + 1}. {playbook.Steps[i]}"); + + if (playbook.ToolsUsed.Count > 0) + { + sb.AppendLine(); + sb.AppendLine($"사용 도구: {string.Join(", ", playbook.ToolsUsed)}"); + } + + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult DeletePlaybook(JsonElement args, string playbookDir) + { + if (!args.TryGetProperty("id", out var idEl)) + return ToolResult.Fail("삭제할 플레이북 id가 필요합니다."); + + var id = idEl.ValueKind == JsonValueKind.Number ? idEl.GetInt32() : int.TryParse(idEl.GetString(), out var parsed) ? parsed : -1; + + if (!Directory.Exists(playbookDir)) + return ToolResult.Fail("저장된 플레이북이 없습니다."); + + // ID에 해당하는 파일 찾기 + var files = Directory.GetFiles(playbookDir, $"{id}_*.json"); + if (files.Length == 0) + { + // 파일 내부 ID로 검색 + foreach (var file in Directory.GetFiles(playbookDir, "*.json")) + { + try + { + var json = File.ReadAllText(file); + var pb = JsonSerializer.Deserialize(json); + if (pb?.Id == id) + { + var name = pb.Name; + File.Delete(file); + return ToolResult.Ok($"플레이북 삭제됨: [{id}] {name}"); + } + } + catch (Exception) { /* 무시 */ } + } + return ToolResult.Fail($"ID {id}의 플레이북을 찾을 수 없습니다."); + } + + try + { + var fileName = Path.GetFileNameWithoutExtension(files[0]); + File.Delete(files[0]); + return ToolResult.Ok($"플레이북 삭제됨: {fileName}"); + } + catch (Exception ex) + { + return ToolResult.Fail($"플레이북 삭제 오류: {ex.Message}"); + } + } + + #region Helpers + + private static int GetNextId(string playbookDir) + { + if (!Directory.Exists(playbookDir)) + return 1; + + var maxId = 0; + foreach (var file in Directory.GetFiles(playbookDir, "*.json")) + { + try + { + var json = File.ReadAllText(file); + var pb = JsonSerializer.Deserialize(json); + if (pb != null && pb.Id > maxId) + maxId = pb.Id; + } + catch (Exception) { /* 무시 */ } + } + return maxId + 1; + } + + private static async Task FindPlaybookById(string playbookDir, int id, CancellationToken ct) + { + if (!Directory.Exists(playbookDir)) + return null; + + foreach (var file in Directory.GetFiles(playbookDir, "*.json")) + { + try + { + var json = await File.ReadAllTextAsync(file, ct); + var pb = JsonSerializer.Deserialize(json); + if (pb?.Id == id) + return pb; + } + catch (Exception) { /* 무시 */ } + } + return null; + } + + #endregion + + #region Models + + private class PlaybookData + { + public int Id { get; set; } + public string Name { get; set; } = ""; + public string Description { get; set; } = ""; + public List Steps { get; set; } = []; + public List ToolsUsed { get; set; } = []; + public string CreatedAt { get; set; } = ""; + } + + #endregion +} diff --git a/src/AxCopilot/Services/Agent/PluginInstallService.cs b/src/AxCopilot/Services/Agent/PluginInstallService.cs new file mode 100644 index 0000000..065c39f --- /dev/null +++ b/src/AxCopilot/Services/Agent/PluginInstallService.cs @@ -0,0 +1,211 @@ +using System.IO; +using System.IO.Compression; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace AxCopilot.Services.Agent; + +/// 플러그인 매니페스트 (plugin.json 파일). +public record PluginManifest +{ + [JsonPropertyName("id")] + public string Id { get; init; } = ""; + + [JsonPropertyName("name")] + public string Name { get; init; } = ""; + + [JsonPropertyName("version")] + public string Version { get; init; } = "1.0.0"; + + [JsonPropertyName("description")] + public string Description { get; init; } = ""; + + [JsonPropertyName("author")] + public string Author { get; init; } = ""; + + [JsonPropertyName("type")] + public string Type { get; init; } = "skill"; // skill | tool | theme + + [JsonPropertyName("entryPoint")] + public string EntryPoint { get; init; } = ""; // skill file, DLL name, etc. + + [JsonPropertyName("minVersion")] + public string MinAppVersion { get; init; } = "1.0.0"; + + /// 설치 후 로드할 추가 파일 목록. + [JsonPropertyName("files")] + public List Files { get; init; } = new(); +} + +/// 설치된 플러그인 항목. +public record InstalledPlugin +{ + public PluginManifest Manifest { get; init; } = new(); + public string InstallPath { get; init; } = ""; + public DateTime InstalledAt { get; init; } + public bool IsEnabled { get; set; } = true; +} + +/// 플러그인 설치 결과. +public record PluginInstallResult +{ + public bool Success { get; init; } + public string Message { get; init; } = ""; + public PluginManifest? Manifest { get; init; } +} + +/// +/// Phase 18-C: 로컬 zip 파일 기반 플러그인 설치 서비스. +/// URL 다운로드 없음 — 사내 환경 보안 정책 준수. +/// +public class PluginInstallService +{ + private readonly string _pluginsDir; + private readonly string _registryFile; + private List _installed = new(); + + public PluginInstallService() + { + _pluginsDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "plugins"); + _registryFile = Path.Combine(_pluginsDir, "registry.json"); + Directory.CreateDirectory(_pluginsDir); + LoadRegistry(); + } + + /// 설치된 플러그인 목록. + public IReadOnlyList Installed => _installed.AsReadOnly(); + + /// + /// 로컬 zip 파일에서 플러그인을 설치합니다. + /// zip 내부에 plugin.json 매니페스트가 있어야 합니다. + /// + public async Task InstallFromZipAsync(string zipFilePath) + { + if (!File.Exists(zipFilePath)) + return new PluginInstallResult { Success = false, Message = $"파일을 찾을 수 없습니다: {zipFilePath}" }; + + if (Path.GetExtension(zipFilePath).ToLowerInvariant() != ".zip") + return new PluginInstallResult { Success = false, Message = "zip 파일만 설치할 수 있습니다." }; + + try + { + // zip에서 manifest 읽기 + PluginManifest? manifest = null; + using (var zip = ZipFile.OpenRead(zipFilePath)) + { + var manifestEntry = zip.GetEntry("plugin.json") + ?? zip.Entries.FirstOrDefault(e => e.Name == "plugin.json"); + + if (manifestEntry == null) + return new PluginInstallResult { Success = false, Message = "plugin.json 매니페스트가 없습니다." }; + + using var stream = manifestEntry.Open(); + manifest = await JsonSerializer.DeserializeAsync(stream); + } + + if (manifest == null || string.IsNullOrWhiteSpace(manifest.Id)) + return new PluginInstallResult { Success = false, Message = "유효하지 않은 매니페스트입니다." }; + + // ID 유효성 검사 (alphanumeric + _ + -) + if (!System.Text.RegularExpressions.Regex.IsMatch(manifest.Id, @"^[\w\-]+$")) + return new PluginInstallResult { Success = false, Message = $"유효하지 않은 플러그인 ID: {manifest.Id}" }; + + // 이미 설치된 플러그인 업데이트 여부 확인 + var existing = _installed.FirstOrDefault(p => p.Manifest.Id == manifest.Id); + var installPath = Path.Combine(_pluginsDir, manifest.Id); + + // 기존 설치 제거 + if (Directory.Exists(installPath)) + Directory.Delete(installPath, recursive: true); + Directory.CreateDirectory(installPath); + + // zip 압축 해제 + ZipFile.ExtractToDirectory(zipFilePath, installPath, overwriteFiles: true); + + var plugin = new InstalledPlugin + { + Manifest = manifest, + InstallPath = installPath, + InstalledAt = DateTime.UtcNow, + IsEnabled = true + }; + + if (existing != null) + _installed.Remove(existing); + _installed.Add(plugin); + + await SaveRegistryAsync(); + + var action = existing != null ? "업데이트" : "설치"; + return new PluginInstallResult + { + Success = true, + Message = $"'{manifest.Name}' v{manifest.Version} {action} 완료.", + Manifest = manifest + }; + } + catch (InvalidDataException) + { + return new PluginInstallResult { Success = false, Message = "손상된 zip 파일입니다." }; + } + catch (Exception ex) + { + return new PluginInstallResult { Success = false, Message = $"설치 오류: {ex.Message}" }; + } + } + + /// 플러그인을 제거합니다. + public async Task UninstallAsync(string pluginId) + { + var plugin = _installed.FirstOrDefault(p => p.Manifest.Id == pluginId); + if (plugin == null) return false; + + try + { + if (Directory.Exists(plugin.InstallPath)) + Directory.Delete(plugin.InstallPath, recursive: true); + _installed.Remove(plugin); + await SaveRegistryAsync(); + return true; + } + catch (Exception) { return false; } + } + + /// 플러그인 활성화/비활성화 토글. + public async Task SetEnabledAsync(string pluginId, bool enabled) + { + var plugin = _installed.FirstOrDefault(p => p.Manifest.Id == pluginId); + if (plugin == null) return; + plugin.IsEnabled = enabled; + await SaveRegistryAsync(); + } + + /// 스킬 타입 플러그인의 .skill.md 파일들을 반환 (SkillService 로드용). + public IReadOnlyList GetSkillFilePaths() + { + return _installed + .Where(p => p.IsEnabled && p.Manifest.Type == "skill") + .Select(p => Path.Combine(p.InstallPath, p.Manifest.EntryPoint)) + .Where(File.Exists) + .ToList(); + } + + private void LoadRegistry() + { + if (!File.Exists(_registryFile)) return; + try + { + var json = File.ReadAllText(_registryFile, System.Text.Encoding.UTF8); + _installed = JsonSerializer.Deserialize>(json) ?? new List(); + } + catch (Exception) { _installed = new List(); } + } + + private async Task SaveRegistryAsync() + { + var json = JsonSerializer.Serialize(_installed, new JsonSerializerOptions { WriteIndented = true }); + await File.WriteAllTextAsync(_registryFile, json, System.Text.Encoding.UTF8); + } +} diff --git a/src/AxCopilot/Services/Agent/PptxSkill.cs b/src/AxCopilot/Services/Agent/PptxSkill.cs new file mode 100644 index 0000000..a3a245c --- /dev/null +++ b/src/AxCopilot/Services/Agent/PptxSkill.cs @@ -0,0 +1,270 @@ +using System.IO; +using System.Text.Json; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Presentation; +using P = DocumentFormat.OpenXml.Presentation; +using A = DocumentFormat.OpenXml.Drawing; + +namespace AxCopilot.Services.Agent; + +/// +/// PowerPoint (.pptx) 프레젠테이션을 네이티브 생성하는 스킬. +/// OpenXML SDK를 사용하여 Python/Node 의존 없이 PPTX를 생성합니다. +/// +public class PptxSkill : IAgentTool +{ + public string Name => "pptx_create"; + public string Description => + "Create a PowerPoint (.pptx) presentation. " + + "Supports slide layouts: title (title+subtitle), content (title+body text), " + + "two_column (title+left+right), table (title+headers+rows), blank. " + + "No external runtime required (native OpenXML)."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["path"] = new() { Type = "string", Description = "Output file path (.pptx). Relative to work folder." }, + ["title"] = new() { Type = "string", Description = "Presentation title (used on first slide if no explicit title slide)." }, + ["slides"] = new() + { + Type = "array", + Description = "Array of slide objects. Each slide: " + + "{\"layout\": \"title|content|two_column|table|blank\", " + + "\"title\": \"Slide Title\", " + + "\"subtitle\": \"...\", " + // title layout + "\"body\": \"...\", " + // content layout + "\"left\": \"...\", \"right\": \"...\", " + // two_column + "\"headers\": [...], \"rows\": [[...]], " + // table + "\"notes\": \"Speaker notes\"}", + Items = new() { Type = "object" } + }, + ["theme"] = new() + { + Type = "string", + Description = "Color theme: professional (blue), modern (teal), dark (dark gray), minimal (light). Default: professional", + Enum = ["professional", "modern", "dark", "minimal"] + }, + }, + Required = ["path", "slides"] + }; + + // 테마별 색상 정의 + private static readonly Dictionary Themes = new() + { + ["professional"] = ("2B579A", "4B5EFC", "1A1A2E", "FFFFFF", "FFFFFF"), + ["modern"] = ("0D9488", "06B6D4", "1A1A2E", "FFFFFF", "FFFFFF"), + ["dark"] = ("374151", "6366F1", "F9FAFB", "FFFFFF", "1F2937"), + ["minimal"] = ("6B7280", "3B82F6", "111827", "FFFFFF", "FAFAFA"), + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + var path = args.GetProperty("path").GetString() ?? ""; + var presTitle = args.TryGetProperty("title", out var tt) ? tt.GetString() ?? "Presentation" : "Presentation"; + var theme = args.TryGetProperty("theme", out var th) ? th.GetString() ?? "professional" : "professional"; + + if (!args.TryGetProperty("slides", out var slidesEl) || slidesEl.ValueKind != JsonValueKind.Array) + return ToolResult.Fail("slides 배열이 필요합니다."); + + var fullPath = FileReadTool.ResolvePath(path, context.WorkFolder); + if (context.ActiveTab == "Cowork") fullPath = AgentContext.EnsureTimestampedPath(fullPath); + if (!fullPath.EndsWith(".pptx", StringComparison.OrdinalIgnoreCase)) + fullPath += ".pptx"; + + if (!context.IsPathAllowed(fullPath)) + return ToolResult.Fail($"경로 접근 차단: {fullPath}"); + if (!await context.CheckWritePermissionAsync(Name, fullPath)) + return ToolResult.Fail($"쓰기 권한 거부: {fullPath}"); + + var dir = Path.GetDirectoryName(fullPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + + if (!Themes.TryGetValue(theme, out var colors)) + colors = Themes["professional"]; + + try + { + using var pres = PresentationDocument.Create(fullPath, PresentationDocumentType.Presentation); + var presPart = pres.AddPresentationPart(); + presPart.Presentation = new P.Presentation(); + presPart.Presentation.SlideIdList = new SlideIdList(); + presPart.Presentation.SlideSize = new SlideSize + { + Cx = 12192000, // 10 inches + Cy = 6858000, // 7.5 inches + }; + presPart.Presentation.NotesSize = new NotesSize { Cx = 6858000, Cy = 9144000 }; + + uint slideId = 256; + int slideCount = 0; + + foreach (var slideEl in slidesEl.EnumerateArray()) + { + var layout = slideEl.TryGetProperty("layout", out var lay) ? lay.GetString() ?? "content" : "content"; + var slideTitle = slideEl.TryGetProperty("title", out var st) ? st.GetString() ?? "" : ""; + var subtitle = slideEl.TryGetProperty("subtitle", out var sub) ? sub.GetString() ?? "" : ""; + var body = slideEl.TryGetProperty("body", out var bd) ? bd.GetString() ?? "" : ""; + var left = slideEl.TryGetProperty("left", out var lf) ? lf.GetString() ?? "" : ""; + var right = slideEl.TryGetProperty("right", out var rt) ? rt.GetString() ?? "" : ""; + var notes = slideEl.TryGetProperty("notes", out var nt) ? nt.GetString() ?? "" : ""; + + var slidePart = presPart.AddNewPart(); + slidePart.Slide = new Slide(new CommonSlideData(new ShapeTree( + new P.NonVisualGroupShapeProperties( + new P.NonVisualDrawingProperties { Id = 1, Name = "" }, + new P.NonVisualGroupShapeDrawingProperties(), + new ApplicationNonVisualDrawingProperties()), + new GroupShapeProperties(new A.TransformGroup()) + ))); + + var shapeTree = slidePart.Slide.CommonSlideData!.ShapeTree!; + uint shapeId = 2; + + switch (layout) + { + case "title": + // 배경 색상 박스 + AddRectangle(shapeTree, ref shapeId, 0, 0, 12192000, 6858000, colors.Primary); + // 타이틀 + AddTextBox(shapeTree, ref shapeId, 600000, 2000000, 10992000, 1400000, + slideTitle, 3600, colors.TextLight, true); + // 서브타이틀 + if (!string.IsNullOrEmpty(subtitle)) + AddTextBox(shapeTree, ref shapeId, 600000, 3600000, 10992000, 800000, + subtitle, 2000, colors.TextLight, false); + break; + + case "two_column": + AddTextBox(shapeTree, ref shapeId, 600000, 300000, 10992000, 800000, + slideTitle, 2800, colors.Primary, true); + // 왼쪽 컬럼 + AddTextBox(shapeTree, ref shapeId, 600000, 1300000, 5200000, 5000000, + left, 1600, colors.TextDark, false); + // 오른쪽 컬럼 + AddTextBox(shapeTree, ref shapeId, 6400000, 1300000, 5200000, 5000000, + right, 1600, colors.TextDark, false); + break; + + case "table": + AddTextBox(shapeTree, ref shapeId, 600000, 300000, 10992000, 800000, + slideTitle, 2800, colors.Primary, true); + // 테이블은 텍스트로 시뮬레이션 (OpenXML 테이블은 매우 복잡) + var tableText = FormatTableAsText(slideEl, colors); + AddTextBox(shapeTree, ref shapeId, 600000, 1300000, 10992000, 5000000, + tableText, 1400, colors.TextDark, false); + break; + + case "blank": + // 빈 슬라이드 + break; + + default: // content + AddTextBox(shapeTree, ref shapeId, 600000, 300000, 10992000, 800000, + slideTitle, 2800, colors.Primary, true); + AddTextBox(shapeTree, ref shapeId, 600000, 1300000, 10992000, 5000000, + body, 1600, colors.TextDark, false); + break; + } + + // 슬라이드 등록 + presPart.Presentation.SlideIdList.AppendChild(new SlideId + { + Id = slideId++, + RelationshipId = presPart.GetIdOfPart(slidePart) + }); + slideCount++; + } + + presPart.Presentation.Save(); + + return ToolResult.Ok( + $"✅ PPTX 생성 완료: {Path.GetFileName(fullPath)} ({slideCount}슬라이드, 테마: {theme})", + fullPath); + } + catch (Exception ex) + { + return ToolResult.Fail($"PPTX 생성 실패: {ex.Message}"); + } + } + + private static void AddTextBox(ShapeTree tree, ref uint id, long x, long y, long cx, long cy, + string text, int fontSize, string color, bool bold) + { + var shape = new Shape(); + shape.NonVisualShapeProperties = new P.NonVisualShapeProperties( + new P.NonVisualDrawingProperties { Id = id++, Name = $"TextBox{id}" }, + new P.NonVisualShapeDrawingProperties(new A.ShapeLocks { NoGrouping = true }), + new ApplicationNonVisualDrawingProperties()); + shape.ShapeProperties = new ShapeProperties( + new A.Transform2D( + new A.Offset { X = x, Y = y }, + new A.Extents { Cx = cx, Cy = cy }), + new A.PresetGeometry(new A.AdjustValueList()) { Preset = A.ShapeTypeValues.Rectangle }); + + var txBody = new TextBody( + new A.BodyProperties { Wrap = A.TextWrappingValues.Square }, + new A.ListStyle()); + + // 텍스트를 줄 단위로 분리 + var lines = text.Split('\n'); + foreach (var line in lines) + { + var para = new A.Paragraph(); + var run = new A.Run(); + var runProps = new A.RunProperties { Language = "ko-KR", FontSize = fontSize, Dirty = false }; + runProps.AppendChild(new A.SolidFill(new A.RgbColorModelHex { Val = color })); + if (bold) runProps.Bold = true; + run.AppendChild(runProps); + run.AppendChild(new A.Text(line)); + para.AppendChild(run); + txBody.AppendChild(para); + } + + shape.TextBody = txBody; + tree.AppendChild(shape); + } + + private static void AddRectangle(ShapeTree tree, ref uint id, long x, long y, long cx, long cy, string fillColor) + { + var shape = new Shape(); + shape.NonVisualShapeProperties = new P.NonVisualShapeProperties( + new P.NonVisualDrawingProperties { Id = id++, Name = $"Rect{id}" }, + new P.NonVisualShapeDrawingProperties(), + new ApplicationNonVisualDrawingProperties()); + shape.ShapeProperties = new ShapeProperties( + new A.Transform2D( + new A.Offset { X = x, Y = y }, + new A.Extents { Cx = cx, Cy = cy }), + new A.PresetGeometry(new A.AdjustValueList()) { Preset = A.ShapeTypeValues.Rectangle }, + new A.SolidFill(new A.RgbColorModelHex { Val = fillColor })); + tree.AppendChild(shape); + } + + private static string FormatTableAsText(JsonElement slideEl, (string Primary, string Accent, string TextDark, string TextLight, string Bg) colors) + { + var sb = new System.Text.StringBuilder(); + if (slideEl.TryGetProperty("headers", out var headers)) + { + var headerTexts = new List(); + foreach (var h in headers.EnumerateArray()) + headerTexts.Add(h.GetString() ?? ""); + sb.AppendLine(string.Join(" | ", headerTexts)); + sb.AppendLine(new string('─', headerTexts.Sum(h => h.Length + 5))); + } + + if (slideEl.TryGetProperty("rows", out var rows)) + { + foreach (var row in rows.EnumerateArray()) + { + var cells = new List(); + foreach (var cell in row.EnumerateArray()) + cells.Add(cell.GetString() ?? cell.ToString()); + sb.AppendLine(string.Join(" | ", cells)); + } + } + + return sb.ToString(); + } +} diff --git a/src/AxCopilot/Services/Agent/ProcessTool.cs b/src/AxCopilot/Services/Agent/ProcessTool.cs new file mode 100644 index 0000000..d403042 --- /dev/null +++ b/src/AxCopilot/Services/Agent/ProcessTool.cs @@ -0,0 +1,129 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// cmd/powershell 명령을 실행하는 도구. 타임아웃 및 위험 명령 차단 포함. +public class ProcessTool : IAgentTool +{ + public string Name => "process"; + public string Description => "Execute a shell command (cmd or powershell). Returns stdout and stderr. Has a timeout limit."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["command"] = new() { Type = "string", Description = "Command to execute" }, + ["shell"] = new() { Type = "string", Description = "Shell to use: 'cmd' or 'powershell'. Default: 'cmd'.", + Enum = ["cmd", "powershell"] }, + ["timeout"] = new() { Type = "integer", Description = "Timeout in seconds. Default: 30, max: 120." }, + }, + Required = ["command"] + }; + + // 위험 명령 패턴 (대소문자 무시) + private static readonly string[] DangerousPatterns = + [ + "format ", "del /s", "rd /s", "rmdir /s", + "rm -rf", "Remove-Item -Recurse -Force", + "Stop-Computer", "Restart-Computer", + "shutdown", "taskkill /f", + "reg delete", "reg add", + "net user", "net localgroup", + "schtasks /create", "schtasks /delete", + ]; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + if (!args.TryGetProperty("command", out var cmdEl)) + return ToolResult.Fail("command가 필요합니다."); + var command = cmdEl.GetString() ?? ""; + var shell = args.TryGetProperty("shell", out var sh) ? sh.GetString() ?? "cmd" : "cmd"; + var timeout = args.TryGetProperty("timeout", out var to) ? Math.Min(to.GetInt32(), 120) : 30; + + if (string.IsNullOrWhiteSpace(command)) + return ToolResult.Fail("명령이 비어 있습니다."); + + // 위험 명령 차단 + foreach (var pattern in DangerousPatterns) + { + if (command.Contains(pattern, StringComparison.OrdinalIgnoreCase)) + return ToolResult.Fail($"위험 명령 차단: '{pattern}' 패턴이 감지되었습니다."); + } + + // 권한 확인 + if (!await context.CheckWritePermissionAsync(Name, command)) + return ToolResult.Fail("명령 실행 권한 거부"); + + try + { + var (fileName, arguments) = shell == "powershell" + ? ("powershell.exe", $"-NoProfile -NonInteractive -Command \"{command.Replace("\"", "\\\"")}\"") + : ("cmd.exe", $"/C {command}"); + + var psi = new ProcessStartInfo + { + FileName = fileName, + Arguments = arguments, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + StandardErrorEncoding = Encoding.UTF8, + }; + + // 작업 폴더 설정 + if (!string.IsNullOrEmpty(context.WorkFolder) && Directory.Exists(context.WorkFolder)) + psi.WorkingDirectory = context.WorkFolder; + + using var process = new Process { StartInfo = psi }; + var stdout = new StringBuilder(); + var stderr = new StringBuilder(); + + process.OutputDataReceived += (_, e) => { if (e.Data != null) stdout.AppendLine(e.Data); }; + process.ErrorDataReceived += (_, e) => { if (e.Data != null) stderr.AppendLine(e.Data); }; + + process.Start(); + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(timeout)); + + try + { + await process.WaitForExitAsync(cts.Token); + } + catch (OperationCanceledException) + { + try { process.Kill(entireProcessTree: true); } catch (Exception) { } + return ToolResult.Fail($"명령 실행 타임아웃 ({timeout}초 초과)"); + } + + var output = stdout.ToString().TrimEnd(); + var error = stderr.ToString().TrimEnd(); + + // 출력 크기 제한 (8000자) + if (output.Length > 8000) + output = output[..8000] + "\n... (출력 잘림)"; + + var result = new StringBuilder(); + result.AppendLine($"[Exit code: {process.ExitCode}]"); + if (!string.IsNullOrEmpty(output)) + result.AppendLine(output); + if (!string.IsNullOrEmpty(error)) + result.AppendLine($"[stderr]\n{error}"); + + return process.ExitCode == 0 + ? ToolResult.Ok(result.ToString()) + : ToolResult.Ok(result.ToString()); // 비정상 종료도 결과로 반환 (LLM이 판단) + } + catch (Exception ex) + { + return ToolResult.Fail($"명령 실행 실패: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/Agent/ProjectRuleTool.cs b/src/AxCopilot/Services/Agent/ProjectRuleTool.cs new file mode 100644 index 0000000..204392a --- /dev/null +++ b/src/AxCopilot/Services/Agent/ProjectRuleTool.cs @@ -0,0 +1,220 @@ +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 프로젝트 개발 지침(AX.md) 관리 도구. +/// 작업 폴더의 AX.md 파일에 개발 규칙, 코딩 컨벤션, 설계 원칙을 읽고 쓸 수 있습니다. +/// 쓰기 시 사용자 승인을 받습니다. +/// +public class ProjectRuleTool : IAgentTool +{ + public string Name => "project_rules"; + + public string Description => + "프로젝트 개발 지침(AX.md) 및 규칙(.ax/rules/)을 관리합니다.\n" + + "- read: 현재 AX.md 내용을 읽습니다\n" + + "- append: 새 규칙/지침을 AX.md에 추가합니다 (사용자 승인 필요)\n" + + "- write: AX.md를 새 내용으로 덮어씁니다 (사용자 승인 필요)\n" + + "- list_rules: .ax/rules/ 디렉토리의 프로젝트 규칙 파일 목록을 조회합니다\n" + + "- read_rule: .ax/rules/ 디렉토리의 특정 규칙 파일을 읽습니다\n" + + "사용자가 '개발 지침에 추가해', '규칙을 저장해', 'AX.md에 기록해' 등을 요청하면 이 도구를 사용하세요."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new ToolProperty + { + Type = "string", + Description = "read (AX.md 읽기), append (추가), write (전체 덮어쓰기), list_rules (.ax/rules/ 목록), read_rule (규칙 파일 읽기)", + Enum = ["read", "append", "write", "list_rules", "read_rule"] + }, + ["rule_name"] = new ToolProperty + { + Type = "string", + Description = "read_rule 시 읽을 규칙 파일 이름 (확장자 제외). 예: 'coding-conventions'" + }, + ["content"] = new ToolProperty + { + Type = "string", + Description = "append/write 시 저장할 내용. 마크다운 형식을 권장합니다." + }, + ["section"] = new ToolProperty + { + Type = "string", + Description = "append 시 섹션 제목. 예: '코딩 컨벤션', '빌드 규칙'. 비어있으면 파일 끝에 추가." + }, + }, + Required = ["action"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.TryGetProperty("action", out var a) ? a.GetString() ?? "" : ""; + var content = args.TryGetProperty("content", out var c) ? c.GetString() ?? "" : ""; + var section = args.TryGetProperty("section", out var s) ? s.GetString() ?? "" : ""; + var ruleName = args.TryGetProperty("rule_name", out var rn) ? rn.GetString() ?? "" : ""; + + if (string.IsNullOrEmpty(context.WorkFolder)) + return ToolResult.Fail("작업 폴더가 설정되어 있지 않습니다."); + + var axMdPath = FindAxMd(context.WorkFolder) ?? Path.Combine(context.WorkFolder, "AX.md"); + + return action switch + { + "read" => ReadAxMd(axMdPath), + "append" => await AppendAxMdAsync(axMdPath, content, section, context), + "write" => await WriteAxMdAsync(axMdPath, content, context), + "list_rules" => ListRules(context.WorkFolder), + "read_rule" => ReadRule(context.WorkFolder, ruleName), + _ => ToolResult.Fail($"지원하지 않는 action: {action}. read, append, write, list_rules, read_rule 중 선택하세요.") + }; + } + + private static ToolResult ReadAxMd(string path) + { + if (!File.Exists(path)) + return ToolResult.Ok($"AX.md 파일이 없습니다.\n경로: {path}\n\n새로 생성하려면 append 또는 write 액션을 사용하세요."); + + try + { + var content = File.ReadAllText(path, Encoding.UTF8); + if (string.IsNullOrWhiteSpace(content)) + return ToolResult.Ok("AX.md 파일이 비어 있습니다."); + + return ToolResult.Ok($"[AX.md 내용 ({content.Length}자)]\n\n{content}"); + } + catch (Exception ex) + { + return ToolResult.Fail($"AX.md 읽기 실패: {ex.Message}"); + } + } + + private static async Task AppendAxMdAsync(string path, string content, string section, AgentContext context) + { + if (string.IsNullOrWhiteSpace(content)) + return ToolResult.Fail("추가할 content가 필요합니다."); + + // 사용자 승인 + var desc = $"AX.md에 개발 지침을 추가합니다:\n{(content.Length > 200 ? content[..200] + "..." : content)}"; + if (!await context.CheckWritePermissionAsync("project_rules", desc)) + return ToolResult.Ok("사용자가 AX.md 수정을 거부했습니다."); + + try + { + var sb = new StringBuilder(); + + // 기존 내용 보존 + if (File.Exists(path)) + sb.Append(File.ReadAllText(path, Encoding.UTF8)); + + // 구분선 + 섹션 제목 + if (sb.Length > 0 && !sb.ToString().EndsWith('\n')) + sb.AppendLine(); + sb.AppendLine(); + + if (!string.IsNullOrEmpty(section)) + sb.AppendLine($"## {section}"); + + sb.AppendLine(content.Trim()); + + File.WriteAllText(path, sb.ToString(), Encoding.UTF8); + return ToolResult.Ok($"AX.md에 개발 지침이 추가되었습니다.\n경로: {path}\n추가된 내용 ({content.Length}자):\n{content}", path); + } + catch (Exception ex) + { + return ToolResult.Fail($"AX.md 쓰기 실패: {ex.Message}"); + } + } + + private static async Task WriteAxMdAsync(string path, string content, AgentContext context) + { + if (string.IsNullOrWhiteSpace(content)) + return ToolResult.Fail("저장할 content가 필요합니다."); + + var desc = $"AX.md를 전체 덮어씁니다 ({content.Length}자):\n{(content.Length > 200 ? content[..200] + "..." : content)}"; + if (!await context.CheckWritePermissionAsync("project_rules", desc)) + return ToolResult.Ok("사용자가 AX.md 수정을 거부했습니다."); + + try + { + File.WriteAllText(path, content, Encoding.UTF8); + return ToolResult.Ok($"AX.md가 저장되었습니다.\n경로: {path}\n내용 ({content.Length}자)", path); + } + catch (Exception ex) + { + return ToolResult.Fail($"AX.md 쓰기 실패: {ex.Message}"); + } + } + + private static ToolResult ListRules(string workFolder) + { + var rules = ProjectRulesService.LoadRules(workFolder); + if (rules.Count == 0) + { + var rulesDir = ProjectRulesService.FindRulesDirectory(workFolder); + var suggestedPath = rulesDir ?? Path.Combine(workFolder, ".ax", "rules"); + return ToolResult.Ok( + $"프로젝트 규칙이 없습니다.\n" + + $"규칙 파일을 추가하려면 {suggestedPath} 디렉토리에 .md 파일을 생성하세요.\n\n" + + "예시 규칙 파일 형식:\n" + + "---\nname: 코딩 컨벤션\ndescription: C# 코딩 규칙\napplies-to: \"*.cs\"\nwhen: always\n---\n\n규칙 내용..."); + } + + var sb = new StringBuilder(); + sb.AppendLine($"[프로젝트 규칙 {rules.Count}개]\n"); + foreach (var rule in rules) + { + sb.AppendLine($" • {rule.Name}"); + if (!string.IsNullOrEmpty(rule.Description)) + sb.AppendLine($" 설명: {rule.Description}"); + if (!string.IsNullOrEmpty(rule.AppliesTo)) + sb.AppendLine($" 적용 대상: {rule.AppliesTo}"); + sb.AppendLine($" 적용 시점: {rule.When}"); + sb.AppendLine($" 파일: {rule.FilePath}"); + sb.AppendLine(); + } + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult ReadRule(string workFolder, string ruleName) + { + if (string.IsNullOrWhiteSpace(ruleName)) + return ToolResult.Fail("rule_name 파라미터가 필요합니다."); + + var rules = ProjectRulesService.LoadRules(workFolder); + var rule = rules.FirstOrDefault(r => + r.Name.Equals(ruleName, StringComparison.OrdinalIgnoreCase) || + Path.GetFileNameWithoutExtension(r.FilePath).Equals(ruleName, StringComparison.OrdinalIgnoreCase)); + + if (rule == null) + return ToolResult.Fail($"규칙 '{ruleName}'을(를) 찾을 수 없습니다. list_rules로 목록을 확인하세요."); + + var sb = new StringBuilder(); + sb.AppendLine($"[규칙: {rule.Name}]"); + if (!string.IsNullOrEmpty(rule.Description)) sb.AppendLine($"설명: {rule.Description}"); + if (!string.IsNullOrEmpty(rule.AppliesTo)) sb.AppendLine($"적용 대상: {rule.AppliesTo}"); + sb.AppendLine($"적용 시점: {rule.When}"); + sb.AppendLine($"파일: {rule.FilePath}"); + sb.AppendLine(); + sb.AppendLine(rule.Body); + return ToolResult.Ok(sb.ToString(), rule.FilePath); + } + + /// AX.md 파일을 작업 폴더에서 최대 3단계 상위까지 탐색합니다. + private static string? FindAxMd(string workFolder) + { + var dir = workFolder; + for (int i = 0; i < 3; i++) + { + if (string.IsNullOrEmpty(dir)) break; + var path = Path.Combine(dir, "AX.md"); + if (File.Exists(path)) return path; + dir = Directory.GetParent(dir)?.FullName; + } + return null; + } +} diff --git a/src/AxCopilot/Services/Agent/ProjectRulesService.cs b/src/AxCopilot/Services/Agent/ProjectRulesService.cs new file mode 100644 index 0000000..dab6c56 --- /dev/null +++ b/src/AxCopilot/Services/Agent/ProjectRulesService.cs @@ -0,0 +1,206 @@ +using System.IO; +using System.Text; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// 프로젝트별 규칙 파일(.ax/rules/*.md)을 로드하고 컨텍스트에 맞는 규칙을 선별합니다. +/// 각 규칙 파일은 YAML 프론트매터로 적용 조건을 정의합니다. +/// +public static class ProjectRulesService +{ + /// 파싱된 프로젝트 규칙. + public class ProjectRule + { + /// 규칙 파일 경로. + public string FilePath { get; set; } = ""; + + /// 규칙 이름 (프론트매터 name 또는 파일명). + public string Name { get; set; } = ""; + + /// 규칙 설명. + public string Description { get; set; } = ""; + + /// 적용 대상 글로브 패턴. 예: "*.cs", "src/**/*.ts" + public string AppliesTo { get; set; } = ""; + + /// 적용 시점. 예: "always", "code-review", "document", "refactor" + public string When { get; set; } = "always"; + + /// 규칙 본문 (프론트매터 제외). + public string Body { get; set; } = ""; + } + + // YAML 프론트매터 경계 + private static readonly Regex FrontMatterRegex = new( + @"^---\s*\n(.*?)\n---\s*\n", + RegexOptions.Singleline | RegexOptions.Compiled); + + // YAML 키-값 파싱 (단순 1줄 값만) + private static readonly Regex YamlKeyValue = new( + @"^\s*(\w[\w-]*)\s*:\s*(.+?)\s*$", + RegexOptions.Multiline | RegexOptions.Compiled); + + /// + /// 작업 폴더에서 .ax/rules/ 디렉토리의 모든 규칙을 로드합니다. + /// 최대 3단계 상위 폴더까지 .ax/rules/ 를 탐색합니다. + /// + public static List LoadRules(string workFolder) + { + var rules = new List(); + if (string.IsNullOrEmpty(workFolder)) return rules; + + var rulesDir = FindRulesDirectory(workFolder); + if (rulesDir == null) return rules; + + try + { + foreach (var file in Directory.GetFiles(rulesDir, "*.md")) + { + var rule = ParseRuleFile(file); + if (rule != null) + rules.Add(rule); + } + } + catch (Exception) { /* 디렉토리 읽기 실패 시 빈 목록 반환 */ } + + return rules; + } + + /// + /// 컨텍스트에 맞는 규칙만 필터링합니다. + /// + /// 전체 규칙 목록 + /// 현재 컨텍스트 (예: "code-review", "document", "always") + /// 현재 작업 대상 파일 경로들 (applies-to 매칭용) + public static List FilterRules( + List rules, string when = "always", IEnumerable? filePaths = null) + { + var result = new List(); + + foreach (var rule in rules) + { + // when 조건 체크 + var ruleWhen = rule.When.ToLowerInvariant().Trim(); + if (ruleWhen != "always" && ruleWhen != when.ToLowerInvariant()) + continue; + + // applies-to 조건 체크 + if (!string.IsNullOrEmpty(rule.AppliesTo) && filePaths != null) + { + var pattern = rule.AppliesTo.Trim(); + if (!filePaths.Any(fp => MatchesGlob(fp, pattern))) + continue; + } + + result.Add(rule); + } + + return result; + } + + /// + /// 규칙 목록을 시스템 프롬프트용 텍스트로 포맷합니다. + /// + public static string FormatForSystemPrompt(List rules) + { + if (rules.Count == 0) return ""; + + var sb = new StringBuilder(); + sb.AppendLine("\n## 프로젝트 규칙 (.ax/rules/)"); + sb.AppendLine("아래 규칙을 반드시 준수하세요:\n"); + + foreach (var rule in rules) + { + if (!string.IsNullOrEmpty(rule.Name)) + sb.AppendLine($"### {rule.Name}"); + if (!string.IsNullOrEmpty(rule.Description)) + sb.AppendLine($"*{rule.Description}*\n"); + sb.AppendLine(rule.Body.Trim()); + sb.AppendLine(); + } + + return sb.ToString(); + } + + /// .ax/rules/ 디렉토리를 작업 폴더에서 최대 3단계 상위까지 탐색합니다. + internal static string? FindRulesDirectory(string workFolder) + { + var dir = workFolder; + for (int i = 0; i < 3; i++) + { + if (string.IsNullOrEmpty(dir)) break; + var rulesPath = Path.Combine(dir, ".ax", "rules"); + if (Directory.Exists(rulesPath)) return rulesPath; + dir = Directory.GetParent(dir)?.FullName; + } + return null; + } + + /// 규칙 파일을 파싱합니다 (YAML 프론트매터 + 본문). + internal static ProjectRule? ParseRuleFile(string filePath) + { + try + { + var content = File.ReadAllText(filePath, Encoding.UTF8); + if (string.IsNullOrWhiteSpace(content)) return null; + + var rule = new ProjectRule + { + FilePath = filePath, + Name = Path.GetFileNameWithoutExtension(filePath), + }; + + // 프론트매터 파싱 + var fmMatch = FrontMatterRegex.Match(content); + if (fmMatch.Success) + { + var yaml = fmMatch.Groups[1].Value; + foreach (Match kv in YamlKeyValue.Matches(yaml)) + { + var key = kv.Groups[1].Value.ToLowerInvariant(); + var val = kv.Groups[2].Value.Trim().Trim('"', '\''); + + switch (key) + { + case "name": rule.Name = val; break; + case "description": rule.Description = val; break; + case "applies-to" or "appliesto": rule.AppliesTo = val; break; + case "when": rule.When = val; break; + } + } + + rule.Body = content[(fmMatch.Index + fmMatch.Length)..]; + } + else + { + rule.Body = content; + } + + return string.IsNullOrWhiteSpace(rule.Body) ? null : rule; + } + catch (Exception) + { + return null; + } + } + + /// 간단한 글로브 패턴 매칭 (*, ** 지원). + private static bool MatchesGlob(string path, string pattern) + { + // "*.cs" → 확장자 매칭 + if (pattern.StartsWith("*.")) + return path.EndsWith(pattern[1..], StringComparison.OrdinalIgnoreCase); + + // "**/*.cs" → 경로 내 확장자 매칭 + if (pattern.StartsWith("**/")) + { + var subPattern = pattern[3..]; + return MatchesGlob(Path.GetFileName(path), subPattern); + } + + // 정확한 파일명 매칭 + return Path.GetFileName(path).Equals(pattern, StringComparison.OrdinalIgnoreCase); + } +} diff --git a/src/AxCopilot/Services/Agent/ReflexionService.cs b/src/AxCopilot/Services/Agent/ReflexionService.cs new file mode 100644 index 0000000..9e868db --- /dev/null +++ b/src/AxCopilot/Services/Agent/ReflexionService.cs @@ -0,0 +1,138 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace AxCopilot.Services.Agent; + +/// 반성 메모리 엔트리. +public record ReflexionEntry +{ + [JsonPropertyName("task_type")] + public string TaskType { get; init; } = ""; + + [JsonPropertyName("summary")] + public string Summary { get; init; } = ""; + + [JsonPropertyName("is_success")] + public bool IsSuccess { get; init; } + + [JsonPropertyName("score")] + public float CompletionScore { get; init; } + + [JsonPropertyName("weaknesses")] + public string[] Weaknesses { get; init; } = Array.Empty(); + + [JsonPropertyName("strengths")] + public string[] Strengths { get; init; } = Array.Empty(); + + [JsonPropertyName("lessons")] + public string[] Lessons { get; init; } = Array.Empty(); + + [JsonPropertyName("created_at")] + public DateTime CreatedAt { get; init; } = DateTime.UtcNow; + + [JsonPropertyName("session_id")] + public string SessionId { get; init; } = ""; +} + +/// +/// 반성 메모리 저장소. +/// 저장: %APPDATA%\AxCopilot\reflexion\{taskType}.jsonl +/// +public class ReflexionRepository +{ + private static readonly string BaseDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "reflexion"); + + private static readonly JsonSerializerOptions _json = new() + { + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + + public async Task SaveAsync(ReflexionEntry entry) + { + Directory.CreateDirectory(BaseDir); + var path = GetPath(entry.TaskType); + var line = JsonSerializer.Serialize(entry, _json); + await File.AppendAllTextAsync(path, line + "\n"); + } + + public async Task> GetByTaskTypeAsync(string taskType, int limit = 5) + { + var path = GetPath(taskType); + if (!File.Exists(path)) return Array.Empty(); + + var lines = await File.ReadAllLinesAsync(path); + var results = new List(); + foreach (var line in lines.Reverse()) + { + if (string.IsNullOrWhiteSpace(line)) continue; + try + { + var entry = JsonSerializer.Deserialize(line, _json); + if (entry != null) results.Add(entry); + if (results.Count >= limit) break; + } + catch (Exception) { } + } + return results; + } + + /// 동일 작업 유형의 과거 교훈을 시스템 프롬프트 주입용 텍스트로 빌드. + public async Task BuildContextPromptAsync(string taskType) + { + var entries = await GetByTaskTypeAsync(taskType, 5); + if (entries.Count == 0) return string.Empty; + + var sb = new StringBuilder(); + sb.AppendLine($"## 이전 유사 작업({taskType})에서 배운 점:"); + foreach (var e in entries) + { + if (e.Lessons.Length > 0) + foreach (var lesson in e.Lessons) + sb.AppendLine($"- {lesson}"); + if (!e.IsSuccess && e.Weaknesses.Length > 0) + foreach (var w in e.Weaknesses) + sb.AppendLine($"- 주의: {w}"); + } + return sb.ToString(); + } + + private static string GetPath(string taskType) + { + var safe = string.Concat(taskType.Where(c => char.IsLetterOrDigit(c) || c == '_' || c == '-')); + return Path.Combine(BaseDir, $"{safe}.jsonl"); + } +} + +/// 작업 유형 분류기. 사용자 입력 → 작업 유형 분류. +public static class TaskTypeClassifier +{ + private static readonly Dictionary _keywords = new() + { + ["code_generation"] = new[] { "만들어", "생성해", "작성해", "구현해", ".cs", ".py", ".js", ".ts", "class", "function", "함수", "클래스" }, + ["file_refactor"] = new[] { "리팩터", "refactor", "개선해", "최적화", "정리해", "수정해" }, + ["document"] = new[] { "문서", "보고서", "report", "document", ".docx", ".xlsx", ".html", ".pdf", "작성해", "만들어" }, + ["analysis"] = new[] { "분석", "analyze", "분석해", "검토해", "확인해", "review" }, + ["search"] = new[] { "검색", "찾아", "search", "find", "grep", "어디" }, + ["test"] = new[] { "테스트", "test", "단위", "unit", "검증", "verify" }, + ["git"] = new[] { "commit", "push", "pull", "merge", "branch", "git" }, + ["debug"] = new[] { "버그", "bug", "오류", "error", "fix", "수정" }, + }; + + public static string Classify(string userMessage) + { + var lower = userMessage.ToLowerInvariant(); + var best = "general"; + var bestScore = 0; + + foreach (var (type, keywords) in _keywords) + { + var score = keywords.Count(k => lower.Contains(k)); + if (score > bestScore) { bestScore = score; best = type; } + } + return best; + } +} diff --git a/src/AxCopilot/Services/Agent/RegexTool.cs b/src/AxCopilot/Services/Agent/RegexTool.cs new file mode 100644 index 0000000..b9e1d98 --- /dev/null +++ b/src/AxCopilot/Services/Agent/RegexTool.cs @@ -0,0 +1,188 @@ +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// 정규식 테스트·추출·치환 도구. +/// 패턴 매칭, 그룹 추출, 치환, 패턴 설명 기능을 제공합니다. +/// +public class RegexTool : IAgentTool +{ + public string Name => "regex_tool"; + public string Description => + "Regular expression tool. Actions: " + + "'test' — check if text matches a pattern; " + + "'match' — find all matches with groups; " + + "'replace' — replace matches with replacement string; " + + "'split' — split text by pattern; " + + "'extract' — extract named/numbered groups from first match."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action to perform", + Enum = ["test", "match", "replace", "split", "extract"], + }, + ["pattern"] = new() + { + Type = "string", + Description = "Regular expression pattern", + }, + ["text"] = new() + { + Type = "string", + Description = "Text to process", + }, + ["replacement"] = new() + { + Type = "string", + Description = "Replacement string for replace action (supports $1, $2, ${name})", + }, + ["flags"] = new() + { + Type = "string", + Description = "Regex flags: 'i' (ignore case), 'm' (multiline), 's' (singleline). Combine: 'im'", + }, + }, + Required = ["action", "pattern", "text"], + }; + + private const int MaxTimeout = 5000; // ReDoS 방지 + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + var pattern = args.GetProperty("pattern").GetString() ?? ""; + var text = args.GetProperty("text").GetString() ?? ""; + var replacement = args.TryGetProperty("replacement", out var r) ? r.GetString() ?? "" : ""; + var flags = args.TryGetProperty("flags", out var f) ? f.GetString() ?? "" : ""; + + try + { + var options = ParseFlags(flags); + var regex = new Regex(pattern, options, TimeSpan.FromMilliseconds(MaxTimeout)); + + return Task.FromResult(action switch + { + "test" => Test(regex, text), + "match" => Match(regex, text), + "replace" => Replace(regex, text, replacement), + "split" => Split(regex, text), + "extract" => Extract(regex, text), + _ => ToolResult.Fail($"Unknown action: {action}"), + }); + } + catch (RegexMatchTimeoutException) + { + return Task.FromResult(ToolResult.Fail("정규식 실행 시간 초과 (ReDoS 방지). 패턴을 간소화하세요.")); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"정규식 오류: {ex.Message}")); + } + } + + private static RegexOptions ParseFlags(string flags) + { + var options = RegexOptions.None; + foreach (var c in flags) + { + options |= c switch + { + 'i' => RegexOptions.IgnoreCase, + 'm' => RegexOptions.Multiline, + 's' => RegexOptions.Singleline, + _ => RegexOptions.None, + }; + } + return options; + } + + private static ToolResult Test(Regex regex, string text) + { + var isMatch = regex.IsMatch(text); + return ToolResult.Ok(isMatch ? "✓ Pattern matches" : "✗ No match"); + } + + private static ToolResult Match(Regex regex, string text) + { + var matches = regex.Matches(text); + if (matches.Count == 0) + return ToolResult.Ok("No matches found."); + + var sb = new System.Text.StringBuilder(); + sb.AppendLine($"Found {matches.Count} match(es):"); + var limit = Math.Min(matches.Count, 50); // 최대 50개 + for (var i = 0; i < limit; i++) + { + var m = matches[i]; + sb.AppendLine($"\n[{i}] \"{Truncate(m.Value, 200)}\" (index {m.Index}, length {m.Length})"); + if (m.Groups.Count > 1) + { + for (var g = 1; g < m.Groups.Count; g++) + { + var group = m.Groups[g]; + var name = regex.GroupNameFromNumber(g); + var label = name != g.ToString() ? $"'{name}'" : $"${g}"; + sb.AppendLine($" Group {label}: \"{Truncate(group.Value, 100)}\""); + } + } + } + if (matches.Count > limit) + sb.AppendLine($"\n... and {matches.Count - limit} more matches"); + + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult Replace(Regex regex, string text, string replacement) + { + var result = regex.Replace(text, replacement); + var count = regex.Matches(text).Count; + if (result.Length > 8000) + result = result[..8000] + "\n... (truncated)"; + return ToolResult.Ok($"Replaced {count} occurrence(s):\n\n{result}"); + } + + private static ToolResult Split(Regex regex, string text) + { + var parts = regex.Split(text); + var sb = new System.Text.StringBuilder(); + sb.AppendLine($"Split into {parts.Length} parts:"); + var limit = Math.Min(parts.Length, 100); + for (var i = 0; i < limit; i++) + sb.AppendLine($" [{i}] \"{Truncate(parts[i], 200)}\""); + if (parts.Length > limit) + sb.AppendLine($"\n... and {parts.Length - limit} more parts"); + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult Extract(Regex regex, string text) + { + var m = regex.Match(text); + if (!m.Success) + return ToolResult.Ok("No match found."); + + var sb = new System.Text.StringBuilder(); + sb.AppendLine($"Match: \"{Truncate(m.Value, 300)}\""); + if (m.Groups.Count > 1) + { + sb.AppendLine("\nGroups:"); + for (var g = 1; g < m.Groups.Count; g++) + { + var group = m.Groups[g]; + var name = regex.GroupNameFromNumber(g); + var label = name != g.ToString() ? $"'{name}'" : $"${g}"; + sb.AppendLine($" {label}: \"{Truncate(group.Value, 200)}\""); + } + } + return ToolResult.Ok(sb.ToString()); + } + + private static string Truncate(string s, int maxLen) => + s.Length <= maxLen ? s : s[..maxLen] + "…"; +} diff --git a/src/AxCopilot/Services/Agent/Sdk/AgentSdkServer.cs b/src/AxCopilot/Services/Agent/Sdk/AgentSdkServer.cs new file mode 100644 index 0000000..1e82da8 --- /dev/null +++ b/src/AxCopilot/Services/Agent/Sdk/AgentSdkServer.cs @@ -0,0 +1,419 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent.Sdk; + +/// +/// Phase 31-B: SDK 제어 프로토콜 서버. +/// stdin/stdout을 통한 양방향 JSON 스트리밍으로 외부 호스트(IDE/스크립트)에서 +/// AX Agent를 프로그래밍 방식으로 제어합니다. +/// +/// CC의 AgentSdkServer와 동등한 기능: +/// - Initialize → 세션 설정 + 커스텀 에이전트 등록 +/// - UserMessage → 에이전트 루프 실행 + 스트리밍 응답 +/// - SetModel / SetPermissionMode → 런타임 변경 +/// - Interrupt / Terminate → 세션 제어 +/// - CanUseTool → 외부 권한 핸들링 +/// +public class AgentSdkServer : IDisposable +{ + private readonly AgentLoopService _agent; + private readonly LlmService _llm; + private readonly ToolRegistry _tools; + private readonly SettingsService _settings; + private readonly AgentTypeRegistry _agentRegistry = new(); + private readonly JsonSerializerOptions _jsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + WriteIndented = false, + }; + + private CancellationTokenSource? _currentTurnCts; + private TextReader _input; + private TextWriter _output; + private bool _initialized; + private string? _sessionId; + private readonly List _hookCallbacks = new(); + + /// SDK 서버 생성. + public AgentSdkServer( + AgentLoopService agent, + LlmService llm, + ToolRegistry tools, + SettingsService settings, + TextReader? input = null, + TextWriter? output = null) + { + _agent = agent; + _llm = llm; + _tools = tools; + _settings = settings; + _input = input ?? Console.In; + _output = output ?? Console.Out; + } + + /// SDK 서버 메인 루프. 종료까지 블로킹. + public async Task RunAsync(CancellationToken ct = default) + { + // 에이전트 이벤트 → SDK 메시지 변환 구독 + _agent.Events.CollectionChanged += OnAgentEvent; + + try + { + while (!ct.IsCancellationRequested) + { + var line = await _input.ReadLineAsync(); + if (line == null) break; // EOF + + SdkControlRequest? request; + try + { + request = JsonSerializer.Deserialize(line, _jsonOptions); + if (request == null) continue; + } + catch (JsonException ex) + { + await SendErrorAsync("PARSE_ERROR", $"JSON 파싱 실패: {ex.Message}"); + continue; + } + + try + { + await HandleRequestAsync(request, ct); + } + catch (OperationCanceledException) when (ct.IsCancellationRequested) + { + break; + } + catch (Exception ex) + { + await SendErrorAsync("HANDLER_ERROR", ex.Message, request.Id); + } + } + } + finally + { + _agent.Events.CollectionChanged -= OnAgentEvent; + _currentTurnCts?.Cancel(); + } + } + + private async Task HandleRequestAsync(SdkControlRequest request, CancellationToken ct) + { + switch (request.Type) + { + case SdkControlRequestType.Initialize: + await HandleInitializeAsync(request, ct); + break; + + case SdkControlRequestType.UserMessage: + await HandleUserMessageAsync(request, ct); + break; + + case SdkControlRequestType.SetModel: + HandleSetModel(request); + break; + + case SdkControlRequestType.SetPermissionMode: + HandleSetPermissionMode(request); + break; + + case SdkControlRequestType.Interrupt: + HandleInterrupt(request); + break; + + case SdkControlRequestType.GetContextUsage: + await HandleGetContextUsageAsync(request); + break; + + case SdkControlRequestType.Terminate: + _currentTurnCts?.Cancel(); + await SendMessageAsync(new SdkMessage + { + Type = SdkMessageType.Notification, + RequestId = request.Id, + Data = new { message = "세션 종료됨" }, + }); + break; + + case SdkControlRequestType.CanUseToolResponse: + // 권한 응답 처리는 별도 콜백 채널로 구현 + break; + + default: + await SendErrorAsync("UNKNOWN_REQUEST", $"알 수 없는 요청 타입: {request.Type}", request.Id); + break; + } + } + + #region ── 요청 핸들러 ── + + private async Task HandleInitializeAsync(SdkControlRequest request, CancellationToken ct) + { + if (_initialized) + { + await SendErrorAsync("ALREADY_INITIALIZED", "세션이 이미 초기화되었습니다.", request.Id); + return; + } + + SdkInitializePayload? payload = null; + if (request.Payload.HasValue) + { + payload = JsonSerializer.Deserialize( + request.Payload.Value.GetRawText(), _jsonOptions); + } + + _sessionId = Guid.NewGuid().ToString("N")[..12]; + + // 설정 적용 + var llm = _settings.Settings.Llm; + if (!string.IsNullOrEmpty(payload?.WorkFolder)) + llm.WorkFolder = payload.WorkFolder; + if (!string.IsNullOrEmpty(payload?.Model)) + llm.Model = payload.Model; + if (payload?.MaxTurns > 0) + llm.MaxAgentIterations = payload.MaxTurns.Value; + if (payload?.DisabledTools != null) + llm.DisabledTools = payload.DisabledTools; + + // 커스텀 에이전트 등록 + if (payload?.CustomAgents != null) + { + foreach (var agentDef in payload.CustomAgents) + _agentRegistry.Register(agentDef); + } + + // 훅 콜백 등록 + if (payload?.HookCallbacks != null) + _hookCallbacks.AddRange(payload.HookCallbacks); + + _initialized = true; + + await SendMessageAsync(new SdkMessage + { + Type = SdkMessageType.InitializeResult, + RequestId = request.Id, + Data = new + { + sessionId = _sessionId, + model = llm.Model ?? "unknown", + availableTools = _tools.All.Select(t => t.Name).ToList(), + customAgents = _agentRegistry.ListAll().Select(a => a.Name).ToList(), + }, + }); + } + + private async Task HandleUserMessageAsync(SdkControlRequest request, CancellationToken ct) + { + if (!_initialized) + { + await SendErrorAsync("NOT_INITIALIZED", "먼저 Initialize 요청을 보내세요.", request.Id); + return; + } + + SdkUserMessagePayload? payload = null; + if (request.Payload.HasValue) + { + payload = JsonSerializer.Deserialize( + request.Payload.Value.GetRawText(), _jsonOptions); + } + + var message = payload?.Message ?? ""; + if (string.IsNullOrWhiteSpace(message)) + { + await SendErrorAsync("EMPTY_MESSAGE", "메시지가 비어있습니다.", request.Id); + return; + } + + // 에이전트 루프 실행 + _currentTurnCts = CancellationTokenSource.CreateLinkedTokenSource(ct); + var messages = new List + { + new() { Role = "user", Content = message } + }; + + var sw = System.Diagnostics.Stopwatch.StartNew(); + try + { + var response = await _agent.RunAsync(messages, _currentTurnCts.Token); + sw.Stop(); + + await SendMessageAsync(new SdkMessage + { + Type = SdkMessageType.SessionResult, + RequestId = request.Id, + Data = new SdkSessionResultData + { + Response = response, + DurationMs = sw.ElapsedMilliseconds, + }, + }); + } + catch (OperationCanceledException) + { + await SendMessageAsync(new SdkMessage + { + Type = SdkMessageType.Notification, + RequestId = request.Id, + Data = new { message = "턴이 중단되었습니다." }, + }); + } + catch (Exception ex) + { + await SendErrorAsync("AGENT_ERROR", ex.Message, request.Id); + } + finally + { + _currentTurnCts?.Dispose(); + _currentTurnCts = null; + } + } + + private void HandleSetModel(SdkControlRequest request) + { + if (request.Payload.HasValue && request.Payload.Value.TryGetProperty("model", out var m)) + { + _settings.Settings.Llm.Model = m.GetString() ?? _settings.Settings.Llm.Model; + } + } + + private void HandleSetPermissionMode(SdkControlRequest request) + { + if (request.Payload.HasValue && request.Payload.Value.TryGetProperty("mode", out var m)) + { + _settings.Settings.Llm.FilePermission = m.GetString() ?? "Ask"; + } + } + + private void HandleInterrupt(SdkControlRequest request) + { + _currentTurnCts?.Cancel(); + } + + private async Task HandleGetContextUsageAsync(SdkControlRequest request) + { + var llm = _settings.Settings.Llm; + var usage = _llm.LastTokenUsage; + + await SendMessageAsync(new SdkMessage + { + Type = SdkMessageType.Notification, + RequestId = request.Id, + Data = new + { + maxContextTokens = llm.MaxContextTokens, + promptTokens = usage?.PromptTokens ?? 0, + completionTokens = usage?.CompletionTokens ?? 0, + usagePercent = llm.MaxContextTokens > 0 && usage != null + ? (int)(100.0 * usage.PromptTokens / llm.MaxContextTokens) + : 0, + }, + }); + } + + #endregion + + #region ── 이벤트 → SDK 메시지 변환 ── + + private void OnAgentEvent(object? sender, + System.Collections.Specialized.NotifyCollectionChangedEventArgs e) + { + if (e.NewItems == null) return; + + foreach (AgentEvent evt in e.NewItems) + { + var msg = ConvertAgentEvent(evt); + if (msg != null) + { + // fire-and-forget (이벤트 핸들러에서 async 불가) + _ = SendMessageAsync(msg); + } + } + } + + private SdkMessage? ConvertAgentEvent(AgentEvent evt) + { + return evt.Type switch + { + AgentEventType.ToolCall => new SdkMessage + { + Type = SdkMessageType.ToolUseStart, + Data = new SdkToolUseStartData + { + ToolName = evt.ToolName, + Input = evt.ToolInput, + }, + }, + AgentEventType.ToolResult => new SdkMessage + { + Type = SdkMessageType.ToolResult, + Data = new SdkToolResultData + { + ToolName = evt.ToolName, + Success = evt.Success, + Output = evt.Summary, + FilePath = evt.FilePath, + ElapsedMs = evt.ElapsedMs, + }, + }, + AgentEventType.Thinking => new SdkMessage + { + Type = SdkMessageType.Notification, + Data = new { message = evt.Summary }, + }, + AgentEventType.Error => new SdkMessage + { + Type = SdkMessageType.Error, + Data = new SdkErrorData + { + Code = "AGENT_ERROR", + Message = evt.Summary, + }, + }, + _ => null, // 기타 이벤트는 SDK로 전달하지 않음 + }; + } + + #endregion + + #region ── 메시지 전송 ── + + private readonly SemaphoreSlim _writeLock = new(1, 1); + + private async Task SendMessageAsync(SdkMessage message) + { + var json = JsonSerializer.Serialize(message, _jsonOptions); + await _writeLock.WaitAsync(); + try + { + await _output.WriteLineAsync(json); + await _output.FlushAsync(); + } + finally + { + _writeLock.Release(); + } + } + + private Task SendErrorAsync(string code, string message, string? requestId = null) + => SendMessageAsync(new SdkMessage + { + Type = SdkMessageType.Error, + RequestId = requestId, + Data = new SdkErrorData { Code = code, Message = message }, + }); + + #endregion + + /// 등록된 커스텀 에이전트 레지스트리. + public AgentTypeRegistry AgentRegistry => _agentRegistry; + + public void Dispose() + { + _currentTurnCts?.Cancel(); + _currentTurnCts?.Dispose(); + _writeLock.Dispose(); + } +} diff --git a/src/AxCopilot/Services/Agent/Sdk/AgentTypeRegistry.cs b/src/AxCopilot/Services/Agent/Sdk/AgentTypeRegistry.cs new file mode 100644 index 0000000..1e119b3 --- /dev/null +++ b/src/AxCopilot/Services/Agent/Sdk/AgentTypeRegistry.cs @@ -0,0 +1,38 @@ +namespace AxCopilot.Services.Agent.Sdk; + +/// +/// Phase 31-C: 커스텀 에이전트 정의 레지스트리. +/// SDK Initialize 요청 시 등록된 커스텀 에이전트를 관리합니다. +/// DelegateAgentTool에서 기본 에이전트 타입 외에 SDK 정의 에이전트도 사용 가능. +/// +public class AgentTypeRegistry +{ + private readonly Dictionary _agents = new(StringComparer.OrdinalIgnoreCase); + + /// 커스텀 에이전트를 등록합니다. + public void Register(CustomAgentDefinition agent) + { + if (string.IsNullOrWhiteSpace(agent.Name)) + throw new ArgumentException("에이전트 이름은 필수입니다."); + _agents[agent.Name] = agent; + } + + /// 이름으로 커스텀 에이전트를 조회합니다. + public CustomAgentDefinition? Get(string name) + => _agents.TryGetValue(name, out var agent) ? agent : null; + + /// 등록 여부를 확인합니다. + public bool Contains(string name) => _agents.ContainsKey(name); + + /// 등록된 모든 커스텀 에이전트를 반환합니다. + public IReadOnlyCollection ListAll() => _agents.Values; + + /// 커스텀 에이전트를 제거합니다. + public bool Remove(string name) => _agents.Remove(name); + + /// 모든 등록을 초기화합니다. + public void Clear() => _agents.Clear(); + + /// 등록된 에이전트 수. + public int Count => _agents.Count; +} diff --git a/src/AxCopilot/Services/Agent/Sdk/SdkHookCallbackHandler.cs b/src/AxCopilot/Services/Agent/Sdk/SdkHookCallbackHandler.cs new file mode 100644 index 0000000..edb56af --- /dev/null +++ b/src/AxCopilot/Services/Agent/Sdk/SdkHookCallbackHandler.cs @@ -0,0 +1,106 @@ +using System.Text.Json; + +namespace AxCopilot.Services.Agent.Sdk; + +/// +/// Phase 31-D: SDK 훅 콜백 핸들러. +/// 에이전트 훅 이벤트를 SDK 호스트에 JSON으로 전달하고, +/// 호스트의 응답을 훅 결과로 반환합니다. +/// +/// CC의 SdkHookCallbackHandler와 동등: +/// - PreToolUse → Host에 CanUseTool 질의 → Allow/Deny 응답 +/// - 커스텀 훅 이벤트 → Host 알림 +/// +public class SdkHookCallbackHandler +{ + private readonly Func _sendMessage; + private readonly HashSet _registeredEvents; + + // 대기 중인 권한 요청 (requestId → TaskCompletionSource) + private readonly Dictionary> _pendingPermissions = new(); + + public SdkHookCallbackHandler( + Func sendMessage, + IEnumerable? registeredEvents = null) + { + _sendMessage = sendMessage; + _registeredEvents = registeredEvents != null + ? new HashSet(registeredEvents, StringComparer.OrdinalIgnoreCase) + : new HashSet(StringComparer.OrdinalIgnoreCase); + } + + /// 이벤트가 SDK 콜백으로 등록되었는지 확인합니다. + public bool IsRegistered(string eventName) + => _registeredEvents.Contains(eventName) || _registeredEvents.Contains("*"); + + /// + /// 도구 사용 허가를 SDK 호스트에 요청합니다. + /// 타임아웃(30초) 내 응답이 없으면 Deny 반환. + /// + public async Task RequestToolPermissionAsync( + string toolName, string? filePath, object? input, + CancellationToken ct = default) + { + var requestId = Guid.NewGuid().ToString("N")[..8]; + var tcs = new TaskCompletionSource(); + ct.Register(() => tcs.TrySetResult(false)); + + lock (_pendingPermissions) + _pendingPermissions[requestId] = tcs; + + try + { + await _sendMessage(new SdkMessage + { + Type = SdkMessageType.CanUseTool, + RequestId = requestId, + Data = new SdkCanUseToolData + { + ToolName = toolName, + FilePath = filePath, + Input = input, + }, + }); + + // 30초 타임아웃 + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(30)); + using var linked = CancellationTokenSource.CreateLinkedTokenSource(ct, timeoutCts.Token); + linked.Token.Register(() => tcs.TrySetResult(false)); + + return await tcs.Task; + } + finally + { + lock (_pendingPermissions) + _pendingPermissions.Remove(requestId); + } + } + + /// 호스트로부터 권한 응답을 수신합니다. + public void HandlePermissionResponse(string requestId, bool allowed) + { + TaskCompletionSource? tcs; + lock (_pendingPermissions) + { + if (!_pendingPermissions.TryGetValue(requestId, out tcs)) return; + } + tcs.TrySetResult(allowed); + } + + /// 훅 이벤트를 SDK 호스트에 알립니다 (비동기, 응답 불필요). + public async Task NotifyHookEventAsync(string eventKind, string? toolName, string? summary) + { + if (!IsRegistered(eventKind)) return; + + await _sendMessage(new SdkMessage + { + Type = SdkMessageType.HookEvent, + Data = new + { + eventKind, + toolName, + summary, + }, + }); + } +} diff --git a/src/AxCopilot/Services/Agent/Sdk/SdkProtocol.cs b/src/AxCopilot/Services/Agent/Sdk/SdkProtocol.cs new file mode 100644 index 0000000..edcd840 --- /dev/null +++ b/src/AxCopilot/Services/Agent/Sdk/SdkProtocol.cs @@ -0,0 +1,252 @@ +using System.Text.Json.Serialization; + +namespace AxCopilot.Services.Agent.Sdk; + +// ═══════════════════════════════════════════════════════════════════ +// Phase 31-A: SDK 제어 프로토콜 메시지 정의 +// CC의 JSON 스트리밍 프로토콜과 동등한 양방향 메시지 체계. +// Host(IDE/스크립트) ↔ CLI(AgentSdkServer) 간 stdin/stdout JSON 통신. +// ═══════════════════════════════════════════════════════════════════ + +#region ── Host → CLI 요청 ── + +/// SDK 제어 요청 타입. +[JsonConverter(typeof(JsonStringEnumConverter))] +public enum SdkControlRequestType +{ + /// 세션 초기화. 커스텀 에이전트, 훅 콜백 등록. + Initialize, + /// 사용자 메시지 전송. + UserMessage, + /// 권한 모드 변경. + SetPermissionMode, + /// 모델 전환. + SetModel, + /// 현재 턴 중단. + Interrupt, + /// 컨텍스트 사용량 조회. + GetContextUsage, + /// 파일 변경 되돌리기. + RewindFiles, + /// 도구 사용 허가 응답 (CLI → Host 질의에 대한 답변). + CanUseToolResponse, + /// 세션 종료. + Terminate, +} + +/// Host → CLI 제어 요청. +public class SdkControlRequest +{ + [JsonPropertyName("type")] + public SdkControlRequestType Type { get; set; } + + [JsonPropertyName("id")] + public string Id { get; set; } = Guid.NewGuid().ToString("N")[..8]; + + [JsonPropertyName("payload")] + public System.Text.Json.JsonElement? Payload { get; set; } +} + +/// Initialize 요청 페이로드. +public class SdkInitializePayload +{ + [JsonPropertyName("workFolder")] + public string? WorkFolder { get; set; } + + [JsonPropertyName("model")] + public string? Model { get; set; } + + [JsonPropertyName("permissionMode")] + public string? PermissionMode { get; set; } + + [JsonPropertyName("systemPrompt")] + public string? SystemPrompt { get; set; } + + [JsonPropertyName("customAgents")] + public List? CustomAgents { get; set; } + + [JsonPropertyName("maxTurns")] + public int? MaxTurns { get; set; } + + [JsonPropertyName("disabledTools")] + public List? DisabledTools { get; set; } + + [JsonPropertyName("hookCallbacks")] + public List? HookCallbacks { get; set; } +} + +/// UserMessage 요청 페이로드. +public class SdkUserMessagePayload +{ + [JsonPropertyName("message")] + public string Message { get; set; } = ""; + + [JsonPropertyName("attachments")] + public List? Attachments { get; set; } +} + +#endregion + +#region ── CLI → Host 응답/이벤트 ── + +/// SDK 메시지 타입 (CLI → Host). +[JsonConverter(typeof(JsonStringEnumConverter))] +public enum SdkMessageType +{ + /// 초기화 완료 응답. + InitializeResult, + /// 어시스턴트 텍스트 토큰 (스트리밍). + AssistantToken, + /// 어시스턴트 메시지 완료. + AssistantMessage, + /// 도구 호출 시작. + ToolUseStart, + /// 도구 실행 진행 상황. + ToolProgress, + /// 도구 실행 결과. + ToolResult, + /// 세션/턴 최종 결과. + SessionResult, + /// 훅 이벤트 (콜백 요청). + HookEvent, + /// 도구 사용 허가 요청 (CLI → Host). + CanUseTool, + /// 일반 알림. + Notification, + /// 오류. + Error, +} + +/// CLI → Host 메시지. +public class SdkMessage +{ + [JsonPropertyName("type")] + public SdkMessageType Type { get; set; } + + [JsonPropertyName("id")] + public string? RequestId { get; set; } + + [JsonPropertyName("data")] + public object? Data { get; set; } + + [JsonPropertyName("timestamp")] + public DateTime Timestamp { get; set; } = DateTime.UtcNow; +} + +/// AssistantToken 데이터. +public class SdkTokenData +{ + [JsonPropertyName("text")] + public string Text { get; set; } = ""; +} + +/// ToolUseStart 데이터. +public class SdkToolUseStartData +{ + [JsonPropertyName("toolName")] + public string ToolName { get; set; } = ""; + + [JsonPropertyName("input")] + public object? Input { get; set; } +} + +/// ToolResult 데이터. +public class SdkToolResultData +{ + [JsonPropertyName("toolName")] + public string ToolName { get; set; } = ""; + + [JsonPropertyName("success")] + public bool Success { get; set; } + + [JsonPropertyName("output")] + public string Output { get; set; } = ""; + + [JsonPropertyName("filePath")] + public string? FilePath { get; set; } + + [JsonPropertyName("elapsedMs")] + public long ElapsedMs { get; set; } +} + +/// SessionResult 데이터. +public class SdkSessionResultData +{ + [JsonPropertyName("response")] + public string Response { get; set; } = ""; + + [JsonPropertyName("totalToolCalls")] + public int TotalToolCalls { get; set; } + + [JsonPropertyName("iterations")] + public int Iterations { get; set; } + + [JsonPropertyName("inputTokens")] + public int InputTokens { get; set; } + + [JsonPropertyName("outputTokens")] + public int OutputTokens { get; set; } + + [JsonPropertyName("durationMs")] + public long DurationMs { get; set; } +} + +/// CanUseTool 데이터 (CLI → Host 질의). +public class SdkCanUseToolData +{ + [JsonPropertyName("toolName")] + public string ToolName { get; set; } = ""; + + [JsonPropertyName("filePath")] + public string? FilePath { get; set; } + + [JsonPropertyName("input")] + public object? Input { get; set; } +} + +/// Error 데이터. +public class SdkErrorData +{ + [JsonPropertyName("code")] + public string Code { get; set; } = "UNKNOWN"; + + [JsonPropertyName("message")] + public string Message { get; set; } = ""; +} + +#endregion + +#region ── 커스텀 에이전트 정의 ── + +/// +/// Phase 31-C: SDK에서 정의하는 커스텀 에이전트. +/// Initialize 요청 시 등록하면 delegate 도구에서 사용 가능. +/// +public class CustomAgentDefinition +{ + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("description")] + public string Description { get; set; } = ""; + + [JsonPropertyName("prompt")] + public string Prompt { get; set; } = ""; + + [JsonPropertyName("model")] + public string? Model { get; set; } + + [JsonPropertyName("allowedTools")] + public List? AllowedTools { get; set; } + + [JsonPropertyName("disallowedTools")] + public List? DisallowedTools { get; set; } + + [JsonPropertyName("maxTurns")] + public int MaxTurns { get; set; } = 10; + + [JsonPropertyName("permissionMode")] + public string? PermissionMode { get; set; } +} + +#endregion diff --git a/src/AxCopilot/Services/Agent/SessionManager.cs b/src/AxCopilot/Services/Agent/SessionManager.cs new file mode 100644 index 0000000..4b1ef5d --- /dev/null +++ b/src/AxCopilot/Services/Agent/SessionManager.cs @@ -0,0 +1,237 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 28: 세션 매니저. +/// CC의 세션 관리와 동등: 대화 상태를 저장/복원/포크/태그/검색합니다. +/// 세션은 %APPDATA%\AxCopilot\sessions\ 에 JSON으로 저장됩니다. +/// +public class SessionManager +{ + private static readonly string SessionDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "sessions"); + + private static readonly JsonSerializerOptions _json = new() + { + WriteIndented = true, + PropertyNameCaseInsensitive = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + }; + + /// 현재 세션을 디스크에 저장합니다. + public async Task SaveSessionAsync(AgentSession session, CancellationToken ct = default) + { + EnsureDir(); + var filePath = GetSessionPath(session.Id); + session.UpdatedAt = DateTime.UtcNow; + + var json = JsonSerializer.Serialize(session, _json); + await File.WriteAllTextAsync(filePath, json, Encoding.UTF8, ct); + } + + /// 세션을 ID로 복원합니다. + public async Task LoadSessionAsync(string sessionId, CancellationToken ct = default) + { + var filePath = GetSessionPath(sessionId); + if (!File.Exists(filePath)) return null; + + var json = await File.ReadAllTextAsync(filePath, Encoding.UTF8, ct); + return JsonSerializer.Deserialize(json, _json); + } + + /// 저장된 세션 목록을 반환합니다 (최신순). + public List ListSessions(int limit = 50) + { + EnsureDir(); + var summaries = new List(); + + foreach (var file in Directory.GetFiles(SessionDir, "*.session.json") + .OrderByDescending(f => File.GetLastWriteTimeUtc(f)) + .Take(limit)) + { + try + { + var json = File.ReadAllText(file, Encoding.UTF8); + var session = JsonSerializer.Deserialize(json, _json); + if (session == null) continue; + + summaries.Add(new AgentSessionSummary + { + Id = session.Id, + Name = session.Name, + Tab = session.Tab, + Tags = session.Tags, + MessageCount = session.Messages?.Count ?? 0, + CreatedAt = session.CreatedAt, + UpdatedAt = session.UpdatedAt, + WorkFolder = session.WorkFolder, + }); + } + catch (Exception) { } + } + + return summaries; + } + + /// 세션을 포크합니다 (현재 상태에서 분기). + public async Task ForkSessionAsync(string sourceId, string? newName = null, CancellationToken ct = default) + { + var source = await LoadSessionAsync(sourceId, ct); + if (source == null) throw new InvalidOperationException($"세션을 찾을 수 없습니다: {sourceId}"); + + var fork = new AgentSession + { + Id = GenerateSessionId(), + Name = newName ?? $"{source.Name} (fork)", + Tab = source.Tab, + WorkFolder = source.WorkFolder, + Model = source.Model, + Messages = source.Messages?.ToList() ?? new(), + Tags = new List(source.Tags ?? new()) { "forked" }, + ParentSessionId = sourceId, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow, + }; + + await SaveSessionAsync(fork, ct); + return fork; + } + + /// 세션에 태그를 추가합니다. + public async Task TagSessionAsync(string sessionId, string tag, CancellationToken ct = default) + { + var session = await LoadSessionAsync(sessionId, ct); + if (session == null) return; + + session.Tags ??= new(); + if (!session.Tags.Contains(tag, StringComparer.OrdinalIgnoreCase)) + { + session.Tags.Add(tag); + await SaveSessionAsync(session, ct); + } + } + + /// 세션 이름을 변경합니다. + public async Task RenameSessionAsync(string sessionId, string newName, CancellationToken ct = default) + { + var session = await LoadSessionAsync(sessionId, ct); + if (session == null) return; + + session.Name = newName; + await SaveSessionAsync(session, ct); + } + + /// 세션을 삭제합니다. + public void DeleteSession(string sessionId) + { + var filePath = GetSessionPath(sessionId); + if (File.Exists(filePath)) File.Delete(filePath); + } + + /// 태그로 세션을 검색합니다. + public List FindByTag(string tag, int limit = 20) + { + return ListSessions(200) + .Where(s => s.Tags?.Contains(tag, StringComparer.OrdinalIgnoreCase) ?? false) + .Take(limit) + .ToList(); + } + + /// 최근 세션을 반환합니다 (--continue 동등). + public AgentSessionSummary? GetMostRecent(string? tab = null) + { + var sessions = ListSessions(10); + if (tab != null) + sessions = sessions.Where(s => s.Tab == tab).ToList(); + return sessions.FirstOrDefault(); + } + + /// 오래된 세션을 정리합니다. + public int CleanupOldSessions(int retentionDays = 30) + { + EnsureDir(); + var cutoff = DateTime.UtcNow.AddDays(-retentionDays); + int deleted = 0; + + foreach (var file in Directory.GetFiles(SessionDir, "*.session.json")) + { + try + { + if (File.GetLastWriteTimeUtc(file) < cutoff) + { + File.Delete(file); + deleted++; + } + } + catch (Exception) { } + } + + return deleted; + } + + private static string GetSessionPath(string sessionId) + => Path.Combine(SessionDir, $"{sessionId}.session.json"); + + private static string GenerateSessionId() + => DateTime.UtcNow.ToString("yyyyMMddHHmmss") + "_" + Guid.NewGuid().ToString("N")[..8]; + + private static void EnsureDir() + { + if (!Directory.Exists(SessionDir)) + Directory.CreateDirectory(SessionDir); + } +} + +/// 저장 가능한 에이전트 세션. +public class AgentSession +{ + [JsonPropertyName("id")] + public string Id { get; set; } = ""; + + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("tab")] + public string Tab { get; set; } = "Chat"; + + [JsonPropertyName("work_folder")] + public string WorkFolder { get; set; } = ""; + + [JsonPropertyName("model")] + public string Model { get; set; } = ""; + + [JsonPropertyName("messages")] + public List? Messages { get; set; } + + [JsonPropertyName("tags")] + public List? Tags { get; set; } + + [JsonPropertyName("parent_session_id")] + public string? ParentSessionId { get; set; } + + [JsonPropertyName("created_at")] + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + + [JsonPropertyName("updated_at")] + public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; +} + +/// 세션 목록 표시용 요약. +public class AgentSessionSummary +{ + public string Id { get; init; } = ""; + public string Name { get; init; } = ""; + public string Tab { get; init; } = ""; + public List? Tags { get; init; } + public int MessageCount { get; init; } + public DateTime CreatedAt { get; init; } + public DateTime UpdatedAt { get; init; } + public string WorkFolder { get; init; } = ""; +} diff --git a/src/AxCopilot/Services/Agent/SkillArgumentSubstitution.cs b/src/AxCopilot/Services/Agent/SkillArgumentSubstitution.cs new file mode 100644 index 0000000..5aa00cf --- /dev/null +++ b/src/AxCopilot/Services/Agent/SkillArgumentSubstitution.cs @@ -0,0 +1,84 @@ +using System.Text; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 19-D-EXT: ��킬 인수 치환. +/// $ARGUMENTS, $name (명명된 인수), {0} (인덱스 기반) 치환을 처리합니다. +/// +public static class SkillArgumentSubstitution +{ + /// + /// 스킬 본문에서 인수 플레이스홀더를 치환합니다. + /// + /// 스킬 본문 텍스트 + /// 프론트매터 arguments 필드 (명명된 인수 목록) + /// 사용자가 전달한 인수 문자열 + public static string Substitute(string body, IReadOnlyList? namedArgs, string userInput) + { + if (string.IsNullOrEmpty(body)) return body; + + var result = body; + + // 1. $ARGUMENTS → 전체 인수 문자열 + result = result.Replace("$ARGUMENTS", userInput); + + // 2. 명명된 인수 ($name 구문) + if (namedArgs != null && namedArgs.Count > 0) + { + var parts = SplitArguments(userInput); + for (var i = 0; i < namedArgs.Count; i++) + { + var argName = namedArgs[i]; + var argValue = i < parts.Count ? parts[i] : ""; + result = result.Replace($"${argName}", argValue); + } + } + + // 3. 인덱스 기반 인수 ({0}, {1}, ...) + var indexParts = SplitArguments(userInput); + for (var i = 0; i < indexParts.Count; i++) + result = result.Replace($"{{{i}}}", indexParts[i]); + + return result; + } + + /// + /// 공백으로 분리하되 따옴표로 감싼 인수는 하나로 처리합니다. + /// 예: 'hello world' foo → ["hello world", "foo"] + /// + public static List SplitArguments(string input) + { + if (string.IsNullOrWhiteSpace(input)) return new(); + + var parts = new List(); + var current = new StringBuilder(); + var inQuote = false; + var quoteChar = '\0'; + + foreach (var ch in input) + { + if (!inQuote && (ch == '"' || ch == '\'')) + { + inQuote = true; + quoteChar = ch; + continue; + } + if (inQuote && ch == quoteChar) + { + inQuote = false; + continue; + } + if (ch == ' ' && !inQuote && current.Length > 0) + { + parts.Add(current.ToString()); + current.Clear(); + continue; + } + current.Append(ch); + } + + if (current.Length > 0) parts.Add(current.ToString()); + return parts; + } +} diff --git a/src/AxCopilot/Services/Agent/SkillExtensions.cs b/src/AxCopilot/Services/Agent/SkillExtensions.cs new file mode 100644 index 0000000..171bb1a --- /dev/null +++ b/src/AxCopilot/Services/Agent/SkillExtensions.cs @@ -0,0 +1,33 @@ +namespace AxCopilot.Services.Agent; + +/// Phase 17-D: SkillDefinition 확장 필드를 저장하는 사전식 저장소. +public static class SkillExtensionStore +{ + private static readonly Dictionary _store = new(); + + public static void Set(string skillId, SkillExtData data) + => _store[skillId] = data; + + public static SkillExtData? Get(string skillId) + => _store.TryGetValue(skillId, out var d) ? d : null; + + public static void Clear() => _store.Clear(); +} + +/// Phase 17-D 스킬 확장 데이터. +public class SkillExtData +{ + /// 스킬 격리 컨텍스트. Fork = 독립 서브에이전트 실행. + public SkillContextMode ContextMode { get; set; } = SkillContextMode.Default; + + /// 자동 활성화 glob 패턴 목록 (paths: 프론트매터). + public List PathPatterns { get; set; } = new(); + + /// 스킬별 모델 오버라이드. null이면 현재 설정 모델 사용. + public string? ModelOverride { get; set; } + + /// 슬래시 목록 노출 여부. false이면 AI 전용 (사용자 /목록 미표시). + public bool UserInvocable { get; set; } = true; +} + +public enum SkillContextMode { Default, Fork } diff --git a/src/AxCopilot/Services/Agent/SkillInlineCommandProcessor.cs b/src/AxCopilot/Services/Agent/SkillInlineCommandProcessor.cs new file mode 100644 index 0000000..7d912d6 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SkillInlineCommandProcessor.cs @@ -0,0 +1,86 @@ +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 19-D-EXT: 스킬 인라인 셸 커맨드 프로세서. +/// 스킬 본문에서 !`command` 패턴을 찾아 셸 실행 결과로 교체합니다. +/// CC 스킬의 인라인 셸 커맨드 기능과 동등합니다. +/// +public static class SkillInlineCommandProcessor +{ + // !`command` 패턴: ! 뒤에 백틱으로 감싼 명령 + private static readonly Regex InlineCmdPattern = new(@"!\`([^`]+)\`", RegexOptions.Compiled); + + /// + /// 스킬 본문에서 !`command` 패턴을 찾아 셸 실행 결과로 교체합니다. + /// 호출 시점: 스킬이 로드된 후, LLM 프롬프트로 전달하기 직전. + /// + /// 스킬 본문 텍스��� + /// 셸 명령 실행 작업 디렉토리 + /// 취소 토큰 + /// 인라인 명령이 출력으로 교체된 텍스트 + public static async Task ProcessAsync(string skillBody, string workFolder, CancellationToken ct) + { + if (string.IsNullOrEmpty(skillBody)) return skillBody; + + var matches = InlineCmdPattern.Matches(skillBody); + if (matches.Count == 0) return skillBody; + + // 뒤에서부터 교체하여 인덱스 보존 + var result = skillBody; + foreach (Match match in matches.Cast().Reverse()) + { + var command = match.Groups[1].Value; + var output = await ExecuteCommandAsync(command, workFolder, ct); + result = result.Remove(match.Index, match.Length).Insert(match.Index, output); + } + + return result; + } + + private static async Task ExecuteCommandAsync(string command, string workFolder, CancellationToken ct) + { + try + { + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(10)); + + var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + var psi = new ProcessStartInfo + { + FileName = isWindows ? "cmd.exe" : "bash", + Arguments = isWindows + ? $"/c {command}" + : $"-c \"{command.Replace("\"", "\\\"")}\"", + WorkingDirectory = string.IsNullOrEmpty(workFolder) ? Directory.GetCurrentDirectory() : workFolder, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + StandardErrorEncoding = Encoding.UTF8, + }; + + using var proc = Process.Start(psi); + if (proc == null) return "[실행 실패]"; + + var stdout = await proc.StandardOutput.ReadToEndAsync(cts.Token); + await proc.WaitForExitAsync(cts.Token); + + return stdout.TrimEnd(); + } + catch (OperationCanceledException) + { + return "[타임아웃]"; + } + catch (Exception ex) + { + return $"[오류: {ex.Message}]"; + } + } +} diff --git a/src/AxCopilot/Services/Agent/SkillManagerTool.cs b/src/AxCopilot/Services/Agent/SkillManagerTool.cs new file mode 100644 index 0000000..d07a738 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SkillManagerTool.cs @@ -0,0 +1,97 @@ +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 스킬 관리 에이전트 도구. +/// 로드된 스킬 목록 조회, 스킬 정보 확인, 스킬 실행을 지원합니다. +/// +public class SkillManagerTool : IAgentTool +{ + public string Name => "skill_manager"; + + public string Description => + "마크다운 기반 스킬(워크플로우)을 관리합니다.\n" + + "- list: 사용 가능한 스킬 목록 조회\n" + + "- info: 특정 스킬의 상세 정보 확인\n" + + "- reload: 스킬 폴더를 다시 스캔하여 새 스킬 로드"; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new ToolProperty + { + Type = "string", + Description = "list (목록), info (상세정보), reload (재로드)", + Enum = ["list", "info", "reload"] + }, + ["skill_name"] = new ToolProperty + { + Type = "string", + Description = "스킬 이름 (info 액션에서 사용)" + }, + }, + Required = ["action"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + if (!(context.Llm?.EnableSkillSystem ?? true)) + return ToolResult.Ok("스킬 시스템이 비활성 상태입니다. 설정 → AX Agent → 공통에서 활성화하세요."); + + var action = args.TryGetProperty("action", out var a) ? a.GetString() ?? "" : ""; + var skillName = args.TryGetProperty("skill_name", out var s) ? s.GetString() ?? "" : ""; + + return action switch + { + "list" => ListSkills(), + "info" => InfoSkill(skillName), + "reload" => ReloadSkills(context), + _ => ToolResult.Fail($"지원하지 않는 action: {action}. list, info, reload 중 선택하세요.") + }; + } + + private static ToolResult ListSkills() + { + var skills = SkillService.Skills; + if (skills.Count == 0) + return ToolResult.Ok("로드된 스킬이 없습니다. %APPDATA%\\AxCopilot\\skills\\에 *.skill.md 파일을 추가하세요."); + + var sb = new StringBuilder(); + sb.AppendLine($"사용 가능한 스킬 ({skills.Count}개):\n"); + foreach (var skill in skills) + { + sb.AppendLine($" /{skill.Name} — {skill.Label}"); + sb.AppendLine($" {skill.Description}"); + sb.AppendLine(); + } + sb.AppendLine("슬래시 명령어(/{name})로 호출하거나, 대화에서 해당 워크플로우를 요청할 수 있습니다."); + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult InfoSkill(string name) + { + if (string.IsNullOrEmpty(name)) + return ToolResult.Fail("skill_name이 필요합니다."); + + var skill = SkillService.Find(name); + if (skill == null) + return ToolResult.Fail($"'{name}' 스킬을 찾을 수 없습니다. skill_manager(action: list)로 목록을 확인하세요."); + + var sb = new StringBuilder(); + sb.AppendLine($"스킬 상세: {skill.Label} (/{skill.Name})"); + sb.AppendLine($"설명: {skill.Description}"); + sb.AppendLine($"파일: {skill.FilePath}"); + sb.AppendLine($"\n--- 시스템 프롬프트 ---\n{skill.SystemPrompt}"); + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult ReloadSkills(AgentContext context) + { + var customFolder = context.Llm?.SkillsFolderPath ?? ""; + SkillService.LoadSkills(customFolder); + return ToolResult.Ok($"스킬 재로드 완료. {SkillService.Skills.Count}개 로드됨."); + } +} diff --git a/src/AxCopilot/Services/Agent/SkillService.cs b/src/AxCopilot/Services/Agent/SkillService.cs new file mode 100644 index 0000000..96e7e5b --- /dev/null +++ b/src/AxCopilot/Services/Agent/SkillService.cs @@ -0,0 +1,661 @@ +using System.IO; +using System.IO.Compression; +using System.Text; +using AxCopilot.Services; + +namespace AxCopilot.Services.Agent; + +/// +/// 마크다운 기반 스킬 정의를 로드/관리하는 서비스. +/// *.skill.md 파일의 YAML 프론트매터를 파싱하여 슬래시 명령으로 노출합니다. +/// 외부 폴더(%APPDATA%\AxCopilot\skills\) 또는 앱 기본 폴더에서 로드합니다. +/// +public static class SkillService +{ + private static List _skills = new(); + private static string _lastFolder = ""; + + /// 로드된 스킬 목록. + public static IReadOnlyList Skills => _skills; + + /// 스킬 폴더에서 *.skill.md 파일을 로드합니다. + public static void LoadSkills(string? customFolder = null) + { + var folders = new List(); + + // 1) 앱 기본 스킬 폴더 + var defaultFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "skills"); + if (Directory.Exists(defaultFolder)) folders.Add(defaultFolder); + + // 2) 사용자 스킬 폴더 (%APPDATA%\AxCopilot\skills\) + var appDataFolder = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "skills"); + if (Directory.Exists(appDataFolder)) folders.Add(appDataFolder); + + // 3) 사용자 지정 폴더 + if (!string.IsNullOrEmpty(customFolder) && Directory.Exists(customFolder)) + folders.Add(customFolder); + + var allSkills = new List(); + var seen = new HashSet(StringComparer.OrdinalIgnoreCase); + + foreach (var folder in folders) + { + // 1) 기존 형식: *.skill.md 파일 + foreach (var file in Directory.GetFiles(folder, "*.skill.md")) + { + try + { + var skill = ParseSkillFile(file); + if (skill != null && seen.Add(skill.Name)) + allSkills.Add(skill); + } + catch (Exception ex) + { + LogService.Warn($"스킬 로드 실패 [{file}]: {ex.Message}"); + } + } + + // 2) SKILL.md 표준: 하위폴더/SKILL.md 구조 (재귀 + 콜론 네임스페이싱) + // Phase 24: database/migrate/SKILL.md → "database:migrate" + try + { + LoadSkillsRecursive(folder, folder, allSkills, seen); + } + catch (Exception) { /* 폴더 접근 오류 무시 */ } + } + + // 런타임 의존성 검증 + foreach (var skill in allSkills) + { + if (!string.IsNullOrEmpty(skill.Requires)) + { + var runtimes = skill.Requires.Split(',').Select(r => r.Trim()); + skill.IsAvailable = runtimes.All(r => RuntimeDetector.IsAvailable(r)); + } + } + + _skills = allSkills; + _lastFolder = customFolder ?? ""; + var unavailCount = allSkills.Count(s => !s.IsAvailable); + LogService.Info($"스킬 {allSkills.Count}개 로드 완료" + + (unavailCount > 0 ? $" (런타임 미충족 {unavailCount}개)" : "")); + } + + /// 스킬 이름으로 검색합니다. + public static SkillDefinition? Find(string name) => + _skills.FirstOrDefault(s => s.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + + /// + /// Phase 19-D-EXT: 스킬 본문에 인수 치환 + 인라인 명령 처리를 적용합니다. + /// 호출 시점: 스킬이 로드된 후, LLM 프롬프트로 전달하기 직전. + /// + /// 실행할 스킬. + /// 사용자가 전달한 인수 (예: /skill arg1 arg2). + /// 셸 명령 실행 작업 디렉토리. + /// 취소 토큰. + /// 인수 치환 + 인라인 명령이 처리된 프롬프트. + public static async Task PrepareSkillBodyAsync( + SkillDefinition skill, + string arguments, + string workFolder, + CancellationToken ct) + { + var body = skill.SystemPrompt; + + // 1) 인수 치환 ($ARGUMENTS, $name, {0}) + var namedArgs = skill.Arguments.Count > 0 ? skill.Arguments : null; + body = SkillArgumentSubstitution.Substitute(body, namedArgs, arguments); + + // 2) 인라인 셸 커맨드 (!`command`) + body = await SkillInlineCommandProcessor.ProcessAsync(body, workFolder, ct); + + return body; + } + + /// 슬래시 명령어 매칭용: /로 시작하는 텍스트에 매칭되는 스킬 목록. + public static List MatchSlashCommand(string input) + { + if (!input.StartsWith('/')) return new(); + return _skills + .Where(s => s.UserInvocable) // Phase 24: user-invocable: false 스킬 제외 + .Where(s => ("/" + s.Name).StartsWith(input, StringComparison.OrdinalIgnoreCase)) + .ToList(); + } + + /// 스킬 폴더가 없으면 생성하고 예제 스킬을 배치합니다. + public static void EnsureSkillFolder() + { + var folder = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "skills"); + if (!Directory.Exists(folder)) + Directory.CreateDirectory(folder); + + // 예제 스킬이 없으면 생성 + CreateExampleSkill(folder, "daily-standup.skill.md", + "daily-standup", "데일리 스탠드업", + "작업 폴더의 최근 변경사항을 요약하여 데일리 스탠드업 보고서를 생성합니다.", + """ + 작업 폴더의 Git 상태와 최근 커밋을 분석하여 데일리 스탠드업 보고서를 작성하세요. + + 다음 도구를 사용하세요: + 1. git_tool (action: log, args: "--oneline -10") — 최근 커밋 확인 + 2. git_tool (action: status) — 현재 변경사항 확인 + 3. git_tool (action: diff, args: "--stat") — 변경 파일 통계 + + 보고서 형식: + ## 📋 데일리 스탠드업 보고서 + + ### ✅ 완료한 작업 + - 최근 커밋 기반으로 정리 + + ### 🔄 진행 중인 작업 + - 현재 수정 중인 파일 기반 + + ### ⚠️ 블로커/이슈 + - TODO/FIXME가 있으면 표시 + + 한국어로 작성하세요. + """); + + CreateExampleSkill(folder, "bug-hunt.skill.md", + "bug-hunt", "버그 탐색", + "작업 폴더에서 잠재적 버그 패턴을 검색합니다.", + """ + 작업 폴더의 코드에서 잠재적 버그 패턴을 찾아 보고하세요. + + 다음 도구를 사용하세요: + 1. grep_tool — 위험 패턴 검색: + - 빈 catch 블록: catch\s*\{\s*\} + - TODO/FIXME: (TODO|FIXME|HACK|XXX) + - .Result/.Wait(): \.(Result|Wait\(\)) + - 하드코딩된 자격증명: (password|secret|apikey)\s*=\s*" + 2. code_review (action: diff_review, focus: bugs) — 최근 변경사항 버그 검사 + + 결과를 심각도별로 분류하여 보고하세요: + - 🔴 CRITICAL: 즉시 수정 필요 + - 🟡 WARNING: 검토 필요 + - 🔵 INFO: 개선 권장 + + 한국어로 작성하세요. + """); + + CreateExampleSkill(folder, "code-explain.skill.md", + "code-explain", "코드 설명", + "지정한 파일의 코드를 상세히 설명합니다.", + """ + 사용자가 지정한 파일 또는 작업 폴더의 주요 파일을 읽고 상세히 설명하세요. + + 다음 도구를 사용하세요: + 1. file_read — 파일 내용 읽기 + 2. folder_map — 프로젝트 구조 파악 (필요시) + + 설명 포함 사항: + - 파일의 역할과 책임 + - 주요 클래스/함수의 목적 + - 데이터 흐름 + - 외부 의존성 + - 개선 포인트 (있다면) + + 한국어로 쉽게 설명하세요. 코드 블록을 활용하여 핵심 부분을 인용하세요. + """); + } + + // ─── 가져오기/내보내기 ────────────────────────────────────────────────── + + /// + /// 스킬을 zip 파일로 내보냅니다. + /// zip 구조: skill-name/ 폴더 안에 .skill.md 파일 (+ SKILL.md 표준의 경우 전체 폴더). + /// + /// 생성된 zip 파일 경로. 실패 시 null. + public static string? ExportSkill(SkillDefinition skill, string outputDir) + { + try + { + if (!File.Exists(skill.FilePath)) + { + LogService.Warn($"스킬 내보내기 실패: 파일 없음 — {skill.FilePath}"); + return null; + } + + var zipName = $"{skill.Name}.skill.zip"; + var zipPath = Path.Combine(outputDir, zipName); + + // 기존 파일이 있으면 삭제 + if (File.Exists(zipPath)) File.Delete(zipPath); + + using var zip = ZipFile.Open(zipPath, ZipArchiveMode.Create); + + if (skill.IsStandardFormat) + { + // SKILL.md 표준: 전체 폴더를 zip에 추가 + var skillDir = Path.GetDirectoryName(skill.FilePath); + if (skillDir != null && Directory.Exists(skillDir)) + { + var baseName = Path.GetFileName(skillDir); + foreach (var file in Directory.EnumerateFiles(skillDir, "*", SearchOption.AllDirectories)) + { + // 실행 가능 파일 제외 + var ext = Path.GetExtension(file).ToLowerInvariant(); + if (ext is ".exe" or ".dll" or ".bat" or ".cmd" or ".ps1" or ".sh") continue; + + var entryName = baseName + "/" + Path.GetRelativePath(skillDir, file).Replace('\\', '/'); + zip.CreateEntryFromFile(file, entryName, CompressionLevel.Optimal); + } + } + } + else + { + // *.skill.md 파일 단독 + var entryName = $"{skill.Name}/{Path.GetFileName(skill.FilePath)}"; + zip.CreateEntryFromFile(skill.FilePath, entryName, CompressionLevel.Optimal); + } + + LogService.Info($"스킬 내보내기 완료: {zipPath}"); + return zipPath; + } + catch (Exception ex) + { + LogService.Warn($"스킬 내보내기 실패: {ex.Message}"); + return null; + } + } + + /// + /// zip 파일에서 스킬을 가져옵니다. + /// zip 안의 .skill.md 또는 SKILL.md 파일을 사용자 스킬 폴더에 설치합니다. + /// + /// 가져온 스킬 수. 0이면 실패. + public static int ImportSkills(string zipPath) + { + try + { + if (!File.Exists(zipPath)) + { + LogService.Warn($"스킬 가져오기 실패: 파일 없음 — {zipPath}"); + return 0; + } + + var userFolder = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "skills"); + if (!Directory.Exists(userFolder)) + Directory.CreateDirectory(userFolder); + + using var zip = ZipFile.OpenRead(zipPath); + + // 보안 검증: 실행 가능 파일 차단 + var dangerousExts = new HashSet(StringComparer.OrdinalIgnoreCase) + { ".exe", ".dll", ".bat", ".cmd", ".ps1", ".sh", ".com", ".scr", ".msi" }; + foreach (var entry in zip.Entries) + { + if (dangerousExts.Contains(Path.GetExtension(entry.Name))) + { + LogService.Warn($"스킬 가져오기 차단: 실행 가능 파일 포함 — {entry.FullName}"); + return 0; + } + } + + // 스킬 파일 존재 여부 확인 + var skillEntries = zip.Entries + .Where(e => e.Name.EndsWith(".skill.md", StringComparison.OrdinalIgnoreCase) + || e.Name.Equals("SKILL.md", StringComparison.OrdinalIgnoreCase)) + .ToList(); + if (skillEntries.Count == 0) + { + LogService.Warn("스킬 가져오기 실패: zip에 .skill.md 또는 SKILL.md 파일 없음"); + return 0; + } + + // zip 압축 해제 + int importedCount = 0; + foreach (var entry in zip.Entries) + { + if (string.IsNullOrEmpty(entry.Name)) continue; // 디렉토리 항목 건너뛰기 + + // 상위 경로 이탈 방지 + var relativePath = entry.FullName.Replace('/', Path.DirectorySeparatorChar); + if (relativePath.Contains("..")) continue; + + var destPath = Path.Combine(userFolder, relativePath); + var destDir = Path.GetDirectoryName(destPath); + if (destDir != null && !Directory.Exists(destDir)) + Directory.CreateDirectory(destDir); + + entry.ExtractToFile(destPath, overwrite: true); + + if (entry.Name.EndsWith(".skill.md", StringComparison.OrdinalIgnoreCase) + || entry.Name.Equals("SKILL.md", StringComparison.OrdinalIgnoreCase)) + importedCount++; + } + + if (importedCount > 0) + { + LogService.Info($"스킬 가져오기 완료: {importedCount}개 스킬 ({zipPath})"); + // 스킬 목록 리로드 + LoadSkills(); + } + + return importedCount; + } + catch (Exception ex) + { + LogService.Warn($"스킬 가져오기 실패: {ex.Message}"); + return 0; + } + } + + // ─── 도구 이름 매핑 (외부 스킬 호환) ────────────────────────────────────── + + /// + /// 외부 스킬(agentskills.io 등)의 도구 이름을 AX Copilot 내부 도구 이름으로 매핑합니다. + /// 스킬 시스템 프롬프트에서 외부 도구명을 내부 도구명으로 치환하여 호환성을 확보합니다. + /// + private static readonly Dictionary ToolNameMap = new(StringComparer.OrdinalIgnoreCase) + { + // Claude Code / Cursor 표준 + ["Bash"] = "process", + ["bash"] = "process", + ["Read"] = "file_read", + ["Write"] = "file_write", + ["Edit"] = "file_edit", + ["Glob"] = "glob", + ["Grep"] = "grep_tool", + ["WebSearch"] = "http_tool", + ["WebFetch"] = "http_tool", + // agentskills.io 표준 + ["execute_command"] = "process", + ["read_file"] = "file_read", + ["write_file"] = "file_write", + ["edit_file"] = "file_edit", + ["search_files"] = "glob", + ["search_content"] = "grep_tool", + ["list_files"] = "folder_map", + // 기타 일반적 도구명 + ["shell"] = "process", + ["terminal"] = "process", + ["cat"] = "file_read", + ["find"] = "glob", + ["rg"] = "grep_tool", + ["git"] = "git_tool", + }; + + /// 스킬 본문의 외부 도구 이름을 내부 도구 이름으로 매핑합니다. + public static string MapToolNames(string skillBody) + { + if (string.IsNullOrEmpty(skillBody)) return skillBody; + + foreach (var kv in ToolNameMap) + { + // 코드 블록 내 도구 참조: `Bash`, `Read` 등을 `process`, `file_read`로 변환 + skillBody = skillBody.Replace($"`{kv.Key}`", $"`{kv.Value}`"); + // 괄호 내 참조: (Bash), (Read) 패턴 + skillBody = skillBody.Replace($"({kv.Key})", $"({kv.Value})"); + } + + return skillBody; + } + + // ─── 내부 메서드 ───────────────────────────────────────────────────────── + + /// + /// Phase 24: 하위 디렉토리를 재귀 탐색하여 SKILL.md를 찾고, + /// 경로를 콜론(:)으로 구분된 네임스페이스 이름으로 변환합니다. + /// 예: skills/database/migrate/SKILL.md → "database:migrate" + /// + private static void LoadSkillsRecursive( + string rootFolder, + string currentFolder, + List allSkills, + HashSet seen) + { + foreach (var subDir in Directory.GetDirectories(currentFolder)) + { + var skillMd = Path.Combine(subDir, "SKILL.md"); + if (File.Exists(skillMd)) + { + try + { + // 네임스페이스: rootFolder로부터의 상대경로를 콜론으로 치환 + var relativePath = Path.GetRelativePath(rootFolder, subDir).Replace('\\', '/'); + var namespacedName = relativePath.Replace('/', ':'); + + var skill = ParseSkillFile(skillMd, namespacedName); + if (skill != null && seen.Add(skill.Name)) + allSkills.Add(skill); + } + catch (Exception ex) + { + LogService.Warn($"스킬 로드 ��패 [{skillMd}]: {ex.Message}"); + } + } + else + { + // SKILL.md가 없는 중간 디렉토리 → 더 깊이 ���색 + LoadSkillsRecursive(rootFolder, subDir, allSkills, seen); + } + } + } + + private static void CreateExampleSkill(string folder, string fileName, string name, string label, string description, string body) + { + var path = Path.Combine(folder, fileName); + if (File.Exists(path)) return; + + var content = $""" + --- + name: {name} + label: {label} + description: {description} + icon: \uE768 + --- + + {body.Trim()} + """; + // 들여쓰기 정리 (raw string literal의 인덴트 제거) + var lines = content.Split('\n').Select(l => l.TrimStart()).ToArray(); + File.WriteAllText(path, string.Join('\n', lines), Encoding.UTF8); + } + + /// *.skill.md 파일을 파싱합니다. + private static SkillDefinition? ParseSkillFile(string filePath) => ParseSkillFile(filePath, null); + + /// *.skill.md 파일을 파싱합니다. namespacedName이 주어지면 이름 오버라이드. + private static SkillDefinition? ParseSkillFile(string filePath, string? namespacedName) + { + var content = File.ReadAllText(filePath, Encoding.UTF8); + if (!content.TrimStart().StartsWith("---")) + return null; + + // 프론트매터 추출 + var firstSep = content.IndexOf("---", StringComparison.Ordinal); + var secondSep = content.IndexOf("---", firstSep + 3, StringComparison.Ordinal); + if (secondSep < 0) return null; + + var frontmatter = content[(firstSep + 3)..secondSep].Trim(); + var body = content[(secondSep + 3)..].Trim(); + + // 키-값 파싱 (YAML 1단계 + metadata 맵 지원) + var meta = new Dictionary(StringComparer.OrdinalIgnoreCase); + string? currentMap = null; + foreach (var line in frontmatter.Split('\n')) + { + // 들여쓰기된 줄 → 현재 맵의 하위 키 + if (currentMap != null && (line.StartsWith(" ") || line.StartsWith("\t"))) + { + var trimmed = line.TrimStart(); + var colonIdx = trimmed.IndexOf(':'); + if (colonIdx > 0) + { + var subKey = trimmed[..colonIdx].Trim(); + var subVal = trimmed[(colonIdx + 1)..].Trim().Trim('"', '\''); + meta[$"{currentMap}.{subKey}"] = subVal; + } + continue; + } + currentMap = null; + + var ci = line.IndexOf(':'); + if (ci > 0) + { + var key = line[..ci].Trim(); + var value = line[(ci + 1)..].Trim().Trim('"', '\''); + if (string.IsNullOrEmpty(value)) + { + // 빈 값 = 맵 시작 (metadata:) + currentMap = key; + } + else + { + meta[key] = value; + } + } + } + + // 폴더명을 기본 이름으로 사용 (SKILL.md 표준: 폴더명 = name) + var dirName = Path.GetFileName(Path.GetDirectoryName(filePath) ?? ""); + var fileName = Path.GetFileNameWithoutExtension(filePath).Replace(".skill", ""); + var fallbackName = filePath.EndsWith("SKILL.md", StringComparison.OrdinalIgnoreCase) ? dirName : fileName; + + // Phase 24: 네임스페이스 이름 우선, 그 다음 프론트매터, 그 다음 폴더명 + var name = namespacedName ?? meta.GetValueOrDefault("name", fallbackName); + if (string.IsNullOrEmpty(name)) return null; + + // SKILL.md 표준: label/icon은 metadata 맵에 있을 수 있음 + var label = meta.GetValueOrDefault("label", "") ?? ""; + var icon = meta.GetValueOrDefault("icon", "") ?? ""; + + // metadata.label / metadata.icon 지원 (SKILL.md 표준) + if (string.IsNullOrEmpty(label) && meta.TryGetValue("metadata.label", out var ml)) + label = ml ?? ""; + if (string.IsNullOrEmpty(icon) && meta.TryGetValue("metadata.icon", out var mi)) + icon = mi ?? ""; + + // Phase 24: arguments 필드 파싱 (YAML 리스트 또는 쉼표 구분) + var argsRaw = meta.GetValueOrDefault("arguments", "") ?? ""; + var arguments = string.IsNullOrWhiteSpace(argsRaw) + ? Array.Empty() + : argsRaw.Trim('[', ']').Split(',').Select(a => a.Trim().Trim('"', '\'')).Where(a => a.Length > 0).ToArray(); + + // user-invocable: 기본 true, "false"면 false + var userInvocable = !string.Equals( + meta.GetValueOrDefault("user-invocable", "true"), "false", StringComparison.OrdinalIgnoreCase); + + return new SkillDefinition + { + Id = name, + Name = name, + Label = string.IsNullOrEmpty(label) ? name : label, + Description = meta.GetValueOrDefault("description", "") ?? "", + Icon = string.IsNullOrEmpty(icon) ? "\uE768" : ConvertUnicodeEscape(icon), + SystemPrompt = MapToolNames(body), + FilePath = filePath, + License = meta.GetValueOrDefault("license", "") ?? "", + Compatibility = meta.GetValueOrDefault("compatibility", "") ?? "", + AllowedTools = meta.GetValueOrDefault("allowed-tools", "") ?? "", + Requires = meta.GetValueOrDefault("requires", "") ?? "", + Tabs = meta.GetValueOrDefault("tabs", "all") ?? "all", + // Phase 24: 고급 프론트매터 필드 + Context = meta.GetValueOrDefault("context", "") ?? "", + ModelOverride = meta.GetValueOrDefault("model", "") ?? "", + UserInvocable = userInvocable, + Paths = meta.GetValueOrDefault("paths", "") ?? "", + ScopedHooks = meta.GetValueOrDefault("hooks", "") ?? "", + Arguments = arguments, + WhenToUse = meta.GetValueOrDefault("when_to_use", + meta.GetValueOrDefault("when-to-use", "") ?? "") ?? "", + Version = meta.GetValueOrDefault("version", "") ?? "", + }; + } + + /// YAML의 \uXXXX 이스케이프를 실제 유니코드 문자로 변환합니다. + private static string ConvertUnicodeEscape(string value) + { + if (string.IsNullOrEmpty(value)) return value; + return System.Text.RegularExpressions.Regex.Replace( + value, @"\\u([0-9a-fA-F]{4})", + m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString()); + } +} + +/// 스킬 정의 (*.skill.md에서 로드). +public class SkillDefinition +{ + public string Id { get; init; } = ""; + public string Name { get; init; } = ""; + public string Label { get; init; } = ""; + public string Description { get; init; } = ""; + public string Icon { get; init; } = "\uE768"; + public string SystemPrompt { get; init; } = ""; + public string FilePath { get; init; } = ""; + + // SKILL.md 표준 확장 필드 + public string License { get; init; } = ""; + public string Compatibility { get; init; } = ""; + public string AllowedTools { get; init; } = ""; + + /// 런타임 의존성. "python", "node", "python,node" 등. 빈 문자열이면 의존성 없음. + public string Requires { get; init; } = ""; + + /// 표시 대상 탭. "all"=전체, "cowork"=코워크만, "code"=코드만. 쉼표 구분 가능. + public string Tabs { get; init; } = "all"; + + // ── Phase 24: CC 고급 프론트매터 필드 ── + + /// 실행 컨텍스트. "fork"이면 격리된 서브에이전트에서 실행. + public string Context { get; init; } = ""; + + /// 이 스킬에 사용할 모델 오버라이드. 빈 문자열이면 기본 모델 사용. + public string ModelOverride { get; init; } = ""; + + /// 사용자가 /로 호출 가능한지 여부. false면 AI만 사용. + public bool UserInvocable { get; init; } = true; + + /// 자동 활성화 경로 패턴. "**/*.py" 등 — 매칭 파일 터치 시 스킬 자동 제안. + public string Paths { get; init; } = ""; + + /// 스킬 실행 중에만 활성화되는 스코프 훅 정의 (JSON). + public string ScopedHooks { get; init; } = ""; + + /// 프론트매터 arguments 필드. 명명된 인수 목록. + public IReadOnlyList Arguments { get; init; } = Array.Empty(); + + /// 자동 활성화 안내 (when_to_use). AI가 이 스킬을 선제적으로 사용할 힌트. + public string WhenToUse { get; init; } = ""; + + /// 스킬 버전. + public string Version { get; init; } = ""; + + /// 런타임 의존성 충족 여부. Requires가 비어있으면 항상 true. + public bool IsAvailable { get; set; } = true; + + /// context:fork 설정인지 여부. + public bool IsForkContext => "fork".Equals(Context, StringComparison.OrdinalIgnoreCase); + + /// 지정 탭에서 이 스킬을 표시할지 판정합니다. + public bool IsVisibleInTab(string activeTab) + { + if (string.IsNullOrEmpty(Tabs) || Tabs.Equals("all", StringComparison.OrdinalIgnoreCase)) + return true; + var tabs = Tabs.Split(',').Select(t => t.Trim().ToLowerInvariant()); + var tab = activeTab.ToLowerInvariant(); + return tabs.Any(t => t == "all" || t == tab); + } + + /// SKILL.md 표준 폴더 형식인지 여부. + public bool IsStandardFormat => FilePath.EndsWith("SKILL.md", StringComparison.OrdinalIgnoreCase); + + /// 비가용 시 사용자에게 표시할 힌트 메시지. + public string UnavailableHint + { + get + { + if (IsAvailable || string.IsNullOrEmpty(Requires)) return ""; + var runtimes = Requires.Split(',').Select(r => r.Trim()); + var missing = runtimes.Where(r => !RuntimeDetector.IsAvailable(r)).ToArray(); + return missing.Length > 0 ? $"({string.Join(", ", missing.Select(r => char.ToUpper(r[0]) + r[1..]))} 필요)" : ""; + } + } +} diff --git a/src/AxCopilot/Services/Agent/SkillServiceExtensions.cs b/src/AxCopilot/Services/Agent/SkillServiceExtensions.cs new file mode 100644 index 0000000..caa415e --- /dev/null +++ b/src/AxCopilot/Services/Agent/SkillServiceExtensions.cs @@ -0,0 +1,164 @@ +using System.IO; +using System.Text; + +namespace AxCopilot.Services.Agent; + +/// +/// Phase 17-D: SkillService에 경로 기반 활성화 및 fork 컨텍스트 지원 추가. +/// SkillService.LoadSkills() 호출 후 이 클래스로 확장 데이터를 보강합니다. +/// +public static class SkillServiceExtensions +{ + /// + /// 로드된 스킬 목록에서 Phase 17-D 확장 프론트매터를 파싱하여 SkillExtensionStore에 저장. + /// SkillService.LoadSkills() 직후 호출하세요. + /// + public static void LoadExtendedFrontmatter(IReadOnlyList skills) + { + SkillExtensionStore.Clear(); + + foreach (var skill in skills) + { + if (string.IsNullOrEmpty(skill.FilePath) || !File.Exists(skill.FilePath)) + continue; + + try + { + var ext = ParseExtendedFrontmatter(skill.FilePath); + if (ext != null) + SkillExtensionStore.Set(skill.Id, ext); + } + catch (Exception) { } + } + } + + private static SkillExtData? ParseExtendedFrontmatter(string filePath) + { + var content = File.ReadAllText(filePath, Encoding.UTF8); + if (!content.TrimStart().StartsWith("---")) return null; + + var firstSep = content.IndexOf("---", StringComparison.Ordinal); + var secondSep = content.IndexOf("---", firstSep + 3, StringComparison.Ordinal); + if (secondSep < 0) return null; + + var frontmatter = content[(firstSep + 3)..secondSep].Trim(); + + var data = new SkillExtData(); + bool hasExtFields = false; + + foreach (var line in frontmatter.Split('\n')) + { + var ci = line.IndexOf(':'); + if (ci <= 0) continue; + var key = line[..ci].Trim().ToLowerInvariant(); + var value = line[(ci + 1)..].Trim().Trim('"', '\''); + + switch (key) + { + case "context": + if (value.Equals("fork", StringComparison.OrdinalIgnoreCase)) + { + data.ContextMode = SkillContextMode.Fork; + hasExtFields = true; + } + break; + case "model": + if (!string.IsNullOrEmpty(value)) + { + data.ModelOverride = value; + hasExtFields = true; + } + break; + case "user-invocable": + case "user_invocable": + data.UserInvocable = !value.Equals("false", StringComparison.OrdinalIgnoreCase); + hasExtFields = true; + break; + case "paths": + // 단일 값 또는 YAML 리스트 첫 줄 + if (!string.IsNullOrEmpty(value)) + { + data.PathPatterns.Add(value); + hasExtFields = true; + } + break; + } + } + + // paths: 여러 줄 파싱 (YAML 리스트: " - pattern" 형식) + var inPaths = false; + foreach (var line in frontmatter.Split('\n')) + { + var trimmed = line.Trim(); + if (trimmed.StartsWith("paths:")) + { + inPaths = true; + continue; + } + if (inPaths) + { + if (trimmed.StartsWith("-")) + { + var pat = trimmed.TrimStart('-').Trim().Trim('"', '\''); + if (!string.IsNullOrEmpty(pat) && !data.PathPatterns.Contains(pat)) + { + data.PathPatterns.Add(pat); + hasExtFields = true; + } + } + else if (!string.IsNullOrWhiteSpace(trimmed) && trimmed.Contains(':')) + { + inPaths = false; + } + } + } + + return hasExtFields ? data : null; + } + + /// 사용자 호출 가능한 스킬만 필터링 (슬래시 메뉴용). + public static IReadOnlyList GetUserInvocable(IReadOnlyList skills) + => skills.Where(s => + { + var ext = SkillExtensionStore.Get(s.Id); + return ext == null || ext.UserInvocable; + }).ToList(); + + /// paths 패턴이 등록된 스킬 목록 반환. + public static IReadOnlyList GetPathScoped(IReadOnlyList skills) + => skills.Where(s => + { + var ext = SkillExtensionStore.Get(s.Id); + return ext != null && ext.PathPatterns.Count > 0; + }).ToList(); +} + +/// PathPatterns 접근용 SkillDefinition 확장 메서드. +public static class SkillDefinitionExtensions +{ + public static IReadOnlyList GetPathPatterns(this SkillDefinition skill) + { + // Phase 24: SkillDefinition.Paths 필드 우선, 없으면 ExtensionStore 폴백 + if (!string.IsNullOrEmpty(skill.Paths)) + { + return skill.Paths.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries) + .ToList(); + } + return SkillExtensionStore.Get(skill.Id)?.PathPatterns ?? new List(); + } + + public static SkillContextMode GetContextMode(this SkillDefinition skill) + { + if (skill.IsForkContext) return SkillContextMode.Fork; + return SkillExtensionStore.Get(skill.Id)?.ContextMode ?? SkillContextMode.Default; + } + + public static string? GetModelOverride(this SkillDefinition skill) + { + if (!string.IsNullOrEmpty(skill.ModelOverride)) return skill.ModelOverride; + return SkillExtensionStore.Get(skill.Id)?.ModelOverride; + } + + public static bool IsUserInvocable(this SkillDefinition skill) + => skill.UserInvocable && (SkillExtensionStore.Get(skill.Id)?.UserInvocable ?? true); +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/ClearCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/ClearCommand.cs new file mode 100644 index 0000000..aac0ebb --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/ClearCommand.cs @@ -0,0 +1,17 @@ +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /clear — 대화 기록 초기화. +public class ClearCommand : ISlashCommand +{ + public string Name => "clear"; + public string[] Aliases => new[] { "reset", "new" }; + public string Description => "대화 기록을 지우고 새 세션을 시작합니다"; + public string? ArgumentHint => null; + public bool RequiresActiveSession => false; + + public Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + ctx.ClearMessages(); + return ctx.SendSystemMessageAsync("새 대화가 시작되었습니다."); + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/CommitCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/CommitCommand.cs new file mode 100644 index 0000000..dd7db44 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/CommitCommand.cs @@ -0,0 +1,108 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /commit — AI 커밋 메시지 생성. +public class CommitCommand : ISlashCommand +{ + public string Name => "commit"; + public string[] Aliases => Array.Empty(); + public string Description => "AI가 생성한 메시지로 git 커밋을 만듭니다"; + public string? ArgumentHint => null; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var workDir = ctx.WorkFolder; + if (string.IsNullOrEmpty(workDir) || !Directory.Exists(workDir)) + { + await ctx.SendSystemMessageAsync("작업 폴더가 설정되지 않았습니다."); + return; + } + + // 1. git status 확인 + var statusResult = await RunGitAsync("status --porcelain", workDir, ct); + if (string.IsNullOrWhiteSpace(statusResult)) + { + await ctx.SendSystemMessageAsync("커밋할 변경 사항이 없습니다."); + return; + } + + // 2. git diff 가져오기 + var diffResult = await RunGitAsync("diff --cached", workDir, ct); + if (string.IsNullOrWhiteSpace(diffResult)) + diffResult = await RunGitAsync("diff", workDir, ct); + + if (string.IsNullOrWhiteSpace(diffResult)) + { + await ctx.SendSystemMessageAsync("diff가 비어 있습니다. `git add`를 먼저 실행하세요."); + return; + } + + // 3. LLM에게 커밋 메시지 생성 요청 + var truncatedDiff = diffResult.Length > 8000 ? diffResult[..8000] + "\n..." : diffResult; + var prompt = $""" + 아래 git diff를 분석하고 간결한 커밋 메시지를 작성하세요. + - 첫 줄: 50자 이내 제목 (무엇을 왜) + - 빈 줄 후 본문: 변경 이유와 영향 (필요시) + - 커밋 메시지만 출력하세요 (설명 없이) + + git status: + {statusResult} + + diff: + {truncatedDiff} + """; + + await ctx.SendSystemMessageAsync("커밋 메시지를 생성하고 있습니다..."); + + try + { + var messages = new List + { + new() { Role = "user", Content = prompt } + }; + var commitMsg = await ctx.Llm.SendAsync(messages, ct); + commitMsg = commitMsg.Trim().Trim('`').Trim(); + + await ctx.SendSystemMessageAsync( + $"## 제안된 커밋 메시지\n```\n{commitMsg}\n```\n\n이 메시지로 커밋하려면 `yes`를 입력하세요."); + } + catch (Exception ex) + { + await ctx.SendSystemMessageAsync($"커밋 메시지 생성 실패: {ex.Message}"); + } + } + + private static async Task RunGitAsync(string args, string workDir, CancellationToken ct) + { + try + { + var psi = new ProcessStartInfo + { + FileName = "git", + Arguments = args, + WorkingDirectory = workDir, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + }; + + using var proc = Process.Start(psi); + if (proc == null) return ""; + + var output = await proc.StandardOutput.ReadToEndAsync(ct); + await proc.WaitForExitAsync(ct); + return output; + } + catch (Exception) + { + return ""; + } + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/CompactCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/CompactCommand.cs new file mode 100644 index 0000000..0e9c688 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/CompactCommand.cs @@ -0,0 +1,37 @@ +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /compact — 대화 기록 요약으로 컨텍스트 절약. +public class CompactCommand : ISlashCommand +{ + public string Name => "compact"; + public string[] Aliases => Array.Empty(); + public string Description => "대화 기록을 요약하여 컨텍스트 사용량을 줄입니다"; + public string? ArgumentHint => "[요약 지시사항]"; + public bool RequiresActiveSession => true; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var instruction = string.IsNullOrWhiteSpace(arguments) + ? "위 대화를 핵심 결정사항, 작업 파일, 남은 작업 중심으로 간결하게 요약하세요." + : $"위 대화를 다음 지시에 따라 요약하세요: {arguments}"; + + await ctx.SendSystemMessageAsync("[컴팩션 시작] 대화를 요약하고 있습니다..."); + + try + { + var messages = new List + { + new() { Role = "user", Content = instruction } + }; + var summary = await ctx.Llm.SendAsync(messages, ct); + await ctx.SendSystemMessageAsync( + $"[컴팩션 완료] 대화가 요약되었습니다.\n\n---\n{summary}\n---"); + } + catch (Exception ex) + { + await ctx.SendSystemMessageAsync($"[컴팩션 실패] {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/ConfigCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/ConfigCommand.cs new file mode 100644 index 0000000..b92b689 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/ConfigCommand.cs @@ -0,0 +1,17 @@ +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /config — 설정 화면 열기. +public class ConfigCommand : ISlashCommand +{ + public string Name => "config"; + public string[] Aliases => new[] { "settings" }; + public string Description => "설정 패널을 엽니다"; + public string? ArgumentHint => null; + public bool RequiresActiveSession => false; + + public Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + ctx.ToggleSettingsPanel(); + return Task.CompletedTask; + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/HelpCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/HelpCommand.cs new file mode 100644 index 0000000..1b55a82 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/HelpCommand.cs @@ -0,0 +1,35 @@ +using System.Text; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /help — 사용 가능한 명령 목록 표시. +public class HelpCommand : ISlashCommand +{ + public string Name => "help"; + public string[] Aliases => Array.Empty(); + public string Description => "사용 가능한 명령 목록을 표시합니다"; + public string? ArgumentHint => null; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var sb = new StringBuilder("## AX Agent 명령\n\n"); + + // 내장 슬래시 명령 + sb.AppendLine("### 내장 명령"); + foreach (var cmd in ctx.CommandRegistry.GetAll().OrderBy(c => c.Name)) + { + var hint = cmd.ArgumentHint != null ? $" `{cmd.ArgumentHint}`" : ""; + var aliases = cmd.Aliases.Length > 0 + ? $" (별칭: {string.Join(", ", cmd.Aliases.Select(a => $"/{a}"))})" : ""; + sb.AppendLine($"- **/{cmd.Name}**{hint} — {cmd.Description}{aliases}"); + } + + // 스킬 수 요약 + var skillCount = ctx.LoadedSkills.Count; + if (skillCount > 0) + sb.AppendLine($"\n### 스킬 ({skillCount}개)\n`/skills`로 전체 목록을 확인하세요."); + + await ctx.SendSystemMessageAsync(sb.ToString()); + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/HooksCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/HooksCommand.cs new file mode 100644 index 0000000..098d533 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/HooksCommand.cs @@ -0,0 +1,57 @@ +using System.Text; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /hooks — 활성 훅 설정 표시. +public class HooksCommand : ISlashCommand +{ + public string Name => "hooks"; + public string[] Aliases => Array.Empty(); + public string Description => "활성화된 훅 설정을 표시합니다"; + public string? ArgumentHint => null; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var hooks = ctx.Hooks; + if (hooks.Count == 0) + { + await ctx.SendSystemMessageAsync("활성 훅이 없습니다. 설정에서 훅을 추가할 수 있습니다."); + return; + } + + var sb = new StringBuilder("## 활성 훅\n"); + + var groups = hooks.Where(h => h.Enabled).GroupBy(h => h.Event); + foreach (var group in groups.OrderBy(g => g.Key.ToString())) + { + sb.AppendLine($"\n### {group.Key}"); + foreach (var hook in group) + { + var matcher = string.IsNullOrEmpty(hook.Matcher) ? "(전체)" : hook.Matcher; + var target = hook.Mode switch + { + HookExecutionMode.Command => $"`{hook.ScriptPath ?? hook.Arguments}`", + HookExecutionMode.Http => $"`{hook.Url}`", + HookExecutionMode.Prompt => $"LLM: `{Truncate(hook.Prompt, 50)}`", + HookExecutionMode.Agent => $"Agent: `{Truncate(hook.Prompt, 50)}`", + _ => "(알 수 없음)", + }; + var flags = new List(); + if (hook.Once) flags.Add("once"); + if (hook.IsAsync) flags.Add("async"); + var flagStr = flags.Count > 0 ? $" [{string.Join(", ", flags)}]" : ""; + + sb.AppendLine($"- [{hook.Mode}] {matcher} → {target}{flagStr}"); + } + } + + await ctx.SendSystemMessageAsync(sb.ToString()); + } + + private static string Truncate(string? text, int max) + { + if (string.IsNullOrEmpty(text)) return ""; + return text.Length <= max ? text : text[..max] + "..."; + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/ISlashCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/ISlashCommand.cs new file mode 100644 index 0000000..1303ee7 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/ISlashCommand.cs @@ -0,0 +1,72 @@ +namespace AxCopilot.Services.Agent.SlashCommands; + +/// +/// Phase 22: 슬래시 명령 인터페이스 (Command 패턴). +/// /compact, /clear, /memory, /model 등 내장 명령과 스킬 명령을 통합 처리합니다. +/// +public interface ISlashCommand +{ + /// 명령 이름 (소문자). 예: "compact", "memory" + string Name { get; } + + /// 별칭 목록. 예: /config → /settings + string[] Aliases { get; } + + /// 명령 설명 (도움말 표시용). + string Description { get; } + + /// 인수 힌트 (자동완성 표시용). null이면 인수 없음. + string? ArgumentHint { get; } + + /// 활성 세션이 필요한 명령인지 여부. + bool RequiresActiveSession { get; } + + /// 명령을 실행합니다. + /// 명령 뒤에 전달된 인수 문자열 + /// 채팅 컨텍스트 (서비스 접근) + /// 취소 토큰 + Task ExecuteAsync(string arguments, IAgentChatContext context, CancellationToken ct); +} + +/// +/// 슬래시 명령이 채팅 서비스에 접근하기 위한 인터페이스 (DIP). +/// ChatWindow.xaml.cs에서 구현하여 주입합니다. +/// +public interface IAgentChatContext +{ + /// LLM 서비스. + LlmService Llm { get; } + + /// 설정 서비스. + SettingsService Settings { get; } + + /// 스킬 로더 (SkillService 정적 접근 래퍼). + IReadOnlyList LoadedSkills { get; } + + /// 훅 목록 (현재 설정 기반). + IReadOnlyList Hooks { get; } + + /// 현재 활성 탭. "Chat" | "Cowork" | "Code". + string ActiveTab { get; } + + /// 작업 폴더 경로. + string WorkFolder { get; } + + /// 슬래시 명령 레지스트리 (자기 참조, /help에서 사용). + SlashCommandRegistry CommandRegistry { get; } + + /// 시스템 메시지를 채팅에 표시합니다. + Task SendSystemMessageAsync(string message); + + /// 사용자 입력을 대기합니다. null이면 취소. + Task PromptUserAsync(string question); + + /// 채팅 메시지를 모두 지웁니다. + void ClearMessages(); + + /// 세션 헤더 (모델명, 모드 등)를 갱신합니다. + void UpdateSessionHeader(); + + /// 설정 패널을 토글합니다. + void ToggleSettingsPanel(); +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/InitCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/InitCommand.cs new file mode 100644 index 0000000..d33a8d6 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/InitCommand.cs @@ -0,0 +1,217 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// +/// Phase 26: /init — 프로젝트 초기화. +/// CC의 /init과 동등: 코드베이스를 분석하여 AX.md(프로젝트 규칙)를 자동 생성합니다. +/// +public class InitCommand : ISlashCommand +{ + public string Name => "init"; + public string[] Aliases => Array.Empty(); + public string Description => "프로젝트를 분석하여 AX.md 프로젝트 규칙을 자동 생성합니다"; + public string? ArgumentHint => null; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var workDir = ctx.WorkFolder; + if (string.IsNullOrEmpty(workDir) || !Directory.Exists(workDir)) + { + await ctx.SendSystemMessageAsync("작업 폴더가 설정되지 않았습니다."); + return; + } + + var axMdPath = Path.Combine(workDir, "AX.md"); + if (File.Exists(axMdPath)) + { + await ctx.SendSystemMessageAsync($"AX.md가 이미 존재합니다: `{axMdPath}`\n기존 파일을 덮어쓰려면 삭제 후 다시 실행하세요."); + return; + } + + await ctx.SendSystemMessageAsync("프로젝트를 분석하고 있습니다..."); + + // 1. 프로젝트 정보 수집 + var info = new StringBuilder(); + + // 프로젝트 구조 + info.AppendLine("## 프로젝트 구조"); + var structure = GetDirectoryTree(workDir, maxDepth: 3, maxItems: 50); + info.AppendLine($"```\n{structure}\n```"); + + // Git 정보 + var gitDir = Path.Combine(workDir, ".git"); + if (Directory.Exists(gitDir)) + { + info.AppendLine("\n## Git 정보"); + var branch = await RunCommandAsync("git", "branch --show-current", workDir, ct); + var remotes = await RunCommandAsync("git", "remote -v", workDir, ct); + var recentCommits = await RunCommandAsync("git", "log --oneline -5", workDir, ct); + if (!string.IsNullOrWhiteSpace(branch)) info.AppendLine($"- 현재 브랜치: {branch.Trim()}"); + if (!string.IsNullOrWhiteSpace(remotes)) info.AppendLine($"- 리모트:\n```\n{remotes.Trim()}\n```"); + if (!string.IsNullOrWhiteSpace(recentCommits)) info.AppendLine($"- 최근 커밋:\n```\n{recentCommits.Trim()}\n```"); + } + + // 프레임워크/언어 감지 + info.AppendLine("\n## 감지된 기술 스택"); + var detectedStack = DetectTechStack(workDir); + foreach (var item in detectedStack) info.AppendLine($"- {item}"); + + // 주요 설정 파일 내용 (작은 것만) + var configFiles = new[] { "package.json", "tsconfig.json", "*.csproj", "Cargo.toml", "go.mod", "pyproject.toml", "requirements.txt" }; + foreach (var pattern in configFiles) + { + var files = pattern.Contains('*') + ? Directory.GetFiles(workDir, pattern, SearchOption.TopDirectoryOnly) + : File.Exists(Path.Combine(workDir, pattern)) ? new[] { Path.Combine(workDir, pattern) } : Array.Empty(); + + foreach (var file in files.Take(2)) + { + var content = File.ReadAllText(file, Encoding.UTF8); + if (content.Length > 3000) content = content[..3000] + "\n..."; + info.AppendLine($"\n## {Path.GetFileName(file)}"); + info.AppendLine($"```\n{content.Trim()}\n```"); + } + } + + // 2. LLM에게 AX.md 생성 요청 + var prompt = $""" + 아래 프로젝트 정보를 분석하여 AX.md (프로젝트 규칙 파일)를 생성하세요. + + AX.md는 AI 에이전트가 이 프로젝트에서 작업할 때 참고하는 규칙 파일입니다. + 다음 섹션을 포함하세요: + + 1. **프로젝트 개요** — 프로젝트 이름, 목적, 기술 스택 요약 (2-3문장) + 2. **코드 컨벤션** — 언어/프레임워크에 맞는 명명 규칙, 파일 구조, 코딩 스타일 + 3. **빌드 & 테스트** — 빌드 명령, 테스트 실행 방법, 린트/포맷 도구 + 4. **작업 가이드라인** — PR 규칙, 커밋 메시지 형식, 브랜치 전략 + 5. **주의사항** — 민감 파일, 수정 금지 영역, 환경별 차이 + + 마크다운 형식으로 작성하세요. AX.md 내용만 출력하세요 (다른 설명 없이). + + {info} + """; + + try + { + var messages = new List + { + new() { Role = "user", Content = prompt } + }; + var axMdContent = await ctx.Llm.SendAsync(messages, ct); + + // 마크다운 코드 블록 래핑 제거 + axMdContent = axMdContent.Trim(); + if (axMdContent.StartsWith("```markdown")) + axMdContent = axMdContent[11..]; + else if (axMdContent.StartsWith("```")) + axMdContent = axMdContent[3..]; + if (axMdContent.EndsWith("```")) + axMdContent = axMdContent[..^3]; + axMdContent = axMdContent.Trim(); + + File.WriteAllText(axMdPath, axMdContent, Encoding.UTF8); + await ctx.SendSystemMessageAsync( + $"## AX.md 생성 완료\n\n`{axMdPath}`에 프로젝트 규칙이 생성되었습니다.\n내용을 검토하고 필요에 따라 수정하세요."); + } + catch (Exception ex) + { + await ctx.SendSystemMessageAsync($"AX.md 생성 실패: {ex.Message}"); + } + } + + private static string GetDirectoryTree(string rootDir, int maxDepth, int maxItems) + { + var sb = new StringBuilder(); + var count = 0; + BuildTree(sb, rootDir, "", maxDepth, 0, ref count, maxItems); + return sb.ToString(); + } + + private static void BuildTree(StringBuilder sb, string dir, string indent, int maxDepth, int depth, ref int count, int maxItems) + { + if (depth >= maxDepth || count >= maxItems) return; + + var skipDirs = new HashSet(StringComparer.OrdinalIgnoreCase) + { + "node_modules", ".git", "bin", "obj", ".vs", ".idea", "__pycache__", + "venv", ".venv", "dist", "build", ".next", "target", ".cache" + }; + + try + { + var entries = Directory.GetFileSystemEntries(dir) + .Select(e => new { Path = e, IsDir = Directory.Exists(e), Name = Path.GetFileName(e) }) + .Where(e => !e.IsDir || !skipDirs.Contains(e.Name)) + .OrderByDescending(e => e.IsDir) + .ThenBy(e => e.Name) + .ToList(); + + foreach (var entry in entries) + { + if (count >= maxItems) { sb.AppendLine($"{indent}... ({entries.Count - count}+ more)"); break; } + sb.AppendLine($"{indent}{(entry.IsDir ? "📁 " : " ")}{entry.Name}"); + count++; + if (entry.IsDir) + BuildTree(sb, entry.Path, indent + " ", maxDepth, depth + 1, ref count, maxItems); + } + } + catch (Exception) { } + } + + private static List DetectTechStack(string dir) + { + var stack = new List(); + bool Has(string file) => File.Exists(Path.Combine(dir, file)); + bool HasPattern(string pattern) => Directory.GetFiles(dir, pattern, SearchOption.TopDirectoryOnly).Length > 0; + + if (Has("package.json")) stack.Add("Node.js / npm"); + if (Has("tsconfig.json")) stack.Add("TypeScript"); + if (HasPattern("*.csproj")) stack.Add(".NET / C#"); + if (HasPattern("*.sln")) stack.Add("Visual Studio Solution"); + if (Has("Cargo.toml")) stack.Add("Rust / Cargo"); + if (Has("go.mod")) stack.Add("Go"); + if (Has("pyproject.toml") || Has("setup.py") || Has("requirements.txt")) stack.Add("Python"); + if (Has("Gemfile")) stack.Add("Ruby"); + if (Has("pom.xml") || Has("build.gradle")) stack.Add("Java"); + if (Has("docker-compose.yml") || Has("Dockerfile")) stack.Add("Docker"); + if (Has(".github/workflows")) stack.Add("GitHub Actions CI"); + if (Has("Makefile")) stack.Add("Make"); + + if (stack.Count == 0) stack.Add("(감지된 프레임워크 없음)"); + return stack; + } + + private static async Task RunCommandAsync(string cmd, string args, string workDir, CancellationToken ct) + { + try + { + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(10)); + + var psi = new ProcessStartInfo + { + FileName = cmd, + Arguments = args, + WorkingDirectory = workDir, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + }; + + using var proc = Process.Start(psi); + if (proc == null) return ""; + + var output = await proc.StandardOutput.ReadToEndAsync(cts.Token); + await proc.WaitForExitAsync(cts.Token); + return output; + } + catch (Exception) { return ""; } + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/InputRouter.cs b/src/AxCopilot/Services/Agent/SlashCommands/InputRouter.cs new file mode 100644 index 0000000..bdabf90 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/InputRouter.cs @@ -0,0 +1,73 @@ +namespace AxCopilot.Services.Agent.SlashCommands; + +/// +/// Phase 22: 사용자 입력 라우터. +/// 슬래시 명령 → 스킬 → 일반 메시지 순으로 라우팅합니다. +/// +public class InputRouter +{ + private readonly SlashCommandRegistry _slashCommands; + + public InputRouter(SlashCommandRegistry slashCommands) + { + _slashCommands = slashCommands; + } + + /// 사용자 입력을 분석하여 라우팅 결과를 반환합니다. + public InputRouteResult Route(string input) + { + if (string.IsNullOrWhiteSpace(input)) + return InputRouteResult.Message(input); + + if (!input.StartsWith('/')) + return InputRouteResult.Message(input); + + var spaceIdx = input.IndexOf(' '); + var commandPart = spaceIdx > 0 ? input[..spaceIdx] : input; + var argsPart = spaceIdx > 0 ? input[(spaceIdx + 1)..] : ""; + + // 1. 내장 슬래시 명령 확인 + var cmd = _slashCommands.Resolve(commandPart); + if (cmd != null) + return InputRouteResult.SlashCommand(cmd, argsPart); + + // 2. 스킬 검색 + var skillName = commandPart.TrimStart('/'); + var skill = SkillService.Find(skillName); + if (skill != null) + return InputRouteResult.Skill(skill, argsPart); + + // 3. 미인식 → 일반 메시지로 전달 + return InputRouteResult.Message(input); + } +} + +/// 입력 라우팅 결과. +public class InputRouteResult +{ + public InputRouteType Type { get; init; } + public string? MessageText { get; init; } + public ISlashCommand? Command { get; init; } + public string CommandArgs { get; init; } = ""; + public SkillDefinition? SkillDef { get; init; } + + public static InputRouteResult Message(string text) => + new() { Type = InputRouteType.Message, MessageText = text }; + + public static InputRouteResult SlashCommand(ISlashCommand cmd, string args) => + new() { Type = InputRouteType.SlashCommand, Command = cmd, CommandArgs = args }; + + public static InputRouteResult Skill(SkillDefinition skill, string args) => + new() { Type = InputRouteType.Skill, SkillDef = skill, CommandArgs = args }; +} + +/// 입력 라우팅 유형. +public enum InputRouteType +{ + /// 일반 메시지 → LLM으로 전달. + Message, + /// 내장 슬래시 명령 → 즉시 실행. + SlashCommand, + /// 스킬 명령 → 스킬 실행. + Skill, +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/McpSlashCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/McpSlashCommand.cs new file mode 100644 index 0000000..02505bd --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/McpSlashCommand.cs @@ -0,0 +1,75 @@ +using System.Text; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /mcp — MCP 서버 상태 확인. +public class McpSlashCommand : ISlashCommand +{ + public string Name => "mcp"; + public string[] Aliases => Array.Empty(); + public string Description => "MCP 서버 상태를 확인합니다"; + public string? ArgumentHint => "[enable|disable <서버명>]"; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var mcpServers = ctx.Settings.Settings.Llm.McpServers; + + if (string.IsNullOrWhiteSpace(arguments)) + { + // 상태 표시 + if (mcpServers == null || mcpServers.Count == 0) + { + await ctx.SendSystemMessageAsync("등록된 MCP 서버가 없습니다."); + return; + } + + var sb = new StringBuilder("## MCP 서버 목록\n"); + foreach (var server in mcpServers) + { + var enabled = server.Enabled ? "활성" : "비활성"; + sb.AppendLine($"- **{server.Name}** [{enabled}] — `{server.Command}` {string.Join(" ", server.Args)}"); + } + await ctx.SendSystemMessageAsync(sb.ToString()); + return; + } + + var parts = arguments.Trim().Split(' ', 2, StringSplitOptions.RemoveEmptyEntries); + var action = parts[0].ToLowerInvariant(); + var serverName = parts.Length > 1 ? parts[1] : null; + + if (mcpServers == null) + { + await ctx.SendSystemMessageAsync("등록된 MCP 서버가 없습니다."); + return; + } + + switch (action) + { + case "enable": + ToggleServers(mcpServers, serverName, true); + ctx.Settings.Save(); + await ctx.SendSystemMessageAsync($"MCP 서버 활성화: {serverName ?? "전체"}"); + break; + + case "disable": + ToggleServers(mcpServers, serverName, false); + ctx.Settings.Save(); + await ctx.SendSystemMessageAsync($"MCP 서버 비활성화: {serverName ?? "전체"}"); + break; + + default: + await ctx.SendSystemMessageAsync("사용법: `/mcp [enable|disable] [서버명]`"); + break; + } + } + + private static void ToggleServers(List servers, string? name, bool enabled) + { + foreach (var s in servers) + { + if (name == null || s.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) + s.Enabled = enabled; + } + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/MemoryCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/MemoryCommand.cs new file mode 100644 index 0000000..5ab81bd --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/MemoryCommand.cs @@ -0,0 +1,56 @@ +using System.Diagnostics; +using System.IO; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /memory — AX.md 메모리 파일 편집. +public class MemoryCommand : ISlashCommand +{ + public string Name => "memory"; + public string[] Aliases => Array.Empty(); + public string Description => "AX.md 메모리 파일을 편집합니다 (전역/프로젝트/로컬)"; + public string? ArgumentHint => "[global|project|local]"; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var scope = arguments.Trim().ToLowerInvariant() switch + { + "global" or "user" => "user", + "local" => "local", + _ => "project", + }; + + var path = scope switch + { + "user" => Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), + ".axcopilot", "AX.md"), + "local" => Path.Combine(ctx.WorkFolder, "AX.local.md"), + _ => Path.Combine(ctx.WorkFolder, "AX.md"), + }; + + // 디렉토리 확인 + var dir = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) + Directory.CreateDirectory(dir); + + // 파일이 없으면 템플릿 생성 + if (!File.Exists(path)) + { + await File.WriteAllTextAsync(path, + $"# AX Copilot 메모리 ({scope})\n\n여기에 프로젝트 지시사항을 작성하세요.\n", ct); + } + + try + { + Process.Start(new ProcessStartInfo(path) { UseShellExecute = true }); + await ctx.SendSystemMessageAsync( + $"메모리 파일을 열었습니다: `{path}`\n범위: **{scope}**\n편집 후 저장하면 다음 세션부터 반영됩니다."); + } + catch (Exception ex) + { + await ctx.SendSystemMessageAsync($"파일 열기 실패: {ex.Message}\n경로: {path}"); + } + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/ModelCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/ModelCommand.cs new file mode 100644 index 0000000..791cb16 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/ModelCommand.cs @@ -0,0 +1,44 @@ +using System.Text; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /model — 세션 모델 전환. +public class ModelCommand : ISlashCommand +{ + public string Name => "model"; + public string[] Aliases => Array.Empty(); + public string Description => "현재 세션의 AI 모델을 변경합니다"; + public string? ArgumentHint => "[모델명]"; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var llm = ctx.Settings.Settings.Llm; + + if (string.IsNullOrWhiteSpace(arguments)) + { + // 현재 모델 + 사용 가능 목록 표시 + var sb = new StringBuilder(); + sb.AppendLine($"현재 모델: **{llm.Model}**"); + sb.AppendLine($"서비스: **{llm.Service}**"); + + if (llm.FallbackModels?.Count > 0) + { + sb.AppendLine("\n사용 가능한 폴백 모델:"); + foreach (var fb in llm.FallbackModels) + sb.AppendLine($"- {fb}"); + } + + await ctx.SendSystemMessageAsync(sb.ToString()); + return; + } + + // 모델 변경 + var newModel = arguments.Trim(); + llm.Model = newModel; + ctx.Settings.Save(); + ctx.UpdateSessionHeader(); + + await ctx.SendSystemMessageAsync($"모델이 **{newModel}**(으)로 변경되었습니다."); + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/PermissionsCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/PermissionsCommand.cs new file mode 100644 index 0000000..eb1df87 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/PermissionsCommand.cs @@ -0,0 +1,68 @@ +using System.Text; +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /permissions — 권한 규칙 관리. +public class PermissionsCommand : ISlashCommand +{ + public string Name => "permissions"; + public string[] Aliases => new[] { "allowed-tools" }; + public string Description => "도구 허용/차단 규칙을 관리합니다"; + public string? ArgumentHint => "[mode <모드명>]"; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var llm = ctx.Settings.Settings.Llm; + var perms = llm.Permissions; + + if (!string.IsNullOrWhiteSpace(arguments)) + { + var parts = arguments.Trim().Split(' ', 2, StringSplitOptions.RemoveEmptyEntries); + if (parts[0].Equals("mode", StringComparison.OrdinalIgnoreCase) && parts.Length > 1) + { + var modeName = parts[1].Trim(); + if (Enum.TryParse(modeName, true, out _)) + { + llm.DefaultAgentPermission = modeName; + ctx.Settings.Save(); + ctx.UpdateSessionHeader(); + await ctx.SendSystemMessageAsync($"권한 모드가 **{modeName}**(으)로 변경되었습니다."); + return; + } + + await ctx.SendSystemMessageAsync( + $"알 수 없는 모드: {modeName}\n사용 가능: Default, AcceptEdits, Plan, BypassPermissions"); + return; + } + } + + // 현재 상태 표시 + var sb = new StringBuilder("## 권한 설정\n"); + sb.AppendLine($"현재 모드: **{llm.DefaultAgentPermission}**\n"); + + var allowRules = perms?.AllowRules ?? new List(); + var denyRules = perms?.DenyRules ?? new List(); + + if (allowRules.Count > 0) + { + sb.AppendLine("### 허용 규칙"); + foreach (var r in allowRules) + sb.AppendLine($"- {r.ToolName}({r.Pattern ?? "*"})"); + } + + if (denyRules.Count > 0) + { + sb.AppendLine("\n### 차단 규칙"); + foreach (var r in denyRules) + sb.AppendLine($"- {r.ToolName}({r.Pattern ?? "*"})"); + } + + if (allowRules.Count == 0 && denyRules.Count == 0) + sb.AppendLine("사용자 지정 규칙이 없습니다."); + + sb.AppendLine($"\n모드 변경: `/permissions mode <모드명>`"); + await ctx.SendSystemMessageAsync(sb.ToString()); + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/PlanCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/PlanCommand.cs new file mode 100644 index 0000000..b817386 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/PlanCommand.cs @@ -0,0 +1,55 @@ +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /plan — 플랜 모드 토글. +public class PlanCommand : ISlashCommand +{ + public string Name => "plan"; + public string[] Aliases => Array.Empty(); + public string Description => "플랜 모드를 토글하거나 계획을 설명합니다"; + public string? ArgumentHint => "[open|<계획 설명>]"; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var llm = ctx.Settings.Settings.Llm; + + if (string.IsNullOrWhiteSpace(arguments)) + { + // 토글: off → always → auto → off 순환 + var current = llm.PlanMode?.ToLowerInvariant() ?? "off"; + var next = current switch + { + "off" => "always", + "always" => "auto", + _ => "off", + }; + llm.PlanMode = next; + ctx.Settings.Save(); + ctx.UpdateSessionHeader(); + + var desc = next switch + { + "always" => "실행 전 항상 계획을 작성하고 승인을 기다립니다", + "auto" => "복잡한 작업에만 자동으로 계획을 작성합니다", + _ => "변경 사항을 바로 실행합니다", + }; + await ctx.SendSystemMessageAsync($"플랜 모드: **{next}**\n{desc}"); + return; + } + + var arg = arguments.Trim().ToLowerInvariant(); + if (arg == "open") + { + await ctx.SendSystemMessageAsync( + "현재 활성 계획이 없습니다. `/plan <설명>`으로 새 계획을 만드세요."); + return; + } + + // 계획 설명으로 플랜 모드 활성화 + 지시 + llm.PlanMode = "always"; + ctx.Settings.Save(); + ctx.UpdateSessionHeader(); + await ctx.SendSystemMessageAsync( + $"플랜 모드 **활성화**. 다음 요청에서 계획을 먼저 작성합니다.\n\n요청: {arguments}"); + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/ReviewCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/ReviewCommand.cs new file mode 100644 index 0000000..3f6d1bd --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/ReviewCommand.cs @@ -0,0 +1,99 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using AxCopilot.Models; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /review — AI 코드 리뷰. +public class ReviewCommand : ISlashCommand +{ + public string Name => "review"; + public string[] Aliases => Array.Empty(); + public string Description => "현재 브랜치의 변경 사항을 AI로 리뷰합니다"; + public string? ArgumentHint => "[브랜치명 또는 diff 범위]"; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var workDir = ctx.WorkFolder; + if (string.IsNullOrEmpty(workDir) || !Directory.Exists(workDir)) + { + await ctx.SendSystemMessageAsync("작업 폴더가 설정되지 않았습니다."); + return; + } + + await ctx.SendSystemMessageAsync("코드 리뷰를 준비하고 있습니다..."); + + // diff 가져오기 + var diffArgs = string.IsNullOrWhiteSpace(arguments) + ? "diff HEAD" + : $"diff {arguments.Trim()}"; + + var diff = await RunGitAsync(diffArgs, workDir, ct); + if (string.IsNullOrWhiteSpace(diff)) + { + diff = await RunGitAsync("diff --cached", workDir, ct); + } + + if (string.IsNullOrWhiteSpace(diff)) + { + await ctx.SendSystemMessageAsync("리뷰할 변경 사항이 없습니다."); + return; + } + + var truncated = diff.Length > 12000 ? diff[..12000] + "\n...(이하 생략)" : diff; + var prompt = $""" + 아래 코드 변경 사항을 리뷰하세요. 한국어로 작성하세요. + + ## 리뷰 포함 사항 + 1. **변경 사항 개요** — 무엇이 변경되었는지 요약 + 2. **코드 품질** — 가독성, 명명, 중복 등 + 3. **잠재적 버그** — null 참조, 경계 조건, 리소스 누수 + 4. **보안 이슈** — 인젝션, 하드코딩된 자격증명 등 + 5. **개선 제안** — 구체적 코드 예시 포함 + + ```diff + {truncated} + ``` + """; + + try + { + var messages = new List + { + new() { Role = "user", Content = prompt } + }; + var review = await ctx.Llm.SendAsync(messages, ct); + await ctx.SendSystemMessageAsync($"## 코드 리뷰\n{review}"); + } + catch (Exception ex) + { + await ctx.SendSystemMessageAsync($"리뷰 생성 실패: {ex.Message}"); + } + } + + private static async Task RunGitAsync(string args, string workDir, CancellationToken ct) + { + try + { + var psi = new ProcessStartInfo + { + FileName = "git", + Arguments = args, + WorkingDirectory = workDir, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + }; + using var proc = Process.Start(psi); + if (proc == null) return ""; + var output = await proc.StandardOutput.ReadToEndAsync(ct); + await proc.WaitForExitAsync(ct); + return output; + } + catch (Exception) { return ""; } + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/SkillsCommand.cs b/src/AxCopilot/Services/Agent/SlashCommands/SkillsCommand.cs new file mode 100644 index 0000000..e5624a3 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/SkillsCommand.cs @@ -0,0 +1,35 @@ +using System.Text; + +namespace AxCopilot.Services.Agent.SlashCommands; + +/// Phase 22: /skills — 사용 가능한 스킬 목록 표시. +public class SkillsCommand : ISlashCommand +{ + public string Name => "skills"; + public string[] Aliases => Array.Empty(); + public string Description => "사용 가능한 스킬 목록을 표시합니다"; + public string? ArgumentHint => null; + public bool RequiresActiveSession => false; + + public async Task ExecuteAsync(string arguments, IAgentChatContext ctx, CancellationToken ct) + { + var skills = ctx.LoadedSkills; + if (skills.Count == 0) + { + await ctx.SendSystemMessageAsync( + "등록된 스킬이 없습니다.\n\n스킬 폴더: `%APPDATA%\\AxCopilot\\skills\\`"); + return; + } + + var sb = new StringBuilder("## 사용 가능한 스킬\n"); + foreach (var skill in skills.OrderBy(s => s.Name)) + { + var avail = skill.IsAvailable ? "" : " ⚠️ (런타임 미충족)"; + var tab = !string.IsNullOrEmpty(skill.Tabs) && skill.Tabs != "all" ? $" [{skill.Tabs}]" : ""; + sb.AppendLine($"- **/{skill.Name}**{tab} — {skill.Description}{avail}"); + } + + sb.AppendLine($"\n총 {skills.Count}개 스킬 로드됨"); + await ctx.SendSystemMessageAsync(sb.ToString()); + } +} diff --git a/src/AxCopilot/Services/Agent/SlashCommands/SlashAutoCompleteProvider.cs b/src/AxCopilot/Services/Agent/SlashCommands/SlashAutoCompleteProvider.cs new file mode 100644 index 0000000..4756447 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/SlashAutoCompleteProvider.cs @@ -0,0 +1,51 @@ +namespace AxCopilot.Services.Agent.SlashCommands; + +/// +/// Phase 23: 슬래시 자동완성 제공자. +/// / 입력 시 내장 명령 + 스킬을 결합하여 후보 목록을 반환합니다. +/// +public class SlashAutoCompleteProvider +{ + private readonly SlashCommandRegistry _commands; + + public SlashAutoCompleteProvider(SlashCommandRegistry commands) + { + _commands = commands; + } + + /// 접두사에 매칭되는 자동완성 후보를 반환합니다. + public IReadOnlyList GetSuggestions(string input) + { + if (string.IsNullOrEmpty(input) || !input.StartsWith('/')) + return Array.Empty(); + + var prefix = input.TrimStart('/').ToLowerInvariant(); + var results = new List(); + + // 1. 내장 명령 + foreach (var cmd in _commands.GetAll()) + { + if (cmd.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + results.Add(new AutoCompleteItem($"/{cmd.Name}", cmd.Description, cmd.ArgumentHint, true)); + + // 별칭도 검색 + foreach (var alias in cmd.Aliases) + { + if (alias.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + results.Add(new AutoCompleteItem($"/{alias}", cmd.Description, cmd.ArgumentHint, true)); + } + } + + // 2. 스킬 + foreach (var skill in SkillService.Skills) + { + if (skill.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + results.Add(new AutoCompleteItem($"/{skill.Name}", skill.Description, null, false)); + } + + return results.OrderByDescending(r => r.IsBuiltIn).ThenBy(r => r.Name).ToList(); + } +} + +/// 자동완성 항목. +public record AutoCompleteItem(string Name, string Description, string? ArgumentHint, bool IsBuiltIn); diff --git a/src/AxCopilot/Services/Agent/SlashCommands/SlashCommandRegistry.cs b/src/AxCopilot/Services/Agent/SlashCommands/SlashCommandRegistry.cs new file mode 100644 index 0000000..5cab3b7 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SlashCommands/SlashCommandRegistry.cs @@ -0,0 +1,54 @@ +namespace AxCopilot.Services.Agent.SlashCommands; + +/// +/// Phase 22: 슬래시 명령 레지스트리. +/// 내장 명령을 등록하고, 사용자 입력에서 명령을 해석합니다. +/// 내장 명령 > 스킬 명령 우선순위. +/// +public class SlashCommandRegistry +{ + private readonly Dictionary _commands = new(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary _aliases = new(StringComparer.OrdinalIgnoreCase); + + /// 슬래시 명령을 등록합니다. + public void Register(ISlashCommand command) + { + _commands[command.Name] = command; + foreach (var alias in command.Aliases) + _aliases[alias] = command.Name; + } + + /// 입력 문자열에서 슬래시 명령을 찾습니다. 없으면 null. + public ISlashCommand? Resolve(string commandName) + { + var name = commandName.TrimStart('/').Split(' ', 2)[0]; + if (_commands.TryGetValue(name, out var cmd)) return cmd; + if (_aliases.TryGetValue(name, out var canonical)) + return _commands.GetValueOrDefault(canonical); + return null; + } + + /// 등록된 모든 명령 목록. + public IReadOnlyList GetAll() => _commands.Values.ToList(); + + /// 기본 내장 명령을 모두 등록한 레지스트리를 생성합니다. + public static SlashCommandRegistry CreateDefault() + { + var reg = new SlashCommandRegistry(); + reg.Register(new CompactCommand()); + reg.Register(new ClearCommand()); + reg.Register(new MemoryCommand()); + reg.Register(new ModelCommand()); + reg.Register(new PlanCommand()); + reg.Register(new CommitCommand()); + reg.Register(new ReviewCommand()); + reg.Register(new McpSlashCommand()); + reg.Register(new PermissionsCommand()); + reg.Register(new HooksCommand()); + reg.Register(new ConfigCommand()); + reg.Register(new SkillsCommand()); + reg.Register(new InitCommand()); // Phase 26: 프로젝트 초기화 + reg.Register(new HelpCommand()); + return reg; + } +} diff --git a/src/AxCopilot/Services/Agent/SnippetRunnerTool.cs b/src/AxCopilot/Services/Agent/SnippetRunnerTool.cs new file mode 100644 index 0000000..8d9e491 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SnippetRunnerTool.cs @@ -0,0 +1,245 @@ +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// C#/Python/JavaScript 코드 스니펫을 즉시 실행하는 도구. +/// 임시 파일에 코드를 저장하고 해당 런타임으로 실행합니다. +/// +public class SnippetRunnerTool : IAgentTool +{ + public string Name => "snippet_runner"; + public string Description => + "Execute a code snippet in C#, Python, or JavaScript. " + + "Writes the code to a temp file, runs it, and returns stdout/stderr. " + + "Useful for quick calculations, data transformations, format conversions, and testing algorithms. " + + "Max execution time: 30 seconds. Max output: 8000 chars."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["language"] = new() + { + Type = "string", + Description = "Programming language: 'csharp', 'python', or 'javascript'", + Enum = ["csharp", "python", "javascript"], + }, + ["code"] = new() + { + Type = "string", + Description = "Source code to execute. For C#: top-level statements or full Program class. " + + "For Python: standard script. For JavaScript: Node.js script.", + }, + ["timeout"] = new() + { + Type = "integer", + Description = "Timeout in seconds. Default: 30, max: 60.", + }, + }, + Required = ["language", "code"], + }; + + // 위험한 코드 패턴 차단 + private static readonly string[] DangerousPatterns = + [ + "Process.Start", "ProcessStartInfo", + "Registry.", "RegistryKey", + "Environment.Exit", + "File.Delete", "Directory.Delete", + "Format-Volume", "Remove-Item", + "os.remove", "os.rmdir", "shutil.rmtree", + "subprocess.call", "subprocess.Popen", + "child_process", "require('fs').unlink", + "exec(", "eval(", + ]; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var language = args.GetProperty("language").GetString() ?? ""; + var code = args.TryGetProperty("code", out var c) ? c.GetString() ?? "" : ""; + var timeout = args.TryGetProperty("timeout", out var to) ? Math.Min(to.GetInt32(), 60) : 30; + + if (string.IsNullOrWhiteSpace(code)) + return ToolResult.Fail("code가 비어 있습니다."); + + // 위험 패턴 검사 + foreach (var pattern in DangerousPatterns) + { + if (code.Contains(pattern, StringComparison.OrdinalIgnoreCase)) + return ToolResult.Fail($"보안 차단: '{pattern}' 패턴은 snippet_runner에서 허용되지 않습니다. process 도구를 사용하세요."); + } + + // 권한 확인 + if (!await context.CheckWritePermissionAsync(Name, $"[{language}] {(code.Length > 100 ? code[..100] + "..." : code)}")) + return ToolResult.Fail("코드 실행 권한 거부"); + + // 설정에서 비활성화 여부 확인 + var enabled = context.Llm?.Code?.EnableSnippetRunner ?? true; + if (!enabled) + return ToolResult.Fail("snippet_runner가 설정에서 비활성화되어 있습니다. 설정 → AX Agent → 기능에서 활성화하세요."); + + return language switch + { + "csharp" => await RunCSharpAsync(code, timeout, context, ct), + "python" => await RunScriptAsync("python", ".py", code, timeout, context, ct), + "javascript" => await RunScriptAsync("node", ".js", code, timeout, context, ct), + _ => ToolResult.Fail($"지원하지 않는 언어: {language}. csharp, python, javascript 중 선택하세요."), + }; + } + + private async Task RunCSharpAsync(string code, int timeout, AgentContext context, CancellationToken ct) + { + // dotnet-script 사용 시도, 없으면 dotnet run 임시 프로젝트 + var tempDir = Path.Combine(Path.GetTempPath(), $"axcopilot_snippet_{Guid.NewGuid():N}"); + Directory.CreateDirectory(tempDir); + + try + { + // dotnet-script 먼저 확인 + if (await IsToolAvailableAsync("dotnet-script")) + { + var scriptFile = Path.Combine(tempDir, "snippet.csx"); + await File.WriteAllTextAsync(scriptFile, code, ct); + return await RunProcessAsync("dotnet-script", scriptFile, timeout, tempDir, ct); + } + + // dotnet run으로 폴백 — 임시 콘솔 프로젝트 생성 + var csprojContent = """ + + + Exe + net8.0 + enable + + + """; + await File.WriteAllTextAsync(Path.Combine(tempDir, "Snippet.csproj"), csprojContent, ct); + + // top-level statements 코드를 Program.cs로 + var programCode = code.Contains("class ") && code.Contains("static void Main") + ? code // 이미 전체 클래스 + : code; // top-level statements (net8.0 지원) + await File.WriteAllTextAsync(Path.Combine(tempDir, "Program.cs"), programCode, ct); + + return await RunProcessAsync("dotnet", $"run --project \"{tempDir}\"", timeout, tempDir, ct); + } + finally + { + // 정리 + try { Directory.Delete(tempDir, true); } catch (Exception) { } + } + } + + private async Task RunScriptAsync(string runtime, string extension, string code, + int timeout, AgentContext context, CancellationToken ct) + { + // 런타임 사용 가능 확인 + if (!await IsToolAvailableAsync(runtime)) + return ToolResult.Fail($"{runtime}이 설치되지 않았습니다. 시스템에 {runtime}을 설치하세요."); + + var tempFile = Path.Combine(Path.GetTempPath(), $"axcopilot_snippet_{Guid.NewGuid():N}{extension}"); + try + { + await File.WriteAllTextAsync(tempFile, code, Encoding.UTF8, ct); + return await RunProcessAsync(runtime, $"\"{tempFile}\"", timeout, context.WorkFolder, ct); + } + finally + { + try { File.Delete(tempFile); } catch (Exception) { } + } + } + + private static async Task RunProcessAsync(string fileName, string arguments, + int timeout, string workDir, CancellationToken ct) + { + var psi = new ProcessStartInfo + { + FileName = fileName, + Arguments = arguments, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8, + StandardErrorEncoding = Encoding.UTF8, + }; + + if (!string.IsNullOrEmpty(workDir) && Directory.Exists(workDir)) + psi.WorkingDirectory = workDir; + + using var process = new Process { StartInfo = psi }; + var stdout = new StringBuilder(); + var stderr = new StringBuilder(); + + process.OutputDataReceived += (_, e) => { if (e.Data != null) stdout.AppendLine(e.Data); }; + process.ErrorDataReceived += (_, e) => { if (e.Data != null) stderr.AppendLine(e.Data); }; + + try + { + process.Start(); + } + catch (Exception ex) + { + return ToolResult.Fail($"실행 실패: {ex.Message}"); + } + + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + cts.CancelAfter(TimeSpan.FromSeconds(timeout)); + + try + { + await process.WaitForExitAsync(cts.Token); + } + catch (OperationCanceledException) + { + try { process.Kill(entireProcessTree: true); } catch (Exception) { } + return ToolResult.Fail($"실행 타임아웃 ({timeout}초 초과)"); + } + + var output = stdout.ToString().TrimEnd(); + var error = stderr.ToString().TrimEnd(); + + // 출력 크기 제한 + if (output.Length > 8000) + output = output[..8000] + "\n... (출력 잘림)"; + + var result = new StringBuilder(); + result.AppendLine($"[Exit code: {process.ExitCode}]"); + if (!string.IsNullOrEmpty(output)) + result.AppendLine(output); + if (!string.IsNullOrEmpty(error)) + result.AppendLine($"[stderr]\n{error}"); + + return ToolResult.Ok(result.ToString()); + } + + private static async Task IsToolAvailableAsync(string tool) + { + try + { + var psi = new ProcessStartInfo + { + FileName = Environment.OSVersion.Platform == PlatformID.Win32NT ? "where" : "which", + Arguments = tool, + UseShellExecute = false, + RedirectStandardOutput = true, + CreateNoWindow = true, + }; + using var process = Process.Start(psi); + if (process == null) return false; + await process.WaitForExitAsync(); + return process.ExitCode == 0; + } + catch (Exception) + { + return false; + } + } +} diff --git a/src/AxCopilot/Services/Agent/SqlTool.cs b/src/AxCopilot/Services/Agent/SqlTool.cs new file mode 100644 index 0000000..a089c03 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SqlTool.cs @@ -0,0 +1,210 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using Microsoft.Data.Sqlite; + +namespace AxCopilot.Services.Agent; + +/// +/// SQLite 데이터베이스 쿼리 실행 도구. +/// 로컬 .db/.sqlite 파일에 대해 SELECT/INSERT/UPDATE/DELETE 쿼리를 실행합니다. +/// +public class SqlTool : IAgentTool +{ + public string Name => "sql_tool"; + public string Description => + "Execute SQL queries on local SQLite database files. Actions: " + + "'query' — run SELECT query and return results as table; " + + "'execute' — run INSERT/UPDATE/DELETE and return affected rows; " + + "'schema' — show database schema (tables, columns, types); " + + "'tables' — list all tables in the database."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action to perform", + Enum = ["query", "execute", "schema", "tables"], + }, + ["db_path"] = new() + { + Type = "string", + Description = "Path to SQLite database file (.db, .sqlite, .sqlite3)", + }, + ["sql"] = new() + { + Type = "string", + Description = "SQL query to execute (for query/execute actions)", + }, + ["max_rows"] = new() + { + Type = "string", + Description = "Maximum rows to return (default: 100, max: 1000)", + }, + }, + Required = ["action", "db_path"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + var dbPath = args.GetProperty("db_path").GetString() ?? ""; + + if (!Path.IsPathRooted(dbPath)) + dbPath = Path.Combine(context.WorkFolder, dbPath); + + if (!File.Exists(dbPath)) + return Task.FromResult(ToolResult.Fail($"Database file not found: {dbPath}")); + + try + { + var connStr = $"Data Source={dbPath};Mode=ReadOnly"; + // execute 액션은 ReadWrite 필요 + if (action == "execute") + connStr = $"Data Source={dbPath}"; + + using var conn = new SqliteConnection(connStr); + conn.Open(); + + return Task.FromResult(action switch + { + "query" => QueryAction(conn, args), + "execute" => ExecuteAction(conn, args), + "schema" => SchemaAction(conn), + "tables" => TablesAction(conn), + _ => ToolResult.Fail($"Unknown action: {action}"), + }); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"SQL 오류: {ex.Message}")); + } + } + + private static ToolResult QueryAction(SqliteConnection conn, JsonElement args) + { + if (!args.TryGetProperty("sql", out var sqlProp)) + return ToolResult.Fail("'sql' parameter is required for query action"); + + var sql = sqlProp.GetString() ?? ""; + + // SELECT만 허용 + if (!sql.TrimStart().StartsWith("SELECT", StringComparison.OrdinalIgnoreCase) && + !sql.TrimStart().StartsWith("WITH", StringComparison.OrdinalIgnoreCase) && + !sql.TrimStart().StartsWith("PRAGMA", StringComparison.OrdinalIgnoreCase)) + return ToolResult.Fail("Query action only allows SELECT/WITH/PRAGMA statements. Use 'execute' for modifications."); + + var maxRows = args.TryGetProperty("max_rows", out var mr) && int.TryParse(mr.GetString(), out var mrv) + ? Math.Min(mrv, 1000) : 100; + + using var cmd = conn.CreateCommand(); + cmd.CommandText = sql; + + using var reader = cmd.ExecuteReader(); + var sb = new StringBuilder(); + var colCount = reader.FieldCount; + + // 헤더 + var colNames = new string[colCount]; + for (var i = 0; i < colCount; i++) + colNames[i] = reader.GetName(i); + sb.AppendLine(string.Join(" | ", colNames)); + sb.AppendLine(new string('-', colNames.Sum(c => c.Length + 3))); + + // 행 + var rowCount = 0; + while (reader.Read() && rowCount < maxRows) + { + var values = new string[colCount]; + for (var i = 0; i < colCount; i++) + values[i] = reader.IsDBNull(i) ? "NULL" : reader.GetValue(i)?.ToString() ?? ""; + sb.AppendLine(string.Join(" | ", values)); + rowCount++; + } + + if (rowCount == 0) + return ToolResult.Ok("Query returned 0 rows."); + + var result = sb.ToString(); + if (result.Length > 8000) result = result[..8000] + "\n... (truncated)"; + return ToolResult.Ok($"Rows: {rowCount}" + (rowCount >= maxRows ? $" (limited to {maxRows})" : "") + $"\n\n{result}"); + } + + private static ToolResult ExecuteAction(SqliteConnection conn, JsonElement args) + { + if (!args.TryGetProperty("sql", out var sqlProp)) + return ToolResult.Fail("'sql' parameter is required for execute action"); + + var sql = sqlProp.GetString() ?? ""; + + // DDL/DML만 허용 (DROP DATABASE 등 위험 명령 차단) + var trimmed = sql.TrimStart().ToUpperInvariant(); + if (trimmed.StartsWith("DROP DATABASE") || trimmed.StartsWith("ATTACH") || trimmed.StartsWith("DETACH")) + return ToolResult.Fail("Security: DROP DATABASE, ATTACH, DETACH are not allowed."); + + using var cmd = conn.CreateCommand(); + cmd.CommandText = sql; + var affected = cmd.ExecuteNonQuery(); + return ToolResult.Ok($"✓ {affected} row(s) affected"); + } + + private static ToolResult SchemaAction(SqliteConnection conn) + { + var sb = new StringBuilder(); + using var cmd = conn.CreateCommand(); + cmd.CommandText = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"; + using var reader = cmd.ExecuteReader(); + + var tables = new List(); + while (reader.Read()) tables.Add(reader.GetString(0)); + reader.Close(); + + foreach (var table in tables) + { + sb.AppendLine($"## {table}"); + using var pragmaCmd = conn.CreateCommand(); + pragmaCmd.CommandText = $"PRAGMA table_info(\"{table}\")"; + using var pragmaReader = pragmaCmd.ExecuteReader(); + sb.AppendLine($"{"#",-4} {"Name",-25} {"Type",-15} {"NotNull",-8} {"Default",-15} {"PK"}"); + while (pragmaReader.Read()) + { + sb.AppendLine($"{pragmaReader.GetInt32(0),-4} " + + $"{pragmaReader.GetString(1),-25} " + + $"{pragmaReader.GetString(2),-15} " + + $"{(pragmaReader.GetInt32(3) == 1 ? "YES" : ""),-8} " + + $"{(pragmaReader.IsDBNull(4) ? "" : pragmaReader.GetString(4)),-15} " + + $"{(pragmaReader.GetInt32(5) > 0 ? "PK" : "")}"); + } + pragmaReader.Close(); + sb.AppendLine(); + } + + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult TablesAction(SqliteConnection conn) + { + using var cmd = conn.CreateCommand(); + cmd.CommandText = @" + SELECT m.name, m.type, + (SELECT count(*) FROM pragma_table_info(m.name)) as col_count + FROM sqlite_master m + WHERE m.type IN ('table','view') + ORDER BY m.type, m.name"; + using var reader = cmd.ExecuteReader(); + + var sb = new StringBuilder(); + sb.AppendLine($"{"Name",-30} {"Type",-8} {"Columns"}"); + sb.AppendLine(new string('-', 50)); + var count = 0; + while (reader.Read()) + { + sb.AppendLine($"{reader.GetString(0),-30} {reader.GetString(1),-8} {reader.GetInt32(2)}"); + count++; + } + return ToolResult.Ok($"Found {count} tables/views:\n\n{sb}"); + } +} diff --git a/src/AxCopilot/Services/Agent/SubAgentTool.cs b/src/AxCopilot/Services/Agent/SubAgentTool.cs new file mode 100644 index 0000000..dd0ebbd --- /dev/null +++ b/src/AxCopilot/Services/Agent/SubAgentTool.cs @@ -0,0 +1,200 @@ +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 서브에이전트 생성 도구. +/// 메인 에이전트가 여러 독립 작업을 병렬로 실행할 수 있습니다. +/// 서브에이전트는 읽기 전용으로 실행되며, 파일 수정은 메인 에이전트가 수행합니다. +/// +/// spawn_agent: 서브에이전트 생성 (비동기) +/// wait_agents: 모든 서브에이전트 결과 대기 +/// +public class SubAgentTool : IAgentTool +{ + public string Name => "spawn_agent"; + + public string Description => + "독립적인 서브에이전트를 생성하여 작업을 병렬로 실행합니다.\n" + + "서브에이전트는 읽기 전용(파일 읽기, 검색, 분석)으로 실행됩니다.\n" + + "여러 서브에이전트를 생성한 후 wait_agents로 결과를 수집하세요.\n" + + "예: 큰 코드베이스에서 여러 파일을 동시에 분석할 때 유용합니다."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["task"] = new ToolProperty + { + Type = "string", + Description = "서브에이전트가 수행할 작업 설명" + }, + ["id"] = new ToolProperty + { + Type = "string", + Description = "서브에이전트 식별자 (결과 수집 시 사용)" + }, + }, + Required = new() { "task", "id" } + }; + + // 활성 서브에이전트 태스크 저장소 + private static readonly Dictionary _activeTasks = new(); + private static readonly object _lock = new(); + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var task = args.TryGetProperty("task", out var t) ? t.GetString() ?? "" : ""; + var id = args.TryGetProperty("id", out var i) ? i.GetString() ?? "" : ""; + + if (string.IsNullOrEmpty(task) || string.IsNullOrEmpty(id)) + return ToolResult.Fail("task와 id가 필요합니다."); + + // 오래된 완료 태스크 자동 정리 + CleanupStale(); + + // 최대 동시 실행 수 제한 + var maxAgents = context.Llm?.MaxSubAgents ?? 3; + lock (_lock) + { + var running = _activeTasks.Values.Count(t => t.CompletedAt == null); + if (running >= maxAgents) + return ToolResult.Fail($"서브에이전트 최대 동시 실행 수({maxAgents})에 도달했습니다. wait_agents로 완료된 결과를 수집한 후 다시 시도하세요."); + } + + // 서브에이전트 컨텍스트: 읽기 전용 + var subContext = new AgentContext + { + WorkFolder = context.WorkFolder, + Permission = "Deny", // 파일 수정 불가 + BlockedPaths = context.BlockedPaths, + BlockedExtensions = context.BlockedExtensions, + ActiveTab = context.ActiveTab, + }; + + // 비동기 실행 + var subTask = new SubAgentTask + { + Id = id, + Task = task, + StartedAt = DateTime.Now, + }; + + // 서브에이전트는 도구 직접 실행 (간단한 분석 작업) + subTask.RunTask = System.Threading.Tasks.Task.Run(async () => + { + try + { + var sb = new StringBuilder(); + sb.AppendLine($"[서브에이전트 {id}] 작업: {task}"); + + // 기본 분석: 작업 폴더 스캔 결과 반환 + var folderMap = new FolderMapTool(); + var mapResult = await folderMap.ExecuteAsync( + JsonDocument.Parse($"{{\"path\":\"{context.WorkFolder.Replace("\\", "\\\\")}\"}}").RootElement, + subContext, ct); + + sb.AppendLine($"프로젝트 구조:\n{mapResult.Output}"); + subTask.Result = sb.ToString(); + subTask.Success = true; + } + catch (Exception ex) + { + subTask.Result = $"오류: {ex.Message}"; + subTask.Success = false; + } + subTask.CompletedAt = DateTime.Now; + }, ct); + + lock (_lock) + { + _activeTasks[id] = subTask; + } + + return ToolResult.Ok($"서브에이전트 '{id}' 시작됨. 작업: {task}\nwait_agents로 결과를 수집하세요."); + } + + /// 활성 서브에이전트 목록을 반환합니다. + public static IReadOnlyDictionary ActiveTasks + { + get { lock (_lock) return new Dictionary(_activeTasks); } + } + + /// 모든 서브에이전트 결과를 수집합니다. + public static async Task WaitAllAsync(CancellationToken ct = default) + { + List tasks; + lock (_lock) + { + tasks = _activeTasks.Values.ToList(); + } + + if (tasks.Count == 0) + return "활성 서브에이전트가 없습니다."; + + // 모든 태스크 대기 + await System.Threading.Tasks.Task.WhenAll(tasks.Where(t => t.RunTask != null).Select(t => t.RunTask!)); + + var sb = new StringBuilder(); + sb.AppendLine($"총 {tasks.Count}개 서브에이전트 결과:"); + foreach (var task in tasks) + { + var status = task.Success ? "✓" : "✗"; + var duration = task.CompletedAt.HasValue ? $"{(task.CompletedAt.Value - task.StartedAt).TotalSeconds:F1}초" : "진행 중"; + sb.AppendLine($"\n--- [{status}] {task.Id} ({duration}) ---"); + sb.AppendLine(task.Result ?? "(결과 없음)"); + } + + // 정리 + lock (_lock) _activeTasks.Clear(); + + return sb.ToString(); + } + + /// 10분 이상 경과한 완료된 서브에이전트를 자동 정리합니다. + public static void CleanupStale() + { + lock (_lock) + { + var stale = _activeTasks + .Where(kv => kv.Value.CompletedAt.HasValue && + (DateTime.Now - kv.Value.CompletedAt.Value).TotalMinutes > 10) + .Select(kv => kv.Key) + .ToList(); + foreach (var key in stale) + _activeTasks.Remove(key); + } + } +} + +/// 서브에이전트 결과 대기 도구. +public class WaitAgentsTool : IAgentTool +{ + public string Name => "wait_agents"; + public string Description => "실행 중인 모든 서브에이전트의 결과를 수집합니다. spawn_agent로 시작한 서브에이전트가 모두 완료될 때까지 대기합니다."; + + public ToolParameterSchema Parameters => new() + { + Properties = new(), + Required = new() + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var result = await SubAgentTool.WaitAllAsync(ct); + return ToolResult.Ok(result); + } +} + +/// 서브에이전트 태스크 상태. +public class SubAgentTask +{ + public string Id { get; init; } = ""; + public string Task { get; init; } = ""; + public DateTime StartedAt { get; init; } + public DateTime? CompletedAt { get; set; } + public bool Success { get; set; } + public string? Result { get; set; } + public System.Threading.Tasks.Task? RunTask { get; set; } +} diff --git a/src/AxCopilot/Services/Agent/SuggestActionsTool.cs b/src/AxCopilot/Services/Agent/SuggestActionsTool.cs new file mode 100644 index 0000000..3abe462 --- /dev/null +++ b/src/AxCopilot/Services/Agent/SuggestActionsTool.cs @@ -0,0 +1,103 @@ +using System.Text; +using System.Text.Json; + +namespace AxCopilot.Services.Agent; + +/// +/// 작업 완료 후 후속 액션을 구조화하여 제안하는 도구. +/// UI가 클릭 가능한 칩으로 렌더링할 수 있도록 JSON 형태로 반환합니다. +/// +public class SuggestActionsTool : IAgentTool +{ + public string Name => "suggest_actions"; + + public string Description => + "Suggest 2-5 follow-up actions after completing a task. " + + "Returns structured JSON that the UI renders as clickable action chips. " + + "Each action has a label (display text), command (slash command or natural language prompt), " + + "optional icon (Segoe MDL2 Assets code), and priority (high/medium/low)."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["actions"] = new() + { + Type = "array", + Description = "List of action objects. Each object: {\"label\": \"표시 텍스트\", \"command\": \"/slash 또는 자연어\", \"icon\": \"\\uE8A5\" (optional), \"priority\": \"high|medium|low\"}", + Items = new() { Type = "object", Description = "Action object with label, command, icon, priority" }, + }, + ["context"] = new() + { + Type = "string", + Description = "Current task context summary (optional)", + }, + }, + Required = ["actions"], + }; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + try + { + if (!args.TryGetProperty("actions", out var actionsEl) || actionsEl.ValueKind != JsonValueKind.Array) + return Task.FromResult(ToolResult.Fail("actions 배열이 필요합니다.")); + + var actions = new List>(); + foreach (var item in actionsEl.EnumerateArray()) + { + var label = item.TryGetProperty("label", out var l) ? l.GetString() ?? "" : ""; + var command = item.TryGetProperty("command", out var c) ? c.GetString() ?? "" : ""; + var icon = item.TryGetProperty("icon", out var i) ? i.GetString() ?? "" : ""; + var priority = item.TryGetProperty("priority", out var p) ? p.GetString() ?? "medium" : "medium"; + + if (string.IsNullOrWhiteSpace(label)) + return Task.FromResult(ToolResult.Fail("각 action에는 label이 필요합니다.")); + if (string.IsNullOrWhiteSpace(command)) + return Task.FromResult(ToolResult.Fail("각 action에는 command가 필요합니다.")); + + // priority 유효성 검사 + var validPriorities = new[] { "high", "medium", "low" }; + if (!validPriorities.Contains(priority)) + priority = "medium"; + + var action = new Dictionary + { + ["label"] = label, + ["command"] = command, + ["priority"] = priority, + }; + if (!string.IsNullOrEmpty(icon)) + action["icon"] = icon; + + actions.Add(action); + } + + if (actions.Count < 1 || actions.Count > 5) + return Task.FromResult(ToolResult.Fail("actions는 1~5개 사이여야 합니다.")); + + var contextSummary = args.TryGetProperty("context", out var ctx) ? ctx.GetString() ?? "" : ""; + + // 구조화된 JSON 응답 생성 + var result = new Dictionary + { + ["type"] = "suggest_actions", + ["actions"] = actions, + }; + if (!string.IsNullOrEmpty(contextSummary)) + result["context"] = contextSummary; + + var json = JsonSerializer.Serialize(result, new JsonSerializerOptions + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }); + + return Task.FromResult(ToolResult.Ok(json)); + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"액션 제안 오류: {ex.Message}")); + } + } +} diff --git a/src/AxCopilot/Services/Agent/TaskDecomposer.cs b/src/AxCopilot/Services/Agent/TaskDecomposer.cs new file mode 100644 index 0000000..07d50ef --- /dev/null +++ b/src/AxCopilot/Services/Agent/TaskDecomposer.cs @@ -0,0 +1,95 @@ +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// LLM 응답 텍스트에서 작업 계획(단계 목록)을 추출합니다. +/// Plan-and-Solve 논문의 경량 구현: 번호가 매겨진 단계를 파싱하여 진행률 추적에 사용합니다. +/// +public static class TaskDecomposer +{ + // 번호 매긴 단계 패턴: "1. ...", "1) ...", "Step 1: ..." + private static readonly Regex StepPattern = new( + @"(?:^|\n)\s*(?:(?:Step\s*)?(\d+)[.):\-]\s*)(.+?)(?=\n|$)", + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + /// + /// LLM 텍스트 응답에서 계획 단계를 추출합니다. + /// + /// 단계 목록. 2개 미만이면 빈 리스트 (계획이 아닌 것으로 판단). + public static List ExtractSteps(string text) + { + if (string.IsNullOrWhiteSpace(text)) return []; + + var matches = StepPattern.Matches(text); + if (matches.Count < 2) return []; + + var steps = new List(); + int lastNum = 0; + + foreach (Match m in matches) + { + if (int.TryParse(m.Groups[1].Value, out var num)) + { + // 연속 번호인지 확인 (1,2,3... 또는 첫 번째) + if (num == lastNum + 1 || lastNum == 0) + { + var stepText = m.Groups[2].Value.Trim(); + // 마크다운 기호 제거 (볼드, 이탤릭, 코드, 링크 등) + stepText = Regex.Replace(stepText, @"\*\*(.+?)\*\*", "$1"); // **볼드** + stepText = Regex.Replace(stepText, @"\*(.+?)\*", "$1"); // *이탤릭* + stepText = Regex.Replace(stepText, @"`(.+?)`", "$1"); // `코드` + stepText = Regex.Replace(stepText, @"\[(.+?)\]\(.+?\)", "$1"); // [링크](url) + stepText = stepText.TrimEnd(':', ' '); + // 너무 짧거나 긴 것은 제외 + if (stepText.Length >= 3 && stepText.Length <= 300) + { + steps.Add(stepText); + lastNum = num; + } + } + } + } + + // 최소 2단계, 최대 20단계 + return steps.Count >= 2 ? steps.Take(20).ToList() : []; + } + + /// + /// 도구 호출과 매칭하여 현재 어느 단계를 실행 중인지 추정합니다. + /// + public static int EstimateCurrentStep(List steps, string toolName, string toolSummary, int lastStep) + { + if (steps.Count == 0) return 0; + + // 다음 단계부터 검색 (역행하지 않음) + for (int i = lastStep; i < steps.Count; i++) + { + var step = steps[i].ToLowerInvariant(); + var tool = toolName.ToLowerInvariant(); + var summary = toolSummary.ToLowerInvariant(); + + // 단계 텍스트에 도구명이나 주요 키워드가 포함되면 매칭 + if (step.Contains(tool) || + ContainsKeywordOverlap(step, summary)) + { + return i; + } + } + + // 매칭 실패 → 마지막 단계 + 1로 전진 (최소 진행) + return Math.Min(lastStep + 1, steps.Count - 1); + } + + private static bool ContainsKeywordOverlap(string stepText, string summary) + { + if (string.IsNullOrEmpty(summary)) return false; + + // 의미 있는 키워드 추출 (3자 이상 단어) + var summaryWords = summary.Split(' ', '/', '\\', '.', ',', ':', ';', '(', ')') + .Where(w => w.Length >= 3) + .Take(5); + + return summaryWords.Any(w => stepText.Contains(w)); + } +} diff --git a/src/AxCopilot/Services/Agent/TaskStateService.cs b/src/AxCopilot/Services/Agent/TaskStateService.cs new file mode 100644 index 0000000..f687467 --- /dev/null +++ b/src/AxCopilot/Services/Agent/TaskStateService.cs @@ -0,0 +1,160 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace AxCopilot.Services.Agent; + +/// 세션 전체에 걸쳐 유지되는 구조화된 작업 상태 (Working Memory). +public class TaskState +{ + [JsonPropertyName("session_id")] + public string SessionId { get; set; } = ""; + + [JsonPropertyName("current_task")] + public string CurrentTask { get; set; } = ""; + + [JsonPropertyName("referenced_files")] + public List ReferencedFiles { get; set; } = new(); + + [JsonPropertyName("decision_log")] + public List DecisionLog { get; set; } = new(); + + [JsonPropertyName("key_facts")] + public Dictionary KeyFacts { get; set; } = new(); + + [JsonPropertyName("context_summary")] + public string ContextSummary { get; set; } = ""; + + [JsonPropertyName("updated_at")] + public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; +} + +public record DecisionLogEntry +{ + [JsonPropertyName("ts")] + public DateTime Timestamp { get; init; } = DateTime.UtcNow; + + [JsonPropertyName("decision")] + public string Decision { get; init; } = ""; + + [JsonPropertyName("reason")] + public string Reason { get; init; } = ""; + + [JsonPropertyName("alternatives")] + public string[] Alternatives { get; init; } = Array.Empty(); +} + +/// +/// 대화 압축 시에도 유지되는 Working Memory 관리 서비스. +/// 저장: %APPDATA%\AxCopilot\sessions\{sessionId}\task_state.json +/// +public class TaskStateService +{ + private static readonly string BaseDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "sessions"); + + private static readonly JsonSerializerOptions _json = new() + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }; + + private TaskState? _current; + + public TaskState? Current => _current; + + public async Task InitializeAsync(string sessionId) + { + var path = GetPath(sessionId); + if (File.Exists(path)) + { + try + { + var json = await File.ReadAllTextAsync(path); + _current = JsonSerializer.Deserialize(json, _json) ?? new TaskState { SessionId = sessionId }; + } + catch (Exception) + { + _current = new TaskState { SessionId = sessionId }; + } + } + else + { + _current = new TaskState { SessionId = sessionId }; + } + } + + public async Task UpdateCurrentTaskAsync(string taskDescription) + { + if (_current == null) return; + _current.CurrentTask = taskDescription; + _current.UpdatedAt = DateTime.UtcNow; + await SaveAsync(); + } + + public async Task AddReferencedFileAsync(string filePath) + { + if (_current == null) return; + if (!_current.ReferencedFiles.Contains(filePath, StringComparer.OrdinalIgnoreCase)) + _current.ReferencedFiles.Add(filePath); + await SaveAsync(); + } + + public async Task LogDecisionAsync(string decision, string reason, string[] alternatives) + { + if (_current == null) return; + _current.DecisionLog.Add(new DecisionLogEntry + { + Decision = decision, + Reason = reason, + Alternatives = alternatives + }); + // 최대 50개 유지 + if (_current.DecisionLog.Count > 50) + _current.DecisionLog.RemoveAt(0); + await SaveAsync(); + } + + public async Task UpdateContextSummaryAsync(string summary) + { + if (_current == null) return; + _current.ContextSummary = summary; + _current.UpdatedAt = DateTime.UtcNow; + await SaveAsync(); + } + + /// 컨텍스트 압축 시 TaskState를 시스템 프롬프트에 주입할 텍스트 빌드. + public string BuildCompactContextInjection() + { + if (_current == null) return string.Empty; + var sb = new StringBuilder(); + sb.AppendLine("## 현재 작업 상태 (Working Memory)"); + if (!string.IsNullOrEmpty(_current.CurrentTask)) + sb.AppendLine($"현재 작업: {_current.CurrentTask}"); + if (!string.IsNullOrEmpty(_current.ContextSummary)) + sb.AppendLine($"이전 대화 요약: {_current.ContextSummary}"); + if (_current.ReferencedFiles.Count > 0) + sb.AppendLine($"참조 파일: {string.Join(", ", _current.ReferencedFiles.TakeLast(10))}"); + if (_current.DecisionLog.Count > 0) + { + sb.AppendLine("최근 의사결정:"); + foreach (var d in _current.DecisionLog.TakeLast(3)) + sb.AppendLine($" - {d.Decision} (이유: {d.Reason})"); + } + return sb.ToString(); + } + + private async Task SaveAsync() + { + if (_current == null) return; + var dir = Path.Combine(BaseDir, _current.SessionId); + Directory.CreateDirectory(dir); + var json = JsonSerializer.Serialize(_current, _json); + await File.WriteAllTextAsync(GetPath(_current.SessionId), json); + } + + private static string GetPath(string sessionId) + => Path.Combine(BaseDir, sessionId, "task_state.json"); +} diff --git a/src/AxCopilot/Services/Agent/TaskTrackerTool.cs b/src/AxCopilot/Services/Agent/TaskTrackerTool.cs new file mode 100644 index 0000000..4049e28 --- /dev/null +++ b/src/AxCopilot/Services/Agent/TaskTrackerTool.cs @@ -0,0 +1,208 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace AxCopilot.Services.Agent; + +/// 작업 폴더 내 TODO/태스크 추적 도구. +public class TaskTrackerTool : IAgentTool +{ + public string Name => "task_tracker"; + public string Description => + "Track tasks/TODOs in the working folder. Actions: " + + "'scan' — scan source files for TODO/FIXME/HACK/BUG comments; " + + "'add' — add a task to .ax/tasks.json; " + + "'list' — list tasks from .ax/tasks.json; " + + "'done' — mark a task as completed."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["action"] = new() + { + Type = "string", + Description = "Action: scan, add, list, done", + Enum = ["scan", "add", "list", "done"], + }, + ["title"] = new() + { + Type = "string", + Description = "Task title (for 'add')", + }, + ["priority"] = new() + { + Type = "string", + Description = "Priority: high, medium, low (for 'add', default: medium)", + }, + ["id"] = new() + { + Type = "integer", + Description = "Task ID (for 'done')", + }, + ["extensions"] = new() + { + Type = "string", + Description = "File extensions to scan, comma-separated (default: .cs,.py,.js,.ts,.java,.cpp,.c)", + }, + }, + Required = ["action"], + }; + + private const string TaskFileName = ".ax/tasks.json"; + + public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default) + { + var action = args.GetProperty("action").GetString() ?? ""; + + try + { + return action switch + { + "scan" => Task.FromResult(ScanTodos(args, context)), + "add" => Task.FromResult(AddTask(args, context)), + "list" => Task.FromResult(ListTasks(context)), + "done" => Task.FromResult(MarkDone(args, context)), + _ => Task.FromResult(ToolResult.Fail($"Unknown action: {action}")), + }; + } + catch (Exception ex) + { + return Task.FromResult(ToolResult.Fail($"태스크 추적 오류: {ex.Message}")); + } + } + + private static ToolResult ScanTodos(JsonElement args, AgentContext context) + { + var extStr = args.TryGetProperty("extensions", out var e) + ? e.GetString() ?? ".cs,.py,.js,.ts,.java,.cpp,.c" + : ".cs,.py,.js,.ts,.java,.cpp,.c"; + var exts = new HashSet( + extStr.Split(',').Select(s => s.Trim().StartsWith('.') ? s.Trim() : "." + s.Trim()), + StringComparer.OrdinalIgnoreCase); + + var patterns = new[] { "TODO", "FIXME", "HACK", "BUG", "XXX" }; + var results = new List<(string File, int Line, string Tag, string Text)>(); + var workDir = context.WorkFolder; + + if (!Directory.Exists(workDir)) + return ToolResult.Fail($"작업 폴더 없음: {workDir}"); + + foreach (var file in Directory.EnumerateFiles(workDir, "*", SearchOption.AllDirectories)) + { + if (!exts.Contains(Path.GetExtension(file))) continue; + if (file.Contains("bin") || file.Contains("obj") || file.Contains("node_modules")) continue; + + var lineNum = 0; + foreach (var line in File.ReadLines(file)) + { + lineNum++; + foreach (var pat in patterns) + { + var idx = line.IndexOf(pat, StringComparison.OrdinalIgnoreCase); + if (idx >= 0) + { + var text = line[(idx + pat.Length)..].TrimStart(':', ' '); + if (text.Length > 100) text = text[..100] + "..."; + var relPath = Path.GetRelativePath(workDir, file); + results.Add((relPath, lineNum, pat, text)); + break; + } + } + if (results.Count >= 200) break; + } + if (results.Count >= 200) break; + } + + if (results.Count == 0) + return ToolResult.Ok("TODO/FIXME 코멘트가 발견되지 않았습니다."); + + var sb = new StringBuilder(); + sb.AppendLine($"발견된 TODO 코멘트: {results.Count}개"); + foreach (var (file, line, tag, text) in results) + sb.AppendLine($" [{tag}] {file}:{line} — {text}"); + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult AddTask(JsonElement args, AgentContext context) + { + var title = args.TryGetProperty("title", out var t) ? t.GetString() ?? "" : ""; + if (string.IsNullOrEmpty(title)) + return ToolResult.Fail("'title'이 필요합니다."); + + var priority = args.TryGetProperty("priority", out var p) ? p.GetString() ?? "medium" : "medium"; + var tasks = LoadTasks(context); + + var maxId = tasks.Count > 0 ? tasks.Max(t2 => t2.Id) : 0; + tasks.Add(new TaskItem + { + Id = maxId + 1, + Title = title, + Priority = priority, + Created = DateTime.Now.ToString("yyyy-MM-dd HH:mm"), + Done = false, + }); + + SaveTasks(context, tasks); + return ToolResult.Ok($"태스크 추가: #{maxId + 1} — {title} (우선순위: {priority})"); + } + + private static ToolResult ListTasks(AgentContext context) + { + var tasks = LoadTasks(context); + if (tasks.Count == 0) + return ToolResult.Ok("등록된 태스크가 없습니다."); + + var sb = new StringBuilder(); + sb.AppendLine($"태스크 목록 ({tasks.Count}개):"); + foreach (var task in tasks.OrderBy(t => t.Done).ThenByDescending(t => t.Priority == "high" ? 0 : t.Priority == "medium" ? 1 : 2)) + { + var status = task.Done ? "✓" : "○"; + sb.AppendLine($" {status} #{task.Id} [{task.Priority}] {task.Title} ({task.Created})"); + } + return ToolResult.Ok(sb.ToString()); + } + + private static ToolResult MarkDone(JsonElement args, AgentContext context) + { + if (!args.TryGetProperty("id", out var idEl)) + return ToolResult.Fail("'id'가 필요합니다."); + var id = idEl.GetInt32(); + + var tasks = LoadTasks(context); + var task = tasks.FirstOrDefault(t => t.Id == id); + if (task == null) return ToolResult.Fail($"태스크 #{id}를 찾을 수 없습니다."); + + task.Done = true; + SaveTasks(context, tasks); + return ToolResult.Ok($"태스크 #{id} 완료: {task.Title}"); + } + + private static List LoadTasks(AgentContext context) + { + var path = Path.Combine(context.WorkFolder, TaskFileName); + if (!File.Exists(path)) return new List(); + var json = File.ReadAllText(path); + return JsonSerializer.Deserialize>(json) ?? new List(); + } + + private static void SaveTasks(AgentContext context, List tasks) + { + var path = Path.Combine(context.WorkFolder, TaskFileName); + var dir = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) + Directory.CreateDirectory(dir); + var json = JsonSerializer.Serialize(tasks, new JsonSerializerOptions { WriteIndented = true }); + File.WriteAllText(path, json); + } + + private class TaskItem + { + [JsonPropertyName("id")] public int Id { get; set; } + [JsonPropertyName("title")] public string Title { get; set; } = ""; + [JsonPropertyName("priority")] public string Priority { get; set; } = "medium"; + [JsonPropertyName("created")] public string Created { get; set; } = ""; + [JsonPropertyName("done")] public bool Done { get; set; } + } +} diff --git a/src/AxCopilot/Services/Agent/TemplateRenderTool.cs b/src/AxCopilot/Services/Agent/TemplateRenderTool.cs new file mode 100644 index 0000000..ab7ca52 --- /dev/null +++ b/src/AxCopilot/Services/Agent/TemplateRenderTool.cs @@ -0,0 +1,205 @@ +using System.IO; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; + +namespace AxCopilot.Services.Agent; + +/// +/// Mustache 스타일 변수 치환 기반 템플릿 렌더링 도구. +/// {{variable}}, {{#list}}...{{/list}} 반복, {{^cond}}...{{/cond}} 조건부 렌더링을 지원합니다. +/// +public class TemplateRenderTool : IAgentTool +{ + public string Name => "template_render"; + public string Description => + "Render a template file with variable substitution and loops. " + + "Supports Mustache-style syntax: {{variable}}, {{#list}}...{{/list}} loops, " + + "{{^variable}}...{{/variable}} inverted sections (if empty/false). " + + "Useful for generating repetitive documents like emails, reports, invoices from templates."; + + public ToolParameterSchema Parameters => new() + { + Properties = new() + { + ["template_path"] = new() + { + Type = "string", + Description = "Path to template file (.html, .md, .txt). Relative to work folder." + }, + ["template_text"] = new() + { + Type = "string", + Description = "Inline template text (used if template_path is not provided)." + }, + ["variables"] = new() + { + Type = "object", + Description = "Key-value pairs for substitution. Values can be strings, numbers, " + + "or arrays of objects for loops. Example: {\"name\": \"홍길동\", \"items\": [{\"product\": \"A\", \"qty\": 10}]}" + }, + ["output_path"] = new() + { + Type = "string", + Description = "Output file path. If not provided, returns rendered text." + }, + }, + Required = ["variables"] + }; + + public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct) + { + // 템플릿 텍스트 로드 + string template; + if (args.TryGetProperty("template_path", out var tpEl) && !string.IsNullOrEmpty(tpEl.GetString())) + { + var templatePath = FileReadTool.ResolvePath(tpEl.GetString()!, context.WorkFolder); + if (!context.IsPathAllowed(templatePath)) + return ToolResult.Fail($"경로 접근 차단: {templatePath}"); + if (!File.Exists(templatePath)) + return ToolResult.Fail($"템플릿 파일 없음: {templatePath}"); + template = await File.ReadAllTextAsync(templatePath, ct); + } + else if (args.TryGetProperty("template_text", out var ttEl) && !string.IsNullOrEmpty(ttEl.GetString())) + { + template = ttEl.GetString()!; + } + else + { + return ToolResult.Fail("template_path 또는 template_text가 필요합니다."); + } + + if (!args.TryGetProperty("variables", out var varsEl)) + return ToolResult.Fail("variables가 필요합니다."); + + try + { + // 렌더링 + var rendered = Render(template, varsEl); + + // 출력 + if (args.TryGetProperty("output_path", out var opEl) && !string.IsNullOrEmpty(opEl.GetString())) + { + var outputPath = FileReadTool.ResolvePath(opEl.GetString()!, context.WorkFolder); + if (context.ActiveTab == "Cowork") outputPath = AgentContext.EnsureTimestampedPath(outputPath); + if (!context.IsPathAllowed(outputPath)) + return ToolResult.Fail($"경로 접근 차단: {outputPath}"); + if (!await context.CheckWritePermissionAsync(Name, outputPath)) + return ToolResult.Fail($"쓰기 권한 거부: {outputPath}"); + + var dir = Path.GetDirectoryName(outputPath); + if (!string.IsNullOrEmpty(dir)) Directory.CreateDirectory(dir); + await File.WriteAllTextAsync(outputPath, rendered, Encoding.UTF8, ct); + + return ToolResult.Ok( + $"✅ 템플릿 렌더링 완료: {Path.GetFileName(outputPath)} ({rendered.Length:N0}자)", + outputPath); + } + + // 파일로 저장하지 않으면 텍스트로 반환 + if (rendered.Length > 4000) + return ToolResult.Ok($"✅ 렌더링 완료 ({rendered.Length:N0}자):\n{rendered[..3900]}...\n[이하 생략]"); + + return ToolResult.Ok($"✅ 렌더링 완료 ({rendered.Length:N0}자):\n{rendered}"); + } + catch (Exception ex) + { + return ToolResult.Fail($"템플릿 렌더링 실패: {ex.Message}"); + } + } + + /// Mustache 스타일 템플릿을 렌더링합니다. + internal static string Render(string template, JsonElement variables) + { + var result = template; + + // 1. 반복 섹션 {{#key}}...{{/key}} + result = Regex.Replace(result, @"\{\{#(\w+)\}\}(.*?)\{\{/\1\}\}", match => + { + var key = match.Groups[1].Value; + var body = match.Groups[2].Value; + + if (!variables.TryGetProperty(key, out var val)) return ""; + + if (val.ValueKind == JsonValueKind.Array) + { + var sb = new StringBuilder(); + int index = 0; + foreach (var item in val.EnumerateArray()) + { + var itemBody = body; + // {{.key}} 또는 {{key}} 치환 + if (item.ValueKind == JsonValueKind.Object) + { + foreach (var prop in item.EnumerateObject()) + { + itemBody = itemBody + .Replace($"{{{{{prop.Name}}}}}", prop.Value.ToString()) + .Replace($"{{{{.{prop.Name}}}}}", prop.Value.ToString()); + } + } + else + { + itemBody = itemBody.Replace("{{.}}", item.ToString()); + } + // {{@index}} 치환 + itemBody = itemBody.Replace("{{@index}}", (index + 1).ToString()); + sb.Append(itemBody); + index++; + } + return sb.ToString(); + } + + // bool true → 섹션 표시 + if (val.ValueKind == JsonValueKind.True) + return RenderSimpleVars(body, variables); + + // 값이 있으면 표시 + if (val.ValueKind != JsonValueKind.False && + val.ValueKind != JsonValueKind.Null && + val.ValueKind != JsonValueKind.Undefined) + return RenderSimpleVars(body, variables); + + return ""; + }, RegexOptions.Singleline); + + // 2. 반전 섹션 {{^key}}...{{/key}} (값이 없거나 false일 때 표시) + result = Regex.Replace(result, @"\{\{\^(\w+)\}\}(.*?)\{\{/\1\}\}", match => + { + var key = match.Groups[1].Value; + var body = match.Groups[2].Value; + + if (!variables.TryGetProperty(key, out var val)) return body; + if (val.ValueKind == JsonValueKind.False || + val.ValueKind == JsonValueKind.Null || + (val.ValueKind == JsonValueKind.Array && val.GetArrayLength() == 0) || + (val.ValueKind == JsonValueKind.String && string.IsNullOrEmpty(val.GetString()))) + return body; + + return ""; + }, RegexOptions.Singleline); + + // 3. 단순 변수 치환 {{key}} + result = RenderSimpleVars(result, variables); + + return result; + } + + private static string RenderSimpleVars(string text, JsonElement variables) + { + return Regex.Replace(text, @"\{\{(\w+)\}\}", match => + { + var key = match.Groups[1].Value; + if (!variables.TryGetProperty(key, out var val)) return match.Value; + + return val.ValueKind switch + { + JsonValueKind.String => val.GetString() ?? "", + JsonValueKind.Number => val.ToString(), + JsonValueKind.True => "true", + JsonValueKind.False => "false", + _ => val.ToString() + }; + }); + } +} diff --git a/src/AxCopilot/Services/Agent/TemplateService.cs b/src/AxCopilot/Services/Agent/TemplateService.cs new file mode 100644 index 0000000..1a4f61b --- /dev/null +++ b/src/AxCopilot/Services/Agent/TemplateService.cs @@ -0,0 +1,734 @@ +using Markdig; + +namespace AxCopilot.Services.Agent; + +/// +/// 문서 디자인 템플릿 서비스. +/// 테마 무드(현대적, 전문가, 창의적 등)에 따라 CSS 스타일을 제공합니다. +/// HtmlSkill, DocxSkill 등에서 호출하여 문서 생성 시 적용합니다. +/// +public static class TemplateService +{ + /// 사용 가능한 테마 무드 목록. + public static readonly TemplateMood[] AvailableMoods = + [ + new("modern", "현대적", "🔷", "깔끔한 라인, 넓은 여백, 미니멀한 색상 — 테크 기업 스타일"), + new("professional", "전문가", "📊", "신뢰감 있는 네이비 톤, 데이터 중심 레이아웃 — 비즈니스 보고서"), + new("creative", "아이디어", "🎨", "생동감 있는 그라데이션, 카드 레이아웃 — 브레인스토밍·기획서"), + new("minimal", "미니멀", "◻️", "극도로 절제된 흑백, 타이포그래피 중심 — 학술·논문 스타일"), + new("elegant", "우아한", "✨", "세리프 서체, 골드 포인트, 격식 있는 레이아웃 — 공식 문서"), + new("dark", "다크 모드", "🌙", "어두운 배경, 고대비 텍스트 — 개발자·야간 리딩"), + new("colorful", "컬러풀", "🌈", "밝고 활기찬 멀티 컬러, 둥근 모서리 — 프레젠테이션·요약"), + new("corporate", "기업 공식", "🏢", "보수적인 레이아웃, 로고 영역, 페이지 번호 — 사내 공식 보고서"), + new("magazine", "매거진", "📰", "멀티 컬럼, 큰 히어로 헤더, 인용 강조 — 뉴스레터·매거진"), + new("dashboard", "대시보드", "📈", "KPI 카드, 차트 영역, 그리드 레이아웃 — 데이터 대시보드"), + ]; + + // ── 커스텀 무드 저장소 ── + private static readonly Dictionary _customMoods = new(StringComparer.OrdinalIgnoreCase); + + /// 커스텀 무드를 로드합니다 (앱 시작 시 SettingsService에서 호출). + public static void LoadCustomMoods(IEnumerable entries) + { + _customMoods.Clear(); + foreach (var e in entries) + if (!string.IsNullOrWhiteSpace(e.Key)) + _customMoods[e.Key] = e; + } + + /// 내장 + 커스텀 무드를 합친 전체 목록. + public static IReadOnlyList AllMoods + { + get + { + var list = new List(AvailableMoods); + foreach (var cm in _customMoods.Values) + list.Add(new TemplateMood(cm.Key, cm.Label, cm.Icon, cm.Description)); + return list; + } + } + + /// 무드 키로 CSS 스타일을 반환합니다. 없으면 modern 기본값. 공통 CSS가 자동 첨부됩니다. + public static string GetCss(string moodKey) + { + // 커스텀 무드 우선 확인 + if (_customMoods.TryGetValue(moodKey, out var custom)) + return custom.Css + "\n" + CssShared; + + var moodCss = moodKey switch + { + "modern" => CssModern, + "professional" => CssProfessional, + "creative" => CssCreative, + "minimal" => CssMinimal, + "elegant" => CssElegant, + "dark" => CssDark, + "colorful" => CssColorful, + "corporate" => CssCorporate, + "magazine" => CssMagazine, + "dashboard" => CssDashboard, + _ => CssModern, + }; + return moodCss + "\n" + CssShared; + } + + /// 무드 키로 TemplateMood를 반환합니다. + public static TemplateMood? GetMood(string key) + { + var builtin = Array.Find(AvailableMoods, m => m.Key == key); + if (builtin != null) return builtin; + return _customMoods.TryGetValue(key, out var cm) + ? new TemplateMood(cm.Key, cm.Label, cm.Icon, cm.Description) + : null; + } + + /// LLM 시스템 프롬프트에 삽입할 무드 목록 설명. + public static string GetMoodListForPrompt() + { + var sb = new System.Text.StringBuilder(); + sb.AppendLine("Available document design moods (pass as 'mood' parameter to html_create):"); + foreach (var m in AllMoods) + sb.AppendLine($" - \"{m.Key}\": {m.Label} — {m.Description}"); + return sb.ToString(); + } + + /// Markdown 텍스트를 무드 CSS가 적용된 HTML 문서로 변환합니다. + public static string RenderMarkdownToHtml(string markdown, string moodKey = "modern") + { + var pipeline = new MarkdownPipelineBuilder() + .UseAdvancedExtensions() + .Build(); + var bodyHtml = Markdown.ToHtml(markdown, pipeline); + var css = GetCss(moodKey); + return $""" + + + + + + + + +
      + {bodyHtml} +
      + + + """; + } + + /// + /// HTML 본문에서 워크스페이스 하위 파일/폴더 경로를 파란색으로 강조합니다. + /// 코드 블록(<code>, <pre>) 내부의 경로 텍스트를 감지하여 파란색 스타일을 적용합니다. + /// + public static string HighlightFilePaths(string html, string? workFolder) + { + if (string.IsNullOrEmpty(workFolder) || string.IsNullOrEmpty(html)) + return html; + + // 태그 내부의 텍스트 중 파일/폴더 경로 패턴을 감지하여 파란색으로 감싸기 + // 패턴: 슬래시/백슬래시를 포함한 경로 또는 확장자가 있는 파일명 + var pathPattern = new System.Text.RegularExpressions.Regex( + @"(?])(\b[A-Za-z]:\\[^\s<>""]+|" + // 절대 경로: C:\folder\file.ext + @"\.{0,2}/[^\s<>""]+(?:\.[a-zA-Z]{1,10})?|" + // 상대 경로: ./src/file.cs, ../util.py + @"\b[\w\-]+(?:/[\w\-\.]+)+(?:\.[a-zA-Z]{1,10})?|" + // 폴더/파일: src/utils/helper.cs + @"\b[\w\-]+\.(?:cs|py|js|ts|tsx|jsx|json|xml|html|htm|css|md|txt|yml|yaml|toml|sh|bat|ps1|csproj|sln|docx|xlsx|pptx|pdf|csv)\b)", // 파일명.확장자 + System.Text.RegularExpressions.RegexOptions.Compiled); + + //
       블록 외부의 텍스트에서만 치환
      +        // 간단 접근: 모든 텍스트 노드에서 경로를 감지
      +        return pathPattern.Replace(html, match =>
      +        {
      +            var path = match.Value;
      +            // 이미 HTML 태그 내부이거나 href/src 속성값이면 건너뛰기
      +            var prefix = html[..match.Index];
      +            if (prefix.Length > 0)
      +            {
      +                var lastLt = prefix.LastIndexOf('<');
      +                var lastGt = prefix.LastIndexOf('>');
      +                if (lastLt > lastGt) return path; // 태그 속성 내부
      +            }
      +            return $"{path}";
      +        });
      +    }
      +
      +    /// 무드의 주요 색상을 반환합니다 (갤러리 미리보기용).
      +    public static MoodColors GetMoodColors(string moodKey)
      +    {
      +        return moodKey switch
      +        {
      +            "modern"       => new("#f5f5f7", "#ffffff", "#1d1d1f", "#6e6e73", "#0066cc", "#e5e5e7"),
      +            "professional" => new("#f0f2f5", "#ffffff", "#1a365d", "#4a5568", "#2c5282", "#e2e8f0"),
      +            "creative"     => new("#faf5ff", "#ffffff", "#2d3748", "#718096", "#7c3aed", "#e9d5ff"),
      +            "minimal"      => new("#fafafa", "#ffffff", "#111111", "#555555", "#333333", "#e0e0e0"),
      +            "elegant"      => new("#fefdf8", "#fffef9", "#2c1810", "#6b5c4f", "#b8860b", "#e8e0d4"),
      +            "dark"         => new("#0d1117", "#161b22", "#e6edf3", "#8b949e", "#58a6ff", "#30363d"),
      +            "colorful"     => new("#f0f9ff", "#ffffff", "#1e293b", "#64748b", "#3b82f6", "#e0f2fe"),
      +            "corporate"    => new("#f3f4f6", "#ffffff", "#1f2937", "#6b7280", "#1e40af", "#e5e7eb"),
      +            "magazine"     => new("#f9fafb", "#ffffff", "#111827", "#6b7280", "#dc2626", "#f3f4f6"),
      +            "dashboard"    => new("#0f172a", "#1e293b", "#f1f5f9", "#94a3b8", "#3b82f6", "#334155"),
      +            _              => new("#f5f5f7", "#ffffff", "#1d1d1f", "#6e6e73", "#0066cc", "#e5e5e7"),
      +        };
      +    }
      +
      +    /// 무드 갤러리용 색상 정보.
      +    public record MoodColors(string Background, string CardBg, string PrimaryText, string SecondaryText, string Accent, string Border);
      +
      +    // ════════════════════════════════════════════════════════════════════
      +    //  CSS 템플릿 정의
      +    // ════════════════════════════════════════════════════════════════════
      +
      +    #region Modern — 현대적
      +    private const string CssModern = """
      +        @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Inter', 'Segoe UI', 'Malgun Gothic', sans-serif;
      +               background: #f5f5f7; color: #1d1d1f; line-height: 1.75; padding: 48px 24px; }
      +        .container { max-width: 880px; margin: 0 auto; background: #fff;
      +                     border-radius: 16px; padding: 56px 52px;
      +                     box-shadow: 0 4px 24px rgba(0,0,0,0.06); }
      +        h1 { font-size: 28px; font-weight: 700; letter-spacing: -0.5px; color: #1d1d1f; margin-bottom: 4px; }
      +        h2 { font-size: 20px; font-weight: 600; margin: 36px 0 14px; color: #1d1d1f;
      +             padding-bottom: 8px; border-bottom: 2px solid #e5e5ea; }
      +        h3 { font-size: 16px; font-weight: 600; margin: 24px 0 10px; color: #0071e3; }
      +        .meta { font-size: 12px; color: #86868b; margin-bottom: 28px; letter-spacing: 0.3px; }
      +        p { margin: 10px 0; font-size: 14.5px; }
      +        table { width: 100%; border-collapse: collapse; margin: 20px 0; font-size: 13.5px;
      +                border-radius: 10px; overflow: hidden; }
      +        th { background: #f5f5f7; text-align: left; padding: 12px 14px; font-weight: 600;
      +             color: #1d1d1f; border-bottom: 2px solid #d2d2d7; }
      +        td { padding: 10px 14px; border-bottom: 1px solid #f0f0f2; }
      +        tr:hover td { background: #f9f9fb; }
      +        ul, ol { margin: 10px 0 10px 28px; font-size: 14.5px; }
      +        li { margin: 5px 0; }
      +        code { background: #f5f5f7; padding: 2px 8px; border-radius: 6px; font-size: 13px;
      +               font-family: 'SF Mono', Consolas, monospace; color: #e3116c; }
      +        pre { background: #1d1d1f; color: #f5f5f7; padding: 20px; border-radius: 12px;
      +              overflow-x: auto; font-size: 13px; margin: 16px 0; line-height: 1.6; }
      +        pre code { background: transparent; color: inherit; padding: 0; }
      +        blockquote { border-left: 3px solid #0071e3; padding: 12px 20px; margin: 16px 0;
      +                     background: #f0f7ff; color: #1d1d1f; border-radius: 0 8px 8px 0; font-size: 14px; }
      +        .highlight { background: linear-gradient(120deg, #e0f0ff 0%, #f0e0ff 100%);
      +                     padding: 16px 20px; border-radius: 10px; margin: 16px 0; }
      +        .badge { display: inline-block; padding: 3px 10px; border-radius: 20px; font-size: 11px;
      +                 font-weight: 600; background: #0071e3; color: #fff; margin: 2px 4px 2px 0; }
      +        """;
      +    #endregion
      +
      +    #region Professional — 전문가
      +    private const string CssProfessional = """
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Segoe UI', 'Malgun Gothic', Arial, sans-serif;
      +               background: #eef1f5; color: #1e293b; line-height: 1.7; padding: 40px 20px; }
      +        .container { max-width: 900px; margin: 0 auto; background: #fff;
      +                     border-radius: 8px; padding: 48px;
      +                     box-shadow: 0 1px 8px rgba(0,0,0,0.08);
      +                     border-top: 4px solid #1e3a5f; }
      +        h1 { font-size: 26px; font-weight: 700; color: #1e3a5f; margin-bottom: 4px; }
      +        h2 { font-size: 18px; font-weight: 600; margin: 32px 0 12px; color: #1e3a5f;
      +             border-bottom: 2px solid #c8d6e5; padding-bottom: 6px; }
      +        h3 { font-size: 15px; font-weight: 600; margin: 22px 0 8px; color: #2c5282; }
      +        .meta { font-size: 12px; color: #94a3b8; margin-bottom: 24px; border-bottom: 1px solid #e2e8f0;
      +                padding-bottom: 12px; }
      +        p { margin: 8px 0; font-size: 14px; }
      +        table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 13.5px;
      +                border: 1px solid #e2e8f0; }
      +        th { background: #1e3a5f; color: #fff; text-align: left; padding: 10px 14px;
      +             font-weight: 600; font-size: 12.5px; text-transform: uppercase; letter-spacing: 0.5px; }
      +        td { padding: 9px 14px; border-bottom: 1px solid #e2e8f0; }
      +        tr:nth-child(even) td { background: #f8fafc; }
      +        tr:hover td { background: #eef2ff; }
      +        ul, ol { margin: 8px 0 8px 24px; }
      +        li { margin: 4px 0; font-size: 14px; }
      +        code { background: #f1f5f9; padding: 2px 6px; border-radius: 4px; font-size: 12.5px;
      +               font-family: Consolas, monospace; color: #1e3a5f; }
      +        pre { background: #0f172a; color: #e2e8f0; padding: 18px; border-radius: 6px;
      +              overflow-x: auto; font-size: 12.5px; margin: 14px 0; }
      +        pre code { background: transparent; color: inherit; padding: 0; }
      +        blockquote { border-left: 4px solid #1e3a5f; padding: 10px 18px; margin: 14px 0;
      +                     background: #f0f4f8; color: #334155; }
      +        .callout { background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 6px;
      +                   padding: 14px 18px; margin: 14px 0; font-size: 13.5px; }
      +        .callout strong { color: #1e40af; }
      +        """;
      +    #endregion
      +
      +    #region Creative — 아이디어
      +    private const string CssCreative = """
      +        @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap');
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Poppins', 'Segoe UI', 'Malgun Gothic', sans-serif;
      +               background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
      +               min-height: 100vh; color: #2d3748; line-height: 1.75; padding: 48px 24px; }
      +        .container { max-width: 880px; margin: 0 auto; background: rgba(255,255,255,0.95);
      +                     backdrop-filter: blur(20px); border-radius: 20px; padding: 52px;
      +                     box-shadow: 0 20px 60px rgba(0,0,0,0.15); }
      +        h1 { font-size: 30px; font-weight: 700;
      +             background: linear-gradient(135deg, #667eea, #e040fb);
      +             -webkit-background-clip: text; -webkit-text-fill-color: transparent;
      +             margin-bottom: 4px; }
      +        h2 { font-size: 20px; font-weight: 600; margin: 36px 0 14px; color: #553c9a;
      +             position: relative; padding-left: 16px; }
      +        h2::before { content: ''; position: absolute; left: 0; top: 4px; width: 4px; height: 22px;
      +                     background: linear-gradient(180deg, #667eea, #e040fb); border-radius: 4px; }
      +        h3 { font-size: 16px; font-weight: 600; margin: 22px 0 10px; color: #7c3aed; }
      +        .meta { font-size: 12px; color: #a0aec0; margin-bottom: 28px; }
      +        p { margin: 10px 0; font-size: 14.5px; }
      +        table { width: 100%; border-collapse: separate; border-spacing: 0; margin: 18px 0;
      +                font-size: 13.5px; border-radius: 12px; overflow: hidden;
      +                box-shadow: 0 4px 12px rgba(102,126,234,0.1); }
      +        th { background: linear-gradient(135deg, #667eea, #764ba2); color: #fff;
      +             text-align: left; padding: 12px 14px; font-weight: 600; }
      +        td { padding: 10px 14px; border-bottom: 1px solid #f0e7fe; }
      +        tr:hover td { background: #faf5ff; }
      +        ul, ol { margin: 10px 0 10px 28px; font-size: 14.5px; }
      +        li { margin: 5px 0; }
      +        li::marker { color: #7c3aed; }
      +        code { background: #f5f3ff; padding: 2px 8px; border-radius: 6px; font-size: 13px;
      +               font-family: 'Fira Code', Consolas, monospace; color: #7c3aed; }
      +        pre { background: #1a1a2e; color: #e0d4f5; padding: 20px; border-radius: 14px;
      +              overflow-x: auto; font-size: 13px; margin: 16px 0;
      +              border: 1px solid rgba(124,58,237,0.2); }
      +        pre code { background: transparent; color: inherit; padding: 0; }
      +        blockquote { border-left: 4px solid #7c3aed; padding: 14px 20px; margin: 16px 0;
      +                     background: linear-gradient(135deg, #f5f3ff, #faf5ff);
      +                     border-radius: 0 12px 12px 0; font-style: italic; }
      +        .card { background: #fff; border: 1px solid #e9d8fd; border-radius: 14px;
      +                padding: 20px; margin: 14px 0; box-shadow: 0 2px 8px rgba(124,58,237,0.08); }
      +        .tag { display: inline-block; padding: 3px 12px; border-radius: 20px; font-size: 11px;
      +               font-weight: 500; background: linear-gradient(135deg, #667eea, #764ba2);
      +               color: #fff; margin: 2px 4px 2px 0; }
      +        """;
      +    #endregion
      +
      +    #region Minimal — 미니멀
      +    private const string CssMinimal = """
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Georgia', 'Batang', serif;
      +               background: #fff; color: #222; line-height: 1.85; padding: 60px 24px; }
      +        .container { max-width: 720px; margin: 0 auto; padding: 0; }
      +        h1 { font-size: 32px; font-weight: 400; color: #000; margin-bottom: 4px;
      +             letter-spacing: -0.5px; }
      +        h2 { font-size: 20px; font-weight: 400; margin: 40px 0 14px; color: #000;
      +             border-bottom: 1px solid #ddd; padding-bottom: 8px; }
      +        h3 { font-size: 16px; font-weight: 600; margin: 28px 0 10px; color: #333; }
      +        .meta { font-size: 12px; color: #999; margin-bottom: 36px; font-style: italic; }
      +        p { margin: 12px 0; font-size: 15px; text-align: justify; }
      +        table { width: 100%; border-collapse: collapse; margin: 20px 0; font-size: 14px; }
      +        th { text-align: left; padding: 8px 0; font-weight: 600; border-bottom: 2px solid #000;
      +             font-size: 12px; text-transform: uppercase; letter-spacing: 1px; color: #555; }
      +        td { padding: 8px 0; border-bottom: 1px solid #eee; }
      +        tr:hover td { background: #fafafa; }
      +        ul, ol { margin: 12px 0 12px 20px; font-size: 15px; }
      +        li { margin: 6px 0; }
      +        code { background: #f7f7f7; padding: 2px 6px; border-radius: 2px; font-size: 13px;
      +               font-family: 'Courier New', monospace; }
      +        pre { background: #f7f7f7; color: #333; padding: 18px; margin: 16px 0;
      +              overflow-x: auto; font-size: 13px; border: 1px solid #e5e5e5; }
      +        pre code { background: transparent; padding: 0; }
      +        blockquote { border-left: 3px solid #000; padding: 8px 20px; margin: 16px 0;
      +                     color: #555; font-style: italic; }
      +        hr { border: none; border-top: 1px solid #ddd; margin: 32px 0; }
      +        """;
      +    #endregion
      +
      +    #region Elegant — 우아한
      +    private const string CssElegant = """
      +        @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700&family=Source+Sans+3:wght@300;400;600&display=swap');
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Source Sans 3', 'Malgun Gothic', sans-serif;
      +               background: #faf8f5; color: #3d3929; line-height: 1.75; padding: 48px 24px; }
      +        .container { max-width: 860px; margin: 0 auto; background: #fff;
      +                     border-radius: 4px; padding: 56px 52px;
      +                     box-shadow: 0 1px 4px rgba(0,0,0,0.06);
      +                     border: 1px solid #e8e4dd; }
      +        h1 { font-family: 'Playfair Display', Georgia, serif; font-size: 30px;
      +             font-weight: 700; color: #2c2416; margin-bottom: 6px; letter-spacing: -0.3px; }
      +        h2 { font-family: 'Playfair Display', Georgia, serif; font-size: 20px;
      +             font-weight: 600; margin: 36px 0 14px; color: #2c2416;
      +             border-bottom: 1px solid #d4c9b8; padding-bottom: 8px; }
      +        h3 { font-size: 15px; font-weight: 600; margin: 24px 0 10px; color: #8b7a5e; }
      +        .meta { font-size: 12px; color: #b0a48e; margin-bottom: 28px; letter-spacing: 0.5px;
      +                text-transform: uppercase; }
      +        p { margin: 10px 0; font-size: 14.5px; }
      +        table { width: 100%; border-collapse: collapse; margin: 18px 0; font-size: 13.5px; }
      +        th { background: #f8f5f0; text-align: left; padding: 10px 14px; font-weight: 600;
      +             color: #5a4d38; border-bottom: 2px solid #d4c9b8; font-size: 12.5px;
      +             letter-spacing: 0.5px; }
      +        td { padding: 9px 14px; border-bottom: 1px solid #f0ece5; }
      +        tr:hover td { background: #fdfcfa; }
      +        ul, ol { margin: 10px 0 10px 26px; font-size: 14.5px; }
      +        li { margin: 5px 0; }
      +        code { background: #f8f5f0; padding: 2px 7px; border-radius: 3px; font-size: 12.5px;
      +               font-family: 'Courier New', monospace; color: #8b6914; }
      +        pre { background: #2c2416; color: #e8e0d0; padding: 18px; border-radius: 4px;
      +              overflow-x: auto; font-size: 12.5px; margin: 16px 0; }
      +        pre code { background: transparent; color: inherit; padding: 0; }
      +        blockquote { border-left: 3px solid #c9a96e; padding: 12px 20px; margin: 16px 0;
      +                     background: #fdf9f0; color: #5a4d38; font-style: italic;
      +                     font-family: 'Playfair Display', Georgia, serif; }
      +        .ornament { text-align: center; color: #c9a96e; font-size: 18px; margin: 24px 0; letter-spacing: 8px; }
      +        """;
      +    #endregion
      +
      +    #region Dark — 다크 모드
      +    private const string CssDark = """
      +        @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&family=Inter:wght@300;400;500;600;700&display=swap');
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Inter', 'Segoe UI', 'Malgun Gothic', sans-serif;
      +               background: #0d1117; color: #e6edf3; line-height: 1.75; padding: 48px 24px; }
      +        .container { max-width: 880px; margin: 0 auto; background: #161b22;
      +                     border-radius: 12px; padding: 52px;
      +                     border: 1px solid #30363d;
      +                     box-shadow: 0 8px 32px rgba(0,0,0,0.3); }
      +        h1 { font-size: 28px; font-weight: 700; color: #f0f6fc; margin-bottom: 4px; }
      +        h2 { font-size: 20px; font-weight: 600; margin: 36px 0 14px; color: #f0f6fc;
      +             border-bottom: 1px solid #30363d; padding-bottom: 8px; }
      +        h3 { font-size: 16px; font-weight: 600; margin: 24px 0 10px; color: #58a6ff; }
      +        .meta { font-size: 12px; color: #8b949e; margin-bottom: 28px; }
      +        p { margin: 10px 0; font-size: 14.5px; color: #c9d1d9; }
      +        table { width: 100%; border-collapse: collapse; margin: 18px 0; font-size: 13.5px;
      +                border: 1px solid #30363d; border-radius: 8px; overflow: hidden; }
      +        th { background: #21262d; text-align: left; padding: 10px 14px; font-weight: 600;
      +             color: #f0f6fc; border-bottom: 1px solid #30363d; }
      +        td { padding: 9px 14px; border-bottom: 1px solid #21262d; color: #c9d1d9; }
      +        tr:hover td { background: #1c2128; }
      +        ul, ol { margin: 10px 0 10px 28px; font-size: 14.5px; color: #c9d1d9; }
      +        li { margin: 5px 0; }
      +        code { background: #1c2128; padding: 2px 8px; border-radius: 6px; font-size: 13px;
      +               font-family: 'JetBrains Mono', Consolas, monospace; color: #79c0ff; }
      +        pre { background: #0d1117; color: #c9d1d9; padding: 20px; border-radius: 8px;
      +              overflow-x: auto; font-size: 13px; margin: 16px 0;
      +              border: 1px solid #30363d; }
      +        pre code { background: transparent; color: inherit; padding: 0; }
      +        blockquote { border-left: 3px solid #58a6ff; padding: 12px 20px; margin: 16px 0;
      +                     background: #161b22; color: #8b949e;
      +                     border-radius: 0 8px 8px 0; }
      +        a { color: #58a6ff; text-decoration: none; }
      +        a:hover { text-decoration: underline; }
      +        .label { display: inline-block; padding: 2px 8px; border-radius: 12px; font-size: 11px;
      +                 font-weight: 500; border: 1px solid #30363d; color: #8b949e; margin: 2px 4px 2px 0; }
      +        """;
      +    #endregion
      +
      +    #region Colorful — 컬러풀
      +    private const string CssColorful = """
      +        @import url('https://fonts.googleapis.com/css2?family=Nunito:wght@300;400;600;700;800&display=swap');
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Nunito', 'Segoe UI', 'Malgun Gothic', sans-serif;
      +               background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 50%, #ffecd2 100%);
      +               min-height: 100vh; color: #2d3436; line-height: 1.75; padding: 48px 24px; }
      +        .container { max-width: 880px; margin: 0 auto; background: #fff;
      +                     border-radius: 20px; padding: 52px;
      +                     box-shadow: 0 12px 40px rgba(0,0,0,0.08); }
      +        h1 { font-size: 30px; font-weight: 800; color: #e17055; margin-bottom: 4px; }
      +        h2 { font-size: 20px; font-weight: 700; margin: 34px 0 14px; color: #6c5ce7;
      +             padding: 6px 14px; background: #f8f0ff; border-radius: 8px; display: inline-block; }
      +        h3 { font-size: 16px; font-weight: 700; margin: 22px 0 10px; color: #00b894; }
      +        .meta { font-size: 12px; color: #b2bec3; margin-bottom: 28px; }
      +        p { margin: 10px 0; font-size: 14.5px; }
      +        table { width: 100%; border-collapse: separate; border-spacing: 0; margin: 18px 0;
      +                font-size: 13.5px; border-radius: 14px; overflow: hidden;
      +                box-shadow: 0 2px 8px rgba(108,92,231,0.1); }
      +        th { background: linear-gradient(135deg, #a29bfe, #6c5ce7); color: #fff;
      +             text-align: left; padding: 12px 14px; font-weight: 700; }
      +        td { padding: 10px 14px; border-bottom: 1px solid #f0f0f0; }
      +        tr:hover td { background: #faf0ff; }
      +        ul, ol { margin: 10px 0 10px 28px; font-size: 14.5px; }
      +        li { margin: 5px 0; }
      +        li::marker { color: #e17055; font-weight: 700; }
      +        code { background: #fff3e0; padding: 2px 8px; border-radius: 6px; font-size: 13px;
      +               font-family: Consolas, monospace; color: #e17055; }
      +        pre { background: #2d3436; color: #dfe6e9; padding: 20px; border-radius: 14px;
      +              overflow-x: auto; font-size: 13px; margin: 16px 0; }
      +        pre code { background: transparent; color: inherit; padding: 0; }
      +        blockquote { border-left: 4px solid #fdcb6e; padding: 14px 20px; margin: 16px 0;
      +                     background: #fffbf0; border-radius: 0 12px 12px 0; color: #636e72; }
      +        .chip { display: inline-block; padding: 4px 14px; border-radius: 20px; font-size: 12px;
      +                font-weight: 700; color: #fff; margin: 3px 4px 3px 0; }
      +        .chip-red { background: #e17055; } .chip-blue { background: #74b9ff; }
      +        .chip-green { background: #00b894; } .chip-purple { background: #6c5ce7; }
      +        .chip-yellow { background: #fdcb6e; color: #2d3436; }
      +        """;
      +    #endregion
      +
      +    #region Corporate — 기업 공식
      +    private const string CssCorporate = """
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Segoe UI', 'Malgun Gothic', Arial, sans-serif;
      +               background: #f2f2f2; color: #333; line-height: 1.65; padding: 32px 20px; }
      +        .container { max-width: 900px; margin: 0 auto; background: #fff; padding: 0;
      +                     box-shadow: 0 1px 4px rgba(0,0,0,0.1); }
      +        .header-bar { background: #003366; color: #fff; padding: 28px 40px 20px;
      +                      border-bottom: 3px solid #ff6600; }
      +        .header-bar h1 { font-size: 22px; font-weight: 700; color: #fff; margin-bottom: 2px; }
      +        .header-bar .meta { color: rgba(255,255,255,0.7); margin-bottom: 0; font-size: 12px; }
      +        .body-content { padding: 36px 40px 40px; }
      +        h1 { font-size: 22px; font-weight: 700; color: #003366; margin-bottom: 4px; }
      +        h2 { font-size: 17px; font-weight: 600; margin: 28px 0 10px; color: #003366;
      +             border-left: 4px solid #ff6600; padding-left: 12px; }
      +        h3 { font-size: 14.5px; font-weight: 600; margin: 20px 0 8px; color: #004488; }
      +        .meta { font-size: 11.5px; color: #999; margin-bottom: 20px; }
      +        p { margin: 8px 0; font-size: 13.5px; }
      +        table { width: 100%; border-collapse: collapse; margin: 14px 0; font-size: 12.5px;
      +                border: 1px solid #ddd; }
      +        th { background: #003366; color: #fff; text-align: left; padding: 8px 12px;
      +             font-weight: 600; font-size: 11.5px; }
      +        td { padding: 7px 12px; border: 1px solid #e0e0e0; }
      +        tr:nth-child(even) td { background: #f9f9f9; }
      +        ul, ol { margin: 8px 0 8px 24px; font-size: 13.5px; }
      +        li { margin: 3px 0; }
      +        code { background: #f4f4f4; padding: 1px 5px; border-radius: 3px; font-size: 12px;
      +               font-family: Consolas, monospace; }
      +        pre { background: #f4f4f4; color: #333; padding: 14px; border-radius: 4px;
      +              overflow-x: auto; font-size: 12px; margin: 12px 0; border: 1px solid #ddd; }
      +        pre code { background: transparent; padding: 0; }
      +        blockquote { border-left: 4px solid #ff6600; padding: 10px 16px; margin: 12px 0;
      +                     background: #fff8f0; color: #555; }
      +        .footer { text-align: center; font-size: 10.5px; color: #aaa; margin-top: 32px;
      +                  padding-top: 12px; border-top: 1px solid #eee; }
      +        .stamp { display: inline-block; border: 2px solid #003366; color: #003366; padding: 4px 16px;
      +                 border-radius: 4px; font-size: 11px; font-weight: 700; text-transform: uppercase;
      +                 letter-spacing: 1px; }
      +        """;
      +    #endregion
      +
      +    #region Magazine — 매거진
      +    private const string CssMagazine = """
      +        @import url('https://fonts.googleapis.com/css2?family=Merriweather:wght@300;400;700;900&family=Open+Sans:wght@300;400;600;700&display=swap');
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Open Sans', 'Malgun Gothic', sans-serif;
      +               background: #f0ece3; color: #2c2c2c; line-height: 1.7; padding: 48px 24px; }
      +        .container { max-width: 900px; margin: 0 auto; background: #fff;
      +                     border-radius: 2px; padding: 0; overflow: hidden;
      +                     box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
      +        .hero { background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
      +                padding: 48px 44px 36px; color: #fff; }
      +        .hero h1 { font-family: 'Merriweather', Georgia, serif; font-size: 32px; font-weight: 900;
      +                   line-height: 1.3; margin-bottom: 8px; }
      +        .hero .meta { color: rgba(255,255,255,0.6); margin-bottom: 0; font-size: 13px; }
      +        .content { padding: 40px 44px 44px; }
      +        h1 { font-family: 'Merriweather', Georgia, serif; font-size: 28px; font-weight: 900;
      +             color: #1a1a2e; margin-bottom: 4px; }
      +        h2 { font-family: 'Merriweather', Georgia, serif; font-size: 20px; font-weight: 700;
      +             margin: 36px 0 14px; color: #1a1a2e; }
      +        h3 { font-size: 15px; font-weight: 700; margin: 24px 0 10px; color: #e94560;
      +             text-transform: uppercase; letter-spacing: 1px; font-size: 12px; }
      +        .meta { font-size: 12px; color: #999; margin-bottom: 24px; }
      +        p { margin: 10px 0; font-size: 15px; }
      +        p:first-of-type::first-letter { font-family: 'Merriweather', Georgia, serif;
      +             font-size: 48px; float: left; line-height: 1; padding-right: 8px; color: #e94560;
      +             font-weight: 900; }
      +        table { width: 100%; border-collapse: collapse; margin: 18px 0; font-size: 13.5px; }
      +        th { background: #1a1a2e; color: #fff; text-align: left; padding: 10px 14px;
      +             font-weight: 600; }
      +        td { padding: 9px 14px; border-bottom: 1px solid #eee; }
      +        tr:hover td { background: #fafafa; }
      +        ul, ol { margin: 10px 0 10px 28px; font-size: 14.5px; }
      +        li { margin: 5px 0; }
      +        code { background: #f5f5f5; padding: 2px 6px; border-radius: 3px; font-size: 12.5px;
      +               font-family: 'Courier New', monospace; }
      +        pre { background: #1a1a2e; color: #e0e0e0; padding: 18px; border-radius: 4px;
      +              overflow-x: auto; font-size: 12.5px; margin: 16px 0; }
      +        pre code { background: transparent; color: inherit; padding: 0; }
      +        blockquote { font-family: 'Merriweather', Georgia, serif; font-size: 18px;
      +                     font-style: italic; color: #555; border: none; padding: 20px 0; margin: 24px 0;
      +                     text-align: center; position: relative; }
      +        blockquote::before { content: '\201C'; font-size: 60px; color: #e94560;
      +                             position: absolute; top: -10px; left: 50%; transform: translateX(-50%);
      +                             opacity: 0.3; }
      +        .pullquote { font-size: 20px; font-family: 'Merriweather', Georgia, serif;
      +                     font-weight: 700; color: #e94560; border-top: 3px solid #e94560;
      +                     border-bottom: 3px solid #e94560; padding: 16px 0; margin: 24px 0;
      +                     text-align: center; }
      +        """;
      +    #endregion
      +
      +    #region Dashboard — 대시보드
      +    private const string CssDashboard = """
      +        @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
      +        * { margin:0; padding:0; box-sizing:border-box; }
      +        body { font-family: 'Inter', 'Segoe UI', 'Malgun Gothic', sans-serif;
      +               background: #f0f2f5; color: #1a1a2e; line-height: 1.6; padding: 32px 24px; }
      +        .container { max-width: 1000px; margin: 0 auto; padding: 0; background: transparent; }
      +        h1 { font-size: 26px; font-weight: 700; color: #1a1a2e; margin-bottom: 4px; }
      +        h2 { font-size: 17px; font-weight: 600; margin: 28px 0 14px; color: #1a1a2e; }
      +        h3 { font-size: 14px; font-weight: 600; margin: 18px 0 8px; color: #6c7893; }
      +        .meta { font-size: 12px; color: #8c95a6; margin-bottom: 24px; }
      +        p { margin: 8px 0; font-size: 13.5px; color: #4a5568; }
      +        .kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
      +                    gap: 16px; margin: 20px 0; }
      +        .kpi-card { background: #fff; border-radius: 12px; padding: 20px;
      +                    box-shadow: 0 1px 4px rgba(0,0,0,0.06); }
      +        .kpi-card .kpi-label { font-size: 12px; color: #8c95a6; font-weight: 500;
      +                               text-transform: uppercase; letter-spacing: 0.5px; }
      +        .kpi-card .kpi-value { font-size: 28px; font-weight: 700; color: #1a1a2e; margin: 4px 0; }
      +        .kpi-card .kpi-change { font-size: 12px; font-weight: 600; }
      +        .kpi-up { color: #10b981; } .kpi-down { color: #ef4444; }
      +        .chart-area { background: #fff; border-radius: 12px; padding: 24px; margin: 16px 0;
      +                      box-shadow: 0 1px 4px rgba(0,0,0,0.06); min-height: 200px; }
      +        table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 13px;
      +                background: #fff; border-radius: 10px; overflow: hidden;
      +                box-shadow: 0 1px 4px rgba(0,0,0,0.06); }
      +        th { background: #f7f8fa; text-align: left; padding: 10px 14px; font-weight: 600;
      +             color: #6c7893; font-size: 11.5px; text-transform: uppercase; letter-spacing: 0.5px;
      +             border-bottom: 1px solid #edf0f4; }
      +        td { padding: 10px 14px; border-bottom: 1px solid #f3f4f6; }
      +        tr:hover td { background: #f9fafb; }
      +        ul, ol { margin: 8px 0 8px 24px; font-size: 13.5px; }
      +        li { margin: 4px 0; }
      +        code { background: #f1f3f5; padding: 2px 7px; border-radius: 5px; font-size: 12px;
      +               font-family: 'JetBrains Mono', Consolas, monospace; }
      +        pre { background: #1a1a2e; color: #c9d1d9; padding: 18px; border-radius: 10px;
      +              overflow-x: auto; font-size: 12px; margin: 14px 0; }
      +        pre code { background: transparent; color: inherit; padding: 0; }
      +        blockquote { border-left: 3px solid #4b5efc; padding: 10px 16px; margin: 14px 0;
      +                     background: #f0f0ff; border-radius: 0 8px 8px 0; font-size: 13px; }
      +        .status-badge { display: inline-block; padding: 2px 10px; border-radius: 12px;
      +                        font-size: 11px; font-weight: 600; }
      +        .status-ok { background: #d1fae5; color: #065f46; }
      +        .status-warn { background: #fef3c7; color: #92400e; }
      +        .status-err { background: #fee2e2; color: #991b1b; }
      +        """;
      +    #endregion
      +
      +    // ════════════════════════════════════════════════════════════════════
      +    //  공통 CSS 컴포넌트 (모든 무드에 자동 첨부)
      +    // ════════════════════════════════════════════════════════════════════
      +
      +    #region Shared — 공통 컴포넌트
      +    private const string CssShared = """
      +
      +        /* ── 목차 (TOC) ── */
      +        nav.toc { background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 10px;
      +                  padding: 20px 28px; margin: 24px 0 32px; }
      +        nav.toc h2 { font-size: 15px; font-weight: 700; margin: 0 0 12px; padding: 0; border: none;
      +                     color: inherit; display: block; background: none; }
      +        nav.toc ul { list-style: none; margin: 0; padding: 0; }
      +        nav.toc li { margin: 4px 0; }
      +        nav.toc li.toc-h3 { padding-left: 18px; }
      +        nav.toc a { text-decoration: none; color: #4b5efc; font-size: 13.5px; }
      +        nav.toc a:hover { text-decoration: underline; }
      +
      +        /* ── 커버 페이지 ── */
      +        .cover-page { text-align: center; padding: 80px 40px 60px; margin: -56px -52px 40px;
      +                      border-radius: 16px 16px 0 0; position: relative; overflow: hidden;
      +                      background: linear-gradient(135deg, #4b5efc 0%, #7c3aed 100%); color: #fff; }
      +        .cover-page h1 { font-size: 36px; font-weight: 800; margin-bottom: 12px; color: #fff;
      +                         -webkit-text-fill-color: #fff; }
      +        .cover-page .cover-subtitle { font-size: 18px; opacity: 0.9; margin-bottom: 24px; }
      +        .cover-page .cover-meta { font-size: 13px; opacity: 0.7; }
      +        .cover-page .cover-divider { width: 60px; height: 3px; background: rgba(255,255,255,0.5);
      +                                     margin: 20px auto; border-radius: 2px; }
      +
      +        /* ── 콜아웃 (callout) ── */
      +        .callout { border-radius: 8px; padding: 16px 20px; margin: 16px 0; font-size: 14px;
      +                   border-left: 4px solid; display: flex; gap: 10px; align-items: flex-start; }
      +        .callout::before { font-size: 16px; flex-shrink: 0; margin-top: 1px; }
      +        .callout-info { background: #eff6ff; border-color: #3b82f6; color: #1e40af; }
      +        .callout-info::before { content: 'ℹ️'; }
      +        .callout-warning { background: #fffbeb; border-color: #f59e0b; color: #92400e; }
      +        .callout-warning::before { content: '⚠️'; }
      +        .callout-tip { background: #f0fdf4; border-color: #22c55e; color: #166534; }
      +        .callout-tip::before { content: '💡'; }
      +        .callout-danger { background: #fef2f2; border-color: #ef4444; color: #991b1b; }
      +        .callout-danger::before { content: '🚨'; }
      +        .callout-note { background: #f5f3ff; border-color: #8b5cf6; color: #5b21b6; }
      +        .callout-note::before { content: '📝'; }
      +
      +        /* ── 배지 (badge) — 공통 ── */
      +        .badge, .tag, .chip { display: inline-block; padding: 3px 10px; border-radius: 20px;
      +                               font-size: 11px; font-weight: 600; margin: 2px 4px 2px 0; }
      +        .badge-blue { background: #dbeafe; color: #1e40af; }
      +        .badge-green { background: #d1fae5; color: #065f46; }
      +        .badge-red { background: #fee2e2; color: #991b1b; }
      +        .badge-yellow { background: #fef3c7; color: #92400e; }
      +        .badge-purple { background: #ede9fe; color: #5b21b6; }
      +        .badge-gray { background: #f3f4f6; color: #374151; }
      +        .badge-orange { background: #ffedd5; color: #9a3412; }
      +
      +        /* ── 하이라이트 박스 ── */
      +        .highlight-box { background: linear-gradient(120deg, #e0f0ff 0%, #f0e0ff 100%);
      +                         padding: 16px 20px; border-radius: 10px; margin: 16px 0; }
      +
      +        /* ── CSS 차트 (bar/horizontal) ── */
      +        .chart-bar { margin: 20px 0; }
      +        .chart-bar .bar-item { display: flex; align-items: center; margin: 6px 0; gap: 10px; }
      +        .chart-bar .bar-label { min-width: 100px; font-size: 13px; text-align: right; flex-shrink: 0; }
      +        .chart-bar .bar-track { flex: 1; background: #e5e7eb; border-radius: 6px; height: 22px;
      +                                overflow: hidden; }
      +        .chart-bar .bar-fill { height: 100%; border-radius: 6px; display: flex; align-items: center;
      +                               padding: 0 8px; font-size: 11px; font-weight: 600; color: #fff;
      +                               transition: width 0.3s ease; min-width: fit-content; }
      +        .bar-fill.blue { background: #3b82f6; } .bar-fill.green { background: #22c55e; }
      +        .bar-fill.red { background: #ef4444; } .bar-fill.yellow { background: #f59e0b; }
      +        .bar-fill.purple { background: #8b5cf6; } .bar-fill.orange { background: #f97316; }
      +
      +        /* ── CSS 도넛 차트 ── */
      +        .chart-donut { width: 160px; height: 160px; border-radius: 50%; margin: 20px auto;
      +                       background: conic-gradient(var(--seg1-color, #3b82f6) 0% var(--seg1, 0%),
      +                                                  var(--seg2-color, #22c55e) var(--seg1, 0%) var(--seg2, 0%),
      +                                                  var(--seg3-color, #f59e0b) var(--seg2, 0%) var(--seg3, 0%),
      +                                                  var(--seg4-color, #ef4444) var(--seg3, 0%) var(--seg4, 0%),
      +                                                  #e5e7eb var(--seg4, 0%) 100%);
      +                       display: flex; align-items: center; justify-content: center; position: relative; }
      +        .chart-donut::after { content: ''; width: 100px; height: 100px; background: #fff;
      +                              border-radius: 50%; position: absolute; }
      +        .chart-donut .donut-label { position: absolute; z-index: 1; font-size: 18px; font-weight: 700; }
      +
      +        /* ── 진행률 바 ── */
      +        .progress { background: #e5e7eb; border-radius: 8px; height: 10px; margin: 8px 0;
      +                    overflow: hidden; }
      +        .progress-fill { height: 100%; border-radius: 8px; background: #3b82f6; }
      +
      +        /* ── 타임라인 ── */
      +        .timeline { position: relative; padding-left: 28px; margin: 20px 0; }
      +        .timeline::before { content: ''; position: absolute; left: 8px; top: 0; bottom: 0;
      +                            width: 2px; background: #e5e7eb; }
      +        .timeline-item { position: relative; margin: 16px 0; }
      +        .timeline-item::before { content: ''; position: absolute; left: -24px; top: 5px;
      +                                 width: 12px; height: 12px; border-radius: 50%; background: #4b5efc;
      +                                 border: 2px solid #fff; box-shadow: 0 0 0 2px #4b5efc; }
      +        .timeline-item .timeline-date { font-size: 12px; color: #6b7280; font-weight: 600; }
      +        .timeline-item .timeline-content { font-size: 14px; margin-top: 4px; }
      +
      +        /* ── 섹션 자동 번호 ── */
      +        body { counter-reset: section; }
      +        h2.numbered { counter-increment: section; counter-reset: subsection; }
      +        h2.numbered::before { content: counter(section) '. '; }
      +        h3.numbered { counter-increment: subsection; }
      +        h3.numbered::before { content: counter(section) '-' counter(subsection) '. '; }
      +
      +        /* ── 그리드 레이아웃 ── */
      +        .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin: 16px 0; }
      +        .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin: 16px 0; }
      +        .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin: 16px 0; }
      +
      +        /* ── 카드 공통 ── */
      +        .card { background: #fff; border: 1px solid #e5e7eb; border-radius: 12px;
      +                padding: 20px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }
      +        .card-header { font-size: 15px; font-weight: 700; margin-bottom: 8px; }
      +
      +        /* ── 구분선 ── */
      +        .divider { border: none; border-top: 1px solid #e5e7eb; margin: 32px 0; }
      +        .divider-thick { border: none; border-top: 3px solid #e5e7eb; margin: 40px 0; }
      +
      +        /* ── 인쇄/PDF 최적화 ── */
      +        @media print {
      +            body { background: #fff !important; padding: 0 !important; }
      +            .container { box-shadow: none !important; border: none !important;
      +                         max-width: none !important; padding: 20px !important; }
      +            .cover-page { break-after: page; }
      +            h2, h3 { break-after: avoid; }
      +            table, figure, .chart-bar, .callout { break-inside: avoid; }
      +            nav.toc { break-after: page; }
      +            a { color: inherit !important; text-decoration: none !important; }
      +            a[href]::after { content: ' (' attr(href) ')'; font-size: 10px; color: #999; }
      +            .no-print { display: none !important; }
      +        }
      +        """;
      +    #endregion
      +}
      +
      +/// 테마 무드 정의.
      +public record TemplateMood(string Key, string Label, string Icon, string Description);
      diff --git a/src/AxCopilot/Services/Agent/TestLoopTool.cs b/src/AxCopilot/Services/Agent/TestLoopTool.cs
      new file mode 100644
      index 0000000..d317d30
      --- /dev/null
      +++ b/src/AxCopilot/Services/Agent/TestLoopTool.cs
      @@ -0,0 +1,315 @@
      +using System.IO;
      +using System.Text;
      +using System.Text.Json;
      +
      +namespace AxCopilot.Services.Agent;
      +
      +/// 
      +/// 자동 테스트 생성 + 실행 + 결과 분석 도구.
      +/// 코드 변경 → 관련 테스트 자동 생성 → 실행 → 결과 기반 피드백 루프.
      +/// 
      +public class TestLoopTool : IAgentTool
      +{
      +    public string Name => "test_loop";
      +
      +    public string Description =>
      +        "코드 변경에 대한 테스트를 자동으로 생성하고 실행합니다.\n" +
      +        "- action=\"generate\": 변경된 파일에 대한 테스트 코드 생성 제안\n" +
      +        "- action=\"run\": 프로젝트의 테스트를 실행하고 결과 반환\n" +
      +        "- action=\"analyze\": 테스트 결과를 분석하여 수정 방향 제시\n" +
      +        "- action=\"auto_fix\": 테스트 실행 → 실패 파싱 → 구조화된 수정 지침 반환 (반복 수정용)\n" +
      +        "테스트 프레임워크를 자동 감지합니다 (xUnit, NUnit, MSTest, pytest, Jest 등).";
      +
      +    public ToolParameterSchema Parameters => new()
      +    {
      +        Properties = new()
      +        {
      +            ["action"] = new ToolProperty
      +            {
      +                Type = "string",
      +                Description = "수행할 작업: generate | run | analyze | auto_fix",
      +                Enum = new() { "generate", "run", "analyze", "auto_fix" }
      +            },
      +            ["file_path"] = new ToolProperty
      +            {
      +                Type = "string",
      +                Description = "대상 소스 파일 경로 (generate 시 필요)"
      +            },
      +            ["test_output"] = new ToolProperty
      +            {
      +                Type = "string",
      +                Description = "분석할 테스트 출력 (analyze 시 필요)"
      +            },
      +        },
      +        Required = new() { "action" }
      +    };
      +
      +    public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default)
      +    {
      +        var action = args.TryGetProperty("action", out var a) ? a.GetString() ?? "" : "";
      +
      +        return action switch
      +        {
      +            "generate" => GenerateTestSuggestion(args, context),
      +            "run" => await RunTestsAsync(context, ct),
      +            "analyze" => AnalyzeTestOutput(args),
      +            "auto_fix" => await AutoFixAsync(context, ct),
      +            _ => ToolResult.Fail("action은 generate, run, analyze, auto_fix 중 하나여야 합니다.")
      +        };
      +    }
      +
      +    private static ToolResult GenerateTestSuggestion(JsonElement args, AgentContext context)
      +    {
      +        var filePath = args.TryGetProperty("file_path", out var f) ? f.GetString() ?? "" : "";
      +        if (string.IsNullOrEmpty(filePath))
      +            return ToolResult.Fail("file_path가 필요합니다.");
      +
      +        if (!Path.IsPathRooted(filePath) && !string.IsNullOrEmpty(context.WorkFolder))
      +            filePath = Path.Combine(context.WorkFolder, filePath);
      +
      +        if (!File.Exists(filePath))
      +            return ToolResult.Fail($"파일 없음: {filePath}");
      +
      +        var ext = Path.GetExtension(filePath).ToLowerInvariant();
      +        var (framework, testExt, convention) = ext switch
      +        {
      +            ".cs" => ("xUnit/NUnit/MSTest", ".cs", "ClassNameTests.cs"),
      +            ".py" => ("pytest", ".py", "test_module.py"),
      +            ".ts" or ".tsx" => ("Jest/Vitest", ".test.ts", "Component.test.ts"),
      +            ".js" or ".jsx" => ("Jest", ".test.js", "module.test.js"),
      +            ".java" => ("JUnit", ".java", "ClassTest.java"),
      +            ".go" => ("go test", "_test.go", "module_test.go"),
      +            _ => ("unknown", ext, "test" + ext),
      +        };
      +
      +        var content = File.ReadAllText(filePath);
      +        var lineCount = content.Split('\n').Length;
      +
      +        return ToolResult.Ok(
      +            $"테스트 생성 제안:\n" +
      +            $"  대상 파일: {Path.GetFileName(filePath)} ({lineCount}줄)\n" +
      +            $"  감지된 프레임워크: {framework}\n" +
      +            $"  테스트 파일 명명: {convention}\n" +
      +            $"  테스트 파일 확장자: {testExt}\n\n" +
      +            $"file_write 도구로 테스트 파일을 생성한 후, test_loop action=\"run\"으로 실행하세요.");
      +    }
      +
      +    private static async Task RunTestsAsync(AgentContext context, CancellationToken ct)
      +    {
      +        if (string.IsNullOrEmpty(context.WorkFolder))
      +            return ToolResult.Fail("작업 폴더가 설정되어 있지 않습니다.");
      +
      +        // 프로젝트 타입 자동 감지 → 테스트 명령 결정
      +        var (cmd, cmdArgs) = DetectTestCommand(context.WorkFolder);
      +        if (cmd == null)
      +            return ToolResult.Fail("테스트 프레임워크를 감지할 수 없습니다. 지원: .NET (dotnet test), Python (pytest), Node.js (npm test)");
      +
      +        try
      +        {
      +            var psi = new System.Diagnostics.ProcessStartInfo
      +            {
      +                FileName = cmd,
      +                Arguments = cmdArgs,
      +                WorkingDirectory = context.WorkFolder,
      +                UseShellExecute = false,
      +                RedirectStandardOutput = true,
      +                RedirectStandardError = true,
      +                CreateNoWindow = true,
      +            };
      +
      +            using var proc = System.Diagnostics.Process.Start(psi);
      +            if (proc == null) return ToolResult.Fail("테스트 프로세스 시작 실패");
      +
      +            using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
      +            cts.CancelAfter(TimeSpan.FromSeconds(120));
      +
      +            var stdout = await proc.StandardOutput.ReadToEndAsync(cts.Token);
      +            var stderr = await proc.StandardError.ReadToEndAsync(cts.Token);
      +            await proc.WaitForExitAsync(cts.Token);
      +
      +            var sb = new StringBuilder();
      +            sb.AppendLine($"테스트 실행 결과 (exit code: {proc.ExitCode}):");
      +            sb.AppendLine($"명령: {cmd} {cmdArgs}");
      +            sb.AppendLine();
      +            if (!string.IsNullOrWhiteSpace(stdout)) sb.AppendLine(stdout);
      +            if (!string.IsNullOrWhiteSpace(stderr)) sb.AppendLine($"[STDERR]\n{stderr}");
      +
      +            return proc.ExitCode == 0
      +                ? ToolResult.Ok(sb.ToString())
      +                : ToolResult.Ok($"테스트 실패 (exit code {proc.ExitCode}):\n{sb}");
      +        }
      +        catch (Exception ex)
      +        {
      +            return ToolResult.Fail($"테스트 실행 오류: {ex.Message}");
      +        }
      +    }
      +
      +    private static ToolResult AnalyzeTestOutput(JsonElement args)
      +    {
      +        var output = args.TryGetProperty("test_output", out var o) ? o.GetString() ?? "" : "";
      +        if (string.IsNullOrEmpty(output))
      +            return ToolResult.Fail("test_output이 필요합니다.");
      +
      +        var sb = new StringBuilder();
      +        sb.AppendLine("테스트 결과 분석:");
      +
      +        var lines = output.Split('\n');
      +        var failedCount = lines.Count(l => l.Contains("FAIL", StringComparison.OrdinalIgnoreCase) || l.Contains("FAILED"));
      +        var passedCount = lines.Count(l => l.Contains("PASS", StringComparison.OrdinalIgnoreCase) || l.Contains("PASSED"));
      +        var errorLines = lines.Where(l => l.Contains("Error", StringComparison.OrdinalIgnoreCase) || l.Contains("Exception")).Take(10).ToList();
      +
      +        sb.AppendLine($"  통과: {passedCount}개, 실패: {failedCount}개");
      +
      +        if (errorLines.Count > 0)
      +        {
      +            sb.AppendLine("\n주요 오류:");
      +            foreach (var line in errorLines)
      +                sb.AppendLine($"  {line.Trim()}");
      +        }
      +
      +        if (failedCount > 0)
      +            sb.AppendLine("\n다음 단계: 실패한 테스트를 확인하고 관련 코드를 수정한 후 test_loop action=\"run\"으로 다시 실행하세요.");
      +        else
      +            sb.AppendLine("\n모든 테스트가 통과했습니다.");
      +
      +        return ToolResult.Ok(sb.ToString());
      +    }
      +
      +    /// 
      +    /// auto_fix: 테스트 실행 → 실패 파싱 → 구조화된 수정 지침 반환.
      +    /// LLM이 이 결과를 받아 코드를 수정하고 다시 auto_fix를 호출하는 반복 루프를 형성합니다.
      +    /// 
      +    private static async Task AutoFixAsync(AgentContext context, CancellationToken ct)
      +    {
      +        // 1. 테스트 실행
      +        var runResult = await RunTestsAsync(context, ct);
      +        var output = runResult.Output;
      +
      +        // 2. 테스트 전체 통과 → 성공 종료
      +        var lines = output.Split('\n');
      +        var failedCount = lines.Count(l =>
      +            l.Contains("FAIL", StringComparison.OrdinalIgnoreCase) ||
      +            l.Contains("FAILED", StringComparison.OrdinalIgnoreCase));
      +
      +        if (failedCount == 0 && runResult.Success && output.Contains("exit code: 0"))
      +            return ToolResult.Ok("[AUTO_FIX: ALL_PASSED]\n모든 테스트가 통과했습니다. 수정 루프를 종료하세요.");
      +
      +        // 3. 실패 파싱 → 구조화된 실패 정보
      +        var sb = new StringBuilder();
      +        sb.AppendLine("[AUTO_FIX: FAILURES_DETECTED]");
      +        sb.AppendLine($"실패 테스트 수: {failedCount}");
      +        sb.AppendLine();
      +
      +        // 오류 메시지 추출
      +        var errors = ExtractFailureDetails(lines);
      +        if (errors.Count > 0)
      +        {
      +            sb.AppendLine("## 실패 상세:");
      +            foreach (var err in errors.Take(10))
      +            {
      +                sb.AppendLine($"- 테스트: {err.TestName}");
      +                if (!string.IsNullOrEmpty(err.FilePath))
      +                    sb.AppendLine($"  파일: {err.FilePath}:{err.Line}");
      +                sb.AppendLine($"  오류: {err.Message}");
      +                sb.AppendLine();
      +            }
      +        }
      +
      +        sb.AppendLine("## 수정 지침:");
      +        sb.AppendLine("1. 위 오류 메시지에서 원인을 파악하세요");
      +        sb.AppendLine("2. file_read로 관련 파일을 읽고 오류 원인을 확인하세요");
      +        sb.AppendLine("3. file_edit로 코드를 수정하세요");
      +        sb.AppendLine("4. test_loop action=\"auto_fix\"를 다시 호출하여 결과를 확인하세요");
      +        sb.AppendLine("5. 모든 테스트가 통과할 때까지 반복하세요");
      +
      +        // 설정에서 최대 반복 횟수 안내
      +        var maxIter = context.Llm?.MaxTestFixIterations ?? 5;
      +        sb.AppendLine($"\n※ 최대 수정 반복 횟수: {maxIter}회. 초과 시 사용자에게 보고하세요.");
      +
      +        // 전체 테스트 출력 (잘라서)
      +        sb.AppendLine("\n## 전체 테스트 출력:");
      +        var truncated = output.Length > 3000 ? output[..3000] + "\n... (출력 일부 생략)" : output;
      +        sb.AppendLine(truncated);
      +
      +        return ToolResult.Ok(sb.ToString());
      +    }
      +
      +    /// 테스트 출력에서 실패 상세를 추출합니다.
      +    private static List ExtractFailureDetails(string[] lines)
      +    {
      +        var failures = new List();
      +        FailureDetail? current = null;
      +
      +        for (int i = 0; i < lines.Length; i++)
      +        {
      +            var line = lines[i].Trim();
      +
      +            // .NET: "X 실패 테스트명 [시간]" 또는 "Failed 테스트명"
      +            if (line.StartsWith("Failed ", StringComparison.OrdinalIgnoreCase) ||
      +                line.Contains("FAIL!", StringComparison.OrdinalIgnoreCase))
      +            {
      +                current = new FailureDetail { TestName = line };
      +                failures.Add(current);
      +            }
      +            // pytest: "FAILED test_file.py::test_name"
      +            else if (line.StartsWith("FAILED ", StringComparison.OrdinalIgnoreCase))
      +            {
      +                current = new FailureDetail { TestName = line[7..].Trim() };
      +                failures.Add(current);
      +            }
      +            // 파일 경로 + 줄 번호 패턴: "file.cs(123," or "file.py:123:"
      +            else if (current != null && string.IsNullOrEmpty(current.FilePath))
      +            {
      +                var pathMatch = System.Text.RegularExpressions.Regex.Match(line,
      +                    @"([^\s]+\.\w+)[:\(](\d+)");
      +                if (pathMatch.Success)
      +                {
      +                    current.FilePath = pathMatch.Groups[1].Value;
      +                    current.Line = int.Parse(pathMatch.Groups[2].Value);
      +                }
      +            }
      +            // 오류 메시지: "Assert.", "Error:", "Exception:"
      +            else if (current != null && string.IsNullOrEmpty(current.Message) &&
      +                     (line.Contains("Assert", StringComparison.OrdinalIgnoreCase) ||
      +                      line.Contains("Error", StringComparison.OrdinalIgnoreCase) ||
      +                      line.Contains("Exception", StringComparison.OrdinalIgnoreCase)))
      +            {
      +                current.Message = line;
      +            }
      +        }
      +
      +        return failures;
      +    }
      +
      +    private class FailureDetail
      +    {
      +        public string TestName { get; set; } = "";
      +        public string FilePath { get; set; } = "";
      +        public int Line { get; set; }
      +        public string Message { get; set; } = "";
      +    }
      +
      +    private static (string? Cmd, string Args) DetectTestCommand(string workFolder)
      +    {
      +        // .NET
      +        if (Directory.EnumerateFiles(workFolder, "*.csproj", SearchOption.AllDirectories).Any() ||
      +            Directory.EnumerateFiles(workFolder, "*.sln", SearchOption.TopDirectoryOnly).Any())
      +            return ("dotnet", "test --no-build --verbosity normal");
      +
      +        // Python
      +        if (File.Exists(Path.Combine(workFolder, "pytest.ini")) ||
      +            File.Exists(Path.Combine(workFolder, "setup.py")) ||
      +            Directory.EnumerateFiles(workFolder, "test_*.py", SearchOption.AllDirectories).Any())
      +            return ("pytest", "--tb=short -q");
      +
      +        // Node.js
      +        if (File.Exists(Path.Combine(workFolder, "package.json")))
      +            return ("npm", "test -- --passWithNoTests");
      +
      +        // Go
      +        if (Directory.EnumerateFiles(workFolder, "*_test.go", SearchOption.AllDirectories).Any())
      +            return ("go", "test ./...");
      +
      +        return (null, "");
      +    }
      +}
      diff --git a/src/AxCopilot/Services/Agent/TextSummarizeTool.cs b/src/AxCopilot/Services/Agent/TextSummarizeTool.cs
      new file mode 100644
      index 0000000..db5004a
      --- /dev/null
      +++ b/src/AxCopilot/Services/Agent/TextSummarizeTool.cs
      @@ -0,0 +1,266 @@
      +using System.IO;
      +using System.Text;
      +using System.Text.Json;
      +
      +namespace AxCopilot.Services.Agent;
      +
      +/// 
      +/// 긴 텍스트나 문서를 지정된 길이와 형식으로 요약하는 도구.
      +/// 텍스트를 청크 분할하여 단계적으로 요약합니다.
      +/// 
      +public class TextSummarizeTool : IAgentTool
      +{
      +    public string Name => "text_summarize";
      +    public string Description =>
      +        "Summarize long text or documents into a specified length and format. " +
      +        "Supports: bullet points, paragraph, executive summary, technical summary. " +
      +        "For very long texts, automatically chunks and summarizes progressively. " +
      +        "Can summarize file contents or inline text.";
      +
      +    public ToolParameterSchema Parameters => new()
      +    {
      +        Properties = new()
      +        {
      +            ["source"] = new()
      +            {
      +                Type = "string",
      +                Description = "Text to summarize, OR file path (if starts with '/' or contains '\\' or '.'). " +
      +                    "For files: supports .txt, .md, .html, .csv, .json, .log"
      +            },
      +            ["max_length"] = new()
      +            {
      +                Type = "integer",
      +                Description = "Maximum summary length in characters. Default: 500"
      +            },
      +            ["style"] = new()
      +            {
      +                Type = "string",
      +                Description = "Summary style: bullet (bullet points), paragraph (flowing text), " +
      +                    "executive (key conclusions + action items), technical (detailed with terminology). Default: bullet",
      +                Enum = ["bullet", "paragraph", "executive", "technical"]
      +            },
      +            ["language"] = new()
      +            {
      +                Type = "string",
      +                Description = "Output language: ko (Korean), en (English). Default: ko"
      +            },
      +            ["focus"] = new()
      +            {
      +                Type = "string",
      +                Description = "Optional focus area or keywords to emphasize in the summary."
      +            },
      +            ["sections"] = new()
      +            {
      +                Type = "boolean",
      +                Description = "If true, provide section-by-section summary instead of one overall summary. Default: false"
      +            },
      +        },
      +        Required = ["source"]
      +    };
      +
      +    public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct)
      +    {
      +        var source = args.GetProperty("source").GetString() ?? "";
      +        var maxLength = args.TryGetProperty("max_length", out var mlEl) && mlEl.TryGetInt32(out var ml) ? ml : 500;
      +        var style = args.TryGetProperty("style", out var stEl) ? stEl.GetString() ?? "bullet" : "bullet";
      +        var language = args.TryGetProperty("language", out var langEl) ? langEl.GetString() ?? "ko" : "ko";
      +        var focus = args.TryGetProperty("focus", out var focEl) ? focEl.GetString() ?? "" : "";
      +        var bySections = args.TryGetProperty("sections", out var secEl) && secEl.GetBoolean();
      +
      +        string text;
      +
      +        // 파일 경로인지 확인
      +        if (LooksLikeFilePath(source))
      +        {
      +            var fullPath = FileReadTool.ResolvePath(source, context.WorkFolder);
      +            if (!context.IsPathAllowed(fullPath))
      +                return ToolResult.Fail($"경로 접근 차단: {fullPath}");
      +            if (!File.Exists(fullPath))
      +                return ToolResult.Fail($"파일 없음: {fullPath}");
      +
      +            text = await File.ReadAllTextAsync(fullPath, ct);
      +
      +            // HTML 태그 제거
      +            if (fullPath.EndsWith(".html", StringComparison.OrdinalIgnoreCase) ||
      +                fullPath.EndsWith(".htm", StringComparison.OrdinalIgnoreCase))
      +            {
      +                text = StripHtmlTags(text);
      +            }
      +        }
      +        else
      +        {
      +            text = source;
      +        }
      +
      +        if (string.IsNullOrWhiteSpace(text))
      +            return ToolResult.Fail("요약할 텍스트가 비어있습니다.");
      +
      +        // 텍스트 통계
      +        var charCount = text.Length;
      +        var lineCount = text.Split('\n').Length;
      +        var wordCount = EstimateWordCount(text);
      +
      +        // 텍스트가 이미 충분히 짧으면 그대로 반환
      +        if (charCount <= maxLength)
      +            return ToolResult.Ok($"📝 텍스트가 이미 요약 기준 이하입니다 ({charCount}자).\n\n{text}");
      +
      +        // 청크 분할 (매우 긴 텍스트용)
      +        var chunks = ChunkText(text, 3000);
      +        var chunkSummaries = new List();
      +
      +        foreach (var chunk in chunks)
      +        {
      +            var summary = ExtractKeyContent(chunk, maxLength / chunks.Count, style, focus);
      +            chunkSummaries.Add(summary);
      +        }
      +
      +        // 최종 요약 구성
      +        var sb = new StringBuilder();
      +        sb.AppendLine($"📝 텍스트 요약 (원문: {charCount:N0}자, {lineCount}줄, ~{wordCount}단어)");
      +        sb.AppendLine();
      +
      +        if (bySections && chunks.Count > 1)
      +        {
      +            for (int i = 0; i < chunkSummaries.Count; i++)
      +            {
      +                sb.AppendLine($"### 섹션 {i + 1}/{chunkSummaries.Count}");
      +                sb.AppendLine(chunkSummaries[i]);
      +                sb.AppendLine();
      +            }
      +        }
      +        else
      +        {
      +            var combined = string.Join("\n", chunkSummaries);
      +            sb.AppendLine(FormatSummary(combined, style, language, focus));
      +        }
      +
      +        var result = sb.ToString();
      +        if (result.Length > maxLength + 500)
      +            result = result[..(maxLength + 500)] + "\n...[요약 길이 초과로 생략]";
      +
      +        return ToolResult.Ok(result);
      +    }
      +
      +    private static bool LooksLikeFilePath(string s)
      +    {
      +        if (string.IsNullOrEmpty(s)) return false;
      +        if (s.Contains('\\') || s.Contains('/')) return true;
      +        if (s.Length < 260 && System.Text.RegularExpressions.Regex.IsMatch(s, @"\.\w{1,5}$"))
      +            return true;
      +        return false;
      +    }
      +
      +    private static string StripHtmlTags(string html)
      +    {
      +        var text = System.Text.RegularExpressions.Regex.Replace(html, @"]*>.*?", "",
      +            System.Text.RegularExpressions.RegexOptions.Singleline);
      +        text = System.Text.RegularExpressions.Regex.Replace(text, @"]*>.*?", "",
      +            System.Text.RegularExpressions.RegexOptions.Singleline);
      +        text = System.Text.RegularExpressions.Regex.Replace(text, @"<[^>]+>", " ");
      +        text = System.Net.WebUtility.HtmlDecode(text);
      +        return System.Text.RegularExpressions.Regex.Replace(text, @"\s+", " ").Trim();
      +    }
      +
      +    private static int EstimateWordCount(string text)
      +    {
      +        var spaces = text.Count(c => c == ' ');
      +        var koreanChars = text.Count(c => c >= 0xAC00 && c <= 0xD7A3);
      +        return spaces + 1 + koreanChars / 3;
      +    }
      +
      +    private static List ChunkText(string text, int chunkSize)
      +    {
      +        var chunks = new List();
      +        var lines = text.Split('\n');
      +        var currentChunk = new StringBuilder();
      +
      +        foreach (var line in lines)
      +        {
      +            if (currentChunk.Length + line.Length > chunkSize && currentChunk.Length > 0)
      +            {
      +                chunks.Add(currentChunk.ToString());
      +                currentChunk.Clear();
      +            }
      +            currentChunk.AppendLine(line);
      +        }
      +
      +        if (currentChunk.Length > 0)
      +            chunks.Add(currentChunk.ToString());
      +
      +        return chunks;
      +    }
      +
      +    private static string ExtractKeyContent(string text, int targetLength, string style, string focus)
      +    {
      +        // 텍스트에서 핵심 문장 추출 (간단한 추출 기반 요약)
      +        var sentences = System.Text.RegularExpressions.Regex.Split(text, @"(?<=[.!?。\n])\s+")
      +            .Where(s => s.Trim().Length > 10)
      +            .ToList();
      +
      +        if (sentences.Count == 0) return text.Length > targetLength ? text[..targetLength] : text;
      +
      +        // 중요도 점수 계산
      +        var scored = sentences.Select(s =>
      +        {
      +            double score = 0;
      +            // 길이 적정성 (너무 짧지도 길지도 않은 문장 선호)
      +            if (s.Length > 20 && s.Length < 200) score += 1;
      +            // 숫자 포함 (데이터/통계)
      +            if (System.Text.RegularExpressions.Regex.IsMatch(s, @"\d+")) score += 0.5;
      +            // 키워드 포함
      +            if (!string.IsNullOrEmpty(focus) && s.Contains(focus, StringComparison.OrdinalIgnoreCase)) score += 2;
      +            // 위치 가중치 (첫 문장, 마지막 문장 중요)
      +            var idx = sentences.IndexOf(s);
      +            if (idx == 0 || idx == sentences.Count - 1) score += 1;
      +            if (idx < 3) score += 0.5; // 앞쪽 문장 선호
      +            // 핵심 키워드
      +            if (s.Contains("결론") || s.Contains("요약") || s.Contains("핵심") ||
      +                s.Contains("중요") || s.Contains("결과") || s.Contains("therefore") ||
      +                s.Contains("conclusion") || s.Contains("key"))
      +                score += 1.5;
      +
      +            return (Sentence: s.Trim(), Score: score);
      +        })
      +        .OrderByDescending(x => x.Score)
      +        .ToList();
      +
      +        // 목표 길이에 맞게 문장 선택
      +        var selected = new List();
      +        int currentLength = 0;
      +        foreach (var (sentence, _) in scored)
      +        {
      +            if (currentLength + sentence.Length > targetLength && selected.Count > 0) break;
      +            selected.Add(sentence);
      +            currentLength += sentence.Length;
      +        }
      +
      +        // 원문 순서로 재정렬
      +        selected.Sort((a, b) => text.IndexOf(a).CompareTo(text.IndexOf(b)));
      +
      +        return string.Join("\n", selected);
      +    }
      +
      +    private static string FormatSummary(string content, string style, string language, string focus)
      +    {
      +        switch (style)
      +        {
      +            case "bullet":
      +                var lines = content.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
      +                return string.Join("\n", lines.Select(l => l.StartsWith("•") || l.StartsWith("-") ? l : $"• {l}"));
      +
      +            case "executive":
      +                var sb = new StringBuilder();
      +                sb.AppendLine("**핵심 요약**");
      +                sb.AppendLine(content);
      +                if (!string.IsNullOrEmpty(focus))
      +                    sb.AppendLine($"\n**주요 관심 영역 ({focus})**");
      +                return sb.ToString();
      +
      +            case "technical":
      +                return $"**기술 요약**\n{content}";
      +
      +            default: // paragraph
      +                return content.Replace("\n\n", "\n").Replace("\n", " ").Trim();
      +        }
      +    }
      +}
      diff --git a/src/AxCopilot/Services/Agent/ToolRegistry.cs b/src/AxCopilot/Services/Agent/ToolRegistry.cs
      new file mode 100644
      index 0000000..05cfc2e
      --- /dev/null
      +++ b/src/AxCopilot/Services/Agent/ToolRegistry.cs
      @@ -0,0 +1,168 @@
      +namespace AxCopilot.Services.Agent;
      +
      +/// 
      +/// 사용 가능한 에이전트 도구/스킬을 관리하는 레지스트리.
      +/// 도구 목록을 LLM function calling에 전달하고, 이름으로 도구를 찾습니다.
      +/// 
      +public class ToolRegistry : IDisposable
      +{
      +    private readonly Dictionary _tools = new(StringComparer.OrdinalIgnoreCase);
      +
      +    /// 등록된 모든 도구 목록.
      +    public IReadOnlyCollection All => _tools.Values;
      +
      +    /// 도구를 이름으로 찾습니다.
      +    public IAgentTool? Get(string name) =>
      +        _tools.TryGetValue(name, out var tool) ? tool : null;
      +
      +    /// 도구를 등록합니다.
      +    public void Register(IAgentTool tool) => _tools[tool.Name] = tool;
      +
      +    /// 비활성 도구를 제외한 활성 도구 목록을 반환합니다.
      +    public IReadOnlyCollection GetActiveTools(IEnumerable? disabledNames = null)
      +    {
      +        if (disabledNames == null) return All;
      +        var disabled = new HashSet(disabledNames, StringComparer.OrdinalIgnoreCase);
      +        if (disabled.Count == 0) return All;
      +        return _tools.Values.Where(t => !disabled.Contains(t.Name)).ToList().AsReadOnly();
      +    }
      +
      +    /// 
      +    /// Phase 23: 비활성 도구 + IConditionalTool 자가 판단을 모두 적용한 활성 도구 목록.
      +    /// 
      +    public IReadOnlyCollection GetActiveTools(
      +        IEnumerable? disabledNames,
      +        ToolEnvironmentContext env)
      +    {
      +        var disabled = disabledNames != null
      +            ? new HashSet(disabledNames, StringComparer.OrdinalIgnoreCase)
      +            : new HashSet(StringComparer.OrdinalIgnoreCase);
      +
      +        return _tools.Values
      +            .Where(t => !disabled.Contains(t.Name))
      +            .Where(t => t is not IConditionalTool cond || cond.IsEnabled(env))
      +            .ToList()
      +            .AsReadOnly();
      +    }
      +
      +    /// IDisposable 도구를 모두 해제합니다.
      +    public void Dispose()
      +    {
      +        foreach (var tool in _tools.Values)
      +        {
      +            if (tool is IDisposable disposable)
      +                disposable.Dispose();
      +        }
      +        _tools.Clear();
      +    }
      +
      +    /// 기본 도구 + 내장 스킬을 모두 등록한 레지스트리를 생성합니다.
      +    public static ToolRegistry CreateDefault()
      +    {
      +        var registry = new ToolRegistry();
      +
      +        // 기본 도구 (파일/검색/프로세스)
      +        registry.Register(new FileReadTool());
      +        registry.Register(new FileWriteTool());
      +        registry.Register(new FileEditTool());
      +        registry.Register(new GlobTool());
      +        registry.Register(new GrepTool());
      +        registry.Register(new ProcessTool());
      +        registry.Register(new FolderMapTool());
      +        registry.Register(new DocumentReaderTool());
      +
      +        // 내장 스킬 (문서 생성)
      +        registry.Register(new ExcelSkill());
      +        registry.Register(new DocxSkill());
      +        registry.Register(new CsvSkill());
      +        registry.Register(new MarkdownSkill());
      +        registry.Register(new HtmlSkill());
      +        registry.Register(new ChartSkill());
      +        registry.Register(new BatchSkill());
      +        registry.Register(new PptxSkill());
      +
      +        // 멀티패스 문서 엔진
      +        registry.Register(new DocumentPlannerTool());
      +        registry.Register(new DocumentAssemblerTool());
      +
      +        // 문서 품질 검증 & 포맷 변환
      +        registry.Register(new DocumentReviewTool());
      +        registry.Register(new FormatConvertTool());
      +
      +        // Code 탭: 개발 환경 감지 & 빌드/테스트 & Git
      +        registry.Register(new DevEnvDetectTool());
      +        registry.Register(new BuildRunTool());
      +        registry.Register(new GitTool());
      +        registry.Register(new LspTool());
      +        registry.Register(new SubAgentTool());
      +        registry.Register(new WaitAgentsTool());
      +        registry.Register(new CodeSearchTool());
      +        registry.Register(new TestLoopTool());
      +
      +        // 코드 리뷰 + 프로젝트 규칙
      +        registry.Register(new CodeReviewTool());
      +        registry.Register(new ProjectRuleTool());
      +
      +        // 스킬 시스템
      +        registry.Register(new SkillManagerTool());
      +
      +        // 에이전트 메모리
      +        registry.Register(new MemoryTool());
      +
      +        // 데이터 처리 + 시스템 유틸리티
      +        registry.Register(new JsonTool());
      +        registry.Register(new RegexTool());
      +        registry.Register(new DiffTool());
      +        registry.Register(new ClipboardTool());
      +        registry.Register(new NotifyTool());
      +        registry.Register(new EnvTool());
      +        registry.Register(new ZipTool());
      +        registry.Register(new HttpTool());
      +        registry.Register(new SqlTool());
      +        registry.Register(new Base64Tool());
      +        registry.Register(new HashTool());
      +        registry.Register(new DateTimeTool());
      +
      +        // 코드 품질
      +        registry.Register(new SnippetRunnerTool());
      +
      +        // 데이터 분석 + 문서 자동화
      +        registry.Register(new DataPivotTool());
      +        registry.Register(new TemplateRenderTool());
      +        registry.Register(new TextSummarizeTool());
      +
      +        // 파일 모니터링 + 이미지 분석
      +        registry.Register(new FileWatchTool());
      +        registry.Register(new ImageAnalyzeTool());
      +
      +        // 파일 관리 + 메타데이터 + 멀티리드
      +        registry.Register(new FileManageTool());
      +        registry.Register(new FileInfoTool());
      +        registry.Register(new MultiReadTool());
      +
      +        // 사용자 질문
      +        registry.Register(new UserAskTool());
      +
      +        // 외부 열기 + 수학 + XML + 인코딩
      +        registry.Register(new OpenExternalTool());
      +        registry.Register(new MathTool());
      +        registry.Register(new XmlTool());
      +        registry.Register(new EncodingTool());
      +
      +        // 태스크 추적
      +        registry.Register(new TaskTrackerTool());
      +
      +        // 워크플로우 도구
      +        registry.Register(new SuggestActionsTool());
      +        registry.Register(new DiffPreviewTool());
      +        registry.Register(new CheckpointTool());
      +        registry.Register(new PlaybookTool());
      +
      +        // Phase 18-A: 위임 에이전트 (멀티에이전트 오케스트레이션)
      +        var memoryRepo = new AgentTypeMemoryRepository();
      +        var bgService = new BackgroundAgentService(memoryRepo);
      +        registry.Register(new DelegateAgentTool(bgService, memoryRepo));
      +
      +        return registry;
      +    }
      +}
      diff --git a/src/AxCopilot/Services/Agent/ToolResultSizer.cs b/src/AxCopilot/Services/Agent/ToolResultSizer.cs
      new file mode 100644
      index 0000000..5ab168b
      --- /dev/null
      +++ b/src/AxCopilot/Services/Agent/ToolResultSizer.cs
      @@ -0,0 +1,105 @@
      +using System.IO;
      +using System.Text;
      +
      +namespace AxCopilot.Services.Agent;
      +
      +/// 
      +/// Phase 25-C: 도구 결과 크기 제한.
      +/// CC의 maxResultSizeChars와 동등: 초과 시 임시 파일 저장 + 프리뷰 반환.
      +/// 컨텍스트 오버플로우를 방지합니다.
      +/// 
      +public static class ToolResultSizer
      +{
      +    /// 기본 최대 결과 문자 수 (50,000자 ≈ ~12,500 토큰).
      +    public const int DefaultMaxChars = 50_000;
      +
      +    /// 프리뷰에 포함할 머리/꼬리 문자 수.
      +    private const int PreviewHeadChars = 2_000;
      +    private const int PreviewTailChars = 1_000;
      +
      +    /// 
      +    /// 도구 결과가 최대 크기를 초과하면 임시 파일에 저장하고 프리뷰를 반환합니다.
      +    /// 
      +    /// 원본 도구 출력
      +    /// 도구 이름 (파일명에 사용)
      +    /// 최대 문자 수
      +    /// 크기 제한이 적용된 결과. 초과 시 프리뷰 + 파일 경로 안내.
      +    public static ToolResultSizeInfo Apply(string output, string toolName, int maxChars = DefaultMaxChars)
      +    {
      +        if (string.IsNullOrEmpty(output) || output.Length <= maxChars)
      +            return new ToolResultSizeInfo { Output = output, WasTruncated = false };
      +
      +        // 임시 파일에 전체 결과 저장
      +        var tempDir = Path.Combine(Path.GetTempPath(), "AxCopilot", "tool-results");
      +        if (!Directory.Exists(tempDir))
      +            Directory.CreateDirectory(tempDir);
      +
      +        var fileName = $"{toolName}_{DateTime.Now:yyyyMMdd_HHmmss}_{Guid.NewGuid():N8}.txt";
      +        var filePath = Path.Combine(tempDir, fileName);
      +
      +        try
      +        {
      +            File.WriteAllText(filePath, output, Encoding.UTF8);
      +        }
      +        catch (Exception)
      +        {
      +            // 파일 저장 실패 시 단순 트런케이션
      +            return new ToolResultSizeInfo
      +            {
      +                Output = output[..maxChars] + $"\n\n[결과가 {output.Length:#,0}자로 잘렸습니다 (최대 {maxChars:#,0}자)]",
      +                WasTruncated = true,
      +            };
      +        }
      +
      +        // 프리뷰 생성: 머리 + ... + 꼬리
      +        var head = output[..PreviewHeadChars];
      +        var tail = output[^PreviewTailChars..];
      +        var preview = $"""
      +            {head}
      +
      +            ... [{output.Length:#,0}자 중 {output.Length - PreviewHeadChars - PreviewTailChars:#,0}자 생략] ...
      +
      +            {tail}
      +
      +            [전체 결과: {filePath}]
      +            [file_read 도구로 전체 내용을 읽을 수 있습니다]
      +            """;
      +
      +        return new ToolResultSizeInfo
      +        {
      +            Output = preview,
      +            WasTruncated = true,
      +            SpilloverFilePath = filePath,
      +            OriginalLength = output.Length,
      +        };
      +    }
      +
      +    /// 오래된 임시 결과 파일을 정리합니다 (기본 24시간).
      +    public static void CleanupOldResults(TimeSpan? maxAge = null)
      +    {
      +        var age = maxAge ?? TimeSpan.FromHours(24);
      +        var tempDir = Path.Combine(Path.GetTempPath(), "AxCopilot", "tool-results");
      +        if (!Directory.Exists(tempDir)) return;
      +
      +        try
      +        {
      +            foreach (var file in Directory.GetFiles(tempDir, "*.txt"))
      +            {
      +                if (File.GetCreationTimeUtc(file) < DateTime.UtcNow - age)
      +                {
      +                    try { File.Delete(file); } catch (Exception) { }
      +                }
      +            }
      +        }
      +        catch (Exception) { }
      +    }
      +}
      +
      +/// 도구 결과 크기 제한 적용 결과.
      +public class ToolResultSizeInfo
      +{
      +    public string Output { get; init; } = "";
      +    public bool WasTruncated { get; init; }
      +    public string? SpilloverFilePath { get; init; }
      +    public int OriginalLength { get; init; }
      +}
      diff --git a/src/AxCopilot/Services/Agent/ToolRiskMapper.cs b/src/AxCopilot/Services/Agent/ToolRiskMapper.cs
      new file mode 100644
      index 0000000..976724a
      --- /dev/null
      +++ b/src/AxCopilot/Services/Agent/ToolRiskMapper.cs
      @@ -0,0 +1,104 @@
      +namespace AxCopilot.Services.Agent;
      +
      +public enum ToolRiskLevel { Low, Medium, High }
      +
      +public static class ToolRiskMapper
      +{
      +    // Maps tool names to risk levels
      +    // High: file_write, file_edit, script_create, process_run, git (if destructive), sql, zip, http
      +    // Medium: file_read on sensitive paths, format_convert, template_render, batch_run
      +    // Low: file_read, glob, grep, date_time, math, base64, hash, diff, env_info, file_info, multi_read
      +
      +    private static readonly Dictionary _map = new(StringComparer.OrdinalIgnoreCase)
      +    {
      +        // High risk - modifying/executing
      +        ["file_write"] = ToolRiskLevel.High,
      +        ["file_edit"] = ToolRiskLevel.High,
      +        ["script_create"] = ToolRiskLevel.High,
      +        ["process_run"] = ToolRiskLevel.High,
      +        ["git"] = ToolRiskLevel.High,
      +        ["sql"] = ToolRiskLevel.High,
      +        ["zip"] = ToolRiskLevel.Medium,
      +        ["http"] = ToolRiskLevel.Medium,
      +        ["file_manage"] = ToolRiskLevel.High,
      +        ["build_run"] = ToolRiskLevel.High,
      +        ["test_loop"] = ToolRiskLevel.Medium,
      +        ["lsp"] = ToolRiskLevel.Low,
      +        ["delegate"] = ToolRiskLevel.Medium,
      +        // Medium risk
      +        ["format_convert"] = ToolRiskLevel.Medium,
      +        ["template_render"] = ToolRiskLevel.Medium,
      +        ["batch_run"] = ToolRiskLevel.High,
      +        ["html_create"] = ToolRiskLevel.Medium,
      +        ["excel_create"] = ToolRiskLevel.Medium,
      +        ["docx_create"] = ToolRiskLevel.Medium,
      +        ["pptx_create"] = ToolRiskLevel.Medium,
      +        ["csv_create"] = ToolRiskLevel.Medium,
      +        ["markdown_create"] = ToolRiskLevel.Medium,
      +        ["chart_create"] = ToolRiskLevel.Medium,
      +        ["document_assemble"] = ToolRiskLevel.Medium,
      +        // Low risk - read only
      +        ["file_read"] = ToolRiskLevel.Low,
      +        ["glob"] = ToolRiskLevel.Low,
      +        ["grep"] = ToolRiskLevel.Low,
      +        ["date_time"] = ToolRiskLevel.Low,
      +        ["math"] = ToolRiskLevel.Low,
      +        ["base64"] = ToolRiskLevel.Low,
      +        ["hash"] = ToolRiskLevel.Low,
      +        ["diff"] = ToolRiskLevel.Low,
      +        ["env_info"] = ToolRiskLevel.Low,
      +        ["file_info"] = ToolRiskLevel.Low,
      +        ["multi_read"] = ToolRiskLevel.Low,
      +        ["code_search"] = ToolRiskLevel.Low,
      +        ["folder_map"] = ToolRiskLevel.Low,
      +        ["document_reader"] = ToolRiskLevel.Low,
      +        ["document_plan"] = ToolRiskLevel.Low,
      +        ["document_review"] = ToolRiskLevel.Low,
      +        ["regex"] = ToolRiskLevel.Low,
      +        ["json"] = ToolRiskLevel.Low,
      +        ["xml"] = ToolRiskLevel.Low,
      +        ["encoding"] = ToolRiskLevel.Low,
      +        ["clipboard"] = ToolRiskLevel.Low,
      +        ["notify"] = ToolRiskLevel.Low,
      +        ["user_ask"] = ToolRiskLevel.Low,
      +        ["memory"] = ToolRiskLevel.Low,
      +        ["skill_manager"] = ToolRiskLevel.Low,
      +        ["image_analyze"] = ToolRiskLevel.Low,
      +        ["text_summarize"] = ToolRiskLevel.Low,
      +        ["data_pivot"] = ToolRiskLevel.Low,
      +        ["task_tracker"] = ToolRiskLevel.Low,
      +        ["suggest_actions"] = ToolRiskLevel.Low,
      +        ["diff_preview"] = ToolRiskLevel.Low,
      +        ["checkpoint"] = ToolRiskLevel.Low,
      +        ["playbook"] = ToolRiskLevel.Low,
      +        ["snippet_runner"] = ToolRiskLevel.Medium,
      +        ["open_external"] = ToolRiskLevel.Medium,
      +    };
      +
      +    public static ToolRiskLevel GetRisk(string toolName)
      +    {
      +        if (_map.TryGetValue(toolName, out var risk)) return risk;
      +        // MCP tools — treat as Medium by default
      +        if (toolName.StartsWith("mcp__", StringComparison.OrdinalIgnoreCase)) return ToolRiskLevel.Medium;
      +        return ToolRiskLevel.Low;
      +    }
      +
      +    public static string GetRiskLabel(ToolRiskLevel risk) => risk switch
      +    {
      +        ToolRiskLevel.High => "⚠ 높음",
      +        ToolRiskLevel.Medium => "• 보통",
      +        _ => "· 낮음"
      +    };
      +
      +    public static bool RequiresConfirmation(string toolName, string permissionMode)
      +    {
      +        var risk = GetRisk(toolName);
      +        return permissionMode switch
      +        {
      +            "bypassPermissions" => false,
      +            "acceptEdits" => risk == ToolRiskLevel.High && toolName != "file_write" && toolName != "file_edit",
      +            "plan" => risk >= ToolRiskLevel.Medium,
      +            _ => risk == ToolRiskLevel.High
      +        };
      +    }
      +}
      diff --git a/src/AxCopilot/Services/Agent/UserAskTool.cs b/src/AxCopilot/Services/Agent/UserAskTool.cs
      new file mode 100644
      index 0000000..4a31340
      --- /dev/null
      +++ b/src/AxCopilot/Services/Agent/UserAskTool.cs
      @@ -0,0 +1,104 @@
      +using System.Text.Json;
      +
      +namespace AxCopilot.Services.Agent;
      +
      +/// 에이전트가 사용자에게 질문하고 응답을 대기하는 도구.
      +public class UserAskTool : IAgentTool
      +{
      +    public string Name => "user_ask";
      +    public string Description =>
      +        "Ask the user a question and wait for their response. " +
      +        "Use when you need clarification, confirmation, or a choice from the user. " +
      +        "Optionally provide predefined options for the user to pick from. " +
      +        "The user can select from options OR type a custom response.";
      +
      +    public ToolParameterSchema Parameters => new()
      +    {
      +        Properties = new()
      +        {
      +            ["question"] = new()
      +            {
      +                Type = "string",
      +                Description = "The question to ask the user",
      +            },
      +            ["options"] = new()
      +            {
      +                Type = "array",
      +                Description = "Optional list of choices for the user (e.g. ['Option A', 'Option B'])",
      +                Items = new() { Type = "string", Description = "Choice option" },
      +            },
      +            ["default_value"] = new()
      +            {
      +                Type = "string",
      +                Description = "Default value if user doesn't specify",
      +            },
      +        },
      +        Required = ["question"],
      +    };
      +
      +    public async Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default)
      +    {
      +        var question = args.GetProperty("question").GetString() ?? "";
      +        var defaultVal = args.TryGetProperty("default_value", out var dv) ? dv.GetString() ?? "" : "";
      +
      +        var options = new List();
      +        if (args.TryGetProperty("options", out var opts) && opts.ValueKind == JsonValueKind.Array)
      +        {
      +            foreach (var o in opts.EnumerateArray())
      +            {
      +                var s = o.GetString();
      +                if (!string.IsNullOrEmpty(s)) options.Add(s);
      +            }
      +        }
      +
      +        // UserAskCallback 사용 (커스텀 대화 상자)
      +        if (context.UserAskCallback != null)
      +        {
      +            try
      +            {
      +                var response = await context.UserAskCallback(question, options, defaultVal);
      +                if (response == null)
      +                    return ToolResult.Fail("사용자가 응답을 취소했습니다.");
      +
      +                return ToolResult.Ok($"사용자 응답: {response}");
      +            }
      +            catch (OperationCanceledException)
      +            {
      +                return ToolResult.Fail("사용자가 응답을 취소했습니다.");
      +            }
      +            catch (Exception ex)
      +            {
      +                return ToolResult.Fail($"사용자 입력 오류: {ex.Message}");
      +            }
      +        }
      +
      +        // 폴백: UserDecision 콜백
      +        if (context.UserDecision != null)
      +        {
      +            try
      +            {
      +                var prompt = question;
      +                if (!string.IsNullOrEmpty(defaultVal))
      +                    prompt += $"\n(기본값: {defaultVal})";
      +
      +                var effectiveOptions = options.Count > 0 ? options : new List { "확인" };
      +                var response = await context.UserDecision(prompt, effectiveOptions);
      +
      +                if (string.IsNullOrEmpty(response) && !string.IsNullOrEmpty(defaultVal))
      +                    response = defaultVal;
      +
      +                return ToolResult.Ok($"사용자 응답: {response}");
      +            }
      +            catch (OperationCanceledException)
      +            {
      +                return ToolResult.Fail("사용자가 응답을 취소했습니다.");
      +            }
      +            catch (Exception ex)
      +            {
      +                return ToolResult.Fail($"사용자 입력 오류: {ex.Message}");
      +            }
      +        }
      +
      +        return ToolResult.Fail("사용자 입력 콜백이 등록되지 않았습니다.");
      +    }
      +}
      diff --git a/src/AxCopilot/Services/Agent/WorktreeManager.cs b/src/AxCopilot/Services/Agent/WorktreeManager.cs
      new file mode 100644
      index 0000000..7b75df1
      --- /dev/null
      +++ b/src/AxCopilot/Services/Agent/WorktreeManager.cs
      @@ -0,0 +1,142 @@
      +using System.Diagnostics;
      +using System.IO;
      +using System.Text;
      +
      +namespace AxCopilot.Services.Agent;
      +
      +/// git worktree 정보.
      +public record Worktree
      +{
      +    public string Path { get; init; } = "";
      +    public string Branch { get; init; } = "";
      +    public string RepoRoot { get; init; } = "";
      +    public DateTime CreatedAt { get; init; } = DateTime.UtcNow;
      +}
      +
      +/// 
      +/// Phase 18-A: git worktree 기반 격리 실행 환경 관리.
      +/// 서브에이전트에 독립적인 git working copy 제공.
      +/// 변경 사항은 승인 전 메인 워킹트리에 영향 없음.
      +/// 
      +public class WorktreeManager : IDisposable
      +{
      +    private readonly List _active = new();
      +
      +    /// 현재 활성 worktree 목록.
      +    public IReadOnlyList Active => _active;
      +
      +    /// 새 worktree 생성 (임시 브랜치).
      +    public async Task CreateAsync(
      +        string repoRoot,
      +        string branchName,
      +        CancellationToken ct = default)
      +    {
      +        if (!Directory.Exists(repoRoot)) return null;
      +
      +        // git이 설치되어 있는지 확인
      +        if (!await IsGitRepoAsync(repoRoot, ct)) return null;
      +
      +        var worktreePath = System.IO.Path.Combine(
      +            System.IO.Path.GetTempPath(),
      +            "ax-worktree-" + Guid.NewGuid().ToString("N")[..8]);
      +
      +        var result = await RunGitAsync(
      +            $"worktree add \"{worktreePath}\" -b \"{branchName}\"",
      +            repoRoot, ct);
      +
      +        if (!result.Success) return null;
      +
      +        var worktree = new Worktree
      +        {
      +            Path = worktreePath,
      +            Branch = branchName,
      +            RepoRoot = repoRoot
      +        };
      +        _active.Add(worktree);
      +        return worktree;
      +    }
      +
      +    /// worktree 변경 사항을 대상 브랜치에 병합 (승인 시).
      +    public async Task MergeAsync(
      +        Worktree worktree,
      +        string targetBranch,
      +        CancellationToken ct = default)
      +    {
      +        // 메인 워킹트리에서 머지
      +        var result = await RunGitAsync(
      +            $"merge \"{worktree.Branch}\" --no-ff -m \"[AX Agent] {worktree.Branch} 병합\"",
      +            worktree.RepoRoot, ct);
      +        return result.Success;
      +    }
      +
      +    /// worktree 제거 (거부 시 또는 완료 후 정리).
      +    public async Task DisposeWorktreeAsync(
      +        Worktree worktree,
      +        bool keepBranch = false,
      +        CancellationToken ct = default)
      +    {
      +        try
      +        {
      +            await RunGitAsync(
      +                $"worktree remove \"{worktree.Path}\" --force",
      +                worktree.RepoRoot, ct);
      +
      +            if (!keepBranch)
      +                await RunGitAsync($"branch -D \"{worktree.Branch}\"", worktree.RepoRoot, ct);
      +        }
      +        catch (Exception) { }
      +        finally { _active.Remove(worktree); }
      +    }
      +
      +    private static async Task IsGitRepoAsync(string dir, CancellationToken ct)
      +    {
      +        var result = await RunGitAsync("rev-parse --git-dir", dir, ct);
      +        return result.Success;
      +    }
      +
      +    private static async Task<(bool Success, string Output)> RunGitAsync(
      +        string args, string cwd, CancellationToken ct)
      +    {
      +        try
      +        {
      +            var psi = new ProcessStartInfo("git", args)
      +            {
      +                WorkingDirectory = cwd,
      +                UseShellExecute = false,
      +                CreateNoWindow = true,
      +                RedirectStandardOutput = true,
      +                RedirectStandardError = true,
      +            };
      +
      +            using var process = new Process { StartInfo = psi };
      +            var sb = new StringBuilder();
      +            process.OutputDataReceived += (_, e) => { if (e.Data != null) sb.AppendLine(e.Data); };
      +            process.ErrorDataReceived  += (_, e) => { if (e.Data != null) sb.AppendLine(e.Data); };
      +            process.Start();
      +            process.BeginOutputReadLine();
      +            process.BeginErrorReadLine();
      +
      +            using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
      +            cts.CancelAfter(TimeSpan.FromSeconds(30));
      +            await process.WaitForExitAsync(cts.Token);
      +
      +            return (process.ExitCode == 0, sb.ToString());
      +        }
      +        catch (Exception) { return (false, ""); }
      +    }
      +
      +    public void Dispose()
      +    {
      +        // 남은 worktree 정리 (비동기이지만 Dispose에서 동기로 처리)
      +        foreach (var wt in _active.ToList())
      +        {
      +            try
      +            {
      +                RunGitAsync($"worktree remove \"{wt.Path}\" --force", wt.RepoRoot, CancellationToken.None)
      +                    .GetAwaiter().GetResult();
      +            }
      +            catch (Exception) { }
      +        }
      +        _active.Clear();
      +    }
      +}
      diff --git a/src/AxCopilot/Services/Agent/XmlTool.cs b/src/AxCopilot/Services/Agent/XmlTool.cs
      new file mode 100644
      index 0000000..84d8eb4
      --- /dev/null
      +++ b/src/AxCopilot/Services/Agent/XmlTool.cs
      @@ -0,0 +1,189 @@
      +using System.IO;
      +using System.Text;
      +using System.Text.Json;
      +using System.Xml;
      +using System.Xml.Linq;
      +using System.Xml.XPath;
      +
      +namespace AxCopilot.Services.Agent;
      +
      +/// XML 파싱, XPath 쿼리, 변환 도구.
      +public class XmlTool : IAgentTool
      +{
      +    public string Name => "xml_tool";
      +    public string Description =>
      +        "Parse and query XML documents. Actions: " +
      +        "'parse' — parse XML file/string and return structure summary; " +
      +        "'xpath' — evaluate XPath expression and return matching nodes; " +
      +        "'to_json' — convert XML to JSON; " +
      +        "'format' — pretty-print XML with indentation.";
      +
      +    public ToolParameterSchema Parameters => new()
      +    {
      +        Properties = new()
      +        {
      +            ["action"] = new()
      +            {
      +                Type = "string",
      +                Description = "Action: parse, xpath, to_json, format",
      +                Enum = ["parse", "xpath", "to_json", "format"],
      +            },
      +            ["path"] = new()
      +            {
      +                Type = "string",
      +                Description = "XML file path (optional if 'xml' is provided)",
      +            },
      +            ["xml"] = new()
      +            {
      +                Type = "string",
      +                Description = "XML string (optional if 'path' is provided)",
      +            },
      +            ["expression"] = new()
      +            {
      +                Type = "string",
      +                Description = "XPath expression (for 'xpath' action)",
      +            },
      +        },
      +        Required = ["action"],
      +    };
      +
      +    public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default)
      +    {
      +        var action = args.GetProperty("action").GetString() ?? "";
      +        var xmlStr = args.TryGetProperty("xml", out var x) ? x.GetString() ?? "" : "";
      +        var rawPath = args.TryGetProperty("path", out var pv) ? pv.GetString() ?? "" : "";
      +        var expression = args.TryGetProperty("expression", out var ex) ? ex.GetString() ?? "" : "";
      +
      +        try
      +        {
      +            // XML 소스 결정
      +            if (string.IsNullOrEmpty(xmlStr) && !string.IsNullOrEmpty(rawPath))
      +            {
      +                var path = Path.IsPathRooted(rawPath) ? rawPath : Path.Combine(context.WorkFolder, rawPath);
      +                if (!context.IsPathAllowed(path))
      +                    return Task.FromResult(ToolResult.Fail($"경로 접근 차단: {path}"));
      +                if (!File.Exists(path))
      +                    return Task.FromResult(ToolResult.Fail($"파일 없음: {path}"));
      +                xmlStr = File.ReadAllText(path);
      +            }
      +
      +            if (string.IsNullOrEmpty(xmlStr))
      +                return Task.FromResult(ToolResult.Fail("'xml' 또는 'path' 중 하나를 지정해야 합니다."));
      +
      +            var doc = XDocument.Parse(xmlStr);
      +
      +            return action switch
      +            {
      +                "parse" => Task.FromResult(ParseSummary(doc)),
      +                "xpath" => Task.FromResult(EvalXPath(doc, expression)),
      +                "to_json" => Task.FromResult(XmlToJson(doc)),
      +                "format" => Task.FromResult(FormatXml(doc)),
      +                _ => Task.FromResult(ToolResult.Fail($"Unknown action: {action}")),
      +            };
      +        }
      +        catch (XmlException xe)
      +        {
      +            return Task.FromResult(ToolResult.Fail($"XML 파싱 오류: {xe.Message}"));
      +        }
      +        catch (Exception e)
      +        {
      +            return Task.FromResult(ToolResult.Fail($"XML 처리 오류: {e.Message}"));
      +        }
      +    }
      +
      +    private static ToolResult ParseSummary(XDocument doc)
      +    {
      +        var sb = new StringBuilder();
      +        sb.AppendLine($"Root: {doc.Root?.Name.LocalName ?? "(none)"}");
      +        if (doc.Root != null)
      +        {
      +            var ns = doc.Root.Name.Namespace;
      +            if (!string.IsNullOrEmpty(ns.NamespaceName))
      +                sb.AppendLine($"Namespace: {ns.NamespaceName}");
      +
      +            var elements = doc.Descendants().Count();
      +            var attrs = doc.Descendants().SelectMany(e => e.Attributes()).Count();
      +            sb.AppendLine($"Elements: {elements}");
      +            sb.AppendLine($"Attributes: {attrs}");
      +
      +            // 최상위 자식 요소 나열 (최대 20개)
      +            var children = doc.Root.Elements().Take(20).ToList();
      +            sb.AppendLine($"Top-level children ({doc.Root.Elements().Count()}):");
      +            foreach (var child in children)
      +                sb.AppendLine($"  <{child.Name.LocalName}> ({child.Elements().Count()} children)");
      +        }
      +        return ToolResult.Ok(sb.ToString());
      +    }
      +
      +    private static ToolResult EvalXPath(XDocument doc, string xpath)
      +    {
      +        if (string.IsNullOrEmpty(xpath))
      +            return ToolResult.Fail("XPath 'expression'이 필요합니다.");
      +
      +        var results = doc.XPathSelectElements(xpath).Take(50).ToList();
      +        if (results.Count == 0)
      +            return ToolResult.Ok("매칭 노드 없음.");
      +
      +        var sb = new StringBuilder();
      +        sb.AppendLine($"매칭: {results.Count}개 노드");
      +        foreach (var el in results)
      +        {
      +            var text = el.ToString();
      +            if (text.Length > 500) text = text[..500] + "...";
      +            sb.AppendLine(text);
      +        }
      +        return ToolResult.Ok(sb.ToString());
      +    }
      +
      +    private static ToolResult XmlToJson(XDocument doc)
      +    {
      +        var json = System.Text.Json.JsonSerializer.Serialize(
      +            XmlToDict(doc.Root!),
      +            new JsonSerializerOptions { WriteIndented = true });
      +        if (json.Length > 50_000) json = json[..50_000] + "\n... (truncated)";
      +        return ToolResult.Ok(json);
      +    }
      +
      +    private static Dictionary XmlToDict(XElement el)
      +    {
      +        var dict = new Dictionary();
      +        foreach (var attr in el.Attributes())
      +            dict[$"@{attr.Name.LocalName}"] = attr.Value;
      +
      +        var groups = el.Elements().GroupBy(e => e.Name.LocalName).ToList();
      +        foreach (var g in groups)
      +        {
      +            var items = g.ToList();
      +            if (items.Count == 1)
      +            {
      +                var child = items[0];
      +                dict[g.Key] = child.HasElements ? XmlToDict(child) : (object?)child.Value;
      +            }
      +            else
      +            {
      +                dict[g.Key] = items.Select(c => c.HasElements ? (object)XmlToDict(c) : c.Value).ToList();
      +            }
      +        }
      +
      +        if (!el.HasElements && groups.Count == 0 && !string.IsNullOrEmpty(el.Value))
      +            dict["#text"] = el.Value;
      +
      +        return dict;
      +    }
      +
      +    private static ToolResult FormatXml(XDocument doc)
      +    {
      +        var sb = new StringBuilder();
      +        using var writer = XmlWriter.Create(sb, new XmlWriterSettings
      +        {
      +            Indent = true,
      +            IndentChars = "  ",
      +            OmitXmlDeclaration = false,
      +        });
      +        doc.WriteTo(writer);
      +        writer.Flush();
      +        var result = sb.ToString();
      +        if (result.Length > 50_000) result = result[..50_000] + "\n... (truncated)";
      +        return ToolResult.Ok(result);
      +    }
      +}
      diff --git a/src/AxCopilot/Services/Agent/ZipTool.cs b/src/AxCopilot/Services/Agent/ZipTool.cs
      new file mode 100644
      index 0000000..a439021
      --- /dev/null
      +++ b/src/AxCopilot/Services/Agent/ZipTool.cs
      @@ -0,0 +1,167 @@
      +using System.IO;
      +using System.IO.Compression;
      +using System.Text.Json;
      +
      +namespace AxCopilot.Services.Agent;
      +
      +/// 
      +/// 파일 압축(zip) / 해제 도구.
      +/// 
      +public class ZipTool : IAgentTool
      +{
      +    public string Name => "zip_tool";
      +    public string Description =>
      +        "Compress or extract zip archives. Actions: " +
      +        "'compress' — create a zip file from files/folders; " +
      +        "'extract' — extract a zip file to a directory; " +
      +        "'list' — list contents of a zip file without extracting.";
      +
      +    public ToolParameterSchema Parameters => new()
      +    {
      +        Properties = new()
      +        {
      +            ["action"] = new()
      +            {
      +                Type = "string",
      +                Description = "Action to perform",
      +                Enum = ["compress", "extract", "list"],
      +            },
      +            ["zip_path"] = new()
      +            {
      +                Type = "string",
      +                Description = "Path to the zip file (to create or extract)",
      +            },
      +            ["source_path"] = new()
      +            {
      +                Type = "string",
      +                Description = "Source file or directory path (for compress action)",
      +            },
      +            ["dest_path"] = new()
      +            {
      +                Type = "string",
      +                Description = "Destination directory (for extract action)",
      +            },
      +        },
      +        Required = ["action", "zip_path"],
      +    };
      +
      +    private const long MaxExtractSize = 500 * 1024 * 1024; // 500MB 제한
      +
      +    public Task ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default)
      +    {
      +        var action  = args.GetProperty("action").GetString() ?? "";
      +        var zipPath = args.GetProperty("zip_path").GetString() ?? "";
      +
      +        if (!Path.IsPathRooted(zipPath))
      +            zipPath = Path.Combine(context.WorkFolder, zipPath);
      +
      +        try
      +        {
      +            return Task.FromResult(action switch
      +            {
      +                "compress" => Compress(args, zipPath, context),
      +                "extract"  => Extract(args, zipPath, context),
      +                "list"     => ListContents(zipPath),
      +                _          => ToolResult.Fail($"Unknown action: {action}"),
      +            });
      +        }
      +        catch (Exception ex)
      +        {
      +            return Task.FromResult(ToolResult.Fail($"Zip 오류: {ex.Message}"));
      +        }
      +    }
      +
      +    private static ToolResult Compress(JsonElement args, string zipPath, AgentContext context)
      +    {
      +        if (!args.TryGetProperty("source_path", out var sp))
      +            return ToolResult.Fail("'source_path' is required for compress action");
      +
      +        var sourcePath = sp.GetString() ?? "";
      +        if (!Path.IsPathRooted(sourcePath))
      +            sourcePath = Path.Combine(context.WorkFolder, sourcePath);
      +
      +        if (File.Exists(zipPath))
      +            return ToolResult.Fail($"Zip file already exists: {zipPath}");
      +
      +        if (Directory.Exists(sourcePath))
      +        {
      +            ZipFile.CreateFromDirectory(sourcePath, zipPath, CompressionLevel.Optimal, includeBaseDirectory: false);
      +            var info = new FileInfo(zipPath);
      +            return ToolResult.Ok($"✓ Created {zipPath} ({info.Length / 1024}KB)", zipPath);
      +        }
      +        else if (File.Exists(sourcePath))
      +        {
      +            using var zip = ZipFile.Open(zipPath, ZipArchiveMode.Create);
      +            zip.CreateEntryFromFile(sourcePath, Path.GetFileName(sourcePath), CompressionLevel.Optimal);
      +            var info = new FileInfo(zipPath);
      +            return ToolResult.Ok($"✓ Created {zipPath} ({info.Length / 1024}KB)", zipPath);
      +        }
      +        else
      +        {
      +            return ToolResult.Fail($"Source not found: {sourcePath}");
      +        }
      +    }
      +
      +    private static ToolResult Extract(JsonElement args, string zipPath, AgentContext context)
      +    {
      +        if (!File.Exists(zipPath))
      +            return ToolResult.Fail($"Zip file not found: {zipPath}");
      +
      +        var destPath = args.TryGetProperty("dest_path", out var dp)
      +            ? dp.GetString() ?? "" : "";
      +        if (string.IsNullOrEmpty(destPath))
      +            destPath = Path.Combine(Path.GetDirectoryName(zipPath) ?? context.WorkFolder,
      +                Path.GetFileNameWithoutExtension(zipPath));
      +        if (!Path.IsPathRooted(destPath))
      +            destPath = Path.Combine(context.WorkFolder, destPath);
      +
      +        // 사이즈 체크
      +        using (var check = ZipFile.OpenRead(zipPath))
      +        {
      +            var totalSize = check.Entries.Sum(e => e.Length);
      +            if (totalSize > MaxExtractSize)
      +                return ToolResult.Fail($"Uncompressed size ({totalSize / 1024 / 1024}MB) exceeds 500MB limit");
      +
      +            // 보안: 상위 경로 이탈 방지
      +            foreach (var entry in check.Entries)
      +            {
      +                var fullPath = Path.GetFullPath(Path.Combine(destPath, entry.FullName));
      +                if (!fullPath.StartsWith(Path.GetFullPath(destPath), StringComparison.OrdinalIgnoreCase))
      +                    return ToolResult.Fail($"Security: entry '{entry.FullName}' escapes destination directory");
      +            }
      +        }
      +
      +        Directory.CreateDirectory(destPath);
      +        ZipFile.ExtractToDirectory(zipPath, destPath, overwriteFiles: true);
      +
      +        var fileCount = Directory.GetFiles(destPath, "*", SearchOption.AllDirectories).Length;
      +        return ToolResult.Ok($"✓ Extracted {fileCount} files to {destPath}");
      +    }
      +
      +    private static ToolResult ListContents(string zipPath)
      +    {
      +        if (!File.Exists(zipPath))
      +            return ToolResult.Fail($"Zip file not found: {zipPath}");
      +
      +        using var zip = ZipFile.OpenRead(zipPath);
      +        var sb = new System.Text.StringBuilder();
      +        sb.AppendLine($"Archive: {Path.GetFileName(zipPath)} ({new FileInfo(zipPath).Length / 1024}KB)");
      +        sb.AppendLine($"Entries: {zip.Entries.Count}");
      +        sb.AppendLine();
      +        sb.AppendLine($"{"Size",10}  {"Compressed",10}  {"Name"}");
      +        sb.AppendLine(new string('-', 60));
      +
      +        var limit = Math.Min(zip.Entries.Count, 200);
      +        foreach (var entry in zip.Entries.Take(limit))
      +        {
      +            sb.AppendLine($"{entry.Length,10}  {entry.CompressedLength,10}  {entry.FullName}");
      +        }
      +        if (zip.Entries.Count > limit)
      +            sb.AppendLine($"\n... and {zip.Entries.Count - limit} more entries");
      +
      +        var totalUncompressed = zip.Entries.Sum(e => e.Length);
      +        sb.AppendLine($"\nTotal uncompressed: {totalUncompressed / 1024}KB");
      +
      +        return ToolResult.Ok(sb.ToString());
      +    }
      +}
      diff --git a/src/AxCopilot/Services/AgentMemoryService.cs b/src/AxCopilot/Services/AgentMemoryService.cs
      new file mode 100644
      index 0000000..7b26e1a
      --- /dev/null
      +++ b/src/AxCopilot/Services/AgentMemoryService.cs
      @@ -0,0 +1,310 @@
      +using System.IO;
      +using System.Security.Cryptography;
      +using System.Text;
      +using System.Text.Json;
      +using System.Text.Json.Serialization;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 에이전트 메모리 서비스.
      +/// 작업 폴더별 + 전역 메모리를 관리하며, 대화 간 지속적 컨텍스트를 유지합니다.
      +/// 저장소: %APPDATA%\AxCopilot\memory\{hash}.dat (암호화)
      +/// 
      +public class AgentMemoryService
      +{
      +    private static App? CurrentApp => System.Windows.Application.Current as App;
      +
      +    private static readonly string MemoryDir = Path.Combine(
      +        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +        "AxCopilot", "memory");
      +
      +    private static readonly JsonSerializerOptions JsonOptions = new()
      +    {
      +        WriteIndented = true,
      +        PropertyNameCaseInsensitive = true,
      +    };
      +
      +    private readonly List _entries = new();
      +    private readonly object _lock = new();
      +    private string? _currentWorkFolder;
      +
      +    /// 현재 로드된 메모리 항목 수.
      +    public int Count { get { lock (_lock) return _entries.Count; } }
      +
      +    /// 모든 메모리 항목 (읽기 전용).
      +    public IReadOnlyList All { get { lock (_lock) return _entries.ToList(); } }
      +
      +    /// 작업 폴더별 메모리 + 전역 메모리를 로드합니다.
      +    public void Load(string? workFolder)
      +    {
      +        lock (_lock)
      +        {
      +            _entries.Clear();
      +            _currentWorkFolder = workFolder;
      +
      +            // 전역 메모리
      +            var globalPath = GetFilePath(null);
      +            LoadFromFile(globalPath);
      +
      +            // 폴더별 메모리
      +            if (!string.IsNullOrEmpty(workFolder))
      +            {
      +                var folderPath = GetFilePath(workFolder);
      +                LoadFromFile(folderPath);
      +            }
      +        }
      +    }
      +
      +    /// 새 메모리를 추가합니다. 유사한 내용이 있으면 병합합니다.
      +    public MemoryEntry Add(string type, string content, string? source = null, string? workFolder = null)
      +    {
      +        lock (_lock)
      +        {
      +            // 중복 검사: 동일 타입 + 유사 내용 (80% 이상 키워드 겹침)
      +            var existing = _entries.FirstOrDefault(e =>
      +                e.Type == type && CalculateSimilarity(e.Content, content) > 0.8);
      +            if (existing != null)
      +            {
      +                existing.LastUsedAt = DateTime.Now;
      +                existing.UseCount++;
      +                Save();
      +                return existing;
      +            }
      +
      +            var entry = new MemoryEntry
      +            {
      +                Id = Guid.NewGuid().ToString("N")[..12],
      +                Type = type,
      +                Content = content,
      +                Source = source ?? "",
      +                CreatedAt = DateTime.Now,
      +                LastUsedAt = DateTime.Now,
      +                UseCount = 1,
      +                Relevance = 1.0,
      +                WorkFolder = workFolder,
      +            };
      +            _entries.Add(entry);
      +            Prune();
      +            Save();
      +            return entry;
      +        }
      +    }
      +
      +    /// 쿼리와 관련된 메모리를 검색합니다.
      +    public List GetRelevant(string query, int maxCount = 10)
      +    {
      +        if (string.IsNullOrWhiteSpace(query)) return new();
      +
      +        lock (_lock)
      +        {
      +            var queryTokens = Tokenize(query);
      +            var scored = _entries
      +                .Select(e =>
      +                {
      +                    var entryTokens = Tokenize(e.Content);
      +                    var overlap = queryTokens.Intersect(entryTokens, StringComparer.OrdinalIgnoreCase).Count();
      +                    var score = queryTokens.Count > 0 ? (double)overlap / queryTokens.Count : 0;
      +                    // 사용 빈도와 최근 사용 가중치 적용
      +                    score += Math.Min(e.UseCount * 0.05, 0.3);
      +                    if ((DateTime.Now - e.LastUsedAt).TotalDays < 7) score += 0.1;
      +                    return (Entry: e, Score: score);
      +                })
      +                .Where(x => x.Score > 0.1)
      +                .OrderByDescending(x => x.Score)
      +                .Take(maxCount)
      +                .Select(x =>
      +                {
      +                    x.Entry.Relevance = x.Score;
      +                    return x.Entry;
      +                })
      +                .ToList();
      +
      +            return scored;
      +        }
      +    }
      +
      +    /// 메모리 사용 기록을 갱신합니다.
      +    public void Touch(string id)
      +    {
      +        lock (_lock)
      +        {
      +            var entry = _entries.FirstOrDefault(e => e.Id == id);
      +            if (entry != null)
      +            {
      +                entry.UseCount++;
      +                entry.LastUsedAt = DateTime.Now;
      +                Save();
      +            }
      +        }
      +    }
      +
      +    /// 메모리를 삭제합니다.
      +    public bool Remove(string id)
      +    {
      +        lock (_lock)
      +        {
      +            var removed = _entries.RemoveAll(e => e.Id == id) > 0;
      +            if (removed) Save();
      +            return removed;
      +        }
      +    }
      +
      +    /// 모든 메모리를 삭제합니다.
      +    public void Clear()
      +    {
      +        lock (_lock)
      +        {
      +            _entries.Clear();
      +            Save();
      +        }
      +    }
      +
      +    /// 오래되고 사용되지 않는 메모리를 정리합니다.
      +    private void Prune()
      +    {
      +        var maxEntries = 100;
      +        try
      +        {
      +            maxEntries = CurrentApp?.SettingsService?.Settings.Llm.MaxMemoryEntries ?? 100;
      +        }
      +        catch (Exception) { }
      +
      +        if (_entries.Count <= maxEntries) return;
      +
      +        // 점수 기반 정리: 오래되고 사용 안 되는 것부터
      +        var toRemove = _entries
      +            .OrderBy(e => e.UseCount)
      +            .ThenBy(e => e.LastUsedAt)
      +            .Take(_entries.Count - maxEntries)
      +            .ToList();
      +
      +        foreach (var entry in toRemove)
      +            _entries.Remove(entry);
      +    }
      +
      +    /// 메모리를 암호화하여 파일에 저장합니다.
      +    private void Save()
      +    {
      +        Directory.CreateDirectory(MemoryDir);
      +
      +        // 전역 메모리
      +        var globalEntries = _entries.Where(e => e.WorkFolder == null).ToList();
      +        SaveToFile(GetFilePath(null), globalEntries);
      +
      +        // 폴더별 메모리
      +        if (!string.IsNullOrEmpty(_currentWorkFolder))
      +        {
      +            var folderEntries = _entries.Where(e => e.WorkFolder != null).ToList();
      +            SaveToFile(GetFilePath(_currentWorkFolder), folderEntries);
      +        }
      +    }
      +
      +    private void SaveToFile(string path, List entries)
      +    {
      +        try
      +        {
      +            var json = JsonSerializer.Serialize(entries, JsonOptions);
      +            var encrypted = CryptoService.PortableEncrypt(json);
      +            var tempPath = path + ".tmp";
      +            File.WriteAllText(tempPath, encrypted);
      +            File.Move(tempPath, path, overwrite: true);
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"메모리 저장 실패: {ex.Message}");
      +        }
      +    }
      +
      +    private void LoadFromFile(string path)
      +    {
      +        if (!File.Exists(path)) return;
      +        try
      +        {
      +            var encrypted = File.ReadAllText(path);
      +            var json = CryptoService.PortableDecrypt(encrypted);
      +            if (string.IsNullOrEmpty(json)) return;
      +            var entries = JsonSerializer.Deserialize>(json, JsonOptions);
      +            if (entries != null)
      +                _entries.AddRange(entries);
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"메모리 로드 실패 ({path}): {ex.Message}");
      +        }
      +    }
      +
      +    private static string GetFilePath(string? workFolder)
      +    {
      +        if (string.IsNullOrEmpty(workFolder))
      +            return Path.Combine(MemoryDir, "_global.dat");
      +
      +        // 폴더 경로를 해시하여 파일명 생성
      +        var hash = Convert.ToHexString(
      +            SHA256.HashData(Encoding.UTF8.GetBytes(workFolder.ToLowerInvariant())))[..16];
      +        return Path.Combine(MemoryDir, $"{hash}.dat");
      +    }
      +
      +    /// 두 문자열의 키워드 유사도를 계산합니다 (0~1).
      +    private static double CalculateSimilarity(string a, string b)
      +    {
      +        var tokensA = Tokenize(a);
      +        var tokensB = Tokenize(b);
      +        if (tokensA.Count == 0 || tokensB.Count == 0) return 0;
      +        var intersection = tokensA.Intersect(tokensB, StringComparer.OrdinalIgnoreCase).Count();
      +        var union = tokensA.Union(tokensB, StringComparer.OrdinalIgnoreCase).Count();
      +        return union > 0 ? (double)intersection / union : 0;
      +    }
      +
      +    /// 텍스트를 토큰으로 분리합니다.
      +    private static HashSet Tokenize(string text)
      +    {
      +        var tokens = new HashSet(StringComparer.OrdinalIgnoreCase);
      +        var sb = new StringBuilder();
      +        foreach (var c in text)
      +        {
      +            if (char.IsLetterOrDigit(c) || c == '_')
      +                sb.Append(c);
      +            else if (sb.Length > 1) // 1글자 토큰 제외
      +            {
      +                tokens.Add(sb.ToString());
      +                sb.Clear();
      +            }
      +            else
      +                sb.Clear();
      +        }
      +        if (sb.Length > 1) tokens.Add(sb.ToString());
      +        return tokens;
      +    }
      +}
      +
      +/// 에이전트 메모리 항목.
      +public class MemoryEntry
      +{
      +    [JsonPropertyName("id")]
      +    public string Id { get; set; } = "";
      +
      +    [JsonPropertyName("type")]
      +    public string Type { get; set; } = "fact"; // rule | preference | fact | correction
      +
      +    [JsonPropertyName("content")]
      +    public string Content { get; set; } = "";
      +
      +    [JsonPropertyName("source")]
      +    public string Source { get; set; } = "";
      +
      +    [JsonPropertyName("createdAt")]
      +    public DateTime CreatedAt { get; set; }
      +
      +    [JsonPropertyName("lastUsedAt")]
      +    public DateTime LastUsedAt { get; set; }
      +
      +    [JsonPropertyName("useCount")]
      +    public int UseCount { get; set; }
      +
      +    [JsonPropertyName("relevance")]
      +    public double Relevance { get; set; }
      +
      +    [JsonPropertyName("workFolder")]
      +    public string? WorkFolder { get; set; }
      +}
      diff --git a/src/AxCopilot/Services/AgentStatsService.cs b/src/AxCopilot/Services/AgentStatsService.cs
      new file mode 100644
      index 0000000..568be9a
      --- /dev/null
      +++ b/src/AxCopilot/Services/AgentStatsService.cs
      @@ -0,0 +1,173 @@
      +using System.IO;
      +using System.Text.Json;
      +using System.Text.Json.Serialization;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 에이전트 실행 통계를 로컬 JSON 파일에 기록/집계합니다.
      +/// %APPDATA%\AxCopilot\stats\agent_stats.json
      +/// 
      +public static class AgentStatsService
      +{
      +    private static readonly string StatsDir = Path.Combine(
      +        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +        "AxCopilot", "stats");
      +
      +    private static readonly string StatsFile = Path.Combine(StatsDir, "agent_stats.json");
      +
      +    private static readonly JsonSerializerOptions _jsonOpts = new()
      +    {
      +        WriteIndented = false,
      +        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
      +    };
      +
      +    // ─── 데이터 모델 ──────────────────────────────────────────────────────
      +
      +    public record AgentSessionRecord
      +    {
      +        [JsonPropertyName("ts")]      public DateTime Timestamp   { get; init; } = DateTime.Now;
      +        [JsonPropertyName("tab")]     public string   Tab         { get; init; } = "";
      +        [JsonPropertyName("model")]   public string   Model       { get; init; } = "";
      +        [JsonPropertyName("calls")]   public int      ToolCalls   { get; init; }
      +        [JsonPropertyName("ok")]      public int      SuccessCount{ get; init; }
      +        [JsonPropertyName("fail")]    public int      FailCount   { get; init; }
      +        [JsonPropertyName("itok")]    public int      InputTokens { get; init; }
      +        [JsonPropertyName("otok")]    public int      OutputTokens{ get; init; }
      +        [JsonPropertyName("ms")]      public long     DurationMs  { get; init; }
      +        [JsonPropertyName("tools")]   public List UsedTools { get; init; } = new();
      +    }
      +
      +    /// 집계 결과.
      +    public record AgentStatsSummary
      +    {
      +        public int    TotalSessions   { get; init; }
      +        public int    TotalToolCalls  { get; init; }
      +        public int    TotalTokens     { get; init; }
      +        public int    TotalInputTokens  { get; init; }
      +        public int    TotalOutputTokens { get; init; }
      +        public long   TotalDurationMs { get; init; }
      +        public Dictionary  ToolFrequency   { get; init; } = new();
      +        public Dictionary  ModelBreakdown  { get; init; } = new();
      +        public Dictionary  TabBreakdown    { get; init; } = new();
      +        /// 일별 세션 수 (날짜 키 "yyyy-MM-dd").
      +        public Dictionary  DailySessions   { get; init; } = new();
      +        /// 일별 토큰 수 (날짜 키 "yyyy-MM-dd").
      +        public Dictionary  DailyTokens     { get; init; } = new();
      +    }
      +
      +    // ─── 기록 ─────────────────────────────────────────────────────────────
      +
      +    /// 에이전트 세션 결과를 기록합니다. 비동기 fire-and-forget.
      +    public static void RecordSession(AgentSessionRecord record)
      +    {
      +        Task.Run(() =>
      +        {
      +            try
      +            {
      +                if (!Directory.Exists(StatsDir))
      +                    Directory.CreateDirectory(StatsDir);
      +
      +                // 한 줄씩 append (JSONL 형식)
      +                var line = JsonSerializer.Serialize(record, _jsonOpts);
      +                File.AppendAllText(StatsFile, line + "\n");
      +            }
      +            catch (Exception ex)
      +            {
      +                LogService.Warn($"통계 기록 실패: {ex.Message}");
      +            }
      +        });
      +    }
      +
      +    // ─── 집계 ─────────────────────────────────────────────────────────────
      +
      +    /// 지정 일수 이내의 통계를 집계합니다. days=0이면 전체.
      +    public static AgentStatsSummary Aggregate(int days = 0)
      +    {
      +        var records = LoadRecords(days);
      +        return BuildSummary(records);
      +    }
      +
      +    /// 통계 파일에서 레코드를 읽어옵니다.
      +    public static List LoadRecords(int days = 0)
      +    {
      +        if (!File.Exists(StatsFile)) return new();
      +
      +        var cutoff = days > 0 ? DateTime.Now.AddDays(-days) : DateTime.MinValue;
      +        var result = new List();
      +
      +        foreach (var line in File.ReadLines(StatsFile))
      +        {
      +            if (string.IsNullOrWhiteSpace(line)) continue;
      +            try
      +            {
      +                var rec = JsonSerializer.Deserialize(line, _jsonOpts);
      +                if (rec != null && rec.Timestamp >= cutoff)
      +                    result.Add(rec);
      +            }
      +            catch (Exception) { /* 손상된 줄 건너뜀 */ }
      +        }
      +
      +        return result;
      +    }
      +
      +    private static AgentStatsSummary BuildSummary(List records)
      +    {
      +        var toolFreq    = new Dictionary();
      +        var modelBreak  = new Dictionary();
      +        var tabBreak    = new Dictionary();
      +        var dailySess   = new Dictionary();
      +        var dailyTok    = new Dictionary();
      +
      +        int totalCalls  = 0, totalIn = 0, totalOut = 0;
      +        long totalMs    = 0;
      +
      +        foreach (var r in records)
      +        {
      +            totalCalls += r.ToolCalls;
      +            totalIn    += r.InputTokens;
      +            totalOut   += r.OutputTokens;
      +            totalMs    += r.DurationMs;
      +
      +            foreach (var t in r.UsedTools)
      +                toolFreq[t] = toolFreq.GetValueOrDefault(t) + 1;
      +
      +            if (!string.IsNullOrEmpty(r.Model))
      +                modelBreak[r.Model] = modelBreak.GetValueOrDefault(r.Model) + 1;
      +
      +            if (!string.IsNullOrEmpty(r.Tab))
      +                tabBreak[r.Tab] = tabBreak.GetValueOrDefault(r.Tab) + 1;
      +
      +            var dateKey = r.Timestamp.ToString("yyyy-MM-dd");
      +            dailySess[dateKey]  = dailySess.GetValueOrDefault(dateKey) + 1;
      +            dailyTok[dateKey]   = dailyTok.GetValueOrDefault(dateKey)  + r.InputTokens + r.OutputTokens;
      +        }
      +
      +        return new AgentStatsSummary
      +        {
      +            TotalSessions    = records.Count,
      +            TotalToolCalls   = totalCalls,
      +            TotalTokens      = totalIn + totalOut,
      +            TotalInputTokens = totalIn,
      +            TotalOutputTokens= totalOut,
      +            TotalDurationMs  = totalMs,
      +            ToolFrequency    = toolFreq.OrderByDescending(kv => kv.Value).Take(10)
      +                                       .ToDictionary(kv => kv.Key, kv => kv.Value),
      +            ModelBreakdown   = modelBreak,
      +            TabBreakdown     = tabBreak,
      +            DailySessions    = dailySess,
      +            DailyTokens      = dailyTok,
      +        };
      +    }
      +
      +    /// 통계 파일 크기 (bytes). 파일 없으면 0.
      +    public static long GetFileSize() =>
      +        File.Exists(StatsFile) ? new FileInfo(StatsFile).Length : 0;
      +
      +    /// 모든 통계 데이터를 삭제합니다.
      +    public static void Clear()
      +    {
      +        try { if (File.Exists(StatsFile)) File.Delete(StatsFile); }
      +        catch (Exception ex) { LogService.Warn($"통계 삭제 실패: {ex.Message}"); }
      +    }
      +}
      diff --git a/src/AxCopilot/Services/AgentTriggerService.cs b/src/AxCopilot/Services/AgentTriggerService.cs
      new file mode 100644
      index 0000000..6763674
      --- /dev/null
      +++ b/src/AxCopilot/Services/AgentTriggerService.cs
      @@ -0,0 +1,178 @@
      +using System.IO;
      +using System.Text.Json;
      +using System.Windows.Threading;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 이벤트 기반 에이전트 트리거 서비스.
      +/// 파일 변경, 스케줄, Git 이벤트를 감지하여 에이전트를 자동 실행합니다.
      +/// 
      +public class AgentTriggerService : IDisposable
      +{
      +    private readonly SettingsService _settings;
      +    private FileSystemWatcher? _fileWatcher;
      +    private DispatcherTimer? _scheduleTimer;
      +    private readonly List _rules = new();
      +    private bool _disposed;
      +
      +    /// 트리거 발동 시 에이전트 실행 콜백. (triggerName, prompt) → void
      +    public Action? OnTriggerFired { get; set; }
      +
      +    public AgentTriggerService(SettingsService settings)
      +    {
      +        _settings = settings;
      +    }
      +
      +    /// 트리거 규칙을 로드하고 모니터링을 시작합니다.
      +    public void Start()
      +    {
      +        LoadRules();
      +        StartFileWatcher();
      +        StartScheduleTimer();
      +        LogService.Info($"에이전트 트리거 서비스 시작: {_rules.Count}개 규칙");
      +    }
      +
      +    /// 트리거 규칙을 다시 로드합니다.
      +    public void Reload()
      +    {
      +        Stop();
      +        Start();
      +    }
      +
      +    public void Stop()
      +    {
      +        _fileWatcher?.Dispose();
      +        _fileWatcher = null;
      +        _scheduleTimer?.Stop();
      +    }
      +
      +    private void LoadRules()
      +    {
      +        _rules.Clear();
      +        var triggerFile = Path.Combine(
      +            Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +            "AxCopilot", "triggers.json");
      +
      +        if (!File.Exists(triggerFile)) return;
      +
      +        try
      +        {
      +            var json = File.ReadAllText(triggerFile);
      +            var loaded = JsonSerializer.Deserialize>(json);
      +            if (loaded != null) _rules.AddRange(loaded.Where(r => r.Enabled));
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"트리거 규칙 로드 실패: {ex.Message}");
      +        }
      +    }
      +
      +    private void StartFileWatcher()
      +    {
      +        var fileRules = _rules.Where(r => r.Type == "file_change").ToList();
      +        if (fileRules.Count == 0) return;
      +
      +        var workFolder = _settings.Settings.Llm.WorkFolder;
      +        if (string.IsNullOrEmpty(workFolder) || !Directory.Exists(workFolder)) return;
      +
      +        _fileWatcher = new FileSystemWatcher(workFolder)
      +        {
      +            IncludeSubdirectories = true,
      +            NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName,
      +            EnableRaisingEvents = true,
      +        };
      +
      +        // 디바운스용 — 짧은 시간 내 여러 변경을 하나로 묶음
      +        DateTime lastTrigger = DateTime.MinValue;
      +
      +        _fileWatcher.Changed += (_, e) =>
      +        {
      +            if ((DateTime.Now - lastTrigger).TotalSeconds < 5) return;
      +
      +            foreach (var rule in fileRules)
      +            {
      +                if (MatchesPattern(e.FullPath, rule.Pattern))
      +                {
      +                    lastTrigger = DateTime.Now;
      +                    var prompt = rule.Prompt.Replace("{file}", e.FullPath).Replace("{name}", e.Name ?? "");
      +                    System.Windows.Application.Current?.Dispatcher.BeginInvoke(() =>
      +                        OnTriggerFired?.Invoke(rule.Name, prompt));
      +                    break;
      +                }
      +            }
      +        };
      +    }
      +
      +    private void StartScheduleTimer()
      +    {
      +        var scheduleRules = _rules.Where(r => r.Type == "schedule").ToList();
      +        if (scheduleRules.Count == 0) return;
      +
      +        _scheduleTimer = new DispatcherTimer { Interval = TimeSpan.FromMinutes(1) };
      +        _scheduleTimer.Tick += (_, _) =>
      +        {
      +            var now = DateTime.Now;
      +            foreach (var rule in scheduleRules)
      +            {
      +                if (ShouldRunSchedule(rule, now))
      +                {
      +                    rule.LastRun = now;
      +                    OnTriggerFired?.Invoke(rule.Name, rule.Prompt);
      +                }
      +            }
      +        };
      +        _scheduleTimer.Start();
      +    }
      +
      +    private static bool MatchesPattern(string filePath, string? pattern)
      +    {
      +        if (string.IsNullOrEmpty(pattern)) return true;
      +        // 간단한 확장자/폴더 패턴 매칭
      +        if (pattern.StartsWith("*."))
      +            return filePath.EndsWith(pattern[1..], StringComparison.OrdinalIgnoreCase);
      +        return filePath.Contains(pattern, StringComparison.OrdinalIgnoreCase);
      +    }
      +
      +    private static bool ShouldRunSchedule(TriggerRule rule, DateTime now)
      +    {
      +        if (rule.LastRun.HasValue && (now - rule.LastRun.Value).TotalMinutes < (rule.IntervalMinutes ?? 60))
      +            return false;
      +        // 시간 범위 체크 (근무 시간만)
      +        if (rule.ActiveHourStart.HasValue && now.Hour < rule.ActiveHourStart.Value) return false;
      +        if (rule.ActiveHourEnd.HasValue && now.Hour >= rule.ActiveHourEnd.Value) return false;
      +        return true;
      +    }
      +
      +    /// 수동으로 트리거를 실행합니다.
      +    public void FireManual(string ruleName)
      +    {
      +        var rule = _rules.FirstOrDefault(r => r.Name == ruleName);
      +        if (rule != null)
      +            OnTriggerFired?.Invoke(rule.Name, rule.Prompt);
      +    }
      +
      +    /// 현재 로드된 트리거 규칙 목록.
      +    public IReadOnlyList Rules => _rules;
      +
      +    public void Dispose()
      +    {
      +        if (_disposed) return;
      +        _disposed = true;
      +        Stop();
      +    }
      +}
      +
      +/// 트리거 규칙 정의.
      +public class TriggerRule
      +{
      +    public string Name { get; set; } = "";
      +    public string Type { get; set; } = "file_change"; // file_change | schedule | git
      +    public string Prompt { get; set; } = "";
      +    public string? Pattern { get; set; } // file_change: 확장자/경로 패턴
      +    public int? IntervalMinutes { get; set; } // schedule: 실행 간격 (분)
      +    public int? ActiveHourStart { get; set; } // schedule: 활성 시작 시각 (0~23)
      +    public int? ActiveHourEnd { get; set; } // schedule: 활성 종료 시각
      +    public bool Enabled { get; set; } = true;
      +    public DateTime? LastRun { get; set; }
      +}
      diff --git a/src/AxCopilot/Services/AuditLogService.cs b/src/AxCopilot/Services/AuditLogService.cs
      new file mode 100644
      index 0000000..7800184
      --- /dev/null
      +++ b/src/AxCopilot/Services/AuditLogService.cs
      @@ -0,0 +1,141 @@
      +using System.IO;
      +using System.Text;
      +using System.Text.Json;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 에이전트 도구 호출 이력을 로컬 JSON 파일로 영속화하는 보안 감사 로그 서비스.
      +/// 파일 위치: %APPDATA%\AxCopilot\audit\{yyyy-MM-dd}.json
      +/// 
      +public static class AuditLogService
      +{
      +    private static readonly string AuditDir;
      +    private static readonly object _lock = new();
      +    private static readonly JsonSerializerOptions _jsonOpts = new()
      +    {
      +        WriteIndented = false,
      +        Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
      +    };
      +
      +    static AuditLogService()
      +    {
      +        AuditDir = Path.Combine(
      +            Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +            "AxCopilot", "audit");
      +        try { Directory.CreateDirectory(AuditDir); } catch (Exception) { }
      +    }
      +
      +    /// 감사 로그 항목을 기록합니다.
      +    public static void Log(AuditEntry entry)
      +    {
      +        try
      +        {
      +            var fileName = $"{DateTime.Now:yyyy-MM-dd}.json";
      +            var filePath = Path.Combine(AuditDir, fileName);
      +            var json = JsonSerializer.Serialize(entry, _jsonOpts);
      +
      +            lock (_lock)
      +            {
      +                File.AppendAllText(filePath, json + "\n", Encoding.UTF8);
      +            }
      +        }
      +        catch (Exception) { /* 감사 로그 실패는 무시 — 앱 동작에 영향 없음 */ }
      +    }
      +
      +    /// 에이전트 도구 호출을 감사 로그에 기록합니다.
      +    public static void LogToolCall(string conversationId, string tab, string toolName,
      +        string parameters, string result, string? filePath, bool success)
      +    {
      +        Log(new AuditEntry
      +        {
      +            ConversationId = conversationId,
      +            Tab = tab,
      +            Action = "ToolCall",
      +            ToolName = toolName,
      +            Parameters = Truncate(parameters, 500),
      +            Result = Truncate(result, 500),
      +            FilePath = filePath,
      +            Success = success,
      +        });
      +    }
      +
      +    /// 파일 접근을 감사 로그에 기록합니다.
      +    public static void LogFileAccess(string conversationId, string tab, string action, string filePath, bool success)
      +    {
      +        Log(new AuditEntry
      +        {
      +            ConversationId = conversationId,
      +            Tab = tab,
      +            Action = action, // Read, Write, Delete, Execute
      +            FilePath = filePath,
      +            Success = success,
      +        });
      +    }
      +
      +    /// 오늘 감사 로그를 읽습니다.
      +    public static List LoadToday()
      +    {
      +        var fileName = $"{DateTime.Now:yyyy-MM-dd}.json";
      +        return LoadFile(Path.Combine(AuditDir, fileName));
      +    }
      +
      +    /// 특정 날짜의 감사 로그를 읽습니다.
      +    public static List LoadDate(DateTime date)
      +    {
      +        var fileName = $"{date:yyyy-MM-dd}.json";
      +        return LoadFile(Path.Combine(AuditDir, fileName));
      +    }
      +
      +    private static List LoadFile(string filePath)
      +    {
      +        var entries = new List();
      +        if (!File.Exists(filePath)) return entries;
      +        try
      +        {
      +            foreach (var line in File.ReadAllLines(filePath, Encoding.UTF8))
      +            {
      +                if (string.IsNullOrWhiteSpace(line)) continue;
      +                var entry = JsonSerializer.Deserialize(line, _jsonOpts);
      +                if (entry != null) entries.Add(entry);
      +            }
      +        }
      +        catch (Exception) { }
      +        return entries;
      +    }
      +
      +    /// 30일 이전 감사 로그를 삭제합니다.
      +    public static void PurgeOldLogs(int retentionDays = 30)
      +    {
      +        try
      +        {
      +            var cutoff = DateTime.Now.AddDays(-retentionDays);
      +            foreach (var f in Directory.GetFiles(AuditDir, "*.json"))
      +            {
      +                if (File.GetCreationTime(f) < cutoff)
      +                    File.Delete(f);
      +            }
      +        }
      +        catch (Exception) { }
      +    }
      +
      +    /// 감사 로그 폴더 경로를 반환합니다.
      +    public static string GetAuditFolder() => AuditDir;
      +
      +    private static string Truncate(string? s, int maxLen) =>
      +        string.IsNullOrEmpty(s) ? "" : s.Length <= maxLen ? s : s[..maxLen] + "…";
      +}
      +
      +/// 감사 로그 항목.
      +public class AuditEntry
      +{
      +    public DateTime Timestamp { get; init; } = DateTime.Now;
      +    public string ConversationId { get; init; } = "";
      +    public string Tab { get; init; } = "";       // Chat, Cowork, Code
      +    public string Action { get; init; } = "";     // ToolCall, Read, Write, Delete, Execute
      +    public string ToolName { get; init; } = "";
      +    public string Parameters { get; init; } = "";
      +    public string Result { get; init; } = "";
      +    public string? FilePath { get; init; }
      +    public bool Success { get; init; } = true;
      +}
      diff --git a/src/AxCopilot/Services/ChatStorageService.cs b/src/AxCopilot/Services/ChatStorageService.cs
      new file mode 100644
      index 0000000..48e83bb
      --- /dev/null
      +++ b/src/AxCopilot/Services/ChatStorageService.cs
      @@ -0,0 +1,326 @@
      +using System.IO;
      +using System.Text.Json;
      +using AxCopilot.Models;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 대화 내역을 로컬에 AES-256-GCM 암호화하여 저장/로드합니다.
      +/// 파일 형식: conversations/{id}.axchat (암호화 바이너리)
      +/// 스레드 안전: ReaderWriterLockSlim으로 동시 접근 보호.
      +/// 원자적 쓰기: 임시 파일 → rename 패턴으로 크래시 시 데이터 손실 방지.
      +/// 
      +public class ChatStorageService
      +{
      +    private static readonly string ConversationsDir =
      +        Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +                     "AxCopilot", "conversations");
      +
      +    private static readonly JsonSerializerOptions JsonOpts = new()
      +    {
      +        WriteIndented = false,
      +        PropertyNameCaseInsensitive = true
      +    };
      +
      +    private static readonly ReaderWriterLockSlim Lock = new();
      +
      +    public ChatStorageService()
      +    {
      +        Directory.CreateDirectory(ConversationsDir);
      +    }
      +
      +    /// 대화를 암호화하여 저장합니다 (원자적 쓰기).
      +    public void Save(ChatConversation conversation)
      +    {
      +        conversation.UpdatedAt = DateTime.Now;
      +        // 검색용 미리보기 자동 갱신 (첫 사용자 메시지 100자)
      +        if (string.IsNullOrEmpty(conversation.Preview) && conversation.Messages.Count > 0)
      +        {
      +            var firstUser = conversation.Messages.FirstOrDefault(m => m.Role == "user");
      +            if (firstUser != null)
      +                conversation.Preview = firstUser.Content.Length > 100
      +                    ? firstUser.Content[..100] : firstUser.Content;
      +        }
      +        var json = JsonSerializer.Serialize(conversation, JsonOpts);
      +        var path = GetFilePath(conversation.Id);
      +        var tempPath = path + ".tmp";
      +
      +        Lock.EnterWriteLock();
      +        try
      +        {
      +            CryptoService.EncryptToFile(tempPath, json);
      +            // 원자적 교체: 기존 파일이 있으면 덮어쓰기
      +            if (File.Exists(path)) File.Delete(path);
      +            File.Move(tempPath, path);
      +            UpdateMetaCache(conversation);
      +        }
      +        catch (Exception ex)
      +        {
      +            // 임시 파일 정리
      +            try { if (File.Exists(tempPath)) File.Delete(tempPath); } catch (Exception) { }
      +            LogService.Warn($"대화 저장 실패 ({conversation.Id}): {ex.Message}");
      +            throw;
      +        }
      +        finally
      +        {
      +            Lock.ExitWriteLock();
      +        }
      +    }
      +
      +    /// 대화를 복호화하여 로드합니다.
      +    public ChatConversation? Load(string id)
      +    {
      +        var path = GetFilePath(id);
      +        Lock.EnterReadLock();
      +        try
      +        {
      +            if (!File.Exists(path)) return null;
      +            var json = CryptoService.DecryptFromFile(path);
      +            return JsonSerializer.Deserialize(json, JsonOpts);
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"대화 로드 실패 ({id}): {ex.Message}");
      +            return null;
      +        }
      +        finally
      +        {
      +            Lock.ExitReadLock();
      +        }
      +    }
      +
      +    // ── 메타 캐시 ─────────────────────────────────────────────────────────
      +    private List? _metaCache;
      +    private bool _metaDirty = true;
      +
      +    /// 메타 캐시를 무효화합니다. 다음 LoadAllMeta 호출 시 디스크에서 다시 읽습니다.
      +    public void InvalidateMetaCache() => _metaDirty = true;
      +
      +    /// 메타 캐시에서 특정 항목만 업데이트합니다 (전체 재로드 없이).
      +    public void UpdateMetaCache(ChatConversation conv)
      +    {
      +        if (_metaCache == null) return;
      +        var existing = _metaCache.FindIndex(c => c.Id == conv.Id);
      +        var meta = new ChatConversation
      +        {
      +            Id = conv.Id, Title = conv.Title,
      +            CreatedAt = conv.CreatedAt, UpdatedAt = conv.UpdatedAt,
      +            Pinned = conv.Pinned, Category = conv.Category,
      +            Tab = conv.Tab, SystemCommand = conv.SystemCommand,
      +            WorkFolder = conv.WorkFolder, Preview = conv.Preview,
      +            Messages = new()
      +        };
      +        if (existing >= 0)
      +            _metaCache[existing] = meta;
      +        else
      +            _metaCache.Add(meta);
      +    }
      +
      +    /// 메타 캐시에서 항목을 제거합니다.
      +    public void RemoveFromMetaCache(string id)
      +    {
      +        _metaCache?.RemoveAll(c => c.Id == id);
      +    }
      +
      +    /// 모든 대화의 메타 정보(메시지 미포함)를 로드합니다. 캐시를 사용합니다.
      +    public List LoadAllMeta()
      +    {
      +        if (!_metaDirty && _metaCache != null)
      +        {
      +            return _metaCache.OrderByDescending(c => c.Pinned)
      +                             .ThenByDescending(c => c.UpdatedAt)
      +                             .ToList();
      +        }
      +
      +        var result = new List();
      +        if (!Directory.Exists(ConversationsDir))
      +        {
      +            _metaCache = result;
      +            _metaDirty = false;
      +            return result;
      +        }
      +
      +        Lock.EnterReadLock();
      +        try
      +        {
      +            foreach (var file in Directory.GetFiles(ConversationsDir, "*.axchat"))
      +            {
      +                try
      +                {
      +                    var json = CryptoService.DecryptFromFile(file);
      +                    var conv = JsonSerializer.Deserialize(json, JsonOpts);
      +                    if (conv != null)
      +                    {
      +                        var meta = new ChatConversation
      +                        {
      +                            Id = conv.Id,
      +                            Title = conv.Title,
      +                            CreatedAt = conv.CreatedAt,
      +                            UpdatedAt = conv.UpdatedAt,
      +                            Pinned = conv.Pinned,
      +                            Category = conv.Category,
      +                            Tab = conv.Tab,
      +                            SystemCommand = conv.SystemCommand,
      +                            WorkFolder = conv.WorkFolder,
      +                            Preview = conv.Preview,
      +                            Messages = new()
      +                        };
      +                        result.Add(meta);
      +                    }
      +                }
      +                catch (Exception ex)
      +                {
      +                    LogService.Warn($"대화 메타 로드 실패 ({Path.GetFileName(file)}): {ex.Message}");
      +                }
      +            }
      +        }
      +        finally
      +        {
      +            Lock.ExitReadLock();
      +        }
      +
      +        _metaCache = result;
      +        _metaDirty = false;
      +
      +        return result.OrderByDescending(c => c.Pinned)
      +                     .ThenByDescending(c => c.UpdatedAt)
      +                     .ToList();
      +    }
      +
      +    /// 특정 대화를 삭제합니다.
      +    public void Delete(string id)
      +    {
      +        var path = GetFilePath(id);
      +        Lock.EnterWriteLock();
      +        try
      +        {
      +            if (File.Exists(path)) File.Delete(path);
      +            RemoveFromMetaCache(id);
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"대화 삭제 실패 ({id}): {ex.Message}");
      +        }
      +        finally
      +        {
      +            Lock.ExitWriteLock();
      +        }
      +    }
      +
      +    /// 모든 대화를 삭제합니다.
      +    public int DeleteAll()
      +    {
      +        if (!Directory.Exists(ConversationsDir)) return 0;
      +        Lock.EnterWriteLock();
      +        try
      +        {
      +            var files = Directory.GetFiles(ConversationsDir, "*.axchat");
      +            int count = 0;
      +            foreach (var f in files)
      +            {
      +                try { File.Delete(f); count++; }
      +                catch (Exception ex) { LogService.Warn($"파일 삭제 실패 ({Path.GetFileName(f)}): {ex.Message}"); }
      +            }
      +            InvalidateMetaCache();
      +            return count;
      +        }
      +        finally
      +        {
      +            Lock.ExitWriteLock();
      +        }
      +    }
      +
      +    /// 보관 기간을 초과한 대화를 삭제합니다 (핀 고정 제외).
      +    public int PurgeExpired(int retentionDays)
      +    {
      +        if (retentionDays <= 0) return 0;
      +        var cutoff = DateTime.Now.AddDays(-retentionDays);
      +        int count = 0;
      +
      +        Lock.EnterWriteLock();
      +        try
      +        {
      +            foreach (var file in Directory.GetFiles(ConversationsDir, "*.axchat"))
      +            {
      +                try
      +                {
      +                    var json = CryptoService.DecryptFromFile(file);
      +                    var conv = JsonSerializer.Deserialize(json, JsonOpts);
      +                    if (conv != null && !conv.Pinned && conv.UpdatedAt < cutoff)
      +                    {
      +                        File.Delete(file);
      +                        RemoveFromMetaCache(conv.Id);
      +                        count++;
      +                    }
      +                }
      +                catch (Exception ex)
      +                {
      +                    LogService.Warn($"만료 대화 정리 실패 ({Path.GetFileName(file)}): {ex.Message}");
      +                }
      +            }
      +        }
      +        finally
      +        {
      +            Lock.ExitWriteLock();
      +        }
      +        return count;
      +    }
      +
      +    /// 드라이브 사용률이 98% 이상이면 오래된 대화부터 삭제합니다 (핀 고정 제외).
      +    public int PurgeForDiskSpace(double threshold = 0.98)
      +    {
      +        try
      +        {
      +            var drive = new DriveInfo(Path.GetPathRoot(ConversationsDir) ?? "C");
      +            if (drive.TotalSize <= 0) return 0;
      +            var usageRatio = 1.0 - (double)drive.AvailableFreeSpace / drive.TotalSize;
      +            if (usageRatio < threshold) return 0;
      +
      +            LogService.Info($"드라이브 사용률 {usageRatio:P1} — 대화 정리 시작 (임계값: {threshold:P0})");
      +
      +            // 오래된 순으로 정렬하여 삭제 (핀 고정 제외)
      +            var files = Directory.GetFiles(ConversationsDir, "*.axchat")
      +                .Select(f => new { Path = f, LastWrite = File.GetLastWriteTime(f) })
      +                .OrderBy(f => f.LastWrite)
      +                .ToList();
      +
      +            int count = 0;
      +            Lock.EnterWriteLock();
      +            try
      +            {
      +                foreach (var file in files)
      +                {
      +                    // 사용률이 임계값 미만으로 내려가면 중단
      +                    var currentUsage = 1.0 - (double)drive.AvailableFreeSpace / drive.TotalSize;
      +                    if (currentUsage < threshold - 0.02) break; // 2% 여유 확보 후 중단
      +
      +                    try
      +                    {
      +                        var json = CryptoService.DecryptFromFile(file.Path);
      +                        var conv = JsonSerializer.Deserialize(json, JsonOpts);
      +                        if (conv != null && conv.Pinned) continue; // 핀 고정 건너뜀
      +
      +                        File.Delete(file.Path);
      +                        count++;
      +                    }
      +                    catch (Exception) { }
      +                }
      +            }
      +            finally
      +            {
      +                Lock.ExitWriteLock();
      +            }
      +
      +            if (count > 0)
      +                LogService.Info($"드라이브 용량 부족으로 대화 {count}개 삭제 완료");
      +            return count;
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"디스크 용량 확인 실패: {ex.Message}");
      +            return 0;
      +        }
      +    }
      +
      +    private static string GetFilePath(string id) => Path.Combine(ConversationsDir, $"{id}.axchat");
      +}
      diff --git a/src/AxCopilot/Services/ClipboardHistoryService.cs b/src/AxCopilot/Services/ClipboardHistoryService.cs
      new file mode 100644
      index 0000000..8524d1a
      --- /dev/null
      +++ b/src/AxCopilot/Services/ClipboardHistoryService.cs
      @@ -0,0 +1,575 @@
      +using System.IO;
      +using System.Runtime.InteropServices;
      +using System.Security.Cryptography;
      +using System.Text;
      +using System.Text.Json;
      +using System.Text.Json.Serialization;
      +using System.Text.RegularExpressions;
      +using System.Windows;
      +using System.Windows.Interop;
      +using System.Windows.Media.Imaging;
      +using AxCopilot.Models;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 클립보드 변경을 감지하여 히스토리를 관리합니다.
      +/// WM_CLIPBOARDUPDATE 메시지를 수신하기 위해 숨겨진 메시지 창을 생성합니다.
      +/// 
      +public class ClipboardHistoryService : IDisposable
      +{
      +    private const int WM_CLIPBOARDUPDATE = 0x031D;
      +
      +    private static readonly string HistoryPath = Path.Combine(
      +        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +        "AxCopilot", "clipboard_history.dat");
      +
      +    // 구버전 평문 파일 경로 (마이그레이션용)
      +    private static readonly string LegacyPath = Path.Combine(
      +        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +        "AxCopilot", "clipboard_history.json");
      +
      +    /// 원본 이미지 캐시 폴더 (%APPDATA%\AxCopilot\clipboard_images\)
      +    private static readonly string ImageCachePath = Path.Combine(
      +        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +        "AxCopilot", "clipboard_images");
      +
      +    private const long MaxCacheSizeBytes = 500 * 1024 * 1024; // 500MB
      +    private const int  MaxCacheAgeDays   = 30;
      +
      +    private static readonly JsonSerializerOptions JsonOpts = new()
      +    {
      +        WriteIndented = false,
      +        PropertyNameCaseInsensitive = true
      +    };
      +
      +    private readonly SettingsService _settings;
      +    private HwndSource?              _msgSource;
      +    private readonly object          _lock = new();
      +    private volatile bool            _ignoreNext; // 자체 클립보드 조작 시 히스토리 추가 방지
      +    private bool                     _disposed;
      +
      +    private readonly List _history = new();
      +
      +    public IReadOnlyList History
      +    {
      +        get { lock (_lock) return _history.ToList(); }
      +    }
      +
      +    public event EventHandler? HistoryChanged;
      +
      +    public ClipboardHistoryService(SettingsService settings)
      +    {
      +        _settings = settings;
      +    }
      +
      +    /// 메시지 창을 생성하고 클립보드 알림을 등록합니다.
      +    public void Initialize()
      +    {
      +        if (_disposed) return;
      +        if (_msgSource != null) return;  // 이미 초기화됨
      +        if (!_settings.Settings.ClipboardHistory.Enabled) return;
      +
      +        // 저장된 히스토리 복원 (텍스트 항목만)
      +        LoadHistory();
      +
      +        Application.Current.Dispatcher.Invoke(() =>
      +        {
      +            var sourceParams = new HwndSourceParameters("axClipboardMonitor")
      +            {
      +                Width           = 0,
      +                Height          = 0,
      +                ParentWindow    = new IntPtr(-3),  // HWND_MESSAGE — 화면에 표시 안 됨
      +                WindowStyle     = 0,
      +                ExtendedWindowStyle = 0
      +            };
      +            _msgSource = new HwndSource(sourceParams);
      +            _msgSource.AddHook(WndProc);
      +            AddClipboardFormatListener(_msgSource.Handle);
      +            LogService.Info("클립보드 히스토리 서비스 시작");
      +        });
      +    }
      +
      +    /// 자체 클립보드 조작(히스토리 붙여넣기) 시 히스토리가 중복 추가되지 않도록 플래그 설정.
      +    public void SuppressNextCapture() => _ignoreNext = true;
      +
      +    /// 항목을 사용했을 때 CopiedAt을 현재 시각으로 갱신하고 목록 맨 위로 이동합니다.
      +    public void PromoteEntry(ClipboardEntry entry)
      +    {
      +        lock (_lock)
      +        {
      +            _history.Remove(entry);
      +            var updated = new ClipboardEntry(entry.Text, DateTime.Now)
      +            {
      +                Image = entry.Image,
      +                OriginalImagePath = entry.OriginalImagePath,
      +                IsPinned = entry.IsPinned,
      +                Category = entry.Category,
      +            };
      +            _history.Insert(0, updated);
      +        }
      +        HistoryChanged?.Invoke(this, EventArgs.Empty);
      +        _ = SaveHistoryAsync();
      +    }
      +
      +    public void ClearHistory()
      +    {
      +        lock (_lock) _history.Clear();
      +        HistoryChanged?.Invoke(this, EventArgs.Empty);
      +        _ = SaveHistoryAsync();
      +    }
      +
      +    /// 항목의 핀 고정을 토글합니다.
      +    public void TogglePin(ClipboardEntry entry)
      +    {
      +        lock (_lock)
      +        {
      +            if (!entry.IsPinned)
      +            {
      +                // 최대 핀 개수 체크
      +                var maxPins = _settings.Settings.Launcher.MaxPinnedClipboardItems;
      +                var currentPins = _history.Count(e => e.IsPinned);
      +                if (currentPins >= maxPins) return; // 최대 도달 시 무시
      +            }
      +            entry.IsPinned = !entry.IsPinned;
      +        }
      +        HistoryChanged?.Invoke(this, EventArgs.Empty);
      +        _ = SaveHistoryAsync();
      +    }
      +
      +    /// 텍스트 내용에서 카테고리를 자동 감지합니다.
      +    private static string DetectCategory(string text)
      +    {
      +        var trimmed = text.Trim();
      +        if (Uri.TryCreate(trimmed, UriKind.Absolute, out var uri) &&
      +            (uri.Scheme == "http" || uri.Scheme == "https"))
      +            return "URL";
      +        if (trimmed.StartsWith("\\\\") || (trimmed.Length >= 3 && trimmed[1] == ':' && (trimmed[2] == '\\' || trimmed[2] == '/')))
      +            return "경로";
      +        if (trimmed.Contains('{') && trimmed.Contains('}') || trimmed.Contains("function ") ||
      +            trimmed.Contains("class ") || trimmed.Contains("public ") || trimmed.Contains("private ") ||
      +            trimmed.Contains("def ") || trimmed.Contains("import ") || trimmed.Contains("using "))
      +            return "코드";
      +        return "일반";
      +    }
      +
      +    /// 
      +    /// 클립보드 감지가 동작하지 않을 때 강제 재시작합니다.
      +    /// Dispose 후 호출하면 내부 상태를 초기화하고 클립보드 모니터링을 재개합니다.
      +    /// 
      +    public void Reinitialize()
      +    {
      +        _disposed = false;
      +        _msgSource = null;
      +        Initialize();
      +        LogService.Info("클립보드 히스토리 서비스 재초기화 완료");
      +    }
      +
      +    public void Dispose()
      +    {
      +        if (_disposed) return;
      +        _disposed = true;
      +        if (_msgSource != null)
      +        {
      +            RemoveClipboardFormatListener(_msgSource.Handle);
      +            _msgSource.Dispose();
      +            _msgSource = null;
      +        }
      +        // 종료 시 히스토리 저장 (동기)
      +        SaveHistorySync();
      +    }
      +
      +    // ─── 히스토리 영속성 (DPAPI 암호화) ─────────────────────────────────────
      +    // Windows DPAPI(DataProtectionScope.CurrentUser)를 사용하여
      +    // 현재 Windows 사용자 계정에서만 복호화 가능하도록 합니다.
      +    // 이 앱 외부에서는 파일 내용을 읽을 수 없습니다.
      +
      +    private void LoadHistory()
      +    {
      +        try
      +        {
      +            // 구버전 평문 파일 → 암호화 파일 마이그레이션
      +            if (!File.Exists(HistoryPath) && File.Exists(LegacyPath))
      +            {
      +                MigrateLegacyFile();
      +            }
      +
      +            if (!File.Exists(HistoryPath)) return;
      +
      +            var encrypted = File.ReadAllBytes(HistoryPath);
      +            var plain = ProtectedData.Unprotect(encrypted, null, DataProtectionScope.CurrentUser);
      +            var json = Encoding.UTF8.GetString(plain);
      +            var saved = JsonSerializer.Deserialize>(json, JsonOpts);
      +            if (saved == null) return;
      +
      +            int max = _settings.Settings.ClipboardHistory.MaxItems;
      +            lock (_lock)
      +            {
      +                foreach (var s in saved.Take(max))
      +                {
      +                    if (!string.IsNullOrEmpty(s.ImageBase64))
      +                    {
      +                        var img = Base64ToImage(s.ImageBase64);
      +                        if (img != null)
      +                        {
      +                            _history.Add(new ClipboardEntry("", s.CopiedAt)
      +                            {
      +                                Image = img,
      +                                OriginalImagePath = s.OriginalImagePath,
      +                                IsPinned = s.IsPinned,
      +                                Category = s.Category,
      +                            });
      +                            continue;
      +                        }
      +                    }
      +                    _history.Add(new ClipboardEntry(s.Text, s.CopiedAt) { IsPinned = s.IsPinned, Category = s.Category });
      +                }
      +            }
      +            // 시작 시 이미지 캐시 정리
      +            Task.Run(CleanupImageCache);
      +            LogService.Info($"클립보드 히스토리 {_history.Count}개 복원 (암호화)");
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"클립보드 히스토리 로드 실패: {ex.Message}");
      +        }
      +    }
      +
      +    private void MigrateLegacyFile()
      +    {
      +        try
      +        {
      +            var json = File.ReadAllText(LegacyPath);
      +            var plain = Encoding.UTF8.GetBytes(json);
      +            var encrypted = ProtectedData.Protect(plain, null, DataProtectionScope.CurrentUser);
      +            Directory.CreateDirectory(Path.GetDirectoryName(HistoryPath)!);
      +            File.WriteAllBytes(HistoryPath, encrypted);
      +            File.Delete(LegacyPath); // 평문 파일 삭제
      +            LogService.Info("클립보드 히스토리 평문→암호화 마이그레이션 완료");
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"클립보드 히스토리 마이그레이션 실패: {ex.Message}");
      +        }
      +    }
      +
      +    private async Task SaveHistoryAsync()
      +    {
      +        try
      +        {
      +            var snapshot = BuildSnapshot();
      +            var json = JsonSerializer.Serialize(snapshot, JsonOpts);
      +            var plain = Encoding.UTF8.GetBytes(json);
      +            var encrypted = ProtectedData.Protect(plain, null, DataProtectionScope.CurrentUser);
      +            Directory.CreateDirectory(Path.GetDirectoryName(HistoryPath)!);
      +            await File.WriteAllBytesAsync(HistoryPath, encrypted).ConfigureAwait(false);
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"클립보드 히스토리 저장 실패: {ex.Message}");
      +        }
      +    }
      +
      +    private void SaveHistorySync()
      +    {
      +        try
      +        {
      +            var snapshot = BuildSnapshot();
      +            var json = JsonSerializer.Serialize(snapshot, JsonOpts);
      +            var plain = Encoding.UTF8.GetBytes(json);
      +            var encrypted = ProtectedData.Protect(plain, null, DataProtectionScope.CurrentUser);
      +            Directory.CreateDirectory(Path.GetDirectoryName(HistoryPath)!);
      +            File.WriteAllBytes(HistoryPath, encrypted);
      +        }
      +        catch (Exception) { /* 종료 시 실패 무시 */ }
      +    }
      +
      +    private List BuildSnapshot()
      +    {
      +        lock (_lock)
      +        {
      +            return _history.Select(e =>
      +            {
      +                if (e.IsText)
      +                    return new SavedClipEntry { Text = e.Text, CopiedAt = e.CopiedAt, IsPinned = e.IsPinned, Category = e.Category };
      +                var b64 = ImageToBase64(e.Image);
      +                return new SavedClipEntry
      +                {
      +                    CopiedAt = e.CopiedAt,
      +                    ImageBase64 = b64,
      +                    OriginalImagePath = e.OriginalImagePath,
      +                    IsPinned = e.IsPinned,
      +                    Category = e.Category,
      +                };
      +            }).ToList();
      +        }
      +    }
      +
      +    // System.Text.Json 역직렬화를 위해 기본 생성자 + 프로퍼티 형태로 선언
      +    private class SavedClipEntry
      +    {
      +        public string   Text     { get; set; } = "";
      +        public DateTime CopiedAt { get; set; }
      +        /// 이미지 썸네일 PNG 바이트 (Base64 인코딩). null이면 텍스트 항목.
      +        public string?  ImageBase64 { get; set; }
      +        /// 원본 이미지 파일 경로 (clipboard_images 폴더).
      +        public string?  OriginalImagePath { get; set; }
      +        public bool     IsPinned { get; set; }
      +        public string   Category { get; set; } = "일반";
      +    }
      +
      +    // ─── 내부 ──────────────────────────────────────────────────────────────
      +
      +    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
      +    {
      +        if (msg == WM_CLIPBOARDUPDATE)
      +        {
      +            OnClipboardUpdate();
      +            handled = false;
      +        }
      +        return IntPtr.Zero;
      +    }
      +
      +    private void OnClipboardUpdate()
      +    {
      +        if (_ignoreNext) { _ignoreNext = false; return; }
      +        if (!_settings.Settings.ClipboardHistory.Enabled) return;
      +
      +        Application.Current.Dispatcher.Invoke(() =>
      +        {
      +            try
      +            {
      +                ClipboardEntry? entry = null;
      +
      +                // ─── 텍스트 ────────────────────────────────────────────────────
      +                if (Clipboard.ContainsText())
      +                {
      +                    var text = Clipboard.GetText();
      +                    if (string.IsNullOrWhiteSpace(text)) return;
      +                    if (text.Length > 10_000) return;
      +
      +                    // 제외 패턴 검사
      +                    foreach (var pattern in _settings.Settings.ClipboardHistory.ExcludePatterns)
      +                    {
      +                        try
      +                        {
      +                            if (Regex.IsMatch(text.Trim(), pattern,
      +                                    RegexOptions.None, TimeSpan.FromMilliseconds(200)))
      +                                return;
      +                        }
      +                        catch (Exception) { /* 잘못된 패턴 무시 */ }
      +                    }
      +
      +                    var category = _settings.Settings.Launcher.EnableClipboardAutoCategory
      +                        ? DetectCategory(text) : "일반";
      +                    entry = new ClipboardEntry(text, DateTime.Now) { Category = category };
      +                }
      +                // ─── 이미지 ────────────────────────────────────────────────────
      +                else if (Clipboard.ContainsImage())
      +                {
      +                    var src = Clipboard.GetImage();
      +                    if (src == null) return;
      +
      +                    // 원본 이미지를 캐시 폴더에 PNG로 저장
      +                    var originalPath = SaveOriginalImage(src);
      +
      +                    // 표시용 썸네일 (최대 80px 폭)
      +                    var thumb = CreateThumbnail(src, 80);
      +                    entry = new ClipboardEntry("", DateTime.Now)
      +                    {
      +                        Image = thumb,
      +                        OriginalImagePath = originalPath,
      +                    };
      +                }
      +
      +                if (entry == null) return;
      +
      +                lock (_lock)
      +                {
      +                    // 텍스트 중복 제거
      +                    if (entry.IsText)
      +                    {
      +                        if (_history.Count > 0 && _history[0].Text == entry.Text) return;
      +                        _history.RemoveAll(e => e.IsText && e.Text == entry.Text);
      +                    }
      +
      +                    _history.Insert(0, entry);
      +
      +                    int max = _settings.Settings.ClipboardHistory.MaxItems;
      +                    while (_history.Count > max)
      +                    {
      +                        // 핀 고정 항목은 삭제 보호 — 뒤에서부터 핀 아닌 항목 제거
      +                        var removeIdx = _history.FindLastIndex(e => !e.IsPinned);
      +                        if (removeIdx >= 0) _history.RemoveAt(removeIdx);
      +                        else break; // 전부 핀이면 중단
      +                    }
      +                }
      +
      +                HistoryChanged?.Invoke(this, EventArgs.Empty);
      +                _ = SaveHistoryAsync();
      +            }
      +            catch (Exception ex)
      +            {
      +                LogService.Warn($"클립보드 캡처 실패: {ex.Message}");
      +            }
      +        });
      +    }
      +
      +    /// 원본 이미지를 캐시 폴더에 PNG로 저장합니다.
      +    private static string? SaveOriginalImage(BitmapSource src)
      +    {
      +        try
      +        {
      +            Directory.CreateDirectory(ImageCachePath);
      +            var fileName = $"clip_{DateTime.Now:yyyyMMdd_HHmmss_fff}.png";
      +            var filePath = Path.Combine(ImageCachePath, fileName);
      +
      +            var encoder = new PngBitmapEncoder();
      +            encoder.Frames.Add(BitmapFrame.Create(src));
      +            using var fs = new FileStream(filePath, FileMode.Create);
      +            encoder.Save(fs);
      +            return filePath;
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"원본 이미지 저장 실패: {ex.Message}");
      +            return null;
      +        }
      +    }
      +
      +    /// 원본 이미지를 파일에서 로드합니다.
      +    public static BitmapSource? LoadOriginalImage(string? path)
      +    {
      +        if (string.IsNullOrEmpty(path) || !File.Exists(path)) return null;
      +        try
      +        {
      +            var bi = new BitmapImage();
      +            bi.BeginInit();
      +            bi.CacheOption = BitmapCacheOption.OnLoad;
      +            bi.UriSource = new Uri(path, UriKind.Absolute);
      +            bi.EndInit();
      +            bi.Freeze();
      +            return bi;
      +        }
      +        catch (Exception) { return null; }
      +    }
      +
      +    /// 이미지 캐시 정리 (30일 초과 + 500MB 초과 시 오래된 파일부터 삭제).
      +    public static void CleanupImageCache()
      +    {
      +        try
      +        {
      +            if (!Directory.Exists(ImageCachePath)) return;
      +            var files = new DirectoryInfo(ImageCachePath)
      +                .GetFiles("clip_*.png")
      +                .OrderBy(f => f.LastWriteTime)
      +                .ToList();
      +
      +            // 30일 초과 파일 삭제
      +            var cutoff = DateTime.Now.AddDays(-MaxCacheAgeDays);
      +            foreach (var f in files.Where(f => f.LastWriteTime < cutoff).ToList())
      +            {
      +                try { f.Delete(); files.Remove(f); } catch (Exception) { }
      +            }
      +
      +            // 500MB 초과 시 오래된 파일부터 삭제
      +            var totalSize = files.Sum(f => f.Length);
      +            while (totalSize > MaxCacheSizeBytes && files.Count > 0)
      +            {
      +                var oldest = files[0];
      +                totalSize -= oldest.Length;
      +                try { oldest.Delete(); } catch (Exception) { }
      +                files.RemoveAt(0);
      +            }
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"이미지 캐시 정리 실패: {ex.Message}");
      +        }
      +    }
      +
      +    private static BitmapSource CreateThumbnail(BitmapSource src, int maxWidth)
      +    {
      +        if (src.PixelWidth <= maxWidth) return src;
      +        var scale = (double)maxWidth / src.PixelWidth;
      +        return new TransformedBitmap(src, new System.Windows.Media.ScaleTransform(scale, scale));
      +    }
      +
      +    private static string? ImageToBase64(BitmapSource? img)
      +    {
      +        if (img == null) return null;
      +        try
      +        {
      +            var encoder = new PngBitmapEncoder();
      +            encoder.Frames.Add(BitmapFrame.Create(img));
      +            using var ms = new MemoryStream();
      +            encoder.Save(ms);
      +            return Convert.ToBase64String(ms.ToArray());
      +        }
      +        catch (Exception) { return null; }
      +    }
      +
      +    private static BitmapSource? Base64ToImage(string? base64)
      +    {
      +        if (string.IsNullOrEmpty(base64)) return null;
      +        try
      +        {
      +            var bytes = Convert.FromBase64String(base64);
      +            using var ms = new MemoryStream(bytes);
      +            var decoder = BitmapDecoder.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
      +            return decoder.Frames[0];
      +        }
      +        catch (Exception) { return null; }
      +    }
      +
      +    // ─── P/Invoke ──────────────────────────────────────────────────────────
      +
      +    [DllImport("user32.dll", SetLastError = true)]
      +    private static extern bool AddClipboardFormatListener(IntPtr hwnd);
      +
      +    [DllImport("user32.dll", SetLastError = true)]
      +    private static extern bool RemoveClipboardFormatListener(IntPtr hwnd);
      +}
      +
      +/// 클립보드 히스토리 단일 항목. 텍스트 또는 이미지 중 하나를 담습니다.
      +public record ClipboardEntry(string Text, DateTime CopiedAt)
      +{
      +    /// 이미지 항목의 표시용 썸네일 (텍스트 항목은 null)
      +    public BitmapSource? Image { get; init; }
      +
      +    /// 원본 해상도 이미지 파일 경로 (clipboard_images 폴더). null이면 썸네일만 존재.
      +    public string? OriginalImagePath { get; init; }
      +
      +    /// 핀 고정 여부 (핀 항목은 삭제되지 않고 상단에 표시)
      +    public bool IsPinned { get; set; }
      +
      +    /// 카테고리 (URL, 코드, 경로, 일반)
      +    public string Category { get; set; } = "일반";
      +
      +    /// 텍스트 항목 여부
      +    public bool IsText => Image == null;
      +
      +    /// UI 표시용 첫 줄 미리보기 (최대 80자)
      +    public string Preview
      +    {
      +        get
      +        {
      +            if (!IsText) return "[이미지]";
      +            var line = Text.Replace("\r\n", "↵ ").Replace("\n", "↵ ").Replace("\r", "↵ ");
      +            return line.Length > 80 ? line[..77] + "…" : line;
      +        }
      +    }
      +
      +    /// 복사 시각 상대 표시
      +    public string RelativeTime
      +    {
      +        get
      +        {
      +            var diff = DateTime.Now - CopiedAt;
      +            if (diff.TotalSeconds < 60)  return "방금 전";
      +            if (diff.TotalMinutes < 60)  return $"{(int)diff.TotalMinutes}분 전";
      +            if (diff.TotalHours   < 24)  return $"{(int)diff.TotalHours}시간 전";
      +            return CopiedAt.ToString("MM/dd HH:mm");
      +        }
      +    }
      +}
      diff --git a/src/AxCopilot/Services/CodeIndexService.cs b/src/AxCopilot/Services/CodeIndexService.cs
      new file mode 100644
      index 0000000..9743e5e
      --- /dev/null
      +++ b/src/AxCopilot/Services/CodeIndexService.cs
      @@ -0,0 +1,588 @@
      +using System.IO;
      +using System.Text;
      +using System.Text.RegularExpressions;
      +using Microsoft.Data.Sqlite;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 프로젝트 코드베이스 인덱싱 및 시맨틱 검색 서비스.
      +/// TF-IDF 기반 유사도 검색을 SQLite에 영속 저장하여
      +/// 증분 업데이트와 빠른 재시작을 지원합니다.
      +/// (로컬 전용, 외부 서버 불필요)
      +/// 
      +public class CodeIndexService : IDisposable
      +{
      +    private static App? CurrentApp => System.Windows.Application.Current as App;
      +
      +    private SqliteConnection? _db;
      +    private string _workFolder = "";
      +    private bool _indexed;
      +    private int _totalDocs;
      +
      +    public bool IsIndexed => _indexed;
      +    public int ChunkCount => _totalDocs;
      +
      +    // ── 스톱워드 (TF-IDF 정확도 향상) ──────────────────────────────────
      +    private static readonly HashSet StopWords = new(StringComparer.OrdinalIgnoreCase)
      +    {
      +        // 영어 공통
      +        "the", "is", "at", "of", "on", "and", "or", "not", "in", "to", "for",
      +        "it", "be", "as", "do", "by", "this", "that", "with", "from", "but",
      +        "an", "are", "was", "were", "been", "being", "have", "has", "had",
      +        "if", "else", "then", "than", "so", "no", "yes",
      +        // 프로그래밍 공통 (너무 빈번해서 변별력 없음)
      +        "var", "int", "string", "void", "null", "new", "return", "get", "set",
      +        "public", "private", "class", "static", "using", "namespace", "true", "false",
      +        "import", "export", "function", "const", "let", "def", "self",
      +    };
      +
      +    private static readonly HashSet CodeExtensions = new(StringComparer.OrdinalIgnoreCase)
      +    {
      +        ".cs", ".py", ".js", ".ts", ".tsx", ".jsx", ".java", ".cpp", ".c", ".h", ".hpp",
      +        ".go", ".rs", ".rb", ".php", ".swift", ".kt", ".scala",
      +        ".html", ".css", ".scss", ".json", ".xml", ".yaml", ".yml",
      +        ".md", ".txt", ".sql", ".sh", ".bat", ".ps1",
      +        ".csproj", ".sln", ".gradle", ".pom",
      +    };
      +
      +    // ── DB 초기화 ───────────────────────────────────────────────────────
      +
      +    private string GetDbPath(string workFolder)
      +    {
      +        // %APPDATA%\AxCopilot\index\{folderHash}.db
      +        var hash = Convert.ToHexString(
      +            System.Security.Cryptography.SHA256.HashData(
      +                Encoding.UTF8.GetBytes(workFolder.ToLowerInvariant())))[..16];
      +        var dir = Path.Combine(
      +            Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +            "AxCopilot", "index");
      +        Directory.CreateDirectory(dir);
      +        return Path.Combine(dir, $"{hash}.db");
      +    }
      +
      +    private void EnsureDb(string workFolder)
      +    {
      +        if (_db != null && _workFolder == workFolder) return;
      +
      +        _db?.Dispose();
      +        _workFolder = workFolder;
      +        var dbPath = GetDbPath(workFolder);
      +        _db = new SqliteConnection($"Data Source={dbPath}");
      +        _db.Open();
      +
      +        // WAL 모드 (동시 읽기/쓰기 성능)
      +        using (var cmd = _db.CreateCommand())
      +        {
      +            cmd.CommandText = "PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL;";
      +            cmd.ExecuteNonQuery();
      +        }
      +
      +        // 테이블 생성
      +        using var create = _db.CreateCommand();
      +        create.CommandText = """
      +            CREATE TABLE IF NOT EXISTS files (
      +                id INTEGER PRIMARY KEY AUTOINCREMENT,
      +                path TEXT NOT NULL UNIQUE,
      +                last_modified TEXT NOT NULL,
      +                file_size INTEGER NOT NULL
      +            );
      +            CREATE TABLE IF NOT EXISTS chunks (
      +                id INTEGER PRIMARY KEY AUTOINCREMENT,
      +                file_id INTEGER NOT NULL,
      +                start_line INTEGER NOT NULL,
      +                end_line INTEGER NOT NULL,
      +                content TEXT NOT NULL,
      +                FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE
      +            );
      +            CREATE TABLE IF NOT EXISTS tokens (
      +                chunk_id INTEGER NOT NULL,
      +                token TEXT NOT NULL,
      +                tf INTEGER NOT NULL,
      +                FOREIGN KEY (chunk_id) REFERENCES chunks(id) ON DELETE CASCADE
      +            );
      +            CREATE TABLE IF NOT EXISTS doc_freq (
      +                token TEXT PRIMARY KEY,
      +                df INTEGER NOT NULL
      +            );
      +            CREATE TABLE IF NOT EXISTS meta (
      +                key TEXT PRIMARY KEY,
      +                value TEXT NOT NULL
      +            );
      +            CREATE INDEX IF NOT EXISTS idx_tokens_chunk ON tokens(chunk_id);
      +            CREATE INDEX IF NOT EXISTS idx_tokens_token ON tokens(token);
      +            CREATE INDEX IF NOT EXISTS idx_chunks_file ON chunks(file_id);
      +        """;
      +        create.ExecuteNonQuery();
      +    }
      +
      +    // ── 인덱싱 ──────────────────────────────────────────────────────────
      +
      +    /// 작업 폴더의 코드 파일을 인덱싱합니다. 증분 업데이트 지원.
      +    public async Task IndexAsync(string workFolder, CancellationToken ct = default)
      +    {
      +        if (string.IsNullOrEmpty(workFolder) || !Directory.Exists(workFolder))
      +            return;
      +
      +        EnsureDb(workFolder);
      +
      +        await Task.Run(() =>
      +        {
      +            var existingFiles = LoadExistingFiles();
      +            // 설정에서 최대 파일 크기 조회
      +            var maxFileKb = 500;
      +            try
      +            {
      +                var cfgMax = CurrentApp?.SettingsService?.Settings.Llm.Code.CodeIndexMaxFileKb ?? 500;
      +                if (cfgMax > 0) maxFileKb = cfgMax;
      +            }
      +            catch (Exception) { }
      +
      +            var currentFiles = ScanFiles(workFolder, maxFileKb);
      +
      +            int added = 0, updated = 0, removed = 0;
      +
      +            // 삭제된 파일 제거
      +            foreach (var (path, fileId) in existingFiles)
      +            {
      +                if (!currentFiles.ContainsKey(path))
      +                {
      +                    RemoveFileFromIndex(fileId);
      +                    removed++;
      +                }
      +            }
      +
      +            // 신규/변경 파일 인덱싱
      +            foreach (var (relPath, info) in currentFiles)
      +            {
      +                if (ct.IsCancellationRequested) break;
      +
      +                var lastMod = info.LastWriteTimeUtc.ToString("O");
      +                var size = info.Length;
      +
      +                if (existingFiles.TryGetValue(relPath, out var fileId))
      +                {
      +                    // 기존 파일 — 변경 여부 확인
      +                    if (!IsFileChanged(fileId, lastMod, size))
      +                        continue;
      +
      +                    RemoveFileFromIndex(fileId);
      +                    updated++;
      +                }
      +                else
      +                {
      +                    added++;
      +                }
      +
      +                IndexFile(workFolder, relPath, lastMod, size);
      +            }
      +
      +            // DF 테이블 재계산
      +            RebuildDocFreq();
      +
      +            // 총 청크 수 캐시
      +            _totalDocs = GetTotalChunkCount();
      +            _indexed = _totalDocs > 0;
      +
      +            // 메타 저장
      +            SaveMeta("lastIndexed", DateTime.UtcNow.ToString("O"));
      +            SaveMeta("workFolder", workFolder);
      +
      +            LogService.Info($"코드 인덱싱 완료: {_totalDocs}개 청크 (추가:{added} 갱신:{updated} 삭제:{removed}) [{workFolder}]");
      +        }, ct);
      +    }
      +
      +    private Dictionary LoadExistingFiles()
      +    {
      +        var dict = new Dictionary(StringComparer.OrdinalIgnoreCase);
      +        using var cmd = _db!.CreateCommand();
      +        cmd.CommandText = "SELECT id, path FROM files";
      +        using var reader = cmd.ExecuteReader();
      +        while (reader.Read())
      +            dict[reader.GetString(1)] = reader.GetInt32(0);
      +        return dict;
      +    }
      +
      +    private Dictionary ScanFiles(string workFolder, int maxFileKb = 500)
      +    {
      +        var dict = new Dictionary(StringComparer.OrdinalIgnoreCase);
      +        var maxBytes = (long)maxFileKb * 1024;
      +        try
      +        {
      +            var files = Directory.EnumerateFiles(workFolder, "*.*", new EnumerationOptions
      +            {
      +                RecurseSubdirectories = true,
      +                IgnoreInaccessible = true,
      +                MaxRecursionDepth = 8,
      +            });
      +
      +            foreach (var file in files)
      +            {
      +                var ext = Path.GetExtension(file);
      +                if (!CodeExtensions.Contains(ext)) continue;
      +
      +                try
      +                {
      +                    var info = new FileInfo(file);
      +                    if (info.Length > maxBytes) continue;
      +                    var relPath = Path.GetRelativePath(workFolder, file);
      +                    dict[relPath] = info;
      +                }
      +                catch (Exception) { }
      +            }
      +        }
      +        catch (Exception) { }
      +        return dict;
      +    }
      +
      +    private bool IsFileChanged(int fileId, string lastMod, long size)
      +    {
      +        using var cmd = _db!.CreateCommand();
      +        cmd.CommandText = "SELECT last_modified, file_size FROM files WHERE id = @id";
      +        cmd.Parameters.AddWithValue("@id", fileId);
      +        using var reader = cmd.ExecuteReader();
      +        if (!reader.Read()) return true;
      +        return reader.GetString(0) != lastMod || reader.GetInt64(1) != size;
      +    }
      +
      +    private void RemoveFileFromIndex(int fileId)
      +    {
      +        // 청크 ID 목록
      +        var chunkIds = new List();
      +        using (var cmd = _db!.CreateCommand())
      +        {
      +            cmd.CommandText = "SELECT id FROM chunks WHERE file_id = @fid";
      +            cmd.Parameters.AddWithValue("@fid", fileId);
      +            using var reader = cmd.ExecuteReader();
      +            while (reader.Read()) chunkIds.Add(reader.GetInt32(0));
      +        }
      +
      +        // 토큰 삭제
      +        foreach (var cid in chunkIds)
      +        {
      +            using var cmd = _db!.CreateCommand();
      +            cmd.CommandText = "DELETE FROM tokens WHERE chunk_id = @cid";
      +            cmd.Parameters.AddWithValue("@cid", cid);
      +            cmd.ExecuteNonQuery();
      +        }
      +
      +        // 청크 삭제
      +        using (var cmd = _db!.CreateCommand())
      +        {
      +            cmd.CommandText = "DELETE FROM chunks WHERE file_id = @fid";
      +            cmd.Parameters.AddWithValue("@fid", fileId);
      +            cmd.ExecuteNonQuery();
      +        }
      +
      +        // 파일 삭제
      +        using (var cmd = _db!.CreateCommand())
      +        {
      +            cmd.CommandText = "DELETE FROM files WHERE id = @fid";
      +            cmd.Parameters.AddWithValue("@fid", fileId);
      +            cmd.ExecuteNonQuery();
      +        }
      +    }
      +
      +    private void IndexFile(string workFolder, string relPath, string lastMod, long size)
      +    {
      +        try
      +        {
      +            var fullPath = Path.Combine(workFolder, relPath);
      +            var content = File.ReadAllText(fullPath, Encoding.UTF8);
      +
      +            // 파일 등록
      +            int fileId;
      +            using (var cmd = _db!.CreateCommand())
      +            {
      +                cmd.CommandText = "INSERT INTO files (path, last_modified, file_size) VALUES (@p, @m, @s) RETURNING id";
      +                cmd.Parameters.AddWithValue("@p", relPath);
      +                cmd.Parameters.AddWithValue("@m", lastMod);
      +                cmd.Parameters.AddWithValue("@s", size);
      +                fileId = Convert.ToInt32(cmd.ExecuteScalar());
      +            }
      +
      +            // 청크 분할 (50라인씩)
      +            var lines = content.Split('\n');
      +            using var tx = _db!.BeginTransaction();
      +
      +            for (int i = 0; i < lines.Length; i += 50)
      +            {
      +                var chunkLines = lines.AsSpan(i, Math.Min(50, lines.Length - i));
      +                var chunkText = string.Join("\n", chunkLines.ToArray());
      +                if (string.IsNullOrWhiteSpace(chunkText)) continue;
      +
      +                var endLine = Math.Min(i + 50, lines.Length);
      +
      +                // 청크 저장
      +                int chunkId;
      +                using (var cmd = _db!.CreateCommand())
      +                {
      +                    cmd.Transaction = tx;
      +                    cmd.CommandText = "INSERT INTO chunks (file_id, start_line, end_line, content) VALUES (@f, @s, @e, @c) RETURNING id";
      +                    cmd.Parameters.AddWithValue("@f", fileId);
      +                    cmd.Parameters.AddWithValue("@s", i + 1);
      +                    cmd.Parameters.AddWithValue("@e", endLine);
      +                    cmd.Parameters.AddWithValue("@c", chunkText);
      +                    chunkId = Convert.ToInt32(cmd.ExecuteScalar());
      +                }
      +
      +                // 토큰 저장
      +                var tokens = Tokenize(chunkText);
      +                foreach (var (token, tf) in tokens)
      +                {
      +                    using var cmd = _db!.CreateCommand();
      +                    cmd.Transaction = tx;
      +                    cmd.CommandText = "INSERT INTO tokens (chunk_id, token, tf) VALUES (@cid, @t, @tf)";
      +                    cmd.Parameters.AddWithValue("@cid", chunkId);
      +                    cmd.Parameters.AddWithValue("@t", token);
      +                    cmd.Parameters.AddWithValue("@tf", tf);
      +                    cmd.ExecuteNonQuery();
      +                }
      +            }
      +
      +            tx.Commit();
      +        }
      +        catch (Exception) { /* 읽기 실패 파일 건너뛰기 */ }
      +    }
      +
      +    private void RebuildDocFreq()
      +    {
      +        using var cmd = _db!.CreateCommand();
      +        cmd.CommandText = """
      +            DELETE FROM doc_freq;
      +            INSERT INTO doc_freq (token, df)
      +            SELECT token, COUNT(DISTINCT chunk_id) FROM tokens GROUP BY token;
      +        """;
      +        cmd.ExecuteNonQuery();
      +    }
      +
      +    private int GetTotalChunkCount()
      +    {
      +        using var cmd = _db!.CreateCommand();
      +        cmd.CommandText = "SELECT COUNT(*) FROM chunks";
      +        return Convert.ToInt32(cmd.ExecuteScalar());
      +    }
      +
      +    private void SaveMeta(string key, string value)
      +    {
      +        using var cmd = _db!.CreateCommand();
      +        cmd.CommandText = "INSERT OR REPLACE INTO meta (key, value) VALUES (@k, @v)";
      +        cmd.Parameters.AddWithValue("@k", key);
      +        cmd.Parameters.AddWithValue("@v", value);
      +        cmd.ExecuteNonQuery();
      +    }
      +
      +    // ── 검색 ────────────────────────────────────────────────────────────
      +
      +    /// 시맨틱 검색: 질문과 가장 관련 있는 코드 청크를 반환합니다.
      +    public List Search(string query, int maxResults = 5)
      +    {
      +        if (!_indexed || _db == null || _totalDocs == 0)
      +            return new();
      +
      +        var queryTokens = Tokenize(query);
      +        if (queryTokens.Count == 0) return new();
      +
      +        // 쿼리 토큰의 DF 조회
      +        var dfMap = new Dictionary();
      +        foreach (var token in queryTokens.Keys)
      +        {
      +            using var cmd = _db.CreateCommand();
      +            cmd.CommandText = "SELECT df FROM doc_freq WHERE token = @t";
      +            cmd.Parameters.AddWithValue("@t", token);
      +            var result = cmd.ExecuteScalar();
      +            if (result != null) dfMap[token] = Convert.ToInt32(result);
      +        }
      +
      +        // 후보 청크 검색: 쿼리 토큰이 하나라도 포함된 청크만
      +        var candidateChunks = new HashSet();
      +        foreach (var token in queryTokens.Keys)
      +        {
      +            using var cmd = _db.CreateCommand();
      +            cmd.CommandText = "SELECT DISTINCT chunk_id FROM tokens WHERE token = @t";
      +            cmd.Parameters.AddWithValue("@t", token);
      +            using var reader = cmd.ExecuteReader();
      +            while (reader.Read()) candidateChunks.Add(reader.GetInt32(0));
      +        }
      +
      +        if (candidateChunks.Count == 0) return new();
      +
      +        // 각 후보 청크의 TF-IDF 유사도 계산
      +        var scored = new List<(int ChunkId, double Score)>();
      +
      +        foreach (var chunkId in candidateChunks)
      +        {
      +            // 청크의 토큰 TF 로드
      +            var docTf = new Dictionary(StringComparer.OrdinalIgnoreCase);
      +            using (var cmd = _db.CreateCommand())
      +            {
      +                cmd.CommandText = "SELECT token, tf FROM tokens WHERE chunk_id = @cid";
      +                cmd.Parameters.AddWithValue("@cid", chunkId);
      +                using var reader = cmd.ExecuteReader();
      +                while (reader.Read())
      +                    docTf[reader.GetString(0)] = reader.GetInt32(1);
      +            }
      +
      +            var score = ComputeTfIdfSimilarity(queryTokens, docTf, dfMap);
      +            if (score > 0.01)
      +                scored.Add((chunkId, score));
      +        }
      +
      +        // 상위 결과 추출
      +        var topChunks = scored
      +            .OrderByDescending(s => s.Score)
      +            .Take(maxResults)
      +            .ToList();
      +
      +        var results = new List();
      +        foreach (var (chunkId, score) in topChunks)
      +        {
      +            using var cmd = _db.CreateCommand();
      +            cmd.CommandText = """
      +                SELECT f.path, c.start_line, c.end_line, c.content
      +                FROM chunks c JOIN files f ON c.file_id = f.id
      +                WHERE c.id = @cid
      +            """;
      +            cmd.Parameters.AddWithValue("@cid", chunkId);
      +            using var reader = cmd.ExecuteReader();
      +            if (reader.Read())
      +            {
      +                results.Add(new SearchResult
      +                {
      +                    FilePath = reader.GetString(0),
      +                    StartLine = reader.GetInt32(1),
      +                    EndLine = reader.GetInt32(2),
      +                    Score = score,
      +                    Preview = reader.GetString(3) is { Length: > 200 } s ? s[..200] + "..." : reader.GetString(3),
      +                });
      +            }
      +        }
      +
      +        return results;
      +    }
      +
      +    /// 기존 인덱스가 있으면 로드합니다 (앱 재시작 시).
      +    public void TryLoadExisting(string workFolder)
      +    {
      +        if (string.IsNullOrEmpty(workFolder) || !Directory.Exists(workFolder)) return;
      +
      +        var dbPath = GetDbPath(workFolder);
      +        if (!File.Exists(dbPath)) return;
      +
      +        EnsureDb(workFolder);
      +        _totalDocs = GetTotalChunkCount();
      +        _indexed = _totalDocs > 0;
      +
      +        if (_indexed)
      +            LogService.Info($"기존 코드 인덱스 로드: {_totalDocs}개 청크 [{workFolder}]");
      +    }
      +
      +    // ── TF-IDF 계산 ─────────────────────────────────────────────────────
      +
      +    private double ComputeTfIdfSimilarity(
      +        Dictionary queryTf,
      +        Dictionary docTf,
      +        Dictionary dfMap)
      +    {
      +        double dotProduct = 0, queryNorm = 0, docNorm = 0;
      +
      +        foreach (var (token, qtf) in queryTf)
      +        {
      +            var df = dfMap.GetValueOrDefault(token, 0);
      +            var idf = Math.Log(1.0 + _totalDocs / (1.0 + df));
      +            var qWeight = qtf * idf;
      +            queryNorm += qWeight * qWeight;
      +
      +            if (docTf.TryGetValue(token, out var dtf))
      +            {
      +                var dWeight = dtf * idf;
      +                dotProduct += qWeight * dWeight;
      +            }
      +        }
      +
      +        foreach (var (token, dtf) in docTf)
      +        {
      +            var df = dfMap.GetValueOrDefault(token, 0);
      +            var idf = Math.Log(1.0 + _totalDocs / (1.0 + df));
      +            var dWeight = dtf * idf;
      +            docNorm += dWeight * dWeight;
      +        }
      +
      +        if (queryNorm == 0 || docNorm == 0) return 0;
      +        return dotProduct / (Math.Sqrt(queryNorm) * Math.Sqrt(docNorm));
      +    }
      +
      +    // ── 토큰화 ──────────────────────────────────────────────────────────
      +
      +    /// 텍스트를 토큰으로 분할하고 빈도를 계산합니다. 스톱워드 제거 포함.
      +    private static Dictionary Tokenize(string text)
      +    {
      +        var tf = new Dictionary(StringComparer.OrdinalIgnoreCase);
      +        var words = Regex.Split(text, @"[^a-zA-Z0-9가-힣_]+")
      +            .SelectMany(SplitCamelCase)
      +            .Where(w => w.Length >= 2 && !StopWords.Contains(w));
      +
      +        foreach (var word in words)
      +        {
      +            var lower = word.ToLowerInvariant();
      +            tf.TryGetValue(lower, out var count);
      +            tf[lower] = count + 1;
      +        }
      +
      +        // 바이그램 추가 (구문 검색 품질 향상)
      +        var wordList = words.Select(w => w.ToLowerInvariant()).ToList();
      +        for (int i = 0; i < wordList.Count - 1; i++)
      +        {
      +            var bigram = $"{wordList[i]}_{wordList[i + 1]}";
      +            tf.TryGetValue(bigram, out var bc);
      +            tf[bigram] = bc + 1;
      +        }
      +
      +        return tf;
      +    }
      +
      +    private static IEnumerable SplitCamelCase(string word)
      +    {
      +        if (string.IsNullOrEmpty(word)) yield break;
      +        var sb = new StringBuilder();
      +        foreach (var ch in word)
      +        {
      +            if (char.IsUpper(ch) && sb.Length > 0)
      +            {
      +                yield return sb.ToString();
      +                sb.Clear();
      +            }
      +            sb.Append(ch);
      +        }
      +        if (sb.Length > 0) yield return sb.ToString();
      +    }
      +
      +    // ── Dispose ─────────────────────────────────────────────────────────
      +
      +    public void Dispose()
      +    {
      +        _db?.Dispose();
      +        _db = null;
      +    }
      +}
      +
      +/// 인덱싱된 코드 청크.
      +public class CodeChunk
      +{
      +    public string FilePath { get; init; } = "";
      +    public int StartLine { get; init; }
      +    public int EndLine { get; init; }
      +    public string Content { get; init; } = "";
      +    public Dictionary Tokens { get; init; } = new();
      +}
      +
      +/// 검색 결과.
      +public class SearchResult
      +{
      +    public string FilePath { get; init; } = "";
      +    public int StartLine { get; init; }
      +    public int EndLine { get; init; }
      +    public double Score { get; init; }
      +    public string Preview { get; init; } = "";
      +    public override string ToString() => $"{FilePath}:{StartLine}-{EndLine} (score: {Score:F3})";
      +}
      diff --git a/src/AxCopilot/Services/ContentExtractor.cs b/src/AxCopilot/Services/ContentExtractor.cs
      new file mode 100644
      index 0000000..feeb791
      --- /dev/null
      +++ b/src/AxCopilot/Services/ContentExtractor.cs
      @@ -0,0 +1,68 @@
      +using System.Net.Http;
      +using System.Text.RegularExpressions;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// Phase L3-2: 웹 페이지 콘텐츠 추출기.
      +/// HTML을 가져와 태그를 제거하고 핵심 본문 텍스트를 반환합니다.
      +/// 사내 모드에서는 사용 불가 (외부 HTTP 차단).
      +/// 
      +public static class ContentExtractor
      +{
      +    private static readonly HttpClient _client = new()
      +    {
      +        Timeout = TimeSpan.FromSeconds(10),
      +        DefaultRequestHeaders = { { "User-Agent", "Mozilla/5.0 (compatible; AXCopilot/1.0)" } }
      +    };
      +
      +    // 제거 대상 태그 (script, style, nav, header, footer, aside)
      +    private static readonly Regex ScriptStyle = new(
      +        @"<(script|style|nav|header|footer|aside|noscript)[^>]*>[\s\S]*?",
      +        RegexOptions.IgnoreCase | RegexOptions.Compiled);
      +
      +    private static readonly Regex HtmlTags = new(@"<[^>]+>", RegexOptions.Compiled);
      +    private static readonly Regex MultiWhitespace = new(@"\s{2,}", RegexOptions.Compiled);
      +    private static readonly Regex HtmlEntities = new(@"&(?:amp|lt|gt|quot|nbsp|#\d+);", RegexOptions.Compiled);
      +
      +    /// URL에서 웹 페이지를 가져와 정제된 텍스트를 반환합니다.
      +    public static async Task ExtractAsync(string url, int maxChars = 3000, CancellationToken ct = default)
      +    {
      +        try
      +        {
      +            var html = await _client.GetStringAsync(url, ct);
      +            return ExtractTextFromHtml(html, maxChars);
      +        }
      +        catch (Exception ex)
      +        {
      +            return $"[콘텐츠 추출 실패: {ex.Message}]";
      +        }
      +    }
      +
      +    /// HTML 문자열에서 텍스트를 추출합니다.
      +    public static string ExtractTextFromHtml(string html, int maxChars = 3000)
      +    {
      +        // script/style/nav 제거
      +        var text = ScriptStyle.Replace(html, " ");
      +
      +        // HTML 태그 제거
      +        text = HtmlTags.Replace(text, " ");
      +
      +        // HTML 엔터티 변환
      +        text = HtmlEntities.Replace(text, m => m.Value switch
      +        {
      +            "&"  => "&",
      +            "<"   => "<",
      +            ">"   => ">",
      +            """ => "\"",
      +            " " => " ",
      +            _        => " "
      +        });
      +
      +        // 연속 공백 정리
      +        text = MultiWhitespace.Replace(text, " ").Trim();
      +
      +        // 최대 길이 제한
      +        return text.Length > maxChars ? text[..maxChars] + "…" : text;
      +    }
      +}
      diff --git a/src/AxCopilot/Services/Cp4dTokenService.cs b/src/AxCopilot/Services/Cp4dTokenService.cs
      new file mode 100644
      index 0000000..a426048
      --- /dev/null
      +++ b/src/AxCopilot/Services/Cp4dTokenService.cs
      @@ -0,0 +1,116 @@
      +using System.Net.Http;
      +using System.Net.Http.Json;
      +using System.Text.Json;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// IBM Cloud Pak for Data (CP4D) 토큰 발급 및 캐싱 서비스.
      +/// CP4D의 /icp4d-api/v1/authorize 엔드포인트에서 Bearer 토큰을 발급받고,
      +/// 만료 전까지 캐싱하여 재사용합니다.
      +/// 
      +internal sealed class Cp4dTokenService
      +{
      +    private static readonly HttpClient _http = new()
      +    {
      +        Timeout = TimeSpan.FromSeconds(15)
      +    };
      +
      +    // 캐시: (cp4dUrl + username) → (token, expiry)
      +    private static readonly Dictionary _cache = new();
      +    private static readonly object _lock = new();
      +
      +    /// 
      +    /// CP4D 토큰을 발급받거나 캐시에서 반환합니다.
      +    /// 
      +    /// CP4D 서버 URL (예: https://cpd-host.example.com)
      +    /// CP4D 사용자 이름
      +    /// CP4D 비밀번호 또는 API 키
      +    /// 취소 토큰
      +    /// Bearer 토큰 문자열. 실패 시 null.
      +    public static async Task GetTokenAsync(string cp4dUrl, string username, string password, CancellationToken ct = default)
      +    {
      +        if (string.IsNullOrWhiteSpace(cp4dUrl) || string.IsNullOrWhiteSpace(username))
      +            return null;
      +
      +        var cacheKey = $"{cp4dUrl}|{username}";
      +
      +        // 캐시 확인 — 만료 1분 전까지 유효
      +        lock (_lock)
      +        {
      +            if (_cache.TryGetValue(cacheKey, out var cached) && cached.Expiry > DateTime.UtcNow.AddMinutes(1))
      +                return cached.Token;
      +        }
      +
      +        // 토큰 발급
      +        try
      +        {
      +            var tokenUrl = cp4dUrl.TrimEnd('/') + "/icp4d-api/v1/authorize";
      +            var body = new { username, password };
      +
      +            using var req = new HttpRequestMessage(HttpMethod.Post, tokenUrl)
      +            {
      +                Content = JsonContent.Create(body)
      +            };
      +
      +            // CP4D는 자체 서명 인증서를 사용할 수 있으므로 TLS 오류 무시 옵션 (사내 환경)
      +            using var resp = await _http.SendAsync(req, ct);
      +
      +            if (!resp.IsSuccessStatusCode)
      +            {
      +                var errBody = await resp.Content.ReadAsStringAsync(ct);
      +                LogService.Warn($"CP4D 토큰 발급 실패: {resp.StatusCode} - {errBody}");
      +                return null;
      +            }
      +
      +            var json = await resp.Content.ReadAsStringAsync(ct);
      +            using var doc = JsonDocument.Parse(json);
      +
      +            // CP4D 응답 형식: {"token": "...", "_messageCode_": "...", "message": "..."}
      +            if (!doc.RootElement.TryGetProperty("token", out var tokenProp))
      +            {
      +                LogService.Warn("CP4D 응답에 token 필드가 없습니다.");
      +                return null;
      +            }
      +
      +            var token = tokenProp.GetString();
      +            if (string.IsNullOrEmpty(token)) return null;
      +
      +            // 토큰 만료 시간 — CP4D 기본 12시간, 안전하게 11시간으로 설정
      +            var expiry = DateTime.UtcNow.AddHours(11);
      +
      +            // _messageCode_에서 만료 정보가 있으면 파싱 시도
      +            if (doc.RootElement.TryGetProperty("accessTokenExpiry", out var expiryProp) &&
      +                expiryProp.TryGetInt64(out var expiryMs))
      +            {
      +                expiry = DateTimeOffset.FromUnixTimeMilliseconds(expiryMs).UtcDateTime;
      +            }
      +
      +            lock (_lock)
      +            {
      +                _cache[cacheKey] = (token, expiry);
      +            }
      +
      +            LogService.Info($"CP4D 토큰 발급 완료: {cp4dUrl} (만료: {expiry:yyyy-MM-dd HH:mm} UTC)");
      +            return token;
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Error($"CP4D 토큰 발급 오류: {ex.Message}");
      +            return null;
      +        }
      +    }
      +
      +    /// 특정 CP4D 서버의 캐시된 토큰을 무효화합니다.
      +    public static void InvalidateToken(string cp4dUrl, string username)
      +    {
      +        var cacheKey = $"{cp4dUrl}|{username}";
      +        lock (_lock) { _cache.Remove(cacheKey); }
      +    }
      +
      +    /// 모든 캐시된 토큰을 초기화합니다.
      +    public static void ClearAllTokens()
      +    {
      +        lock (_lock) { _cache.Clear(); }
      +    }
      +}
      diff --git a/src/AxCopilot/Services/CryptoService.cs b/src/AxCopilot/Services/CryptoService.cs
      new file mode 100644
      index 0000000..f6c94c5
      --- /dev/null
      +++ b/src/AxCopilot/Services/CryptoService.cs
      @@ -0,0 +1,212 @@
      +using System.IO;
      +using System.Security.Cryptography;
      +using System.Text;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// AX Copilot 암호화 서비스.
      +///
      +/// 두 가지 암호화 계층을 제공합니다:
      +///
      +/// 1. **앱 공용 키 (Portable)** — 설정값(API 키 등) 암호화
      +///    - 앱 내장 고정 키 + AES-256-CBC
      +///    - 관리자 PC에서 암호화한 값이 모든 PC에서 동일하게 복호화됨
      +///    - AxKeyEncryptor 도구에서도 동일 키 사용
      +///
      +/// 2. **PC별 개인 키 (Local)** — 대화 내역 파일 암호화
      +///    - DPAPI로 보호되는 PC/사용자별 랜덤 마스터 키 + AES-256-GCM
      +///    - 해당 PC/사용자 계정에서만 복호화 가능
      +///    - 대화 파일(.axchat)은 다른 PC로 복사해도 열리지 않음
      +/// 
      +public static class CryptoService
      +{
      +    // ═══════════════════════════════════════════════════════════════════════
      +    // 1. 앱 공용 키 — 설정값 암호화 (Portable, 모든 PC에서 동일)
      +    // ═══════════════════════════════════════════════════════════════════════
      +
      +    // 앱 고유 시드. 이 값에서 PBKDF2로 256-bit 키를 파생합니다.
      +    // ※ 바이너리에 포함되므로 완벽한 보안은 아니지만, 평문 노출을 방지합니다.
      +    private static readonly byte[] AppSeed =
      +    {
      +        // "AX-Commander-Key-0104-sj.baeck" + 2-byte pad
      +        0x41, 0x58, 0x2D, 0x43, 0x6F, 0x6D, 0x6D, 0x61,
      +        0x6E, 0x64, 0x65, 0x72, 0x2D, 0x4B, 0x65, 0x79,
      +        0x2D, 0x30, 0x31, 0x30, 0x34, 0x2D, 0x73, 0x6A,
      +        0x2E, 0x62, 0x61, 0x65, 0x63, 0x6B, 0xA7, 0x5C
      +    };
      +
      +    private static readonly byte[] AppSalt =
      +    {
      +        0x58, 0x43, 0x4D, 0x44, 0x53, 0x61, 0x6C, 0x74,  // "XCMDSalt"
      +        0x9E, 0x27, 0xC1, 0x4A, 0xB3, 0x06, 0x7F, 0xD8   // random
      +    };
      +
      +    private static byte[]? _appKey;
      +
      +    /// 앱 공용 AES-256 키를 PBKDF2로 파생합니다.
      +    private static byte[] GetAppKey()
      +    {
      +        if (_appKey != null) return _appKey;
      +        using var pbkdf2 = new Rfc2898DeriveBytes(AppSeed, AppSalt, 100_000, HashAlgorithmName.SHA256);
      +        _appKey = pbkdf2.GetBytes(32); // 256-bit
      +        return _appKey;
      +    }
      +
      +    /// 
      +    /// 평문 문자열을 앱 공용 키로 AES-256-CBC 암호화하여 Base64 반환.
      +    /// 관리자 PC에서 암호화한 값이 모든 사용자 PC에서 동일하게 복호화됩니다.
      +    /// 
      +    public static string PortableEncrypt(string plainText)
      +    {
      +        if (string.IsNullOrEmpty(plainText)) return "";
      +        var key = GetAppKey();
      +        using var aes = Aes.Create();
      +        aes.Key = key;
      +        aes.Mode = CipherMode.CBC;
      +        aes.Padding = PaddingMode.PKCS7;
      +        aes.GenerateIV();
      +
      +        using var enc = aes.CreateEncryptor();
      +        var plainBytes = Encoding.UTF8.GetBytes(plainText);
      +        var cipher = enc.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
      +
      +        // [IV(16)] [ciphertext]
      +        var result = new byte[16 + cipher.Length];
      +        Buffer.BlockCopy(aes.IV, 0, result, 0, 16);
      +        Buffer.BlockCopy(cipher, 0, result, 16, cipher.Length);
      +        return Convert.ToBase64String(result);
      +    }
      +
      +    /// 
      +    /// 앱 공용 키로 AES-256-CBC 복호화. PortableEncrypt의 역.
      +    /// 
      +    public static string PortableDecrypt(string base64)
      +    {
      +        if (string.IsNullOrEmpty(base64)) return "";
      +        try
      +        {
      +            var raw = Convert.FromBase64String(base64);
      +            if (raw.Length < 17) return ""; // IV(16) + 최소 1블록
      +
      +            var key = GetAppKey();
      +            var iv = new byte[16];
      +            Buffer.BlockCopy(raw, 0, iv, 0, 16);
      +            var cipher = new byte[raw.Length - 16];
      +            Buffer.BlockCopy(raw, 16, cipher, 0, cipher.Length);
      +
      +            using var aes = Aes.Create();
      +            aes.Key = key;
      +            aes.IV = iv;
      +            aes.Mode = CipherMode.CBC;
      +            aes.Padding = PaddingMode.PKCS7;
      +
      +            using var dec = aes.CreateDecryptor();
      +            var plain = dec.TransformFinalBlock(cipher, 0, cipher.Length);
      +            return Encoding.UTF8.GetString(plain);
      +        }
      +        catch (Exception) { return ""; }
      +    }
      +
      +    // ═══════════════════════════════════════════════════════════════════════
      +    // 1-B. 암호화 모드 분기 — encryptionEnabled에 따라 암호화 또는 패스스루
      +    // ═══════════════════════════════════════════════════════════════════════
      +
      +    /// 
      +    /// encryptionEnabled=true이면 PortableEncrypt, false이면 평문 그대로 반환.
      +    /// 운영 배포 시 true로 전환하면 자동으로 암호화가 적용됩니다.
      +    /// 
      +    public static string EncryptIfEnabled(string plainText, bool encryptionEnabled)
      +        => encryptionEnabled ? PortableEncrypt(plainText) : plainText;
      +
      +    /// 
      +    /// encryptionEnabled=true이면 PortableDecrypt, false이면 평문 그대로 반환.
      +    /// 하위 호환: 암호화된 값이 들어와도 복호화 시도 후 실패하면 평문으로 간주.
      +    /// 
      +    public static string DecryptIfEnabled(string value, bool encryptionEnabled)
      +    {
      +        if (string.IsNullOrEmpty(value)) return "";
      +        if (!encryptionEnabled) return value;
      +        // 암호화 모드: 복호화 시도, 실패하면 평문으로 간주 (마이그레이션 호환)
      +        var result = PortableDecrypt(value);
      +        return string.IsNullOrEmpty(result) ? value : result;
      +    }
      +
      +    // ═══════════════════════════════════════════════════════════════════════
      +    // 2. PC별 개인 키 — 대화 내역 파일 암호화 (Local, PC 종속)
      +    // ═══════════════════════════════════════════════════════════════════════
      +
      +    private static byte[] GetOrCreateMasterKey()
      +    {
      +        var dir  = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "AxCopilot");
      +        var path = Path.Combine(dir, ".master_key");
      +
      +        if (File.Exists(path))
      +        {
      +            var dpapi = File.ReadAllBytes(path);
      +            return ProtectedData.Unprotect(dpapi, null, DataProtectionScope.CurrentUser);
      +        }
      +
      +        // 최초 생성: 256-bit 랜덤 키 → DPAPI 보호 후 저장
      +        var key = RandomNumberGenerator.GetBytes(32);
      +        Directory.CreateDirectory(dir);
      +        File.WriteAllBytes(path, ProtectedData.Protect(key, null, DataProtectionScope.CurrentUser));
      +        return key;
      +    }
      +
      +    /// 바이트 배열을 PC별 마스터 키로 AES-256-GCM 암호화
      +    public static byte[] EncryptBytes(byte[] plainBytes)
      +    {
      +        var key   = GetOrCreateMasterKey();
      +        var nonce = RandomNumberGenerator.GetBytes(12);  // 96-bit nonce
      +        var tag   = new byte[16];                         // 128-bit tag
      +        var cipher = new byte[plainBytes.Length];
      +
      +        using var aes = new AesGcm(key, 16);
      +        aes.Encrypt(nonce, plainBytes, cipher, tag);
      +
      +        // [nonce(12)] [tag(16)] [ciphertext]
      +        var result = new byte[12 + 16 + cipher.Length];
      +        Buffer.BlockCopy(nonce, 0, result, 0, 12);
      +        Buffer.BlockCopy(tag, 0, result, 12, 16);
      +        Buffer.BlockCopy(cipher, 0, result, 28, cipher.Length);
      +        return result;
      +    }
      +
      +    /// PC별 마스터 키로 AES-256-GCM 복호화
      +    public static byte[] DecryptBytes(byte[] encrypted)
      +    {
      +        if (encrypted.Length < 28) throw new CryptographicException("Invalid encrypted data");
      +
      +        var key   = GetOrCreateMasterKey();
      +        var nonce  = new byte[12];
      +        var tag    = new byte[16];
      +        var cipher = new byte[encrypted.Length - 28];
      +
      +        Buffer.BlockCopy(encrypted, 0, nonce, 0, 12);
      +        Buffer.BlockCopy(encrypted, 12, tag, 0, 16);
      +        Buffer.BlockCopy(encrypted, 28, cipher, 0, cipher.Length);
      +
      +        var plain = new byte[cipher.Length];
      +        using var aes = new AesGcm(key, 16);
      +        aes.Decrypt(nonce, cipher, tag, plain);
      +        return plain;
      +    }
      +
      +    /// 문자열을 PC별 키로 AES-256-GCM 암호화하여 파일에 저장
      +    public static void EncryptToFile(string filePath, string content)
      +    {
      +        var plain = Encoding.UTF8.GetBytes(content);
      +        var enc   = EncryptBytes(plain);
      +        File.WriteAllBytes(filePath, enc);
      +    }
      +
      +    /// PC별 키로 AES-256-GCM 암호화 파일을 복호화
      +    public static string DecryptFromFile(string filePath)
      +    {
      +        if (!File.Exists(filePath)) return "";
      +        var enc   = File.ReadAllBytes(filePath);
      +        var plain = DecryptBytes(enc);
      +        return Encoding.UTF8.GetString(plain);
      +    }
      +}
      diff --git a/src/AxCopilot/Services/DiffService.cs b/src/AxCopilot/Services/DiffService.cs
      new file mode 100644
      index 0000000..d5e256f
      --- /dev/null
      +++ b/src/AxCopilot/Services/DiffService.cs
      @@ -0,0 +1,99 @@
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 라인 기반 텍스트 diff 서비스. 두 텍스트의 변경 사항을 비교합니다.
      +/// 
      +public static class DiffService
      +{
      +    public enum DiffType { Equal, Added, Removed }
      +
      +    public record DiffLine(DiffType Type, int? OldLineNo, int? NewLineNo, string Content);
      +
      +    /// 두 텍스트를 라인 단위로 비교하여 diff 결과를 반환합니다.
      +    public static List ComputeDiff(string oldText, string newText)
      +    {
      +        var oldLines = (oldText ?? "").Split('\n');
      +        var newLines = (newText ?? "").Split('\n');
      +        var result = new List();
      +
      +        // LCS (Longest Common Subsequence) 기반 간단 diff
      +        var lcs = ComputeLcs(oldLines, newLines);
      +        int oi = 0, ni = 0, li = 0;
      +
      +        while (oi < oldLines.Length || ni < newLines.Length)
      +        {
      +            if (li < lcs.Count && oi < oldLines.Length && ni < newLines.Length &&
      +                oldLines[oi].TrimEnd('\r') == lcs[li] && newLines[ni].TrimEnd('\r') == lcs[li])
      +            {
      +                result.Add(new DiffLine(DiffType.Equal, oi + 1, ni + 1, oldLines[oi].TrimEnd('\r')));
      +                oi++; ni++; li++;
      +            }
      +            else if (li < lcs.Count && oi < oldLines.Length &&
      +                     oldLines[oi].TrimEnd('\r') != lcs[li])
      +            {
      +                result.Add(new DiffLine(DiffType.Removed, oi + 1, null, oldLines[oi].TrimEnd('\r')));
      +                oi++;
      +            }
      +            else if (ni < newLines.Length &&
      +                     (li >= lcs.Count || newLines[ni].TrimEnd('\r') != lcs[li]))
      +            {
      +                result.Add(new DiffLine(DiffType.Added, null, ni + 1, newLines[ni].TrimEnd('\r')));
      +                ni++;
      +            }
      +            else
      +            {
      +                // 나머지 처리
      +                if (oi < oldLines.Length)
      +                {
      +                    result.Add(new DiffLine(DiffType.Removed, oi + 1, null, oldLines[oi].TrimEnd('\r')));
      +                    oi++;
      +                }
      +                if (ni < newLines.Length)
      +                {
      +                    result.Add(new DiffLine(DiffType.Added, null, ni + 1, newLines[ni].TrimEnd('\r')));
      +                    ni++;
      +                }
      +            }
      +        }
      +
      +        return result;
      +    }
      +
      +    private static List ComputeLcs(string[] a, string[] b)
      +    {
      +        int m = a.Length, n = b.Length;
      +        var dp = new int[m + 1, n + 1];
      +
      +        for (int i = 1; i <= m; i++)
      +            for (int j = 1; j <= n; j++)
      +                dp[i, j] = a[i - 1].TrimEnd('\r') == b[j - 1].TrimEnd('\r')
      +                    ? dp[i - 1, j - 1] + 1
      +                    : Math.Max(dp[i - 1, j], dp[i, j - 1]);
      +
      +        // 역추적
      +        var lcs = new List();
      +        int x = m, y = n;
      +        while (x > 0 && y > 0)
      +        {
      +            if (a[x - 1].TrimEnd('\r') == b[y - 1].TrimEnd('\r'))
      +            {
      +                lcs.Add(a[x - 1].TrimEnd('\r'));
      +                x--; y--;
      +            }
      +            else if (dp[x - 1, y] > dp[x, y - 1])
      +                x--;
      +            else
      +                y--;
      +        }
      +        lcs.Reverse();
      +        return lcs;
      +    }
      +
      +    /// diff 결과를 통계 요약 문자열로 반환합니다.
      +    public static string GetSummary(List diff)
      +    {
      +        int added = diff.Count(d => d.Type == DiffType.Added);
      +        int removed = diff.Count(d => d.Type == DiffType.Removed);
      +        return $"+{added} -{removed} 라인 변경";
      +    }
      +}
      diff --git a/src/AxCopilot/Services/FaviconService.cs b/src/AxCopilot/Services/FaviconService.cs
      new file mode 100644
      index 0000000..f4b3f35
      --- /dev/null
      +++ b/src/AxCopilot/Services/FaviconService.cs
      @@ -0,0 +1,108 @@
      +using System.Collections.Concurrent;
      +using System.IO;
      +using System.Net.Http;
      +using System.Windows.Media.Imaging;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 외부 URL의 favicon을 다운로드하여 캐시합니다.
      +/// Google Favicon API (https://www.google.com/s2/favicons?domain=xxx&sz=32)를 사용합니다.
      +/// 캐시는 메모리(ConcurrentDictionary) + 디스크(%APPDATA%\AxCopilot\favicons\)에 저장됩니다.
      +/// 
      +public static class FaviconService
      +{
      +    private static readonly string CacheDir = Path.Combine(
      +        Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +        "AxCopilot", "favicons");
      +
      +    private static readonly ConcurrentDictionary _memCache = new();
      +    private static readonly HttpClient _http = new() { Timeout = TimeSpan.FromSeconds(5) };
      +
      +    /// 
      +    /// 도메인의 favicon BitmapImage를 반환합니다.
      +    /// 캐시에 있으면 즉시 반환, 없으면 null 반환 후 백그라운드에서 다운로드합니다.
      +    /// 다운로드 완료 시 콜백을 호출합니다.
      +    /// 
      +    public static BitmapImage? GetFavicon(string url, Action? onLoaded = null)
      +    {
      +        var domain = ExtractDomain(url);
      +        if (string.IsNullOrEmpty(domain)) return null;
      +
      +        // 메모리 캐시 확인
      +        if (_memCache.TryGetValue(domain, out var cached))
      +            return cached;
      +
      +        // 디스크 캐시 확인
      +        var diskPath = Path.Combine(CacheDir, $"{domain}.png");
      +        if (File.Exists(diskPath))
      +        {
      +            try
      +            {
      +                var bmp = LoadFromDisk(diskPath);
      +                _memCache[domain] = bmp;
      +                return bmp;
      +            }
      +            catch (Exception) { }
      +        }
      +
      +        // 백그라운드에서 다운로드
      +        _memCache[domain] = null; // 중복 요청 방지
      +        _ = DownloadAsync(domain, diskPath, onLoaded);
      +        return null;
      +    }
      +
      +    private static async Task DownloadAsync(string domain, string diskPath, Action? onLoaded)
      +    {
      +        try
      +        {
      +            var faviconUrl = $"https://www.google.com/s2/favicons?domain={Uri.EscapeDataString(domain)}&sz=32";
      +            var bytes = await _http.GetByteArrayAsync(faviconUrl).ConfigureAwait(false);
      +
      +            if (bytes.Length < 100) return; // 너무 작으면 유효한 이미지 아님
      +
      +            // 디스크 저장
      +            Directory.CreateDirectory(CacheDir);
      +            await File.WriteAllBytesAsync(diskPath, bytes).ConfigureAwait(false);
      +
      +            // 메모리 캐시 갱신
      +            System.Windows.Application.Current?.Dispatcher.Invoke(() =>
      +            {
      +                try
      +                {
      +                    var bmp = LoadFromDisk(diskPath);
      +                    _memCache[domain] = bmp;
      +                    onLoaded?.Invoke();
      +                }
      +                catch (Exception) { }
      +            });
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"Favicon 다운로드 실패: {domain} — {ex.Message}");
      +        }
      +    }
      +
      +    private static BitmapImage LoadFromDisk(string path)
      +    {
      +        var bmp = new BitmapImage();
      +        bmp.BeginInit();
      +        bmp.UriSource = new Uri(path, UriKind.Absolute);
      +        bmp.CacheOption = BitmapCacheOption.OnLoad;
      +        bmp.DecodePixelWidth = 32;
      +        bmp.EndInit();
      +        bmp.Freeze();
      +        return bmp;
      +    }
      +
      +    private static string? ExtractDomain(string url)
      +    {
      +        try
      +        {
      +            if (!url.StartsWith("http", StringComparison.OrdinalIgnoreCase))
      +                url = "https://" + url;
      +            return new Uri(url).Host.ToLowerInvariant();
      +        }
      +        catch (Exception) { return null; }
      +    }
      +}
      diff --git a/src/AxCopilot/Services/FileDialogWatcher.cs b/src/AxCopilot/Services/FileDialogWatcher.cs
      new file mode 100644
      index 0000000..42eb71a
      --- /dev/null
      +++ b/src/AxCopilot/Services/FileDialogWatcher.cs
      @@ -0,0 +1,108 @@
      +using System.Runtime.InteropServices;
      +using System.Text;
      +using System.Windows.Threading;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// Windows 열기/저장 대화상자(#32770)를 감지하여 이벤트를 발생시킵니다.
      +/// SetWinEventHook으로 HWND 생성/소멸을 모니터링합니다.
      +/// 
      +public class FileDialogWatcher : IDisposable
      +{
      +    // ─── P/Invoke ────────────────────────────────────────────────────────────
      +
      +    private delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType,
      +        IntPtr hwnd, int idObject, int idChild, uint idEventThread, uint dwmsEventTime);
      +
      +    [DllImport("user32.dll")]
      +    private static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax,
      +        IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc,
      +        uint idProcess, uint idThread, uint dwFlags);
      +
      +    [DllImport("user32.dll")]
      +    private static extern bool UnhookWinEvent(IntPtr hWinEventHook);
      +
      +    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
      +    private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
      +
      +    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
      +    private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
      +
      +    [DllImport("user32.dll")]
      +    private static extern bool IsWindowVisible(IntPtr hWnd);
      +
      +    private const uint EVENT_OBJECT_SHOW = 0x8002;
      +    private const uint EVENT_OBJECT_CREATE = 0x8000;
      +    private const uint WINEVENT_OUTOFCONTEXT = 0x0000;
      +    private const uint WINEVENT_SKIPOWNPROCESS = 0x0002;
      +
      +    // ─── 상태 ────────────────────────────────────────────────────────────────
      +
      +    private IntPtr _hook;
      +    private WinEventDelegate? _delegate; // prevent GC
      +    private bool _disposed;
      +    private readonly Dispatcher _dispatcher;
      +
      +    /// 열기/저장 대화상자가 감지되면 발생합니다. IntPtr = 대화상자 HWND.
      +    public event EventHandler? FileDialogOpened;
      +
      +    public FileDialogWatcher()
      +    {
      +        _dispatcher = Dispatcher.CurrentDispatcher;
      +    }
      +
      +    public void Start()
      +    {
      +        if (_hook != IntPtr.Zero) return;
      +        _delegate = OnWinEvent;
      +        _hook = SetWinEventHook(
      +            EVENT_OBJECT_SHOW, EVENT_OBJECT_SHOW,
      +            IntPtr.Zero, _delegate,
      +            0, 0,
      +            WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
      +    }
      +
      +    public void Stop()
      +    {
      +        if (_hook != IntPtr.Zero)
      +        {
      +            UnhookWinEvent(_hook);
      +            _hook = IntPtr.Zero;
      +        }
      +    }
      +
      +    private void OnWinEvent(IntPtr hWinEventHook, uint eventType,
      +        IntPtr hwnd, int idObject, int idChild, uint idEventThread, uint dwmsEventTime)
      +    {
      +        if (hwnd == IntPtr.Zero || idObject != 0) return;
      +        if (!IsWindowVisible(hwnd)) return;
      +
      +        // 클래스명 #32770 = 공통 대화상자
      +        var sb = new StringBuilder(256);
      +        GetClassName(hwnd, sb, 256);
      +        var className = sb.ToString();
      +
      +        if (className != "#32770") return;
      +
      +        // 창 제목으로 열기/저장 대화상자인지 확인
      +        var titleSb = new StringBuilder(256);
      +        GetWindowText(hwnd, titleSb, 256);
      +        var title = titleSb.ToString();
      +
      +        if (title.Contains("열기") || title.Contains("Open") ||
      +            title.Contains("저장") || title.Contains("Save") ||
      +            title.Contains("다른 이름") || title.Contains("Browse") ||
      +            title.Contains("폴더") || title.Contains("Folder"))
      +        {
      +            _dispatcher.BeginInvoke(() => FileDialogOpened?.Invoke(this, hwnd));
      +        }
      +    }
      +
      +    public void Dispose()
      +    {
      +        if (_disposed) return;
      +        _disposed = true;
      +        Stop();
      +    }
      +}
      diff --git a/src/AxCopilot/Services/GuideEncryptor.cs b/src/AxCopilot/Services/GuideEncryptor.cs
      new file mode 100644
      index 0000000..41034f8
      --- /dev/null
      +++ b/src/AxCopilot/Services/GuideEncryptor.cs
      @@ -0,0 +1,87 @@
      +using System.IO;
      +using System.Security.Cryptography;
      +using System.Text;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 가이드 HTML 파일 암호화/복호화 유틸리티.
      +/// 고정 AES-256-CBC 키를 사용하여 모든 PC에서 동일하게 작동합니다.
      +/// 
      +public static class GuideEncryptor
      +{
      +    // 고정 키 (32바이트 = AES-256) — 앱 내장 가이드 보호용
      +    private static readonly byte[] Key =
      +    {
      +        0x41, 0x58, 0x43, 0x6F, 0x70, 0x69, 0x6C, 0x6F,
      +        0x74, 0x47, 0x75, 0x69, 0x64, 0x65, 0x4B, 0x65,
      +        0x79, 0x32, 0x30, 0x32, 0x36, 0x53, 0x65, 0x63,
      +        0x75, 0x72, 0x65, 0x46, 0x69, 0x78, 0x65, 0x64
      +    };
      +
      +    // 고정 IV (16바이트) — 동일 출력 보장
      +    private static readonly byte[] Iv =
      +    {
      +        0x47, 0x75, 0x69, 0x64, 0x65, 0x49, 0x56, 0x46,
      +        0x69, 0x78, 0x65, 0x64, 0x32, 0x30, 0x32, 0x36
      +    };
      +
      +    /// 평문 HTML 파일을 암호화하여 .enc 파일로 저장합니다.
      +    public static void EncryptFile(string inputHtmlPath, string outputEncPath)
      +    {
      +        var plaintext = File.ReadAllBytes(inputHtmlPath);
      +
      +        using var aes = Aes.Create();
      +        aes.Key = Key;
      +        aes.IV = Iv;
      +        aes.Mode = CipherMode.CBC;
      +        aes.Padding = PaddingMode.PKCS7;
      +
      +        using var encryptor = aes.CreateEncryptor();
      +        var encrypted = encryptor.TransformFinalBlock(plaintext, 0, plaintext.Length);
      +        File.WriteAllBytes(outputEncPath, encrypted);
      +    }
      +
      +    /// 암호화된 .enc 파일을 복호화하여 HTML 문자열로 반환합니다.
      +    public static string DecryptToString(string encFilePath)
      +    {
      +        var encrypted = File.ReadAllBytes(encFilePath);
      +
      +        using var aes = Aes.Create();
      +        aes.Key = Key;
      +        aes.IV = Iv;
      +        aes.Mode = CipherMode.CBC;
      +        aes.Padding = PaddingMode.PKCS7;
      +
      +        using var decryptor = aes.CreateDecryptor();
      +        var decrypted = decryptor.TransformFinalBlock(encrypted, 0, encrypted.Length);
      +        return Encoding.UTF8.GetString(decrypted);
      +    }
      +
      +    /// 암호화된 바이트 배열을 복호화하여 HTML 문자열로 반환합니다.
      +    public static string DecryptToString(byte[] encrypted)
      +    {
      +        using var aes = Aes.Create();
      +        aes.Key = Key;
      +        aes.IV = Iv;
      +        aes.Mode = CipherMode.CBC;
      +        aes.Padding = PaddingMode.PKCS7;
      +
      +        using var decryptor = aes.CreateDecryptor();
      +        var decrypted = decryptor.TransformFinalBlock(encrypted, 0, encrypted.Length);
      +        return Encoding.UTF8.GetString(decrypted);
      +    }
      +
      +    /// Assets 폴더의 가이드 파일을 암호화합니다. 빌드 전 수동 실행용.
      +    public static void EncryptGuides(string assetsFolder)
      +    {
      +        var userGuide = Path.Combine(assetsFolder, "AX Copilot 사용가이드.htm");
      +        var devGuide = Path.Combine(assetsFolder, "AX Copilot 개발자가이드.htm");
      +
      +        if (File.Exists(userGuide))
      +            EncryptFile(userGuide, Path.Combine(assetsFolder, "guide_user.enc"));
      +
      +        if (File.Exists(devGuide))
      +            EncryptFile(devGuide, Path.Combine(assetsFolder, "guide_dev.enc"));
      +    }
      +}
      diff --git a/src/AxCopilot/Services/IndexService.cs b/src/AxCopilot/Services/IndexService.cs
      new file mode 100644
      index 0000000..304143d
      --- /dev/null
      +++ b/src/AxCopilot/Services/IndexService.cs
      @@ -0,0 +1,568 @@
      +using System.Diagnostics;
      +using System.IO;
      +using AxCopilot.Models;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 파일/앱 인덱싱 서비스. Fuzzy 검색의 데이터 소스를 관리합니다.
      +/// FileSystemWatcher로 변경 시 자동 재빌드(3초 디바운스)합니다.
      +/// 
      +public class IndexService : IDisposable
      +{
      +    private readonly SettingsService _settings;
      +    private List _index = new();
      +    private readonly List _watchers = new();
      +    private System.Threading.Timer? _debounceTimer;
      +    private readonly object _timerLock = new();
      +    private const int DebounceMs = 3000;
      +    private readonly SemaphoreSlim _rebuildLock = new(1, 1);
      +
      +    public IReadOnlyList Entries => _index;
      +
      +    public event EventHandler? IndexRebuilt;
      +    public TimeSpan LastIndexDuration { get; private set; }
      +    public int LastIndexCount { get; private set; }
      +
      +    public IndexService(SettingsService settings)
      +    {
      +        _settings = settings;
      +    }
      +
      +    /// 
      +    /// 앱 시작 시 전체 인덱스 빌드 후 FileSystemWatcher 시작.
      +    /// 
      +    public async Task BuildAsync(CancellationToken ct = default)
      +    {
      +        await _rebuildLock.WaitAsync(ct);
      +        var sw = Stopwatch.StartNew();
      +        try
      +        {
      +            var entries = new List();
      +            var paths = _settings.Settings.IndexPaths
      +                .Select(p => Environment.ExpandEnvironmentVariables(p));
      +            var allowedExts = new HashSet(
      +                _settings.Settings.IndexExtensions
      +                    .Select(e => e.ToLowerInvariant().StartsWith(".") ? e.ToLowerInvariant() : "." + e.ToLowerInvariant()),
      +                StringComparer.OrdinalIgnoreCase);
      +
      +            var indexSpeed = _settings.Settings.IndexSpeed ?? "normal";
      +
      +            foreach (var dir in paths)
      +            {
      +                if (!Directory.Exists(dir)) continue;
      +                await ScanDirectoryAsync(dir, entries, allowedExts, indexSpeed, ct);
      +            }
      +
      +            // Alias도 인덱스에 포함 (type에 따라 IndexEntryType 구분)
      +            foreach (var alias in _settings.Settings.Aliases)
      +            {
      +                entries.Add(new IndexEntry
      +                {
      +                    Name        = alias.Key,
      +                    DisplayName = alias.Description ?? alias.Key,
      +                    Path        = alias.Target,
      +                    AliasType   = alias.Type,
      +                    Type        = alias.Type switch
      +                    {
      +                        "app"    => IndexEntryType.App,
      +                        "folder" => IndexEntryType.Folder,
      +                        _        => IndexEntryType.Alias   // url, batch, api, clipboard
      +                    },
      +                    Score = 100  // Alias는 최우선
      +                });
      +            }
      +
      +            // Built-in 앱 별칭 (한글+영문 이름으로 즉시 실행)
      +            RegisterBuiltInApps(entries);
      +
      +            // 검색 가속 캐시 일괄 계산 (ToLower·자모·초성을 빌드 시 1회만 수행)
      +            ComputeAllSearchCaches(entries);
      +
      +            _index = entries;
      +            sw.Stop();
      +            LastIndexDuration = sw.Elapsed;
      +            LastIndexCount = entries.Count;
      +            LogService.Info($"인덱싱 완료: {entries.Count}개 항목 ({sw.Elapsed.TotalSeconds:F1}초)");
      +            IndexRebuilt?.Invoke(this, EventArgs.Empty);
      +        }
      +        finally
      +        {
      +            _rebuildLock.Release();
      +        }
      +    }
      +
      +    /// 
      +    /// 인덱스 경로에 대한 FileSystemWatcher를 시작합니다.
      +    /// BuildAsync() 완료 후 호출하세요.
      +    /// 
      +    public void StartWatchers()
      +    {
      +        StopWatchers();
      +
      +        foreach (var rawPath in _settings.Settings.IndexPaths)
      +        {
      +            var dir = Environment.ExpandEnvironmentVariables(rawPath);
      +            if (!Directory.Exists(dir)) continue;
      +
      +            try
      +            {
      +                var w = new FileSystemWatcher(dir)
      +                {
      +                    Filter                = "*.*",
      +                    IncludeSubdirectories = true,
      +                    NotifyFilter          = NotifyFilters.FileName | NotifyFilters.DirectoryName,
      +                    EnableRaisingEvents   = true
      +                };
      +                w.Created += OnWatcherEvent;
      +                w.Deleted += OnWatcherEvent;
      +                w.Renamed += OnWatcherRenamed;
      +                _watchers.Add(w);
      +            }
      +            catch (Exception ex)
      +            {
      +                LogService.Warn($"FileSystemWatcher 생성 실패: {dir} - {ex.Message}");
      +            }
      +        }
      +
      +        LogService.Info($"파일 감시 시작: {_watchers.Count}개 경로");
      +    }
      +
      +    private void StopWatchers()
      +    {
      +        foreach (var w in _watchers)
      +        {
      +            w.EnableRaisingEvents = false;
      +            w.Dispose();
      +        }
      +        _watchers.Clear();
      +    }
      +
      +    private void OnWatcherEvent(object sender, FileSystemEventArgs e)
      +    {
      +        ScheduleRebuild(e.FullPath);
      +    }
      +
      +    private void OnWatcherRenamed(object sender, RenamedEventArgs e)
      +    {
      +        ScheduleRebuild(e.FullPath);
      +    }
      +
      +    private void ScheduleRebuild(string triggerPath)
      +    {
      +        LogService.Info($"파일 변경 감지: {triggerPath} — {DebounceMs}ms 후 재빌드 예약");
      +        lock (_timerLock)
      +        {
      +            _debounceTimer?.Dispose();
      +            _debounceTimer = new System.Threading.Timer(__ =>
      +            {
      +                _ = BuildAsync();
      +            }, null, DebounceMs, System.Threading.Timeout.Infinite);
      +        }
      +    }
      +
      +    public void Dispose()
      +    {
      +        _debounceTimer?.Dispose();
      +        StopWatchers();
      +    }
      +
      +    /// 
      +    /// 자주 사용하는 Windows 기본 앱을 한글+영문 이름으로 등록합니다.
      +    /// 실제로 존재하는 경우에만 인덱스에 추가됩니다.
      +    /// 
      +    private static void RegisterBuiltInApps(List entries)
      +    {
      +        // (displayName, keywords[], exePath)
      +        var builtIns = new (string Display, string[] Names, string? Exe)[]
      +        {
      +            // 메모장
      +            ("메모장 (Notepad)", new[] { "메모장", "notepad", "note", "txt" },
      +                @"C:\Windows\notepad.exe"),
      +            // 계산기
      +            ("계산기 (Calculator)", new[] { "계산기", "calc", "calculator" },
      +                "calculator:"),  // UWP protocol
      +            // 캡처 도구 (Snipping Tool)
      +            ("캡처 도구 (Snipping Tool)", new[] { "캡처", "캡처도구", "snippingtool", "snip", "스크린샷" },
      +                @"C:\Windows\System32\SnippingTool.exe"),
      +            // 그림판
      +            ("그림판 (Paint)", new[] { "그림판", "mspaint", "paint" },
      +                @"C:\Windows\System32\mspaint.exe"),
      +            // 탐색기
      +            ("파일 탐색기 (Explorer)", new[] { "탐색기", "explorer", "파일탐색기" },
      +                @"C:\Windows\explorer.exe"),
      +            // 명령 프롬프트
      +            ("명령 프롬프트 (CMD)", new[] { "cmd", "명령프롬프트", "커맨드", "터미널" },
      +                @"C:\Windows\System32\cmd.exe"),
      +            // PowerShell
      +            ("PowerShell", new[] { "powershell", "파워쉘" },
      +                @"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"),
      +            // 제어판
      +            ("제어판 (Control Panel)", new[] { "제어판", "control", "controlpanel" },
      +                @"C:\Windows\System32\control.exe"),
      +            // 작업 관리자
      +            ("작업 관리자 (Task Manager)", new[] { "작업관리자", "taskmgr", "taskmanager" },
      +                @"C:\Windows\System32\Taskmgr.exe"),
      +            // 원격 데스크톱
      +            ("원격 데스크톱 (Remote Desktop)", new[] { "원격", "mstsc", "rdp", "원격데스크톱" },
      +                @"C:\Windows\System32\mstsc.exe"),
      +            // 레지스트리 편집기
      +            ("레지스트리 편집기", new[] { "regedit", "레지스트리" },
      +                @"C:\Windows\regedit.exe"),
      +            // 장치 관리자
      +            ("장치 관리자", new[] { "장치관리자", "devmgmt", "devicemanager" },
      +                @"C:\Windows\System32\devmgmt.msc"),
      +            // Microsoft Edge
      +            ("Microsoft Edge", new[] { "edge", "엣지", "브라우저" },
      +                @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"),
      +            // Excel — 확장자 + MS prefix + 한글
      +            ("Microsoft Excel", new[] { "엑셀", "excel", "msexcel", "xlsx", "xls", "csv" },
      +                FindOfficeApp("EXCEL.EXE")),
      +            // PowerPoint
      +            ("Microsoft PowerPoint", new[] { "파워포인트", "powerpoint", "mspowerpoint", "pptx", "ppt" },
      +                FindOfficeApp("POWERPNT.EXE")),
      +            // Word
      +            ("Microsoft Word", new[] { "워드", "word", "msword", "docx", "doc" },
      +                FindOfficeApp("WINWORD.EXE")),
      +            // Outlook
      +            ("Microsoft Outlook", new[] { "아웃룩", "outlook", "메일" },
      +                FindOfficeApp("OUTLOOK.EXE")),
      +            // Teams
      +            ("Microsoft Teams", new[] { "팀즈", "teams" },
      +                FindTeams()),
      +            // OneNote
      +            ("Microsoft OneNote", new[] { "원노트", "onenote" },
      +                FindOfficeApp("ONENOTE.EXE")),
      +            // Access
      +            ("Microsoft Access", new[] { "액세스", "access", "msaccess" },
      +                FindOfficeApp("MSACCESS.EXE")),
      +            // VS Code
      +            ("Visual Studio Code", new[] { "vscode", "비주얼스튜디오코드", "코드에디터", "code" },
      +                FindInPath("code.cmd") ?? FindInLocalAppData(@"Programs\Microsoft VS Code\Code.exe")),
      +            // Visual Studio
      +            ("Visual Studio", new[] { "비주얼스튜디오", "devenv", "vs2022", "vs2019", "visualstudio" },
      +                FindInProgramFiles(@"Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe")
      +                ?? FindInProgramFiles(@"Microsoft Visual Studio\2022\Professional\Common7\IDE\devenv.exe")
      +                ?? FindInProgramFiles(@"Microsoft Visual Studio\2022\Enterprise\Common7\IDE\devenv.exe")),
      +            // Windows Terminal
      +            ("Windows Terminal", new[] { "윈도우터미널", "wt", "windowsterminal", "터미널" },
      +                FindInLocalAppData(@"Microsoft\WindowsApps\wt.exe")),
      +            // OneDrive
      +            ("OneDrive", new[] { "원드라이브", "onedrive" },
      +                FindInLocalAppData(@"Microsoft\OneDrive\OneDrive.exe")),
      +            // Google Chrome
      +            ("Google Chrome", new[] { "크롬", "구글크롬", "chrome", "google" },
      +                FindInProgramFiles(@"Google\Chrome\Application\chrome.exe")
      +                ?? FindInLocalAppData(@"Google\Chrome\Application\chrome.exe")),
      +            // Firefox
      +            ("Mozilla Firefox", new[] { "파이어폭스", "불여우", "firefox" },
      +                FindInProgramFiles(@"Mozilla Firefox\firefox.exe")),
      +            // Naver Whale
      +            ("Naver Whale", new[] { "웨일", "네이버웨일", "whale" },
      +                FindInLocalAppData(@"Naver\Naver Whale\Application\whale.exe")),
      +            // KakaoTalk
      +            ("KakaoTalk", new[] { "카카오톡", "카톡", "kakaotalk", "kakao" },
      +                FindInLocalAppData(@"Kakao\KakaoTalk\KakaoTalk.exe")),
      +            // KakaoWork
      +            ("KakaoWork", new[] { "카카오워크", "카워크", "kakaowork" },
      +                FindInLocalAppData(@"Kakao\KakaoWork\KakaoWork.exe")),
      +            // Zoom
      +            ("Zoom", new[] { "줌", "zoom" },
      +                FindInRoaming(@"Zoom\bin\Zoom.exe")
      +                ?? FindInLocalAppData(@"Zoom\bin\Zoom.exe")),
      +            // Slack
      +            ("Slack", new[] { "슬랙", "slack" },
      +                FindInLocalAppData(@"slack\slack.exe")),
      +            // Figma
      +            ("Figma", new[] { "피그마", "figma" },
      +                FindInLocalAppData(@"Figma\Figma.exe")),
      +            // Notepad++
      +            ("Notepad++", new[] { "노트패드++", "npp", "notepad++" },
      +                FindInProgramFiles(@"Notepad++\notepad++.exe")),
      +            // 7-Zip
      +            ("7-Zip", new[] { "7zip", "7집", "세븐집", "7z" },
      +                FindInProgramFiles(@"7-Zip\7zFM.exe")),
      +            // Bandizip
      +            ("Bandizip", new[] { "반디집", "bandizip" },
      +                FindInProgramFiles(@"Bandizip\Bandizip.exe")
      +                ?? FindInLocalAppData(@"Bandizip\Bandizip.exe")),
      +            // ALZip
      +            ("ALZip", new[] { "알집", "alzip", "이스트소프트" },
      +                FindInProgramFiles(@"ESTsoft\ALZip\ALZip.exe")),
      +            // PotPlayer
      +            ("PotPlayer", new[] { "팟플레이어", "팟플", "potplayer" },
      +                FindInProgramFiles(@"DAUM\PotPlayer\PotPlayerMini64.exe")
      +                ?? FindInProgramFiles(@"DAUM\PotPlayer\PotPlayerMini.exe")),
      +            // GOM Player
      +            ("GOM Player", new[] { "곰플레이어", "곰플", "gomplayer", "gom" },
      +                FindInProgramFiles(@"GRETECH\GomPlayer\GOM.EXE")),
      +            // Adobe Photoshop
      +            ("Adobe Photoshop", new[] { "포토샵", "포샵", "photoshop", "ps" },
      +                FindInProgramFiles(@"Adobe\Adobe Photoshop 2025\Photoshop.exe")
      +                ?? FindInProgramFiles(@"Adobe\Adobe Photoshop 2024\Photoshop.exe")
      +                ?? FindInProgramFiles(@"Adobe\Adobe Photoshop 2023\Photoshop.exe")),
      +            // Adobe Acrobat
      +            ("Adobe Acrobat", new[] { "아크로뱃", "acrobat", "아도비pdf" },
      +                FindInProgramFiles(@"Adobe\Acrobat DC\Acrobat\Acrobat.exe")),
      +            // 한컴 한글
      +            ("한컴 한글", new[] { "한글", "한컴한글", "hwp", "hangul", "아래아한글" },
      +                FindInProgramFiles(@"HNC\Hwp\Hwp.exe")
      +                ?? FindInProgramFiles(@"HNC\Office NEO\HOffice NEO\Bin\Hwp.exe")
      +                ?? FindInProgramFiles(@"Hnc\Hwp80\Hwp.exe")),
      +            // 한컴 한셀
      +            ("한컴 한셀", new[] { "한셀", "hcell", "한컴스프레드" },
      +                FindInProgramFiles(@"HNC\Hwp\Hcell.exe")
      +                ?? FindInProgramFiles(@"HNC\Office NEO\HOffice NEO\Bin\Hcell.exe")),
      +            // 한컴 한쇼
      +            ("한컴 한쇼", new[] { "한쇼", "hshow", "한컴프레젠테이션" },
      +                FindInProgramFiles(@"HNC\Hwp\Show.exe")
      +                ?? FindInProgramFiles(@"HNC\Office NEO\HOffice NEO\Bin\Show.exe")),
      +        };
      +
      +        // 기존 항목의 이름 → 인덱스 매핑 + Path 기반 중복 방지
      +        var nameToIdx = new Dictionary(StringComparer.OrdinalIgnoreCase);
      +        var pathToIdx = new Dictionary(StringComparer.OrdinalIgnoreCase);
      +        for (int i = 0; i < entries.Count; i++)
      +        {
      +            nameToIdx.TryAdd(entries[i].Name, i);
      +            pathToIdx.TryAdd(entries[i].Path, i);
      +        }
      +
      +        foreach (var (display, names, exe) in builtIns)
      +        {
      +            if (string.IsNullOrEmpty(exe)) continue;
      +            // UWP protocol은 파일 존재 체크 불필요
      +            if (!exe.Contains(":") && !File.Exists(exe) && !exe.EndsWith(".msc")) continue;
      +
      +            // 같은 경로가 이미 인덱스에 있으면 DisplayName과 Score만 업데이트
      +            if (pathToIdx.TryGetValue(exe, out var existingIdx))
      +            {
      +                entries[existingIdx].DisplayName = display;
      +                if (entries[existingIdx].Score < 95) entries[existingIdx].Score = 95;
      +            }
      +
      +            // ── 키워드별 IndexEntry 등록 ─────────────────────────────────────────
      +            // - 한글 이름: 항상 IndexEntry로 추가 (앱이 이미 스캔됐어도)
      +            //   → "엑" 입력 시 "엑셀" IndexEntry의 StartsWith("엑")으로 매칭
      +            // - 영문/약어: 앱이 미스캔 상태일 때 첫 키워드만 대표 항목으로 등록
      +            // - 경로 중복은 CommandResolver 레이어에서 seenPaths로 최고점만 표시
      +            bool mainAdded = pathToIdx.ContainsKey(exe);
      +            foreach (var name in names)
      +            {
      +                if (nameToIdx.ContainsKey(name))
      +                {
      +                    // 이미 같은 이름 존재 → Score만 부스트
      +                    if (nameToIdx.TryGetValue(name, out var idx) && entries[idx].Score < 95)
      +                        entries[idx].Score = 95;
      +                    continue;
      +                }
      +
      +                // 한글 음절이 포함된 이름은 항상 IndexEntry로 추가
      +                bool isKoreanName = name.Any(c => c >= '\uAC00' && c <= '\uD7A3');
      +
      +                if (!mainAdded || isKoreanName)
      +                {
      +                    entries.Add(new IndexEntry
      +                    {
      +                        Name        = name,
      +                        DisplayName = display,
      +                        Path        = exe,
      +                        Type        = IndexEntryType.App,
      +                        Score       = 95
      +                    });
      +                    var newIdx = entries.Count - 1;
      +                    nameToIdx[name] = newIdx;
      +                    if (!mainAdded)
      +                    {
      +                        pathToIdx[exe] = newIdx;
      +                        mainAdded = true;
      +                    }
      +                }
      +                else
      +                {
      +                    // 영문/약어는 pathToIdx 참조만 (FuzzyEngine은 영문 앱명 직접 매칭)
      +                    nameToIdx[name] = pathToIdx[exe];
      +                }
      +            }
      +        }
      +    }
      +
      +    private static string? FindOfficeApp(string exeName)
      +    {
      +        var roots = new[]
      +        {
      +            @"C:\Program Files\Microsoft Office\root\Office16",
      +            @"C:\Program Files (x86)\Microsoft Office\root\Office16",
      +            @"C:\Program Files\Microsoft Office\Office16",
      +            @"C:\Program Files (x86)\Microsoft Office\Office16",
      +        };
      +        foreach (var root in roots)
      +        {
      +            var path = Path.Combine(root, exeName);
      +            if (File.Exists(path)) return path;
      +        }
      +        return null;
      +    }
      +
      +    private static string? FindTeams()
      +    {
      +        var localApp = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
      +        var path = Path.Combine(localApp, @"Microsoft\Teams\current\Teams.exe");
      +        if (File.Exists(path)) return path;
      +        // New Teams (MSIX)
      +        var msTeams = Path.Combine(localApp, @"Microsoft\WindowsApps\ms-teams.exe");
      +        return File.Exists(msTeams) ? msTeams : null;
      +    }
      +
      +    private static string? FindInPath(string fileName)
      +    {
      +        var pathEnv = Environment.GetEnvironmentVariable("PATH") ?? "";
      +        foreach (var dir in pathEnv.Split(';'))
      +        {
      +            if (string.IsNullOrWhiteSpace(dir)) continue;
      +            var full = Path.Combine(dir.Trim(), fileName);
      +            if (File.Exists(full)) return full;
      +        }
      +        return null;
      +    }
      +
      +    private static string? FindInLocalAppData(string relativePath)
      +    {
      +        var localApp = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
      +        var path = Path.Combine(localApp, relativePath);
      +        return File.Exists(path) ? path : null;
      +    }
      +
      +    /// ProgramFiles / ProgramFiles(x86) 두 곳을 탐색합니다.
      +    private static string? FindInProgramFiles(string relativePath)
      +    {
      +        var pf   = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
      +        var pf86 = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
      +        var p1 = Path.Combine(pf,   relativePath);
      +        if (File.Exists(p1)) return p1;
      +        var p2 = Path.Combine(pf86, relativePath);
      +        return File.Exists(p2) ? p2 : null;
      +    }
      +
      +    /// AppData\Roaming 경로를 탐색합니다.
      +    private static string? FindInRoaming(string relativePath)
      +    {
      +        var roaming = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
      +        var path = Path.Combine(roaming, relativePath);
      +        return File.Exists(path) ? path : null;
      +    }
      +
      +    // ─── 검색 가속 캐시 계산 ──────────────────────────────────────────────────
      +
      +    /// 빌드 완료 후 전체 항목의 검색 캐시를 한 번에 계산합니다.
      +    private static void ComputeAllSearchCaches(List entries)
      +    {
      +        foreach (var e in entries)
      +            ComputeSearchCache(e);
      +    }
      +
      +    /// 항목 1개의 NameLower / NameJamo / NameChosung 캐시를 계산합니다.
      +    private static void ComputeSearchCache(IndexEntry entry)
      +    {
      +        entry.NameLower = entry.Name.ToLowerInvariant();
      +        // 자모 분리 (FuzzyEngine static 메서드 — 동일 어셈블리 internal 접근)
      +        entry.NameJamo = AxCopilot.Core.FuzzyEngine.DecomposeToJamo(entry.NameLower);
      +        // 초성 문자열 (예: "엑셀" → "ㅇㅅ", "메모장" → "ㅁㅁㅈ")
      +        var sb = new System.Text.StringBuilder(entry.NameLower.Length);
      +        foreach (var c in entry.NameLower)
      +        {
      +            var cho = AxCopilot.Core.FuzzyEngine.GetChosung(c);
      +            if (cho != '\0') sb.Append(cho);
      +        }
      +        entry.NameChosung = sb.ToString();
      +    }
      +
      +    /// 인덱싱 속도에 따른 throttle 간격(ms). N개 파일마다 yield.
      +    private static (int batchSize, int delayMs) GetThrottle(string speed) => speed switch
      +    {
      +        "fast" => (500, 0),    // 최대 속도, CPU 양보 없음
      +        "slow" => (50, 15),    // 50개마다 15ms 양보 → PC 부하 최소
      +        _      => (150, 5),    // normal: 150개마다 5ms → 적정 균형
      +    };
      +
      +    private static async Task ScanDirectoryAsync(string dir, List entries,
      +        HashSet allowedExts, string indexSpeed, CancellationToken ct)
      +    {
      +        var (batchSize, delayMs) = GetThrottle(indexSpeed);
      +
      +        await Task.Run(async () =>
      +        {
      +            try
      +            {
      +                int count = 0;
      +
      +                // 파일 인덱싱 (확장자 필터 적용)
      +                foreach (var file in Directory.EnumerateFiles(dir, "*.*", SearchOption.AllDirectories))
      +                {
      +                    ct.ThrowIfCancellationRequested();
      +                    var ext = Path.GetExtension(file).ToLowerInvariant();
      +                    if (allowedExts.Count > 0 && !allowedExts.Contains(ext)) continue;
      +                    var name = Path.GetFileNameWithoutExtension(file);
      +                    if (string.IsNullOrEmpty(name)) continue;
      +                    var type = ext switch
      +                    {
      +                        ".exe" => IndexEntryType.App,
      +                        ".lnk" or ".url" => IndexEntryType.File,
      +                        _ => IndexEntryType.File
      +                    };
      +                    entries.Add(new IndexEntry
      +                    {
      +                        Name = name,
      +                        DisplayName = ext is ".exe" or ".lnk" or ".url" ? name : name + ext,
      +                        Path = file,
      +                        Type = type
      +                    });
      +
      +                    // 속도 조절: batchSize개마다 CPU 양보
      +                    if (delayMs > 0 && ++count % batchSize == 0)
      +                        await Task.Delay(delayMs, ct);
      +                }
      +
      +                // 폴더 인덱싱 (1단계 하위 폴더)
      +                foreach (var subDir in Directory.EnumerateDirectories(dir, "*", SearchOption.TopDirectoryOnly))
      +                {
      +                    ct.ThrowIfCancellationRequested();
      +                    var name = Path.GetFileName(subDir);
      +                    if (name.StartsWith(".")) continue;
      +                    entries.Add(new IndexEntry
      +                    {
      +                        Name = name,
      +                        DisplayName = name,
      +                        Path = subDir,
      +                        Type = IndexEntryType.Folder
      +                    });
      +                }
      +            }
      +            catch (UnauthorizedAccessException ex)
      +            {
      +                LogService.Warn($"폴더 접근 불가 (건너뜀): {dir} - {ex.Message}");
      +            }
      +        }, ct);
      +    }
      +}
      +
      +public class IndexEntry
      +{
      +    public string Name        { get; set; } = "";
      +    public string DisplayName { get; set; } = "";
      +    public string Path        { get; set; } = "";
      +    public IndexEntryType Type { get; set; }
      +    public int Score          { get; set; } = 0;
      +    /// Alias 항목의 원본 type 문자열 (url | folder | app | batch | api | clipboard)
      +    public string? AliasType  { get; set; }
      +
      +    // ─ 검색 가속 캐시 (BuildAsync 시 1회 계산, 검색마다 재계산 방지) ──────
      +    /// ToLowerInvariant() 결과 캐시
      +    public string NameLower   { get; set; } = "";
      +    /// 자모 분리 문자열 캐시 (DecomposeToJamo 결과)
      +    public string NameJamo    { get; set; } = "";
      +    /// 초성만 연결한 문자열 캐시 (예: "엑셀" → "ㅇㅅ")
      +    public string NameChosung { get; set; } = "";
      +}
      +
      +public enum IndexEntryType { App, File, Alias, Folder }
      diff --git a/src/AxCopilot/Services/IntentDetector.cs b/src/AxCopilot/Services/IntentDetector.cs
      new file mode 100644
      index 0000000..b47669a
      --- /dev/null
      +++ b/src/AxCopilot/Services/IntentDetector.cs
      @@ -0,0 +1,177 @@
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 사용자 메시지에서 질문 유형(인텐트)을 감지하는 로컬 키워드 기반 분류기.
      +/// 외부 API 없이 순수 키워드 매칭으로 동작합니다.
      +/// 
      +public static class IntentDetector
      +{
      +    /// 인텐트 카테고리 상수.
      +    public static class Categories
      +    {
      +        public const string Coding     = "coding";
      +        public const string Translation = "translation";
      +        public const string Analysis   = "analysis";
      +        public const string Creative   = "creative";
      +        public const string Document   = "document";
      +        public const string Math       = "math";
      +        public const string General    = "general";
      +
      +        public static readonly string[] All =
      +        {
      +            Coding, Translation, Analysis, Creative, Document, Math, General
      +        };
      +    }
      +
      +    /// 카테고리별 키워드 사전. (키워드, 가중치) 쌍.
      +    private static readonly Dictionary _keywords = new()
      +    {
      +        [Categories.Coding] = new (string, double)[]
      +        {
      +            // 한국어
      +            ("코드", 1.0), ("함수", 1.0), ("클래스", 1.0), ("버그", 1.2), ("디버그", 1.2),
      +            ("리팩토링", 1.5), ("컴파일", 1.2), ("에러", 0.8), ("구현", 0.9), ("개발", 0.7),
      +            ("테스트", 0.8), ("빌드", 1.0), ("배포", 0.8), ("커밋", 1.2), ("브랜치", 1.2),
      +            ("머지", 1.0), ("풀리퀘", 1.2), ("변수", 1.0), ("메서드", 1.2), ("인터��이스", 1.0),
      +            ("타입", 0.6), ("파라미터", 1.0), ("반환", 0.8), ("예외", 1.0), ("스택", 0.9),
      +            ("알고리즘", 1.2), ("자료구조", 1.2), ("정렬", 0.8), ("재귀", 1.0), ("루프", 0.9),
      +            ("API", 1.0), ("SDK", 1.0), ("라이브러리", 0.8), ("패키지", 0.8), ("모듈", 0.8),
      +            ("깃", 1.0), ("레포", 1.0), ("소스", 0.7), ("프로그래밍", 1.0), ("코딩", 1.2),
      +            // 영어
      +            ("code", 1.0), ("function", 1.0), ("class", 0.8), ("bug", 1.2), ("debug", 1.2),
      +            ("refactor", 1.5), ("compile", 1.2), ("error", 0.6), ("implement", 1.0), ("develop", 0.7),
      +            ("test", 0.7), ("build", 0.8), ("deploy", 0.8), ("commit", 1.2), ("branch", 1.2),
      +            ("merge", 1.0), ("variable", 1.0), ("method", 1.0), ("interface", 0.8),
      +            ("parameter", 1.0), ("return", 0.6), ("exception", 1.0), ("stack", 0.7),
      +            ("algorithm", 1.2), ("syntax", 1.2), ("runtime", 1.0), ("compile", 1.0),
      +            ("git", 1.2), ("npm", 1.0), ("pip", 1.0), ("nuget", 1.0), ("docker", 1.0),
      +        },
      +        [Categories.Translation] = new (string, double)[]
      +        {
      +            ("번역", 2.0), ("영어로", 2.0), ("한국어로", 2.0), ("일본어로", 2.0), ("중국어로", 2.0),
      +            ("영문", 1.5), ("국문", 1.5), ("통역", 1.5), ("원문", 1.2), ("의역", 1.5), ("직역", 1.5),
      +            ("translate", 2.0), ("English", 1.0), ("Korean", 1.0), ("Japanese", 1.0), ("Chinese", 1.0),
      +            ("translation", 2.0), ("localize", 1.5), ("localization", 1.5),
      +        },
      +        [Categories.Analysis] = new (string, double)[]
      +        {
      +            ("분석", 1.5), ("요약", 1.5), ("비교", 1.2), ("장��점", 1.5), ("평가", 1.2),
      +            ("검토", 1.0), ("리뷰", 0.8), ("통계", 1.2), ("데이터", 0.8), ("트렌드", 1.0),
      +            ("인사이트", 1.2), ("근거", 1.0), ("원인", 0.8), ("결론", 0.8), ("핵심", 0.7),
      +            ("analyze", 1.5), ("summarize", 1.5), ("compare", 1.2), ("evaluate", 1.2),
      +            ("review", 0.8), ("statistics", 1.2), ("data", 0.6), ("trend", 1.0),
      +            ("insight", 1.2), ("pros", 1.0), ("cons", 1.0), ("conclusion", 0.8),
      +        },
      +        [Categories.Creative] = new (string, double)[]
      +        {
      +            ("작성", 0.8), ("글쓰기", 1.5), ("스토리", 1.5), ("시", 1.2), ("소설", 1.5),
      +            ("에��이", 1.5), ("블로그", 1.2), ("카피", 1.2), ("슬로건", 1.5), ("제목", 0.8),
      +            ("아이디어", 1.0), ("창작", 1.5), ("묘사", 1.2), ("대본", 1.5), ("가사", 1.5),
      +            ("story", 1.5), ("poem", 1.5), ("essay", 1.5), ("blog", 1.2), ("creative", 1.5),
      +            ("slogan", 1.5), ("copy", 0.8), ("fiction", 1.5), ("narrative", 1.2), ("lyrics", 1.5),
      +        },
      +        [Categories.Document] = new (string, double)[]
      +        {
      +            ("보고서", 2.0), ("문서", 1.2), ("제안서", 2.0), ("기획서", 2.0), ("계획서", 1.8),
      +            ("발표자료", 2.0), ("프레젠테이션", 2.0), ("양식", 1.5), ("서식", 1.5), ("템플릿", 1.2),
      +            ("��셀", 1.5), ("워드", 1.2), ("파워포인트", 1.5), ("PDF", 0.8), ("CSV", 1.0),
      +            ("회의록", 2.0), ("업무일지", 2.0), ("주간보고", 2.0), ("월간보고", 2.0),
      +            ("report", 1.8), ("document", 1.0), ("proposal", 2.0), ("presentation", 2.0),
      +            ("template", 1.2), ("spreadsheet", 1.5), ("excel", 1.5), ("memo", 1.2),
      +        },
      +        [Categories.Math] = new (string, double)[]
      +        {
      +            ("수학", 1.5), ("계산", 1.2), ("방정식", 2.0), ("증명", 2.0), ("미적분", 2.0),
      +            ("통계", 1.0), ("확률", 1.5), ("행렬", 2.0), ("벡터", 1.5), ("미분", 2.0),
      +            ("적분", 2.0), ("함수", 0.5), ("그래프", 0.8), ("좌표", 1.5), ("기하", 1.5),
      +            ("삼각함수", 2.0), ("로그", 1.0), ("지수", 1.0), ("급수", 2.0), ("극한", 2.0),
      +            ("math", 1.5), ("calculate", 1.2), ("equation", 2.0), ("proof", 2.0), ("calculus", 2.0),
      +            ("probability", 1.5), ("matrix", 2.0), ("vector", 1.5), ("derivative", 2.0),
      +            ("integral", 2.0), ("theorem", 2.0), ("formula", 1.5), ("algebra", 1.5),
      +        },
      +    };
      +
      +    /// 
      +    /// 사용자 메시지에서 인텐트를 감지합니다.
      +    /// 
      +    /// (카테고리명, 확신도 0.0~1.0). 매칭 없으면 ("general", 0.0).
      +    public static (string Category, double Confidence) Detect(string message)
      +    {
      +        if (string.IsNullOrWhiteSpace(message))
      +            return (Categories.General, 0.0);
      +
      +        var lowerMessage = message.ToLowerInvariant();
      +        var words = lowerMessage.Split(new[] { ' ', '\t', '\n', '\r', ',', '.', '!', '?', ';', ':', '(', ')', '[', ']', '{', '}' },
      +                                       StringSplitOptions.RemoveEmptyEntries);
      +        var wordSet = new HashSet(words);
      +
      +        var scores = new Dictionary();
      +        double maxScore = 0;
      +
      +        foreach (var (category, keywords) in _keywords)
      +        {
      +            double score = 0;
      +            int hits = 0;
      +
      +            foreach (var (keyword, weight) in keywords)
      +            {
      +                var lowerKeyword = keyword.ToLowerInvariant();
      +
      +                // 한국어: substring 매칭 (조사 붙어도 감지)
      +                // 영어: 단어 경계 매칭 (대소문자 무시)
      +                bool matched = IsKorean(keyword)
      +                    ? lowerMessage.Contains(lowerKeyword)
      +                    : wordSet.Contains(lowerKeyword);
      +
      +                if (matched)
      +                {
      +                    score += weight;
      +                    hits++;
      +                }
      +            }
      +
      +            scores[category] = score;
      +            if (score > maxScore) maxScore = score;
      +        }
      +
      +        if (maxScore < 1.0)
      +            return (Categories.General, 0.0);
      +
      +        // 최고 점수 카테고리 선택
      +        var bestCategory = Categories.General;
      +        double bestScore = 0;
      +        foreach (var (cat, score) in scores)
      +        {
      +            if (score > bestScore)
      +            {
      +                bestScore = score;
      +                bestCategory = cat;
      +            }
      +        }
      +
      +        // 확신도: 최고 점수를 정규화 (점수 범위를 0~1로 변환)
      +        // 점수 3.0 이상이면 확신도 0.9+, 2.0이면 0.7~0.8 수준
      +        double confidence = Math.Min(1.0, bestScore / 4.0 + 0.3);
      +
      +        // 2위와의 차이가 작으면 확신도 낮춤 (모호한 경우)
      +        var sortedScores = scores.Values.OrderByDescending(s => s).ToArray();
      +        if (sortedScores.Length >= 2 && sortedScores[1] > 0)
      +        {
      +            double ratio = sortedScores[1] / sortedScores[0];
      +            if (ratio > 0.7) confidence *= 0.8; // 2위가 70% 이상이면 20% 감��
      +        }
      +
      +        return (bestCategory, Math.Round(confidence, 2));
      +    }
      +
      +    /// 문자열에 한국어 문자가 포함되어 있는지 확인.
      +    private static bool IsKorean(string text)
      +    {
      +        foreach (var ch in text)
      +        {
      +            if (ch >= 0xAC00 && ch <= 0xD7A3) return true; // 완성형 한글
      +            if (ch >= 0x3131 && ch <= 0x318E) return true; // 자모
      +        }
      +        return false;
      +    }
      +}
      diff --git a/src/AxCopilot/Services/L10n.cs b/src/AxCopilot/Services/L10n.cs
      new file mode 100644
      index 0000000..32e295c
      --- /dev/null
      +++ b/src/AxCopilot/Services/L10n.cs
      @@ -0,0 +1,314 @@
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 간단한 다국어 문자열 서비스.
      +/// 설정의 Language 값(ko/en/ja/zh/vi)에 따라 UI 문자열을 반환합니다.
      +/// 
      +public static class L10n
      +{
      +    private static string _lang = "ko";
      +
      +    public static void SetLanguage(string lang) =>
      +        _lang = lang?.ToLowerInvariant() ?? "ko";
      +
      +    public static string Get(string key) =>
      +        (_lang switch
      +        {
      +            "en" => _en,
      +            "ja" => _ja,
      +            "zh" => _zh,
      +            "vi" => _vi,
      +            _    => _ko
      +        }).TryGetValue(key, out var v) ? v : _ko.GetValueOrDefault(key, key);
      +
      +    /// 런처 입력창에 표시할 랜덤 안내 문구를 반환합니다.
      +    public static string GetRandomPlaceholder() =>
      +        (_lang switch
      +        {
      +            "en" => _enPlaceholders,
      +            "ja" => _jaPlaceholders,
      +            "zh" => _zhPlaceholders,
      +            "vi" => _viPlaceholders,
      +            _    => _koPlaceholders
      +        }) is { } list ? list[Random.Shared.Next(list.Length)] : Get("placeholder");
      +
      +    // ─── 한국어 랜덤 플레이스홀더 (100종) ───────────────────────────────────────
      +    private static readonly string[] _koPlaceholders =
      +    [
      +        // ── 기본 인사 (15종) ──
      +        "무엇을 도와드릴까요?",
      +        "오늘도 좋은 하루 되세요. 무엇을 찾으시나요?",
      +        "안녕하세요! 어떤 작업을 도와드릴까요?",
      +        "필요하신 것이 있으시면 입력해 주세요.",
      +        "편하게 검색해 보세요.",
      +        "명령어를 입력하시면 바로 실행해 드리겠습니다.",
      +        "무엇이든 빠르게 찾아드리겠습니다.",
      +        "오늘도 효율적인 하루를 응원합니다.",
      +        "언제든 도움이 필요하시면 말씀해 주세요.",
      +        "어떤 파일이나 앱이든 바로 열어드릴 수 있습니다.",
      +        "찾으시는 것을 입력해 보세요.",
      +        "앱, 파일, 명령어 모두 여기서 시작됩니다.",
      +        "빠른 실행을 도와드리겠습니다.",
      +        "키보드 하나로 모든 업무를 시작해 보세요.",
      +        "입력 한 번이면 원하는 앱이 바로 열립니다.",
      +        // ── 계산기 (5종) ──
      +        "= 1920*1080 으로 수식 계산을 해보세요.",
      +        "= 100/3 처럼 입력하면 바로 계산됩니다.",
      +        "= sqrt(144) 같은 함수도 지원합니다.",
      +        "= 2^10 으로 거듭제곱도 계산할 수 있습니다.",
      +        "= (100+200)*1.1 괄호·소수점 모두 지원됩니다.",
      +        // ── 클립보드 (6종) ──
      +        "# 을 입력하면 클립보드 히스토리를 열 수 있습니다.",
      +        "Ctrl+H로 클립보드 히스토리를 바로 열어보세요.",
      +        "Shift+↑↓로 여러 클립보드 항목을 한 번에 합칠 수 있습니다.",
      +        "# 회의 로 클립보드에서 '회의' 관련 항목만 필터링됩니다.",
      +        "클립보드 히스토리는 DPAPI로 안전하게 암호화됩니다.",
      +        "$ upper 로 클립보드 텍스트를 대문자로 변환할 수 있습니다.",
      +        // ── 웹 검색 (5종) ──
      +        "? 키워드 로 웹 검색을 즉시 실행할 수 있습니다.",
      +        "?n 키워드 로 네이버 검색도 가능합니다.",
      +        "? WPF DataBinding 처럼 바로 검색할 수 있습니다.",
      +        "검색 엔진은 설정에서 변경할 수 있습니다.",
      +        "? 환율 달러 같은 검색도 한 번에 가능합니다.",
      +        // ── 시스템 정보 (8종) ──
      +        "info cpu 로 CPU 사용률을 확인해 보세요.",
      +        "* ip 로 내 IP 주소를 빠르게 확인할 수 있습니다.",
      +        "info disk 에서 드라이브를 Enter하면 탐색기가 열립니다.",
      +        "info ram 을 Enter하면 실시간 리소스 모니터를 열 수 있습니다.",
      +        "info battery 로 배터리 상태를 확인할 수 있습니다.",
      +        "info volume 으로 현재 볼륨 레벨을 볼 수 있습니다.",
      +        "info uptime 으로 PC 가동 시간을 확인할 수 있습니다.",
      +        "info 를 입력하면 시스템 전체 상태를 한눈에 볼 수 있습니다.",
      +        // ── 즐겨찾기 (5종) ──
      +        "Ctrl+P로 자주 쓰는 파일을 즐겨찾기에 추가해 보세요.",
      +        "fav 을 입력하면 즐겨찾기 목록을 볼 수 있습니다.",
      +        "Ctrl+B를 누르면 즐겨찾기 목록을 바로 토글할 수 있습니다.",
      +        "자주 여는 폴더를 즐겨찾기에 등록하면 한 번에 열립니다.",
      +        "즐겨찾기에 등록된 항목은 Ctrl+P로 간편하게 해제됩니다.",
      +        // ── 스니펫 (5종) ──
      +        "; 키워드 로 미리 등록한 텍스트를 즉시 확장할 수 있습니다.",
      +        "스니펫은 런처 없이 어디서든 자동 확장됩니다.",
      +        "자주 쓰는 이메일 서명을 스니펫으로 등록해 보세요.",
      +        "스니펫에 {{date}} 변수를 넣으면 오늘 날짜가 자동 삽입됩니다.",
      +        "설정 › 스니펫에서 키워드·내용을 자유롭게 관리하세요.",
      +        // ── 워크스페이스 (4종) ──
      +        "~save 이름 으로 현재 창 배치를 저장해 보세요.",
      +        "~이름 으로 저장된 창 배치를 한 번에 복원할 수 있습니다.",
      +        "여러 모니터 창 배치를 워크스페이스로 관리해 보세요.",
      +        "~list 로 저장된 워크스페이스 목록을 확인할 수 있습니다.",
      +        // ── 색상 (4종) ──
      +        "color #FF5733 으로 색상 코드를 변환할 수 있습니다.",
      +        "pick 을 입력하면 화면에서 색상을 추출할 수 있습니다.",
      +        "color rgb(75,94,252) 처럼 RGB 형식도 지원됩니다.",
      +        "추출한 색상은 HEX·RGB·HSL로 자동 변환됩니다.",
      +        // ── 날짜 계산 (4종) ──
      +        "date +30 으로 30일 후 날짜를 계산할 수 있습니다.",
      +        "date -7 로 일주일 전 날짜도 바로 확인됩니다.",
      +        "date 로 오늘 날짜와 요일을 바로 확인할 수 있습니다.",
      +        "date +365 로 1년 후 날짜도 계산할 수 있습니다.",
      +        // ── 파일 액션 (6종) ──
      +        "파일을 선택하고 → 키를 누르면 다양한 액션을 사용할 수 있습니다.",
      +        "Ctrl+Shift+E로 선택한 파일을 탐색기에서 바로 열 수 있습니다.",
      +        "Ctrl+T로 해당 경로에서 터미널을 열 수 있습니다.",
      +        "Ctrl+C로 파일 이름만 복사, Ctrl+Shift+C로 전체 경로를 복사합니다.",
      +        "Ctrl+Enter로 관리자 권한으로 실행할 수 있습니다.",
      +        "Alt+Enter로 파일 속성 대화상자를 열 수 있습니다.",
      +        // ── 단축키 (5종) ──
      +        "F1 을 누르면 전체 도움말을 확인할 수 있습니다.",
      +        "Ctrl+K로 단축키 참조 창을 열어보세요.",
      +        "Ctrl+1~9로 원하는 번호의 항목을 즉시 실행할 수 있습니다.",
      +        "Ctrl+L로 입력창을 즉시 비울 수 있습니다.",
      +        "Ctrl+, 로 설정 창을 바로 열 수 있습니다.",
      +        // ── 터미널 (4종) ──
      +        "> ipconfig 로 터미널 명령을 바로 실행할 수 있습니다.",
      +        "> ping google.com 같은 네트워크 진단도 가능합니다.",
      +        "> dir 로 현재 디렉터리 목록을 확인할 수 있습니다.",
      +        "^ notepad 로 메모장을 직접 실행할 수 있습니다.",
      +        // ── 캡처 (4종) ──
      +        "cap screen 으로 화면을 캡처할 수 있습니다.",
      +        "cap region 으로 원하는 영역만 캡처할 수 있습니다.",
      +        "cap window 로 현재 활성 창만 캡처할 수 있습니다.",
      +        "설정에서 캡처 글로벌 단축키를 지정할 수 있습니다.",
      +        // ── 시스템 명령 (5종) ──
      +        "/ lock 으로 화면을 즉시 잠글 수 있습니다.",
      +        "/ shutdown 으로 PC를 종료할 수 있습니다.",
      +        "/ restart 로 PC를 재시작할 수 있습니다.",
      +        "/ sleep 으로 절전 모드로 전환할 수 있습니다.",
      +        "/ recycle 로 휴지통을 비울 수 있습니다.",
      +        // ── 기타 유틸 (10종) ──
      +        "encode base64 hello 로 인코딩/디코딩이 됩니다.",
      +        "json 을 입력하면 클립보드 JSON을 정리해 줍니다.",
      +        "emoji 웃음 으로 이모지를 검색할 수 있습니다.",
      +        "kill 프로세스명 으로 프로세스를 종료할 수 있습니다.",
      +        "recent 를 입력하면 최근 실행 목록을 확인할 수 있습니다.",
      +        "note 내용 으로 빠른 메모를 저장할 수 있습니다.",
      +        "journal 오늘 할 일 로 업무 일지를 기록할 수 있습니다.",
      +        "pipe upper | trim 으로 텍스트를 파이프라인 처리할 수 있습니다.",
      +        "diff 로 클립보드의 두 텍스트를 비교할 수 있습니다.",
      +        "stats 로 클립보드 텍스트의 글자수·단어수를 확인합니다.",
      +        // ── 폴더/URL 별칭 (4종) ──
      +        "cd desktop 으로 바탕화면 폴더를 바로 열 수 있습니다.",
      +        "@blog 으로 등록된 URL을 즉시 열 수 있습니다.",
      +        "cd 경로 로 원하는 폴더를 바로 열 수 있습니다.",
      +        "Ctrl+D로 다운로드 폴더를 바로 열 수 있습니다.",
      +        // ── 창 관리 (4종) ──
      +        "win chrome 으로 크롬 창을 바로 전환할 수 있습니다.",
      +        "snap left 로 현재 창을 왼쪽에 정렬할 수 있습니다.",
      +        "snap grid 로 여러 창을 격자 배치할 수 있습니다.",
      +        "Tab 키로 선택한 항목의 제목을 자동완성할 수 있습니다.",
      +        // ── 테마 (2종) ──
      +        "설정에서 8종 테마(Dark·Light·OLED 등)를 선택할 수 있습니다.",
      +        "커스텀 테마로 나만의 색상 조합을 만들어 보세요.",
      +        // ── AX Agent (8종) ──
      +        "! 질문 으로 AX Agent에게 바로 물어볼 수 있습니다.",
      +        "! 오늘 회의 내용 정리해줘 처럼 AX Agent과 대화해 보세요.",
      +        "AX Agent은 ! 를 입력하는 것만으로 시작됩니다.",
      +        "! 를 입력하면 AX Agent이 업무를 도와드립니다.",
      +        "AX Agent이 직관적으로 답변합니다. ! 로 바로 시작해 보세요.",
      +        "! 이메일 초안 작성해줘 같은 요청도 가능합니다.",
      +        "AX Agent 대화 내역은 암호화되어 안전하게 보관됩니다.",
      +        "! 보고서 요약해줘 처럼 업무 보조에 활용해 보세요.",
      +        // ── AX Agent 기능 안내 (8종) ──
      +        "AX Agent에서 코드 구문 강조와 마크다운 렌더링을 지원합니다.",
      +        "Ollama/vLLM/Gemini/Claude 4종 LLM을 지원합니다.",
      +        "AX Agent 대화에서 프롬프트 카드로 AI 역할을 바로 지정할 수 있습니다.",
      +        "AX Agent에서 대화를 분류하고 검색할 수 있습니다. ! 로 시작하세요!",
      +        "AX Agent은 토큰 사용량과 응답 시간을 실시간으로 표시합니다.",
      +        "AX Agent에서 타이핑 효과로 자연스러운 대화를 경험해 보세요.",
      +        "대화 제목을 클릭하면 바로 이름을 변경할 수 있습니다.",
      +        "프롬프트 템플릿으로 자주 쓰는 지시를 저장해 보세요.",
      +        // ── 캡처 업데이트 (3종) ──
      +        "cap 모드에서 Shift+Enter로 지연 캡처(3/5/10초)를 할 수 있습니다.",
      +        "cap region 으로 원하는 영역만 정확하게 캡처할 수 있습니다.",
      +        "지연 캡처로 메뉴가 열린 상태도 캡처할 수 있습니다.",
      +    ];
      +
      +    private static readonly string[] _enPlaceholders =
      +    [
      +        "What can I help you with?",
      +        "Type anything to search or run commands.",
      +        "Try = 1920*1080 for quick calculations.",
      +        "Press # to browse clipboard history.",
      +        "Type ? keyword to search the web instantly.",
      +        "Press F1 for the full help guide.",
      +        "Use Ctrl+P to bookmark your favorite files.",
      +        "Type info cpu to check system resources.",
      +    ];
      +
      +    private static readonly string[] _jaPlaceholders =
      +    [
      +        "何をお手伝いしますか?",
      +        "検索やコマンドを入力してください。",
      +        "= 1920*1080 で計算ができます。",
      +        "# でクリップボード履歴を表示できます。",
      +        "F1 でヘルプを表示できます。",
      +    ];
      +
      +    private static readonly string[] _zhPlaceholders =
      +    [
      +        "我能帮你做什么?",
      +        "输入内容进行搜索或执行命令。",
      +        "试试 = 1920*1080 进行快速计算。",
      +        "按 # 浏览剪贴板历史。",
      +        "按 F1 查看完整帮助。",
      +    ];
      +
      +    private static readonly string[] _viPlaceholders =
      +    [
      +        "Tôi có thể giúp gì cho bạn?",
      +        "Nhập nội dung để tìm kiếm hoặc chạy lệnh.",
      +        "Thử = 1920*1080 để tính toán nhanh.",
      +        "Nhấn # để xem lịch sử clipboard.",
      +        "Nhấn F1 để xem hướng dẫn đầy đủ.",
      +    ];
      +
      +    // ─── 한국어 (기본) ────────────────────────────────────────────────────────
      +    private static readonly Dictionary _ko = new()
      +    {
      +        ["placeholder"]            = "무엇을 도와드릴까요?",
      +        ["loading"]                = "검색 중...",
      +        ["no_results"]             = "결과 없음",
      +        ["help_copy_hint"]         = "Enter로 예시를 클립보드에 복사",
      +        ["help_total"]             = "총 {0}개 명령어 · {1}개 단축키  ·  Enter → 전체 기능 창 열기",
      +        ["clipboard_empty"]        = "클립보드 히스토리가 없습니다",
      +        ["clipboard_empty_hint"]   = "텍스트를 복사하면 이 곳에 기록됩니다",
      +        ["merge_hint"]             = "✓ {0}개 선택됨  ·  Shift+Enter로 합치기  ·  Esc로 취소",
      +        ["action_breadcrumb"]      = "파일 액션",
      +        ["large_type_hint"]        = "Shift+Enter: Large Type",
      +        ["settings_hotkey"]        = "단축키",
      +        ["settings_theme"]         = "테마",
      +        ["settings_language"]      = "언어",
      +    };
      +
      +    // ─── English ──────────────────────────────────────────────────────────────
      +    private static readonly Dictionary _en = new()
      +    {
      +        ["placeholder"]            = "What can I help you with?",
      +        ["loading"]                = "Searching...",
      +        ["no_results"]             = "No results",
      +        ["help_copy_hint"]         = "Press Enter to copy example to clipboard",
      +        ["help_total"]             = "{0} commands · {1} shortcuts  ·  Enter → Show all features",
      +        ["clipboard_empty"]        = "No clipboard history",
      +        ["clipboard_empty_hint"]   = "Copy text and it will appear here",
      +        ["merge_hint"]             = "✓ {0} selected  ·  Shift+Enter to merge  ·  Esc to cancel",
      +        ["action_breadcrumb"]      = "File Action",
      +        ["large_type_hint"]        = "Shift+Enter: Large Type",
      +        ["settings_hotkey"]        = "Hotkey",
      +        ["settings_theme"]         = "Theme",
      +        ["settings_language"]      = "Language",
      +    };
      +
      +    // ─── 日本語 ───────────────────────────────────────────────────────────────
      +    private static readonly Dictionary _ja = new()
      +    {
      +        ["placeholder"]            = "何をお手伝いしますか?",
      +        ["loading"]                = "検索中...",
      +        ["no_results"]             = "結果なし",
      +        ["help_copy_hint"]         = "Enterで例をクリップボードにコピー",
      +        ["help_total"]             = "コマンド {0}個 · ショートカット {1}個  ·  Enter → 全機能表示",
      +        ["clipboard_empty"]        = "クリップボード履歴がありません",
      +        ["clipboard_empty_hint"]   = "テキストをコピーするとここに表示されます",
      +        ["merge_hint"]             = "✓ {0}件選択  ·  Shift+Enterで結合  ·  Escでキャンセル",
      +        ["action_breadcrumb"]      = "ファイルアクション",
      +        ["large_type_hint"]        = "Shift+Enter: 拡大表示",
      +        ["settings_hotkey"]        = "ショートカット",
      +        ["settings_theme"]         = "テーマ",
      +        ["settings_language"]      = "言語",
      +    };
      +
      +    // ─── 中文 ─────────────────────────────────────────────────────────────────
      +    private static readonly Dictionary _zh = new()
      +    {
      +        ["placeholder"]            = "我能帮你做什么?",
      +        ["loading"]                = "搜索中...",
      +        ["no_results"]             = "无结果",
      +        ["help_copy_hint"]         = "按 Enter 复制示例到剪贴板",
      +        ["help_total"]             = "{0} 个命令 · {1} 个快捷键  ·  Enter → 显示全部功能",
      +        ["clipboard_empty"]        = "没有剪贴板历史",
      +        ["clipboard_empty_hint"]   = "复制文本后将显示在此处",
      +        ["merge_hint"]             = "✓ 已选 {0} 项  ·  Shift+Enter 合并  ·  Esc 取消",
      +        ["action_breadcrumb"]      = "文件操作",
      +        ["large_type_hint"]        = "Shift+Enter: 大字显示",
      +        ["settings_hotkey"]        = "热键",
      +        ["settings_theme"]         = "主题",
      +        ["settings_language"]      = "语言",
      +    };
      +
      +    // ─── Tiếng Việt ───────────────────────────────────────────────────────────
      +    private static readonly Dictionary _vi = new()
      +    {
      +        ["placeholder"]            = "Tôi có thể giúp gì cho bạn?",
      +        ["loading"]                = "Đang tìm kiếm...",
      +        ["no_results"]             = "Không có kết quả",
      +        ["help_copy_hint"]         = "Nhấn Enter để sao chép ví dụ vào clipboard",
      +        ["help_total"]             = "{0} lệnh · {1} phím tắt  ·  Enter → Xem tất cả tính năng",
      +        ["clipboard_empty"]        = "Không có lịch sử clipboard",
      +        ["clipboard_empty_hint"]   = "Sao chép văn bản và nó sẽ xuất hiện ở đây",
      +        ["merge_hint"]             = "✓ Đã chọn {0} mục  ·  Shift+Enter để gộp  ·  Esc hủy",
      +        ["action_breadcrumb"]      = "Hành động tệp",
      +        ["large_type_hint"]        = "Shift+Enter: Hiển thị lớn",
      +        ["settings_hotkey"]        = "Phím tắt",
      +        ["settings_theme"]         = "Giao diện",
      +        ["settings_language"]      = "Ngôn ngữ",
      +    };
      +}
      diff --git a/src/AxCopilot/Services/LlmService.ToolUse.cs b/src/AxCopilot/Services/LlmService.ToolUse.cs
      new file mode 100644
      index 0000000..6faa092
      --- /dev/null
      +++ b/src/AxCopilot/Services/LlmService.ToolUse.cs
      @@ -0,0 +1,719 @@
      +using System.Net.Http;
      +using System.Runtime.CompilerServices;
      +using System.Text;
      +using System.Text.Json;
      +using AxCopilot.Models;
      +using AxCopilot.Services.Agent;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// LlmService의 Function Calling (tool_use) 확장.
      +/// Claude tool_use, Gemini function_calling 프로토콜을 지원합니다.
      +/// 기존 SendAsync/StreamAsync는 변경하지 않고, 에이전트 전용 메서드를 추가합니다.
      +/// 
      +public partial class LlmService
      +{
      +    /// LLM 응답에서 파싱된 컨텐츠 블록.
      +    public class ContentBlock
      +    {
      +        public string Type { get; init; } = "text"; // "text" | "tool_use"
      +        public string Text { get; init; } = "";      // text 타입일 때
      +        public string ToolName { get; init; } = "";   // tool_use 타입일 때
      +        public string ToolId { get; init; } = "";     // tool_use ID
      +        public JsonElement? ToolInput { get; init; }   // tool_use 파라미터
      +    }
      +
      +    /// 도구 정의를 포함하여 LLM에 요청하고, 텍스트 + tool_use 블록을 파싱하여 반환합니다.
      +    public async Task> SendWithToolsAsync(
      +        List messages,
      +        IReadOnlyCollection tools,
      +        CancellationToken ct = default)
      +    {
      +        var activeService = ResolveService();
      +        return activeService.ToLowerInvariant() switch
      +        {
      +            "claude" => await SendClaudeWithToolsAsync(messages, tools, ct),
      +            "gemini" => await SendGeminiWithToolsAsync(messages, tools, ct),
      +            "ollama" or "vllm" => await SendOpenAiWithToolsAsync(messages, tools, ct),
      +            _ => throw new NotSupportedException($"서비스 '{activeService}'는 아직 Function Calling을 지원하지 않습니다.")
      +        };
      +    }
      +
      +    /// 도구 실행 결과를 LLM에 피드백하기 위한 메시지를 생성합니다.
      +    public static ChatMessage CreateToolResultMessage(string toolId, string toolName, string result)
      +    {
      +        // Claude: role=user, content=[{type:"tool_result", tool_use_id, content}]
      +        // 내부적으로는 JSON으로 인코딩하여 Content에 저장
      +        var payload = JsonSerializer.Serialize(new
      +        {
      +            type = "tool_result",
      +            tool_use_id = toolId,
      +            tool_name = toolName,
      +            content = result
      +        });
      +        return new ChatMessage
      +        {
      +            Role = "user",
      +            Content = payload,
      +            Timestamp = DateTime.Now,
      +        };
      +    }
      +
      +    // ─── Claude Function Calling ───────────────────────────────────────
      +
      +    private async Task> SendClaudeWithToolsAsync(
      +        List messages, IReadOnlyCollection tools, CancellationToken ct)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var apiKey = llm.ApiKey;
      +        if (string.IsNullOrEmpty(apiKey))
      +            throw new InvalidOperationException("Claude API 키가 설정되지 않았습니다.");
      +
      +        var body = BuildClaudeToolBody(messages, tools);
      +        var json = JsonSerializer.Serialize(body);
      +
      +        using var req = new HttpRequestMessage(HttpMethod.Post, "https://api.anthropic.com/v1/messages");
      +        req.Content = new StringContent(json, Encoding.UTF8, "application/json");
      +        req.Headers.Add("x-api-key", apiKey);
      +        req.Headers.Add("anthropic-version", "2023-06-01");
      +
      +        using var resp = await _http.SendAsync(req, ct);
      +        if (!resp.IsSuccessStatusCode)
      +        {
      +            var errBody = await resp.Content.ReadAsStringAsync(ct);
      +            throw new HttpRequestException(ClassifyHttpError(resp, errBody));
      +        }
      +
      +        var respJson = await resp.Content.ReadAsStringAsync(ct);
      +        using var doc = JsonDocument.Parse(respJson);
      +        var root = doc.RootElement;
      +
      +        // 토큰 사용량
      +        if (root.TryGetProperty("usage", out var usage))
      +            TryParseClaudeUsageFromElement(usage);
      +
      +        // 컨텐츠 블록 파싱
      +        var blocks = new List();
      +        if (root.TryGetProperty("content", out var content))
      +        {
      +            foreach (var block in content.EnumerateArray())
      +            {
      +                var type = block.TryGetProperty("type", out var tp) ? tp.GetString() : "";
      +                if (type == "text")
      +                {
      +                    blocks.Add(new ContentBlock
      +                    {
      +                        Type = "text",
      +                        Text = block.TryGetProperty("text", out var txt) ? txt.GetString() ?? "" : ""
      +                    });
      +                }
      +                else if (type == "tool_use")
      +                {
      +                    blocks.Add(new ContentBlock
      +                    {
      +                        Type = "tool_use",
      +                        ToolName = block.TryGetProperty("name", out var nm) ? nm.GetString() ?? "" : "",
      +                        ToolId = block.TryGetProperty("id", out var bid) ? bid.GetString() ?? "" : "",
      +                        ToolInput = block.TryGetProperty("input", out var inp) ? inp.Clone() : null
      +                    });
      +                }
      +            }
      +        }
      +
      +        return blocks;
      +    }
      +
      +    private object BuildClaudeToolBody(List messages, IReadOnlyCollection tools)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var msgs = new List();
      +
      +        foreach (var m in messages)
      +        {
      +            if (m.Role == "system") continue;
      +
      +            // tool_result 메시지인지 확인
      +            if (m.Role == "user" && m.Content.StartsWith("{\"type\":\"tool_result\""))
      +            {
      +                try
      +                {
      +                    using var doc = JsonDocument.Parse(m.Content);
      +                    var root = doc.RootElement;
      +                    msgs.Add(new
      +                    {
      +                        role = "user",
      +                        content = new object[]
      +                        {
      +                            new
      +                            {
      +                                type = "tool_result",
      +                                tool_use_id = root.TryGetProperty("tool_use_id", out var tuid) ? tuid.GetString() : "",
      +                                content = root.TryGetProperty("content", out var tcont) ? tcont.GetString() : ""
      +                            }
      +                        }
      +                    });
      +                    continue;
      +                }
      +                catch (Exception) { /* 파싱 실패시 일반 메시지로 처리 */ }
      +            }
      +
      +            // assistant 메시지에 tool_use 블록이 포함된 경우 (에이전트 루프)
      +            if (m.Role == "assistant" && m.Content.StartsWith("{\"_tool_use_blocks\""))
      +            {
      +                try
      +                {
      +                    using var doc = JsonDocument.Parse(m.Content);
      +                    if (!doc.RootElement.TryGetProperty("_tool_use_blocks", out var blocksArr)) throw new Exception();
      +                    var contentList = new List();
      +                    foreach (var b in blocksArr.EnumerateArray())
      +                    {
      +                        var bType = b.TryGetProperty("type", out var bt) ? bt.GetString() : "";
      +                        if (bType == "text")
      +                            contentList.Add(new { type = "text", text = b.TryGetProperty("text", out var tx) ? tx.GetString() ?? "" : "" });
      +                        else if (bType == "tool_use")
      +                            contentList.Add(new
      +                            {
      +                                type = "tool_use",
      +                                id = b.TryGetProperty("id", out var bid) ? bid.GetString() ?? "" : "",
      +                                name = b.TryGetProperty("name", out var nm) ? nm.GetString() ?? "" : "",
      +                                input = b.TryGetProperty("input", out var inp) ? (object)inp.Clone() : new { }
      +                            });
      +                    }
      +                    msgs.Add(new { role = "assistant", content = contentList });
      +                    continue;
      +                }
      +                catch (Exception) { /* 파싱 실패시 일반 메시지로 처리 */ }
      +            }
      +
      +            // Claude Vision: 이미지가 있으면 content를 배열로 변환
      +            if (m.Images?.Count > 0 && m.Role == "user")
      +            {
      +                var contentParts = new List();
      +                foreach (var img in m.Images)
      +                    contentParts.Add(new { type = "image", source = new { type = "base64", media_type = img.MimeType, data = img.Base64 } });
      +                contentParts.Add(new { type = "text", text = m.Content });
      +                msgs.Add(new { role = m.Role, content = contentParts });
      +            }
      +            else
      +            {
      +                msgs.Add(new { role = m.Role, content = m.Content });
      +            }
      +        }
      +
      +        // 도구 정의
      +        var toolDefs = tools.Select(t => new
      +        {
      +            name = t.Name,
      +            description = t.Description,
      +            input_schema = new
      +            {
      +                type = "object",
      +                properties = t.Parameters.Properties.ToDictionary(
      +                    kv => kv.Key,
      +                    kv => BuildPropertySchema(kv.Value, false)),
      +                required = t.Parameters.Required
      +            }
      +        }).ToArray();
      +
      +        // 시스템 프롬프트
      +        var systemPrompt = messages.FirstOrDefault(m => m.Role == "system")?.Content ?? _systemPrompt;
      +        var activeModel = ResolveModel();
      +
      +        if (!string.IsNullOrEmpty(systemPrompt))
      +        {
      +            return new
      +            {
      +                model = activeModel,
      +                max_tokens = Math.Max(llm.MaxContextTokens, 4096),
      +                temperature = llm.Temperature,
      +                system = systemPrompt,
      +                messages = msgs,
      +                tools = toolDefs,
      +                stream = false
      +            };
      +        }
      +
      +        return new
      +        {
      +            model = activeModel,
      +            max_tokens = Math.Max(llm.MaxContextTokens, 4096),
      +            temperature = llm.Temperature,
      +            messages = msgs,
      +            tools = toolDefs,
      +            stream = false
      +        };
      +    }
      +
      +    // ─── Gemini Function Calling ───────────────────────────────────────
      +
      +    private async Task> SendGeminiWithToolsAsync(
      +        List messages, IReadOnlyCollection tools, CancellationToken ct)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var apiKey = ResolveApiKeyForService("gemini");
      +        if (string.IsNullOrEmpty(apiKey))
      +            throw new InvalidOperationException("Gemini API 키가 설정되지 않았습니다.");
      +
      +        var activeModel = ResolveModel();
      +        var body = BuildGeminiToolBody(messages, tools);
      +        var url = $"https://generativelanguage.googleapis.com/v1beta/models/{activeModel}:generateContent?key={apiKey}";
      +        var json = JsonSerializer.Serialize(body);
      +
      +        using var content = new StringContent(json, Encoding.UTF8, "application/json");
      +        using var resp = await _http.PostAsync(url, content, ct);
      +        if (!resp.IsSuccessStatusCode)
      +        {
      +            var errBody = await resp.Content.ReadAsStringAsync(ct);
      +            throw new HttpRequestException($"Gemini API 오류 ({resp.StatusCode}): {errBody}");
      +        }
      +
      +        var respJson = await resp.Content.ReadAsStringAsync(ct);
      +        using var doc = JsonDocument.Parse(respJson);
      +        var root = doc.RootElement;
      +
      +        TryParseGeminiUsage(root);
      +
      +        var blocks = new List();
      +        if (root.TryGetProperty("candidates", out var candidates) && candidates.GetArrayLength() > 0)
      +        {
      +            var firstCandidate = candidates[0];
      +            if (firstCandidate.TryGetProperty("content", out var contentObj) &&
      +                contentObj.TryGetProperty("parts", out var parts))
      +            {
      +                foreach (var part in parts.EnumerateArray())
      +                {
      +                    if (part.TryGetProperty("text", out var text))
      +                    {
      +                        blocks.Add(new ContentBlock { Type = "text", Text = text.GetString() ?? "" });
      +                    }
      +                    else if (part.TryGetProperty("functionCall", out var fc))
      +                    {
      +                        blocks.Add(new ContentBlock
      +                        {
      +                            Type = "tool_use",
      +                            ToolName = fc.TryGetProperty("name", out var fcName) ? fcName.GetString() ?? "" : "",
      +                            ToolId = Guid.NewGuid().ToString("N")[..12],
      +                            ToolInput = fc.TryGetProperty("args", out var a) ? a.Clone() : null
      +                        });
      +                    }
      +                }
      +            }
      +        }
      +
      +        return blocks;
      +    }
      +
      +    private object BuildGeminiToolBody(List messages, IReadOnlyCollection tools)
      +    {
      +        var contents = new List();
      +        foreach (var m in messages)
      +        {
      +            if (m.Role == "system") continue;
      +            var role = m.Role == "assistant" ? "model" : "user";
      +
      +            // tool_result 메시지 처리
      +            if (m.Role == "user" && m.Content.StartsWith("{\"type\":\"tool_result\""))
      +            {
      +                try
      +                {
      +                    using var doc = JsonDocument.Parse(m.Content);
      +                    var root = doc.RootElement;
      +                    var toolName = root.TryGetProperty("tool_name", out var tn) ? tn.GetString() ?? "" : "";
      +                    var toolContent = root.TryGetProperty("content", out var tc) ? tc.GetString() ?? "" : "";
      +                    contents.Add(new
      +                    {
      +                        role = "function",
      +                        parts = new object[]
      +                        {
      +                            new
      +                            {
      +                                functionResponse = new
      +                                {
      +                                    name = toolName,
      +                                    response = new { result = toolContent }
      +                                }
      +                            }
      +                        }
      +                    });
      +                    continue;
      +                }
      +                catch (Exception) { }
      +            }
      +
      +            // assistant 메시지에 tool_use 블록이 포함된 경우 (에이전트 루프)
      +            if (m.Role == "assistant" && m.Content.StartsWith("{\"_tool_use_blocks\""))
      +            {
      +                try
      +                {
      +                    using var doc = JsonDocument.Parse(m.Content);
      +                    if (doc.RootElement.TryGetProperty("_tool_use_blocks", out var blocksArr))
      +                    {
      +                        var parts = new List();
      +                        foreach (var b in blocksArr.EnumerateArray())
      +                        {
      +                            var bType = b.TryGetProperty("type", out var bt) ? bt.GetString() : "";
      +                            if (bType == "text")
      +                                parts.Add(new { text = b.TryGetProperty("text", out var tx) ? tx.GetString() ?? "" : "" });
      +                            else if (bType == "tool_use")
      +                                parts.Add(new
      +                                {
      +                                    functionCall = new
      +                                    {
      +                                        name = b.TryGetProperty("name", out var nm) ? nm.GetString() ?? "" : "",
      +                                        args = b.TryGetProperty("input", out var inp) ? (object)inp.Clone() : new { }
      +                                    }
      +                                });
      +                        }
      +                        contents.Add(new { role = "model", parts });
      +                        continue;
      +                    }
      +                }
      +                catch (Exception) { }
      +            }
      +
      +            // Gemini Vision: 이미지가 있으면 parts에 inlineData 추가
      +            if (m.Images?.Count > 0 && m.Role == "user")
      +            {
      +                var imgParts = new List { new { text = m.Content } };
      +                foreach (var img in m.Images)
      +                    imgParts.Add(new { inlineData = new { mimeType = img.MimeType, data = img.Base64 } });
      +                contents.Add(new { role, parts = imgParts });
      +            }
      +            else
      +            {
      +                contents.Add(new { role, parts = new[] { new { text = m.Content } } });
      +            }
      +        }
      +
      +        // 도구 정의 (Gemini function_declarations 형식)
      +        var funcDecls = tools.Select(t => new
      +        {
      +            name = t.Name,
      +            description = t.Description,
      +            parameters = new
      +            {
      +                type = "OBJECT",
      +                properties = t.Parameters.Properties.ToDictionary(
      +                    kv => kv.Key,
      +                    kv => BuildPropertySchema(kv.Value, true)),
      +                required = t.Parameters.Required
      +            }
      +        }).ToArray();
      +
      +        var systemInstruction = messages.FirstOrDefault(m => m.Role == "system");
      +
      +        var body = new Dictionary
      +        {
      +            ["contents"] = contents,
      +            ["tools"] = new[] { new { function_declarations = funcDecls } },
      +            ["generationConfig"] = new
      +            {
      +                temperature = _settings.Settings.Llm.Temperature,
      +                maxOutputTokens = _settings.Settings.Llm.MaxContextTokens,
      +            }
      +        };
      +
      +        if (systemInstruction != null)
      +        {
      +            body["systemInstruction"] = new
      +            {
      +                parts = new[] { new { text = systemInstruction.Content } }
      +            };
      +        }
      +
      +        return body;
      +    }
      +
      +    // ─── OpenAI Compatible (Ollama / vLLM) Function Calling ──────────
      +
      +    private async Task> SendOpenAiWithToolsAsync(
      +        List messages, IReadOnlyCollection tools, CancellationToken ct)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var activeService = ResolveService();
      +        var body = BuildOpenAiToolBody(messages, tools);
      +
      +        // 등록 모델의 커스텀 엔드포인트 우선 사용 (ResolveServerInfo)
      +        var (resolvedEp, _) = ResolveServerInfo();
      +        var endpoint = string.IsNullOrEmpty(resolvedEp)
      +            ? ResolveEndpointForService(activeService)
      +            : resolvedEp;
      +
      +        var url = activeService.ToLowerInvariant() == "ollama"
      +            ? endpoint.TrimEnd('/') + "/api/chat"
      +            : endpoint.TrimEnd('/') + "/v1/chat/completions";
      +        var json = JsonSerializer.Serialize(body);
      +
      +        using var req = new HttpRequestMessage(HttpMethod.Post, url)
      +        {
      +            Content = new StringContent(json, Encoding.UTF8, "application/json")
      +        };
      +        // CP4D 또는 Bearer 인증 적용
      +        await ApplyAuthHeaderAsync(req, ct);
      +
      +        using var resp = await _http.SendAsync(req, ct);
      +        if (!resp.IsSuccessStatusCode)
      +        {
      +            var errBody = await resp.Content.ReadAsStringAsync(ct);
      +            var detail = ExtractErrorDetail(errBody);
      +            LogService.Warn($"[ToolUse] {activeService} API 오류 ({resp.StatusCode}): {errBody}");
      +
      +            // 400 BadRequest → 도구 없이 일반 응답으로 폴백 시도
      +            if ((int)resp.StatusCode == 400)
      +                throw new ToolCallNotSupportedException(
      +                    $"{activeService} API 오류 ({resp.StatusCode}): {detail}");
      +
      +            throw new HttpRequestException($"{activeService} API 오류 ({resp.StatusCode}): {detail}");
      +        }
      +
      +        var respJson = await resp.Content.ReadAsStringAsync(ct);
      +        using var doc = JsonDocument.Parse(respJson);
      +        var root = doc.RootElement;
      +
      +        TryParseOpenAiUsage(root);
      +
      +        var blocks = new List();
      +
      +        // Ollama 형식: root.message
      +        // OpenAI 형식: root.choices[0].message
      +        JsonElement message;
      +        if (root.TryGetProperty("message", out var ollamaMsg))
      +            message = ollamaMsg;
      +        else if (root.TryGetProperty("choices", out var choices) && choices.GetArrayLength() > 0)
      +            message = choices[0].TryGetProperty("message", out var choiceMsg) ? choiceMsg : default;
      +        else
      +            return blocks;
      +
      +        // 텍스트 응답
      +        if (message.TryGetProperty("content", out var content))
      +        {
      +            var text = content.GetString();
      +            if (!string.IsNullOrWhiteSpace(text))
      +                blocks.Add(new ContentBlock { Type = "text", Text = text });
      +        }
      +
      +        // 도구 호출 (tool_calls 배열)
      +        if (message.TryGetProperty("tool_calls", out var toolCalls))
      +        {
      +            foreach (var tc in toolCalls.EnumerateArray())
      +            {
      +                if (!tc.TryGetProperty("function", out var func)) continue;
      +
      +                // arguments: 표준(OpenAI)은 JSON 문자열, Ollama/qwen 등은 JSON 객체를 직접 반환하기도 함
      +                JsonElement? parsedArgs = null;
      +                if (func.TryGetProperty("arguments", out var argsEl))
      +                {
      +                    if (argsEl.ValueKind == JsonValueKind.String)
      +                    {
      +                        // 표준: 문자열로 감싸진 JSON → 파싱
      +                        try
      +                        {
      +                            using var argsDoc = JsonDocument.Parse(argsEl.GetString() ?? "{}");
      +                            parsedArgs = argsDoc.RootElement.Clone();
      +                        }
      +                        catch (Exception) { parsedArgs = null; }
      +                    }
      +                    else if (argsEl.ValueKind == JsonValueKind.Object || argsEl.ValueKind == JsonValueKind.Array)
      +                    {
      +                        // Ollama/qwen 방식: 이미 JSON 객체 — 그대로 사용
      +                        parsedArgs = argsEl.Clone();
      +                    }
      +                }
      +
      +                blocks.Add(new ContentBlock
      +                {
      +                    Type = "tool_use",
      +                    ToolName = func.TryGetProperty("name", out var fnm) ? fnm.GetString() ?? "" : "",
      +                    ToolId = tc.TryGetProperty("id", out var id) ? id.GetString() ?? Guid.NewGuid().ToString("N")[..12] : Guid.NewGuid().ToString("N")[..12],
      +                    ToolInput = parsedArgs,
      +                });
      +            }
      +        }
      +
      +        return blocks;
      +    }
      +
      +    private object BuildOpenAiToolBody(List messages, IReadOnlyCollection tools)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var msgs = new List();
      +
      +        foreach (var m in messages)
      +        {
      +            // tool_result 메시지 → OpenAI tool 응답 형식
      +            if (m.Role == "user" && m.Content.StartsWith("{\"type\":\"tool_result\""))
      +            {
      +                try
      +                {
      +                    using var doc = JsonDocument.Parse(m.Content);
      +                    var root = doc.RootElement;
      +                    msgs.Add(new
      +                    {
      +                        role = "tool",
      +                        tool_call_id = root.GetProperty("tool_use_id").GetString(),
      +                        content = root.GetProperty("content").GetString(),
      +                    });
      +                    continue;
      +                }
      +                catch (Exception) { }
      +            }
      +
      +            // assistant 메시지에 tool_use 블록이 포함된 경우
      +            if (m.Role == "assistant" && m.Content.StartsWith("{\"_tool_use_blocks\""))
      +            {
      +                try
      +                {
      +                    using var doc = JsonDocument.Parse(m.Content);
      +                    var blocksArr = doc.RootElement.GetProperty("_tool_use_blocks");
      +                    var textContent = "";
      +                    var toolCallsList = new List();
      +                    foreach (var b in blocksArr.EnumerateArray())
      +                    {
      +                        var bType = b.GetProperty("type").GetString();
      +                        if (bType == "text")
      +                            textContent = b.GetProperty("text").GetString() ?? "";
      +                        else if (bType == "tool_use")
      +                        {
      +                            var argsJson = b.TryGetProperty("input", out var inp) ? inp.GetRawText() : "{}";
      +                            toolCallsList.Add(new
      +                            {
      +                                id = b.GetProperty("id").GetString() ?? "",
      +                                type = "function",
      +                                function = new
      +                                {
      +                                    name = b.GetProperty("name").GetString() ?? "",
      +                                    arguments = argsJson,
      +                                }
      +                            });
      +                        }
      +                    }
      +                    msgs.Add(new
      +                    {
      +                        role = "assistant",
      +                        content = string.IsNullOrEmpty(textContent) ? (string?)null : textContent,
      +                        tool_calls = toolCallsList,
      +                    });
      +                    continue;
      +                }
      +                catch (Exception) { }
      +            }
      +
      +            // ── 이미지 첨부 (Vision) ──
      +            if (m.Role == "user" && m.Images?.Count > 0)
      +            {
      +                var contentParts = new List();
      +                foreach (var img in m.Images)
      +                    contentParts.Add(new { type = "image_url", image_url = new { url = $"data:{img.MimeType};base64,{img.Base64}" } });
      +                contentParts.Add(new { type = "text", text = m.Content });
      +                msgs.Add(new { role = m.Role, content = contentParts });
      +            }
      +            else
      +            {
      +                msgs.Add(new { role = m.Role, content = m.Content });
      +            }
      +        }
      +
      +        // OpenAI 도구 정의
      +        var toolDefs = tools.Select(t =>
      +        {
      +            // parameters 객체: required가 비어있으면 생략 (일부 Ollama 버전 호환)
      +            var paramDict = new Dictionary
      +            {
      +                ["type"] = "object",
      +                ["properties"] = t.Parameters.Properties.ToDictionary(
      +                    kv => kv.Key,
      +                    kv => BuildPropertySchema(kv.Value, false)),
      +            };
      +            if (t.Parameters.Required is { Count: > 0 })
      +                paramDict["required"] = t.Parameters.Required;
      +
      +            return new
      +            {
      +                type = "function",
      +                function = new
      +                {
      +                    name = t.Name,
      +                    description = t.Description,
      +                    parameters = paramDict,
      +                }
      +            };
      +        }).ToArray();
      +
      +        var activeService = ResolveService();
      +        var activeModel = ResolveModel();
      +        var isOllama = activeService.Equals("ollama", StringComparison.OrdinalIgnoreCase);
      +        if (isOllama)
      +        {
      +            return new
      +            {
      +                model = activeModel,
      +                messages = msgs,
      +                tools = toolDefs,
      +                stream = false,
      +                options = new { temperature = llm.Temperature }
      +            };
      +        }
      +
      +        return new
      +        {
      +            model = activeModel,
      +            messages = msgs,
      +            tools = toolDefs,
      +            stream = false,
      +            temperature = llm.Temperature,
      +            max_tokens = llm.MaxContextTokens,
      +        };
      +    }
      +
      +    // ─── 공통 헬퍼 ─────────────────────────────────────────────────────
      +
      +    /// ToolProperty를 LLM API용 스키마 객체로 변환. array/enum/items 포함.
      +    private static object BuildPropertySchema(Agent.ToolProperty prop, bool upperCaseType)
      +    {
      +        var typeName = upperCaseType ? prop.Type.ToUpperInvariant() : prop.Type;
      +
      +        if (prop.Type.Equals("array", StringComparison.OrdinalIgnoreCase) && prop.Items != null)
      +        {
      +            return new
      +            {
      +                type = typeName,
      +                description = prop.Description,
      +                items = BuildPropertySchema(prop.Items, upperCaseType)
      +            };
      +        }
      +
      +        // enum 값이 있으면 포함
      +        if (prop.Enum is { Count: > 0 })
      +            return new { type = typeName, description = prop.Description, @enum = prop.Enum };
      +
      +        return new { type = typeName, description = prop.Description };
      +    }
      +
      +    /// 에러 응답 본문에서 핵심 메시지를 추출합니다.
      +    private static string ExtractErrorDetail(string errBody)
      +    {
      +        if (string.IsNullOrWhiteSpace(errBody)) return "응답 없음";
      +        try
      +        {
      +            using var doc = JsonDocument.Parse(errBody);
      +            // Ollama: {"error":"..."}
      +            if (doc.RootElement.TryGetProperty("error", out var err))
      +            {
      +                if (err.ValueKind == JsonValueKind.String)
      +                    return err.GetString() ?? errBody;
      +                if (err.ValueKind == JsonValueKind.Object && err.TryGetProperty("message", out var m))
      +                    return m.GetString() ?? errBody;
      +            }
      +        }
      +        catch (Exception) { }
      +        // JSON 아니면 원본 (최대 500자)
      +        return errBody.Length > 500 ? errBody[..500] + "…" : errBody;
      +    }
      +}
      +
      +/// 도구 호출 자체가 서버에서 거부된 경우 (400). 일반 텍스트 응답으로 폴백 시도 가능.
      +public class ToolCallNotSupportedException : Exception
      +{
      +    public ToolCallNotSupportedException(string message) : base(message) { }
      +}
      diff --git a/src/AxCopilot/Services/LlmService.cs b/src/AxCopilot/Services/LlmService.cs
      new file mode 100644
      index 0000000..5fa5f50
      --- /dev/null
      +++ b/src/AxCopilot/Services/LlmService.cs
      @@ -0,0 +1,1010 @@
      +using System.IO;
      +using System.Net.Http;
      +using System.Runtime.CompilerServices;
      +using System.Text;
      +using System.Text.Json;
      +using AxCopilot.Models;
      +
      +namespace AxCopilot.Services;
      +
      +/// 토큰 사용량 정보.
      +public record TokenUsage(int PromptTokens, int CompletionTokens)
      +{
      +    public int TotalTokens => PromptTokens + CompletionTokens;
      +}
      +
      +/// 
      +/// LLM API 호출 서비스. Ollama / vLLM / Gemini 세 가지 백엔드를 지원합니다.
      +/// 스트리밍(SSE) 및 비스트리밍 모두 지원합니다.
      +/// 
      +public partial class LlmService : IDisposable
      +{
      +    private readonly HttpClient _http;
      +    private readonly SettingsService _settings;
      +    private string? _systemPrompt;
      +
      +    private const int MaxRetries = 2;
      +    private static readonly TimeSpan ChunkTimeout = TimeSpan.FromSeconds(30);
      +
      +    // ─── 자동 모델 라우팅 오버라이드 ─────────────────────────────────
      +    private string? _serviceOverride;
      +    private string? _modelOverride;
      +
      +    /// 자동 라우팅용 서비스/모델 오버라이드를 설정합니다. 요청 완료 후 반드시 ClearRouteOverride().
      +    public void PushRouteOverride(string service, string model)
      +    {
      +        _serviceOverride = service;
      +        _modelOverride = model;
      +    }
      +
      +    /// 서비스/모델 오버라이드를 해제합니다.
      +    public void ClearRouteOverride()
      +    {
      +        _serviceOverride = null;
      +        _modelOverride = null;
      +    }
      +
      +    /// 현재 활성 모델의 서비스명과 모델명을 반환합니다.
      +    public (string service, string model) GetCurrentModelInfo() => (ResolveService(), ResolveModel());
      +
      +    /// 오버라이드를 고려한 실제 서비스명.
      +    private string ResolveService() => _serviceOverride ?? _settings.Settings.Llm.Service;
      +
      +    /// 오버라이드를 고려한 실제 모델명.
      +    private string ResolveModel()
      +    {
      +        if (_modelOverride != null) return _modelOverride;
      +        return ResolveModelName();
      +    }
      +
      +    /// 지정 서비스의 API 키를 반환합니다.
      +    private string ResolveApiKeyForService(string service)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        return service.ToLowerInvariant() switch
      +        {
      +            "gemini" => llm.GeminiApiKey,
      +            "claude" => llm.ClaudeApiKey,
      +            "vllm"   => CryptoService.DecryptIfEnabled(llm.VllmApiKey, llm.EncryptionEnabled),
      +            "ollama" => CryptoService.DecryptIfEnabled(llm.OllamaApiKey, llm.EncryptionEnabled),
      +            _        => "",
      +        };
      +    }
      +
      +    /// 지정 서비스의 엔드포인트를 반환합니다.
      +    private string ResolveEndpointForService(string service)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        return service.ToLowerInvariant() switch
      +        {
      +            "vllm"   => llm.VllmEndpoint,
      +            "ollama" => llm.OllamaEndpoint,
      +            _        => llm.Endpoint,
      +        };
      +    }
      +
      +    /// 가장 최근 요청의 토큰 사용량. 스트리밍/비스트리밍 완료 후 갱신됩니다.
      +    public TokenUsage? LastTokenUsage { get; private set; }
      +
      +    public LlmService(SettingsService settings)
      +    {
      +        _settings = settings;
      +        _http = new HttpClient { Timeout = TimeSpan.FromMinutes(10) };
      +        LoadSystemPrompt();
      +    }
      +
      +    // ─── 시스템 프롬프트 (빌드 경로에서 동적 로딩) ─────────────────────────
      +
      +    private void LoadSystemPrompt()
      +    {
      +        var exeDir = AppContext.BaseDirectory;
      +        var promptFile = Path.Combine(exeDir, "system_prompt.txt");
      +        if (File.Exists(promptFile))
      +        {
      +            _systemPrompt = File.ReadAllText(promptFile, Encoding.UTF8).Trim();
      +        }
      +    }
      +
      +    public string? SystemPrompt => _systemPrompt;
      +
      +    /// 사내 서비스(Ollama/vLLM)면 암호화 모드에 따라 복호화, 외부면 그대로 반환.
      +    private string ResolveModelName()
      +    {
      +        var llm = _settings.Settings.Llm;
      +        if (llm.Service is "ollama" or "vllm" && !string.IsNullOrEmpty(llm.Model))
      +            return CryptoService.DecryptIfEnabled(llm.Model, llm.EncryptionEnabled);
      +        return llm.Model;
      +    }
      +
      +    /// 
      +    /// 현재 활성 모델에 매칭되는 RegisteredModel을 찾아 엔드포인트/API키를 반환합니다.
      +    /// RegisteredModel에 전용 서버 정보가 있으면 그것을 사용하고, 없으면 기본 설정을 사용합니다.
      +    /// 
      +    private (string Endpoint, string ApiKey) ResolveServerInfo()
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var activeService = ResolveService();
      +        var modelName = ResolveModel();
      +
      +        // RegisteredModel에서 현재 모델과 서비스가 일치하는 항목 검색
      +        var registered = FindRegisteredModel(llm, activeService, modelName);
      +
      +        if (registered != null)
      +        {
      +            // 엔드포인트: 등록된 값이 있으면 사용, 없으면 서비스 기본값
      +            var endpoint = !string.IsNullOrEmpty(registered.Endpoint)
      +                ? registered.Endpoint
      +                : GetDefaultEndpoint(llm, activeService);
      +            // API 키: 등록된 값이 있으면 반드시 사용 — endpoint가 비어있어도 registered.ApiKey 우선
      +            var apiKey = !string.IsNullOrEmpty(registered.ApiKey)
      +                ? CryptoService.DecryptIfEnabled(registered.ApiKey, llm.EncryptionEnabled)
      +                : GetDefaultApiKey(llm, activeService);
      +            return (endpoint, apiKey);
      +        }
      +
      +        // RegisteredModel 없음 — 서비스 기본 엔드포인트 + 기본 API 키
      +        return activeService.ToLowerInvariant() switch
      +        {
      +            "vllm"   => (llm.VllmEndpoint,   CryptoService.DecryptIfEnabled(llm.VllmApiKey,   llm.EncryptionEnabled)),
      +            "ollama" => (llm.OllamaEndpoint,  CryptoService.DecryptIfEnabled(llm.OllamaApiKey, llm.EncryptionEnabled)),
      +            _ => ("", ""),
      +        };
      +    }
      +
      +    private static string GetDefaultEndpoint(Models.LlmSettings llm, string service) =>
      +        service.ToLowerInvariant() switch
      +        {
      +            "vllm"   => llm.VllmEndpoint,
      +            "ollama" => llm.OllamaEndpoint,
      +            _        => ""
      +        };
      +
      +    /// 현재 활성 모델의 RegisteredModel을 찾습니다.
      +    private static Models.RegisteredModel? FindRegisteredModel(Models.LlmSettings llm, string service, string modelName)
      +    {
      +        return llm.RegisteredModels.FirstOrDefault(m =>
      +            m.Service.Equals(service, StringComparison.OrdinalIgnoreCase) &&
      +            (CryptoService.DecryptIfEnabled(m.EncryptedModelName, llm.EncryptionEnabled) == modelName ||
      +             m.Alias == modelName));
      +    }
      +
      +    /// 
      +    /// 현재 활성 모델의 인증 헤더 값을 반환합니다.
      +    /// CP4D 인증인 경우 토큰을 자동 발급/캐싱하여 반환합니다.
      +    /// 
      +    internal async Task ResolveAuthTokenAsync(CancellationToken ct = default)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var activeService = ResolveService();
      +        var modelName = ResolveModel();
      +        var registered = FindRegisteredModel(llm, activeService, modelName);
      +
      +        // CP4D 인증 방식인 경우
      +        if (registered != null &&
      +            registered.AuthType.Equals("cp4d", StringComparison.OrdinalIgnoreCase) &&
      +            !string.IsNullOrWhiteSpace(registered.Cp4dUrl))
      +        {
      +            var password = CryptoService.DecryptIfEnabled(registered.Cp4dPassword, llm.EncryptionEnabled);
      +            var token = await Cp4dTokenService.GetTokenAsync(
      +                registered.Cp4dUrl, registered.Cp4dUsername, password, ct);
      +            return token;
      +        }
      +
      +        // 기본 Bearer 인증 — 기존 API 키 반환
      +        var (_, apiKey) = ResolveServerInfo();
      +        return string.IsNullOrEmpty(apiKey) ? null : apiKey;
      +    }
      +
      +    /// 
      +    /// HttpRequestMessage에 인증 헤더를 적용합니다.
      +    /// CP4D 인증인 경우 자동 토큰 발급, 일반 Bearer인 경우 API 키를 사용합니다.
      +    /// 
      +    private async Task ApplyAuthHeaderAsync(HttpRequestMessage req, CancellationToken ct)
      +    {
      +        var token = await ResolveAuthTokenAsync(ct);
      +        if (!string.IsNullOrEmpty(token))
      +            req.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
      +    }
      +
      +    private static string GetDefaultApiKey(LlmSettings llm, string? service = null)
      +    {
      +        var svc = service ?? llm.Service;
      +        return svc.ToLowerInvariant() switch
      +        {
      +            "vllm" => CryptoService.DecryptIfEnabled(llm.VllmApiKey, llm.EncryptionEnabled),
      +            "ollama" => CryptoService.DecryptIfEnabled(llm.OllamaApiKey, llm.EncryptionEnabled),
      +            _ => "",
      +        };
      +    }
      +
      +    // ─── 비스트리밍 응답 ───────────────────────────────────────────────────
      +
      +    public async Task SendAsync(List messages, CancellationToken ct = default)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var activeService = ResolveService();
      +        try
      +        {
      +            return await SendWithServiceAsync(activeService, messages, ct);
      +        }
      +        catch (Exception ex) when (llm.FallbackModels.Count > 0)
      +        {
      +            // 폴백 모델 순차 시도
      +            foreach (var fallback in llm.FallbackModels)
      +            {
      +                var parts = fallback.Split(':', 2);
      +                var fbService = parts[0].Trim();
      +                var fbModel = parts.Length > 1 ? parts[1].Trim() : "";
      +                try
      +                {
      +                    LogService.Warn($"모델 폴백: {activeService} → {fbService} ({ex.Message})");
      +                    LastFallbackInfo = $"{activeService} → {fbService}";
      +                    return await SendWithServiceAsync(fbService, messages, ct);
      +                }
      +                catch (Exception) { continue; }
      +            }
      +            throw; // 모든 폴백 실패
      +        }
      +    }
      +
      +    /// 마지막 폴백 정보 (UI 표시용). null이면 폴백 미발생.
      +    public string? LastFallbackInfo { get; private set; }
      +
      +    private Task SendWithServiceAsync(string service, List messages, CancellationToken ct)
      +    {
      +        return service.ToLowerInvariant() switch
      +        {
      +            "gemini"  => SendGeminiAsync(messages, ct),
      +            "claude"  => SendClaudeAsync(messages, ct),
      +            "vllm"    => SendOpenAiCompatibleAsync(messages, ct),
      +            _         => SendOllamaAsync(messages, ct),
      +        };
      +    }
      +
      +    // ─── 스트리밍 응답 ────────────────────────────────────────────────────
      +
      +    public async IAsyncEnumerable StreamAsync(
      +        List messages,
      +        [EnumeratorCancellation] CancellationToken ct = default)
      +    {
      +        var activeService = ResolveService();
      +        var stream = activeService.ToLowerInvariant() switch
      +        {
      +            "gemini"  => StreamGeminiAsync(messages, ct),
      +            "claude"  => StreamClaudeAsync(messages, ct),
      +            "vllm"    => StreamOpenAiCompatibleAsync(messages, ct),
      +            _         => StreamOllamaAsync(messages, ct),
      +        };
      +        await foreach (var chunk in stream.WithCancellation(ct))
      +            yield return chunk;
      +    }
      +
      +    // ─── 연결 테스트 ──────────────────────────────────────────────────────
      +
      +    public async Task<(bool ok, string message)> TestConnectionAsync()
      +    {
      +        try
      +        {
      +            var llm = _settings.Settings.Llm;
      +            switch (llm.Service.ToLowerInvariant())
      +            {
      +                case "ollama":
      +                    var resp = await _http.GetAsync(llm.Endpoint.TrimEnd('/') + "/api/tags");
      +                    return resp.IsSuccessStatusCode
      +                        ? (true, "Ollama 연결 성공")
      +                        : (false, ClassifyHttpError(resp));
      +
      +                case "vllm":
      +                    var vResp = await _http.GetAsync(llm.Endpoint.TrimEnd('/') + "/v1/models");
      +                    return vResp.IsSuccessStatusCode
      +                        ? (true, "vLLM 연결 성공")
      +                        : (false, ClassifyHttpError(vResp));
      +
      +                case "gemini":
      +                    var gKey = llm.ApiKey;
      +                    if (string.IsNullOrEmpty(gKey)) return (false, "API 키가 설정되지 않았습니다");
      +                    var gResp = await _http.GetAsync(
      +                        $"https://generativelanguage.googleapis.com/v1beta/models?key={gKey}");
      +                    return gResp.IsSuccessStatusCode
      +                        ? (true, "Gemini API 연결 성공")
      +                        : (false, ClassifyHttpError(gResp));
      +
      +                case "claude":
      +                {
      +                    var cKey = llm.ApiKey;
      +                    if (string.IsNullOrEmpty(cKey)) return (false, "API 키가 설정되지 않았습니다");
      +                    using var cReq = new HttpRequestMessage(HttpMethod.Get, "https://api.anthropic.com/v1/models");
      +                    cReq.Headers.Add("x-api-key", cKey);
      +                    cReq.Headers.Add("anthropic-version", "2023-06-01");
      +                    var cResp = await _http.SendAsync(cReq);
      +                    return cResp.IsSuccessStatusCode
      +                        ? (true, "Claude API 연결 성공")
      +                        : (false, ClassifyHttpError(cResp));
      +                }
      +
      +                default:
      +                    return (false, "알 수 없는 서비스");
      +            }
      +        }
      +        catch (TaskCanceledException)
      +        {
      +            return (false, "연결 시간 초과 — 서버가 응답하지 않습니다");
      +        }
      +        catch (HttpRequestException ex)
      +        {
      +            return (false, $"연결 실패 — {ex.Message}");
      +        }
      +        catch (Exception ex)
      +        {
      +            return (false, ex.Message);
      +        }
      +    }
      +
      +    // ═══════════════════════════════════════════════════════════════════════
      +    // Ollama
      +    // ═══════════════════════════════════════════════════════════════════════
      +
      +    private async Task SendOllamaAsync(List messages, CancellationToken ct)
      +    {
      +        var llm  = _settings.Settings.Llm;
      +        var (endpoint, _) = ResolveServerInfo();
      +        var ep = string.IsNullOrEmpty(endpoint) ? llm.Endpoint : endpoint;
      +        var body = BuildOllamaBody(messages, stream: false);
      +        var resp = await PostJsonWithRetryAsync(ep.TrimEnd('/') + "/api/chat", body, ct);
      +        return SafeParseJson(resp, root =>
      +        {
      +            TryParseOllamaUsage(root);
      +            return root.GetProperty("message").GetProperty("content").GetString() ?? "";
      +        }, "Ollama 응답");
      +    }
      +
      +    private async IAsyncEnumerable StreamOllamaAsync(
      +        List messages,
      +        [EnumeratorCancellation] CancellationToken ct)
      +    {
      +        var llm  = _settings.Settings.Llm;
      +        var (endpoint, _) = ResolveServerInfo();
      +        var ep = string.IsNullOrEmpty(endpoint) ? llm.Endpoint : endpoint;
      +        var body = BuildOllamaBody(messages, stream: true);
      +        var url  = ep.TrimEnd('/') + "/api/chat";
      +
      +        using var req  = new HttpRequestMessage(HttpMethod.Post, url) { Content = JsonContent(body) };
      +        using var resp = await SendWithErrorClassificationAsync(req, ct);
      +
      +        using var stream = await resp.Content.ReadAsStreamAsync(ct);
      +        using var reader = new StreamReader(stream);
      +
      +        while (!reader.EndOfStream && !ct.IsCancellationRequested)
      +        {
      +            var line = await ReadLineWithTimeoutAsync(reader, ct);
      +            if (line == null) break;
      +            if (string.IsNullOrEmpty(line)) continue;
      +
      +            string? text = null;
      +            try
      +            {
      +                using var doc = JsonDocument.Parse(line);
      +                if (doc.RootElement.TryGetProperty("message", out var msg) &&
      +                    msg.TryGetProperty("content", out var c))
      +                    text = c.GetString();
      +                // Ollama: done=true 시 토큰 사용량 포함
      +                if (doc.RootElement.TryGetProperty("done", out var done) && done.GetBoolean())
      +                    TryParseOllamaUsage(doc.RootElement);
      +            }
      +            catch (JsonException ex)
      +            {
      +                LogService.Warn($"Ollama 스트리밍 JSON 파싱 오류: {ex.Message}");
      +            }
      +            if (!string.IsNullOrEmpty(text)) yield return text;
      +        }
      +    }
      +
      +    private object BuildOllamaBody(List messages, bool stream)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var msgs = BuildMessageList(messages);
      +        return new
      +        {
      +            model = ResolveModelName(),
      +            messages = msgs,
      +            stream = stream,
      +            options = new { temperature = llm.Temperature }
      +        };
      +    }
      +
      +    // ═══════════════════════════════════════════════════════════════════════
      +    // OpenAI-Compatible (vLLM)
      +    // ═══════════════════════════════════════════════════════════════════════
      +
      +    private async Task SendOpenAiCompatibleAsync(List messages, CancellationToken ct)
      +    {
      +        var llm  = _settings.Settings.Llm;
      +        var (endpoint, _) = ResolveServerInfo();
      +        var ep = string.IsNullOrEmpty(endpoint) ? llm.Endpoint : endpoint;
      +        var body = BuildOpenAiBody(messages, stream: false);
      +        var url  = ep.TrimEnd('/') + "/v1/chat/completions";
      +        var json = JsonSerializer.Serialize(body);
      +
      +        using var req = new HttpRequestMessage(HttpMethod.Post, url)
      +        {
      +            Content = new StringContent(json, Encoding.UTF8, "application/json")
      +        };
      +        await ApplyAuthHeaderAsync(req, ct);
      +
      +        using var resp = await SendWithErrorClassificationAsync(req, ct);
      +        var respBody = await resp.Content.ReadAsStringAsync(ct);
      +        return SafeParseJson(respBody, root =>
      +        {
      +            TryParseOpenAiUsage(root);
      +            var choices = root.GetProperty("choices");
      +            if (choices.GetArrayLength() == 0) return "(빈 응답)";
      +            return choices[0].GetProperty("message").GetProperty("content").GetString() ?? "";
      +        }, "vLLM 응답");
      +    }
      +
      +    private async IAsyncEnumerable StreamOpenAiCompatibleAsync(
      +        List messages,
      +        [EnumeratorCancellation] CancellationToken ct)
      +    {
      +        var llm  = _settings.Settings.Llm;
      +        var (endpoint, _) = ResolveServerInfo();
      +        var ep = string.IsNullOrEmpty(endpoint) ? llm.Endpoint : endpoint;
      +        var body = BuildOpenAiBody(messages, stream: true);
      +        var url  = ep.TrimEnd('/') + "/v1/chat/completions";
      +
      +        using var req  = new HttpRequestMessage(HttpMethod.Post, url) { Content = JsonContent(body) };
      +        await ApplyAuthHeaderAsync(req, ct);
      +        using var resp = await SendWithErrorClassificationAsync(req, ct);
      +
      +        using var stream = await resp.Content.ReadAsStreamAsync(ct);
      +        using var reader = new StreamReader(stream);
      +
      +        while (!reader.EndOfStream && !ct.IsCancellationRequested)
      +        {
      +            var line = await ReadLineWithTimeoutAsync(reader, ct);
      +            if (line == null) break;
      +            if (string.IsNullOrEmpty(line) || !line.StartsWith("data: ")) continue;
      +            var data = line["data: ".Length..];
      +            if (data == "[DONE]") break;
      +
      +            string? text = null;
      +            try
      +            {
      +                using var doc = JsonDocument.Parse(data);
      +                TryParseOpenAiUsage(doc.RootElement);
      +                var choices = doc.RootElement.GetProperty("choices");
      +                if (choices.GetArrayLength() > 0)
      +                {
      +                    var delta = choices[0].GetProperty("delta");
      +                    if (delta.TryGetProperty("content", out var c))
      +                        text = c.GetString();
      +                }
      +            }
      +            catch (JsonException ex)
      +            {
      +                LogService.Warn($"vLLM 스트리밍 JSON 파싱 오류: {ex.Message}");
      +            }
      +            if (!string.IsNullOrEmpty(text)) yield return text;
      +        }
      +    }
      +
      +    private object BuildOpenAiBody(List messages, bool stream)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var msgs = BuildMessageList(messages, openAiVision: true);
      +        return new
      +        {
      +            model = ResolveModelName(),
      +            messages = msgs,
      +            stream = stream,
      +            temperature = llm.Temperature,
      +            max_tokens = llm.MaxContextTokens
      +        };
      +    }
      +
      +    // ═══════════════════════════════════════════════════════════════════════
      +    // Gemini
      +    // ═══════════════════════════════════════════════════════════════════════
      +
      +    private async Task SendGeminiAsync(List messages, CancellationToken ct)
      +    {
      +        var llm    = _settings.Settings.Llm;
      +        var apiKey = ResolveApiKeyForService("gemini");
      +        if (string.IsNullOrEmpty(apiKey))
      +            throw new InvalidOperationException("Gemini API 키가 설정되지 않았습니다. 설정 > AX Agent에서 API 키를 입력하세요.");
      +
      +        var model  = ResolveModel();
      +        var body   = BuildGeminiBody(messages);
      +        var url    = $"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent?key={apiKey}";
      +        var resp   = await PostJsonWithRetryAsync(url, body, ct);
      +        return SafeParseJson(resp, root =>
      +        {
      +            TryParseGeminiUsage(root);
      +            var candidates = root.GetProperty("candidates");
      +            if (candidates.GetArrayLength() == 0) return "(빈 응답)";
      +            var parts = candidates[0].GetProperty("content").GetProperty("parts");
      +            if (parts.GetArrayLength() == 0) return "(빈 응답)";
      +            return parts[0].GetProperty("text").GetString() ?? "";
      +        }, "Gemini 응답");
      +    }
      +
      +    private async IAsyncEnumerable StreamGeminiAsync(
      +        List messages,
      +        [EnumeratorCancellation] CancellationToken ct)
      +    {
      +        var llm    = _settings.Settings.Llm;
      +        var apiKey = ResolveApiKeyForService("gemini");
      +        if (string.IsNullOrEmpty(apiKey))
      +            throw new InvalidOperationException("Gemini API 키가 설정되지 않았습니다.");
      +
      +        var model  = ResolveModel();
      +        var body   = BuildGeminiBody(messages);
      +        var url    = $"https://generativelanguage.googleapis.com/v1beta/models/{model}:streamGenerateContent?alt=sse&key={apiKey}";
      +
      +        using var req  = new HttpRequestMessage(HttpMethod.Post, url) { Content = JsonContent(body) };
      +        using var resp = await SendWithErrorClassificationAsync(req, ct);
      +
      +        using var stream = await resp.Content.ReadAsStreamAsync(ct);
      +        using var reader = new StreamReader(stream);
      +
      +        while (!reader.EndOfStream && !ct.IsCancellationRequested)
      +        {
      +            var line = await ReadLineWithTimeoutAsync(reader, ct);
      +            if (line == null) break;
      +            if (string.IsNullOrEmpty(line) || !line.StartsWith("data: ")) continue;
      +            var data = line["data: ".Length..];
      +            string? parsed = null;
      +            try
      +            {
      +                using var doc = JsonDocument.Parse(data);
      +                TryParseGeminiUsage(doc.RootElement);
      +                var candidates = doc.RootElement.GetProperty("candidates");
      +                if (candidates.GetArrayLength() == 0) continue;
      +                var sb = new StringBuilder();
      +                var parts = candidates[0].GetProperty("content").GetProperty("parts");
      +                foreach (var part in parts.EnumerateArray())
      +                {
      +                    if (part.TryGetProperty("text", out var t))
      +                    {
      +                        var text = t.GetString();
      +                        if (!string.IsNullOrEmpty(text)) sb.Append(text);
      +                    }
      +                }
      +                if (sb.Length > 0) parsed = sb.ToString();
      +            }
      +            catch (JsonException ex)
      +            {
      +                LogService.Warn($"Gemini 스트리밍 JSON 파싱 오류: {ex.Message}");
      +            }
      +            if (parsed != null) yield return parsed;
      +        }
      +    }
      +
      +    private object BuildGeminiBody(List messages)
      +    {
      +        var llm     = _settings.Settings.Llm;
      +        var contents = new List();
      +
      +        object? systemInstruction = null;
      +        if (!string.IsNullOrEmpty(_systemPrompt))
      +        {
      +            systemInstruction = new { parts = new[] { new { text = _systemPrompt } } };
      +        }
      +
      +        foreach (var m in messages)
      +        {
      +            if (m.Role == "system") continue;
      +            var parts = new List { new { text = m.Content } };
      +            if (m.Images?.Count > 0)
      +            {
      +                foreach (var img in m.Images)
      +                    parts.Add(new { inlineData = new { mimeType = img.MimeType, data = img.Base64 } });
      +            }
      +            contents.Add(new
      +            {
      +                role = m.Role == "assistant" ? "model" : "user",
      +                parts
      +            });
      +        }
      +
      +        if (systemInstruction != null)
      +            return new
      +            {
      +                systemInstruction,
      +                contents,
      +                generationConfig = new { temperature = llm.Temperature, maxOutputTokens = llm.MaxContextTokens }
      +            };
      +
      +        return new
      +        {
      +            contents,
      +            generationConfig = new { temperature = llm.Temperature, maxOutputTokens = llm.MaxContextTokens }
      +        };
      +    }
      +
      +    // ═══════════════════════════════════════════════════════════════════════
      +    // Claude (Anthropic Messages API)
      +    // ═══════════════════════════════════════════════════════════════════════
      +
      +    private async Task SendClaudeAsync(List messages, CancellationToken ct)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var apiKey = llm.ApiKey;
      +        if (string.IsNullOrEmpty(apiKey))
      +            throw new InvalidOperationException("Claude API 키가 설정되지 않았습니다. 설정 > AX Agent에서 API 키를 입력하세요.");
      +
      +        var body = BuildClaudeBody(messages, stream: false);
      +        var json = JsonSerializer.Serialize(body);
      +        using var req = new HttpRequestMessage(HttpMethod.Post, "https://api.anthropic.com/v1/messages");
      +        req.Content = new StringContent(json, Encoding.UTF8, "application/json");
      +        req.Headers.Add("x-api-key", apiKey);
      +        req.Headers.Add("anthropic-version", "2023-06-01");
      +
      +        using var resp = await _http.SendAsync(req, ct);
      +        if (!resp.IsSuccessStatusCode)
      +        {
      +            var errBody = await resp.Content.ReadAsStringAsync(ct);
      +            throw new HttpRequestException(ClassifyHttpError(resp, errBody));
      +        }
      +
      +        var respJson = await resp.Content.ReadAsStringAsync(ct);
      +        return SafeParseJson(respJson, root =>
      +        {
      +            TryParseClaudeUsage(root);
      +            var content = root.GetProperty("content");
      +            if (content.GetArrayLength() == 0) return "(빈 응답)";
      +            return content[0].GetProperty("text").GetString() ?? "";
      +        }, "Claude 응답");
      +    }
      +
      +    private async IAsyncEnumerable StreamClaudeAsync(
      +        List messages,
      +        [EnumeratorCancellation] CancellationToken ct)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var apiKey = llm.ApiKey;
      +        if (string.IsNullOrEmpty(apiKey))
      +            throw new InvalidOperationException("Claude API 키가 설정되지 않았습니다.");
      +
      +        var body = BuildClaudeBody(messages, stream: true);
      +        var json = JsonSerializer.Serialize(body);
      +        using var req = new HttpRequestMessage(HttpMethod.Post, "https://api.anthropic.com/v1/messages");
      +        req.Content = new StringContent(json, Encoding.UTF8, "application/json");
      +        req.Headers.Add("x-api-key", apiKey);
      +        req.Headers.Add("anthropic-version", "2023-06-01");
      +
      +        using var resp = await _http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead, ct);
      +        if (!resp.IsSuccessStatusCode)
      +        {
      +            var errBody = await resp.Content.ReadAsStringAsync(ct);
      +            throw new HttpRequestException(ClassifyHttpError(resp, errBody));
      +        }
      +
      +        using var stream = await resp.Content.ReadAsStreamAsync(ct);
      +        using var reader = new StreamReader(stream);
      +
      +        while (!reader.EndOfStream && !ct.IsCancellationRequested)
      +        {
      +            var line = await ReadLineWithTimeoutAsync(reader, ct);
      +            if (line == null) break;
      +            if (string.IsNullOrEmpty(line) || !line.StartsWith("data: ")) continue;
      +            var data = line["data: ".Length..];
      +
      +            string? text = null;
      +            try
      +            {
      +                using var doc = JsonDocument.Parse(data);
      +                var type = doc.RootElement.GetProperty("type").GetString();
      +                if (type == "content_block_delta")
      +                {
      +                    var delta = doc.RootElement.GetProperty("delta");
      +                    if (delta.TryGetProperty("text", out var t))
      +                        text = t.GetString();
      +                }
      +                else if (type is "message_start" or "message_delta")
      +                {
      +                    // message_start: usage in .message.usage, message_delta: usage in .usage
      +                    if (doc.RootElement.TryGetProperty("message", out var msg) &&
      +                        msg.TryGetProperty("usage", out var u1))
      +                        TryParseClaudeUsageFromElement(u1);
      +                    else if (doc.RootElement.TryGetProperty("usage", out var u2))
      +                        TryParseClaudeUsageFromElement(u2);
      +                }
      +            }
      +            catch (JsonException ex)
      +            {
      +                LogService.Warn($"Claude 스트리밍 JSON 파싱 오류: {ex.Message}");
      +            }
      +            if (!string.IsNullOrEmpty(text)) yield return text;
      +        }
      +    }
      +
      +    private object BuildClaudeBody(List messages, bool stream)
      +    {
      +        var llm = _settings.Settings.Llm;
      +        var msgs = new List();
      +
      +        foreach (var m in messages)
      +        {
      +            if (m.Role == "system") continue;
      +            if (m.Images?.Count > 0)
      +            {
      +                // Claude Vision: content를 배열로 변환 (이미지 + 텍스트)
      +                var contentParts = new List();
      +                foreach (var img in m.Images)
      +                    contentParts.Add(new { type = "image", source = new { type = "base64", media_type = img.MimeType, data = img.Base64 } });
      +                contentParts.Add(new { type = "text", text = m.Content });
      +                msgs.Add(new { role = m.Role, content = contentParts });
      +            }
      +            else
      +            {
      +                msgs.Add(new { role = m.Role, content = m.Content });
      +            }
      +        }
      +
      +        var activeModel = ResolveModel();
      +        if (!string.IsNullOrEmpty(_systemPrompt))
      +        {
      +            return new
      +            {
      +                model = activeModel,
      +                max_tokens = llm.MaxContextTokens,
      +                temperature = llm.Temperature,
      +                system = _systemPrompt,
      +                messages = msgs,
      +                stream
      +            };
      +        }
      +
      +        return new
      +        {
      +            model = activeModel,
      +            max_tokens = llm.MaxContextTokens,
      +            temperature = llm.Temperature,
      +            messages = msgs,
      +            stream
      +        };
      +    }
      +
      +    // ─── 공용 헬퍼 ─────────────────────────────────────────────────────────
      +
      +    private List BuildMessageList(List messages, bool openAiVision = false)
      +    {
      +        var result = new List();
      +        if (!string.IsNullOrEmpty(_systemPrompt))
      +            result.Add(new { role = "system", content = _systemPrompt });
      +
      +        foreach (var m in messages)
      +        {
      +            if (m.Role == "system") continue;
      +            if (m.Images?.Count > 0)
      +            {
      +                if (openAiVision)
      +                {
      +                    // OpenAI Vision: content 배열 (text + image_url)
      +                    var contentParts = new List();
      +                    contentParts.Add(new { type = "text", text = m.Content });
      +                    foreach (var img in m.Images)
      +                        contentParts.Add(new { type = "image_url", image_url = new { url = $"data:{img.MimeType};base64,{img.Base64}" } });
      +                    result.Add(new { role = m.Role, content = contentParts });
      +                }
      +                else
      +                {
      +                    // Ollama Vision: images 필드에 base64 배열
      +                    result.Add(new { role = m.Role, content = m.Content, images = m.Images.Select(i => i.Base64).ToArray() });
      +                }
      +            }
      +            else
      +            {
      +                result.Add(new { role = m.Role, content = m.Content });
      +            }
      +        }
      +        return result;
      +    }
      +
      +    /// 비스트리밍 POST + 재시도 (일시적 오류 시 최대 2회)
      +    private async Task PostJsonWithRetryAsync(string url, object body, CancellationToken ct)
      +    {
      +        var json = JsonSerializer.Serialize(body);
      +        Exception? lastEx = null;
      +
      +        for (int attempt = 0; attempt <= MaxRetries; attempt++)
      +        {
      +            try
      +            {
      +                using var content = new StringContent(json, Encoding.UTF8, "application/json");
      +                using var resp = await _http.PostAsync(url, content, ct);
      +
      +                if (resp.IsSuccessStatusCode)
      +                    return await resp.Content.ReadAsStringAsync(ct);
      +
      +                // 429 Rate Limit → 재시도
      +                if ((int)resp.StatusCode == 429 && attempt < MaxRetries)
      +                {
      +                    await Task.Delay(1000 * (attempt + 1), ct);
      +                    continue;
      +                }
      +
      +                // 그 외 에러 → 분류 후 예외
      +                var errBody = await resp.Content.ReadAsStringAsync(ct);
      +                throw new HttpRequestException(ClassifyHttpError(resp, errBody));
      +            }
      +            catch (HttpRequestException) { throw; }
      +            catch (TaskCanceledException) when (!ct.IsCancellationRequested && attempt < MaxRetries)
      +            {
      +                lastEx = new TimeoutException("요청 시간 초과");
      +                await Task.Delay(1000 * (attempt + 1), ct);
      +            }
      +        }
      +        throw lastEx ?? new HttpRequestException("요청 실패");
      +    }
      +
      +    /// 스트리밍 전용 — HTTP 요청 전송 + 에러 분류
      +    private async Task SendWithErrorClassificationAsync(
      +        HttpRequestMessage req, CancellationToken ct)
      +    {
      +        var resp = await _http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead, ct);
      +        if (!resp.IsSuccessStatusCode)
      +        {
      +            var errBody = await resp.Content.ReadAsStringAsync(ct);
      +            var errorMsg = ClassifyHttpError(resp, errBody);
      +            resp.Dispose();
      +            throw new HttpRequestException(errorMsg);
      +        }
      +        return resp;
      +    }
      +
      +    /// 스트리밍 ReadLine에 청크 타임아웃 적용
      +    private static async Task ReadLineWithTimeoutAsync(StreamReader reader, CancellationToken ct)
      +    {
      +        using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
      +        cts.CancelAfter(ChunkTimeout);
      +        try
      +        {
      +            return await reader.ReadLineAsync(cts.Token);
      +        }
      +        catch (OperationCanceledException) when (!ct.IsCancellationRequested)
      +        {
      +            LogService.Warn("스트리밍 청크 타임아웃 (30초 무응답)");
      +            return null; // 타임아웃 시 스트림 종료
      +        }
      +    }
      +
      +    /// JSON 파싱 안전 래퍼 — 파싱 실패 시 상세 에러 메시지 반환
      +    private static string SafeParseJson(string json, Func extractor, string context)
      +    {
      +        try
      +        {
      +            using var doc = JsonDocument.Parse(json);
      +
      +            // API 에러 응답 감지
      +            if (doc.RootElement.TryGetProperty("error", out var error))
      +            {
      +                var msg = error.TryGetProperty("message", out var m) ? m.GetString() : error.ToString();
      +                throw new HttpRequestException($"[{context}] API 에러: {msg}");
      +            }
      +
      +            return extractor(doc.RootElement);
      +        }
      +        catch (JsonException ex)
      +        {
      +            var preview = json.Length > 200 ? json[..200] + "…" : json;
      +            throw new InvalidOperationException(
      +                $"[{context}] 응답 형식 오류 — 예상하지 못한 JSON 형식입니다.\n파싱 오류: {ex.Message}\n응답 미리보기: {preview}");
      +        }
      +        catch (KeyNotFoundException)
      +        {
      +            var preview = json.Length > 200 ? json[..200] + "…" : json;
      +            throw new InvalidOperationException(
      +                $"[{context}] 응답에 필요한 필드가 없습니다.\n응답 미리보기: {preview}");
      +        }
      +    }
      +
      +    /// HTTP 에러 코드별 사용자 친화적 메시지
      +    private static string ClassifyHttpError(HttpResponseMessage resp, string? body = null)
      +    {
      +        var code = (int)resp.StatusCode;
      +        var detail = "";
      +
      +        // JSON error.message 추출 시도
      +        if (!string.IsNullOrEmpty(body))
      +        {
      +            try
      +            {
      +                using var doc = JsonDocument.Parse(body);
      +                if (doc.RootElement.TryGetProperty("error", out var err))
      +                {
      +                    if (err.ValueKind == JsonValueKind.Object && err.TryGetProperty("message", out var m))
      +                        detail = m.GetString() ?? "";
      +                    else if (err.ValueKind == JsonValueKind.String)
      +                        detail = err.GetString() ?? "";
      +                }
      +            }
      +            catch (Exception) { }
      +        }
      +
      +        var msg = code switch
      +        {
      +            400 => "잘못된 요청 — 모델 이름이나 요청 형식을 확인하세요",
      +            401 => "인증 실패 — API 키가 유효하지 않습니다",
      +            403 => "접근 거부 — API 키 권한을 확인하세요",
      +            404 => "모델을 찾을 수 없습니다 — 모델 이름을 확인하세요",
      +            429 => "요청 한도 초과 — 잠시 후 다시 시도하세요",
      +            500 => "서버 내부 오류 — LLM 서버 상태를 확인하세요",
      +            502 or 503 => "서버 일시 장애 — 잠시 후 다시 시도하세요",
      +            _ => $"HTTP {code} 오류"
      +        };
      +
      +        return string.IsNullOrEmpty(detail) ? msg : $"{msg}\n상세: {detail}";
      +    }
      +
      +    private static StringContent JsonContent(object body)
      +    {
      +        var json = JsonSerializer.Serialize(body);
      +        return new StringContent(json, Encoding.UTF8, "application/json");
      +    }
      +
      +    // ─── 토큰 사용량 파싱 헬퍼 ──────────────────────────────────────────
      +
      +    private void TryParseOllamaUsage(JsonElement root)
      +    {
      +        try
      +        {
      +            var prompt = root.TryGetProperty("prompt_eval_count", out var p) ? p.GetInt32() : 0;
      +            var completion = root.TryGetProperty("eval_count", out var e) ? e.GetInt32() : 0;
      +            if (prompt > 0 || completion > 0)
      +                LastTokenUsage = new TokenUsage(prompt, completion);
      +        }
      +        catch (Exception) { }
      +    }
      +
      +    private void TryParseOpenAiUsage(JsonElement root)
      +    {
      +        try
      +        {
      +            if (!root.TryGetProperty("usage", out var usage)) return;
      +            var prompt = usage.TryGetProperty("prompt_tokens", out var p) ? p.GetInt32() : 0;
      +            var completion = usage.TryGetProperty("completion_tokens", out var c) ? c.GetInt32() : 0;
      +            if (prompt > 0 || completion > 0)
      +                LastTokenUsage = new TokenUsage(prompt, completion);
      +        }
      +        catch (Exception) { }
      +    }
      +
      +    private void TryParseGeminiUsage(JsonElement root)
      +    {
      +        try
      +        {
      +            if (!root.TryGetProperty("usageMetadata", out var usage)) return;
      +            var prompt = usage.TryGetProperty("promptTokenCount", out var p) ? p.GetInt32() : 0;
      +            var completion = usage.TryGetProperty("candidatesTokenCount", out var c) ? c.GetInt32() : 0;
      +            if (prompt > 0 || completion > 0)
      +                LastTokenUsage = new TokenUsage(prompt, completion);
      +        }
      +        catch (Exception) { }
      +    }
      +
      +    private void TryParseClaudeUsage(JsonElement root)
      +    {
      +        try
      +        {
      +            if (!root.TryGetProperty("usage", out var usage)) return;
      +            TryParseClaudeUsageFromElement(usage);
      +        }
      +        catch (Exception) { }
      +    }
      +
      +    private void TryParseClaudeUsageFromElement(JsonElement usage)
      +    {
      +        try
      +        {
      +            var input = usage.TryGetProperty("input_tokens", out var i) ? i.GetInt32() : 0;
      +            var output = usage.TryGetProperty("output_tokens", out var o) ? o.GetInt32() : 0;
      +            if (input > 0 || output > 0)
      +                LastTokenUsage = new TokenUsage(input, output);
      +        }
      +        catch (Exception) { }
      +    }
      +
      +    public void Dispose() => _http.Dispose();
      +}
      diff --git a/src/AxCopilot/Services/LogService.cs b/src/AxCopilot/Services/LogService.cs
      new file mode 100644
      index 0000000..69e61e3
      --- /dev/null
      +++ b/src/AxCopilot/Services/LogService.cs
      @@ -0,0 +1,57 @@
      +using System.IO;
      +
      +namespace AxCopilot.Services;
      +
      +public enum LogLevel { Debug, Info, Warn, Error }
      +
      +public static class LogService
      +{
      +    private static readonly string LogDir =
      +        Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
      +                     "AxCopilot", "logs");
      +
      +    private static string LogFile =>
      +        Path.Combine(LogDir, $"app-{DateTime.Now:yyyy-MM-dd}.log");
      +
      +    private static readonly object _lock = new();
      +
      +    private const int RetentionDays = 14; // 14일 이상 지난 로그 파일 자동 삭제
      +    private static bool _purged;
      +
      +    public static LogLevel MinLevel { get; set; } = LogLevel.Info;
      +
      +    public static void Debug(string msg) => Write(LogLevel.Debug, msg);
      +    public static void Info(string msg)  => Write(LogLevel.Info, msg);
      +    public static void Warn(string msg)  => Write(LogLevel.Warn, msg);
      +    public static void Error(string msg) => Write(LogLevel.Error, msg);
      +
      +    private static void Write(LogLevel level, string msg)
      +    {
      +        if (level < MinLevel) return;
      +        try
      +        {
      +            Directory.CreateDirectory(LogDir);
      +            var line = $"[{DateTime.Now:HH:mm:ss.fff}] [{level,-5}] {msg}";
      +            lock (_lock)
      +                File.AppendAllText(LogFile, line + Environment.NewLine);
      +
      +            // 앱 세션 당 1회 오래된 로그 삭제
      +            if (!_purged) { _purged = true; PurgeOldLogs(); }
      +        }
      +        catch (Exception) { /* 로깅 실패는 무시 */ }
      +    }
      +
      +    private static void PurgeOldLogs()
      +    {
      +        try
      +        {
      +            var cutoff = DateTime.Now.AddDays(-RetentionDays);
      +            foreach (var file in Directory.GetFiles(LogDir, "app-*.log"))
      +            {
      +                if (File.GetCreationTime(file) < cutoff)
      +                    File.Delete(file);
      +            }
      +        }
      +        catch (Exception) { }
      +    }
      +}
      diff --git a/src/AxCopilot/Services/LspClientService.cs b/src/AxCopilot/Services/LspClientService.cs
      new file mode 100644
      index 0000000..9d10601
      --- /dev/null
      +++ b/src/AxCopilot/Services/LspClientService.cs
      @@ -0,0 +1,410 @@
      +using System.Diagnostics;
      +using System.IO;
      +using System.Text;
      +using System.Text.Json;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// Language Server Protocol 클라이언트.
      +/// 외부 언어 서버 프로세스와 JSON-RPC 2.0으로 통신합니다.
      +/// 지원: OmniSharp (C#), typescript-language-server, pyright, clangd
      +/// 
      +public class LspClientService : IDisposable
      +{
      +    private Process? _process;
      +    private StreamWriter? _writer;
      +    private StreamReader? _reader;
      +    private int _requestId;
      +    private bool _initialized;
      +    private readonly string _language;
      +
      +    public bool IsConnected => _process is { HasExited: false } && _initialized;
      +
      +    public LspClientService(string language)
      +    {
      +        _language = language.ToLowerInvariant();
      +    }
      +
      +    /// 언어에 맞는 LSP 서버를 시작하고 초기화합니다.
      +    public async Task StartAsync(string workspacePath, CancellationToken ct = default)
      +    {
      +        var (command, args) = GetServerCommand();
      +        if (command == null)
      +        {
      +            LogService.Warn($"LSP: {_language}에 대한 서버를 찾을 수 없습니다.");
      +            return false;
      +        }
      +
      +        try
      +        {
      +            var psi = new ProcessStartInfo
      +            {
      +                FileName = command,
      +                UseShellExecute = false,
      +                RedirectStandardInput = true,
      +                RedirectStandardOutput = true,
      +                RedirectStandardError = true,
      +                CreateNoWindow = true,
      +                StandardOutputEncoding = Encoding.UTF8,
      +                StandardErrorEncoding = Encoding.UTF8,
      +            };
      +            foreach (var arg in args)
      +                psi.ArgumentList.Add(arg);
      +
      +            _process = Process.Start(psi);
      +            if (_process == null) return false;
      +
      +            _writer = _process.StandardInput;
      +            _reader = _process.StandardOutput;
      +
      +            // LSP initialize
      +            var initResult = await SendRequestAsync("initialize", new
      +            {
      +                processId = Environment.ProcessId,
      +                rootUri = $"file:///{workspacePath.Replace('\\', '/').TrimStart('/')}",
      +                capabilities = new
      +                {
      +                    textDocument = new
      +                    {
      +                        definition = new { dynamicRegistration = false },
      +                        references = new { dynamicRegistration = false },
      +                        documentSymbol = new { dynamicRegistration = false },
      +                    }
      +                }
      +            }, ct);
      +
      +            if (initResult == null) return false;
      +
      +            // initialized notification
      +            await SendNotificationAsync("initialized", ct);
      +            _initialized = true;
      +
      +            LogService.Info($"LSP [{_language}]: 서버 시작 완료 ({command})");
      +            return true;
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"LSP [{_language}] 시작 실패: {ex.Message}");
      +            return false;
      +        }
      +    }
      +
      +    /// 심볼 정의 위치를 찾습니다.
      +    public async Task GotoDefinitionAsync(string filePath, int line, int character, CancellationToken ct = default)
      +    {
      +        var result = await SendRequestAsync("textDocument/definition", new
      +        {
      +            textDocument = new { uri = FileToUri(filePath) },
      +            position = new { line, character }
      +        }, ct);
      +
      +        return ParseLocation(result);
      +    }
      +
      +    /// 심볼의 모든 참조 위치를 찾습니다.
      +    public async Task> FindReferencesAsync(string filePath, int line, int character, CancellationToken ct = default)
      +    {
      +        var result = await SendRequestAsync("textDocument/references", new
      +        {
      +            textDocument = new { uri = FileToUri(filePath) },
      +            position = new { line, character },
      +            context = new { includeDeclaration = true }
      +        }, ct);
      +
      +        return ParseLocations(result);
      +    }
      +
      +    /// 파일의 심볼 목록을 가져옵니다 (클래스, 메서드, 필드 등).
      +    public async Task> GetDocumentSymbolsAsync(string filePath, CancellationToken ct = default)
      +    {
      +        var result = await SendRequestAsync("textDocument/documentSymbol", new
      +        {
      +            textDocument = new { uri = FileToUri(filePath) }
      +        }, ct);
      +
      +        return ParseSymbols(result);
      +    }
      +
      +    // ─── JSON-RPC 통신 ──────────────────────────────────────────────────────
      +
      +    private static readonly JsonSerializerOptions JsonOpts = new()
      +    {
      +        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
      +        Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
      +    };
      +
      +    private async Task SendRequestAsync(string method, object parameters, CancellationToken ct)
      +    {
      +        if (_writer == null || _reader == null) return null;
      +
      +        var id = Interlocked.Increment(ref _requestId);
      +        var request = new { jsonrpc = "2.0", id, method, @params = parameters };
      +        var json = JsonSerializer.Serialize(request, JsonOpts);
      +        var content = Encoding.UTF8.GetBytes(json);
      +
      +        // LSP 프로토콜: Content-Length 헤더 + \r\n\r\n + 본문
      +        var header = $"Content-Length: {content.Length}\r\n\r\n";
      +        await _writer.BaseStream.WriteAsync(Encoding.ASCII.GetBytes(header), ct);
      +        await _writer.BaseStream.WriteAsync(content, ct);
      +        await _writer.BaseStream.FlushAsync(ct);
      +
      +        // 응답 읽기
      +        using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
      +        cts.CancelAfter(TimeSpan.FromSeconds(15));
      +
      +        while (!cts.Token.IsCancellationRequested)
      +        {
      +            var headerLine = await ReadHeaderAsync(cts.Token);
      +            if (headerLine == null) continue;
      +
      +            var bodyLength = ParseContentLength(headerLine);
      +            if (bodyLength <= 0) continue;
      +
      +            var body = new byte[bodyLength];
      +            int read = 0;
      +            while (read < bodyLength)
      +            {
      +                var n = await _reader.BaseStream.ReadAsync(body.AsMemory(read, bodyLength - read), cts.Token);
      +                if (n == 0) break;
      +                read += n;
      +            }
      +
      +            var responseJson = Encoding.UTF8.GetString(body);
      +            try
      +            {
      +                var doc = JsonDocument.Parse(responseJson);
      +                var root = doc.RootElement;
      +                if (!root.TryGetProperty("id", out _)) continue; // notification skip
      +                if (root.TryGetProperty("result", out var result)) return result;
      +                if (root.TryGetProperty("error", out var error))
      +                {
      +                    var msg = error.TryGetProperty("message", out var m) ? m.GetString() : "Unknown";
      +                    LogService.Warn($"LSP RPC 오류: {msg}");
      +                    return null;
      +                }
      +            }
      +            catch (Exception) { continue; }
      +        }
      +
      +        return null;
      +    }
      +
      +    private async Task SendNotificationAsync(string method, CancellationToken ct)
      +    {
      +        if (_writer == null) return;
      +        var notification = new { jsonrpc = "2.0", method, @params = new { } };
      +        var json = JsonSerializer.Serialize(notification, JsonOpts);
      +        var content = Encoding.UTF8.GetBytes(json);
      +        var header = $"Content-Length: {content.Length}\r\n\r\n";
      +        await _writer.BaseStream.WriteAsync(Encoding.ASCII.GetBytes(header), ct);
      +        await _writer.BaseStream.WriteAsync(content, ct);
      +        await _writer.BaseStream.FlushAsync(ct);
      +    }
      +
      +    private async Task ReadHeaderAsync(CancellationToken ct)
      +    {
      +        var sb = new StringBuilder();
      +        var buf = new byte[1];
      +        var prevCr = false;
      +        int emptyLines = 0;
      +
      +        while (!ct.IsCancellationRequested)
      +        {
      +            var n = await _reader!.BaseStream.ReadAsync(buf, ct);
      +            if (n == 0) return null;
      +
      +            var ch = (char)buf[0];
      +            if (ch == '\r') { prevCr = true; continue; }
      +            if (ch == '\n')
      +            {
      +                if (prevCr && sb.Length > 0) return sb.ToString();
      +                if (prevCr) { emptyLines++; if (emptyLines >= 1 && sb.Length > 0) return sb.ToString(); }
      +                prevCr = false;
      +                continue;
      +            }
      +            prevCr = false;
      +            sb.Append(ch);
      +        }
      +        return null;
      +    }
      +
      +    private static int ParseContentLength(string header)
      +    {
      +        const string prefix = "Content-Length:";
      +        if (header.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
      +            if (int.TryParse(header[prefix.Length..].Trim(), out var len))
      +                return len;
      +        return 0;
      +    }
      +
      +    // ─── 결과 파싱 ──────────────────────────────────────────────────────────
      +
      +    private static LspLocation? ParseLocation(JsonElement? result)
      +    {
      +        if (result == null) return null;
      +        try
      +        {
      +            // 단일 Location 또는 배열의 첫 번째
      +            var elem = result.Value;
      +            if (elem.ValueKind == JsonValueKind.Array && elem.GetArrayLength() > 0)
      +                elem = elem[0];
      +            if (elem.TryGetProperty("uri", out var uri) && elem.TryGetProperty("range", out var range))
      +            {
      +                var start = range.GetProperty("start");
      +                return new LspLocation
      +                {
      +                    FilePath = UriToFile(uri.GetString() ?? ""),
      +                    Line = start.GetProperty("line").GetInt32(),
      +                    Character = start.GetProperty("character").GetInt32(),
      +                };
      +            }
      +        }
      +        catch (Exception) { }
      +        return null;
      +    }
      +
      +    private static List ParseLocations(JsonElement? result)
      +    {
      +        var list = new List();
      +        if (result?.ValueKind != JsonValueKind.Array) return list;
      +        foreach (var elem in result.Value.EnumerateArray())
      +        {
      +            if (elem.TryGetProperty("uri", out var uri) && elem.TryGetProperty("range", out var range))
      +            {
      +                var start = range.GetProperty("start");
      +                list.Add(new LspLocation
      +                {
      +                    FilePath = UriToFile(uri.GetString() ?? ""),
      +                    Line = start.GetProperty("line").GetInt32(),
      +                    Character = start.GetProperty("character").GetInt32(),
      +                });
      +            }
      +        }
      +        return list;
      +    }
      +
      +    private static List ParseSymbols(JsonElement? result)
      +    {
      +        var list = new List();
      +        if (result?.ValueKind != JsonValueKind.Array) return list;
      +        foreach (var elem in result.Value.EnumerateArray())
      +        {
      +            var name = elem.TryGetProperty("name", out var n) ? n.GetString() ?? "" : "";
      +            var kind = elem.TryGetProperty("kind", out var k) ? SymbolKindName(k.GetInt32()) : "unknown";
      +            var line = 0;
      +            if (elem.TryGetProperty("range", out var range))
      +                line = range.GetProperty("start").GetProperty("line").GetInt32();
      +            else if (elem.TryGetProperty("location", out var loc))
      +                line = loc.GetProperty("range").GetProperty("start").GetProperty("line").GetInt32();
      +
      +            list.Add(new LspSymbol { Name = name, Kind = kind, Line = line });
      +
      +            // 하위 심볼 (children)
      +            if (elem.TryGetProperty("children", out var children))
      +            {
      +                var childList = ParseSymbols(children);
      +                foreach (var child in childList)
      +                    list.Add(new LspSymbol { Name = $"  {child.Name}", Kind = child.Kind, Line = child.Line });
      +            }
      +        }
      +        return list;
      +    }
      +
      +    private static string SymbolKindName(int kind) => kind switch
      +    {
      +        1 => "file", 2 => "module", 3 => "namespace", 4 => "package",
      +        5 => "class", 6 => "method", 7 => "property", 8 => "field",
      +        9 => "constructor", 10 => "enum", 11 => "interface", 12 => "function",
      +        13 => "variable", 14 => "constant", 23 => "struct", 24 => "event",
      +        _ => "symbol"
      +    };
      +
      +    // ─── 유틸 ────────────────────────────────────────────────────────────────
      +
      +    private static string FileToUri(string path) =>
      +        $"file:///{path.Replace('\\', '/').TrimStart('/')}";
      +
      +    private static string UriToFile(string uri)
      +    {
      +        if (uri.StartsWith("file:///"))
      +            return uri[8..].Replace('/', '\\');
      +        return uri;
      +    }
      +
      +    private (string? Command, string[] Args) GetServerCommand() => _language switch
      +    {
      +        "csharp" or "c#" => FindCommand("OmniSharp", new[] { "omnisharp", "OmniSharp.exe" }, new[] { "--languageserver" }),
      +        "typescript" or "javascript" or "ts" or "js" =>
      +            FindCommand("TypeScript", new[] { "typescript-language-server" }, new[] { "--stdio" }),
      +        "python" or "py" =>
      +            FindCommand("Python", new[] { "pyright-langserver", "pylsp" }, new[] { "--stdio" }),
      +        "cpp" or "c++" or "c" =>
      +            FindCommand("C/C++", new[] { "clangd" }, Array.Empty()),
      +        "java" =>
      +            FindCommand("Java", new[] { "jdtls" }, Array.Empty()),
      +        _ => (null, Array.Empty())
      +    };
      +
      +    private static (string? Command, string[] Args) FindCommand(string label, string[] candidates, string[] defaultArgs)
      +    {
      +        foreach (var cmd in candidates)
      +        {
      +            try
      +            {
      +                using var which = Process.Start(new ProcessStartInfo
      +                {
      +                    FileName = Environment.OSVersion.Platform == PlatformID.Win32NT ? "where" : "which",
      +                    Arguments = cmd,
      +                    UseShellExecute = false,
      +                    RedirectStandardOutput = true,
      +                    CreateNoWindow = true,
      +                });
      +                which?.WaitForExit(3000);
      +                if (which?.ExitCode == 0)
      +                {
      +                    LogService.Info($"LSP [{label}]: {cmd} 발견");
      +                    return (cmd, defaultArgs);
      +                }
      +            }
      +            catch (Exception ex)
      +            {
      +                LogService.Debug($"LSP [{label}]: {cmd} 탐색 실패 — {ex.Message}");
      +            }
      +        }
      +        return (null, Array.Empty());
      +    }
      +
      +    public void Dispose()
      +    {
      +        try
      +        {
      +            _writer?.Dispose();
      +            _reader?.Dispose();
      +            if (_process is { HasExited: false })
      +            {
      +                _process.Kill(entireProcessTree: true);
      +                _process.Dispose();
      +            }
      +        }
      +        catch (Exception) { }
      +    }
      +}
      +
      +/// LSP 위치 정보.
      +public class LspLocation
      +{
      +    public string FilePath { get; init; } = "";
      +    public int Line { get; init; }
      +    public int Character { get; init; }
      +    public override string ToString() => $"{FilePath}:{Line + 1}:{Character + 1}";
      +}
      +
      +/// LSP 심볼 정보.
      +public class LspSymbol
      +{
      +    public string Name { get; init; } = "";
      +    public string Kind { get; init; } = "";
      +    public int Line { get; init; }
      +    public override string ToString() => $"[{Kind}] {Name} (line {Line + 1})";
      +}
      diff --git a/src/AxCopilot/Services/MarkdownRenderer.cs b/src/AxCopilot/Services/MarkdownRenderer.cs
      new file mode 100644
      index 0000000..c059248
      --- /dev/null
      +++ b/src/AxCopilot/Services/MarkdownRenderer.cs
      @@ -0,0 +1,824 @@
      +using System.Text.RegularExpressions;
      +using System.Windows;
      +using System.Windows.Controls;
      +using System.Windows.Documents;
      +using System.Windows.Media;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 간이 마크다운 → WPF UIElement 변환기.
      +/// 지원: **볼드**, *이탤릭*, `인라인코드`, ```코드블록```, ### 헤더, - 리스트, --- 구분선
      +/// 
      +public static class MarkdownRenderer
      +{
      +    public static StackPanel Render(string markdown, Brush textColor, Brush secondaryColor, Brush accentColor, Brush codeBg)
      +    {
      +        var panel = new StackPanel();
      +        if (string.IsNullOrEmpty(markdown))
      +            return panel;
      +
      +        var lines = markdown.Replace("\r\n", "\n").Split('\n');
      +        var i = 0;
      +
      +        while (i < lines.Length)
      +        {
      +            var line = lines[i];
      +
      +            // 코드 블록 ```
      +            if (line.TrimStart().StartsWith("```"))
      +            {
      +                var lang = line.TrimStart().Length > 3 ? line.TrimStart()[3..].Trim() : "";
      +                var codeLines = new System.Text.StringBuilder();
      +                i++;
      +                while (i < lines.Length && !lines[i].TrimStart().StartsWith("```"))
      +                {
      +                    codeLines.AppendLine(lines[i]);
      +                    i++;
      +                }
      +                if (i < lines.Length) i++; // skip closing ```
      +
      +                var codeBlock = CreateCodeBlock(codeLines.ToString().TrimEnd(), lang, textColor, codeBg, accentColor);
      +                panel.Children.Add(codeBlock);
      +                continue;
      +            }
      +
      +            // 빈 줄
      +            if (string.IsNullOrWhiteSpace(line))
      +            {
      +                panel.Children.Add(new Border { Height = 6 });
      +                i++;
      +                continue;
      +            }
      +
      +            // 구분선 ---
      +            if (Regex.IsMatch(line.Trim(), @"^-{3,}$|^\*{3,}$"))
      +            {
      +                panel.Children.Add(new Border
      +                {
      +                    Height = 1,
      +                    Background = secondaryColor,
      +                    Opacity = 0.3,
      +                    Margin = new Thickness(0, 8, 0, 8)
      +                });
      +                i++;
      +                continue;
      +            }
      +
      +            // 헤더 ###
      +            if (line.StartsWith('#'))
      +            {
      +                var level = 0;
      +                while (level < line.Length && line[level] == '#') level++;
      +                var headerText = line[level..].Trim();
      +                var fontSize = level switch { 1 => 20.0, 2 => 17.0, 3 => 15.0, _ => 14.0 };
      +
      +                var tb = new TextBlock
      +                {
      +                    FontSize = fontSize,
      +                    FontWeight = FontWeights.Bold,
      +                    Foreground = textColor,
      +                    TextWrapping = TextWrapping.Wrap,
      +                    Margin = new Thickness(0, level == 1 ? 12 : 8, 0, 4)
      +                };
      +                AddInlines(tb.Inlines, headerText, textColor, accentColor, codeBg);
      +                panel.Children.Add(tb);
      +                i++;
      +                continue;
      +            }
      +
      +            // 리스트 항목 - 또는 * 또는 숫자.
      +            if (Regex.IsMatch(line, @"^\s*[-*]\s") || Regex.IsMatch(line, @"^\s*\d+\.\s"))
      +            {
      +                var match = Regex.Match(line, @"^(\s*)([-*]|\d+\.)\s(.*)");
      +                if (match.Success)
      +                {
      +                    var indent = match.Groups[1].Value.Length / 2;
      +                    var bullet = match.Groups[2].Value;
      +                    var content = match.Groups[3].Value;
      +
      +                    var bulletChar = bullet is "-" or "*" ? "•" : bullet;
      +                    var grid = new Grid
      +                    {
      +                        Margin = new Thickness(12 + indent * 16, 2, 0, 2)
      +                    };
      +                    grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(18) });
      +                    grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
      +
      +                    var bulletTb = new TextBlock
      +                    {
      +                        Text = bulletChar,
      +                        FontSize = 13.5,
      +                        Foreground = accentColor,
      +                        VerticalAlignment = VerticalAlignment.Top
      +                    };
      +                    Grid.SetColumn(bulletTb, 0);
      +                    grid.Children.Add(bulletTb);
      +
      +                    var tb = new TextBlock
      +                    {
      +                        FontSize = 13.5,
      +                        Foreground = textColor,
      +                        TextWrapping = TextWrapping.Wrap,
      +                        VerticalAlignment = VerticalAlignment.Top
      +                    };
      +                    Grid.SetColumn(tb, 1);
      +                    AddInlines(tb.Inlines, content, textColor, accentColor, codeBg);
      +                    grid.Children.Add(tb);
      +                    panel.Children.Add(grid);
      +                }
      +                i++;
      +                continue;
      +            }
      +
      +            // 인용 블록 >
      +            if (line.TrimStart().StartsWith('>'))
      +            {
      +                var quoteLines = new List();
      +                while (i < lines.Length && lines[i].TrimStart().StartsWith('>'))
      +                {
      +                    var ql = lines[i].TrimStart();
      +                    quoteLines.Add(ql.Length > 1 ? ql[1..].TrimStart() : "");
      +                    i++;
      +                }
      +                var quoteBorder = new Border
      +                {
      +                    BorderBrush = accentColor,
      +                    BorderThickness = new Thickness(3, 0, 0, 0),
      +                    Padding = new Thickness(12, 6, 8, 6),
      +                    Margin = new Thickness(4, 4, 0, 4),
      +                    Background = new SolidColorBrush(Color.FromArgb(0x10, 0xFF, 0xFF, 0xFF)),
      +                };
      +                var quoteTb = new TextBlock
      +                {
      +                    FontSize = 13,
      +                    FontStyle = FontStyles.Italic,
      +                    Foreground = secondaryColor,
      +                    TextWrapping = TextWrapping.Wrap,
      +                    LineHeight = 20,
      +                };
      +                AddInlines(quoteTb.Inlines, string.Join("\n", quoteLines), textColor, accentColor, codeBg);
      +                quoteBorder.Child = quoteTb;
      +                panel.Children.Add(quoteBorder);
      +                continue;
      +            }
      +
      +            // 테이블 | col1 | col2 |
      +            if (line.Contains('|') && line.Trim().StartsWith('|'))
      +            {
      +                var tableRows = new List();
      +                while (i < lines.Length && lines[i].Contains('|'))
      +                {
      +                    tableRows.Add(lines[i]);
      +                    i++;
      +                }
      +                var table = CreateMarkdownTable(tableRows, textColor, accentColor, codeBg);
      +                if (table != null) panel.Children.Add(table);
      +                continue;
      +            }
      +
      +            // 일반 텍스트 단락
      +            var para = new TextBlock
      +            {
      +                FontSize = 13.5,
      +                Foreground = textColor,
      +                TextWrapping = TextWrapping.Wrap,
      +                LineHeight = 22,
      +                Margin = new Thickness(0, 2, 0, 2)
      +            };
      +            AddInlines(para.Inlines, line, textColor, accentColor, codeBg);
      +            panel.Children.Add(para);
      +            i++;
      +        }
      +
      +        return panel;
      +    }
      +
      +    /// 인라인 마크다운 처리: **볼드**, *이탤릭*, `코드`, ~~취소선~~, [링크](url)
      +    private static void AddInlines(InlineCollection inlines, string text, Brush textColor, Brush accentColor, Brush codeBg)
      +    {
      +        // 패턴: [link](url) | ~~strikethrough~~ | **bold** | *italic* | `code` | 일반텍스트
      +        var pattern = @"(\[([^\]]+)\]\(([^)]+)\)|~~(.+?)~~|\*\*(.+?)\*\*|\*(.+?)\*|`(.+?)`|([^*`~\[]+))";
      +        var matches = Regex.Matches(text, pattern);
      +
      +        foreach (Match m in matches)
      +        {
      +            if (m.Groups[2].Success && m.Groups[3].Success) // [link](url)
      +            {
      +                var linkUrl = m.Groups[3].Value;
      +                var hl = new Hyperlink(new Run(m.Groups[2].Value))
      +                {
      +                    Foreground = accentColor,
      +                    TextDecorations = null,
      +                    Cursor = System.Windows.Input.Cursors.Hand,
      +                };
      +                hl.Click += (_, _) =>
      +                {
      +                    try { System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(linkUrl) { UseShellExecute = true }); } catch (Exception) { }
      +                };
      +                inlines.Add(hl);
      +            }
      +            else if (m.Groups[4].Success) // ~~strikethrough~~
      +            {
      +                inlines.Add(new Run(m.Groups[4].Value)
      +                {
      +                    TextDecorations = TextDecorations.Strikethrough,
      +                    Foreground = new SolidColorBrush(Color.FromArgb(0x99, 0xFF, 0xFF, 0xFF)),
      +                });
      +            }
      +            else if (m.Groups[5].Success) // **bold**
      +            {
      +                inlines.Add(new Run(m.Groups[5].Value) { FontWeight = FontWeights.Bold });
      +            }
      +            else if (m.Groups[6].Success) // *italic*
      +            {
      +                inlines.Add(new Run(m.Groups[6].Value) { FontStyle = FontStyles.Italic });
      +            }
      +            else if (m.Groups[7].Success) // `code`
      +            {
      +                var codeBorder = new Border
      +                {
      +                    Background = codeBg,
      +                    CornerRadius = new CornerRadius(4),
      +                    Padding = new Thickness(5, 1, 5, 1),
      +                    Margin = new Thickness(1, 0, 1, 0),
      +                    Child = new TextBlock
      +                    {
      +                        Text = m.Groups[7].Value,
      +                        FontFamily = new FontFamily("Cascadia Code, Consolas, monospace"),
      +                        FontSize = 12.5,
      +                        Foreground = accentColor
      +                    }
      +                };
      +                inlines.Add(new InlineUIContainer(codeBorder) { BaselineAlignment = BaselineAlignment.Center });
      +            }
      +            else if (m.Groups[8].Success) // 일반 텍스트
      +            {
      +                AddPlainTextWithFilePaths(inlines, m.Groups[8].Value);
      +            }
      +        }
      +    }
      +
      +    /// 파일 경로 패턴을 파란색 강조하여 추가하는 정적 Regex.
      +    private static readonly Regex FilePathPattern = new(
      +        @"(?])(" +
      +        @"[A-Za-z]:\\[^\s<>""',;)]+|" +                               // 절대 경로: C:\folder\file.ext
      +        @"\.{1,2}/[\w\-./]+(?:\.[a-zA-Z]{1,10})?|" +                  // 상대 경로: ./src/file.cs
      +        @"[\w\-]+(?:/[\w\-\.]+){1,}(?:\.[a-zA-Z]{1,10})?|" +          // 폴더/파일: src/utils/helper.cs
      +        @"[\w\-]+\.(?:cs|py|js|ts|tsx|jsx|json|xml|html|htm|css|md|txt|yml|yaml|toml|sh|bat|ps1|csproj|sln|docx|xlsx|pptx|pdf|csv|enc|skill))" +
      +        @"(?=[,\s;)""'<]|$)",
      +        RegexOptions.Compiled);
      +
      +    /// 파일 경로 활성 여부 (설정 연동).
      +    public static bool EnableFilePathHighlight { get; set; } = true;
      +
      +    /// 일반 텍스트에서 파일 경로 패턴을 감지하여 파란색으로 강조합니다.
      +    private static void AddPlainTextWithFilePaths(InlineCollection inlines, string text)
      +    {
      +        if (!EnableFilePathHighlight)
      +        {
      +            inlines.Add(new Run(text));
      +            return;
      +        }
      +
      +        var matches = FilePathPattern.Matches(text);
      +        if (matches.Count == 0)
      +        {
      +            inlines.Add(new Run(text));
      +            return;
      +        }
      +
      +        var lastIndex = 0;
      +        foreach (Match pm in matches)
      +        {
      +            // 매치 전 텍스트
      +            if (pm.Index > lastIndex)
      +                inlines.Add(new Run(text[lastIndex..pm.Index]));
      +
      +            // 파일 경로 — 파란색 강조
      +            inlines.Add(new Run(pm.Value)
      +            {
      +                Foreground = new SolidColorBrush(Color.FromRgb(0x3B, 0x82, 0xF6)), // #3B82F6
      +                FontWeight = FontWeights.Medium,
      +            });
      +            lastIndex = pm.Index + pm.Length;
      +        }
      +
      +        // 남은 텍스트
      +        if (lastIndex < text.Length)
      +            inlines.Add(new Run(text[lastIndex..]));
      +    }
      +
      +    /// 마크다운 테이블을 Grid로 렌더링합니다.
      +    private static FrameworkElement? CreateMarkdownTable(List rows, Brush textColor, Brush accentColor, Brush codeBg)
      +    {
      +        if (rows.Count < 2) return null;
      +
      +        // 셀 파싱
      +        static string[] ParseRow(string row)
      +        {
      +            var trimmed = row.Trim().Trim('|');
      +            return trimmed.Split('|').Select(c => c.Trim()).ToArray();
      +        }
      +
      +        var headers = ParseRow(rows[0]);
      +        var colCount = headers.Length;
      +        if (colCount == 0) return null;
      +
      +        // 구분선 행(---|---) 건너뛰기
      +        var dataStart = 1;
      +        if (rows.Count > 1 && Regex.IsMatch(rows[1].Trim(), @"^[\|\s:\-]+$"))
      +            dataStart = 2;
      +
      +        var grid = new Grid { Margin = new Thickness(0, 6, 0, 6) };
      +        for (int c = 0; c < colCount; c++)
      +            grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
      +
      +        var rowIndex = 0;
      +
      +        // 헤더 행
      +        grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
      +        for (int c = 0; c < colCount; c++)
      +        {
      +            var cell = new Border
      +            {
      +                Background = new SolidColorBrush(Color.FromArgb(0x20, 0xFF, 0xFF, 0xFF)),
      +                BorderBrush = new SolidColorBrush(Color.FromArgb(0x30, 0xFF, 0xFF, 0xFF)),
      +                BorderThickness = new Thickness(0, 0, c < colCount - 1 ? 1 : 0, 1),
      +                Padding = new Thickness(8, 5, 8, 5),
      +            };
      +            var tb = new TextBlock
      +            {
      +                Text = c < headers.Length ? headers[c] : "",
      +                FontSize = 12, FontWeight = FontWeights.SemiBold,
      +                Foreground = textColor, TextWrapping = TextWrapping.Wrap,
      +            };
      +            cell.Child = tb;
      +            Grid.SetRow(cell, rowIndex);
      +            Grid.SetColumn(cell, c);
      +            grid.Children.Add(cell);
      +        }
      +        rowIndex++;
      +
      +        // 데이터 행
      +        for (int r = dataStart; r < rows.Count; r++)
      +        {
      +            var cols = ParseRow(rows[r]);
      +            grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
      +            for (int c = 0; c < colCount; c++)
      +            {
      +                var cell = new Border
      +                {
      +                    Background = r % 2 == 0
      +                        ? new SolidColorBrush(Color.FromArgb(0x08, 0xFF, 0xFF, 0xFF))
      +                        : Brushes.Transparent,
      +                    BorderBrush = new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)),
      +                    BorderThickness = new Thickness(0, 0, c < colCount - 1 ? 1 : 0, 1),
      +                    Padding = new Thickness(8, 4, 8, 4),
      +                };
      +                var tb = new TextBlock
      +                {
      +                    FontSize = 12, Foreground = textColor, TextWrapping = TextWrapping.Wrap,
      +                };
      +                AddInlines(tb.Inlines, c < cols.Length ? cols[c] : "", textColor, accentColor, codeBg);
      +                cell.Child = tb;
      +                Grid.SetRow(cell, rowIndex);
      +                Grid.SetColumn(cell, c);
      +                grid.Children.Add(cell);
      +            }
      +            rowIndex++;
      +        }
      +
      +        var wrapper = new Border
      +        {
      +            CornerRadius = new CornerRadius(6),
      +            BorderBrush = new SolidColorBrush(Color.FromArgb(0x30, 0xFF, 0xFF, 0xFF)),
      +            BorderThickness = new Thickness(1),
      +            ClipToBounds = true,
      +            Margin = new Thickness(0, 4, 0, 4),
      +        };
      +        wrapper.Child = grid;
      +        return wrapper;
      +    }
      +
      +    /// 코드 블록 UI 생성 (헤더 + 복사 버튼 + 코드)
      +    private static Border CreateCodeBlock(string code, string lang, Brush textColor, Brush codeBg, Brush accentColor)
      +    {
      +        var container = new Border
      +        {
      +            Background = codeBg,
      +            CornerRadius = new CornerRadius(10),
      +            Margin = new Thickness(0, 6, 0, 6),
      +            Padding = new Thickness(0)
      +        };
      +
      +        var stack = new StackPanel();
      +
      +        // 헤더 (언어 + 복사 버튼)
      +        var header = new Border
      +        {
      +            Background = new SolidColorBrush(Color.FromArgb(30, 255, 255, 255)),
      +            CornerRadius = new CornerRadius(10, 10, 0, 0),
      +            Padding = new Thickness(14, 6, 8, 6)
      +        };
      +        var headerGrid = new Grid();
      +        headerGrid.Children.Add(new TextBlock
      +        {
      +            Text = string.IsNullOrEmpty(lang) ? "code" : lang,
      +            FontSize = 11,
      +            Foreground = accentColor,
      +            FontWeight = FontWeights.SemiBold,
      +            VerticalAlignment = VerticalAlignment.Center
      +        });
      +
      +        // 우측 버튼 패널
      +        var btnPanel = new StackPanel
      +        {
      +            Orientation = Orientation.Horizontal,
      +            HorizontalAlignment = HorizontalAlignment.Right,
      +            VerticalAlignment = VerticalAlignment.Center,
      +        };
      +
      +        var capturedCode = code;
      +        var capturedLang = lang;
      +
      +        // 파일 저장 버튼
      +        var saveBtn = CreateCodeHeaderButton("\uE74E", "저장", textColor);
      +        saveBtn.Click += (_, _) =>
      +        {
      +            try
      +            {
      +                var ext = GetExtensionForLang(capturedLang);
      +                var dlg = new Microsoft.Win32.SaveFileDialog
      +                {
      +                    FileName = $"code{ext}",
      +                    Filter = $"코드 파일 (*{ext})|*{ext}|모든 파일 (*.*)|*.*",
      +                };
      +                if (dlg.ShowDialog() == true)
      +                    System.IO.File.WriteAllText(dlg.FileName, capturedCode);
      +            }
      +            catch (Exception) { }
      +        };
      +        btnPanel.Children.Add(saveBtn);
      +
      +        // 전체화면 버튼
      +        var expandBtn = CreateCodeHeaderButton("\uE740", "확대", textColor);
      +        expandBtn.Click += (_, _) => ShowCodeFullScreen(capturedCode, capturedLang, codeBg, textColor);
      +        btnPanel.Children.Add(expandBtn);
      +
      +        // 복사 버튼
      +        var copyBtn = CreateCodeHeaderButton("\uE8C8", "복사", textColor);
      +        copyBtn.Click += (_, _) => { try { Clipboard.SetText(capturedCode); } catch (Exception) { } };
      +        btnPanel.Children.Add(copyBtn);
      +
      +        headerGrid.Children.Add(btnPanel);
      +        header.Child = headerGrid;
      +        stack.Children.Add(header);
      +
      +        // 코드 본문 (라인 번호 + 구문 하이라이팅)
      +        var codeGrid = new Grid { Margin = new Thickness(0, 0, 0, 4) };
      +        codeGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
      +        codeGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
      +
      +        // 라인 번호
      +        var codeLines = code.Split('\n');
      +        var lineNumbers = new TextBlock
      +        {
      +            FontFamily = new FontFamily("Cascadia Code, Consolas, monospace"),
      +            FontSize = 12.5,
      +            Foreground = new SolidColorBrush(Color.FromArgb(0x50, 0xFF, 0xFF, 0xFF)),
      +            Padding = new Thickness(10, 10, 6, 14),
      +            LineHeight = 20,
      +            TextAlignment = TextAlignment.Right,
      +            Text = string.Join("\n", Enumerable.Range(1, codeLines.Length)),
      +        };
      +        Grid.SetColumn(lineNumbers, 0);
      +        codeGrid.Children.Add(lineNumbers);
      +
      +        var codeText = new TextBlock
      +        {
      +            FontFamily = new FontFamily("Cascadia Code, Consolas, monospace"),
      +            FontSize = 12.5,
      +            Foreground = textColor,
      +            TextWrapping = TextWrapping.Wrap,
      +            Padding = new Thickness(8, 10, 14, 14),
      +            LineHeight = 20
      +        };
      +        ApplySyntaxHighlighting(codeText, code, lang, textColor);
      +        Grid.SetColumn(codeText, 1);
      +        codeGrid.Children.Add(codeText);
      +
      +        stack.Children.Add(codeGrid);
      +
      +        container.Child = stack;
      +        return container;
      +    }
      +
      +    private static Button CreateCodeHeaderButton(string mdlIcon, string label, Brush fg)
      +    {
      +        return new Button
      +        {
      +            Background = Brushes.Transparent,
      +            BorderThickness = new Thickness(0),
      +            Cursor = System.Windows.Input.Cursors.Hand,
      +            VerticalAlignment = VerticalAlignment.Center,
      +            Padding = new Thickness(5, 2, 5, 2),
      +            Margin = new Thickness(2, 0, 0, 0),
      +            Content = new StackPanel
      +            {
      +                Orientation = Orientation.Horizontal,
      +                Children =
      +                {
      +                    new TextBlock
      +                    {
      +                        Text = mdlIcon,
      +                        FontFamily = new FontFamily("Segoe MDL2 Assets"),
      +                        FontSize = 10, Foreground = fg, Opacity = 0.6,
      +                        VerticalAlignment = VerticalAlignment.Center,
      +                        Margin = new Thickness(0, 0, 3, 0),
      +                    },
      +                    new TextBlock { Text = label, FontSize = 10, Foreground = fg, Opacity = 0.6 },
      +                }
      +            }
      +        };
      +    }
      +
      +    private static string GetExtensionForLang(string lang) => (lang ?? "").ToLowerInvariant() switch
      +    {
      +        "csharp" or "cs" => ".cs",
      +        "python" or "py" => ".py",
      +        "javascript" or "js" => ".js",
      +        "typescript" or "ts" => ".ts",
      +        "java" => ".java",
      +        "html" => ".html",
      +        "css" => ".css",
      +        "json" => ".json",
      +        "xml" => ".xml",
      +        "sql" => ".sql",
      +        "bash" or "sh" or "shell" => ".sh",
      +        "powershell" or "ps1" => ".ps1",
      +        "bat" or "cmd" => ".bat",
      +        "yaml" or "yml" => ".yml",
      +        "markdown" or "md" => ".md",
      +        "cpp" or "c++" => ".cpp",
      +        "c" => ".c",
      +        "go" => ".go",
      +        "rust" or "rs" => ".rs",
      +        _ => ".txt",
      +    };
      +
      +    private static void ShowCodeFullScreen(string code, string lang, Brush codeBg, Brush textColor)
      +    {
      +        var win = new Window
      +        {
      +            Title = $"코드 — {(string.IsNullOrEmpty(lang) ? "code" : lang)}",
      +            Width = 900, Height = 650,
      +            WindowStartupLocation = WindowStartupLocation.CenterScreen,
      +            Background = codeBg is SolidColorBrush scb ? new SolidColorBrush(scb.Color) : Brushes.Black,
      +        };
      +
      +        var grid = new Grid();
      +        grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
      +        grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
      +
      +        var lines = code.Split('\n');
      +
      +        var lineNumTb = new TextBlock
      +        {
      +            FontFamily = new FontFamily("Cascadia Code, Consolas, monospace"),
      +            FontSize = 13, LineHeight = 22,
      +            Foreground = new SolidColorBrush(Color.FromArgb(0x50, 0xFF, 0xFF, 0xFF)),
      +            Padding = new Thickness(16, 16, 8, 16),
      +            TextAlignment = TextAlignment.Right,
      +            Text = string.Join("\n", Enumerable.Range(1, lines.Length)),
      +        };
      +        Grid.SetColumn(lineNumTb, 0);
      +        grid.Children.Add(lineNumTb);
      +
      +        var codeTb = new TextBlock
      +        {
      +            FontFamily = new FontFamily("Cascadia Code, Consolas, monospace"),
      +            FontSize = 13, LineHeight = 22,
      +            Foreground = textColor,
      +            TextWrapping = TextWrapping.Wrap,
      +            Padding = new Thickness(8, 16, 16, 16),
      +        };
      +        ApplySyntaxHighlighting(codeTb, code, lang, textColor);
      +        Grid.SetColumn(codeTb, 1);
      +        grid.Children.Add(codeTb);
      +
      +        var sv = new ScrollViewer
      +        {
      +            VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
      +            HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
      +            Content = grid,
      +        };
      +        win.Content = sv;
      +        win.Show();
      +    }
      +
      +    // ─── 구문 하이라이팅 ──────────────────────────────────────────────────
      +
      +    private static readonly Brush KeywordBrush = new SolidColorBrush(Color.FromRgb(0xC5, 0x86, 0xC0));   // purple
      +    private static readonly Brush TypeBrush = new SolidColorBrush(Color.FromRgb(0x4E, 0xC9, 0xB0));      // teal
      +    private static readonly Brush StringBrush = new SolidColorBrush(Color.FromRgb(0xCE, 0x91, 0x78));    // orange
      +    private static readonly Brush CommentBrush = new SolidColorBrush(Color.FromRgb(0x6A, 0x99, 0x55));   // green
      +    private static readonly Brush NumberBrush = new SolidColorBrush(Color.FromRgb(0xB5, 0xCE, 0xA8));    // light green
      +    private static readonly Brush MethodBrush = new SolidColorBrush(Color.FromRgb(0xDC, 0xDC, 0xAA));    // yellow
      +    private static readonly Brush DirectiveBrush = new SolidColorBrush(Color.FromRgb(0x9C, 0xDC, 0xFE)); // light blue
      +
      +    private static readonly HashSet CSharpKeywords = new(StringComparer.Ordinal)
      +    {
      +        "abstract","as","async","await","base","bool","break","byte","case","catch","char","checked",
      +        "class","const","continue","decimal","default","delegate","do","double","else","enum","event",
      +        "explicit","extern","false","finally","fixed","float","for","foreach","goto","if","implicit",
      +        "in","int","interface","internal","is","lock","long","namespace","new","null","object","operator",
      +        "out","override","params","private","protected","public","readonly","ref","return","sbyte","sealed",
      +        "short","sizeof","stackalloc","static","string","struct","switch","this","throw","true","try",
      +        "typeof","uint","ulong","unchecked","unsafe","ushort","using","var","virtual","void","volatile",
      +        "while","yield","record","init","required","get","set","value","where","when","and","or","not",
      +    };
      +
      +    private static readonly HashSet PythonKeywords = new(StringComparer.Ordinal)
      +    {
      +        "False","None","True","and","as","assert","async","await","break","class","continue","def",
      +        "del","elif","else","except","finally","for","from","global","if","import","in","is","lambda",
      +        "nonlocal","not","or","pass","raise","return","try","while","with","yield",
      +    };
      +
      +    private static readonly HashSet JsKeywords = new(StringComparer.Ordinal)
      +    {
      +        "abstract","arguments","async","await","boolean","break","byte","case","catch","char","class",
      +        "const","continue","debugger","default","delete","do","double","else","enum","eval","export",
      +        "extends","false","final","finally","float","for","from","function","goto","if","implements",
      +        "import","in","instanceof","int","interface","let","long","native","new","null","of","package",
      +        "private","protected","public","return","short","static","super","switch","synchronized","this",
      +        "throw","throws","transient","true","try","typeof","undefined","var","void","volatile","while",
      +        "with","yield",
      +    };
      +
      +    private static readonly HashSet JavaKeywords = new(StringComparer.Ordinal)
      +    {
      +        "abstract","assert","boolean","break","byte","case","catch","char","class","const","continue",
      +        "default","do","double","else","enum","extends","false","final","finally","float","for","goto",
      +        "if","implements","import","instanceof","int","interface","long","native","new","null","package",
      +        "private","protected","public","return","short","static","strictfp","super","switch","synchronized",
      +        "this","throw","throws","transient","true","try","void","volatile","while","var","record","sealed",
      +        "permits","yield",
      +    };
      +
      +    private static readonly HashSet SqlKeywords = new(StringComparer.OrdinalIgnoreCase)
      +    {
      +        "SELECT","FROM","WHERE","INSERT","INTO","UPDATE","SET","DELETE","CREATE","DROP","ALTER","TABLE",
      +        "INDEX","VIEW","JOIN","INNER","LEFT","RIGHT","OUTER","FULL","CROSS","ON","AND","OR","NOT","IN",
      +        "IS","NULL","LIKE","BETWEEN","EXISTS","HAVING","GROUP","BY","ORDER","ASC","DESC","LIMIT","OFFSET",
      +        "UNION","ALL","DISTINCT","AS","CASE","WHEN","THEN","ELSE","END","VALUES","PRIMARY","KEY","FOREIGN",
      +        "REFERENCES","CONSTRAINT","UNIQUE","CHECK","DEFAULT","COUNT","SUM","AVG","MIN","MAX","CAST",
      +        "COALESCE","IF","BEGIN","COMMIT","ROLLBACK","GRANT","REVOKE","TRUNCATE","WITH","RECURSIVE",
      +    };
      +
      +    private static HashSet GetKeywordsForLang(string lang) => lang.ToLowerInvariant() switch
      +    {
      +        "csharp" or "cs" or "c#" => CSharpKeywords,
      +        "python" or "py" => PythonKeywords,
      +        "javascript" or "js" or "jsx" => JsKeywords,
      +        "typescript" or "ts" or "tsx" => JsKeywords,
      +        "java" or "kotlin" or "kt" => JavaKeywords,
      +        "sql" or "mysql" or "postgresql" or "sqlite" => SqlKeywords,
      +        "go" or "golang" => new(StringComparer.Ordinal)
      +        {
      +            "break","case","chan","const","continue","default","defer","else","fallthrough","for","func",
      +            "go","goto","if","import","interface","map","package","range","return","select","struct",
      +            "switch","type","var","nil","true","false","append","len","cap","make","new","panic","recover",
      +        },
      +        "rust" or "rs" => new(StringComparer.Ordinal)
      +        {
      +            "as","async","await","break","const","continue","crate","dyn","else","enum","extern","false",
      +            "fn","for","if","impl","in","let","loop","match","mod","move","mut","pub","ref","return",
      +            "self","Self","static","struct","super","trait","true","type","unsafe","use","where","while",
      +            "yield","Box","Vec","String","Option","Result","Some","None","Ok","Err","println","macro_rules",
      +        },
      +        "cpp" or "c++" or "c" or "h" or "hpp" => new(StringComparer.Ordinal)
      +        {
      +            "auto","break","case","char","const","continue","default","do","double","else","enum","extern",
      +            "float","for","goto","if","inline","int","long","register","return","short","signed","sizeof",
      +            "static","struct","switch","typedef","union","unsigned","void","volatile","while","class",
      +            "namespace","using","public","private","protected","virtual","override","template","typename",
      +            "nullptr","true","false","new","delete","throw","try","catch","const_cast","dynamic_cast",
      +            "static_cast","reinterpret_cast","bool","string","include","define","ifdef","ifndef","endif",
      +        },
      +        _ => CSharpKeywords, // default
      +    };
      +
      +    private static readonly Regex SyntaxPattern = new(
      +        @"(//[^\n]*|#[^\n]*)" +                           // single-line comment (// or #)
      +        @"|(""(?:[^""\\]|\\.)*""|'(?:[^'\\]|\\.)*')" +    // strings
      +        @"|(\b\d+\.?\d*[fFdDmMlL]?\b)" +                 // numbers
      +        @"|(\b[A-Z]\w*(?=\s*[\.<\(]))" +                  // type-like (PascalCase before . < ()
      +        @"|(\b\w+(?=\s*\())" +                            // method call
      +        @"|(\b\w+\b)",                                    // identifier / keyword
      +        RegexOptions.Compiled);
      +
      +    private static void ApplySyntaxHighlighting(TextBlock tb, string code, string lang, Brush defaultColor)
      +    {
      +        if (string.IsNullOrEmpty(lang) || string.IsNullOrEmpty(code))
      +        {
      +            tb.Text = code;
      +            return;
      +        }
      +
      +        var keywords = GetKeywordsForLang(lang);
      +        var isCommentHash = lang.ToLowerInvariant() is "python" or "py" or "bash" or "sh" or "shell"
      +                            or "ruby" or "rb" or "yaml" or "yml" or "toml" or "powershell" or "ps1";
      +
      +        foreach (Match m in SyntaxPattern.Matches(code))
      +        {
      +            if (m.Groups[1].Success) // comment
      +            {
      +                var commentText = m.Groups[1].Value;
      +                // # 주석은 해당 언어에서만 적용
      +                if (commentText.StartsWith('#') && !isCommentHash)
      +                {
      +                    // # 이 주석이 아닌 언어: 일반 텍스트로 처리
      +                    tb.Inlines.Add(new Run(commentText) { Foreground = defaultColor });
      +                }
      +                else
      +                {
      +                    tb.Inlines.Add(new Run(commentText) { Foreground = CommentBrush, FontStyle = FontStyles.Italic });
      +                }
      +            }
      +            else if (m.Groups[2].Success) // string
      +            {
      +                tb.Inlines.Add(new Run(m.Groups[2].Value) { Foreground = StringBrush });
      +            }
      +            else if (m.Groups[3].Success) // number
      +            {
      +                tb.Inlines.Add(new Run(m.Groups[3].Value) { Foreground = NumberBrush });
      +            }
      +            else if (m.Groups[4].Success) // type
      +            {
      +                var word = m.Groups[4].Value;
      +                tb.Inlines.Add(new Run(word) { Foreground = keywords.Contains(word) ? KeywordBrush : TypeBrush });
      +            }
      +            else if (m.Groups[5].Success) // method
      +            {
      +                var word = m.Groups[5].Value;
      +                if (keywords.Contains(word))
      +                    tb.Inlines.Add(new Run(word) { Foreground = KeywordBrush });
      +                else
      +                    tb.Inlines.Add(new Run(word) { Foreground = MethodBrush });
      +            }
      +            else if (m.Groups[6].Success) // identifier
      +            {
      +                var word = m.Groups[6].Value;
      +                if (keywords.Contains(word))
      +                    tb.Inlines.Add(new Run(word) { Foreground = KeywordBrush });
      +                else
      +                    tb.Inlines.Add(new Run(word) { Foreground = defaultColor });
      +            }
      +        }
      +
      +        // Regex가 매치하지 못한 나머지 문자(공백, 기호 등)를 채움
      +        // Inlines로 빌드했으므로 원본과 비교하여 누락된 부분 보완
      +        // 대신 각 매치 사이의 간격을 처리하기 위해 인덱스 기반 접근
      +        tb.Inlines.Clear();
      +        int lastEnd = 0;
      +        foreach (Match m in SyntaxPattern.Matches(code))
      +        {
      +            if (m.Index > lastEnd)
      +                tb.Inlines.Add(new Run(code[lastEnd..m.Index]) { Foreground = defaultColor });
      +
      +            if (m.Groups[1].Success)
      +            {
      +                var commentText = m.Groups[1].Value;
      +                if (commentText.StartsWith('#') && !isCommentHash)
      +                    tb.Inlines.Add(new Run(commentText) { Foreground = defaultColor });
      +                else
      +                    tb.Inlines.Add(new Run(commentText) { Foreground = CommentBrush, FontStyle = FontStyles.Italic });
      +            }
      +            else if (m.Groups[2].Success)
      +                tb.Inlines.Add(new Run(m.Groups[2].Value) { Foreground = StringBrush });
      +            else if (m.Groups[3].Success)
      +                tb.Inlines.Add(new Run(m.Groups[3].Value) { Foreground = NumberBrush });
      +            else if (m.Groups[4].Success)
      +            {
      +                var word = m.Groups[4].Value;
      +                tb.Inlines.Add(new Run(word) { Foreground = keywords.Contains(word) ? KeywordBrush : TypeBrush });
      +            }
      +            else if (m.Groups[5].Success)
      +            {
      +                var word = m.Groups[5].Value;
      +                tb.Inlines.Add(new Run(word) { Foreground = keywords.Contains(word) ? KeywordBrush : MethodBrush });
      +            }
      +            else if (m.Groups[6].Success)
      +            {
      +                var word = m.Groups[6].Value;
      +                tb.Inlines.Add(new Run(word) { Foreground = keywords.Contains(word) ? KeywordBrush : defaultColor });
      +            }
      +
      +            lastEnd = m.Index + m.Length;
      +        }
      +        if (lastEnd < code.Length)
      +            tb.Inlines.Add(new Run(code[lastEnd..]) { Foreground = defaultColor });
      +    }
      +}
      diff --git a/src/AxCopilot/Services/McpClientService.cs b/src/AxCopilot/Services/McpClientService.cs
      new file mode 100644
      index 0000000..f9b1637
      --- /dev/null
      +++ b/src/AxCopilot/Services/McpClientService.cs
      @@ -0,0 +1,266 @@
      +using System.Diagnostics;
      +using System.IO;
      +using System.Text;
      +using System.Text.Json;
      +using AxCopilot.Models;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// MCP (Model Context Protocol) stdio 클라이언트.
      +/// 외부 MCP 서버 프로세스를 실행하고 JSON-RPC 2.0으로 통신합니다.
      +/// 
      +public class McpClientService : IDisposable
      +{
      +    private readonly McpServerEntry _config;
      +    private Process? _process;
      +    private StreamWriter? _writer;
      +    private StreamReader? _reader;
      +    private int _requestId;
      +    internal bool _initialized;
      +    private readonly List _tools = new();
      +
      +    public string ServerName => _config.Name;
      +    public bool IsConnected => _process is { HasExited: false };
      +    public IReadOnlyList Tools => _tools;
      +
      +    private static readonly JsonSerializerOptions _jsonOpts = new()
      +    {
      +        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
      +        Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
      +    };
      +
      +    public McpClientService(McpServerEntry config)
      +    {
      +        _config = config;
      +    }
      +
      +    /// MCP 서버 프로세스를 시작하고 초기화합니다.
      +    public async Task ConnectAsync(CancellationToken ct = default)
      +    {
      +        try
      +        {
      +            if (string.IsNullOrEmpty(_config.Command))
      +            {
      +                LogService.Warn($"MCP '{_config.Name}': command가 비어있습니다.");
      +                return false;
      +            }
      +
      +            var psi = new ProcessStartInfo
      +            {
      +                FileName = _config.Command,
      +                UseShellExecute = false,
      +                RedirectStandardInput = true,
      +                RedirectStandardOutput = true,
      +                RedirectStandardError = true,
      +                CreateNoWindow = true,
      +                StandardOutputEncoding = Encoding.UTF8,
      +                StandardErrorEncoding = Encoding.UTF8,
      +            };
      +
      +            foreach (var arg in _config.Args)
      +                psi.ArgumentList.Add(arg);
      +
      +            foreach (var (key, value) in _config.Env)
      +                psi.Environment[key] = value;
      +
      +            _process = Process.Start(psi);
      +            if (_process == null)
      +            {
      +                LogService.Warn($"MCP '{_config.Name}': 프로세스 시작 실패.");
      +                return false;
      +            }
      +
      +            _writer = _process.StandardInput;
      +            _reader = _process.StandardOutput;
      +
      +            // JSON-RPC: initialize
      +            var initResult = await SendRequestAsync("initialize", new
      +            {
      +                protocolVersion = "2024-11-05",
      +                capabilities = new { },
      +                clientInfo = new { name = "AX Copilot", version = "1.8.0" },
      +            }, ct);
      +
      +            if (initResult == null) return false;
      +
      +            // initialized notification
      +            await SendNotificationAsync("notifications/initialized", ct);
      +
      +            _initialized = true;
      +
      +            // 도구 목록 가져오기
      +            await RefreshToolsAsync(ct);
      +
      +            LogService.Info($"MCP '{_config.Name}': 연결 성공 ({_tools.Count}개 도구).");
      +            return true;
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"MCP '{_config.Name}' 연결 실패: {ex.Message}");
      +            return false;
      +        }
      +    }
      +
      +    /// 서버에서 사용 가능한 도구 목록을 갱신합니다.
      +    public async Task RefreshToolsAsync(CancellationToken ct = default)
      +    {
      +        _tools.Clear();
      +        var result = await SendRequestAsync("tools/list", new { }, ct);
      +        if (result == null) return;
      +
      +        try
      +        {
      +            if (result.Value.TryGetProperty("tools", out var toolsArr))
      +            {
      +                foreach (var tool in toolsArr.EnumerateArray())
      +                {
      +                    var def = new McpToolDefinition
      +                    {
      +                        Name = tool.GetProperty("name").GetString() ?? "",
      +                        Description = tool.TryGetProperty("description", out var desc) ? desc.GetString() ?? "" : "",
      +                        ServerName = _config.Name,
      +                    };
      +
      +                    if (tool.TryGetProperty("inputSchema", out var schema) &&
      +                        schema.TryGetProperty("properties", out var props))
      +                    {
      +                        foreach (var prop in props.EnumerateObject())
      +                        {
      +                            def.Parameters[prop.Name] = new McpParameterDef
      +                            {
      +                                Type = prop.Value.TryGetProperty("type", out var t) ? t.GetString() ?? "string" : "string",
      +                                Description = prop.Value.TryGetProperty("description", out var d) ? d.GetString() ?? "" : "",
      +                            };
      +                        }
      +
      +                        if (schema.TryGetProperty("required", out var reqArr))
      +                        {
      +                            foreach (var req in reqArr.EnumerateArray())
      +                            {
      +                                var reqName = req.GetString();
      +                                if (reqName != null && def.Parameters.TryGetValue(reqName, out var p))
      +                                    p.Required = true;
      +                            }
      +                        }
      +                    }
      +
      +                    _tools.Add(def);
      +                }
      +            }
      +        }
      +        catch (Exception ex)
      +        {
      +            LogService.Warn($"MCP '{_config.Name}' 도구 파싱 실패: {ex.Message}");
      +        }
      +    }
      +
      +    /// MCP 도구를 호출합니다.
      +    public async Task CallToolAsync(string toolName, Dictionary arguments, CancellationToken ct = default)
      +    {
      +        var result = await SendRequestAsync("tools/call", new
      +        {
      +            name = toolName,
      +            arguments,
      +        }, ct);
      +
      +        if (result == null) return "[MCP 호출 실패]";
      +
      +        try
      +        {
      +            if (result.Value.TryGetProperty("content", out var contentArr))
      +            {
      +                var sb = new StringBuilder();
      +                foreach (var item in contentArr.EnumerateArray())
      +                {
      +                    if (item.TryGetProperty("text", out var text))
      +                        sb.AppendLine(text.GetString());
      +                }
      +                return sb.ToString().TrimEnd();
      +            }
      +
      +            if (result.Value.TryGetProperty("isError", out var isErr) && isErr.GetBoolean())
      +            {
      +                return $"[MCP 오류] {result}";
      +            }
      +        }
      +        catch (Exception) { }
      +
      +        return result?.ToString() ?? "[MCP 빈 응답]";
      +    }
      +
      +    private async Task SendRequestAsync(string method, object parameters, CancellationToken ct)
      +    {
      +        if (_writer == null || _reader == null) return null;
      +
      +        var id = Interlocked.Increment(ref _requestId);
      +        var request = new
      +        {
      +            jsonrpc = "2.0",
      +            id,
      +            method,
      +            @params = parameters,
      +        };
      +
      +        var json = JsonSerializer.Serialize(request, _jsonOpts);
      +        await _writer.WriteLineAsync(json);
      +        await _writer.FlushAsync();
      +
      +        // 응답 읽기 (동기식 대기, 타임아웃 10초)
      +        using var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);
      +        cts.CancelAfter(TimeSpan.FromSeconds(10));
      +
      +        while (!cts.Token.IsCancellationRequested)
      +        {
      +            var line = await _reader.ReadLineAsync(cts.Token);
      +            if (string.IsNullOrWhiteSpace(line)) continue;
      +
      +            try
      +            {
      +                var doc = JsonDocument.Parse(line);
      +                var root = doc.RootElement;
      +
      +                // notification은 건너뛰기
      +                if (!root.TryGetProperty("id", out _)) continue;
      +
      +                if (root.TryGetProperty("result", out var result))
      +                    return result;
      +
      +                if (root.TryGetProperty("error", out var error))
      +                {
      +                    var msg = error.TryGetProperty("message", out var m) ? m.GetString() : "Unknown error";
      +                    LogService.Warn($"MCP '{_config.Name}' RPC 오류: {msg}");
      +                    return null;
      +                }
      +            }
      +            catch (Exception) { continue; }
      +        }
      +
      +        return null;
      +    }
      +
      +    private async Task SendNotificationAsync(string method, CancellationToken ct)
      +    {
      +        if (_writer == null) return;
      +
      +        var notification = new { jsonrpc = "2.0", method };
      +        var json = JsonSerializer.Serialize(notification, _jsonOpts);
      +        await _writer.WriteLineAsync(json);
      +        await _writer.FlushAsync();
      +    }
      +
      +    public void Dispose()
      +    {
      +        try
      +        {
      +            _writer?.Dispose();
      +            _reader?.Dispose();
      +            if (_process is { HasExited: false })
      +            {
      +                _process.Kill(entireProcessTree: true);
      +                _process.Dispose();
      +            }
      +        }
      +        catch (Exception) { }
      +    }
      +}
      diff --git a/src/AxCopilot/Services/ModelRouterService.cs b/src/AxCopilot/Services/ModelRouterService.cs
      new file mode 100644
      index 0000000..f379cf0
      --- /dev/null
      +++ b/src/AxCopilot/Services/ModelRouterService.cs
      @@ -0,0 +1,241 @@
      +using AxCopilot.Models;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 자동 모델 라우팅 결과.
      +/// 
      +public record ModelRouteResult(
      +    string Service,
      +    string Model,
      +    string DisplayName,
      +    string DetectedIntent,
      +    double Confidence);
      +
      +/// 
      +/// 사용자 메시지의 인텐트를 분석하여 최적 모델을 선택하는 라우터.
      +/// 현재는 잠금 상태(EnableAutoRouter=false)이며, 사내 서버 확정 후 활성화 예정.
      +///
      +/// 개발자 가이드:
      +/// - 하드코딩 기본값 수정: GetDefaultCapabilities() 메서드
      +/// - 사내 Ollama/vLLM 모델 추가: GetDefaultCapabilities()에 항목 추가
      +/// - 확신도 조정: Route() 메서드의 confidence 체크 로직
      +/// 
      +public class ModelRouterService
      +{
      +    private readonly SettingsService _settings;
      +
      +    public ModelRouterService(SettingsService settings)
      +    {
      +        _settings = settings;
      +    }
      +
      +    /// 
      +    /// 사용자 메시지를 분석하여 최적 모델을 선택합니다.
      +    /// 
      +    /// 라우팅 결과. null이면 기본 모델 유지.
      +    public ModelRouteResult? Route(string userMessage)
      +    {
      +        var llm = _settings.Settings.Llm;
      +
      +        // 1. 자동 라우팅 비활성이면 즉시 반환
      +        if (!llm.EnableAutoRouter)
      +            return null;
      +
      +        // 2. 인텐트 감지
      +        var (category, confidence) = IntentDetector.Detect(userMessage);
      +
      +        // 3. 확신도 미달이면 기본 모델 유지
      +        if (confidence < llm.AutoRouterConfidence)
      +            return null;
      +
      +        // 4. 일반 대화는 라우팅 불필요
      +        if (category == IntentDetector.Categories.General)
      +            return null;
      +
      +        // 5. 후보 수집: 사용자 설정 + 하드코딩 기본값
      +        var candidates = GatherCandidates(llm);
      +        if (candidates.Count == 0)
      +            return null;
      +
      +        // 6. 현재 모델 식별
      +        var currentService = llm.Service.ToLowerInvariant();
      +        var currentModel = ResolveCurrentModel(llm);
      +
      +        // 7. 각 후보의 해당 카테고리 점수로 정렬
      +        var best = candidates
      +            .Where(c => c.Scores.ContainsKey(category))
      +            .OrderByDescending(c => c.Scores[category])
      +            .FirstOrDefault();
      +
      +        if (best == null)
      +            return null;
      +
      +        // 8. 현재 모델이 이미 최적이면 전환 불필요
      +        var currentScore = candidates
      +            .FirstOrDefault(c => c.Service.Equals(currentService, StringComparison.OrdinalIgnoreCase)
      +                              && c.Model.Equals(currentModel, StringComparison.OrdinalIgnoreCase));
      +        if (currentScore != null
      +            && currentScore.Scores.TryGetValue(category, out var curVal)
      +            && best.Scores[category] - curVal < 0.1) // 차이가 0.1 미만이면 전환 안함
      +        {
      +            return null;
      +        }
      +
      +        return new ModelRouteResult(
      +            Service: best.Service,
      +            Model: best.Model,
      +            DisplayName: best.Alias,
      +            DetectedIntent: category,
      +            Confidence: confidence);
      +    }
      +
      +    /// 
      +    /// 사용 가능한 모델 후보를 수집합니다.
      +    /// 사용자 설정(ModelCapabilities) 우선, 없으면 하드코딩 기본값 사용.
      +    /// 
      +    private List GatherCandidates(LlmSettings llm)
      +    {
      +        var candidates = new List();
      +
      +        // 사용자 설정 후보
      +        foreach (var cap in llm.ModelCapabilities)
      +        {
      +            if (!cap.Enabled) continue;
      +            if (!IsServiceAvailable(llm, cap.Service)) continue;
      +            candidates.Add(cap);
      +        }
      +
      +        // 하드코딩 기본값 (사용자 설정에 없는 서비스/모델만 추가)
      +        var defaults = GetDefaultCapabilities();
      +        foreach (var def in defaults)
      +        {
      +            if (!IsServiceAvailable(llm, def.Service)) continue;
      +            // 이미 사용자 설정에 있으면 스킵
      +            if (candidates.Any(c => c.Service.Equals(def.Service, StringComparison.OrdinalIgnoreCase)
      +                                 && c.Model.Equals(def.Model, StringComparison.OrdinalIgnoreCase)))
      +                continue;
      +            candidates.Add(def);
      +        }
      +
      +        return candidates;
      +    }
      +
      +    /// 
      +    /// 해당 서비스가 사용 가능한지 확인 (API 키 또는 엔드포인트 설정 여부).
      +    /// 
      +    private static bool IsServiceAvailable(LlmSettings llm, string service)
      +    {
      +        return service.ToLowerInvariant() switch
      +        {
      +            "gemini" => !string.IsNullOrEmpty(llm.GeminiApiKey),
      +            "claude" => !string.IsNullOrEmpty(llm.ClaudeApiKey),
      +            "ollama" => !string.IsNullOrEmpty(llm.OllamaEndpoint),
      +            "vllm"   => !string.IsNullOrEmpty(llm.VllmEndpoint),
      +            _        => false,
      +        };
      +    }
      +
      +    /// 현재 활성 모델명을 반환 (암호화 고려).
      +    private static string ResolveCurrentModel(LlmSettings llm)
      +    {
      +        if (llm.Service is "ollama" or "vllm" && !string.IsNullOrEmpty(llm.Model))
      +            return CryptoService.DecryptIfEnabled(llm.Model, llm.EncryptionEnabled);
      +        return llm.Service.ToLowerInvariant() switch
      +        {
      +            "gemini" => llm.GeminiModel,
      +            "claude" => llm.ClaudeModel,
      +            _ => llm.Model,
      +        };
      +    }
      +
      +    /// 
      +    /// 하드코딩된 기본 모델 능력 점수.
      +    ///
      +    /// ★ 개발자 수정 포인트 ★
      +    /// 사내 Ollama/vLLM 서버가 확정되면 여기에 항목을 추가하세요.
      +    /// 예시:
      +    ///   new ModelCapability
      +    ///   {
      +    ///       Service = "ollama", Model = "codellama:34b", Alias = "CodeLlama 34B",
      +    ///       Scores = new() { ["coding"] = 0.9, ["analysis"] = 0.6, ... }
      +    ///   }
      +    ///
      +    /// 카테고리 키: "coding", "translation", "analysis", "creative", "document", "math"
      +    /// 점수 범위: 0.0 (부적합) ~ 1.0 (최적)
      +    /// 
      +    public static List GetDefaultCapabilities()
      +    {
      +        return new List
      +        {
      +            // ── Gemini ──
      +            new()
      +            {
      +                Service = "gemini", Model = "gemini-2.5-flash", Alias = "Gemini 2.5 Flash",
      +                Scores = new()
      +                {
      +                    ["coding"] = 0.70, ["translation"] = 0.70, ["analysis"] = 0.85,
      +                    ["creative"] = 0.65, ["document"] = 0.70, ["math"] = 0.90,
      +                }
      +            },
      +            new()
      +            {
      +                Service = "gemini", Model = "gemini-2.5-pro", Alias = "Gemini 2.5 Pro",
      +                Scores = new()
      +                {
      +                    ["coding"] = 0.85, ["translation"] = 0.80, ["analysis"] = 0.90,
      +                    ["creative"] = 0.75, ["document"] = 0.80, ["math"] = 0.95,
      +                }
      +            },
      +
      +            // ── Claude ──
      +            new()
      +            {
      +                Service = "claude", Model = "claude-sonnet-4-6", Alias = "Claude Sonnet 4.6",
      +                Scores = new()
      +                {
      +                    ["coding"] = 0.90, ["translation"] = 0.85, ["analysis"] = 0.90,
      +                    ["creative"] = 0.90, ["document"] = 0.85, ["math"] = 0.80,
      +                }
      +            },
      +            new()
      +            {
      +                Service = "claude", Model = "claude-opus-4-6", Alias = "Claude Opus 4.6",
      +                Scores = new()
      +                {
      +                    ["coding"] = 0.95, ["translation"] = 0.90, ["analysis"] = 0.95,
      +                    ["creative"] = 0.95, ["document"] = 0.90, ["math"] = 0.85,
      +                }
      +            },
      +            new()
      +            {
      +                Service = "claude", Model = "claude-haiku-4-5", Alias = "Claude Haiku 4.5",
      +                Scores = new()
      +                {
      +                    ["coding"] = 0.65, ["translation"] = 0.70, ["analysis"] = 0.65,
      +                    ["creative"] = 0.60, ["document"] = 0.60, ["math"] = 0.60,
      +                }
      +            },
      +
      +            // ── 사내 Ollama/vLLM (예시 — 서버 확정 후 수정) ──
      +            // new()
      +            // {
      +            //     Service = "ollama", Model = "codellama:34b", Alias = "CodeLlama 34B",
      +            //     Scores = new()
      +            //     {
      +            //         ["coding"] = 0.85, ["translation"] = 0.40, ["analysis"] = 0.55,
      +            //         ["creative"] = 0.35, ["document"] = 0.40, ["math"] = 0.50,
      +            //     }
      +            // },
      +            // new()
      +            // {
      +            //     Service = "vllm", Model = "qwen2.5-72b", Alias = "Qwen2.5 72B",
      +            //     Scores = new()
      +            //     {
      +            //         ["coding"] = 0.80, ["translation"] = 0.85, ["analysis"] = 0.80,
      +            //         ["creative"] = 0.75, ["document"] = 0.75, ["math"] = 0.80,
      +            //     }
      +            // },
      +        };
      +    }
      +}
      diff --git a/src/AxCopilot/Services/NotificationCenterService.cs b/src/AxCopilot/Services/NotificationCenterService.cs
      new file mode 100644
      index 0000000..7780791
      --- /dev/null
      +++ b/src/AxCopilot/Services/NotificationCenterService.cs
      @@ -0,0 +1,80 @@
      +using System.Collections.Concurrent;
      +
      +namespace AxCopilot.Services;
      +
      +/// 알림 타입.
      +public enum NotificationType { Info, Success, Warning, Error }
      +
      +/// 알림 항목.
      +public record NotificationEntry(
      +    string Title,
      +    string Message,
      +    NotificationType Type,
      +    DateTime Timestamp);
      +
      +/// 
      +/// Phase L3-7: 알림 센터 — 앱 전체에서 알림을 발행하고 이력을 관리합니다.
      +/// 트레이 BalloonTip + 인앱 알림 큐를 결합합니다.
      +/// 
      +public static class NotificationCenterService
      +{
      +    private const int MaxHistory = 50;
      +
      +    private static readonly ConcurrentQueue _history = new();
      +
      +    /// 새 알림 발행 이벤트. UI 계층에서 구독하여 인앱 알림 표시에 활용합니다.
      +    public static event EventHandler? NotificationRaised;
      +
      +    /// 최근 알림 이력 (최대 50건, 최신 순).
      +    public static IReadOnlyList History
      +    {
      +        get
      +        {
      +            var list = _history.ToArray();
      +            Array.Reverse(list);
      +            return list;
      +        }
      +    }
      +
      +    /// 알림을 발행합니다. 트레이 BalloonTip + 이벤트를 동시에 발화합니다.
      +    public static void Show(string title, string message, NotificationType type = NotificationType.Info)
      +    {
      +        var entry = new NotificationEntry(title, message, type, DateTime.Now);
      +
      +        // 이력 추가 (최대 50건 유지)
      +        _history.Enqueue(entry);
      +        while (_history.Count > MaxHistory && _history.TryDequeue(out _)) { }
      +
      +        // 트레이 BalloonTip (기존 NotificationService 위임)
      +        NotificationService.Notify(title, message);
      +
      +        // 구독자에게 이벤트 발화 (UI 인앱 알림용)
      +        try { NotificationRaised?.Invoke(null, entry); }
      +        catch (Exception) { /* 구독자 예외 무시 */ }
      +    }
      +
      +    /// 성공 알림.
      +    public static void ShowSuccess(string title, string message)
      +        => Show(title, message, NotificationType.Success);
      +
      +    /// 경고 알림.
      +    public static void ShowWarning(string title, string message)
      +        => Show(title, message, NotificationType.Warning);
      +
      +    /// 오류 알림.
      +    public static void ShowError(string title, string message)
      +        => Show(title, message, NotificationType.Error);
      +
      +    /// 에이전트 작업 완료 알림 (BackgroundAgentService 전용 편의 메서드).
      +    public static void NotifyAgentCompleted(string agentType, string? result)
      +    {
      +        var preview = result?.Length > 80 ? result[..77] + "…" : result ?? "완료";
      +        Show($"{agentType} 에이전트 완료", preview, NotificationType.Success);
      +    }
      +
      +    /// 이력을 초기화합니다.
      +    public static void ClearHistory()
      +    {
      +        while (_history.TryDequeue(out _)) { }
      +    }
      +}
      diff --git a/src/AxCopilot/Services/NotificationService.cs b/src/AxCopilot/Services/NotificationService.cs
      new file mode 100644
      index 0000000..a8592cd
      --- /dev/null
      +++ b/src/AxCopilot/Services/NotificationService.cs
      @@ -0,0 +1,18 @@
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 트레이 아이콘 풍선 알림을 핸들러/서비스에서 표시하기 위한 전달 서비스.
      +/// App.xaml.cs의 SetupTrayIcon 이후 Initialize()로 초기화됩니다.
      +/// 
      +internal static class NotificationService
      +{
      +    private static Action? _showBalloon;
      +
      +    /// App.xaml.cs에서 NotifyIcon 연결 시 호출
      +    public static void Initialize(Action showBalloon)
      +        => _showBalloon = showBalloon;
      +
      +    /// 트레이 풍선 알림을 표시합니다.
      +    public static void Notify(string title, string message)
      +        => _showBalloon?.Invoke(title, message);
      +}
      diff --git a/src/AxCopilot/Services/PdfExportService.cs b/src/AxCopilot/Services/PdfExportService.cs
      new file mode 100644
      index 0000000..8e29a17
      --- /dev/null
      +++ b/src/AxCopilot/Services/PdfExportService.cs
      @@ -0,0 +1,117 @@
      +using System.Diagnostics;
      +using System.IO;
      +using System.Text;
      +using AxCopilot.Models;
      +
      +namespace AxCopilot.Services;
      +
      +/// 
      +/// 대화 내역을 PDF로 내보내는 서비스.
      +/// HTML을 생성한 후 시스템 브라우저의 인쇄 기능을 활용합니다.
      +/// 
      +public static class PdfExportService
      +{
      +    /// 대화를 HTML 파일로 내보내고, 브라우저에서 PDF로 인쇄할 수 있도록 엽니다.
      +    public static string ExportToPrintableHtml(ChatConversation conversation, string outputPath)
      +    {
      +        var html = BuildHtml(conversation);
      +        File.WriteAllText(outputPath, html, Encoding.UTF8);
      +        return outputPath;
      +    }
      +
      +    /// 대화를 HTML로 변환합니다 (인쇄 최적화 스타일 포함).
      +    public static string BuildHtml(ChatConversation conversation)
      +    {
      +        var sb = new StringBuilder();
      +        sb.AppendLine("");
      +        sb.AppendLine("");
      +        sb.AppendLine("");
      +        sb.AppendLine("");
      +        sb.AppendLine($"AX Copilot — {EscapeHtml(conversation.Title)}");
      +        sb.AppendLine("");
      +        sb.AppendLine("");
      +        sb.AppendLine("");
      +
      +        // 헤더
      +        sb.AppendLine("
      "); + sb.AppendLine($"

      {EscapeHtml(conversation.Title)}

      "); + sb.AppendLine($"
      {conversation.CreatedAt:yyyy-MM-dd HH:mm} · {conversation.Messages.Count}개 메시지
      "); + sb.AppendLine("
      "); + + // 메시지 + foreach (var msg in conversation.Messages) + { + var roleClass = msg.Role == "user" ? "user" : "assistant"; + var roleLabel = msg.Role == "user" ? "사용자" : "AI"; + + sb.AppendLine($"
      "); + sb.AppendLine($"
      {roleLabel}
      "); + sb.AppendLine($"
      {FormatContent(msg.Content)}
      "); + if (msg.Timestamp != default) + sb.AppendLine($"
      {msg.Timestamp:HH:mm}
      "); + sb.AppendLine("
      "); + } + + // 푸터 + sb.AppendLine("
      "); + sb.AppendLine($"AX Copilot · 내보내기 일시: {DateTime.Now:yyyy-MM-dd HH:mm}"); + sb.AppendLine("
      "); + + sb.AppendLine(""); + sb.AppendLine(""); + return sb.ToString(); + } + + private static string GetPrintStyles() => @" +* { box-sizing: border-box; margin: 0; padding: 0; } +body { font-family: 'Malgun Gothic', 'Segoe UI', sans-serif; font-size: 13px; color: #222; background: #fff; padding: 20px; } +.header { border-bottom: 2px solid #4B5EFC; padding-bottom: 12px; margin-bottom: 20px; } +.header h1 { font-size: 18px; font-weight: 700; color: #1a1b2e; } +.header .meta { font-size: 11px; color: #888; margin-top: 4px; } +.message { margin-bottom: 16px; padding: 12px 16px; border-radius: 8px; page-break-inside: avoid; } +.message.user { background: #f0f4ff; border-left: 3px solid #4B5EFC; } +.message.assistant { background: #fafafa; border-left: 3px solid #10B981; } +.role { font-size: 10px; font-weight: 700; color: #888; text-transform: uppercase; margin-bottom: 6px; } +.content { line-height: 1.7; white-space: pre-wrap; word-break: break-word; } +.content code { background: #f0f0f5; padding: 1px 4px; border-radius: 3px; font-family: Consolas, monospace; font-size: 12px; } +.content pre { background: #f5f5fa; padding: 10px; border-radius: 6px; overflow-x: auto; margin: 8px 0; } +.time { font-size: 10px; color: #aaa; text-align: right; margin-top: 4px; } +.footer { margin-top: 30px; padding-top: 12px; border-top: 1px solid #ddd; font-size: 10px; color: #aaa; text-align: center; } +@media print { body { padding: 0; } .message { break-inside: avoid; } } +@page { margin: 15mm; } +"; + + private static string FormatContent(string content) + { + if (string.IsNullOrEmpty(content)) return ""; + var escaped = EscapeHtml(content); + // 코드 블록 + escaped = System.Text.RegularExpressions.Regex.Replace(escaped, + @"```(\w*)\n([\s\S]*?)```", + m => $"
      {m.Groups[2].Value}
      "); + // 인라인 코드 + escaped = System.Text.RegularExpressions.Regex.Replace(escaped, + @"`([^`]+)`", "$1"); + // 줄바꿈 + escaped = escaped.Replace("\n", "
      "); + return escaped; + } + + private static string EscapeHtml(string text) => + text.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("\"", """); + + /// HTML 파일을 기본 브라우저에서 엽니다 (인쇄 대화상자 자동 표시). + public static void OpenInBrowser(string htmlPath) + { + try + { + Process.Start(new ProcessStartInfo(htmlPath) { UseShellExecute = true }); + } + catch (Exception ex) + { + LogService.Warn($"PDF 내보내기 브라우저 열기 실패: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/PresetService.cs b/src/AxCopilot/Services/PresetService.cs new file mode 100644 index 0000000..5131023 --- /dev/null +++ b/src/AxCopilot/Services/PresetService.cs @@ -0,0 +1,117 @@ +using System.IO; +using System.Reflection; +using System.Text.Json; + +namespace AxCopilot.Services; + +/// +/// 대화 주제 프리셋을 EmbeddedResource에서 동적으로 로드합니다. +/// Assets/Presets/*.json 파일을 빌드 시 내장하고 런타임에 읽어옵니다. +/// +public static class PresetService +{ + private static readonly List _presets = new(); + private static bool _loaded; + + public static IReadOnlyList Presets + { + get + { + if (!_loaded) Load(); + return _presets; + } + } + + public static TopicPreset? GetByCategory(string category) + => Presets.FirstOrDefault(p => p.Category == category); + + /// 특정 탭의 프리셋만 반환. + public static IReadOnlyList GetByTab(string tab) + => Presets.Where(p => p.Tab.Equals(tab, StringComparison.OrdinalIgnoreCase)).ToList(); + + /// 내장 프리셋 + 커스텀 프리셋을 병합하여 탭별로 반환. + public static IReadOnlyList GetByTabWithCustom(string tab, IEnumerable customPresets) + { + var result = GetByTab(tab).ToList(); + foreach (var cp in customPresets.Where(c => c.Tab.Equals(tab, StringComparison.OrdinalIgnoreCase))) + { + result.Add(new TopicPreset + { + Category = $"custom_{cp.Id}", + Label = cp.Label, + Symbol = cp.Symbol, + Color = cp.Color, + Description = cp.Description, + SystemPrompt = cp.SystemPrompt, + Placeholder = "", + Tab = cp.Tab, + IsCustom = true, + CustomId = cp.Id, + }); + } + return result; + } + + private static void Load() + { + _loaded = true; + var assembly = Assembly.GetExecutingAssembly(); + var prefix = "AxCopilot.Assets.Presets."; + + foreach (var name in assembly.GetManifestResourceNames()) + { + if (!name.StartsWith(prefix) || !name.EndsWith(".json")) continue; + + try + { + using var stream = assembly.GetManifestResourceStream(name); + if (stream == null) continue; + using var reader = new StreamReader(stream); + var json = reader.ReadToEnd(); + var preset = JsonSerializer.Deserialize(json, new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true, + }); + if (preset != null) + _presets.Add(preset); + } + catch (Exception ex) + { + LogService.Warn($"프리셋 로드 실패 ({name}): {ex.Message}"); + } + } + + // Order 필드 → ChatCategory 순서로 정렬 + var catOrder = Models.ChatCategory.All.Select((c, i) => (c.Key, i)).ToDictionary(x => x.Key, x => x.i); + _presets.Sort((a, b) => + { + var oa = a.Order; var ob = b.Order; + if (oa != ob) return oa.CompareTo(ob); + var ia = catOrder.GetValueOrDefault(a.Category, 99); + var ib = catOrder.GetValueOrDefault(b.Category, 99); + return ia.CompareTo(ib); + }); + + LogService.Info($"대화 주제 프리셋 {_presets.Count}개 로드 완료"); + } +} + +/// 대화 주제 프리셋 모델. +public class TopicPreset +{ + public string Category { get; set; } = ""; + public string Label { get; set; } = ""; + public string Symbol { get; set; } = ""; + public string Color { get; set; } = ""; + public string Description { get; set; } = ""; + public string SystemPrompt { get; set; } = ""; + public string Placeholder { get; set; } = ""; + /// 표시 순서 (낮을수록 먼저). 기본 50. + public int Order { get; set; } = 50; + /// 프리셋이 속하는 탭. "Chat" | "Cowork" | "Code" + public string Tab { get; set; } = "Chat"; + /// 사용자 커스텀 프리셋 여부. + public bool IsCustom { get; set; } + /// 커스텀 프리셋의 고유 ID (IsCustom == true일 때만 사용). + public string? CustomId { get; set; } +} diff --git a/src/AxCopilot/Services/QuoteService.cs b/src/AxCopilot/Services/QuoteService.cs new file mode 100644 index 0000000..8380f8d --- /dev/null +++ b/src/AxCopilot/Services/QuoteService.cs @@ -0,0 +1,269 @@ +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Windows; + +namespace AxCopilot.Services; + +/// +/// 격려 문구, 명언, 업계 상식, IT/AI, 과학, 역사, 생활영어, 드라마/영화 대사를 카테고리별로 관리합니다. +/// +public static class QuoteService +{ + private record FamousQuote(string Text, string Author); + private record MovieQuote(string Text, string Movie, int Year, string? Character, long? Audience); + + // 카테고리별 콘텐츠 (Lazy 로딩) + private static readonly Lazy _motivational = new(LoadMotivational); + private static readonly Lazy _famous = new(LoadFamous); + private static readonly Lazy _displaySemi = new(() => LoadSimple("display_semiconductor.json")); + private static readonly Lazy _itAi = new(() => LoadSimple("it_ai.json")); + private static readonly Lazy _science = new(() => LoadSimple("science.json")); + private static readonly Lazy _history = new(() => LoadSimple("history.json")); + private static readonly Lazy _english = new(() => LoadSimple("english.json")); + private static readonly Lazy _movies = new(LoadMovies); + private static readonly Lazy> _todayEvents = new(LoadTodayEvents); + + /// 카테고리 정의: (key, label, countFunc). 설정 UI에서 다중 체크로 표시됨. + public static readonly (string Key, string Label, Func Count)[] Categories = + [ + ("motivational", "격려 문구", () => _motivational.Value.Length), + ("famous", "유명 명언", () => _famous.Value.Length), + ("display_semiconductor", "디스플레이/반도체 상식", () => _displaySemi.Value.Length), + ("it_ai", "IT, AI 기술", () => _itAi.Value.Length), + ("science", "일반 과학", () => _science.Value.Length), + ("history", "역사", () => _history.Value.Length), + ("english", "생활영어", () => _english.Value.Length), + ("movies", "드라마/영화 명대사", () => _movies.Value.Length), + ("today_events", "오늘의 역사/기념일", () => GetTodayEventCount()), + ]; + + // ─── 로더 ────────────────────────────────────────────────────────── + + private static string[] LoadMotivational() + { + try + { + var uri = new Uri("pack://application:,,,/Assets/Quotes/motivational.json"); + var stream = Application.GetResourceStream(uri)?.Stream; + if (stream == null) return []; + using var reader = new StreamReader(stream, Encoding.UTF8); + return JsonSerializer.Deserialize(reader.ReadToEnd()) ?? []; + } + catch (Exception ex) { LogService.Warn($"격려 문구 로드 실패: {ex.Message}"); return []; } + } + + private static FamousQuote[] LoadFamous() + { + try + { + var uri = new Uri("pack://application:,,,/Assets/Quotes/famous.json"); + var stream = Application.GetResourceStream(uri)?.Stream; + if (stream == null) return []; + using var reader = new StreamReader(stream, Encoding.UTF8); + var opts = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + return JsonSerializer.Deserialize(reader.ReadToEnd(), opts) ?? []; + } + catch (Exception ex) { LogService.Warn($"명언 로드 실패: {ex.Message}"); return []; } + } + + private static string[] LoadSimple(string fileName) + { + try + { + var uri = new Uri($"pack://application:,,,/Assets/Quotes/{fileName}"); + var stream = Application.GetResourceStream(uri)?.Stream; + if (stream == null) return []; + using var reader = new StreamReader(stream, Encoding.UTF8); + return JsonSerializer.Deserialize(reader.ReadToEnd()) ?? []; + } + catch (Exception ex) { LogService.Warn($"{fileName} 로드 실패: {ex.Message}"); return []; } + } + + private static MovieQuote[] LoadMovies() + { + try + { + var uri = new Uri("pack://application:,,,/Assets/Quotes/movies.json"); + var stream = Application.GetResourceStream(uri)?.Stream; + if (stream == null) return []; + using var reader = new StreamReader(stream, Encoding.UTF8); + var opts = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + return JsonSerializer.Deserialize(reader.ReadToEnd(), opts) ?? []; + } + catch (Exception) { return []; } + } + + private static Dictionary LoadTodayEvents() + { + try + { + var uri = new Uri("pack://application:,,,/Assets/Quotes/today_events.json"); + var stream = Application.GetResourceStream(uri)?.Stream; + if (stream == null) return new(); + using var reader = new StreamReader(stream, Encoding.UTF8); + return JsonSerializer.Deserialize>(reader.ReadToEnd()) ?? new(); + } + catch (Exception) { return new(); } + } + + // ─── 공개 API ────────────────────────────────────────────────────── + + /// + /// 활성화된 카테고리에서 랜덤으로 하나를 반환합니다. + /// 날짜 카테고리가 활성화되어 있으면 첫 호출 시 오늘의 이벤트를 우선 반환합니다. + /// + public static (string Text, string? Author) GetRandom(IEnumerable? enabledCategories = null) + { + var enabled = enabledCategories?.ToHashSet(StringComparer.OrdinalIgnoreCase) + ?? new HashSet { "motivational" }; + + // 시간대별 인사 접두사 + var greeting = GetTimeGreeting(); + + // 날짜 이벤트 우선 (해당 카테고리 선택 시) + if (enabled.Contains("today_events")) + { + var todayKey = DateTime.Now.ToString("MM-dd"); + if (_todayEvents.Value.TryGetValue(todayKey, out var events) && events.Length > 0) + { + var evt = events[Random.Shared.Next(events.Length)]; + return (greeting + evt, "오늘의 역사"); + } + } + + var pool = new List<(string Text, string? Author)>(); + + if (enabled.Contains("motivational")) + foreach (var q in _motivational.Value) pool.Add((q, null)); + + if (enabled.Contains("famous")) + foreach (var q in _famous.Value) pool.Add((q.Text, q.Author)); + + if (enabled.Contains("display_semiconductor")) + foreach (var q in _displaySemi.Value) pool.Add((q, "디스플레이/반도체")); + + if (enabled.Contains("it_ai")) + foreach (var q in _itAi.Value) pool.Add((q, "IT/AI")); + + if (enabled.Contains("science")) + foreach (var q in _science.Value) pool.Add((q, "과학")); + + if (enabled.Contains("history")) + foreach (var q in _history.Value) pool.Add((q, "역사")); + + if (enabled.Contains("english")) + foreach (var q in _english.Value) pool.Add((q, "생활영어")); + + if (enabled.Contains("movies")) + foreach (var q in _movies.Value) + { + var medal = q.Audience >= 10_000_000 ? " 🥇" : q.Audience >= 7_000_000 ? " 🥈" : q.Audience >= 5_000_000 ? " 🥉" : ""; + var info = $"《{q.Movie}》({q.Year}){(q.Character != null ? $" — {q.Character}" : "")}{medal}"; + pool.Add(($"\"{q.Text}\"", info)); + } + + if (pool.Count == 0) + return (greeting + "오늘도 열심히 해주셔서 고맙습니다!", null); + + var (text, author) = pool[Random.Shared.Next(pool.Count)]; + return (greeting + text, author); + } + + /// 시간대에 따른 인사 접두사를 반환합니다 (줄바꿈 포함). + /// + /// 외부 파일(%APPDATA%\AxCopilot\Quotes\greetings.json) 우선 로드. + /// 외부 파일이 없으면 내장 리소스(Assets/Quotes/greetings.json) 사용. + /// 개발자가 외부 JSON만 수정하면 재빌드 없이 인사문구 변경/추가 가능. + /// + private static string GetTimeGreeting() + { + var hour = DateTime.Now.Hour; + string key; + if (hour < 9) key = "morning"; + else if (hour >= 12 && hour < 15) key = "lunch"; + else if (hour >= 18) key = "evening"; + else return ""; + + var greetings = LoadGreetings(); + if (greetings.TryGetValue(key, out var list) && list.Length > 0) + return list[Random.Shared.Next(list.Length)] + "\n\n"; + + return ""; + } + + private static Dictionary? _greetingsCache; + private static DateTime _greetingsCacheTime; + + /// 인사문구를 로드합니다. 외부 파일 → 내장 리소스 순서. + private static Dictionary LoadGreetings() + { + // 5분간 캐시 (파일 수정 반영을 위해 주기적 리로드) + if (_greetingsCache != null && (DateTime.Now - _greetingsCacheTime).TotalMinutes < 5) + return _greetingsCache; + + var opts = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + + // 1) 외부 파일 우선 + try + { + var externalPath = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "Quotes", "greetings.json"); + if (File.Exists(externalPath)) + { + var json = File.ReadAllText(externalPath, Encoding.UTF8); + var result = JsonSerializer.Deserialize>(json, opts); + if (result != null) + { + _greetingsCache = result; + _greetingsCacheTime = DateTime.Now; + return result; + } + } + } + catch (Exception ex) { LogService.Warn($"외부 인사문구 로드 실패: {ex.Message}"); } + + // 2) 내장 리소스 폴백 + try + { + var uri = new Uri("pack://application:,,,/Assets/Quotes/greetings.json"); + var stream = Application.GetResourceStream(uri)?.Stream; + if (stream != null) + { + using var reader = new StreamReader(stream, Encoding.UTF8); + var result = JsonSerializer.Deserialize>(reader.ReadToEnd(), opts); + if (result != null) + { + _greetingsCache = result; + _greetingsCacheTime = DateTime.Now; + return result; + } + } + } + catch (Exception ex) { LogService.Warn($"내장 인사문구 로드 실패: {ex.Message}"); } + + return _greetingsCache = new(); + } + + private static int GetTodayEventCount() + { + // 전체 이벤트 수 반환 (날짜별 합계) + return _todayEvents.Value.Values.Sum(v => v.Length); + } + + /// 오늘 날짜에 해당하는 이벤트 수를 반환합니다. + public static int GetTodayMatchCount() + { + var todayKey = DateTime.Now.ToString("MM-dd"); + return _todayEvents.Value.TryGetValue(todayKey, out var events) ? events.Length : 0; + } + + /// 로드된 전체 문구 수를 반환합니다. + public static int TotalCount => + _motivational.Value.Length + _famous.Value.Length + + _displaySemi.Value.Length + _itAi.Value.Length + + _science.Value.Length + _history.Value.Length + + _english.Value.Length + _movies.Value.Length; +} diff --git a/src/AxCopilot/Services/RuntimeDetector.cs b/src/AxCopilot/Services/RuntimeDetector.cs new file mode 100644 index 0000000..2120ee2 --- /dev/null +++ b/src/AxCopilot/Services/RuntimeDetector.cs @@ -0,0 +1,80 @@ +using System.Diagnostics; + +namespace AxCopilot.Services; + +/// +/// 런타임 환경(Python, Node.js 등) 설치 여부를 감지하는 정적 헬퍼. +/// 스킬 시스템에서 런타임 의존 스킬의 가용성을 판단하는 데 사용합니다. +/// 결과는 5분간 캐시되어 반복 호출 시 프로세스 생성을 최소화합니다. +/// +public static class RuntimeDetector +{ + private static Dictionary? _cache; + private static DateTime _cacheTime; + private static readonly TimeSpan CacheTtl = TimeSpan.FromMinutes(5); + + /// 지정된 런타임이 설치되어 PATH에서 접근 가능한지 확인합니다. + /// 런타임 이름 (python, node, dotnet 등) + public static bool IsAvailable(string runtime) + { + if (string.IsNullOrWhiteSpace(runtime)) return true; + runtime = runtime.Trim().ToLowerInvariant(); + + // 캐시 확인 + if (_cache != null && (DateTime.UtcNow - _cacheTime) < CacheTtl) + { + if (_cache.TryGetValue(runtime, out var cached)) + return cached; + } + else + { + _cache = new Dictionary(StringComparer.OrdinalIgnoreCase); + _cacheTime = DateTime.UtcNow; + } + + var available = DetectRuntime(runtime); + _cache[runtime] = available; + return available; + } + + /// 캐시를 강제로 초기화합니다. + public static void ClearCache() => _cache = null; + + private static bool DetectRuntime(string runtime) + { + // 1단계: where.exe로 PATH 존재 확인 + var wherePath = RunQuick("where.exe", runtime); + if (string.IsNullOrEmpty(wherePath)) return false; + + // 2단계: --version으로 실행 가능 확인 + var versionArg = runtime switch + { + "java" => "-version", + _ => "--version", + }; + var version = RunQuick(runtime, versionArg); + return !string.IsNullOrEmpty(version); + } + + private static string? RunQuick(string exe, string args) + { + try + { + var psi = new ProcessStartInfo(exe, args) + { + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + }; + using var proc = Process.Start(psi); + if (proc == null) return null; + var output = proc.StandardOutput.ReadToEnd(); + var error = proc.StandardError.ReadToEnd(); + proc.WaitForExit(5000); + var result = string.IsNullOrWhiteSpace(output) ? error : output; + return string.IsNullOrWhiteSpace(result) ? null : result.Trim(); + } + catch (Exception) { return null; } + } +} diff --git a/src/AxCopilot/Services/SessionTrackingService.cs b/src/AxCopilot/Services/SessionTrackingService.cs new file mode 100644 index 0000000..0644ddc --- /dev/null +++ b/src/AxCopilot/Services/SessionTrackingService.cs @@ -0,0 +1,49 @@ +using Microsoft.Win32; + +namespace AxCopilot.Services; + +/// +/// Windows 세션 잠금/해제 이벤트를 추적하여 PC 활성 시간을 기록합니다. +/// +public sealed class SessionTrackingService : IDisposable +{ + private DateTime? _unlockTime; + private bool _disposed; + + public SessionTrackingService() + { + // 앱 시작 = 잠금 해제 상태로 간주 + _unlockTime = DateTime.Now; + SystemEvents.SessionSwitch += OnSessionSwitch; + } + + private void OnSessionSwitch(object sender, SessionSwitchEventArgs e) + { + if (e.Reason == SessionSwitchReason.SessionLock) + { + FlushActiveTime(); + } + else if (e.Reason == SessionSwitchReason.SessionUnlock || + e.Reason == SessionSwitchReason.SessionLogon) + { + _unlockTime = DateTime.Now; + } + } + + private void FlushActiveTime() + { + if (!_unlockTime.HasValue) return; + var seconds = (int)(DateTime.Now - _unlockTime.Value).TotalSeconds; + if (seconds > 0) + UsageStatisticsService.AddActiveSeconds(seconds); + _unlockTime = null; + } + + public void Dispose() + { + if (_disposed) return; + _disposed = true; + FlushActiveTime(); + SystemEvents.SessionSwitch -= OnSessionSwitch; + } +} diff --git a/src/AxCopilot/Services/SettingsService.cs b/src/AxCopilot/Services/SettingsService.cs new file mode 100644 index 0000000..f2b17d0 --- /dev/null +++ b/src/AxCopilot/Services/SettingsService.cs @@ -0,0 +1,204 @@ +using System.IO; +using System.Text.Json; +using AxCopilot.Models; + +namespace AxCopilot.Services; + +public class SettingsService +{ + private static readonly string AppDataDir = InitAppDataDir(); + + /// AppData 디렉터리 초기화. 기존 AxCommander 폴더가 있으면 AxCopilot으로 마이그레이션. + private static string InitAppDataDir() + { + var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + var newDir = Path.Combine(appData, "AxCopilot"); + var oldDir = Path.Combine(appData, "AxCommander"); + if (!Directory.Exists(newDir) && Directory.Exists(oldDir)) + try { Directory.Move(oldDir, newDir); } catch (Exception) { } + return newDir; + } + + public static readonly string SettingsPath = Path.Combine(AppDataDir, "settings.dat"); + private static readonly string LegacyJsonPath = Path.Combine(AppDataDir, "settings.json"); + + private static readonly JsonSerializerOptions JsonOptions = new() + { + WriteIndented = true, + PropertyNameCaseInsensitive = true + }; + + private AppSettings _settings = new(); + public AppSettings Settings => _settings; + + public event EventHandler? SettingsChanged; + + /// 마이그레이션이 수행된 경우 변경 내역 문자열. null이면 마이그레이션 없음. + public string? MigrationSummary { get; private set; } + + /// + /// 설정 파일의 스키마 버전 (앱 버전과 별개). + /// ★ 버전 관리 규칙: + /// - 앱 릴리스 버전은 AxCopilot.csproj → <Version> 에서만 관리합니다. + /// - 이 값은 settings.json 구조(필드 추가·이름 변경 등)가 바뀔 때만 올립니다. + /// - 올릴 때마다 MigrateIfNeeded() 에 해당 버전으로의 마이그레이션 블록을 추가합니다. + /// - 현재 매핑: 앱 v1.0.0~1.0.2 → 설정 v1.0 / 앱 v1.0.3~ → 설정 v1.1 + /// + private const string CurrentSettingsVersion = "1.2"; + + public void Load() + { + EnsureDirectories(); + + // 1. 암호화된 설정 파일 우선 + if (File.Exists(SettingsPath)) + { + try + { + var encrypted = File.ReadAllText(SettingsPath); + var json = CryptoService.PortableDecrypt(encrypted); + if (string.IsNullOrEmpty(json)) + throw new InvalidOperationException("복호화 결과가 비어 있습니다."); + _settings = JsonSerializer.Deserialize(json, JsonOptions) ?? new(); + MigrateIfNeeded(); + return; + } + catch (Exception ex) + { + var backupPath = SettingsPath + ".bak"; + try { File.Copy(SettingsPath, backupPath, overwrite: true); } + catch (Exception backupEx) { LogService.Warn($"settings.dat 백업 실패: {backupEx.Message}"); } + LogService.Error($"settings.dat 복호화/파싱 실패, 기본값으로 복구: {ex.Message}"); + } + } + + // 2. 레거시 평문 JSON 마이그레이션 + if (File.Exists(LegacyJsonPath)) + { + try + { + var json = File.ReadAllText(LegacyJsonPath); + _settings = JsonSerializer.Deserialize(json, JsonOptions) ?? new(); + MigrateIfNeeded(); + Save(); // 암호화된 settings.dat로 저장 + try { File.Delete(LegacyJsonPath); } + catch (Exception delEx) { LogService.Warn($"레거시 settings.json 삭제 실패: {delEx.Message}"); } + LogService.Info("설정 마이그레이션: settings.json → settings.dat (암호화 적용)"); + return; + } + catch (Exception ex) + { + LogService.Error($"레거시 settings.json 파싱 실패: {ex.Message}"); + } + } + + // 3. 신규 설치 + _settings = CreateDefaults(); + _settings.Version = CurrentSettingsVersion; + Save(); + } + + /// + /// 설정 파일 버전을 확인하고, 이전 버전이면 순차적으로 마이그레이션합니다. + /// 새 프로퍼티는 C# 기본값으로 자동 적용되며, + /// 구조 변경(키 이름 변경, 하위 객체 이동 등)만 여기서 처리합니다. + /// + private void MigrateIfNeeded() + { + var ver = _settings.Version ?? "1.0"; + var migrated = false; + + // ── 1.0 → 1.1 마이그레이션 ────────────────────────────────────────── + if (IsVersionLessThan(ver, "1.1")) + { + // 폴더 별칭 프리픽스 변경: ~xxx → cd xxx (v1.1) + foreach (var alias in _settings.Aliases.Where(a => a.Type == "folder")) + { + if (alias.Key.StartsWith("~")) + alias.Key = "cd " + alias.Key.TrimStart('~'); + } + // 워크스페이스 기호 변경 알림은 도움말에서 안내 + LogService.Info("설정 마이그레이션: 1.0 → 1.1 (폴더 별칭 prefix ~ → cd)"); + ver = "1.1"; + migrated = true; + } + + // ── 1.1 → 1.2 마이그레이션 ────────────────────────────────────────── + if (IsVersionLessThan(ver, "1.2")) + { + // 파일 대화상자 연동 기능 기본값 비활성화 (v1.6.2) + // 브라우저 파일 업로드·메일 첨부 시 런처가 의도치 않게 열리는 오작동 방지 + _settings.Launcher.EnableFileDialogIntegration = false; + LogService.Info("설정 마이그레이션: 1.1 → 1.2 (파일 대화상자 연동 비활성화)"); + ver = "1.2"; + migrated = true; + } + + // ── 향후 마이그레이션은 여기에 추가 ───────────────────────────────── + // if (IsVersionLessThan(ver, "1.3")) { ... ver = "1.3"; migrated = true; } + + if (migrated) + { + _settings.Version = CurrentSettingsVersion; + Save(); + MigrationSummary = $"설정이 v{CurrentSettingsVersion}으로 업데이트되었습니다.\n\n" + + "• 파일 대화상자 연동 기능이 비활성화되었습니다.\n" + + " 웹 브라우저 파일 업로드 시 런처가 열리는 문제를 방지합니다.\n" + + " 필요 시 설정 → 기능 → AI 기능에서 다시 활성화할 수 있습니다."; + LogService.Info($"설정 파일 마이그레이션 완료 → v{CurrentSettingsVersion}"); + } + } + + private static bool IsVersionLessThan(string current, string target) + { + if (Version.TryParse(current, out var cv) && Version.TryParse(target, out var tv)) + return cv < tv; + return string.Compare(current, target, StringComparison.Ordinal) < 0; + } + + public void Save() + { + EnsureDirectories(); + var json = JsonSerializer.Serialize(_settings, JsonOptions); + var encrypted = CryptoService.PortableEncrypt(json); + File.WriteAllText(SettingsPath, encrypted); + SettingsChanged?.Invoke(this, EventArgs.Empty); + } + + private static void EnsureDirectories() + { + Directory.CreateDirectory(AppDataDir); + Directory.CreateDirectory(Path.Combine(AppDataDir, "logs")); + Directory.CreateDirectory(Path.Combine(AppDataDir, "crashes")); + Directory.CreateDirectory(Path.Combine(AppDataDir, "skills")); + } + + private static AppSettings CreateDefaults() + { + var indexPaths = new List + { + "%USERPROFILE%\\Desktop", + "%APPDATA%\\Microsoft\\Windows\\Start Menu" + }; + + // D:\Non_Documents 폴더가 존재하면 기본 인덱스 경로에 추가 + const string nonDocPath = "D:\\Non_Documents"; + if (Directory.Exists(nonDocPath)) + indexPaths.Add(nonDocPath); + + return new AppSettings + { + IndexPaths = indexPaths, + Aliases = new List + { + new() { Key = "@blog", Type = "url", Target = "https://example.com", Description = "내 블로그" }, + new() { Key = "~home", Type = "folder", Target = "%USERPROFILE%", Description = "홈 폴더" }, + }, + // 커스텀 테마 초기값 (theme: "custom"으로 변경 시 활성화) + Launcher = new() + { + CustomTheme = new AxCopilot.Models.CustomThemeColors() + } + }; + } +} diff --git a/src/AxCopilot/Services/ShellExtensionService.cs b/src/AxCopilot/Services/ShellExtensionService.cs new file mode 100644 index 0000000..7e2961b --- /dev/null +++ b/src/AxCopilot/Services/ShellExtensionService.cs @@ -0,0 +1,101 @@ +using System.Diagnostics; +using System.IO; +using Microsoft.Win32; + +namespace AxCopilot.Services; + +/// +/// Windows 탐색기 우클릭 메뉴에 AX Copilot 항목을 등록/해제합니다. +/// 파일/폴더 선택 → 우클릭 → "AX Agent로 분석" 메뉴를 추가합니다. +/// HKCU\Software\Classes 기반이므로 관리자 권한 불필요. +/// +public static class ShellExtensionService +{ + private const string MenuKey = "AxCopilotShell"; + private const string MenuLabel = "AX Agent로 분석"; + + /// 파일 우클릭 메뉴에 AX Agent 항목을 등록합니다. + public static bool Register() + { + try + { + var exePath = Process.GetCurrentProcess().MainModule?.FileName ?? ""; + if (string.IsNullOrEmpty(exePath)) return false; + + // 파일 우클릭: HKCU\Software\Classes\*\shell\AxCopilotShell + RegisterContextMenu(@"Software\Classes\*\shell", exePath, "--analyze-file \"%1\""); + + // 폴더 우클릭: HKCU\Software\Classes\Directory\shell\AxCopilotShell + RegisterContextMenu(@"Software\Classes\Directory\shell", exePath, "--analyze-folder \"%1\""); + + // 폴더 배경 우클릭: HKCU\Software\Classes\Directory\Background\shell\AxCopilotShell + RegisterContextMenu(@"Software\Classes\Directory\Background\shell", exePath, "--analyze-folder \"%V\""); + + LogService.Info("셸 확장 등록 완료"); + return true; + } + catch (Exception ex) + { + LogService.Error($"셸 확장 등록 실패: {ex.Message}"); + return false; + } + } + + /// 등록된 우클릭 메뉴를 해제합니다. + public static bool Unregister() + { + try + { + DeleteKey(@"Software\Classes\*\shell\" + MenuKey); + DeleteKey(@"Software\Classes\Directory\shell\" + MenuKey); + DeleteKey(@"Software\Classes\Directory\Background\shell\" + MenuKey); + LogService.Info("셸 확장 해제 완료"); + return true; + } + catch (Exception ex) + { + LogService.Error($"셸 확장 해제 실패: {ex.Message}"); + return false; + } + } + + /// 셸 확장이 등록되어 있는지 확인합니다. + public static bool IsRegistered() + { + try + { + using var key = Registry.CurrentUser.OpenSubKey(@"Software\Classes\*\shell\" + MenuKey); + return key != null; + } + catch (Exception) { return false; } + } + + private static void RegisterContextMenu(string basePath, string exePath, string args) + { + var menuPath = $@"{basePath}\{MenuKey}"; + using var menuKey = Registry.CurrentUser.CreateSubKey(menuPath); + if (menuKey == null) return; + + menuKey.SetValue("", MenuLabel); + menuKey.SetValue("Icon", $"\"{exePath}\",0"); + + using var cmdKey = Registry.CurrentUser.CreateSubKey($@"{menuPath}\command"); + cmdKey?.SetValue("", $"\"{exePath}\" {args}"); + } + + private static void DeleteKey(string path) + { + try { Registry.CurrentUser.DeleteSubKeyTree(path, false); } catch (Exception) { } + } + + /// 앱 시작 시 명령줄 인수를 처리합니다. + public static (string Action, string Path)? ParseCommandLine(string[] args) + { + for (int i = 0; i < args.Length - 1; i++) + { + if (args[i] == "--analyze-file") return ("file", args[i + 1]); + if (args[i] == "--analyze-folder") return ("folder", args[i + 1]); + } + return null; + } +} diff --git a/src/AxCopilot/Services/SnippetTemplateService.cs b/src/AxCopilot/Services/SnippetTemplateService.cs new file mode 100644 index 0000000..de312c4 --- /dev/null +++ b/src/AxCopilot/Services/SnippetTemplateService.cs @@ -0,0 +1,75 @@ +using System.Text.RegularExpressions; +using AxCopilot.Models; + +namespace AxCopilot.Services; + +/// +/// Phase L3-3: AI 스니펫 템플릿 서비스. +/// 템플릿 키워드 검색, 프롬프트 확장, LLM 호출 결과 캐싱을 담당합니다. +/// +public class SnippetTemplateService +{ + private readonly SettingsService _settings; + private readonly LlmService _llm; + + // 간단한 인메모리 캐시 (키워드+인자 → 결과) + private readonly Dictionary _cache = new(); + private const int MaxCacheSize = 20; + + public SnippetTemplateService(SettingsService settings, LlmService llm) + { + _settings = settings; + _llm = llm; + } + + /// 키워드로 템플릿 목록을 검색합니다. + public IReadOnlyList Search(string keyword) + { + var q = keyword.Trim().ToLowerInvariant(); + return _settings.Settings.AiSnippetTemplates + .Where(t => string.IsNullOrEmpty(q) || + t.Keyword.Contains(q, StringComparison.OrdinalIgnoreCase) || + t.Name.Contains(q, StringComparison.OrdinalIgnoreCase)) + .ToList(); + } + + /// + /// 템플릿 프롬프트에 인자를 채워 LLM 호출 후 결과를 반환합니다. + /// + public async Task GenerateAsync(AiSnippetTemplate template, string argument, CancellationToken ct) + { + var prompt = ExpandPrompt(template.Prompt, argument); + var cacheKey = $"{template.Keyword}::{prompt}"; + + if (_cache.TryGetValue(cacheKey, out var cached)) + return cached; + + var messages = new List + { + new() { Role = "system", Content = "당신은 사용자의 업무를 돕는 AI 어시스턴트입니다. 요청에 맞게 간결하고 정확한 결과를 제공하세요." }, + new() { Role = "user", Content = prompt } + }; + + var result = await _llm.SendAsync(messages, ct); + + // 캐시 관리 + if (_cache.Count >= MaxCacheSize) + { + var oldest = _cache.Keys.First(); + _cache.Remove(oldest); + } + _cache[cacheKey] = result; + + return result; + } + + /// 템플릿 프롬프트의 {0}, {query} 플레이스홀더를 인자로 치환합니다. + private static string ExpandPrompt(string prompt, string argument) + { + var encoded = argument.Trim(); + prompt = Regex.Replace(prompt, @"\{0\}", encoded); + prompt = Regex.Replace(prompt, @"\{query\}", encoded); + prompt = Regex.Replace(prompt, @"\{input\}", encoded); + return prompt; + } +} diff --git a/src/AxCopilot/Services/StorageAnalyzer.cs b/src/AxCopilot/Services/StorageAnalyzer.cs new file mode 100644 index 0000000..5b74fb4 --- /dev/null +++ b/src/AxCopilot/Services/StorageAnalyzer.cs @@ -0,0 +1,151 @@ +using System.IO; + +namespace AxCopilot.Services; + +/// +/// 앱의 저장 공간 사용량을 분석하고 정리 기능을 제공합니다. +/// +public static class StorageAnalyzer +{ + private static readonly string AppDataDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "AxCopilot"); + + /// 저장 공간 분석 결과를 반환합니다. + public static StorageReport Analyze() + { + var report = new StorageReport(); + + // 앱 데이터 폴더별 크기 계산 + report.Conversations = GetFolderSize(Path.Combine(AppDataDir, "conversations")); + report.AuditLogs = GetFolderSize(Path.Combine(AppDataDir, "audit")); + report.Logs = GetFolderSize(Path.Combine(AppDataDir, "logs")); + report.CodeIndex = GetFolderSize(Path.Combine(AppDataDir, "code_index")); + report.EmbeddingDb = GetFolderSize(Path.Combine(AppDataDir, "embeddings")); + report.ClipboardHistory = GetFileSize(Path.Combine(AppDataDir, "clipboard_history.dat")); + report.Plugins = GetFolderSize(Path.Combine(AppDataDir, "plugins")); + report.Skills = GetFolderSize(Path.Combine(AppDataDir, "skills")); + report.Settings = GetFileSize(Path.Combine(AppDataDir, "settings.json")); + + // 앱 실행 파일 위치의 드라이브 여유 공간 + var exeDir = Path.GetDirectoryName(Environment.ProcessPath) ?? AppDataDir; + try + { + var drive = new DriveInfo(Path.GetPathRoot(exeDir) ?? "C:"); + report.DriveLabel = drive.Name; + report.DriveFreeSpace = drive.AvailableFreeSpace; + report.DriveTotalSpace = drive.TotalSize; + } + catch (Exception) { } + + return report; + } + + /// 지정된 기간보다 오래된 데이터를 삭제합니다. + /// 보관 일수 (7/14/30). 0이면 전체 삭제. + /// 삭제된 바이트 수 + public static long Cleanup(int retainDays, bool cleanConversations, bool cleanAuditLogs, + bool cleanLogs, bool cleanCodeIndex, bool cleanClipboard) + { + long freed = 0; + var cutoff = DateTime.Now.AddDays(-retainDays); + + if (cleanConversations) + freed += CleanFolder(Path.Combine(AppDataDir, "conversations"), cutoff, retainDays == 0); + + if (cleanAuditLogs) + freed += CleanFolder(Path.Combine(AppDataDir, "audit"), cutoff, retainDays == 0); + + if (cleanLogs) + freed += CleanFolder(Path.Combine(AppDataDir, "logs"), cutoff, retainDays == 0); + + if (cleanCodeIndex) + freed += CleanFolder(Path.Combine(AppDataDir, "code_index"), cutoff, true); // 인덱스는 전체 삭제 + + if (cleanClipboard) + { + var clipFile = Path.Combine(AppDataDir, "clipboard_history.dat"); + if (File.Exists(clipFile)) + { + freed += new FileInfo(clipFile).Length; + File.Delete(clipFile); + } + } + + return freed; + } + + private static long GetFolderSize(string path) + { + if (!Directory.Exists(path)) return 0; + try + { + return Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories) + .Sum(f => { try { return new FileInfo(f).Length; } catch (Exception) { return 0; } }); + } + catch (Exception) { return 0; } + } + + private static long GetFileSize(string path) + { + try { return File.Exists(path) ? new FileInfo(path).Length : 0; } + catch (Exception) { return 0; } + } + + private static long CleanFolder(string path, DateTime cutoff, bool deleteAll) + { + if (!Directory.Exists(path)) return 0; + long freed = 0; + + foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) + { + try + { + var fi = new FileInfo(file); + if (deleteAll || fi.LastWriteTime < cutoff) + { + freed += fi.Length; + fi.Delete(); + } + } + catch (Exception) { } + } + + // 빈 디렉토리 정리 + if (deleteAll) + { + try { Directory.Delete(path, true); Directory.CreateDirectory(path); } catch (Exception) { } + } + + return freed; + } + + /// 바이트를 읽기 좋은 형태로 변환합니다. + public static string FormatSize(long bytes) + { + if (bytes < 1024) return $"{bytes} B"; + if (bytes < 1024 * 1024) return $"{bytes / 1024.0:F1} KB"; + if (bytes < 1024L * 1024 * 1024) return $"{bytes / (1024.0 * 1024):F1} MB"; + return $"{bytes / (1024.0 * 1024 * 1024):F2} GB"; + } +} + +/// 저장 공간 분석 결과. +public class StorageReport +{ + public long Conversations { get; set; } + public long AuditLogs { get; set; } + public long Logs { get; set; } + public long CodeIndex { get; set; } + public long EmbeddingDb { get; set; } + public long ClipboardHistory { get; set; } + public long Plugins { get; set; } + public long Skills { get; set; } + public long Settings { get; set; } + + public string DriveLabel { get; set; } = ""; + public long DriveFreeSpace { get; set; } + public long DriveTotalSpace { get; set; } + + /// 앱 전체 사용량. + public long TotalAppUsage => Conversations + AuditLogs + Logs + CodeIndex + EmbeddingDb + ClipboardHistory + Plugins + Skills + Settings; +} diff --git a/src/AxCopilot/Services/TempFileService.cs b/src/AxCopilot/Services/TempFileService.cs new file mode 100644 index 0000000..b645603 --- /dev/null +++ b/src/AxCopilot/Services/TempFileService.cs @@ -0,0 +1,61 @@ +using System.IO; + +namespace AxCopilot.Services; + +/// +/// 앱 내부 임시 파일 관리. +/// %APPDATA%\AxCopilot\temp\ 에 임시 파일을 생성하고, +/// 1일 이상 지난 파일을 자동으로 정리합니다. +/// +public static class TempFileService +{ + private static readonly string TempDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "temp"); + + /// + /// 임시 파일 경로를 생성하고 반환합니다. + /// 호출 시 1일 이상 지난 기존 임시 파일을 자동 정리합니다. + /// + /// 파일명 접두사 (예: "clip_image") + /// 확장자 (예: ".png", ".txt") + public static string CreateTempFile(string prefix, string extension) + { + Directory.CreateDirectory(TempDir); + CleanupOldFiles(); + + var fileName = $"{prefix}_{DateTime.Now:yyyyMMdd_HHmmss_fff}{extension}"; + return Path.Combine(TempDir, fileName); + } + + /// 1일 이상 지난 임시 파일을 삭제합니다. 열려 있는 파일은 건너뜁니다. + private static void CleanupOldFiles() + { + try + { + if (!Directory.Exists(TempDir)) return; + + var cutoff = DateTime.Now.AddDays(-1); + foreach (var file in Directory.EnumerateFiles(TempDir)) + { + try + { + if (File.GetCreationTime(file) < cutoff) + File.Delete(file); + } + catch (IOException) + { + // 파일이 열려 있음 — 건너뛰기 + } + catch (UnauthorizedAccessException) + { + // 권한 없음 — 건너뛰기 + } + } + } + catch (Exception ex) + { + LogService.Debug($"임시 파일 정리 중 오류: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/TokenEstimator.cs b/src/AxCopilot/Services/TokenEstimator.cs new file mode 100644 index 0000000..cdaf7e9 --- /dev/null +++ b/src/AxCopilot/Services/TokenEstimator.cs @@ -0,0 +1,89 @@ +namespace AxCopilot.Services; + +/// +/// 모델별 토큰 추정 및 비용 계산 서비스. +/// tiktoken 없이 문자 기반 가중치 추정을 사용합니다. +/// +public static class TokenEstimator +{ + /// 텍스트의 토큰 수를 추정합니다 (CJK/영문 가중치 적용). + public static int Estimate(string text) + { + if (string.IsNullOrEmpty(text)) return 0; + + int cjkChars = 0; + int totalChars = text.Length; + foreach (var c in text) + { + if (c >= 0xAC00 && c <= 0xD7A3) cjkChars++; // 한글 + else if (c >= 0x3000 && c <= 0x9FFF) cjkChars++; // CJK + } + + double ratio = totalChars > 0 ? (double)cjkChars / totalChars : 0; + // 영문: ~4글자/토큰, 한글: ~2글자/토큰 + double charsPerToken = 4.0 - ratio * 2.0; + return Math.Max(1, (int)(totalChars / charsPerToken)); + } + + /// 메시지 리스트의 총 토큰 수를 추정합니다. + public static int EstimateMessages(IEnumerable messages) + { + int total = 0; + foreach (var m in messages) + total += Estimate(m.Content) + 4; // 메시지 오버헤드 + return total; + } + + /// 비용을 추정합니다 (USD 기준). + public static (double InputCost, double OutputCost) EstimateCost( + int promptTokens, int completionTokens, string service, string model) + { + var (inputPrice, outputPrice) = GetPricing(service, model); + return (promptTokens / 1_000_000.0 * inputPrice, + completionTokens / 1_000_000.0 * outputPrice); + } + + /// 모델별 1M 토큰 가격 (USD). (inputPrice, outputPrice) + public static (double Input, double Output) GetPricing(string service, string model) + { + var key = $"{service}:{model}".ToLowerInvariant(); + + // 2026년 기준 가격표 + return key switch + { + _ when key.Contains("claude-opus") => (15.0, 75.0), + _ when key.Contains("claude-sonnet") => (3.0, 15.0), + _ when key.Contains("claude-haiku") => (0.25, 1.25), + _ when key.Contains("gemini-2.5-pro") => (1.25, 10.0), + _ when key.Contains("gemini-2.5-flash") => (0.15, 0.6), + _ when key.Contains("gemini-2.0") => (0.1, 0.4), + _ when key.Contains("ollama") => (0, 0), // 로컬 + _ when key.Contains("vllm") => (0, 0), // 로컬 + _ => (1.0, 3.0), // 기본 추정 + }; + } + + /// 토큰 수를 읽기 쉬운 문자열로 포맷합니다. + public static string Format(int count) => count switch + { + >= 1_000_000 => $"{count / 1_000_000.0:0.#}M", + >= 1_000 => $"{count / 1_000.0:0.#}k", + _ => count.ToString(), + }; + + /// 비용을 읽기 쉬운 문자열로 포맷합니다. + public static string FormatCost(double usd) => usd switch + { + 0 => "무료", + < 0.01 => $"${usd:F4}", + < 1.0 => $"${usd:F3}", + _ => $"${usd:F2}", + }; + + /// 컨텍스트 사용률을 계산합니다 (0.0~1.0). + public static double GetContextUsage(int currentTokens, int maxContextTokens) + { + if (maxContextTokens <= 0) return 0; + return Math.Min(1.0, (double)currentTokens / maxContextTokens); + } +} diff --git a/src/AxCopilot/Services/UrlTemplateEngine.cs b/src/AxCopilot/Services/UrlTemplateEngine.cs new file mode 100644 index 0000000..015090f --- /dev/null +++ b/src/AxCopilot/Services/UrlTemplateEngine.cs @@ -0,0 +1,56 @@ +using System.Text.RegularExpressions; + +namespace AxCopilot.Services; + +/// +/// Phase L3-4: URL 템플릿 엔진. +/// {0}, {1}, {query}, {param} 등의 플레이스홀더를 인자로 치환합니다. +/// +public static class UrlTemplateEngine +{ + private static readonly Regex NamedPlaceholder = new(@"\{(\w+)\}", RegexOptions.Compiled); + private static readonly Regex IndexedPlaceholder = new(@"\{(\d+)\}", RegexOptions.Compiled); + + /// + /// URL 템플릿의 플레이스홀더를 args 배열로 치환합니다. + /// {0}, {1} — 순서 기반 | {query}, {param} 등 — 첫 번째 인자로 치환 + /// + public static string Expand(string urlTemplate, params string[] args) + { + if (string.IsNullOrEmpty(urlTemplate)) return urlTemplate; + + var encoded = args.Select(Uri.EscapeDataString).ToArray(); + + // 인덱스 기반: {0}, {1}… + var result = IndexedPlaceholder.Replace(urlTemplate, m => + { + if (int.TryParse(m.Groups[1].Value, out var idx) && idx < encoded.Length) + return encoded[idx]; + return m.Value; + }); + + // 이름 기반: {query}, {param}… → 첫 번째 인자로 치환 + result = NamedPlaceholder.Replace(result, m => + { + return encoded.Length > 0 ? encoded[0] : m.Value; + }); + + return result; + } + + /// 공백으로 구분된 쿼리 문자열을 파싱하여 템플릿에 적용합니다. + public static string ExpandFromQuery(string urlTemplate, string query) + { + var parts = query.Trim().Split(' ', StringSplitOptions.RemoveEmptyEntries); + return Expand(urlTemplate, parts); + } + + /// 템플릿에 포함된 플레이스홀더 목록을 반환합니다. + public static IReadOnlyList GetPlaceholders(string urlTemplate) + { + var result = new List(); + foreach (Match m in NamedPlaceholder.Matches(urlTemplate)) + result.Add(m.Groups[1].Value); + return result; + } +} diff --git a/src/AxCopilot/Services/UsageRankingService.cs b/src/AxCopilot/Services/UsageRankingService.cs new file mode 100644 index 0000000..5bdaffe --- /dev/null +++ b/src/AxCopilot/Services/UsageRankingService.cs @@ -0,0 +1,105 @@ +using System.IO; +using System.Text.Json; + +namespace AxCopilot.Services; + +/// +/// 런처 항목 실행 횟수를 추적하여 퍼지 검색 결과 정렬에 활용합니다. +/// 저장 위치: %APPDATA%\AxCopilot\usage.json +/// 형식: { "키": 횟수 } — 키는 IndexEntry.Path (파일/폴더/앱 경로) +/// +internal static class UsageRankingService +{ + private static readonly string _dataFile = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "usage.json"); + + private static Dictionary _counts = new(StringComparer.OrdinalIgnoreCase); + private static bool _loaded = false; + private static readonly object _lock = new(); + + /// + /// 항목 실행 시 호출하여 카운트를 증가시킵니다. + /// + public static void RecordExecution(string key) + { + if (string.IsNullOrWhiteSpace(key)) return; + EnsureLoaded(); + lock (_lock) + { + _counts.TryGetValue(key, out var current); + _counts[key] = current + 1; + } + _ = SaveAsync(); + } + + /// + /// 주어진 키의 실행 횟수를 반환합니다. 없으면 0. + /// + public static int GetScore(string key) + { + if (string.IsNullOrWhiteSpace(key)) return 0; + EnsureLoaded(); + lock (_lock) + { + return _counts.TryGetValue(key, out var count) ? count : 0; + } + } + + /// + /// 실행 횟수 기준으로 내림차순 정렬하는 컴파러를 반환합니다. + /// 동점이면 원래 순서 유지 (stable sort). + /// + public static IEnumerable SortByUsage(IEnumerable items, Func keySelector) + { + EnsureLoaded(); + return items + .Select((item, idx) => (item, idx, score: GetScore(keySelector(item) ?? ""))) + .OrderByDescending(x => x.score) + .ThenBy(x => x.idx) + .Select(x => x.item); + } + + // ─── 내부 ────────────────────────────────────────────────────────────────── + + private static void EnsureLoaded() + { + if (_loaded) return; + lock (_lock) + { + if (_loaded) return; + try + { + if (File.Exists(_dataFile)) + { + var json = File.ReadAllText(_dataFile); + var data = JsonSerializer.Deserialize>(json); + if (data != null) + _counts = new Dictionary(data, StringComparer.OrdinalIgnoreCase); + } + } + catch (Exception ex) + { + LogService.Warn($"usage.json 로드 실패: {ex.Message}"); + } + _loaded = true; + } + } + + private static async Task SaveAsync() + { + try + { + Dictionary snapshot; + lock (_lock) { snapshot = new Dictionary(_counts); } + + Directory.CreateDirectory(Path.GetDirectoryName(_dataFile)!); + var json = JsonSerializer.Serialize(snapshot, new JsonSerializerOptions { WriteIndented = false }); + await File.WriteAllTextAsync(_dataFile, json); + } + catch (Exception ex) + { + LogService.Warn($"usage.json 저장 실패: {ex.Message}"); + } + } +} diff --git a/src/AxCopilot/Services/UsageStatisticsService.cs b/src/AxCopilot/Services/UsageStatisticsService.cs new file mode 100644 index 0000000..d1f7f16 --- /dev/null +++ b/src/AxCopilot/Services/UsageStatisticsService.cs @@ -0,0 +1,212 @@ +using System.IO; +using System.Text.Json; +using AxCopilot.Models; + +namespace AxCopilot.Services; + +/// +/// 일별 사용 통계를 기록하고 조회합니다. +/// 저장 위치: %APPDATA%\AxCopilot\stats\YYYY-MM-DD.json +/// 30일 초과 파일은 자동 삭제(롤링). +/// +internal static class UsageStatisticsService +{ + private static readonly string _statsDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "stats"); + + private static DailyUsageStats _today = new(); + private static bool _initialized; + private static readonly object _lock = new(); + private const int RetentionDays = 30; + + // ─── 공개 API ──────────────────────────────────────────────────────────── + + public static void RecordLauncherOpen() + { + EnsureInitialized(); + lock (_lock) { _today.LauncherOpens++; } + _ = SaveTodayAsync(); + } + + public static void RecordCommandUsage(string commandKey) + { + if (string.IsNullOrWhiteSpace(commandKey)) return; + EnsureInitialized(); + lock (_lock) + { + _today.CommandUsage.TryGetValue(commandKey, out var cur); + _today.CommandUsage[commandKey] = cur + 1; + } + _ = SaveTodayAsync(); + } + + public static void AddActiveSeconds(int seconds) + { + if (seconds <= 0) return; + EnsureInitialized(); + lock (_lock) { _today.ActiveSeconds += seconds; } + _ = SaveTodayAsync(); + } + + /// 당일 기록된 PC 활성 시간(초)을 반환합니다. 재시작 전 누적분 포함. + public static int GetTodayActiveSeconds() + { + EnsureInitialized(); + lock (_lock) { return _today.ActiveSeconds; } + } + + /// AX Agent 대화를 탭별로 기록합니다. + public static void RecordChat(string tab) + { + if (string.IsNullOrWhiteSpace(tab)) tab = "Chat"; + EnsureInitialized(); + lock (_lock) + { + _today.ChatCounts.TryGetValue(tab, out var cur); + _today.ChatCounts[tab] = cur + 1; + } + _ = SaveTodayAsync(); + } + + /// 토큰 사용량을 기록합니다. + public static void RecordTokens(int promptTokens, int completionTokens) + { + if (promptTokens <= 0 && completionTokens <= 0) return; + EnsureInitialized(); + lock (_lock) + { + _today.PromptTokens += promptTokens; + _today.CompletionTokens += completionTokens; + _today.TotalTokens += promptTokens + completionTokens; + } + _ = SaveTodayAsync(); + } + + /// 최근 일치 통계를 날짜 오름차순으로 반환합니다. + public static List GetStats(int days = 30) + { + EnsureInitialized(); + var result = new List(); + var today = DateTime.Today; + + for (int i = days - 1; i >= 0; i--) + { + var date = today.AddDays(-i); + var dateStr = date.ToString("yyyy-MM-dd"); + + if (dateStr == _today.Date) + { + DailyUsageStats snapshot; + lock (_lock) { snapshot = CloneToday(); } + result.Add(snapshot); + continue; + } + + var path = GetFilePath(dateStr); + if (File.Exists(path)) + { + try + { + var json = File.ReadAllText(path); + var stat = JsonSerializer.Deserialize(json); + if (stat != null) result.Add(stat); + else result.Add(new DailyUsageStats { Date = dateStr }); + } + catch (Exception) { result.Add(new DailyUsageStats { Date = dateStr }); } + } + else + { + result.Add(new DailyUsageStats { Date = dateStr }); + } + } + + return result; + } + + // ─── 내부 ──────────────────────────────────────────────────────────────── + + private static void EnsureInitialized() + { + if (_initialized) return; + lock (_lock) + { + if (_initialized) return; + try + { + Directory.CreateDirectory(_statsDir); + var todayStr = DateTime.Today.ToString("yyyy-MM-dd"); + var path = GetFilePath(todayStr); + + if (File.Exists(path)) + { + var json = File.ReadAllText(path); + var stat = JsonSerializer.Deserialize(json); + _today = stat ?? new DailyUsageStats { Date = todayStr }; + } + else + { + _today = new DailyUsageStats { Date = todayStr }; + } + + PurgeOldFiles(); + } + catch (Exception ex) + { + LogService.Warn($"통계 서비스 초기화 실패: {ex.Message}"); + _today = new DailyUsageStats { Date = DateTime.Today.ToString("yyyy-MM-dd") }; + } + _initialized = true; + } + } + + private static void PurgeOldFiles() + { + try + { + var cutoff = DateTime.Today.AddDays(-RetentionDays); + foreach (var file in Directory.GetFiles(_statsDir, "????-??-??.json")) + { + var name = Path.GetFileNameWithoutExtension(file); + if (DateTime.TryParse(name, out var fileDate) && fileDate < cutoff) + File.Delete(file); + } + } + catch (Exception ex) + { + LogService.Warn($"통계 파일 정리 실패: {ex.Message}"); + } + } + + private static async Task SaveTodayAsync() + { + try + { + DailyUsageStats snapshot; + lock (_lock) { snapshot = CloneToday(); } + + var path = GetFilePath(snapshot.Date); + var json = JsonSerializer.Serialize(snapshot, new JsonSerializerOptions { WriteIndented = false }); + await File.WriteAllTextAsync(path, json); + } + catch (Exception ex) + { + LogService.Warn($"통계 저장 실패: {ex.Message}"); + } + } + + private static DailyUsageStats CloneToday() => new() + { + Date = _today.Date, + LauncherOpens = _today.LauncherOpens, + ActiveSeconds = _today.ActiveSeconds, + CommandUsage = new Dictionary(_today.CommandUsage), + ChatCounts = new Dictionary(_today.ChatCounts), + TotalTokens = _today.TotalTokens, + PromptTokens = _today.PromptTokens, + CompletionTokens = _today.CompletionTokens, + }; + + private static string GetFilePath(string dateStr) + => Path.Combine(_statsDir, $"{dateStr}.json"); +} diff --git a/src/AxCopilot/Services/WindowTracker.cs b/src/AxCopilot/Services/WindowTracker.cs new file mode 100644 index 0000000..742041f --- /dev/null +++ b/src/AxCopilot/Services/WindowTracker.cs @@ -0,0 +1,24 @@ +using System.Runtime.InteropServices; + +namespace AxCopilot.Services; + +/// +/// 런처 활성화 직전의 포그라운드 창 핸들을 보존합니다. +/// SnapHandler, ScreenCaptureHandler에서 "이전 창"으로 사용됩니다. +/// App.xaml.cs의 OnHotkeyTriggered()에서 Capture()를 호출합니다. +/// +internal static class WindowTracker +{ + [DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); + + /// 런처 활성화 직전의 창 핸들 + public static IntPtr PreviousWindow { get; private set; } = IntPtr.Zero; + + /// 현재 포그라운드 창을 PreviousWindow에 저장합니다. + public static void Capture() + { + var hwnd = GetForegroundWindow(); + if (hwnd != IntPtr.Zero) + PreviousWindow = hwnd; + } +} diff --git a/src/AxCopilot/Services/WorktimeReminderService.cs b/src/AxCopilot/Services/WorktimeReminderService.cs new file mode 100644 index 0000000..c9c81f6 --- /dev/null +++ b/src/AxCopilot/Services/WorktimeReminderService.cs @@ -0,0 +1,241 @@ +using Microsoft.Win32; +using System.Windows.Threading; + +namespace AxCopilot.Services; + +/// +/// Windows 세션 잠금/해제를 감지하여 당일 근무 시간을 추적하고, +/// 설정된 간격마다 격려 팝업을 표시합니다. +/// +/// 동작: +/// - 앱 시작 = 잠금 해제 상태로 간주, 첫 팝업 표시 후 주기 타이머 시작 +/// - 잠금 → 현재 세션 시간을 당일 누계에 합산, 타이머 정지 +/// - 잠금 해제 → 세션 시작 기록, 간격 조건 만족 시 팝업 표시, 타이머 재시작 +/// - 자정을 넘기면 누계 및 마지막 표시 시각을 초기화 +/// +public sealed class WorktimeReminderService : IDisposable +{ + private readonly SettingsService _settings; + private readonly Dispatcher _dispatcher; + private readonly object _lock = new(); + + private DateTime _sessionStart; + private TimeSpan _todayTotal; + private DateTime _lastDate; + private DateTime _lastShownAt; + private System.Timers.Timer? _periodicTimer; + private volatile bool _disposed; + + public WorktimeReminderService(SettingsService settings, Dispatcher dispatcher) + { + _settings = settings; + _dispatcher = dispatcher; + _sessionStart = DateTime.Now; + _lastDate = DateTime.Today; + _lastShownAt = DateTime.MinValue; + + // 이전 세션(재부팅/재시작 전)에서 기록된 당일 PC 사용시간을 복원 + try + { + var prevSeconds = UsageStatisticsService.GetTodayActiveSeconds(); + if (prevSeconds > 0) + { + _todayTotal = TimeSpan.FromSeconds(prevSeconds); + LogService.Info($"이전 세션 누적 시간 복원: {_todayTotal}"); + } + } + catch (Exception ex) + { + LogService.Warn($"이전 세션 시간 복원 실패: {ex.Message}"); + } + + SystemEvents.SessionSwitch += OnSessionSwitch; + LogService.Info("WorktimeReminderService 초기화 완료."); + + // 앱 시작 시에도 알림 조건 확인 (잠금 해제 상태에서 앱이 시작된 경우) + var cfg = _settings.Settings.Reminder; + if (cfg.Enabled) + { + // 약간의 지연 후 표시 (UI 초기화 완료 대기) + _dispatcher.BeginInvoke(() => + { + if (!_disposed) ShowPopup(); + }, DispatcherPriority.ApplicationIdle); + + StartPeriodicTimer(); + } + } + + // ─── 세션 이벤트 ────────────────────────────────────────────────────────── + + private void OnSessionSwitch(object sender, SessionSwitchEventArgs e) + { + if (_disposed) return; + + LogService.Info($"SessionSwitch 이벤트: {e.Reason}"); + + lock (_lock) + { + switch (e.Reason) + { + case SessionSwitchReason.SessionLock: + AccumulateSession(); + StopPeriodicTimer(); + LogService.Info($"세션 잠금. 누적 시간: {_todayTotal}"); + break; + + case SessionSwitchReason.SessionUnlock: + case SessionSwitchReason.SessionLogon: + ResetForNewDayIfNeeded(); + _sessionStart = DateTime.Now; + + var cfg = _settings.Settings.Reminder; + if (!cfg.Enabled) + { + LogService.Info("알림 비활성화 상태. 팝업 생략."); + break; + } + + var interval = Math.Max(1, cfg.IntervalMinutes); + var elapsed = (DateTime.Now - _lastShownAt).TotalMinutes; + LogService.Info($"알림 간격 확인: 경과={elapsed:F1}분, 설정={interval}분"); + + if (elapsed >= interval) + ShowPopup(); + + StartPeriodicTimer(); + break; + } + } + } + + private void AccumulateSession() + { + // 호출부가 이미 lock 내부이므로 여기서 다시 lock하지 않음 + ResetForNewDayIfNeeded(); + _todayTotal += DateTime.Now - _sessionStart; + _sessionStart = DateTime.Now; + } + + private void ResetForNewDayIfNeeded() + { + if (DateTime.Today == _lastDate) return; + + // 자정을 넘긴 경우: 세션 시작을 자정으로 리셋 + // (자정 이후 경과 시간만 오늘 누적에 반영되도록) + var midnight = DateTime.Today; + _sessionStart = midnight; + _lastDate = DateTime.Today; + _lastShownAt = DateTime.MinValue; + + // 새 날이면 통계 파일에서 기존 누적 로드 (자정 넘겨 앱이 계속 실행 중인 경우) + try + { + var prevSeconds = UsageStatisticsService.GetTodayActiveSeconds(); + _todayTotal = prevSeconds > 0 ? TimeSpan.FromSeconds(prevSeconds) : TimeSpan.Zero; + } + catch (Exception) + { + _todayTotal = TimeSpan.Zero; + } + } + + // ─── 공개 API ───────────────────────────────────────────────────────────── + + /// 당일 총 근무 시간(잠금 해제 누계 + 현재 세션)을 반환합니다. + public TimeSpan GetTodayUsage() + { + lock (_lock) + { + ResetForNewDayIfNeeded(); + return _todayTotal + (DateTime.Now - _sessionStart); + } + } + + // ─── 주기 타이머 ───────────────────────────────────────────────────────── + + private void StartPeriodicTimer() + { + StopPeriodicTimer(); + var intervalMin = Math.Max(1, _settings.Settings.Reminder.IntervalMinutes); + _periodicTimer = new System.Timers.Timer(intervalMin * 60_000); + _periodicTimer.Elapsed += OnPeriodicTimerElapsed; + _periodicTimer.AutoReset = true; + _periodicTimer.Start(); + LogService.Info($"격려 알림 주기 타이머 시작: {intervalMin}분 간격"); + } + + private void StopPeriodicTimer() + { + if (_periodicTimer != null) + { + _periodicTimer.Elapsed -= OnPeriodicTimerElapsed; + _periodicTimer.Stop(); + _periodicTimer.Dispose(); + _periodicTimer = null; + } + } + + private void OnPeriodicTimerElapsed(object? sender, System.Timers.ElapsedEventArgs e) + { + if (_disposed) return; + + var cfg = _settings.Settings.Reminder; + if (!cfg.Enabled) + { + StopPeriodicTimer(); + return; + } + + lock (_lock) + { + ResetForNewDayIfNeeded(); + ShowPopup(); + } + } + + /// 설정 변경 시 외부에서 타이머를 재시작합니다. + public void RestartTimer() + { + var cfg = _settings.Settings.Reminder; + if (cfg.Enabled) + StartPeriodicTimer(); + else + StopPeriodicTimer(); + } + + // ─── 팝업 표시 ──────────────────────────────────────────────────────────── + + private void ShowPopup() + { + _lastShownAt = DateTime.Now; + var usage = GetTodayUsage(); + var (text, author) = QuoteService.GetRandom(_settings?.Settings.Reminder.EnabledCategories); + + _dispatcher.BeginInvoke(() => + { + if (_disposed) return; + try + { + if (_settings == null) return; + var popup = new AxCopilot.Views.ReminderPopupWindow( + text, author, usage, _settings); + popup.Show(); + } + catch (Exception ex) + { + LogService.Warn($"알림 팝업 표시 실패: {ex.Message}"); + } + }, DispatcherPriority.Normal); + } + + // ─── Dispose ────────────────────────────────────────────────────────────── + + public void Dispose() + { + if (_disposed) return; + _disposed = true; + StopPeriodicTimer(); + SystemEvents.SessionSwitch -= OnSessionSwitch; + } +} diff --git a/src/AxCopilot/Themes/Alfred.xaml b/src/AxCopilot/Themes/Alfred.xaml new file mode 100644 index 0000000..de1670d --- /dev/null +++ b/src/AxCopilot/Themes/Alfred.xaml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #000000 + + + 14 + 6 + + diff --git a/src/AxCopilot/Themes/AlfredLight.xaml b/src/AxCopilot/Themes/AlfredLight.xaml new file mode 100644 index 0000000..876b454 --- /dev/null +++ b/src/AxCopilot/Themes/AlfredLight.xaml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #303030 + + + 14 + 6 + + diff --git a/src/AxCopilot/Themes/Catppuccin.xaml b/src/AxCopilot/Themes/Catppuccin.xaml new file mode 100644 index 0000000..0aaa65d --- /dev/null +++ b/src/AxCopilot/Themes/Catppuccin.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + #000000 + + + 22 + 12 + + diff --git a/src/AxCopilot/Themes/Codex.xaml b/src/AxCopilot/Themes/Codex.xaml new file mode 100644 index 0000000..f7440ee --- /dev/null +++ b/src/AxCopilot/Themes/Codex.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #8888A8 + + + 16 + 8 + + diff --git a/src/AxCopilot/Themes/Converters.cs b/src/AxCopilot/Themes/Converters.cs new file mode 100644 index 0000000..8b424b7 --- /dev/null +++ b/src/AxCopilot/Themes/Converters.cs @@ -0,0 +1,168 @@ +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using System.Windows.Media; + +namespace AxCopilot.Themes; + +public class BoolToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type t, object p, CultureInfo c) => + value is true ? Visibility.Visible : Visibility.Collapsed; + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + v is Visibility.Visible; +} + +public class InverseBoolToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type t, object p, CultureInfo c) => + value is true ? Visibility.Collapsed : Visibility.Visible; + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + v is not Visibility.Visible; +} + +public class CountToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type t, object p, CultureInfo c) => + value is int count && count > 0 ? Visibility.Visible : Visibility.Collapsed; + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + throw new NotImplementedException(); +} + +/// +/// Segoe MDL2 심볼 코드포인트 → 아이콘 배경 SolidColorBrush. +/// 핸들러 타입별로 서로 다른 색상을 반환합니다. +/// +public class SymbolToBackgroundConverter : IValueConverter +{ + private static readonly Dictionary SymbolColors = new() + { + { Symbols.Globe, Brush("#0078D4") }, // URL — Microsoft Blue + { Symbols.Folder, Brush("#107C10") }, // 폴더 — Green + { Symbols.Terminal, Brush("#1B1B1B") }, // 터미널 — Near Black + { Symbols.Clipboard, Brush("#8764B8") }, // 클립보드 — Purple + { Symbols.Workspace, Brush("#C50F1F") }, // 워크스페이스 — Red + { Symbols.Cloud, Brush("#0099BC") }, // API — Teal + { Symbols.Plugin, Brush("#C239B3") }, // 플러그인 — Magenta + { Symbols.App, Brush("#4B5EFC") }, // 앱 — Accent + { Symbols.File, Brush("#605E5C") }, // 파일 — Gray + { Symbols.Save, Brush("#107C10") }, // 저장 — Green + { Symbols.Delete, Brush("#C50F1F") }, // 삭제 — Red + { Symbols.Rename, Brush("#CA5010") }, // 이름변경 — Orange + { Symbols.Restore, Brush("#0078D4") }, // 복원 — Blue + { Symbols.Info, Brush("#4B5EFC") }, // 정보 — Accent + { Symbols.Warning, Brush("#CA5010") }, // 경고 — Orange + { Symbols.Error, Brush("#C50F1F") }, // 오류 — Red + }; + + private static readonly SolidColorBrush DefaultBrush = Brush("#4B5EFC"); + + public object Convert(object value, Type t, object p, CultureInfo c) => + value is string symbol && SymbolColors.TryGetValue(symbol, out var brush) + ? brush : DefaultBrush; + + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + throw new NotImplementedException(); + + private static SolidColorBrush Brush(string hex) + { + var color = (Color)ColorConverter.ConvertFromString(hex); + var brush = new SolidColorBrush(color); + brush.Freeze(); + return brush; + } +} + +/// +/// 바인딩 값과 파라미터 문자열이 일치하는지 여부를 bool로 반환합니다. +/// RadioButton IsChecked 바인딩에 사용합니다. +/// +public class StringEqualConverter : IValueConverter +{ + public object Convert(object value, Type t, object p, CultureInfo c) => + value is string s && p is string param && s == param; + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + v is true ? p : System.Windows.Data.Binding.DoNothing; +} + +/// +/// "#RRGGBB" 헥스 문자열 → WPF Color 변환기 (테마 카드 미리보기용). +/// XAML에서 {x:Static converters:HexToColorConverter.Instance} 로 사용합니다. +/// +public class HexToColorConverter : IValueConverter +{ + public static readonly HexToColorConverter Instance = new(); + + public object Convert(object value, Type t, object p, CultureInfo c) + { + if (value is string hex) + { + try { return (Color)ColorConverter.ConvertFromString(hex); } + catch (Exception) { /* 잘못된 값이면 기본 반환 */ } + } + return Colors.Transparent; + } + + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + throw new NotImplementedException(); +} + +/// null 또는 빈 문자열이면 Collapsed, 값이 있으면 Visible. +public class NullToCollapsedConverter : IValueConverter +{ + public object Convert(object value, Type t, object p, CultureInfo c) => + value is string s && !string.IsNullOrEmpty(s) ? Visibility.Visible : Visibility.Collapsed; + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + throw new NotImplementedException(); +} + +/// LauncherItem.Data가 ClipboardEntry(이미지)면 썸네일 BitmapSource 반환. +public class ClipboardThumbnailConverter : IValueConverter +{ + public object? Convert(object value, Type t, object p, CultureInfo c) + { + if (value is Services.ClipboardEntry { Image: not null } entry) + return entry.Image; + return null; + } + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + throw new NotImplementedException(); +} + +/// ClipboardEntry 이미지가 있으면 Visible. +public class ClipboardHasImageConverter : IValueConverter +{ + public object Convert(object value, Type t, object p, CultureInfo c) => + value is Services.ClipboardEntry { Image: not null } ? Visibility.Visible : Visibility.Collapsed; + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + throw new NotImplementedException(); +} + +/// Subtitle에 경고 기호(⚠)가 포함되면 Visible, 아니면 Collapsed 반환. +public class WarningSubtitleColorConverter : IValueConverter +{ + public object Convert(object value, Type t, object p, CultureInfo c) => + value is string s && s.Contains('\u26A0') ? Visibility.Visible : Visibility.Collapsed; + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + throw new NotImplementedException(); +} + +/// ListViewItem → 1-based 인덱스 문자열. 9 초과 시 빈 문자열. +public class IndexToNumberConverter : IValueConverter +{ + public object Convert(object value, Type t, object p, CultureInfo c) + { + if (value is System.Windows.Controls.ListViewItem item) + { + var lv = System.Windows.Controls.ItemsControl.ItemsControlFromItemContainer(item); + if (lv != null) + { + var idx = lv.ItemContainerGenerator.IndexFromContainer(item); + return idx >= 0 && idx < 9 ? (idx + 1).ToString() : ""; + } + } + return ""; + } + public object ConvertBack(object v, Type t, object p, CultureInfo c) => + throw new NotImplementedException(); +} diff --git a/src/AxCopilot/Themes/Dark.xaml b/src/AxCopilot/Themes/Dark.xaml new file mode 100644 index 0000000..862a5ef --- /dev/null +++ b/src/AxCopilot/Themes/Dark.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #000000 + + + 20 + 10 + + diff --git a/src/AxCopilot/Themes/Light.xaml b/src/AxCopilot/Themes/Light.xaml new file mode 100644 index 0000000..e6724f5 --- /dev/null +++ b/src/AxCopilot/Themes/Light.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #5060A0 + + + 20 + 10 + + diff --git a/src/AxCopilot/Themes/Monokai.xaml b/src/AxCopilot/Themes/Monokai.xaml new file mode 100644 index 0000000..c46a382 --- /dev/null +++ b/src/AxCopilot/Themes/Monokai.xaml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + #000000 + + + 14 + 6 + + diff --git a/src/AxCopilot/Themes/Nord.xaml b/src/AxCopilot/Themes/Nord.xaml new file mode 100644 index 0000000..eb6d837 --- /dev/null +++ b/src/AxCopilot/Themes/Nord.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + #000000 + + + 16 + 8 + + diff --git a/src/AxCopilot/Themes/OLED.xaml b/src/AxCopilot/Themes/OLED.xaml new file mode 100644 index 0000000..d8cfaaf --- /dev/null +++ b/src/AxCopilot/Themes/OLED.xaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + #000000 + + + 26 + 13 + + diff --git a/src/AxCopilot/Themes/Sepia.xaml b/src/AxCopilot/Themes/Sepia.xaml new file mode 100644 index 0000000..bb6bf47 --- /dev/null +++ b/src/AxCopilot/Themes/Sepia.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + #806040 + + + 12 + 6 + + diff --git a/src/AxCopilot/Themes/Symbols.cs b/src/AxCopilot/Themes/Symbols.cs new file mode 100644 index 0000000..ae5466f --- /dev/null +++ b/src/AxCopilot/Themes/Symbols.cs @@ -0,0 +1,133 @@ +namespace AxCopilot.Themes; + +/// +/// Segoe MDL2 Assets 폰트 유니코드 심볼 상수. +/// Windows 10+ 에 기본 포함되어 있습니다. +/// 참고: https://learn.microsoft.com/en-us/windows/apps/design/style/segoe-ui-symbol-font +/// +internal static class Symbols +{ + // ─── 검색 / 입력 ───────────────────────────────────────────────────────── + public const string Search = "\uE721"; // 돋보기 (기본 검색 아이콘) + + // ─── 핸들러 타입별 아이콘 ───────────────────────────────────────────────── + public const string Globe = "\uE774"; // 지구본 (URL @) + public const string Folder = "\uE8B7"; // 폴더 (폴더 ~) + public const string Terminal = "\uE756"; // 터미널/명령 (배치 >) + public const string LaunchIcon = "\uE7C4"; // 실행/런치 (Windows Run ^) + public const string Clipboard = "\uE77F"; // 클립보드 (클립보드 $) + public const string Workspace = "\uE8A1"; // 창 배치 (워크스페이스 !) + public const string Cloud = "\uE82D"; // 클라우드 (API/JSON 스킬) + public const string Plugin = "\uECCA"; // 플러그인 (외부 플러그인) + + // ─── 파일 인덱스 타입 ──────────────────────────────────────────────────── + public const string App = "\uECAA"; // 앱 실행 파일 (.exe) + public const string File = "\uE8A5"; // 일반 파일 (.lnk, .bat, .ps1) + public const string Excel = "\uE9F9"; // 엑셀/스프레드시트 + public const string Word = "\uE8A5"; // 워드/문서 (File과 동일) + public const string Slides = "\uEE71"; // 프레젠테이션 + public const string Pdf = "\uEA90"; // PDF + public const string Image = "\uEB9F"; // 이미지 (Picture와 동일) + public const string Video = "\uE714"; // 동영상 + public const string Music = "\uEC4F"; // 음악 + public const string Archive = "\uE8C6"; // 압축 파일 + public const string Code = "\uE943"; // 코드/소스 + public const string Config = "\uE713"; // 설정 파일 + public const string TextFile = "\uE8D2"; // 텍스트 파일 + public const string Web = "\uE774"; // 웹 파일 (Globe와 동일) + + // ─── 상태 아이콘 ────────────────────────────────────────────────────────── + public const string Warning = "\uE7BA"; // 경고 + public const string Error = "\uEA39"; // 오류 + public const string Info = "\uE946"; // 정보 + + // ─── 액션 ──────────────────────────────────────────────────────────────── + public const string Save = "\uE74E"; // 저장 + public const string Delete = "\uE74D"; // 삭제 + public const string Rename = "\uE8AC"; // 이름 변경 + public const string Restore = "\uE72C"; // 복원 + + // ─── 계산기 ─────────────────────────────────────────────────────────────── + public const string Calculator = "\uE8EF"; // 계산기 + public const string Equal = "\uE8D2"; // = 결과 + + // ─── 스니펫 ─────────────────────────────────────────────────────────────── + public const string Snippet = "\uE70B"; // 코드 스니펫 / 번개 + public const string Text = "\uE8D2"; // 텍스트 + + // ─── 클립보드 히스토리 ──────────────────────────────────────────────────── + public const string History = "\uE81C"; // 히스토리 / 시계 + public const string ClipPaste = "\uE77F"; // 클립보드 + 붙여넣기 (기존 Clipboard와 구분) + public const string Picture = "\uEB9F"; // 사진/이미지 (클립보드 이미지 항목) + + // ─── 시스템 명령 ────────────────────────────────────────────────────────── + public const string Lock = "\uE72E"; // 화면 잠금 + public const string Sleep = "\uEC46"; // 절전 + public const string Power = "\uE7E8"; // 전원 / 종료 + public const string Restart = "\uE777"; // 재시작 + public const string Logout = "\uF3B1"; // 로그아웃 + public const string RecycleBin = "\uE74D"; // 휴지통 비우기 (Delete와 동일 코드포인트) + + // ─── 미디어 컨트롤 ──────────────────────────────────────────────────────── + public const string MediaPlay = "\uE768"; // 재생 / 일시정지 + public const string MediaNext = "\uE893"; // 다음 트랙 + public const string MediaPrev = "\uE892"; // 이전 트랙 + public const string VolumeUp = "\uE995"; // 볼륨 올리기 + public const string VolumeDown = "\uE993"; // 볼륨 낮추기 + public const string VolumeMute = "\uE74F"; // 음소거 + + // ─── 시스템 정보 ────────────────────────────────────────────────────────── + public const string Computer = "\uE7F4"; // 컴퓨터 / PC + public const string Person = "\uE77B"; // 사용자 + public const string Network = "\uE968"; // 네트워크 / Wi-Fi + public const string Battery = "\uE83F"; // 배터리 + public const string BatteryCharging = "\uE83E"; // 배터리 충전 중 + public const string BatteryLow = "\uEBA0"; // 배터리 낮음 + public const string Clock = "\uE823"; // 시계 / 가동시간 + public const string Processor = "\uE950"; // CPU / 프로세서 + public const string Memory = "\uE950"; // RAM / 메모리 (프로세서 아이콘 공유) + public const string Storage = "\uEDA2"; // 디스크 / 저장소 + + // ─── 신규 핸들러 아이콘 ─────────────────────────────────────────────────── + public const string Emoji = "\uE76E"; // 이모지 피커 (감정 표현) + public const string ColorPicker = "\uE771"; // 색상 팔레트 + public const string Timer = "\uE916"; // 타이머 / 알람 + public const string RecentFiles = "\uE81C"; // 최근 파일 (시계) + public const string Currency = "\uE8EE"; // 통화 / 환율 + public const string Uninstall = "\uE74D"; // 앱 제거 (삭제) + public const string Note = "\uE70B"; // 빠른 메모 (번개/메모) + + // ─── v1.6 신규 핸들러 아이콘 ────────────────────────────────────────────── + public const string PortIcon = "\uE968"; // 포트/네트워크 점검 (Network와 동일) + public const string EnvVar = "\uE8D7"; // 환경변수 (코드/설정) + public const string JsonValid = "\uE930"; // JSON 유효 (체크) + public const string JsonFormat = "\uE8A4"; // JSON 포맷 (문서) + public const string JsonMinify = "\uE8C6"; // JSON 미니파이 (압축) + public const string EncodeIcon = "\uE8CB"; // 인코딩/해싱 (열쇠) + public const string SnapLayout = "\uE8A0"; // 창 스냅 (레이아웃) + public const string CaptureIcon = "\uE722"; // 화면 캡처 (카메라) + public const string ScrollCapture = "\uE8F4"; // 스크롤 캡처 (스크롤) + + // ─── v1.8 신규 아이콘 ───────────────────────────────────────────────────── + public const string ReminderBell = "\uEA8F"; // 잠금 해제 알림 (벨) + public const string Lightbulb = "\uE82F"; // 전구 (아이디어 / 자동 실행) + + // ─── v1.0 추가 핸들러 아이콘 ─────────────────────────────────────────────── + public const string EyeDropper = "\uEF3C"; // 스포이드 (색상 추출) + public const string DateIcon = "\uE787"; // 달력 (날짜 계산) + public const string ServiceIcon = "\uE912"; // 서비스 (기어) + + public const string PipeIcon = "\uE8C8"; // 파이프라인 (체인) + public const string JournalIcon = "\uE70B"; // 업무 일지 (메모) + public const string RoutineIcon = "\uE82F"; // 루틴 (전구) + public const string BatchIcon = "\uE8C6"; // 일괄 처리 (압축) + public const string DiffIcon = "\uE89A"; // 비교 (분기) + public const string WindowIcon = "\uE8A7"; // 윈도우 스위처 (창) + + // ─── v1.0 유틸리티 핸들러 아이콘 ──────────────────────────────────────────── + public const string TextStats = "\uE8D2"; // 텍스트 통계 (= 결과) + public const string Favorite = "\uE728"; // 즐겨찾기 (별) + public const string RenameIcon = "\uE8AC"; // 이름 변경 (Rename와 동일) + public const string MonitorIcon = "\uE7F4"; // 시스템 모니터 (Computer와 동일) + public const string ScaffoldIcon = "\uE8F1"; // 스캐폴딩 (프로젝트 구조) +} diff --git a/src/AxCopilot/ViewModels/LauncherViewModel.cs b/src/AxCopilot/ViewModels/LauncherViewModel.cs new file mode 100644 index 0000000..babfa65 --- /dev/null +++ b/src/AxCopilot/ViewModels/LauncherViewModel.cs @@ -0,0 +1,805 @@ +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.Windows; +using System.Windows.Media; +using AxCopilot.Core; +using AxCopilot.Models; +using AxCopilot.SDK; +using AxCopilot.Services; +using AxCopilot.Themes; + +namespace AxCopilot.ViewModels; + +public class LauncherViewModel : INotifyPropertyChanged +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + private readonly CommandResolver _resolver; + private readonly SettingsService _settings; + + private string _inputText = ""; + private LauncherItem? _selectedItem; + private bool _isLoading; + private CancellationTokenSource? _searchCts; + private System.Threading.Timer? _debounceTimer; + private const int DebounceMs = 30; // 30ms 디바운스 — 연속 입력 시 중간 검색 스킵 + private string _lastSearchQuery = ""; // IME 조합 완성 후 동일 쿼리 재검색 방지용 + + // ─── 파일 액션 모드 ─────────────────────────────────────────────────────── + private bool _isActionMode; + private LauncherItem? _actionSourceItem; + private string _savedQuery = ""; + + // ─── 클립보드 병합 ──────────────────────────────────────────────────────── + private readonly HashSet _mergeQueue = new(); + + /// + /// 검색 결과 컬렉션. ReplaceAll() 호출 시 단일 Reset 이벤트로 WPF 레이아웃 1회만 갱신. + /// + public BulkObservableCollection Results { get; } = new(); + + // ─── 기본 프로퍼티 ──────────────────────────────────────────────────────── + + public string InputText + { + get => _inputText; + set + { + if (_inputText == value) return; + _inputText = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(HasActivePrefix)); + OnPropertyChanged(nameof(ActivePrefixLabel)); + OnPropertyChanged(nameof(ActivePrefixSymbol)); + OnPropertyChanged(nameof(ActivePrefixBrush)); + OnPropertyChanged(nameof(IsClipboardMode)); + OnPropertyChanged(nameof(ShowMergeHint)); + OnPropertyChanged(nameof(MergeHintText)); + + // 연속 입력 시 이전 검색 즉시 취소 + 50ms 디바운스 후 실제 검색 시작 + _searchCts?.Cancel(); + _debounceTimer?.Dispose(); + if (string.IsNullOrWhiteSpace(value)) + { + Results.Clear(); + } + else + { + var captured = value; + _debounceTimer = new System.Threading.Timer( + _ => Application.Current?.Dispatcher.InvokeAsync(() => _ = SearchAsync(captured)), + null, DebounceMs, System.Threading.Timeout.Infinite); + } + } + } + + public LauncherItem? SelectedItem + { + get => _selectedItem; + set { _selectedItem = value; OnPropertyChanged(); } + } + + public bool IsLoading + { + get => _isLoading; + set { _isLoading = value; OnPropertyChanged(); } + } + + private string _placeholderText = AxCopilot.Services.L10n.Get("placeholder"); + public string PlaceholderText + { + get => _placeholderText; + private set { _placeholderText = value; OnPropertyChanged(); } + } + + /// 런처가 열릴 때마다 호출 — 설정에 따라 랜덤 또는 고정 문구로 교체합니다. + public void RefreshPlaceholder() => + PlaceholderText = _settings.Settings.Launcher.EnableRandomPlaceholder + ? AxCopilot.Services.L10n.GetRandomPlaceholder() + : AxCopilot.Services.L10n.Get("placeholder"); + + /// 아이콘 애니메이션 설정값 + public bool EnableIconAnimation => _settings.Settings.Launcher.EnableIconAnimation; + /// 런처 무지개 글로우 설정값 + public bool EnableRainbowGlow => _settings.Settings.Launcher.EnableRainbowGlow; + /// 선택 아이템 글로우 설정값 + public bool EnableSelectionGlow => _settings.Settings.Launcher.EnableSelectionGlow; + /// 런처 창 테두리 표시 설정값 + public bool ShowLauncherBorder => _settings.Settings.Launcher.ShowLauncherBorder; + public string ThemeSetting => _settings.Settings.Launcher.Theme; + public CustomThemeColors? CustomThemeColors => _settings.Settings.Launcher.CustomTheme; + public string WindowPosition => _settings.Settings.Launcher.Position; + + // ─── Prefix 배지 ───────────────────────────────────────────────────────── + + private static readonly Dictionary PrefixMap = new() + { + // ─── 기본 프리픽스 ────────────────────────────────────────────────────── + { "@", ("URL", Symbols.Globe, "#0078D4") }, + { "~", ("워크", Symbols.Workspace, "#C50F1F") }, + { ">", ("명령", Symbols.Terminal, "#323130") }, + { "$", ("클립", Symbols.Clipboard, "#8764B8") }, + { "cd", ("폴더", Symbols.Folder, "#107C10") }, + { "#", ("히스", Symbols.History, "#B7791F") }, + { ";", ("스닛", Symbols.Snippet, "#0F6CBD") }, + { "=", ("계산", Symbols.Calculator, "#4B5EFC") }, + { "!", ("AI", "\uE8BD", "#8B2FC9") }, + { "?", ("검색", Symbols.Globe, "#006EAF") }, + { "/", ("시스템", Symbols.Power, "#4A4A4A") }, + // ─── 시스템 도구 ───────────────────────────────────────────────────────── + { "kill ", ("킬", Symbols.Error, "#CC2222") }, + { "media ", ("미디어", Symbols.MediaPlay, "#1A6B3C") }, + { "info ", ("시스템", Symbols.Computer, "#5B4E7E") }, + { "port", ("포트", Symbols.Network, "#006699") }, + // ─── v1.5 핸들러 ───────────────────────────────────────────────────────── + { "emoji", ("이모지", Symbols.Emoji, "#F59E0B") }, + { "color", ("색상", Symbols.ColorPicker, "#EC4899") }, + { "recent", ("최근", Symbols.RecentFiles, "#059669") }, + { "note", ("메모", Symbols.Note, "#7C3AED") }, + { "uninstall", ("제거", Symbols.Uninstall, "#DC2626") }, + // ─── v1.6 핸들러 ───────────────────────────────────────────────────────── + { "env", ("환경변수", Symbols.EnvVar, "#0D9488") }, + { "json", ("JSON", Symbols.JsonValid, "#D97706") }, + { "encode ", ("인코딩", Symbols.EncodeIcon, "#6366F1") }, + { "snap", ("스냅", Symbols.SnapLayout, "#B45309") }, + { "cap", ("캡처", Symbols.CaptureIcon, "#BE185D") }, + { "help", ("도움말", Symbols.Info, "#6B7280") }, + }; + + // ─── 설정 기능 토글 (런처 실동작 연결) ────────────────────────────────── + /// 번호 배지(1~9) 표시 여부 — LauncherWindow.xaml 번호 뱃지 Visibility 바인딩 + public bool ShowNumberBadges => _settings.Settings.Launcher.ShowNumberBadges; + /// 포커스 잃으면 런처 닫기 — Window_Deactivated에서 읽음 + public bool CloseOnFocusLost => _settings.Settings.Launcher.CloseOnFocusLost; + /// 액션 모드(→) 허용 여부 + public bool EnableActionMode => _settings.Settings.Launcher.EnableActionMode; + + /// AI 기능 활성화 여부 (AiEnabled 설정). false이면 ! prefix 숨김. + private static bool IsAiEnabled() => + CurrentApp?.SettingsService?.Settings.AiEnabled ?? true; + + public bool HasActivePrefix => + _settings.Settings.Launcher.ShowPrefixBadge && + _inputText.Length > 0 && PrefixMap.Keys.Any(k => + (k != "!" || IsAiEnabled()) && + _inputText.StartsWith(k, StringComparison.OrdinalIgnoreCase)); + + public string? ActivePrefix => + PrefixMap.Keys.FirstOrDefault(k => + (k != "!" || IsAiEnabled()) && + _inputText.StartsWith(k, StringComparison.OrdinalIgnoreCase)); + + public string ActivePrefixLabel => + ActivePrefix != null && PrefixMap.TryGetValue(ActivePrefix, out var info) ? info.Label : ""; + + public string ActivePrefixSymbol => + ActivePrefix != null && PrefixMap.TryGetValue(ActivePrefix, out var info) ? info.Symbol : Symbols.Search; + + public SolidColorBrush ActivePrefixBrush + { + get + { + if (ActivePrefix != null && PrefixMap.TryGetValue(ActivePrefix, out var info)) + { + var color = (Color)ColorConverter.ConvertFromString(info.ColorHex); + return new SolidColorBrush(color); + } + return new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + } + } + + // ─── 파일 액션 모드 프로퍼티 ───────────────────────────────────────────── + + public bool IsActionMode + { + get => _isActionMode; + private set + { + _isActionMode = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(ShowActionModeBar)); + OnPropertyChanged(nameof(ActionModeBreadcrumb)); + } + } + + public bool ShowActionModeBar => IsActionMode; + public string ActionModeBreadcrumb => _actionSourceItem?.Title ?? ""; + + /// 현재 선택 항목이 파일 액션 가능 여부 + public bool CanEnterActionMode() => + !IsActionMode && SelectedItem?.Data is IndexEntry; + + // ─── 클립보드 병합 모드 프로퍼티 ───────────────────────────────────────── + + public bool IsClipboardMode => _inputText.StartsWith("#", StringComparison.Ordinal); + + public int MergeCount => _mergeQueue.Count; + + public bool ShowMergeHint => _mergeQueue.Count > 0 && IsClipboardMode; + + public string MergeHintText => + _mergeQueue.Count > 0 + ? $"{_mergeQueue.Count}개 선택됨 · Shift+Enter로 합치기 · Esc로 취소" + : ""; + + public bool IsItemMarkedForMerge(LauncherItem item) => + item.Data is ClipboardEntry e && _mergeQueue.Contains(e); + + // ─── 이벤트 ─────────────────────────────────────────────────────────────── + + public event EventHandler? CloseRequested; + public event EventHandler? NotificationRequested; + + public LauncherViewModel(CommandResolver resolver, SettingsService settings) + { + _resolver = resolver; + _settings = settings; + } + + // ─── 런처 표시 시 초기화 ────────────────────────────────────────────────── + + /// 런처가 표시될 때 호출 — 이전 상태 초기화 + public void OnShown() + { + if (IsActionMode) { IsActionMode = false; _actionSourceItem = null; } + Results.Clear(); + _lastSearchQuery = ""; + ClearMerge(); + } + + // ─── 검색 ──────────────────────────────────────────────────────────────── + + /// + /// IME 조합 중 코드비하인드에서 직접 호출하는 검색 트리거. + /// InputText 바인딩을 건드리지 않으므로 한글 조합 상태가 유지됩니다. + /// 동일 쿼리로 재호출 시 (IME 조합 완성 이벤트 중복) 검색을 건너뜁니다. + /// + internal Task TriggerImeSearchAsync(string text) + { + var key = text.Trim().ToLowerInvariant(); + // IME 조합 완성으로 인한 동일 쿼리 재검색이면 선택 위치 유지 (건너뜀) + if (key == _lastSearchQuery && Results.Count > 0) return Task.CompletedTask; + return SearchAsync(text); + } + + private async Task SearchAsync(string query) + { + // CTS 취소는 setter에서 이미 처리됨. 새 토큰만 발급. + _searchCts = new CancellationTokenSource(); + var ct = _searchCts.Token; + + var queryKey = query.Trim().ToLowerInvariant(); + // 동일 쿼리 재검색(IME 커밋 후 WPF 바인딩 갱신 등)이면 결과를 일단 유지 + var isSameQuery = queryKey == _lastSearchQuery && Results.Count > 0; + + if (!isSameQuery) Results.Clear(); + if (string.IsNullOrWhiteSpace(query)) { _lastSearchQuery = ""; return; } + + // 기능 비활성화 시 해당 프리픽스 쿼리는 빈 결과 반환 + if (!_settings.Settings.Launcher.EnableFavorites && + query.StartsWith("fav", StringComparison.OrdinalIgnoreCase)) return; + if (!_settings.Settings.Launcher.EnableRecent && + query.StartsWith("recent", StringComparison.OrdinalIgnoreCase)) return; + + // 동일 쿼리면 현재 선택 항목을 기억해 복원 시도 + var prevSelected = isSameQuery ? SelectedItem : null; + + IsLoading = true; + try + { + var items = await _resolver.ResolveAsync(query, ct); + if (ct.IsCancellationRequested) return; + + // ReplaceAll: Clear+AddRange를 단일 Reset 이벤트로 → WPF 레이아웃 1회만 갱신 + Results.ReplaceAll(items); + _lastSearchQuery = queryKey; + + if (isSameQuery && prevSelected != null) + { + // 결과 목록이 같으면 이전 선택 복원 (ReferenceEquals: 동일 데이터 객체 비교) + var restored = Results.FirstOrDefault(r => + ReferenceEquals(r.Data, prevSelected.Data) || r.Title == prevSelected.Title); + SelectedItem = restored ?? Results.FirstOrDefault(); + } + else + { + SelectedItem = Results.FirstOrDefault(); + } + } + catch (OperationCanceledException) { /* 정상 취소 */ } + catch (Exception ex) + { + LogService.Error($"검색 오류: {ex.Message}"); + } + finally + { + if (!ct.IsCancellationRequested) IsLoading = false; + } + } + + // ─── 실행 ──────────────────────────────────────────────────────────────── + + public async Task ExecuteSelectedAsync() + { + // 파일 액션 모드: 선택한 액션 실행 + if (IsActionMode && SelectedItem?.Data is FileActionData fileAction) + { + ExecuteFileAction(fileAction); + ExitActionMode(); + CloseRequested?.Invoke(this, EventArgs.Empty); + return; + } + + if (SelectedItem == null) return; + + // 창을 먼저 닫아 체감 속도 확보 → 실행은 백그라운드 + CloseRequested?.Invoke(this, EventArgs.Empty); + + try + { + await _resolver.ExecuteAsync(SelectedItem, InputText, CancellationToken.None); + } + catch (Exception ex) + { + NotificationRequested?.Invoke(this, $"실행 실패: {ex.Message}"); + LogService.Error($"Execute 오류: {ex.Message}"); + } + } + + /// + /// 캡처 모드에서 Shift+Enter 시 지연 캡처 타이머 선택 목록을 표시합니다. + /// + public bool ShowDelayTimerItems() + { + if (SelectedItem?.Data is not string mode) return false; + + // 이미 delay 아이템이면 실행으로 넘기기 + if (mode.StartsWith("delay:")) return false; + + // ScreenCaptureHandler 찾기 + if (!_resolver.RegisteredHandlers.TryGetValue( + ActivePrefix ?? "", out var handler) || + handler is not AxCopilot.Handlers.ScreenCaptureHandler capHandler) + return false; + + var items = capHandler.GetDelayItems(mode).ToList(); + Results.Clear(); + foreach (var item in items) Results.Add(item); + SelectedItem = Results.FirstOrDefault(); + return true; + } + + public void SelectNext() + { + if (Results.Count == 0) return; + var idx = SelectedItem != null ? Results.IndexOf(SelectedItem) : -1; + SelectedItem = Results[(idx + 1) % Results.Count]; + } + + public void SelectPrev() + { + if (Results.Count == 0) return; + var idx = SelectedItem != null ? Results.IndexOf(SelectedItem) : 0; + SelectedItem = Results[(idx - 1 + Results.Count) % Results.Count]; + } + + // ─── Large Type ─────────────────────────────────────────────────────────── + + /// Shift+Enter 시 Large Type으로 표시할 텍스트 반환 + public string GetLargeTypeText() + { + if (SelectedItem == null) return ""; + // 계산기: 결과값 문자열 + if (SelectedItem.Data is string s && !string.IsNullOrWhiteSpace(s)) return s; + // 클립보드 히스토리: 전체 텍스트 + if (SelectedItem.Data is ClipboardEntry entry && entry.IsText) return entry.Text; + // 기본: 제목 + return SelectedItem.Title; + } + + // ─── 파일 액션 서브메뉴 ─────────────────────────────────────────────────── + + public void EnterActionMode(LauncherItem item) + { + if (!_settings.Settings.Launcher.EnableActionMode) return; + if (item.Data is not IndexEntry entry) return; + + _actionSourceItem = item; + _savedQuery = _inputText; + IsActionMode = true; + + var path = Environment.ExpandEnvironmentVariables(entry.Path); + var isDir = Directory.Exists(path); + var name = Path.GetFileName(path); + + Results.Clear(); + Results.Add(MakeAction("경로 복사", + path, FileAction.CopyPath, Symbols.Clipboard, "#8764B8")); + + Results.Add(MakeAction("전체 경로 복사", + path, FileAction.CopyFullPath, Symbols.Clipboard, "#C55A11")); + + Results.Add(MakeAction("파일 탐색기에서 열기", + "Explorer에서 위치 선택됨으로 표시", FileAction.OpenExplorer, Symbols.Folder, "#107C10")); + + if (!isDir) + Results.Add(MakeAction("관리자 권한으로 실행", + "UAC 권한 상승 후 실행", FileAction.RunAsAdmin, Symbols.Lock, "#C50F1F")); + + Results.Add(MakeAction("터미널에서 열기", + isDir ? path : Path.GetDirectoryName(path) ?? path, + FileAction.OpenTerminal, Symbols.Terminal, "#323130")); + + if (!isDir) + Results.Add(MakeAction("파일 속성 보기", + "Windows 속성 대화 상자 열기", FileAction.ShowProperties, Symbols.Info, "#6B2C91")); + + Results.Add(MakeAction("이름 바꾸기", + name, FileAction.Rename, Symbols.Rename, "#D97706")); + + Results.Add(MakeAction("휴지통으로 삭제", + "복구 가능한 삭제 · 확인 후 실행", FileAction.DeleteToRecycleBin, Symbols.Delete, "#C50F1F")); + + SelectedItem = Results.FirstOrDefault(); + + static LauncherItem MakeAction(string title, string subtitle, + FileAction action, string symbol, string colorHex) + { + var data = new FileActionData(subtitle, action); + return new LauncherItem(title, subtitle, null, data, Symbol: symbol); + } + } + + public void ExitActionMode() + { + IsActionMode = false; + _actionSourceItem = null; + // 이전 검색 쿼리 복원 + var q = _savedQuery; + _savedQuery = ""; + _ = SearchAsync(q); + } + + private static void ExecuteFileAction(FileActionData data) + { + var path = data.Path; + switch (data.Action) + { + case FileAction.CopyPath: + Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(path)); + break; + + case FileAction.OpenExplorer: + if (File.Exists(path)) + Process.Start("explorer.exe", $"/select,\"{path}\""); + else + Process.Start("explorer.exe", $"\"{path}\""); + break; + + case FileAction.RunAsAdmin: + try + { + Process.Start(new ProcessStartInfo(path) + { UseShellExecute = true, Verb = "runas" }); + } + catch (Exception ex) + { + LogService.Warn($"관리자 실행 취소: {ex.Message}"); + } + break; + + case FileAction.CopyFullPath: + Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(path)); + break; + + case FileAction.ShowProperties: + try + { + var psi = new ProcessStartInfo("explorer.exe") + { + Arguments = $"/select,\"{path}\"", + UseShellExecute = true + }; + Process.Start(psi); + // Shell property dialog + var propInfo = new ProcessStartInfo + { + FileName = "rundll32.exe", + Arguments = $"shell32.dll,ShellExec_RunDLL \"properties\" \"{path}\"", + UseShellExecute = false + }; + // 대안: Shell verb "properties" + try + { + Process.Start(new ProcessStartInfo(path) + { UseShellExecute = true, Verb = "properties" }); + } + catch (Exception) { /* 일부 파일 형식에서 지원 안됨 */ } + } + catch (Exception ex) { LogService.Warn($"속성 열기 실패: {ex.Message}"); } + break; + + case FileAction.Rename: + // 런처에서 rename 핸들러로 전달 + // ExitActionMode 후 InputText가 rename 프리픽스로 설정됨 + break; + + case FileAction.DeleteToRecycleBin: + // LauncherWindow.xaml.cs의 ExecuteSelected에서 확인 다이얼로그 처리 + break; + + case FileAction.OpenTerminal: + var dir = File.Exists(path) ? Path.GetDirectoryName(path) ?? path : path; + try { Process.Start("wt.exe", $"-d \"{dir}\""); } + catch (Exception) + { + try { Process.Start("cmd.exe", $"/k cd /d \"{dir}\""); } + catch (Exception ex) { LogService.Warn($"터미널 열기 실패: {ex.Message}"); } + } + break; + } + } + + // ─── 단축키 지원 메서드 ────────────────────────────────────────────────── + + /// 선택된 항목의 경로를 클립보드에 복사 + public bool CopySelectedPath() + { + if (SelectedItem?.Data is IndexEntry entry) + { + var path = Path.GetFileName(Environment.ExpandEnvironmentVariables(entry.Path)); + Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(path)); + return true; + } + return false; + } + + /// 선택된 항목의 전체 경로를 클립보드에 복사 + public bool CopySelectedFullPath() + { + if (SelectedItem?.Data is IndexEntry entry) + { + var path = Environment.ExpandEnvironmentVariables(entry.Path); + Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(path)); + return true; + } + return false; + } + + /// 선택된 항목을 탐색기에서 열기 + public bool OpenSelectedInExplorer() + { + if (SelectedItem?.Data is IndexEntry entry) + { + var path = Environment.ExpandEnvironmentVariables(entry.Path); + if (File.Exists(path)) + Process.Start("explorer.exe", $"/select,\"{path}\""); + else if (Directory.Exists(path)) + Process.Start("explorer.exe", $"\"{path}\""); + return true; + } + return false; + } + + /// 선택된 항목을 관리자 권한으로 실행 + public bool RunSelectedAsAdmin() + { + if (SelectedItem?.Data is IndexEntry entry) + { + var path = Environment.ExpandEnvironmentVariables(entry.Path); + try + { + Process.Start(new ProcessStartInfo(path) + { UseShellExecute = true, Verb = "runas" }); + return true; + } + catch (Exception ex) { LogService.Warn($"관리자 실행 취소: {ex.Message}"); } + } + return false; + } + + /// 선택된 항목의 속성 창 열기 + public bool ShowSelectedProperties() + { + if (SelectedItem?.Data is IndexEntry entry) + { + var path = Environment.ExpandEnvironmentVariables(entry.Path); + try + { + Process.Start(new ProcessStartInfo(path) + { UseShellExecute = true, Verb = "properties" }); + return true; + } + catch (Exception) + { + // properties verb 미지원 시 탐색기에서 선택 + Process.Start("explorer.exe", $"/select,\"{path}\""); + return true; + } + } + return false; + } + + /// 최근 기록에서 항목 삭제 (Delete 키용) + public bool RemoveSelectedFromRecent() + { + if (SelectedItem == null || Results.Count == 0) return false; + + var idx = Results.IndexOf(SelectedItem); + Results.Remove(SelectedItem); + + if (Results.Count > 0) + SelectedItem = Results[Math.Min(idx, Results.Count - 1)]; + else + SelectedItem = null; + + return true; + } + + /// 입력창 초기화 + public void ClearInput() + { + InputText = ""; + } + + /// 첫 번째 결과 항목 선택 + public void SelectFirst() + { + if (Results.Count > 0) SelectedItem = Results[0]; + } + + /// 마지막 결과 항목 선택 + public void SelectLast() + { + if (Results.Count > 0) SelectedItem = Results[^1]; + } + + /// 현재 선택된 파일/폴더 항목을 즐겨찾기에 추가하거나 제거합니다. + /// (추가됐으면 true, 제거됐으면 false, 대상 없으면 null) + public bool? ToggleFavorite() + { + if (SelectedItem?.Data is not IndexEntry entry) return null; + + var path = Environment.ExpandEnvironmentVariables(entry.Path); + var name = Path.GetFileNameWithoutExtension(path); + if (string.IsNullOrWhiteSpace(name)) name = Path.GetFileName(path); + + var favFile = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "favorites.json"); + + try + { + var opts = new System.Text.Json.JsonSerializerOptions + { WriteIndented = true, PropertyNameCaseInsensitive = true }; + + List list = new(); + if (File.Exists(favFile)) + list = System.Text.Json.JsonSerializer.Deserialize>( + File.ReadAllText(favFile), opts) ?? new(); + + var existing = list.FirstOrDefault(f => + f.Path.Equals(path, StringComparison.OrdinalIgnoreCase)); + + if (existing != null) + { + list.Remove(existing); + Directory.CreateDirectory(Path.GetDirectoryName(favFile)!); + File.WriteAllText(favFile, System.Text.Json.JsonSerializer.Serialize(list, opts)); + return false; // 제거됨 + } + else + { + list.Insert(0, new FavJson { Name = name, Path = path }); + Directory.CreateDirectory(Path.GetDirectoryName(favFile)!); + File.WriteAllText(favFile, System.Text.Json.JsonSerializer.Serialize(list, opts)); + return true; // 추가됨 + } + } + catch (Exception ex) + { + LogService.Warn($"즐겨찾기 토글 실패: {ex.Message}"); + return null; + } + } + + /// 선택 항목의 디렉터리에서 터미널을 열기. + /// 성공 여부 + public bool OpenSelectedInTerminal() + { + string dir; + if (SelectedItem?.Data is IndexEntry entry) + { + var path = Environment.ExpandEnvironmentVariables(entry.Path); + dir = Directory.Exists(path) ? path : Path.GetDirectoryName(path) ?? path; + } + else + { + dir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); + } + + try { Process.Start("wt.exe", $"-d \"{dir}\""); return true; } + catch (Exception) + { + try { Process.Start("cmd.exe", $"/k cd /d \"{dir}\""); return true; } + catch (Exception ex) { LogService.Warn($"터미널 열기 실패: {ex.Message}"); return false; } + } + } + + /// 다운로드 폴더를 cd 프리픽스로 탐색합니다. + public void NavigateToDownloads() + { + var downloads = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads"); + InputText = $"cd {downloads}"; + } + + // 즐겨찾기 직렬화용 내부 레코드 + private sealed class FavJson + { + [System.Text.Json.Serialization.JsonPropertyName("name")] + public string Name { get; set; } = ""; + [System.Text.Json.Serialization.JsonPropertyName("path")] + public string Path { get; set; } = ""; + } + + // ─── 클립보드 병합 ──────────────────────────────────────────────────────── + + public void ToggleMergeItem(LauncherItem? item) + { + if (item?.Data is not ClipboardEntry entry || !entry.IsText) return; + + if (!_mergeQueue.Remove(entry)) + _mergeQueue.Add(entry); + + OnPropertyChanged(nameof(MergeCount)); + OnPropertyChanged(nameof(ShowMergeHint)); + OnPropertyChanged(nameof(MergeHintText)); + } + + /// 선택된 항목들을 줄바꿈으로 합쳐 클립보드에 복사 + public void ExecuteMerge() + { + if (_mergeQueue.Count == 0) return; + + // 선택 순서 보존: Results에서 보이는 순서 기준 + var ordered = Results + .Where(r => r.Data is ClipboardEntry e && _mergeQueue.Contains(e)) + .Select(r => ((ClipboardEntry)r.Data!).Text) + .ToList(); + + if (ordered.Count == 0) + ordered = _mergeQueue.Select(e => e.Text).ToList(); + + var merged = string.Join("\n", ordered); + try { Application.Current.Dispatcher.Invoke(() => Clipboard.SetText(merged)); } + catch (Exception ex) { LogService.Warn($"병합 클립보드 실패: {ex.Message}"); } + + ClearMerge(); + CloseRequested?.Invoke(this, EventArgs.Empty); + LogService.Info($"클립보드 병합: {ordered.Count}개 항목"); + } + + public void ClearMerge() + { + _mergeQueue.Clear(); + OnPropertyChanged(nameof(MergeCount)); + OnPropertyChanged(nameof(ShowMergeHint)); + OnPropertyChanged(nameof(MergeHintText)); + } + + // ─── INotifyPropertyChanged ─────────────────────────────────────────────── + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? name = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); +} + +// ─── 파일 액션 데이터 타입 ──────────────────────────────────────────────────── + +public enum FileAction { CopyPath, CopyFullPath, OpenExplorer, RunAsAdmin, OpenTerminal, ShowProperties, Rename, DeleteToRecycleBin } + +public record FileActionData(string Path, FileAction Action); diff --git a/src/AxCopilot/ViewModels/MultiFileDiffViewModel.cs b/src/AxCopilot/ViewModels/MultiFileDiffViewModel.cs new file mode 100644 index 0000000..f4508ee --- /dev/null +++ b/src/AxCopilot/ViewModels/MultiFileDiffViewModel.cs @@ -0,0 +1,134 @@ +using System.Collections.ObjectModel; +using System.ComponentModel; + +namespace AxCopilot.ViewModels; + +/// Phase 17-G: 단일 파일의 diff 정보를 담는 ViewModel. +public class FileDiffViewModel : INotifyPropertyChanged +{ + private string _filePath = ""; + private string _originalContent = ""; + private string _newContent = ""; + private bool _isSelected; + private AxCopilot.Services.Agent.ToolRiskLevel _riskLevel; + + public string FilePath + { + get => _filePath; + set { _filePath = value; OnPropertyChanged(); OnPropertyChanged(nameof(FileName)); } + } + + public string FileName => System.IO.Path.GetFileName(FilePath); + + public string OriginalContent + { + get => _originalContent; + set { _originalContent = value; OnPropertyChanged(); OnPropertyChanged(nameof(DiffSummary)); } + } + + public string NewContent + { + get => _newContent; + set { _newContent = value; OnPropertyChanged(); OnPropertyChanged(nameof(DiffSummary)); } + } + + public bool IsSelected + { + get => _isSelected; + set { _isSelected = value; OnPropertyChanged(); } + } + + public AxCopilot.Services.Agent.ToolRiskLevel RiskLevel + { + get => _riskLevel; + set { _riskLevel = value; OnPropertyChanged(); OnPropertyChanged(nameof(RiskLabel)); } + } + + public string RiskLabel => AxCopilot.Services.Agent.ToolRiskMapper.GetRiskLabel(_riskLevel); + + /// 변경 줄 수 요약. + public string DiffSummary + { + get + { + var origLines = OriginalContent.Split('\n'); + var newLines = NewContent.Split('\n'); + var added = newLines.Length - origLines.Length; + return added >= 0 ? $"+{added}줄" : $"{added}줄"; + } + } + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string? name = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); +} + +/// Phase 17-G: 여러 파일의 diff를 관리하는 ViewModel (AgentDiffPanel용). +public class MultiFileDiffViewModel : INotifyPropertyChanged +{ + public ObservableCollection Files { get; } = new(); + + private FileDiffViewModel? _selectedFile; + public FileDiffViewModel? SelectedFile + { + get => _selectedFile; + set { _selectedFile = value; OnPropertyChanged(); } + } + + private bool _isVisible; + public bool IsVisible + { + get => _isVisible; + set { _isVisible = value; OnPropertyChanged(); } + } + + /// 에이전트 세션 중 파일 변경을 추적하여 추가합니다. + public void TrackFileChange(string filePath, string originalContent, string newContent, string toolName) + { + var existing = Files.FirstOrDefault(f => + string.Equals(f.FilePath, filePath, StringComparison.OrdinalIgnoreCase)); + + if (existing != null) + { + existing.NewContent = newContent; + } + else + { + var vm = new FileDiffViewModel + { + FilePath = filePath, + OriginalContent = originalContent, + NewContent = newContent, + RiskLevel = AxCopilot.Services.Agent.ToolRiskMapper.GetRisk(toolName), + IsSelected = Files.Count == 0 // auto-select first + }; + Files.Add(vm); + if (Files.Count == 1) SelectedFile = vm; + } + + IsVisible = Files.Count > 0; + } + + /// 세션 종료 시 diff 목록을 초기화합니다. + public void Clear() + { + Files.Clear(); + SelectedFile = null; + IsVisible = false; + } + + /// 선택된 파일 변경을 승인합니다 (파일을 실제로 수정하지는 않음 — 이미 적용됨). + public void AcceptSelected() + { + if (SelectedFile != null) + Files.Remove(SelectedFile); + SelectedFile = Files.FirstOrDefault(); + } + + /// 모든 변경 승인. + public void AcceptAll() => Clear(); + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string? name = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); +} diff --git a/src/AxCopilot/ViewModels/PluginGalleryViewModel.cs b/src/AxCopilot/ViewModels/PluginGalleryViewModel.cs new file mode 100644 index 0000000..dc6f04d --- /dev/null +++ b/src/AxCopilot/ViewModels/PluginGalleryViewModel.cs @@ -0,0 +1,155 @@ +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Windows.Input; +using AxCopilot.Services.Agent; + +namespace AxCopilot.ViewModels; + +/// 설치된 플러그인 한 항목의 ViewModel. +public class PluginItemViewModel : INotifyPropertyChanged +{ + private bool _isEnabled; + + public InstalledPlugin Plugin { get; } + + public string Id => Plugin.Manifest.Id; + public string Name => Plugin.Manifest.Name; + public string Version => Plugin.Manifest.Version; + public string Description => Plugin.Manifest.Description; + public string Author => Plugin.Manifest.Author; + public string Type => Plugin.Manifest.Type; + public string InstalledAt => Plugin.InstalledAt.ToLocalTime().ToString("yyyy-MM-dd"); + + public bool IsEnabled + { + get => _isEnabled; + set { _isEnabled = value; OnPropertyChanged(); } + } + + public PluginItemViewModel(InstalledPlugin plugin) + { + Plugin = plugin; + _isEnabled = plugin.IsEnabled; + } + + public event PropertyChangedEventHandler? PropertyChanged; + private void OnPropertyChanged([CallerMemberName] string? name = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); +} + +/// +/// Phase L3-1: 플러그인 갤러리 ViewModel. +/// SettingsWindow 또는 별도 플러그인 관리 화면에서 바인딩합니다. +/// +public class PluginGalleryViewModel : INotifyPropertyChanged +{ + private readonly PluginInstallService _service; + private PluginItemViewModel? _selectedPlugin; + private string _statusMessage = ""; + private bool _isBusy; + + public ObservableCollection Plugins { get; } = new(); + + public PluginItemViewModel? SelectedPlugin + { + get => _selectedPlugin; + set { _selectedPlugin = value; OnPropertyChanged(); OnPropertyChanged(nameof(HasSelection)); } + } + + public bool HasSelection => _selectedPlugin != null; + + public string StatusMessage + { + get => _statusMessage; + private set { _statusMessage = value; OnPropertyChanged(); } + } + + public bool IsBusy + { + get => _isBusy; + private set { _isBusy = value; OnPropertyChanged(); } + } + + // ─── Commands ─────────────────────────────────────────────────────────── + + public ICommand InstallFromZipCommand { get; } + public ICommand UninstallCommand { get; } + public ICommand ToggleEnabledCommand { get; } + public ICommand RefreshCommand { get; } + + public PluginGalleryViewModel(PluginInstallService service) + { + _service = service; + + InstallFromZipCommand = new RelayCommand(async zipPath => + { + if (string.IsNullOrWhiteSpace(zipPath)) return; + IsBusy = true; + StatusMessage = "설치 중…"; + var result = await _service.InstallFromZipAsync(zipPath); + StatusMessage = result.Message; + if (result.Success) Refresh(); + IsBusy = false; + }); + + UninstallCommand = new RelayCommand(async pluginId => + { + if (string.IsNullOrWhiteSpace(pluginId)) return; + IsBusy = true; + StatusMessage = "제거 중…"; + var ok = await _service.UninstallAsync(pluginId); + StatusMessage = ok ? "제거 완료." : "제거 실패."; + if (ok) Refresh(); + IsBusy = false; + }); + + ToggleEnabledCommand = new RelayCommand(async item => + { + if (item == null) return; + await _service.SetEnabledAsync(item.Id, item.IsEnabled); + StatusMessage = $"'{item.Name}' {(item.IsEnabled ? "활성화" : "비활성화")} 완료."; + }); + + RefreshCommand = new RelayCommand(_ => { Refresh(); return Task.CompletedTask; })!; + + Refresh(); + } + + /// 서비스에서 설치 목록을 다시 로드합니다. + public void Refresh() + { + Plugins.Clear(); + foreach (var p in _service.Installed) + Plugins.Add(new PluginItemViewModel(p)); + StatusMessage = Plugins.Count == 0 ? "설치된 플러그인이 없습니다." : $"{Plugins.Count}개 설치됨"; + } + + public event PropertyChangedEventHandler? PropertyChanged; + private void OnPropertyChanged([CallerMemberName] string? name = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); +} + +// ─── 간단한 RelayCommand 구현 (WPF MVVM) ──────────────────────────────────── + +file sealed class RelayCommand : ICommand +{ + private readonly Func _execute; + private bool _running; + + public RelayCommand(Func execute) => _execute = execute; + + public event EventHandler? CanExecuteChanged; + public bool CanExecute(object? _) => !_running; + public async void Execute(object? parameter) + { + _running = true; + CanExecuteChanged?.Invoke(this, EventArgs.Empty); + try { await _execute(parameter is T t ? t : default); } + finally + { + _running = false; + CanExecuteChanged?.Invoke(this, EventArgs.Empty); + } + } +} diff --git a/src/AxCopilot/ViewModels/ReplayTimelineViewModel.cs b/src/AxCopilot/ViewModels/ReplayTimelineViewModel.cs new file mode 100644 index 0000000..1f99188 --- /dev/null +++ b/src/AxCopilot/ViewModels/ReplayTimelineViewModel.cs @@ -0,0 +1,153 @@ +using System.Collections.ObjectModel; +using System.ComponentModel; +using AxCopilot.Services.Agent; + +namespace AxCopilot.ViewModels; + +/// Phase 18-B: 에이전트 이벤트 타임라인 재생 ViewModel. +public class ReplayTimelineViewModel : INotifyPropertyChanged +{ + private readonly AgentReplayService _replayService; + private CancellationTokenSource? _replayCts; + + public ObservableCollection Events { get; } = new(); + public ObservableCollection Sessions { get; } = new(); + + private ReplaySessionInfo? _selectedSession; + public ReplaySessionInfo? SelectedSession + { + get => _selectedSession; + set { _selectedSession = value; OnPropertyChanged(); OnPropertyChanged(nameof(CanReplay)); } + } + + private bool _isReplaying; + public bool IsReplaying + { + get => _isReplaying; + set { _isReplaying = value; OnPropertyChanged(); OnPropertyChanged(nameof(CanReplay)); } + } + + public bool CanReplay => SelectedSession != null && !IsReplaying; + + private int _replaySpeedMs = 200; + public int ReplaySpeedMs + { + get => _replaySpeedMs; + set { _replaySpeedMs = Math.Max(0, value); OnPropertyChanged(); } + } + + private int _progressValue; + public int ProgressValue + { + get => _progressValue; + set { _progressValue = value; OnPropertyChanged(); } + } + + private int _progressMax = 100; + public int ProgressMax + { + get => _progressMax; + set { _progressMax = value; OnPropertyChanged(); } + } + + public ReplayTimelineViewModel() + { + _replayService = new AgentReplayService(); + } + + public void LoadSessions() + { + Sessions.Clear(); + foreach (var s in _replayService.GetSessions()) + Sessions.Add(s); + if (Sessions.Count > 0) + SelectedSession = Sessions[0]; + } + + public async Task StartReplayAsync() + { + if (SelectedSession == null || IsReplaying) return; + + Events.Clear(); + IsReplaying = true; + ProgressValue = 0; + _replayCts = new CancellationTokenSource(); + + try + { + // 전체 이벤트 수 먼저 파악 + var allEvents = await _replayService.LoadAllEventsAsync( + SelectedSession.SessionId, _replayCts.Token); + ProgressMax = Math.Max(1, allEvents.Count); + + int i = 0; + await _replayService.ReplayAsync( + SelectedSession.SessionId, + async record => + { + var item = new ReplayEventItem(record); + // Dispatcher needed — raise event for UI thread + ReplayEventReceived?.Invoke(item); + i++; + ProgressValue = i; + await Task.CompletedTask; + }, + ReplaySpeedMs, + _replayCts.Token); + } + catch (OperationCanceledException) { } + finally + { + IsReplaying = false; + _replayCts?.Dispose(); + _replayCts = null; + } + } + + public void StopReplay() + { + _replayCts?.Cancel(); + } + + /// UI 스레드에서 이벤트 항목을 추가하기 위한 이벤트. + public event Action? ReplayEventReceived; + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string? name = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); +} + +/// 타임라인에 표시할 단일 이벤트 항목. +public class ReplayEventItem +{ + public AgentEventRecord Record { get; } + public string TypeLabel { get; } + public string Icon { get; } + public string TimeLabel { get; } + + public ReplayEventItem(AgentEventRecord record) + { + Record = record; + TimeLabel = record.Timestamp.ToString("HH:mm:ss"); + (TypeLabel, Icon) = record.Type switch + { + AgentEventLogType.SessionStart => ("세션 시작", "\uE768"), + AgentEventLogType.SessionEnd => ("세션 종료", "\uE711"), + AgentEventLogType.UserMessage => ("사용자 메시지", "\uE8BD"), + AgentEventLogType.AssistantMessage => ("AI 응답", "\uE8D4"), + AgentEventLogType.ToolRequest => ("도구 요청", "\uE756"), + AgentEventLogType.ToolResult => ("도구 결과", "\uE73E"), + AgentEventLogType.HookFired => ("훅 실행", "\uE81C"), + AgentEventLogType.HookResult => ("훅 결과", "\uE73E"), + AgentEventLogType.SkillActivated => ("스킬 활성화", "\uE82D"), + AgentEventLogType.SkillCompleted => ("스킬 완료", "\uE930"), + AgentEventLogType.CompactionTriggered => ("컨텍스트 압축", "\uE8EC"), + AgentEventLogType.CompactionCompleted => ("압축 완료", "\uE930"), + AgentEventLogType.SubagentSpawned => ("서브에이전트 생성", "\uE718"), + AgentEventLogType.SubagentCompleted => ("서브에이전트 완료", "\uE930"), + AgentEventLogType.ReflexionSaved => ("반성 저장", "\uE90F"), + AgentEventLogType.Error => ("오류", "\uE783"), + _ => (record.Type.ToString(), "\uE946") + }; + } +} diff --git a/src/AxCopilot/ViewModels/SettingsViewModel.cs b/src/AxCopilot/ViewModels/SettingsViewModel.cs new file mode 100644 index 0000000..49b8924 --- /dev/null +++ b/src/AxCopilot/ViewModels/SettingsViewModel.cs @@ -0,0 +1,1855 @@ +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Windows.Forms; +using System.Windows.Media; +using AxCopilot.Models; +using AxCopilot.Services; +using AxCopilot.Themes; +using AxCopilot.Views; + +namespace AxCopilot.ViewModels; + +/// +/// 설정 카드에 표시할 테마 미리보기 데이터 +/// +public class ThemeCardModel : INotifyPropertyChanged +{ + private bool _isSelected; + + public string Key { get; init; } = ""; // settings.json 값 (dark, light, ...) + public string Name { get; init; } = ""; // 표시 이름 + + // 미리보기용 색상 + public string PreviewBackground { get; init; } = "#1A1B2E"; + public string PreviewText { get; init; } = "#F0F0FF"; + public string PreviewSubText { get; init; } = "#7A7D9C"; + public string PreviewAccent { get; init; } = "#4B5EFC"; + public string PreviewItem { get; init; } = "#252637"; + public string PreviewBorder { get; init; } = "#2E2F4A"; + + public bool IsSelected + { + get => _isSelected; + set { _isSelected = value; OnPropertyChanged(); } + } + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); +} + +/// +/// 커스텀 테마 단일 색상 항목 (색상 편집 탭 1행 1색) +/// +public class ColorRowModel : INotifyPropertyChanged +{ + private string _hex; + + public string Label { get; init; } = ""; + public string Property { get; init; } = ""; // CustomThemeColors의 속성명 + + public string Hex + { + get => _hex; + set { _hex = value; OnPropertyChanged(); OnPropertyChanged(nameof(Preview)); } + } + + public SolidColorBrush Preview + { + get + { + try { return ThemeResourceHelper.HexBrush(Hex); } + catch (Exception) { return new SolidColorBrush(Colors.Transparent); } + } + } + + public ColorRowModel(string label, string property, string hex) + { + Label = label; + Property = property; + _hex = hex; + } + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); +} + +/// +/// 빠른 실행 단축키 항목 (키워드 → 앱/URL/폴더) +/// +public class AppShortcutModel : INotifyPropertyChanged +{ + private string _key = ""; + private string _description = ""; + private string _target = ""; + private string _type = "app"; + + public string Key { get => _key; set { _key = value; OnPropertyChanged(); } } + public string Description { get => _description; set { _description = value; OnPropertyChanged(); } } + public string Target { get => _target; set { _target = value; OnPropertyChanged(); } } + public string Type { get => _type; set { _type = value; OnPropertyChanged(); OnPropertyChanged(nameof(TypeSymbol)); OnPropertyChanged(nameof(TypeLabel)); } } + + public string TypeSymbol => Type switch + { + "url" => Symbols.Globe, + "folder" => Symbols.Folder, + _ => Symbols.App + }; + + public string TypeLabel => Type switch + { + "url" => "URL", + "folder" => "폴더", + _ => "앱" + }; + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); +} + +/// +/// 배치 명령 항목 (> 프리픽스) +/// +public class BatchCommandModel : INotifyPropertyChanged +{ + private string _key = ""; + private string _command = ""; + private bool _showWindow; + + public string Key { get => _key; set { _key = value; OnPropertyChanged(); } } + public string Command { get => _command; set { _command = value; OnPropertyChanged(); } } + public bool ShowWindow { get => _showWindow; set { _showWindow = value; OnPropertyChanged(); } } + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); +} + +public class SettingsViewModel : INotifyPropertyChanged +{ + private readonly SettingsService _service; + internal SettingsService Service => _service; + + /// CodeSettings 바인딩용 프로퍼티. XAML에서 {Binding Code.EnableLsp} 등으로 접근. + public Models.CodeSettings Code => _service.Settings.Llm.Code; + + // ─── 작업 복사본 ─────────────────────────────────────────────────────── + private string _hotkey; + private int _maxResults; + private double _opacity; + private string _selectedThemeKey; + private string _launcherPosition; + private string _webSearchEngine; + private bool _snippetAutoExpand; + private string _language; + private string _indexSpeed; + + // 기능 토글 + private bool _showNumberBadges; + private bool _enableFavorites; + private bool _enableRecent; + private bool _enableActionMode; + private bool _closeOnFocusLost; + private bool _showPrefixBadge; + private bool _enableIconAnimation; + private bool _enableRainbowGlow; + private bool _enableSelectionGlow; + private bool _enableRandomPlaceholder; + private bool _showLauncherBorder; + private bool _shortcutHelpUseThemeColor; + + // LLM 공통 설정 + private string _llmService; + private bool _llmStreaming; + private int _llmMaxContextTokens; + private int _llmRetentionDays; + private double _llmTemperature; + + // 서비스별 독립 설정 + private string _ollamaEndpoint = "http://localhost:11434"; + private string _ollamaApiKey = ""; + private string _ollamaModel = ""; + private string _vllmEndpoint = ""; + private string _vllmApiKey = ""; + private string _vllmModel = ""; + private string _geminiApiKey = ""; + private string _geminiModel = "gemini-2.5-flash"; + private string _claudeApiKey = ""; + private string _claudeModel = "claude-sonnet-4-6"; + + // 등록 모델 목록 + public ObservableCollection RegisteredModels { get; } = new(); + + public string LlmService + { + get => _llmService; + set { _llmService = value; OnPropertyChanged(); OnPropertyChanged(nameof(IsInternalService)); OnPropertyChanged(nameof(IsExternalService)); OnPropertyChanged(nameof(NeedsEndpoint)); OnPropertyChanged(nameof(NeedsApiKey)); OnPropertyChanged(nameof(IsGeminiSelected)); OnPropertyChanged(nameof(IsClaudeSelected)); } + } + public bool IsInternalService => _llmService is "ollama" or "vllm"; + public bool IsExternalService => _llmService is "gemini" or "claude"; + public bool NeedsEndpoint => _llmService is "ollama" or "vllm"; + public bool NeedsApiKey => _llmService is not "ollama"; + public bool IsGeminiSelected => _llmService == "gemini"; + public bool IsClaudeSelected => _llmService == "claude"; + + // ── Ollama 설정 ── + public string OllamaEndpoint { get => _ollamaEndpoint; set { _ollamaEndpoint = value; OnPropertyChanged(); } } + public string OllamaApiKey { get => _ollamaApiKey; set { _ollamaApiKey = value; OnPropertyChanged(); } } + public string OllamaModel { get => _ollamaModel; set { _ollamaModel = value; OnPropertyChanged(); } } + + // ── vLLM 설정 ── + public string VllmEndpoint { get => _vllmEndpoint; set { _vllmEndpoint = value; OnPropertyChanged(); } } + public string VllmApiKey { get => _vllmApiKey; set { _vllmApiKey = value; OnPropertyChanged(); } } + public string VllmModel { get => _vllmModel; set { _vllmModel = value; OnPropertyChanged(); } } + + // ── Gemini 설정 ── + public string GeminiApiKey { get => _geminiApiKey; set { _geminiApiKey = value; OnPropertyChanged(); } } + public string GeminiModel { get => _geminiModel; set { _geminiModel = value; OnPropertyChanged(); } } + + // ── Claude 설정 ── + public string ClaudeApiKey { get => _claudeApiKey; set { _claudeApiKey = value; OnPropertyChanged(); } } + public string ClaudeModel { get => _claudeModel; set { _claudeModel = value; OnPropertyChanged(); } } + + // ── 공통 응답 설정 ── + public bool LlmStreaming + { + get => _llmStreaming; + set { _llmStreaming = value; OnPropertyChanged(); } + } + public int LlmMaxContextTokens + { + get => _llmMaxContextTokens; + set { _llmMaxContextTokens = value; OnPropertyChanged(); } + } + public int LlmRetentionDays + { + get => _llmRetentionDays; + set { _llmRetentionDays = value; OnPropertyChanged(); } + } + public double LlmTemperature + { + get => _llmTemperature; + set { _llmTemperature = Math.Round(Math.Clamp(value, 0.0, 2.0), 1); OnPropertyChanged(); } + } + + // 에이전트 기본 파일 접근 권한 + private string _defaultAgentPermission; + public string DefaultAgentPermission + { + get => _defaultAgentPermission; + set { _defaultAgentPermission = value; OnPropertyChanged(); } + } + + // ── 코워크/에이전트 고급 설정 ── + private string _defaultOutputFormat; + public string DefaultOutputFormat + { + get => _defaultOutputFormat; + set { _defaultOutputFormat = value; OnPropertyChanged(); } + } + + private string _autoPreview; + public string AutoPreview + { + get => _autoPreview; + set { _autoPreview = value; OnPropertyChanged(); } + } + + private int _maxAgentIterations; + public int MaxAgentIterations + { + get => _maxAgentIterations; + set { _maxAgentIterations = Math.Clamp(value, 1, 100); OnPropertyChanged(); } + } + + private int _maxRetryOnError; + public int MaxRetryOnError + { + get => _maxRetryOnError; + set { _maxRetryOnError = Math.Clamp(value, 0, 10); OnPropertyChanged(); } + } + + private string _agentLogLevel; + public string AgentLogLevel + { + get => _agentLogLevel; + set { _agentLogLevel = value; OnPropertyChanged(); } + } + + private string _agentDecisionLevel = "detailed"; + public string AgentDecisionLevel + { + get => _agentDecisionLevel; + set { _agentDecisionLevel = value; OnPropertyChanged(); } + } + + private string _planMode = "off"; + public string PlanMode + { + get => _planMode; + set { _planMode = value; OnPropertyChanged(); } + } + + private bool _enableMultiPassDocument; + public bool EnableMultiPassDocument + { + get => _enableMultiPassDocument; + set { _enableMultiPassDocument = value; OnPropertyChanged(); } + } + + private bool _enableCoworkVerification; + public bool EnableCoworkVerification + { + get => _enableCoworkVerification; + set { _enableCoworkVerification = value; OnPropertyChanged(); } + } + + private bool _enableFilePathHighlight = true; + public bool EnableFilePathHighlight + { + get => _enableFilePathHighlight; + set { _enableFilePathHighlight = value; OnPropertyChanged(); } + } + + private string _folderDataUsage; + public string FolderDataUsage + { + get => _folderDataUsage; + set { _folderDataUsage = value; OnPropertyChanged(); } + } + + // ── 모델 폴백 + 보안 + MCP ── + private bool _enableAuditLog; + public bool EnableAuditLog + { + get => _enableAuditLog; + set { _enableAuditLog = value; OnPropertyChanged(); } + } + + private bool _enableAgentMemory; + public bool EnableAgentMemory + { + get => _enableAgentMemory; + set { _enableAgentMemory = value; OnPropertyChanged(); } + } + + private bool _enableProjectRules = true; + public bool EnableProjectRules + { + get => _enableProjectRules; + set { _enableProjectRules = value; OnPropertyChanged(); } + } + + private int _maxMemoryEntries; + public int MaxMemoryEntries + { + get => _maxMemoryEntries; + set { _maxMemoryEntries = value; OnPropertyChanged(); } + } + + // ── 이미지 입력 (멀티모달) ── + private bool _enableImageInput = true; + public bool EnableImageInput + { + get => _enableImageInput; + set { _enableImageInput = value; OnPropertyChanged(); } + } + + private int _maxImageSizeKb = 5120; + public int MaxImageSizeKb + { + get => _maxImageSizeKb; + set { _maxImageSizeKb = value; OnPropertyChanged(); } + } + + // ── 자동 모델 라우팅 ── + private bool _enableAutoRouter; + public bool EnableAutoRouter + { + get => _enableAutoRouter; + set { _enableAutoRouter = value; OnPropertyChanged(); } + } + + private double _autoRouterConfidence = 0.7; + public double AutoRouterConfidence + { + get => _autoRouterConfidence; + set { _autoRouterConfidence = value; OnPropertyChanged(); } + } + + // ── 에이전트 훅 시스템 ── + private bool _enableToolHooks = true; + public bool EnableToolHooks + { + get => _enableToolHooks; + set { _enableToolHooks = value; OnPropertyChanged(); } + } + + private int _toolHookTimeoutMs = 10000; + public int ToolHookTimeoutMs + { + get => _toolHookTimeoutMs; + set { _toolHookTimeoutMs = value; OnPropertyChanged(); } + } + + // ── 스킬 시스템 ── + private bool _enableSkillSystem = true; + public bool EnableSkillSystem + { + get => _enableSkillSystem; + set { _enableSkillSystem = value; OnPropertyChanged(); } + } + + private string _skillsFolderPath = ""; + public string SkillsFolderPath + { + get => _skillsFolderPath; + set { _skillsFolderPath = value; OnPropertyChanged(); } + } + + private int _slashPopupPageSize = 6; + public int SlashPopupPageSize + { + get => _slashPopupPageSize; + set { _slashPopupPageSize = Math.Clamp(value, 3, 10); OnPropertyChanged(); } + } + + // ── 드래그&드롭 AI ── + private bool _enableDragDropAiActions = true; + public bool EnableDragDropAiActions + { + get => _enableDragDropAiActions; + set { _enableDragDropAiActions = value; OnPropertyChanged(); } + } + + private bool _dragDropAutoSend; + public bool DragDropAutoSend + { + get => _dragDropAutoSend; + set { _dragDropAutoSend = value; OnPropertyChanged(); } + } + + // ── 코드 리뷰 ── + private bool _enableCodeReview = true; + public bool EnableCodeReview + { + get => _enableCodeReview; + set { _enableCodeReview = value; OnPropertyChanged(); } + } + + // ── 시각 효과 + 알림 + 개발자 모드 (공통) ── + private bool _enableChatRainbowGlow; + public bool EnableChatRainbowGlow + { + get => _enableChatRainbowGlow; + set { _enableChatRainbowGlow = value; OnPropertyChanged(); } + } + + private bool _notifyOnComplete; + public bool NotifyOnComplete + { + get => _notifyOnComplete; + set { _notifyOnComplete = value; OnPropertyChanged(); } + } + + private bool _showTips; + public bool ShowTips + { + get => _showTips; + set { _showTips = value; OnPropertyChanged(); } + } + + private bool _devMode; + public bool DevMode + { + get => _devMode; + set { _devMode = value; OnPropertyChanged(); } + } + + private bool _devModeStepApproval; + public bool DevModeStepApproval + { + get => _devModeStepApproval; + set { _devModeStepApproval = value; OnPropertyChanged(); } + } + + private bool _workflowVisualizer; + public bool WorkflowVisualizer + { + get => _workflowVisualizer; + set { _workflowVisualizer = value; OnPropertyChanged(); } + } + + private bool _freeTierMode; + public bool FreeTierMode + { + get => _freeTierMode; + set { _freeTierMode = value; OnPropertyChanged(); } + } + + private int _freeTierDelaySeconds = 4; + public int FreeTierDelaySeconds + { + get => _freeTierDelaySeconds; + set { _freeTierDelaySeconds = value; OnPropertyChanged(); } + } + + private bool _showTotalCallStats; + public bool ShowTotalCallStats + { + get => _showTotalCallStats; + set { _showTotalCallStats = value; OnPropertyChanged(); } + } + + private string _defaultMood = "modern"; + public string DefaultMood + { + get => _defaultMood; + set { _defaultMood = value; OnPropertyChanged(); } + } + + // 차단 경로/확장자 (읽기 전용 UI) + public ObservableCollection BlockedPaths { get; } = new(); + public ObservableCollection BlockedExtensions { get; } = new(); + + public string Hotkey + { + get => _hotkey; + set { _hotkey = value; OnPropertyChanged(); } + } + + public int MaxResults + { + get => _maxResults; + set { _maxResults = value; OnPropertyChanged(); } + } + + public double Opacity + { + get => _opacity; + set { _opacity = value; OnPropertyChanged(); OnPropertyChanged(nameof(OpacityPercent)); } + } + + public int OpacityPercent => (int)Math.Round(_opacity * 100); + + public string SelectedThemeKey + { + get => _selectedThemeKey; + set + { + _selectedThemeKey = value; + OnPropertyChanged(); + OnPropertyChanged(nameof(IsCustomTheme)); + foreach (var card in ThemeCards) + card.IsSelected = card.Key == value; + } + } + + public bool IsCustomTheme => _selectedThemeKey == "custom"; + + public string LauncherPosition + { + get => _launcherPosition; + set { _launcherPosition = value; OnPropertyChanged(); } + } + + public string WebSearchEngine + { + get => _webSearchEngine; + set { _webSearchEngine = value; OnPropertyChanged(); } + } + + public bool SnippetAutoExpand + { + get => _snippetAutoExpand; + set { _snippetAutoExpand = value; OnPropertyChanged(); } + } + + public string Language + { + get => _language; + set { _language = value; OnPropertyChanged(); } + } + + public string IndexSpeed + { + get => _indexSpeed; + set { _indexSpeed = value; OnPropertyChanged(); OnPropertyChanged(nameof(IndexSpeedHint)); } + } + + public string IndexSpeedHint => _indexSpeed switch + { + "fast" => "CPU 사용률이 높아질 수 있습니다. 고성능 PC에 권장합니다.", + "slow" => "인덱싱이 오래 걸리지만 PC 성능에 영향을 주지 않습니다.", + _ => "일반적인 PC에 적합한 균형 설정입니다.", + }; + + // ─── 기능 토글 속성 ─────────────────────────────────────────────────── + + public bool ShowNumberBadges + { + get => _showNumberBadges; + set { _showNumberBadges = value; OnPropertyChanged(); } + } + + public bool EnableFavorites + { + get => _enableFavorites; + set { _enableFavorites = value; OnPropertyChanged(); } + } + + public bool EnableRecent + { + get => _enableRecent; + set { _enableRecent = value; OnPropertyChanged(); } + } + + public bool EnableActionMode + { + get => _enableActionMode; + set { _enableActionMode = value; OnPropertyChanged(); } + } + + public bool CloseOnFocusLost + { + get => _closeOnFocusLost; + set { _closeOnFocusLost = value; OnPropertyChanged(); } + } + + public bool ShowPrefixBadge + { + get => _showPrefixBadge; + set { _showPrefixBadge = value; OnPropertyChanged(); } + } + + public bool EnableIconAnimation + { + get => _enableIconAnimation; + set { _enableIconAnimation = value; OnPropertyChanged(); } + } + + public bool EnableRainbowGlow + { + get => _enableRainbowGlow; + set { _enableRainbowGlow = value; OnPropertyChanged(); } + } + + public bool EnableSelectionGlow + { + get => _enableSelectionGlow; + set { _enableSelectionGlow = value; OnPropertyChanged(); } + } + + public bool EnableRandomPlaceholder + { + get => _enableRandomPlaceholder; + set { _enableRandomPlaceholder = value; OnPropertyChanged(); } + } + + public bool ShowLauncherBorder + { + get => _showLauncherBorder; + set { _showLauncherBorder = value; OnPropertyChanged(); } + } + + // ─── v1.4.0 신기능 설정 ────────────────────────────────────────────────── + + private bool _enableTextAction = true; + public bool EnableTextAction + { + get => _enableTextAction; + set { _enableTextAction = value; OnPropertyChanged(); } + } + + private bool _enableFileDialogIntegration = false; + public bool EnableFileDialogIntegration + { + get => _enableFileDialogIntegration; + set { _enableFileDialogIntegration = value; OnPropertyChanged(); } + } + + private bool _enableClipboardAutoCategory = true; + public bool EnableClipboardAutoCategory + { + get => _enableClipboardAutoCategory; + set { _enableClipboardAutoCategory = value; OnPropertyChanged(); } + } + + private int _maxPinnedClipboardItems = 20; + public int MaxPinnedClipboardItems + { + get => _maxPinnedClipboardItems; + set { _maxPinnedClipboardItems = value; OnPropertyChanged(); } + } + + private string _textActionTranslateLanguage = "auto"; + public string TextActionTranslateLanguage + { + get => _textActionTranslateLanguage; + set { _textActionTranslateLanguage = value; OnPropertyChanged(); } + } + + private int _maxSubAgents = 3; + public int MaxSubAgents + { + get => _maxSubAgents; + set { _maxSubAgents = value; OnPropertyChanged(); } + } + + private string _pdfExportPath = ""; + public string PdfExportPath + { + get => _pdfExportPath; + set { _pdfExportPath = value; OnPropertyChanged(); } + } + + private int _tipDurationSeconds = 5; + public int TipDurationSeconds + { + get => _tipDurationSeconds; + set { _tipDurationSeconds = value; OnPropertyChanged(); } + } + + public bool ShortcutHelpUseThemeColor + { + get => _shortcutHelpUseThemeColor; + set { _shortcutHelpUseThemeColor = value; OnPropertyChanged(); } + } + + // ─── 테마 카드 목록 ─────────────────────────────────────────────────── + public List ThemeCards { get; } = new() + { + new() + { + Key = "system", Name = "시스템", + PreviewBackground = "#1E1E1E", PreviewText = "#FFFFFF", + PreviewSubText = "#888888", PreviewAccent = "#0078D4", + PreviewItem = "#2D2D2D", PreviewBorder = "#3D3D3D" + }, + new() + { + Key = "dark", Name = "Dark", + PreviewBackground = "#1A1B2E", PreviewText = "#F0F0FF", + PreviewSubText = "#7A7D9C", PreviewAccent = "#4B5EFC", + PreviewItem = "#252637", PreviewBorder = "#2E2F4A" + }, + new() + { + Key = "light", Name = "Light", + PreviewBackground = "#FAFAFA", PreviewText = "#1A1B2E", + PreviewSubText = "#666680", PreviewAccent = "#4B5EFC", + PreviewItem = "#F0F0F8", PreviewBorder = "#E0E0F0" + }, + new() + { + Key = "oled", Name = "OLED", + PreviewBackground = "#000000", PreviewText = "#FFFFFF", + PreviewSubText = "#888899", PreviewAccent = "#5C6EFF", + PreviewItem = "#0A0A14", PreviewBorder = "#1A1A2E" + }, + new() + { + Key = "nord", Name = "Nord", + PreviewBackground = "#2E3440", PreviewText = "#ECEFF4", + PreviewSubText = "#D8DEE9", PreviewAccent = "#88C0D0", + PreviewItem = "#3B4252", PreviewBorder = "#434C5E" + }, + new() + { + Key = "monokai", Name = "Monokai", + PreviewBackground = "#272822", PreviewText = "#F8F8F2", + PreviewSubText = "#75715E", PreviewAccent = "#A6E22E", + PreviewItem = "#3E3D32", PreviewBorder = "#49483E" + }, + new() + { + Key = "catppuccin", Name = "Catppuccin", + PreviewBackground = "#1E1E2E", PreviewText = "#CDD6F4", + PreviewSubText = "#A6ADC8", PreviewAccent = "#CBA6F7", + PreviewItem = "#313244", PreviewBorder = "#45475A" + }, + new() + { + Key = "sepia", Name = "Sepia", + PreviewBackground = "#F5EFE0", PreviewText = "#3C2F1A", + PreviewSubText = "#7A6040", PreviewAccent = "#C0822A", + PreviewItem = "#EDE6D6", PreviewBorder = "#D8CCBA" + }, + new() + { + Key = "alfred", Name = "Indigo", + PreviewBackground = "#26273B", PreviewText = "#EEEEFF", + PreviewSubText = "#8888BB", PreviewAccent = "#8877EE", + PreviewItem = "#3B3D60", PreviewBorder = "#40416A" + }, + new() + { + Key = "alfredlight", Name = "Frost", + PreviewBackground = "#FFFFFF", PreviewText = "#1A1A2E", + PreviewSubText = "#9090AA", PreviewAccent = "#5555EE", + PreviewItem = "#E8E9FF", PreviewBorder = "#DCDCEE" + }, + new() + { + Key = "codex", Name = "Codex", + PreviewBackground = "#FFFFFF", PreviewText = "#111111", + PreviewSubText = "#6B7280", PreviewAccent = "#7C3AED", + PreviewItem = "#F5F5F7", PreviewBorder = "#E5E7EB" + }, + new() + { + Key = "custom", Name = "커스텀", + PreviewBackground = "#1A1B2E", PreviewText = "#F0F0FF", + PreviewSubText = "#7A7D9C", PreviewAccent = "#4B5EFC", + PreviewItem = "#252637", PreviewBorder = "#2E2F4A" + }, + }; + + // ─── 커스텀 색상 행 목록 ────────────────────────────────────────────── + public List ColorRows { get; } + + // ─── 프롬프트 템플릿 ────────────────────────────────────────────────── + public ObservableCollection PromptTemplates { get; } = new(); + + // ─── 배치 명령 ──────────────────────────────────────────────────────── + public ObservableCollection BatchCommands { get; } = new(); + + private string _newBatchKey = ""; + private string _newBatchCommand = ""; + private bool _newBatchShowWindow; + + public string NewBatchKey + { + get => _newBatchKey; + set { _newBatchKey = value; OnPropertyChanged(); } + } + public string NewBatchCommand + { + get => _newBatchCommand; + set { _newBatchCommand = value; OnPropertyChanged(); } + } + public bool NewBatchShowWindow + { + get => _newBatchShowWindow; + set { _newBatchShowWindow = value; OnPropertyChanged(); } + } + + public bool AddBatchCommand() + { + if (string.IsNullOrWhiteSpace(_newBatchKey) || string.IsNullOrWhiteSpace(_newBatchCommand)) + return false; + if (BatchCommands.Any(b => b.Key.Equals(_newBatchKey.Trim(), StringComparison.OrdinalIgnoreCase))) + return false; + + BatchCommands.Add(new BatchCommandModel + { + Key = _newBatchKey.Trim(), + Command = _newBatchCommand.Trim(), + ShowWindow = _newBatchShowWindow + }); + NewBatchKey = ""; NewBatchCommand = ""; NewBatchShowWindow = false; + return true; + } + + public void RemoveBatchCommand(BatchCommandModel cmd) => BatchCommands.Remove(cmd); + + // ─── 빠른 실행 단축키 ───────────────────────────────────────────────── + public ObservableCollection AppShortcuts { get; } = new(); + + private string _newKey = ""; + private string _newDescription = ""; + private string _newTarget = ""; + private string _newType = "app"; + + public string NewKey { get => _newKey; set { _newKey = value; OnPropertyChanged(); } } + public string NewDescription { get => _newDescription; set { _newDescription = value; OnPropertyChanged(); } } + public string NewTarget { get => _newTarget; set { _newTarget = value; OnPropertyChanged(); } } + public string NewType { get => _newType; set { _newType = value; OnPropertyChanged(); } } + + // ─── 이벤트 ─────────────────────────────────────────────────────────── + public event EventHandler? ThemePreviewRequested; + public event EventHandler? SaveCompleted; + + public SettingsViewModel(SettingsService service) + { + _service = service; + var s = service.Settings; + + _hotkey = s.Hotkey; + _maxResults = s.Launcher.MaxResults; + _opacity = s.Launcher.Opacity; + _selectedThemeKey = (s.Launcher.Theme ?? "system").ToLowerInvariant(); + _launcherPosition = s.Launcher.Position; + _webSearchEngine = s.Launcher.WebSearchEngine; + _snippetAutoExpand = s.Launcher.SnippetAutoExpand; + _language = s.Launcher.Language; + _indexSpeed = s.IndexSpeed ?? "normal"; + + // 기능 토글 로드 + _showNumberBadges = s.Launcher.ShowNumberBadges; + _enableFavorites = s.Launcher.EnableFavorites; + _enableRecent = s.Launcher.EnableRecent; + _enableActionMode = s.Launcher.EnableActionMode; + _closeOnFocusLost = s.Launcher.CloseOnFocusLost; + _showPrefixBadge = s.Launcher.ShowPrefixBadge; + _enableIconAnimation = s.Launcher.EnableIconAnimation; + _enableRainbowGlow = s.Launcher.EnableRainbowGlow; + _enableSelectionGlow = s.Launcher.EnableSelectionGlow; + _enableRandomPlaceholder = s.Launcher.EnableRandomPlaceholder; + _showLauncherBorder = s.Launcher.ShowLauncherBorder; + _shortcutHelpUseThemeColor = s.Launcher.ShortcutHelpUseThemeColor; + _enableTextAction = s.Launcher.EnableTextAction; + // v1.7.1: 파일 대화상자 통합 기본값을 false로 변경 (브라우저 업로드 오작동 방지) + // 기존 저장값이 true이면 false로 재설정 + _enableFileDialogIntegration = false; + s.Launcher.EnableFileDialogIntegration = false; + _enableClipboardAutoCategory = s.Launcher.EnableClipboardAutoCategory; + _maxPinnedClipboardItems = s.Launcher.MaxPinnedClipboardItems; + _textActionTranslateLanguage = s.Launcher.TextActionTranslateLanguage; + _maxSubAgents = s.Llm.MaxSubAgents; + _pdfExportPath = s.Llm.PdfExportPath; + _tipDurationSeconds = s.Llm.TipDurationSeconds; + + // LLM 설정 로드 + var llm = s.Llm; + _llmService = llm.Service; + _llmStreaming = llm.Streaming; + _llmMaxContextTokens = llm.MaxContextTokens; + _llmRetentionDays = llm.RetentionDays; + _llmTemperature = llm.Temperature; + _defaultAgentPermission = llm.DefaultAgentPermission; + _defaultOutputFormat = llm.DefaultOutputFormat; + _defaultMood = string.IsNullOrEmpty(llm.DefaultMood) ? "modern" : llm.DefaultMood; + _autoPreview = llm.AutoPreview; + _maxAgentIterations = llm.MaxAgentIterations > 0 ? llm.MaxAgentIterations : 25; + _maxRetryOnError = llm.MaxRetryOnError > 0 ? llm.MaxRetryOnError : 3; + _agentLogLevel = llm.AgentLogLevel; + _agentDecisionLevel = llm.AgentDecisionLevel; + _planMode = string.IsNullOrEmpty(llm.PlanMode) ? "off" : llm.PlanMode; + _enableMultiPassDocument = llm.EnableMultiPassDocument; + _enableCoworkVerification = llm.EnableCoworkVerification; + _enableFilePathHighlight = llm.EnableFilePathHighlight; + _folderDataUsage = string.IsNullOrEmpty(llm.FolderDataUsage) ? "active" : llm.FolderDataUsage; + _enableAuditLog = llm.EnableAuditLog; + _enableAgentMemory = llm.EnableAgentMemory; + _enableProjectRules = llm.EnableProjectRules; + _maxMemoryEntries = llm.MaxMemoryEntries; + _enableImageInput = llm.EnableImageInput; + _maxImageSizeKb = llm.MaxImageSizeKb > 0 ? llm.MaxImageSizeKb : 5120; + _enableToolHooks = llm.EnableToolHooks; + _toolHookTimeoutMs = llm.ToolHookTimeoutMs > 0 ? llm.ToolHookTimeoutMs : 10000; + _enableSkillSystem = llm.EnableSkillSystem; + _skillsFolderPath = llm.SkillsFolderPath; + _slashPopupPageSize = llm.SlashPopupPageSize > 0 ? Math.Clamp(llm.SlashPopupPageSize, 3, 10) : 6; + _enableDragDropAiActions = llm.EnableDragDropAiActions; + _dragDropAutoSend = llm.DragDropAutoSend; + _enableCodeReview = llm.Code.EnableCodeReview; + _enableAutoRouter = llm.EnableAutoRouter; + _autoRouterConfidence = llm.AutoRouterConfidence; + _enableChatRainbowGlow = llm.EnableChatRainbowGlow; + _notifyOnComplete = llm.NotifyOnComplete; + _showTips = llm.ShowTips; + _devMode = llm.DevMode; // 저장된 설정 유지 (한 번 켜면 유지, 끄면 하위 기능 비활성) + _devModeStepApproval = llm.DevModeStepApproval; + _workflowVisualizer = llm.WorkflowVisualizer; + _freeTierMode = llm.FreeTierMode; + _freeTierDelaySeconds = llm.FreeTierDelaySeconds > 0 ? llm.FreeTierDelaySeconds : 4; + _showTotalCallStats = llm.ShowTotalCallStats; + + // 서비스별 독립 설정 로드 + _ollamaEndpoint = llm.OllamaEndpoint; + _ollamaModel = llm.OllamaModel; + _vllmEndpoint = llm.VllmEndpoint; + _vllmModel = llm.VllmModel; + _geminiModel = string.IsNullOrEmpty(llm.GeminiModel) ? "gemini-2.5-flash" : llm.GeminiModel; + _claudeModel = string.IsNullOrEmpty(llm.ClaudeModel) ? "claude-sonnet-4-6" : llm.ClaudeModel; + + // API 키 로드: 서비스별 독립 저장 + _geminiApiKey = llm.GeminiApiKey; + _claudeApiKey = llm.ClaudeApiKey; + if (llm.EncryptionEnabled) + { + _ollamaApiKey = string.IsNullOrEmpty(llm.OllamaApiKey) ? "" : "(저장됨)"; + _vllmApiKey = string.IsNullOrEmpty(llm.VllmApiKey) ? "" : "(저장됨)"; + } + else + { + _ollamaApiKey = llm.OllamaApiKey; + _vllmApiKey = llm.VllmApiKey; + } + + // 기존 단일 설정에서 마이그레이션 (최초 1회) + if (string.IsNullOrEmpty(llm.OllamaEndpoint) && !string.IsNullOrEmpty(llm.Endpoint) && llm.Service == "ollama") + { + _ollamaEndpoint = llm.Endpoint; + _ollamaModel = llm.Model; + if (!llm.EncryptionEnabled) _ollamaApiKey = llm.EncryptedApiKey; + } + if (string.IsNullOrEmpty(llm.VllmEndpoint) && !string.IsNullOrEmpty(llm.Endpoint) && llm.Service == "vllm") + { + _vllmEndpoint = llm.Endpoint; + _vllmModel = llm.Model; + if (!llm.EncryptionEnabled) _vllmApiKey = llm.EncryptedApiKey; + } + if (string.IsNullOrEmpty(llm.GeminiApiKey) && !string.IsNullOrEmpty(llm.ApiKey) && llm.Service == "gemini") + { + _geminiApiKey = llm.ApiKey; + _geminiModel = llm.Model; + } + if (string.IsNullOrEmpty(llm.ClaudeApiKey) && !string.IsNullOrEmpty(llm.ApiKey) && llm.Service == "claude") + { + _claudeApiKey = llm.ApiKey; + _claudeModel = llm.Model; + } + + // 차단 경로/확장자 로드 + foreach (var p in llm.BlockedPaths) BlockedPaths.Add(p); + foreach (var e in llm.BlockedExtensions) BlockedExtensions.Add(e); + + // 등록 모델 로드 + foreach (var rm in llm.RegisteredModels) + RegisteredModels.Add(new RegisteredModelRow + { + Alias = rm.Alias, + EncryptedModelName = rm.EncryptedModelName, + Service = rm.Service, + Endpoint = rm.Endpoint, + ApiKey = rm.ApiKey, + AuthType = rm.AuthType ?? "bearer", + Cp4dUrl = rm.Cp4dUrl ?? "", + Cp4dUsername = rm.Cp4dUsername ?? "", + Cp4dPassword = rm.Cp4dPassword ?? "", + }); + + // 프롬프트 템플릿 로드 + foreach (var pt in llm.PromptTemplates) + PromptTemplates.Add(new PromptTemplateRow { Name = pt.Name, Content = pt.Content, Icon = pt.Icon }); + + foreach (var card in ThemeCards) + card.IsSelected = card.Key == _selectedThemeKey; + + // 알림 설정 로드 + _reminderEnabled = s.Reminder.Enabled; + _reminderCorner = s.Reminder.Corner; + _reminderIntervalMinutes = s.Reminder.IntervalMinutes; + _reminderDisplaySeconds = s.Reminder.DisplaySeconds; + + // 캡처 설정 로드 + _capPrefix = string.IsNullOrWhiteSpace(s.ScreenCapture.Prefix) ? "cap" : s.ScreenCapture.Prefix; + _capGlobalHotkeyEnabled = s.ScreenCapture.GlobalHotkeyEnabled; + _capGlobalHotkey = string.IsNullOrWhiteSpace(s.ScreenCapture.GlobalHotkey) ? "PrintScreen" : s.ScreenCapture.GlobalHotkey; + _capGlobalMode = string.IsNullOrWhiteSpace(s.ScreenCapture.GlobalHotkeyMode) ? "screen" : s.ScreenCapture.GlobalHotkeyMode; + _capScrollDelayMs = s.ScreenCapture.ScrollDelayMs > 0 ? s.ScreenCapture.ScrollDelayMs : 120; + + // 클립보드 히스토리 설정 로드 + _clipboardEnabled = s.ClipboardHistory.Enabled; + _clipboardMaxItems = s.ClipboardHistory.MaxItems; + + // 시스템 명령 설정 로드 + var sys = s.SystemCommands; + _sysShowLock = sys.ShowLock; + _sysShowSleep = sys.ShowSleep; + _sysShowRestart = sys.ShowRestart; + _sysShowShutdown = sys.ShowShutdown; + _sysShowHibernate = sys.ShowHibernate; + _sysShowLogout = sys.ShowLogout; + _sysShowRecycleBin = sys.ShowRecycleBin; + + // 시스템 명령 별칭 로드 + var ca = sys.CommandAliases; + _aliasLock = FormatAliases(ca, "lock"); + _aliasSleep = FormatAliases(ca, "sleep"); + _aliasRestart = FormatAliases(ca, "restart"); + _aliasShutdown = FormatAliases(ca, "shutdown"); + _aliasHibernate = FormatAliases(ca, "hibernate"); + _aliasLogout = FormatAliases(ca, "logout"); + _aliasRecycle = FormatAliases(ca, "recycle"); + + // 인덱스 경로 로드 + foreach (var path in s.IndexPaths) + IndexPaths.Add(path); + + // 인덱스 확장자 로드 + foreach (var ext in s.IndexExtensions) + IndexExtensions.Add(ext); + + // 스니펫 로드 + foreach (var sn in s.Snippets) + Snippets.Add(new SnippetRowModel { Key = sn.Key, Name = sn.Name, Content = sn.Content }); + + // 배치 명령 로드 + foreach (var alias in s.Aliases.Where(a => a.Type == "batch")) + { + BatchCommands.Add(new BatchCommandModel + { + Key = alias.Key, + Command = alias.Target, + ShowWindow = alias.ShowWindow + }); + } + + // 기존 aliases 로드 (app/url/folder type만) + foreach (var alias in s.Aliases.Where(a => a.Type is "app" or "url" or "folder")) + { + AppShortcuts.Add(new AppShortcutModel + { + Key = alias.Key, + Description = alias.Description ?? "", + Target = alias.Target, + Type = alias.Type + }); + } + + var c = s.Launcher.CustomTheme ?? new CustomThemeColors(); + ColorRows = new List + { + new("런처 배경", nameof(CustomThemeColors.LauncherBackground), c.LauncherBackground), + new("항목 배경", nameof(CustomThemeColors.ItemBackground), c.ItemBackground), + new("선택 항목 배경", nameof(CustomThemeColors.ItemSelectedBackground), c.ItemSelectedBackground), + new("호버 배경", nameof(CustomThemeColors.ItemHoverBackground), c.ItemHoverBackground), + new("기본 텍스트", nameof(CustomThemeColors.PrimaryText), c.PrimaryText), + new("보조 텍스트", nameof(CustomThemeColors.SecondaryText), c.SecondaryText), + new("플레이스홀더", nameof(CustomThemeColors.PlaceholderText), c.PlaceholderText), + new("강조색", nameof(CustomThemeColors.AccentColor), c.AccentColor), + new("구분선", nameof(CustomThemeColors.SeparatorColor), c.SeparatorColor), + new("힌트 배경", nameof(CustomThemeColors.HintBackground), c.HintBackground), + new("힌트 텍스트", nameof(CustomThemeColors.HintText), c.HintText), + new("테두리", nameof(CustomThemeColors.BorderColor), c.BorderColor), + new("스크롤바", nameof(CustomThemeColors.ScrollbarThumb), c.ScrollbarThumb), + new("그림자", nameof(CustomThemeColors.ShadowColor), c.ShadowColor), + }; + + _customWindowCornerRadius = c.WindowCornerRadius; + _customItemCornerRadius = c.ItemCornerRadius; + } + + // ─── 커스텀 테마 모서리 라운딩 ─────────────────────────────────────────── + private int _customWindowCornerRadius = 20; + private int _customItemCornerRadius = 10; + + public int CustomWindowCornerRadius + { + get => _customWindowCornerRadius; + set { _customWindowCornerRadius = Math.Clamp(value, 0, 30); OnPropertyChanged(); } + } + + public int CustomItemCornerRadius + { + get => _customItemCornerRadius; + set { _customItemCornerRadius = Math.Clamp(value, 0, 20); OnPropertyChanged(); } + } + + // ─── 인덱스 경로 ────────────────────────────────────────────────────── + public ObservableCollection IndexPaths { get; } = new(); + + public void AddIndexPath(string path) + { + var trimmed = path.Trim(); + if (string.IsNullOrWhiteSpace(trimmed)) return; + if (IndexPaths.Any(p => p.Equals(trimmed, StringComparison.OrdinalIgnoreCase))) return; + IndexPaths.Add(trimmed); + } + + public void RemoveIndexPath(string path) => IndexPaths.Remove(path); + + // ─── 인덱스 확장자 ────────────────────────────────────────────────── + public ObservableCollection IndexExtensions { get; } = new(); + + public void AddExtension(string ext) + { + var trimmed = ext.Trim().ToLowerInvariant(); + if (string.IsNullOrWhiteSpace(trimmed)) return; + if (!trimmed.StartsWith(".")) trimmed = "." + trimmed; + if (IndexExtensions.Any(e => e.Equals(trimmed, StringComparison.OrdinalIgnoreCase))) return; + IndexExtensions.Add(trimmed); + } + + public void RemoveExtension(string ext) => IndexExtensions.Remove(ext); + + public void BrowseIndexPath() + { + using var dlg = new FolderBrowserDialog + { + Description = "인덱스할 폴더 선택", + UseDescriptionForTitle = true, + ShowNewFolderButton = false + }; + if (dlg.ShowDialog() != DialogResult.OK) return; + AddIndexPath(dlg.SelectedPath); + } + + // ─── 빠른 실행 단축키 메서드 ────────────────────────────────────────── + public bool AddShortcut() + { + if (string.IsNullOrWhiteSpace(_newKey) || string.IsNullOrWhiteSpace(_newTarget)) + return false; + + // 중복 키 확인 + if (AppShortcuts.Any(s => s.Key.Equals(_newKey.Trim(), StringComparison.OrdinalIgnoreCase))) + return false; + + AppShortcuts.Add(new AppShortcutModel + { + Key = _newKey.Trim(), + Description = _newDescription.Trim(), + Target = _newTarget.Trim(), + Type = _newType + }); + + NewKey = ""; NewDescription = ""; NewTarget = ""; NewType = "app"; + return true; + } + + public void RemoveShortcut(AppShortcutModel shortcut) => AppShortcuts.Remove(shortcut); + + /// 파일 선택 대화상자. 선택 시 NewTarget에 자동 설정. + public void BrowseTarget() + { + using var dlg = new OpenFileDialog + { + Filter = "실행 파일 (*.exe)|*.exe|모든 파일 (*.*)|*.*", + Title = "앱 선택" + }; + if (dlg.ShowDialog() != DialogResult.OK) return; + + NewTarget = dlg.FileName; + NewType = "app"; + if (string.IsNullOrWhiteSpace(NewDescription)) + NewDescription = System.IO.Path.GetFileNameWithoutExtension(dlg.FileName); + } + + public void SelectTheme(string key) + { + SelectedThemeKey = key; + ThemePreviewRequested?.Invoke(this, EventArgs.Empty); + } + + public void PickColor(ColorRowModel row) + { + using var dlg = new ColorDialog { FullOpen = true }; + try + { + var color = ThemeResourceHelper.HexColor(row.Hex); + dlg.Color = System.Drawing.Color.FromArgb(color.R, color.G, color.B); + } + catch (Exception) { /* 기본값 사용 */ } + + if (dlg.ShowDialog() != DialogResult.OK) return; + + row.Hex = $"#{dlg.Color.R:X2}{dlg.Color.G:X2}{dlg.Color.B:X2}"; + if (_selectedThemeKey == "custom") + ThemePreviewRequested?.Invoke(this, EventArgs.Empty); + } + + // 시스템 예약 프리픽스 (핸들러에서 이미 사용 중인 키) + private static readonly HashSet ReservedPrefixes = new(StringComparer.OrdinalIgnoreCase) + { + "=", "?", "#", "$", ";", "@", "~", ">", "!", + "emoji", "color", "recent", "note", "uninstall", "kill", "media", + "info", "*", "json", "encode", "port", "env", "snap", "help", + "pick", "date", "svc", "pipe", "journal", "routine", "batch", + "diff", "win", "stats", "fav", "rename", "monitor", "scaffold", + }; + + /// 설정 저장 전 프리픽스/키워드 충돌을 검사합니다. 충돌 시 메시지를 반환합니다. + public string? ValidateBeforeSave() + { + // 캡처 프리픽스 충돌 검사 + var cap = string.IsNullOrWhiteSpace(_capPrefix) ? "cap" : _capPrefix.Trim(); + if (cap != "cap" && ReservedPrefixes.Contains(cap)) + return $"캡처 프리픽스 '{cap}'은(는) 이미 사용 중인 예약어입니다."; + + // 빠른 실행 별칭 키 중복 검사 + var aliasKeys = AppShortcuts.Select(s => s.Key.ToLowerInvariant()).ToList(); + var duplicateAlias = aliasKeys.GroupBy(k => k).FirstOrDefault(g => g.Count() > 1); + if (duplicateAlias != null) + return $"빠른 실행 키워드 '{duplicateAlias.Key}'이(가) 중복되었습니다."; + + // 빠른 실행 별칭 키 vs 예약 프리픽스 충돌 + foreach (var key in aliasKeys) + { + if (ReservedPrefixes.Contains(key)) + return $"빠른 실행 키워드 '{key}'은(는) 시스템 예약어와 충돌합니다."; + } + + // 배치 명령 키 중복 검사 + var batchKeys = BatchCommands.Select(b => b.Key.ToLowerInvariant()).ToList(); + var duplicateBatch = batchKeys.GroupBy(k => k).FirstOrDefault(g => g.Count() > 1); + if (duplicateBatch != null) + return $"배치 명령 키워드 '{duplicateBatch.Key}'이(가) 중복되었습니다."; + + return null; // 문제 없음 + } + + public void Save() + { + // 충돌 검사 + var conflict = ValidateBeforeSave(); + if (conflict != null) + { + CustomMessageBox.Show( + conflict, + "AX Copilot — 설정 저장 오류", + System.Windows.MessageBoxButton.OK, + System.Windows.MessageBoxImage.Warning); + return; + } + + var s = _service.Settings; + s.Hotkey = _hotkey; + s.Launcher.MaxResults = _maxResults; + s.Launcher.Opacity = _opacity; + s.Launcher.Theme = _selectedThemeKey; + s.Launcher.Position = _launcherPosition; + s.Launcher.WebSearchEngine = _webSearchEngine; + s.Launcher.SnippetAutoExpand = _snippetAutoExpand; + s.Launcher.Language = _language; + L10n.SetLanguage(_language); + + // 기능 토글 저장 + s.Launcher.ShowNumberBadges = _showNumberBadges; + s.Launcher.EnableFavorites = _enableFavorites; + s.Launcher.EnableRecent = _enableRecent; + s.Launcher.EnableActionMode = _enableActionMode; + s.Launcher.CloseOnFocusLost = _closeOnFocusLost; + s.Launcher.ShowPrefixBadge = _showPrefixBadge; + s.Launcher.EnableIconAnimation = _enableIconAnimation; + s.Launcher.EnableRainbowGlow = _enableRainbowGlow; + s.Launcher.EnableSelectionGlow = _enableSelectionGlow; + s.Launcher.EnableRandomPlaceholder = _enableRandomPlaceholder; + s.Launcher.ShowLauncherBorder = _showLauncherBorder; + s.Launcher.ShortcutHelpUseThemeColor = _shortcutHelpUseThemeColor; + s.Launcher.EnableTextAction = _enableTextAction; + s.Launcher.EnableFileDialogIntegration = _enableFileDialogIntegration; + s.Launcher.EnableClipboardAutoCategory = _enableClipboardAutoCategory; + s.Launcher.MaxPinnedClipboardItems = _maxPinnedClipboardItems; + s.Launcher.TextActionTranslateLanguage = _textActionTranslateLanguage; + s.Llm.MaxSubAgents = _maxSubAgents; + s.Llm.PdfExportPath = _pdfExportPath; + s.Llm.TipDurationSeconds = _tipDurationSeconds; + + // LLM 공통 설정 저장 + s.Llm.Service = _llmService; + s.Llm.Streaming = _llmStreaming; + s.Llm.MaxContextTokens = _llmMaxContextTokens; + s.Llm.RetentionDays = _llmRetentionDays; + s.Llm.Temperature = _llmTemperature; + s.Llm.DefaultAgentPermission = _defaultAgentPermission; + s.Llm.DefaultOutputFormat = _defaultOutputFormat; + s.Llm.DefaultMood = _defaultMood; + s.Llm.AutoPreview = _autoPreview; + s.Llm.MaxAgentIterations = _maxAgentIterations; + s.Llm.MaxRetryOnError = _maxRetryOnError; + s.Llm.AgentLogLevel = _agentLogLevel; + s.Llm.AgentDecisionLevel = _agentDecisionLevel; + s.Llm.PlanMode = _planMode; + s.Llm.EnableMultiPassDocument = _enableMultiPassDocument; + s.Llm.EnableCoworkVerification = _enableCoworkVerification; + s.Llm.EnableFilePathHighlight = _enableFilePathHighlight; + s.Llm.FolderDataUsage = _folderDataUsage; + s.Llm.EnableAuditLog = _enableAuditLog; + s.Llm.EnableAgentMemory = _enableAgentMemory; + s.Llm.EnableProjectRules = _enableProjectRules; + s.Llm.MaxMemoryEntries = _maxMemoryEntries; + s.Llm.EnableImageInput = _enableImageInput; + s.Llm.MaxImageSizeKb = _maxImageSizeKb; + s.Llm.EnableToolHooks = _enableToolHooks; + s.Llm.ToolHookTimeoutMs = _toolHookTimeoutMs; + s.Llm.EnableSkillSystem = _enableSkillSystem; + s.Llm.SkillsFolderPath = _skillsFolderPath; + s.Llm.SlashPopupPageSize = _slashPopupPageSize; + s.Llm.EnableDragDropAiActions = _enableDragDropAiActions; + s.Llm.DragDropAutoSend = _dragDropAutoSend; + s.Llm.Code.EnableCodeReview = _enableCodeReview; + s.Llm.EnableAutoRouter = _enableAutoRouter; + s.Llm.AutoRouterConfidence = _autoRouterConfidence; + s.Llm.EnableChatRainbowGlow = _enableChatRainbowGlow; + s.Llm.NotifyOnComplete = _notifyOnComplete; + s.Llm.ShowTips = _showTips; + s.Llm.DevMode = _devMode; + s.Llm.DevModeStepApproval = _devModeStepApproval; + s.Llm.WorkflowVisualizer = _workflowVisualizer; + s.Llm.FreeTierMode = _freeTierMode; + s.Llm.FreeTierDelaySeconds = _freeTierDelaySeconds; + s.Llm.ShowTotalCallStats = _showTotalCallStats; + + // 서비스별 독립 설정 저장 + s.Llm.OllamaEndpoint = _ollamaEndpoint; + s.Llm.OllamaModel = _ollamaModel; + s.Llm.VllmEndpoint = _vllmEndpoint; + s.Llm.VllmModel = _vllmModel; + s.Llm.GeminiModel = _geminiModel; + s.Llm.ClaudeModel = _claudeModel; + s.Llm.GeminiApiKey = _geminiApiKey; + s.Llm.ClaudeApiKey = _claudeApiKey; + + // 내부 서비스 API 키 저장 (암호화 분기) + if (!string.IsNullOrEmpty(_ollamaApiKey) && _ollamaApiKey != "(저장됨)") + s.Llm.OllamaApiKey = CryptoService.EncryptIfEnabled(_ollamaApiKey, s.Llm.EncryptionEnabled); + if (!string.IsNullOrEmpty(_vllmApiKey) && _vllmApiKey != "(저장됨)") + s.Llm.VllmApiKey = CryptoService.EncryptIfEnabled(_vllmApiKey, s.Llm.EncryptionEnabled); + + // 활성 서비스의 설정을 기존 호환 필드에도 동기화 (LlmService.cs 호환) + switch (_llmService) + { + case "ollama": + s.Llm.Endpoint = _ollamaEndpoint; + s.Llm.Model = _ollamaModel; + s.Llm.EncryptedApiKey = s.Llm.OllamaApiKey; + break; + case "vllm": + s.Llm.Endpoint = _vllmEndpoint; + s.Llm.Model = _vllmModel; + s.Llm.EncryptedApiKey = s.Llm.VllmApiKey; + break; + case "gemini": + s.Llm.ApiKey = _geminiApiKey; + s.Llm.Model = _geminiModel; + break; + case "claude": + s.Llm.ApiKey = _claudeApiKey; + s.Llm.Model = _claudeModel; + break; + } + + // 등록 모델 저장 + s.Llm.RegisteredModels = RegisteredModels + .Where(rm => !string.IsNullOrWhiteSpace(rm.Alias)) + .Select(rm => new RegisteredModel + { + Alias = rm.Alias, + EncryptedModelName = rm.EncryptedModelName, + Service = rm.Service, + Endpoint = rm.Endpoint, + ApiKey = rm.ApiKey, + AuthType = rm.AuthType ?? "bearer", + Cp4dUrl = rm.Cp4dUrl ?? "", + Cp4dUsername = rm.Cp4dUsername ?? "", + Cp4dPassword = rm.Cp4dPassword ?? "", + }) + .ToList(); + + // 프롬프트 템플릿 저장 + s.Llm.PromptTemplates = PromptTemplates + .Where(pt => !string.IsNullOrWhiteSpace(pt.Name)) + .Select(pt => new PromptTemplate { Name = pt.Name, Content = pt.Content, Icon = pt.Icon }) + .ToList(); + + // 인덱스 경로 + 확장자 저장 + s.IndexPaths = IndexPaths.ToList(); + s.IndexExtensions = IndexExtensions.ToList(); + s.IndexSpeed = _indexSpeed; + + // 커스텀 색상 + 모양 저장 + var c = s.Launcher.CustomTheme ??= new CustomThemeColors(); + foreach (var row in ColorRows) + { + var prop = typeof(CustomThemeColors).GetProperty(row.Property); + prop?.SetValue(c, row.Hex); + } + c.WindowCornerRadius = _customWindowCornerRadius; + c.ItemCornerRadius = _customItemCornerRadius; + + // 빠른 실행 단축키 저장: + // batch/api/clipboard type은 그대로 유지, app/url/folder는 ViewModel 내용으로 교체 + var otherAliases = s.Aliases + .Where(a => a.Type is not ("app" or "url" or "folder" or "batch")) + .ToList(); + s.Aliases = otherAliases + .Concat(AppShortcuts.Select(sc => new AliasEntry + { + Key = sc.Key, + Type = sc.Type, + Target = sc.Target, + Description = string.IsNullOrWhiteSpace(sc.Description) ? null : sc.Description + })) + .Concat(BatchCommands.Select(b => new AliasEntry + { + Key = b.Key, + Type = "batch", + Target = b.Command, + ShowWindow = b.ShowWindow + })) + .ToList(); + + // 스니펫 저장 + s.Snippets = Snippets.Select(sn => new SnippetEntry + { + Key = sn.Key, + Name = sn.Name, + Content = sn.Content + }).ToList(); + + // 알림 설정 저장 + s.Reminder.Enabled = _reminderEnabled; + s.Reminder.Corner = _reminderCorner; + s.Reminder.IntervalMinutes = _reminderIntervalMinutes; + s.Reminder.DisplaySeconds = _reminderDisplaySeconds; + + // 캡처 설정 저장 + s.ScreenCapture.Prefix = string.IsNullOrWhiteSpace(_capPrefix) ? "cap" : _capPrefix.Trim(); + s.ScreenCapture.GlobalHotkeyEnabled = _capGlobalHotkeyEnabled; + s.ScreenCapture.GlobalHotkey = string.IsNullOrWhiteSpace(_capGlobalHotkey) ? "PrintScreen" : _capGlobalHotkey.Trim(); + s.ScreenCapture.GlobalHotkeyMode = _capGlobalMode; + s.ScreenCapture.ScrollDelayMs = Math.Max(50, _capScrollDelayMs); + + // 클립보드 히스토리 설정 저장 + s.ClipboardHistory.Enabled = _clipboardEnabled; + s.ClipboardHistory.MaxItems = _clipboardMaxItems; + + // 시스템 명령 설정 저장 + var sc = s.SystemCommands; + sc.ShowLock = _sysShowLock; + sc.ShowSleep = _sysShowSleep; + sc.ShowRestart = _sysShowRestart; + sc.ShowShutdown = _sysShowShutdown; + sc.ShowHibernate = _sysShowHibernate; + sc.ShowLogout = _sysShowLogout; + sc.ShowRecycleBin = _sysShowRecycleBin; + + // 시스템 명령 별칭 저장 + var cmdAliases = new Dictionary>(); + void SaveAlias(string key, string val) + { + var list = ParseAliases(val); + if (list.Count > 0) cmdAliases[key] = list; + } + SaveAlias("lock", _aliasLock); + SaveAlias("sleep", _aliasSleep); + SaveAlias("restart", _aliasRestart); + SaveAlias("shutdown", _aliasShutdown); + SaveAlias("hibernate", _aliasHibernate); + SaveAlias("logout", _aliasLogout); + SaveAlias("recycle", _aliasRecycle); + sc.CommandAliases = cmdAliases; + + _service.Save(); + SaveCompleted?.Invoke(this, EventArgs.Empty); + } + + // ─── 스니펫 설정 ────────────────────────────────────────────────────────── + public ObservableCollection Snippets { get; } = new(); + + private string _newSnippetKey = ""; + private string _newSnippetName = ""; + private string _newSnippetContent = ""; + + public string NewSnippetKey { get => _newSnippetKey; set { _newSnippetKey = value; OnPropertyChanged(); } } + public string NewSnippetName { get => _newSnippetName; set { _newSnippetName = value; OnPropertyChanged(); } } + public string NewSnippetContent { get => _newSnippetContent; set { _newSnippetContent = value; OnPropertyChanged(); } } + + public bool AddSnippet() + { + if (string.IsNullOrWhiteSpace(_newSnippetKey) || string.IsNullOrWhiteSpace(_newSnippetContent)) + return false; + if (Snippets.Any(sn => sn.Key.Equals(_newSnippetKey.Trim(), StringComparison.OrdinalIgnoreCase))) + return false; + + Snippets.Add(new SnippetRowModel + { + Key = _newSnippetKey.Trim(), + Name = _newSnippetName.Trim(), + Content = _newSnippetContent.Trim() + }); + NewSnippetKey = ""; NewSnippetName = ""; NewSnippetContent = ""; + return true; + } + + public void RemoveSnippet(SnippetRowModel row) => Snippets.Remove(row); + + // ─── 클립보드 히스토리 설정 ──────────────────────────────────────────────── + private bool _clipboardEnabled; + private int _clipboardMaxItems; + + public bool ClipboardEnabled + { + get => _clipboardEnabled; + set { _clipboardEnabled = value; OnPropertyChanged(); } + } + + public int ClipboardMaxItems + { + get => _clipboardMaxItems; + set { _clipboardMaxItems = value; OnPropertyChanged(); } + } + + // ─── 스크린 캡처 설정 ────────────────────────────────────────────────────── + private string _capPrefix = "cap"; + private bool _capGlobalHotkeyEnabled; + private string _capGlobalHotkey = "PrintScreen"; + private string _capGlobalMode = "screen"; + private int _capScrollDelayMs = 120; + + public string CapPrefix + { + get => _capPrefix; + set { _capPrefix = value; OnPropertyChanged(); } + } + + public void ResetCapPrefix() => CapPrefix = "cap"; + + public bool CapGlobalHotkeyEnabled + { + get => _capGlobalHotkeyEnabled; + set { _capGlobalHotkeyEnabled = value; OnPropertyChanged(); } + } + + public string CapGlobalHotkey + { + get => _capGlobalHotkey; + set { _capGlobalHotkey = value; OnPropertyChanged(); } + } + + public string CapGlobalMode + { + get => _capGlobalMode; + set { _capGlobalMode = value; OnPropertyChanged(); } + } + + public int CapScrollDelayMs + { + get => _capScrollDelayMs; + set { _capScrollDelayMs = value; OnPropertyChanged(); OnPropertyChanged(nameof(CapScrollDelayMsStr)); } + } + + /// ComboBox SelectedValue와 string 바인딩 용도 + public string CapScrollDelayMsStr + { + get => _capScrollDelayMs.ToString(); + set { if (int.TryParse(value, out int v)) CapScrollDelayMs = v; } + } + + public void ResetCapGlobalHotkey() + { + CapGlobalHotkey = "PrintScreen"; + CapGlobalMode = "screen"; + } + + // ─── 잠금 해제 알림 설정 ────────────────────────────────────────────────── + private bool _reminderEnabled; + private string _reminderCorner = "bottom-right"; + private int _reminderIntervalMinutes = 60; + private int _reminderDisplaySeconds = 15; + + public List GetReminderCategories() => _service.Settings.Reminder.EnabledCategories; + + public bool ReminderEnabled + { + get => _reminderEnabled; + set { _reminderEnabled = value; OnPropertyChanged(); } + } + + public string ReminderCorner + { + get => _reminderCorner; + set { _reminderCorner = value; OnPropertyChanged(); } + } + + public int ReminderIntervalMinutes + { + get => _reminderIntervalMinutes; + set { _reminderIntervalMinutes = value; OnPropertyChanged(); } + } + + public int ReminderDisplaySeconds + { + get => _reminderDisplaySeconds; + set { _reminderDisplaySeconds = value; OnPropertyChanged(); } + } + + // ─── 시스템 명령 설정 ────────────────────────────────────────────────────── + private bool _sysShowLock; + private bool _sysShowSleep; + private bool _sysShowRestart; + private bool _sysShowShutdown; + private bool _sysShowHibernate; + private bool _sysShowLogout; + private bool _sysShowRecycleBin; + + public bool SysShowLock { get => _sysShowLock; set { _sysShowLock = value; OnPropertyChanged(); } } + public bool SysShowSleep { get => _sysShowSleep; set { _sysShowSleep = value; OnPropertyChanged(); } } + public bool SysShowRestart { get => _sysShowRestart; set { _sysShowRestart = value; OnPropertyChanged(); } } + public bool SysShowShutdown { get => _sysShowShutdown; set { _sysShowShutdown = value; OnPropertyChanged(); } } + public bool SysShowHibernate { get => _sysShowHibernate; set { _sysShowHibernate = value; OnPropertyChanged(); } } + public bool SysShowLogout { get => _sysShowLogout; set { _sysShowLogout = value; OnPropertyChanged(); } } + public bool SysShowRecycleBin { get => _sysShowRecycleBin; set { _sysShowRecycleBin = value; OnPropertyChanged(); } } + + // ─── 시스템 명령 별칭 (쉼표 구분 문자열) ─────────────────────────────────── + private string _aliasLock = ""; + private string _aliasSleep = ""; + private string _aliasRestart = ""; + private string _aliasShutdown = ""; + private string _aliasHibernate = ""; + private string _aliasLogout = ""; + private string _aliasRecycle = ""; + + public string AliasLock { get => _aliasLock; set { _aliasLock = value; OnPropertyChanged(); } } + public string AliasSleep { get => _aliasSleep; set { _aliasSleep = value; OnPropertyChanged(); } } + public string AliasRestart { get => _aliasRestart; set { _aliasRestart = value; OnPropertyChanged(); } } + public string AliasShutdown { get => _aliasShutdown; set { _aliasShutdown = value; OnPropertyChanged(); } } + public string AliasHibernate { get => _aliasHibernate; set { _aliasHibernate = value; OnPropertyChanged(); } } + public string AliasLogout { get => _aliasLogout; set { _aliasLogout = value; OnPropertyChanged(); } } + public string AliasRecycle { get => _aliasRecycle; set { _aliasRecycle = value; OnPropertyChanged(); } } + + public void ResetSystemCommandAliases() + { + AliasLock = ""; AliasSleep = ""; AliasRestart = ""; + AliasShutdown = ""; AliasHibernate = ""; AliasLogout = ""; AliasRecycle = ""; + } + + private static string FormatAliases(Dictionary> dict, string key) + => dict.TryGetValue(key, out var list) ? string.Join(", ", list) : ""; + + private static List ParseAliases(string input) + => input.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) + .Where(s => !string.IsNullOrWhiteSpace(s)) + .ToList(); + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); +} + +// ─── 프롬프트 템플릿 행 모델 ───────────────────────────────────────────────────── + +public class PromptTemplateRow : INotifyPropertyChanged +{ + private string _name = ""; + private string _content = ""; + private string _icon = "\uE8BD"; + + public string Name { get => _name; set { _name = value; OnPropertyChanged(); } } + public string Content { get => _content; set { _content = value; OnPropertyChanged(); OnPropertyChanged(nameof(Preview)); } } + public string Icon { get => _icon; set { _icon = value; OnPropertyChanged(); } } + + public string Preview => Content.Length > 60 + ? Content[..57].Replace("\n", " ") + "…" + : Content.Replace("\n", " "); + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); +} + +// ─── 등록 모델 행 모델 ────────────────────────────────────────────────────────── + +public class RegisteredModelRow : INotifyPropertyChanged +{ + private string _alias = ""; + private string _encryptedModelName = ""; + private string _service = "ollama"; + private string _endpoint = ""; + private string _apiKey = ""; + + /// UI 표시용 별칭 + public string Alias + { + get => _alias; + set { _alias = value; OnPropertyChanged(); } + } + + /// 암호화된 실제 모델명 (PortableEncrypt) + public string EncryptedModelName + { + get => _encryptedModelName; + set { _encryptedModelName = value; OnPropertyChanged(); OnPropertyChanged(nameof(MaskedModelName)); } + } + + /// 서비스 타입 (ollama / vllm) + public string Service + { + get => _service; + set { _service = value; OnPropertyChanged(); OnPropertyChanged(nameof(ServiceLabel)); } + } + + /// 이 모델 전용 서버 엔드포인트. 비어있으면 기본 엔드포인트 사용. + public string Endpoint + { + get => _endpoint; + set { _endpoint = value; OnPropertyChanged(); OnPropertyChanged(nameof(EndpointDisplay)); } + } + + /// 이 모델 전용 API 키. 비어있으면 기본 API 키 사용. + public string ApiKey + { + get => _apiKey; + set { _apiKey = value; OnPropertyChanged(); } + } + + // ── CP4D 인증 필드 ────────────────────────────────────────────────── + + private string _authType = "bearer"; + private string _cp4dUrl = ""; + private string _cp4dUsername = ""; + private string _cp4dPassword = ""; + + /// 인증 방식. bearer | cp4d + public string AuthType + { + get => _authType; + set { _authType = value; OnPropertyChanged(); OnPropertyChanged(nameof(AuthLabel)); } + } + + /// CP4D 서버 URL + public string Cp4dUrl + { + get => _cp4dUrl; + set { _cp4dUrl = value; OnPropertyChanged(); } + } + + /// CP4D 사용자 이름 + public string Cp4dUsername + { + get => _cp4dUsername; + set { _cp4dUsername = value; OnPropertyChanged(); } + } + + /// CP4D 비밀번호 (암호화 저장) + public string Cp4dPassword + { + get => _cp4dPassword; + set { _cp4dPassword = value; OnPropertyChanged(); } + } + + /// 인증 방식 라벨 + public string AuthLabel => _authType == "cp4d" ? "CP4D" : "Bearer"; + + /// UI에 표시할 엔드포인트 요약 + public string EndpointDisplay => string.IsNullOrEmpty(_endpoint) ? "(기본 서버)" : _endpoint; + + /// UI에 표시할 마스킹된 모델명 + public string MaskedModelName => string.IsNullOrEmpty(_encryptedModelName) ? "(미등록)" : "••••••••"; + + /// 서비스 라벨 + public string ServiceLabel => _service == "vllm" ? "vLLM" : "Ollama"; + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); +} + +// ─── 스니펫 행 모델 ──────────────────────────────────────────────────────────── + +public class SnippetRowModel : INotifyPropertyChanged +{ + private string _key = ""; + private string _name = ""; + private string _content = ""; + + public string Key { get => _key; set { _key = value; OnPropertyChanged(); } } + public string Name { get => _name; set { _name = value; OnPropertyChanged(); } } + public string Content { get => _content; set { _content = value; OnPropertyChanged(); } } + + public string Preview => Content.Length > 50 + ? Content[..47].Replace("\n", " ") + "…" + : Content.Replace("\n", " "); + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); +} diff --git a/src/AxCopilot/ViewModels/StatisticsViewModel.cs b/src/AxCopilot/ViewModels/StatisticsViewModel.cs new file mode 100644 index 0000000..c7c7727 --- /dev/null +++ b/src/AxCopilot/ViewModels/StatisticsViewModel.cs @@ -0,0 +1,492 @@ +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.IO; +using System.Runtime.CompilerServices; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Windows.Media; +using AxCopilot.Models; +using AxCopilot.Views; +using AxCopilot.Services; + +namespace AxCopilot.ViewModels; + +/// 하루 사용 통계를 막대 차트 아이템으로 표현 +public class DayBarItem +{ + public string DateLabel { get; init; } = ""; // "3/26" 형태 + public string DayLabel { get; init; } = ""; // "월" 형태 + public int Value { get; init; } + public double BarHeight { get; init; } // 0~66 (픽셀) + public string ValueLabel { get; init; } = ""; + public string ToolTipText { get; init; } = ""; // 마우스 호버 시 표시 + public bool IsToday { get; init; } + public bool HasData => Value > 0; +} + +/// 인기 명령어 순위 아이템 +public class CommandStatItem +{ + public int Rank { get; init; } + public string Command { get; init; } = ""; + public int Count { get; init; } + public double BarWidth { get; init; } // 0~200 (픽셀) +} + +/// 즐겨찾기 항목 (통계 화면에 표시) +public class FavoriteStatItem +{ + public int Rank { get; init; } + public string Name { get; init; } = ""; + public string Path { get; init; } = ""; + public string Icon { get; init; } = "\uE8B7"; // 기본: Folder + public bool Exists { get; init; } +} + +/// 탭별 대화 비율 아이템 +public class TabRatioItem +{ + public string TabName { get; init; } = ""; + public int Count { get; init; } + public double Percentage { get; init; } // 0~100 + public double BarWidth { get; init; } // 0~300 (픽셀) + public string PercentLabel { get; init; } = ""; + public Brush Color { get; init; } = Brushes.MediumSlateBlue; +} + +public class StatisticsViewModel : INotifyPropertyChanged +{ + private const double MaxBarHeight = 66.0; + private const double MaxBarWidth = 200.0; + + // ─── 차트 데이터 ───────────────────────────────────────────────────────── + public ObservableCollection LauncherOpenBars { get; } = new(); + public ObservableCollection ActiveTimeBars { get; } = new(); + public ObservableCollection TopCommands { get; } = new(); + public ObservableCollection TopFavorites { get; } = new(); + + // AX Agent 통계 + public ObservableCollection ChatCountBars { get; } = new(); // 대화 빈도 + public ObservableCollection TokenUsageBars { get; } = new(); // 토큰 사용량 + + // 추가 차트 + public ObservableCollection WeekdayAvgBars { get; } = new(); // 요일별 평균 호출 + public ObservableCollection TabChatRatios { get; } = new(); // 탭별 대화 비율 + + private bool _hasFavorites; + public bool HasFavorites { get => _hasFavorites; private set { _hasFavorites = value; OnPropertyChanged(); } } + + // ─── 요약 카드 ─────────────────────────────────────────────────────────── + private string _todayDate = ""; + private string _todaySummary = ""; + private string _peakDate = ""; + private string _peakDaySummary = ""; + private string _weekSummary = ""; + private string _totalOpensSummary = ""; + + public string TodayDate { get => _todayDate; set { _todayDate = value; OnPropertyChanged(); } } + public string TodaySummary { get => _todaySummary; set { _todaySummary = value; OnPropertyChanged(); } } + public string PeakDate { get => _peakDate; set { _peakDate = value; OnPropertyChanged(); } } + public string PeakDaySummary { get => _peakDaySummary; set { _peakDaySummary = value; OnPropertyChanged(); } } + public string WeekSummary { get => _weekSummary; set { _weekSummary = value; OnPropertyChanged(); } } + public string TotalOpensSummary { get => _totalOpensSummary; set { _totalOpensSummary = value; OnPropertyChanged(); } } + + private string _agentSummary = ""; + public string AgentSummary { get => _agentSummary; set { _agentSummary = value; OnPropertyChanged(); } } + + // 토큰 비율 + private double _promptBarWidth; + public double PromptBarWidth { get => _promptBarWidth; set { _promptBarWidth = value; OnPropertyChanged(); } } + private double _completionBarWidth; + public double CompletionBarWidth { get => _completionBarWidth; set { _completionBarWidth = value; OnPropertyChanged(); } } + private string _promptTokenLabel = ""; + public string PromptTokenLabel { get => _promptTokenLabel; set { _promptTokenLabel = value; OnPropertyChanged(); } } + private string _completionTokenLabel = ""; + public string CompletionTokenLabel { get => _completionTokenLabel; set { _completionTokenLabel = value; OnPropertyChanged(); } } + private string _tokenRatioSummary = ""; + public string TokenRatioSummary { get => _tokenRatioSummary; set { _tokenRatioSummary = value; OnPropertyChanged(); } } + + public StatisticsViewModel() + { + Refresh(); + } + + public void Refresh() + { + var stats = UsageStatisticsService.GetStats(30); + var today = DateTime.Today.ToString("yyyy-MM-dd"); + + BuildLauncherOpenChart(stats, today); + BuildActiveTimeChart(stats, today); + BuildChatCountChart(stats, today); + BuildTokenUsageChart(stats, today); + BuildTopCommands(stats); + BuildWeekdayAvgChart(stats); + BuildTabChatRatios(stats); + BuildTokenRatio(stats); + BuildSummaryCards(stats, today); + BuildTopFavorites(); + } + + // ─── 차트 빌더 ─────────────────────────────────────────────────────────── + + private void BuildLauncherOpenChart(List stats, string today) + { + // 최근 14일만 표시 + var recent = stats.TakeLast(14).ToList(); + int maxVal = recent.Max(s => s.LauncherOpens); + if (maxVal == 0) maxVal = 1; + + LauncherOpenBars.Clear(); + foreach (var s in recent) + { + var date = DateTime.TryParse(s.Date, out var d) ? d : DateTime.MinValue; + LauncherOpenBars.Add(new DayBarItem + { + DateLabel = date != DateTime.MinValue ? $"{date.Month}/{date.Day}" : "", + DayLabel = date != DateTime.MinValue ? GetKoreanDayOfWeek(date.DayOfWeek) : "", + Value = s.LauncherOpens, + BarHeight = MaxBarHeight * s.LauncherOpens / maxVal, + ValueLabel = s.LauncherOpens > 0 ? s.LauncherOpens.ToString() : "", + ToolTipText = date != DateTime.MinValue + ? $"{date:yyyy-MM-dd} ({GetKoreanDayOfWeek(date.DayOfWeek)})\n호출 {s.LauncherOpens}회" + : "", + IsToday = s.Date == today + }); + } + } + + private void BuildActiveTimeChart(List stats, string today) + { + var recent = stats.TakeLast(14).ToList(); + int maxVal = recent.Max(s => s.ActiveSeconds); + if (maxVal == 0) maxVal = 1; + + ActiveTimeBars.Clear(); + foreach (var s in recent) + { + var date = DateTime.TryParse(s.Date, out var d) ? d : DateTime.MinValue; + ActiveTimeBars.Add(new DayBarItem + { + DateLabel = date != DateTime.MinValue ? $"{date.Month}/{date.Day}" : "", + DayLabel = date != DateTime.MinValue ? GetKoreanDayOfWeek(date.DayOfWeek) : "", + Value = s.ActiveSeconds, + BarHeight = MaxBarHeight * s.ActiveSeconds / maxVal, + ValueLabel = FormatActiveTime(s.ActiveSeconds), + ToolTipText = date != DateTime.MinValue + ? $"{date:yyyy-MM-dd} ({GetKoreanDayOfWeek(date.DayOfWeek)})\n활성 {FormatActiveTime(s.ActiveSeconds)}" + : "", + IsToday = s.Date == today + }); + } + } + + private void BuildChatCountChart(List stats, string today) + { + var recent = stats.TakeLast(14).ToList(); + // 탭별 합산 + int maxVal = recent.Max(s => + { + int sum = 0; + foreach (var kv in s.ChatCounts) sum += kv.Value; + return sum; + }); + if (maxVal == 0) maxVal = 1; + + ChatCountBars.Clear(); + foreach (var s in recent) + { + var dt = DateTime.TryParse(s.Date, out var d) ? d : DateTime.MinValue; + int chat = s.ChatCounts.GetValueOrDefault("Chat"); + int cowork = s.ChatCounts.GetValueOrDefault("Cowork"); + int code = s.ChatCounts.GetValueOrDefault("Code"); + int total = chat + cowork + code; + var isToday = s.Date == today; + + ChatCountBars.Add(new DayBarItem + { + DateLabel = dt.ToString("M/d"), + DayLabel = dt.ToString("ddd")[..1], + Value = total, + BarHeight = total > 0 ? total * MaxBarHeight / maxVal : 2, + ValueLabel = total > 0 ? total.ToString() : "", + ToolTipText = $"{s.Date} ({dt:ddd})\nChat: {chat}회 · Cowork: {cowork}회 · Code: {code}회", + IsToday = isToday, + }); + } + } + + private void BuildTokenUsageChart(List stats, string today) + { + var recent = stats.TakeLast(14).ToList(); + long maxVal = recent.Max(s => s.TotalTokens); + if (maxVal == 0) maxVal = 1; + + TokenUsageBars.Clear(); + foreach (var s in recent) + { + var dt = DateTime.TryParse(s.Date, out var d) ? d : DateTime.MinValue; + var isToday = s.Date == today; + var tokens = s.TotalTokens; + + TokenUsageBars.Add(new DayBarItem + { + DateLabel = dt.ToString("M/d"), + DayLabel = dt.ToString("ddd")[..1], + Value = (int)Math.Min(tokens, int.MaxValue), + BarHeight = tokens > 0 ? (double)tokens * MaxBarHeight / maxVal : 2, + ValueLabel = tokens > 0 ? FormatTokens(tokens) : "", + ToolTipText = $"{s.Date} ({dt:ddd})\n프롬프트: {s.PromptTokens:N0} · 완료: {s.CompletionTokens:N0} · 합계: {s.TotalTokens:N0}", + IsToday = isToday, + }); + } + } + + private static string FormatTokens(long tokens) => tokens switch + { + >= 1_000_000 => $"{tokens / 1_000_000.0:F1}M", + >= 1_000 => $"{tokens / 1_000.0:F1}K", + _ => tokens.ToString(), + }; + + private void BuildWeekdayAvgChart(List stats) + { + // 요일별 평균 호출 (30일 데이터 → 요일 그룹) + var groups = new Dictionary>(); + foreach (DayOfWeek dow in Enum.GetValues()) + groups[dow] = new(); + + foreach (var s in stats) + { + if (DateTime.TryParse(s.Date, out var d)) + groups[d.DayOfWeek].Add(s.LauncherOpens); + } + + // 월~일 순서 + var ordered = new[] { DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, + DayOfWeek.Thursday, DayOfWeek.Friday, DayOfWeek.Saturday, DayOfWeek.Sunday }; + double maxAvg = ordered.Max(dow => groups[dow].Count > 0 ? groups[dow].Average() : 0); + if (maxAvg < 1) maxAvg = 1; + + WeekdayAvgBars.Clear(); + foreach (var dow in ordered) + { + var list = groups[dow]; + var avg = list.Count > 0 ? list.Average() : 0; + WeekdayAvgBars.Add(new DayBarItem + { + DateLabel = "", + DayLabel = GetKoreanDayOfWeek(dow), + Value = (int)Math.Round(avg), + BarHeight = avg > 0 ? avg * MaxBarHeight / maxAvg : 2, + ValueLabel = avg > 0 ? avg.ToString("F1") : "", + ToolTipText = $"{GetKoreanDayOfWeek(dow)}요일 평균 {avg:F1}회 ({list.Count}일 데이터)", + IsToday = DateTime.Today.DayOfWeek == dow, + }); + } + } + + private void BuildTabChatRatios(List stats) + { + // 탭별 대화 비율 (30일 합계) + int chat = 0, cowork = 0, code = 0; + foreach (var s in stats) + { + chat += s.ChatCounts.GetValueOrDefault("Chat"); + cowork += s.ChatCounts.GetValueOrDefault("Cowork"); + code += s.ChatCounts.GetValueOrDefault("Code"); + } + int total = chat + cowork + code; + if (total == 0) total = 1; + + const double MaxWidth = 300.0; + TabChatRatios.Clear(); + TabChatRatios.Add(new TabRatioItem + { + TabName = "Chat", Count = chat, + Percentage = 100.0 * chat / total, + BarWidth = MaxWidth * chat / total, + PercentLabel = $"{100.0 * chat / total:F0}% ({chat}회)", + Color = ThemeResourceHelper.HexBrush("#818CF8") + }); + TabChatRatios.Add(new TabRatioItem + { + TabName = "Cowork", Count = cowork, + Percentage = 100.0 * cowork / total, + BarWidth = MaxWidth * cowork / total, + PercentLabel = $"{100.0 * cowork / total:F0}% ({cowork}회)", + Color = ThemeResourceHelper.HexBrush("#10B981") + }); + TabChatRatios.Add(new TabRatioItem + { + TabName = "Code", Count = code, + Percentage = 100.0 * code / total, + BarWidth = MaxWidth * code / total, + PercentLabel = $"{100.0 * code / total:F0}% ({code}회)", + Color = ThemeResourceHelper.HexBrush("#F59E0B") + }); + } + + private void BuildTokenRatio(List stats) + { + long prompt = stats.Sum(s => s.PromptTokens); + long completion = stats.Sum(s => s.CompletionTokens); + long total = prompt + completion; + if (total == 0) total = 1; + + const double TotalWidth = 400.0; + PromptBarWidth = TotalWidth * prompt / total; + CompletionBarWidth = TotalWidth * completion / total; + PromptTokenLabel = $"입력 {FormatTokens(prompt)} ({100.0 * prompt / total:F0}%)"; + CompletionTokenLabel = $"출력 {FormatTokens(completion)} ({100.0 * completion / total:F0}%)"; + TokenRatioSummary = $"30일 합계 입력 {FormatTokens(prompt)} + 출력 {FormatTokens(completion)} = {FormatTokens(prompt + completion)}"; + } + + private void BuildTopCommands(List stats) + { + // 30일 집계 + var aggregate = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var s in stats) + foreach (var (key, count) in s.CommandUsage) + { + aggregate.TryGetValue(key, out var cur); + aggregate[key] = cur + count; + } + + var top = aggregate + .OrderByDescending(kv => kv.Value) + .Take(10) + .ToList(); + + int maxCount = top.Count > 0 ? top[0].Value : 1; + + TopCommands.Clear(); + for (int i = 0; i < top.Count; i++) + { + TopCommands.Add(new CommandStatItem + { + Rank = i + 1, + Command = top[i].Key, + Count = top[i].Value, + BarWidth = MaxBarWidth * top[i].Value / maxCount + }); + } + } + + private void BuildSummaryCards(List stats, string today) + { + // 오늘 날짜 표시 + TodayDate = DateTime.Today.ToString("yyyy년 M월 d일"); + + // 오늘 통계 + var todayStat = stats.FirstOrDefault(s => s.Date == today); + TodaySummary = todayStat != null + ? $"{todayStat.LauncherOpens}회 호출 · {FormatActiveTime(todayStat.ActiveSeconds)}" + : "데이터 없음"; + + // 역대 최고 호출일 + var peakDay = stats.OrderByDescending(s => s.LauncherOpens).FirstOrDefault(); + if (peakDay != null && peakDay.LauncherOpens > 0) + { + PeakDate = DateTime.TryParse(peakDay.Date, out var pd) + ? pd.ToString("yyyy년 M월 d일") + : peakDay.Date; + PeakDaySummary = $"{peakDay.LauncherOpens}회 호출"; + } + else + { + PeakDate = ""; + PeakDaySummary = "기록 없음"; + } + + // 이번 주 합계 + var weekStart = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek); + var weekTotal = stats + .Where(s => DateTime.TryParse(s.Date, out var d) && d >= weekStart) + .Sum(s => s.LauncherOpens); + WeekSummary = $"이번 주 {weekTotal}회"; + + // 30일 총 호출 + var totalOpens = stats.Sum(s => s.LauncherOpens); + TotalOpensSummary = $"30일 합계 {totalOpens}회"; + + // AX Agent 요약 + var totalChats = stats.Sum(s => s.ChatCounts.Values.Sum()); + var totalTokens = stats.Sum(s => s.TotalTokens); + var todayChats = todayStat?.ChatCounts.Values.Sum() ?? 0; + var todayTokens = todayStat?.TotalTokens ?? 0; + AgentSummary = $"오늘 {todayChats}회 대화 · {FormatTokens(todayTokens)} 토큰 | 30일 합계 {totalChats}회 · {FormatTokens(totalTokens)} 토큰"; + } + + private void BuildTopFavorites() + { + TopFavorites.Clear(); + var favFile = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "favorites.json"); + + if (!File.Exists(favFile)) { HasFavorites = false; return; } + + try + { + var opts = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; + var list = JsonSerializer.Deserialize>(File.ReadAllText(favFile), opts) ?? new(); + + var top = list.Take(6).ToList(); + if (top.Count == 0) { HasFavorites = false; return; } + + for (int i = 0; i < top.Count; i++) + { + var entry = top[i]; + var expanded = Environment.ExpandEnvironmentVariables(entry.Path); + var isDir = Directory.Exists(expanded); + var exists = isDir || File.Exists(expanded); + TopFavorites.Add(new FavoriteStatItem + { + Rank = i + 1, + Name = entry.Name, + Path = entry.Path, + Icon = isDir ? "\uE8B7" : "\uE8A5", // Folder / Page + Exists = exists + }); + } + HasFavorites = TopFavorites.Count > 0; + } + catch (Exception) { HasFavorites = false; } + } + + // favorites.json 역직렬화용 내부 레코드 + private class FavFileEntry + { + [JsonPropertyName("name")] public string Name { get; set; } = ""; + [JsonPropertyName("path")] public string Path { get; set; } = ""; + } + + // ─── 헬퍼 ──────────────────────────────────────────────────────────────── + + private static string GetKoreanDayOfWeek(DayOfWeek dow) => dow switch + { + DayOfWeek.Monday => "월", + DayOfWeek.Tuesday => "화", + DayOfWeek.Wednesday => "수", + DayOfWeek.Thursday => "목", + DayOfWeek.Friday => "금", + DayOfWeek.Saturday => "토", + _ => "일" + }; + + private static string FormatActiveTime(int totalSeconds) + { + if (totalSeconds <= 0) return ""; + int h = totalSeconds / 3600; + int m = (totalSeconds % 3600) / 60; + if (h > 0 && m > 0) return $"{h}시간 {m}분"; + if (h > 0) return $"{h}시간"; + if (m > 0) return $"{m}분"; + return $"{totalSeconds}초"; + } + + public event PropertyChangedEventHandler? PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); +} diff --git a/src/AxCopilot/Views/AboutWindow.xaml b/src/AxCopilot/Views/AboutWindow.xaml new file mode 100644 index 0000000..c1da7b9 --- /dev/null +++ b/src/AxCopilot/Views/AboutWindow.xaml @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/ChatWindow.xaml.cs b/src/AxCopilot/Views/ChatWindow.xaml.cs new file mode 100644 index 0000000..dd22700 --- /dev/null +++ b/src/AxCopilot/Views/ChatWindow.xaml.cs @@ -0,0 +1,4767 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Threading; +using AxCopilot.Models; +using AxCopilot.Services; +using AxCopilot.Services.Agent; + +namespace AxCopilot.Views; + +/// AX Agent 창. Claude Desktop 스타일 — 사이드바 + 카테고리 분류 + 타임라인. +public partial class ChatWindow : Window +{ + private readonly SettingsService _settings; + /// LLM 설정 바로가기 — _settings.Settings.Llm 체인 액세스 단축. + private LlmSettings Llm => _settings.Settings.Llm; + /// App 인스턴스 바로가기 — Application.Current as App 반복 호출 제거. + private static App? CurrentApp => System.Windows.Application.Current as App; + private readonly ChatStorageService _storage; + private readonly LlmService _llm; + private readonly ToolRegistry _toolRegistry; + private readonly AgentLoopService _agentLoop; + private readonly ModelRouterService _router; + private readonly object _convLock = new(); + private ChatConversation? _currentConversation; + private CancellationTokenSource? _streamCts; + private bool _isStreaming; + private bool _sidebarVisible = true; + private string _selectedCategory = ""; // "" = 전체 + private bool _forceClose = false; // 앱 종료 시 진짜 닫기 플래그 + + // 스트리밍 UI — 커서 깜빡임 + 로딩 아이콘 + private readonly DispatcherTimer _cursorTimer; + private bool _cursorVisible = true; + private TextBlock? _activeStreamText; + private string _cachedStreamContent = ""; // sb.ToString() 캐시 — 중복 호출 방지 + private TextBlock? _activeAiIcon; // 로딩 펄스 중인 AI 아이콘 + private bool _aiIconPulseStopped; // 펄스 1회만 중지 + private WorkflowAnalyzerWindow? _analyzerWindow; // 워크플로우 분석기 + private PlanViewerWindow? _planViewerWindow; // 실행 계획 뷰어 + private bool _userScrolled; // 사용자가 위로 스크롤했는지 + + // 경과 시간 표시 + private readonly DispatcherTimer _elapsedTimer; + private DateTime _streamStartTime; + private TextBlock? _elapsedLabel; + + // 타이핑 효과 + private readonly DispatcherTimer _typingTimer; + private int _displayedLength; // 현재 화면에 표시된 글자 수 + + private sealed class ConversationMeta + { + public string Id { get; init; } = ""; + public string Title { get; init; } = ""; + public string UpdatedAtText { get; init; } = ""; + public bool Pinned { get; init; } + public string Category { get; init; } = ChatCategory.General; + public string Symbol { get; init; } = "\uE8BD"; + public string ColorHex { get; init; } = "#6B7280"; + public string Tab { get; init; } = "Chat"; + public DateTime UpdatedAt { get; init; } + /// 첫 사용자 메시지 요약 (검색용, 최대 100자). + public string Preview { get; init; } = ""; + /// 분기 원본 대화 ID. null이면 원본 대화. + public string? ParentId { get; init; } + } + + public ChatWindow(SettingsService settings) + { + InitializeComponent(); + _settings = settings; + _storage = new ChatStorageService(); + _llm = new LlmService(settings); + _router = new ModelRouterService(settings); + _toolRegistry = ToolRegistry.CreateDefault(); + _agentLoop = new AgentLoopService(_llm, _toolRegistry, settings) + { + Dispatcher = action => System.Windows.Application.Current.Dispatcher.Invoke(action), + AskPermissionCallback = async (toolName, filePath) => + { + var result = MessageBoxResult.None; + await System.Windows.Application.Current.Dispatcher.InvokeAsync(() => + { + result = CustomMessageBox.Show( + $"도구 '{toolName}'이(가) 다음 파일에 접근하려 합니다:\n\n{filePath}\n\n허용하시겠습니까?", + "AX Agent — 권한 확인", + MessageBoxButton.YesNo, + MessageBoxImage.Question); + }); + return result == MessageBoxResult.Yes; + }, + UserAskCallback = async (question, options, defaultValue) => + { + string? response = null; + await System.Windows.Application.Current.Dispatcher.InvokeAsync(() => + { + response = UserAskDialog.Show(question, options, defaultValue); + }); + return response; + }, + }; + + // 설정에서 초기값 로드 (Loaded 전에도 null 방지) + _selectedMood = settings.Settings.Llm.DefaultMood ?? "modern"; + _folderDataUsage = settings.Settings.Llm.FolderDataUsage ?? "active"; + + _cursorTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(530) }; + _cursorTimer.Tick += CursorTimer_Tick; + + _elapsedTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; + _elapsedTimer.Tick += ElapsedTimer_Tick; + + _typingTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(12) }; + _typingTimer.Tick += TypingTimer_Tick; + + KeyDown += ChatWindow_KeyDown; + Loaded += (_, _) => + { + // ── 즉시 필요한 UI 초기화만 동기 실행 ── + SetupUserInfo(); + _selectedMood = Llm.DefaultMood ?? "modern"; + _folderDataUsage = Llm.FolderDataUsage ?? "active"; + UpdateAnalyzerButtonVisibility(); + UpdateModelLabel(); + UpdatePlanModeUI(); + InputBox.Focus(); + MessageScroll.ScrollChanged += MessageScroll_ScrollChanged; + + // ── 무거운 작업은 유휴 시점에 비동기 실행 ── + Dispatcher.BeginInvoke(() => + { + TemplateService.LoadCustomMoods(Llm.CustomMoods); + BuildTopicButtons(); + RestoreLastConversations(); + RefreshConversationList(); + + // 데이터 정리 (디스크 I/O) + _ = Task.Run(() => + { + var retention = Llm.RetentionDays; + if (retention > 0) _storage.PurgeExpired(retention); + _storage.PurgeForDiskSpace(); + }); + }, System.Windows.Threading.DispatcherPriority.ApplicationIdle); + + // 입력 바 포커스 글로우 효과 + var accentBrush = ThemeResourceHelper.Accent(this); + var borderBrush = ThemeResourceHelper.Border(this); + InputBox.GotFocus += (_, _) => InputBorder.BorderBrush = accentBrush; + InputBox.LostFocus += (_, _) => InputBorder.BorderBrush = borderBrush; + + // 드래그 앤 드롭 파일 첨부 + AI 액션 팝업 + InputBorder.AllowDrop = true; + InputBorder.DragOver += (_, de) => + { + de.Effects = de.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None; + de.Handled = true; + }; + InputBorder.Drop += (_, de) => + { + if (de.Data.GetData(DataFormats.FileDrop) is string[] files && files.Length > 0) + { + var enableAi = Llm.EnableDragDropAiActions; + if (enableAi && files.Length <= 5) + ShowDropActionMenu(files); + else + foreach (var f in files) AddAttachedFile(f); + } + }; + + // 스킬 시스템 초기화 + if (Llm.EnableSkillSystem) + { + SkillService.EnsureSkillFolder(); + SkillService.LoadSkills(Llm.SkillsFolderPath); + } + + // 슬래시 팝업 네비게이션 버튼 + SlashNavUp.MouseLeftButtonUp += (_, _) => + { + _slashPageOffset = Math.Max(0, _slashPageOffset - SlashPageSize); + RenderSlashPage(); + }; + SlashNavDown.MouseLeftButtonUp += (_, _) => + { + _slashPageOffset = Math.Min(_slashAllMatches.Count - 1, + _slashPageOffset + SlashPageSize); + RenderSlashPage(); + }; + + // 슬래시 명령어 칩 닫기 (× 버튼) + SlashChipClose.MouseLeftButtonUp += (_, _) => + { + HideSlashChip(restoreText: true); + InputBox.Focus(); + }; + + // InputBox에서 슬래시 팝업 열린 상태로 마우스 휠 → 팝업 스크롤 + InputBox.PreviewMouseWheel += (_, me) => + { + if (!SlashPopup.IsOpen) return; + me.Handled = true; + SlashPopup_ScrollByDelta(me.Delta); + }; + + // 탭 UI 초기 상태 + UpdateFolderBar(); + + // 호버 애니메이션 — 독립 공간이 있는 버튼에만 Scale 적용 + // (GhostBtn 스타일 버튼은 XAML에서 배경색+opacity 호버 처리) + ApplyHoverBounceAnimation(BtnModelSelector); + ApplyHoverBounceAnimation(BtnTemplateSelector, -1.5); + ApplyHoverScaleAnimation(BtnSend, 1.12); + ApplyHoverScaleAnimation(BtnStop, 1.12); + }; + Closed += (_, _) => + { + _streamCts?.Cancel(); + _cursorTimer.Stop(); + _elapsedTimer.Stop(); + _typingTimer.Stop(); + _llm.Dispose(); + }; + } + + /// + /// X 버튼으로 닫을 때 창을 숨기기만 합니다 (재사용으로 다음 번 빠르게 열림). + /// 앱 종료 시에는 ForceClose()를 사용합니다. + /// + protected override void OnClosing(System.ComponentModel.CancelEventArgs e) + { + if (!_forceClose) + { + e.Cancel = true; + Hide(); + return; + } + base.OnClosing(e); + } + + /// 앱 종료 시 창을 실제로 닫습니다. + public void ForceClose() + { + // 현재 대화 저장 + 탭별 마지막 대화 ID를 설정에 영속 저장 + lock (_convLock) + { + if (_currentConversation != null && _currentConversation.Messages.Count > 0) + { + _tabConversationId[_activeTab] = _currentConversation.Id; + try { _storage.Save(_currentConversation); } catch (Exception) { /* 대화 저장 실패 — UI 차단 방지 */ } + } + } + SaveLastConversations(); + + _forceClose = true; + Close(); + } + + // ─── 사용자 정보 ──────────────────────────────────────────────────── + + private void SetupUserInfo() + { + var userName = Environment.UserName; + // AD\, AD/, AD: 접두사 제거 + var cleanName = userName; + foreach (var sep in new[] { '\\', '/', ':' }) + { + var idx = cleanName.LastIndexOf(sep); + if (idx >= 0) cleanName = cleanName[(idx + 1)..]; + } + + var initial = cleanName.Length > 0 ? cleanName[..1].ToUpper() : "U"; + var pcName = Environment.MachineName; + + UserInitialSidebar.Text = initial; + UserInitialIconBar.Text = initial; + UserNameText.Text = cleanName; + UserPcText.Text = pcName; + BtnUserIconBar.ToolTip = $"{cleanName} ({pcName})"; + } + + // ─── 스크롤 동작 ────────────────────────────────────────────────── + + private void MessageScroll_ScrollChanged(object sender, ScrollChangedEventArgs e) + { + // 스크롤 가능 영역이 없으면(콘텐츠가 짧음) 항상 바닥 + if (MessageScroll.ScrollableHeight <= 1) + { + _userScrolled = false; + return; + } + + // 콘텐츠 크기 변경(ExtentHeightChange > 0)에 의한 스크롤은 무시 — 사용자 조작만 감지 + if (Math.Abs(e.ExtentHeightChange) > 0.5) + return; + + var atBottom = MessageScroll.VerticalOffset >= MessageScroll.ScrollableHeight - 40; + _userScrolled = !atBottom; + } + + private void AutoScrollIfNeeded() + { + if (!_userScrolled) + SmoothScrollToEnd(); + } + + /// 새 응답 시작 시 강제로 하단 스크롤합니다 (사용자 스크롤 상태 리셋). + private void ForceScrollToEnd() + { + _userScrolled = false; + Dispatcher.InvokeAsync(() => SmoothScrollToEnd(), DispatcherPriority.Background); + } + + /// 부드러운 자동 스크롤 — 하단으로 부드럽게 이동합니다. + private void SmoothScrollToEnd() + { + var targetOffset = MessageScroll.ScrollableHeight; + var currentOffset = MessageScroll.VerticalOffset; + var diff = targetOffset - currentOffset; + + // 차이가 작으면 즉시 이동 (깜빡임 방지) + if (diff <= 60) + { + MessageScroll.ScrollToEnd(); + return; + } + + // 부드럽게 스크롤 (DoubleAnimation) + var animation = new DoubleAnimation + { + From = currentOffset, + To = targetOffset, + Duration = TimeSpan.FromMilliseconds(200), + EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut }, + }; + animation.Completed += (_, _) => MessageScroll.ScrollToVerticalOffset(targetOffset); + + // ScrollViewer에 직접 애니메이션을 적용할 수 없으므로 타이머 기반으로 보간 + var startTime = DateTime.UtcNow; + var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(16) }; // ~60fps + EventHandler tickHandler = null!; + tickHandler = (_, _) => + { + var elapsed = (DateTime.UtcNow - startTime).TotalMilliseconds; + var progress = Math.Min(elapsed / 200.0, 1.0); + var eased = 1.0 - Math.Pow(1.0 - progress, 3); + var offset = currentOffset + diff * eased; + MessageScroll.ScrollToVerticalOffset(offset); + + if (progress >= 1.0) + { + timer.Stop(); + timer.Tick -= tickHandler; + } + }; + timer.Tick += tickHandler; + timer.Start(); + } + + // ─── 대화 제목 인라인 편집 ────────────────────────────────────────── + + private void ChatTitle_MouseDown(object sender, MouseButtonEventArgs e) + { + lock (_convLock) + { + if (_currentConversation == null) return; + } + ChatTitle.Visibility = Visibility.Collapsed; + ChatTitleEdit.Text = ChatTitle.Text; + ChatTitleEdit.Visibility = Visibility.Visible; + ChatTitleEdit.Focus(); + ChatTitleEdit.SelectAll(); + } + + private void ChatTitleEdit_LostFocus(object sender, RoutedEventArgs e) => CommitTitleEdit(); + private void ChatTitleEdit_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Enter) { CommitTitleEdit(); e.Handled = true; } + if (e.Key == Key.Escape) { CancelTitleEdit(); e.Handled = true; } + } + + private void CommitTitleEdit() + { + var newTitle = ChatTitleEdit.Text.Trim(); + ChatTitleEdit.Visibility = Visibility.Collapsed; + ChatTitle.Visibility = Visibility.Visible; + + if (string.IsNullOrEmpty(newTitle)) return; + + lock (_convLock) + { + if (_currentConversation == null) return; + _currentConversation.Title = newTitle; + } + + ChatTitle.Text = newTitle; + try + { + ChatConversation conv; + lock (_convLock) conv = _currentConversation!; + _storage.Save(conv); + } + catch (Exception) { /* 대화 저장 실패 — UI 차단 방지 */ } + RefreshConversationList(); + } + + private void CancelTitleEdit() + { + ChatTitleEdit.Visibility = Visibility.Collapsed; + ChatTitle.Visibility = Visibility.Visible; + } + + // ─── 카테고리 드롭다운 ────────────────────────────────────────────── + + private void BtnCategoryDrop_Click(object sender, RoutedEventArgs e) + { + var borderBrush = ThemeResourceHelper.Border(this); + var primaryText = ThemeResourceHelper.Primary(this); + var secondaryText = ThemeResourceHelper.Secondary(this); + var hoverBg = ThemeResourceHelper.HoverBg(this); + var accentBrush = ThemeResourceHelper.Accent(this); + + var (popup, stack) = PopupMenuHelper.Create(BtnCategoryDrop, this, PlacementMode.Bottom, minWidth: 180); + popup.VerticalOffset = 4; + + Border CreateCatItem(string icon, string text, Brush iconColor, bool isSelected, Action onClick) + { + var item = new Border + { + Background = Brushes.Transparent, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(10, 7, 10, 7), + Margin = new Thickness(0, 1, 0, 1), + Cursor = Cursors.Hand, + }; + var g = new Grid(); + g.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(24) }); + g.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + g.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(20) }); + + var iconTb = new TextBlock + { + Text = icon, FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 12, Foreground = iconColor, VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(iconTb, 0); + g.Children.Add(iconTb); + + var textTb = new TextBlock + { + Text = text, FontSize = 12.5, Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(textTb, 1); + g.Children.Add(textTb); + + if (isSelected) + { + var check = CreateSimpleCheck(accentBrush, 14); + Grid.SetColumn(check, 2); + g.Children.Add(check); + } + + item.Child = g; + item.MouseEnter += (s, _) => { if (s is Border b) b.Background = hoverBg; }; + item.MouseLeave += (s, _) => { if (s is Border b) b.Background = Brushes.Transparent; }; + item.MouseLeftButtonUp += (_, _) => { popup.IsOpen = false; onClick(); }; + return item; + } + + Border CreateSep() => new() + { + Height = 1, Background = borderBrush, Opacity = 0.3, Margin = new Thickness(8, 4, 8, 4), + }; + + // 전체 보기 + var allLabel = _activeTab switch + { + "Cowork" => "모든 작업", + "Code" => "모든 작업", + _ => "모든 주제", + }; + stack.Children.Add(CreateCatItem("\uE8BD", allLabel, secondaryText, + string.IsNullOrEmpty(_selectedCategory), + () => { _selectedCategory = ""; UpdateCategoryLabel(); RefreshConversationList(); })); + + stack.Children.Add(CreateSep()); + + if (_activeTab == "Cowork" || _activeTab == "Code") + { + // 코워크/코드: 프리셋 카테고리 기반 필터 + var presets = Services.PresetService.GetByTabWithCustom(_activeTab, Llm.CustomPresets); + var seen = new HashSet(); + foreach (var p in presets) + { + if (p.IsCustom) continue; // 커스텀은 별도 그룹 + if (!seen.Add(p.Category)) continue; + var capturedCat = p.Category; + stack.Children.Add(CreateCatItem(p.Symbol, p.Label, BrushFromHex(p.Color), + _selectedCategory == capturedCat, + () => { _selectedCategory = capturedCat; UpdateCategoryLabel(); RefreshConversationList(); })); + } + // 커스텀 프리셋 통합 필터 + if (presets.Any(p => p.IsCustom)) + { + stack.Children.Add(CreateSep()); + stack.Children.Add(CreateCatItem("\uE710", "커스텀 프리셋", secondaryText, + _selectedCategory == "__custom__", + () => { _selectedCategory = "__custom__"; UpdateCategoryLabel(); RefreshConversationList(); })); + } + } + else + { + // Chat: 기존 ChatCategory 기반 + foreach (var (key, label, symbol, color) in ChatCategory.All) + { + var capturedKey = key; + stack.Children.Add(CreateCatItem(symbol, label, BrushFromHex(color), + _selectedCategory == capturedKey, + () => { _selectedCategory = capturedKey; UpdateCategoryLabel(); RefreshConversationList(); })); + } + // 커스텀 프리셋 통합 필터 (Chat) + var chatCustom = Llm.CustomPresets.Where(c => c.Tab == "Chat").ToList(); + if (chatCustom.Count > 0) + { + stack.Children.Add(CreateSep()); + stack.Children.Add(CreateCatItem("\uE710", "커스텀 프리셋", secondaryText, + _selectedCategory == "__custom__", + () => { _selectedCategory = "__custom__"; UpdateCategoryLabel(); RefreshConversationList(); })); + } + } + + popup.IsOpen = true; + } + + private void UpdateCategoryLabel() + { + if (string.IsNullOrEmpty(_selectedCategory)) + { + CategoryLabel.Text = _activeTab switch { "Cowork" or "Code" => "모든 작업", _ => "모든 주제" }; + CategoryIcon.Text = "\uE8BD"; + } + else if (_selectedCategory == "__custom__") + { + CategoryLabel.Text = "커스텀 프리셋"; + CategoryIcon.Text = "\uE710"; + } + else + { + // ChatCategory에서 찾기 + foreach (var (key, label, symbol, _) in ChatCategory.All) + { + if (key == _selectedCategory) + { + CategoryLabel.Text = label; + CategoryIcon.Text = symbol; + return; + } + } + // 프리셋 카테고리에서 찾기 (Cowork/Code) + var presets = Services.PresetService.GetByTabWithCustom(_activeTab, Llm.CustomPresets); + var match = presets.FirstOrDefault(p => p.Category == _selectedCategory); + if (match != null) + { + CategoryLabel.Text = match.Label; + CategoryIcon.Text = match.Symbol; + } + else + { + CategoryLabel.Text = _selectedCategory; + CategoryIcon.Text = "\uE8BD"; + } + } + } + + // ─── 창 컨트롤 ────────────────────────────────────────────────────── + + // WindowChrome의 CaptionHeight가 드래그를 처리하므로 별도 핸들러 불필요 + + protected override void OnSourceInitialized(EventArgs e) + { + base.OnSourceInitialized(e); + var source = System.Windows.Interop.HwndSource.FromHwnd( + new System.Windows.Interop.WindowInteropHelper(this).Handle); + source?.AddHook(WndProc); + } + + private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + // WM_GETMINMAXINFO — 최대화 시 작업 표시줄 영역 확보 + if (msg == 0x0024) + { + var screen = System.Windows.Forms.Screen.FromHandle(hwnd); + var workArea = screen.WorkingArea; + var monitor = screen.Bounds; + + var source = System.Windows.Interop.HwndSource.FromHwnd(hwnd); + var dpiScale = source?.CompositionTarget?.TransformToDevice.M11 ?? 1.0; + + // MINMAXINFO: ptReserved(0,4) ptMaxSize(8,12) ptMaxPosition(16,20) ptMinTrackSize(24,28) ptMaxTrackSize(32,36) + System.Runtime.InteropServices.Marshal.WriteInt32(lParam, 8, workArea.Width); // ptMaxSize.cx + System.Runtime.InteropServices.Marshal.WriteInt32(lParam, 12, workArea.Height); // ptMaxSize.cy + System.Runtime.InteropServices.Marshal.WriteInt32(lParam, 16, workArea.Left - monitor.Left); // ptMaxPosition.x + System.Runtime.InteropServices.Marshal.WriteInt32(lParam, 20, workArea.Top - monitor.Top); // ptMaxPosition.y + handled = true; + } + return IntPtr.Zero; + } + + private void BtnMinimize_Click(object sender, RoutedEventArgs e) => WindowState = WindowState.Minimized; + private void BtnMaximize_Click(object sender, RoutedEventArgs e) + { + WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized; + MaximizeIcon.Text = WindowState == WindowState.Maximized ? "\uE923" : "\uE739"; // 복원/최대화 아이콘 + } + private void BtnClose_Click(object sender, RoutedEventArgs e) => Close(); + + // ─── 탭 전환 ────────────────────────────────────────────────────────── + + private string _activeTab = "Chat"; + + private void SaveCurrentTabConversationId() + { + lock (_convLock) + { + if (_currentConversation != null && _currentConversation.Messages.Count > 0) + { + _tabConversationId[_activeTab] = _currentConversation.Id; + // 탭 전환 시 현재 대화를 즉시 저장 (스트리밍 중이어도 진행 중인 내용 보존) + try { _storage.Save(_currentConversation); } catch (Exception) { /* 대화 저장 실패 — UI 차단 방지 */ } + } + } + // 탭별 마지막 대화 ID를 설정에 영속 저장 (앱 재시작 시 복원용) + SaveLastConversations(); + } + + /// 탭 전환 전 스트리밍 중이면 즉시 중단합니다. + private void StopStreamingIfActive() + { + if (!_isStreaming) return; + // 스트리밍 중단 + _streamCts?.Cancel(); + _cursorTimer.Stop(); + _elapsedTimer.Stop(); + _typingTimer.Stop(); + StopRainbowGlow(); + HideStickyProgress(); + _activeStreamText = null; + _elapsedLabel = null; + _cachedStreamContent = ""; + _isStreaming = false; + BtnSend.IsEnabled = true; + BtnStop.Visibility = Visibility.Collapsed; + BtnPause.Visibility = Visibility.Collapsed; + PauseIcon.Text = "\uE769"; // 리셋 + BtnSend.Visibility = Visibility.Visible; + _streamCts?.Dispose(); + _streamCts = null; + SetStatusIdle(); + } + + private void TabChat_Checked(object sender, RoutedEventArgs e) + { + if (_activeTab == "Chat") return; + StopStreamingIfActive(); + SaveCurrentTabConversationId(); + _activeTab = "Chat"; + _selectedCategory = ""; UpdateCategoryLabel(); + UpdateTabUI(); + UpdatePlanModeUI(); + } + + private void TabCowork_Checked(object sender, RoutedEventArgs e) + { + if (_activeTab == "Cowork") return; + StopStreamingIfActive(); + SaveCurrentTabConversationId(); + _activeTab = "Cowork"; + _selectedCategory = ""; UpdateCategoryLabel(); + UpdateTabUI(); + UpdatePlanModeUI(); + } + + private void TabCode_Checked(object sender, RoutedEventArgs e) + { + if (_activeTab == "Code") return; + StopStreamingIfActive(); + SaveCurrentTabConversationId(); + _activeTab = "Code"; + _selectedCategory = ""; UpdateCategoryLabel(); + UpdateTabUI(); + UpdatePlanModeUI(); + } + + /// 탭별로 마지막으로 활성화된 대화 ID를 기억. + private readonly Dictionary _tabConversationId = new() + { + ["Chat"] = null, ["Cowork"] = null, ["Code"] = null, + }; + + private void UpdateTabUI() + { + // 폴더 바는 Cowork/Code 탭에서만 표시 + if (FolderBar != null) + FolderBar.Visibility = _activeTab != "Chat" ? Visibility.Visible : Visibility.Collapsed; + + // 탭별 입력 안내 문구 + if (InputWatermark != null) + { + InputWatermark.Text = _activeTab switch + { + "Cowork" => "에이전트에게 작업을 요청하세요 (파일 읽기/쓰기, 문서 생성...)", + "Code" => "코드 관련 작업을 요청하세요...", + _ => _promptCardPlaceholder, + }; + } + + // 권한 기본값 적용 (Cowork/Code 탭은 설정의 기본값 사용) + ApplyTabDefaultPermission(); + + // 포맷/디자인 드롭다운은 Cowork 탭에서만 표시 + if (_activeTab == "Cowork") + { + BuildBottomBar(); + if (Llm.ShowFileBrowser && FileBrowserPanel != null) + { + FileBrowserPanel.Visibility = Visibility.Visible; + BuildFileTree(); + } + } + else if (_activeTab == "Code") + { + // Code 탭: 언어 선택기 + 파일 탐색기 + BuildCodeBottomBar(); + if (Llm.ShowFileBrowser && FileBrowserPanel != null) + { + FileBrowserPanel.Visibility = Visibility.Visible; + BuildFileTree(); + } + } + else + { + MoodIconPanel.Children.Clear(); + if (FormatMoodSeparator != null) FormatMoodSeparator.Visibility = Visibility.Collapsed; + if (FileBrowserPanel != null) FileBrowserPanel.Visibility = Visibility.Collapsed; + } + + // 탭별 프리셋 버튼 재구성 + BuildTopicButtons(); + + // 현재 대화를 해당 탭 대화로 전환 + SwitchToTabConversation(); + + // Cowork/Code 탭 전환 시 팁 표시 + ShowRandomTip(); + } + + private void BtnPlanMode_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + // 3단 순환: off → auto → always → off + Llm.PlanMode = Llm.PlanMode switch + { + "auto" => "always", + "always" => "off", + _ => "auto" + }; + _settings.Save(); + UpdatePlanModeUI(); + } + + private void UpdatePlanModeUI() + { + var planMode = Llm.PlanMode ?? "off"; + if (PlanModeValue == null) return; + + PlanModeValue.Text = planMode switch + { + "auto" => "Auto", + "always" => "Always", + _ => "Off" + }; + var isActive = planMode != "off"; + var activeBrush = ThemeResourceHelper.Accent(this); + var secondaryBrush = ThemeResourceHelper.Secondary(this); + if (PlanModeIcon != null) PlanModeIcon.Foreground = isActive ? activeBrush : secondaryBrush; + if (PlanModeLabel != null) PlanModeLabel.Foreground = isActive ? activeBrush : secondaryBrush; + if (BtnPlanMode != null) + BtnPlanMode.Background = isActive + ? new SolidColorBrush(Color.FromArgb(0x1A, 0x4B, 0x5E, 0xFC)) + : Brushes.Transparent; + } + + private void SwitchToTabConversation() + { + // 이전 탭의 대화 저장 + lock (_convLock) + { + if (_currentConversation != null && _currentConversation.Messages.Count > 0) + { + try { _storage.Save(_currentConversation); } catch (Exception) { /* 대화 저장 실패 — UI 차단 방지 */ } + } + } + + // 현재 탭에 기억된 대화가 있으면 복원 + var savedId = _tabConversationId.GetValueOrDefault(_activeTab); + if (!string.IsNullOrEmpty(savedId)) + { + var conv = _storage.Load(savedId); + if (conv != null) + { + if (string.IsNullOrEmpty(conv.Tab)) conv.Tab = _activeTab; + lock (_convLock) _currentConversation = conv; + MessagePanel.Children.Clear(); + foreach (var msg in conv.Messages) + AddMessageBubble(msg.Role, msg.Content, animate: false, message: msg); + EmptyState.Visibility = conv.Messages.Count > 0 ? Visibility.Collapsed : Visibility.Visible; + UpdateChatTitle(); + RefreshConversationList(); + UpdateFolderBar(); + return; + } + } + + // 기억된 대화가 없으면 새 대화 + lock (_convLock) + { + _currentConversation = new ChatConversation { Tab = _activeTab }; + var workFolder = Llm.WorkFolder; + if (!string.IsNullOrEmpty(workFolder) && _activeTab != "Chat") + _currentConversation.WorkFolder = workFolder; + } + MessagePanel.Children.Clear(); + EmptyState.Visibility = Visibility.Visible; + _attachedFiles.Clear(); + RefreshAttachedFilesUI(); + UpdateChatTitle(); + RefreshConversationList(); + UpdateFolderBar(); + } + + // ─── 작업 폴더 ───────────────────────────────────────────────────────── + + private readonly List _attachedFiles = new(); + private readonly List _pendingImages = new(); + + private void FolderPathLabel_Click(object sender, MouseButtonEventArgs e) => ShowFolderMenu(); + + private void ShowFolderMenu() + { + FolderMenuItems.Children.Clear(); + + var accentBrush = ThemeResourceHelper.Accent(this); + var primaryText = ThemeResourceHelper.Primary(this); + var secondaryText = ThemeResourceHelper.Secondary(this); + + // 최근 폴더 목록 + var maxDisplay = Math.Clamp(Llm.MaxRecentFolders, 3, 30); + var recentFolders = Llm.RecentWorkFolders + .Where(p => IsPathAllowed(p) && System.IO.Directory.Exists(p)) + .Take(maxDisplay) + .ToList(); + + if (recentFolders.Count > 0) + { + FolderMenuItems.Children.Add(new TextBlock + { + Text = "최근 폴더", + FontSize = 12.5, + FontWeight = FontWeights.SemiBold, + Foreground = secondaryText, + Margin = new Thickness(10, 6, 10, 4), + }); + + var currentFolder = GetCurrentWorkFolder(); + foreach (var folder in recentFolders) + { + var isActive = folder.Equals(currentFolder, StringComparison.OrdinalIgnoreCase); + var displayName = System.IO.Path.GetFileName(folder); + if (string.IsNullOrEmpty(displayName)) displayName = folder; + + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + if (isActive) + { + var checkEl = CreateSimpleCheck(accentBrush, 14); + checkEl.Margin = new Thickness(0, 0, 8, 0); + sp.Children.Add(checkEl); + } + var nameBlock = new TextBlock + { + Text = displayName, + FontSize = 14, + FontWeight = isActive ? FontWeights.SemiBold : FontWeights.Normal, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + MaxWidth = 340, + TextTrimming = TextTrimming.CharacterEllipsis, + }; + sp.Children.Add(nameBlock); + + var itemBorder = new Border + { + Child = sp, + Background = Brushes.Transparent, + CornerRadius = new CornerRadius(8), + Cursor = Cursors.Hand, + Padding = new Thickness(10, 7, 10, 7), + ToolTip = folder, + }; + itemBorder.MouseEnter += (s, _) => { if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); }; + itemBorder.MouseLeave += (s, _) => { if (s is Border b) b.Background = Brushes.Transparent; }; + var capturedPath = folder; + itemBorder.MouseLeftButtonUp += (_, _) => + { + FolderMenuPopup.IsOpen = false; + SetWorkFolder(capturedPath); + }; + // 우클릭 → 컨텍스트 메뉴 (삭제, 폴더 열기) + itemBorder.MouseRightButtonUp += (_, re) => + { + re.Handled = true; + ShowRecentFolderContextMenu(capturedPath); + }; + FolderMenuItems.Children.Add(itemBorder); + } + + // 구분선 + FolderMenuItems.Children.Add(new Border + { + Height = 1, + Background = ThemeResourceHelper.Border(this), + Margin = new Thickness(8, 4, 8, 4), + Opacity = 0.5, + }); + } + + // 폴더 찾아보기 버튼 + var browseSp = new StackPanel { Orientation = Orientation.Horizontal }; + browseSp.Children.Add(new TextBlock + { + Text = "\uED25", + FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 14, + Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 8, 0), + }); + browseSp.Children.Add(new TextBlock + { + Text = "폴더 찾아보기...", + FontSize = 14, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + var browseBorder = new Border + { + Child = browseSp, + Background = Brushes.Transparent, + CornerRadius = new CornerRadius(8), + Cursor = Cursors.Hand, + Padding = new Thickness(10, 7, 10, 7), + }; + browseBorder.MouseEnter += (s, _) => { if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); }; + browseBorder.MouseLeave += (s, _) => { if (s is Border b) b.Background = Brushes.Transparent; }; + browseBorder.MouseLeftButtonUp += (_, _) => + { + FolderMenuPopup.IsOpen = false; + BrowseWorkFolder(); + }; + FolderMenuItems.Children.Add(browseBorder); + + FolderMenuPopup.IsOpen = true; + } + + private void BrowseWorkFolder() + { + var dlg = new System.Windows.Forms.FolderBrowserDialog + { + Description = "작업 폴더를 선택하세요", + ShowNewFolderButton = false, + UseDescriptionForTitle = true, + }; + + var currentFolder = GetCurrentWorkFolder(); + if (!string.IsNullOrEmpty(currentFolder) && System.IO.Directory.Exists(currentFolder)) + dlg.SelectedPath = currentFolder; + + if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + if (!IsPathAllowed(dlg.SelectedPath)) + { + CustomMessageBox.Show("이 경로는 작업 폴더로 선택할 수 없습니다.", "경로 제한", MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + + SetWorkFolder(dlg.SelectedPath); + } + + /// 경로 유효성 검사 — 차단 대상 경로 필터링. + private static bool IsPathAllowed(string path) + { + if (string.IsNullOrWhiteSpace(path)) return false; + // C:\ 루트 차단 + var normalized = path.TrimEnd('\\', '/'); + if (normalized.Equals("C:", StringComparison.OrdinalIgnoreCase)) return false; + // "Document" 포함 경로 차단 (대소문자 무시) + if (path.IndexOf("Document", StringComparison.OrdinalIgnoreCase) >= 0) return false; + return true; + } + + private void SetWorkFolder(string path) + { + // 루트 드라이브 전체를 작업공간으로 설정하는 것을 차단 + // 예: "C:\", "D:\", "E:\" 등 + var fullPath = System.IO.Path.GetFullPath(path); + var root = System.IO.Path.GetPathRoot(fullPath); + if (!string.IsNullOrEmpty(root) && fullPath.TrimEnd('\\', '/').Equals(root.TrimEnd('\\', '/'), StringComparison.OrdinalIgnoreCase)) + { + ShowToast($"드라이브 루트({root})는 작업공간으로 설정할 수 없습니다. 하위 폴더를 선택하세요.", "\uE783", 3000); + return; + } + + FolderPathLabel.Text = path; + FolderPathLabel.ToolTip = path; + + lock (_convLock) + { + if (_currentConversation != null) + _currentConversation.WorkFolder = path; + } + + // 최근 폴더 목록에 추가 (차단 경로 제외) + var recent = Llm.RecentWorkFolders; + recent.RemoveAll(p => !IsPathAllowed(p)); + recent.Remove(path); + recent.Insert(0, path); + var maxRecent = Math.Clamp(Llm.MaxRecentFolders, 3, 30); + if (recent.Count > maxRecent) recent.RemoveRange(maxRecent, recent.Count - maxRecent); + Llm.WorkFolder = path; + _settings.Save(); + } + + private string GetCurrentWorkFolder() + { + lock (_convLock) + { + if (_currentConversation != null && !string.IsNullOrEmpty(_currentConversation.WorkFolder)) + return _currentConversation.WorkFolder; + } + return Llm.WorkFolder; + } + + /// 테마에 맞는 ContextMenu를 생성합니다. + private ContextMenu CreateThemedContextMenu() + { + var bg = ThemeResourceHelper.Background(this); + var border = ThemeResourceHelper.Border(this); + return new ContextMenu + { + Background = bg, + BorderBrush = border, + BorderThickness = new Thickness(1), + Padding = new Thickness(4), + }; + } + + /// 최근 폴더 항목 우클릭 컨텍스트 메뉴를 표시합니다. + private void ShowRecentFolderContextMenu(string folderPath) + { + var menu = CreateThemedContextMenu(); + var primaryText = ThemeResourceHelper.Primary(this); + var secondaryText = ThemeResourceHelper.Secondary(this); + + void AddItem(string icon, string label, Action action) + { + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + sp.Children.Add(new TextBlock + { + Text = icon, FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 12, Foreground = secondaryText, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 8, 0), + }); + sp.Children.Add(new TextBlock + { + Text = label, FontSize = 12, Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + var mi = new MenuItem { Header = sp, Padding = new Thickness(8, 6, 16, 6) }; + mi.Click += (_, _) => action(); + menu.Items.Add(mi); + } + + AddItem("\uED25", "폴더 열기", () => + { + try + { + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo + { + FileName = folderPath, + UseShellExecute = true, + }); + } + catch (Exception) { /* 비핵심 작업 실패 — UI 차단 방지 */ } + }); + + AddItem("\uE8C8", "경로 복사", () => + { + try { Clipboard.SetText(folderPath); } catch (Exception) { /* 클립보드 접근 실패 */ } + }); + + menu.Items.Add(new Separator()); + + AddItem("\uE74D", "목록에서 삭제", () => + { + Llm.RecentWorkFolders.RemoveAll( + p => p.Equals(folderPath, StringComparison.OrdinalIgnoreCase)); + _settings.Save(); + // 메뉴 새로고침 + if (FolderMenuPopup.IsOpen) + ShowFolderMenu(); + }); + + menu.IsOpen = true; + } + + private void BtnFolderClear_Click(object sender, RoutedEventArgs e) + { + FolderPathLabel.Text = "폴더를 선택하세요"; + FolderPathLabel.ToolTip = null; + lock (_convLock) + { + if (_currentConversation != null) + _currentConversation.WorkFolder = ""; + } + } + + private void UpdateFolderBar() + { + if (FolderBar == null) return; + if (_activeTab == "Chat") + { + FolderBar.Visibility = Visibility.Collapsed; + return; + } + FolderBar.Visibility = Visibility.Visible; + var folder = GetCurrentWorkFolder(); + if (!string.IsNullOrEmpty(folder)) + { + FolderPathLabel.Text = folder; + FolderPathLabel.ToolTip = folder; + } + else + { + FolderPathLabel.Text = "폴더를 선택하세요"; + FolderPathLabel.ToolTip = null; + } + // 대화별 설정 복원 (없으면 전역 기본값) + LoadConversationSettings(); + UpdatePermissionUI(); + UpdateDataUsageUI(); + } + + /// 현재 대화의 개별 설정을 로드합니다. null이면 전역 기본값 사용. + private void LoadConversationSettings() + { + ChatConversation? conv; + lock (_convLock) conv = _currentConversation; + var llm = Llm; + + if (conv != null && conv.Permission != null) + Llm.FilePermission = conv.Permission; + + _folderDataUsage = conv?.DataUsage ?? llm.FolderDataUsage ?? "active"; + _selectedMood = conv?.Mood ?? llm.DefaultMood ?? "modern"; + } + + /// 현재 하단 바 설정을 대화에 저장합니다. + private void SaveConversationSettings() + { + ChatConversation? conv; + lock (_convLock) conv = _currentConversation; + if (conv == null) return; + + conv.Permission = Llm.FilePermission; + conv.DataUsage = _folderDataUsage; + conv.Mood = _selectedMood; + try { _storage.Save(conv); } catch (Exception ex) { Services.LogService.Debug($"대화 저장 실패: {ex.Message}"); } + } + + // ─── 권한 메뉴 ───────────────────────────────────────────────────────── + + private void BtnPermission_Click(object sender, RoutedEventArgs e) + { + if (PermissionPopup == null) return; + PermissionItems.Children.Clear(); + + var levels = new (string Level, string Sym, string Desc, string Color)[] { + ("Ask", "\uE8D7", "매번 확인 — 파일 접근 시 사용자에게 묻습니다", "#4B5EFC"), + ("Auto", "\uE73E", "자동 허용 — 파일을 자동으로 읽고 씁니다", "#DD6B20"), + ("Deny", "\uE711", "접근 차단 — 파일 접근을 허용하지 않습니다", "#C50F1F"), + }; + var current = Llm.FilePermission; + foreach (var (level, sym, desc, color) in levels) + { + var isActive = level.Equals(current, StringComparison.OrdinalIgnoreCase); + + // 라운드 코너 템플릿 (기본 Button 크롬 제거) + var template = new ControlTemplate(typeof(Button)); + var bdFactory = new FrameworkElementFactory(typeof(Border)); + bdFactory.SetValue(Border.BackgroundProperty, Brushes.Transparent); + bdFactory.SetValue(Border.CornerRadiusProperty, new CornerRadius(8)); + bdFactory.SetValue(Border.PaddingProperty, new Thickness(12, 8, 12, 8)); + bdFactory.Name = "Bd"; + var cpFactory = new FrameworkElementFactory(typeof(ContentPresenter)); + cpFactory.SetValue(ContentPresenter.HorizontalAlignmentProperty, HorizontalAlignment.Left); + cpFactory.SetValue(ContentPresenter.VerticalAlignmentProperty, VerticalAlignment.Center); + bdFactory.AppendChild(cpFactory); + template.VisualTree = bdFactory; + // 호버 효과 + var hoverTrigger = new Trigger { Property = UIElement.IsMouseOverProperty, Value = true }; + hoverTrigger.Setters.Add(new Setter(Border.BackgroundProperty, + new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)), "Bd")); + template.Triggers.Add(hoverTrigger); + + var btn = new Button + { + Template = template, + BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, + HorizontalContentAlignment = HorizontalAlignment.Left, + Margin = new Thickness(0, 1, 0, 1), + }; + ApplyHoverScaleAnimation(btn, 1.02); + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + // 커스텀 체크 아이콘 + sp.Children.Add(CreateCheckIcon(isActive)); + sp.Children.Add(new TextBlock + { + Text = sym, FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 14, + Foreground = BrushFromHex(color), + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 10, 0), + }); + var textStack = new StackPanel(); + textStack.Children.Add(new TextBlock + { + Text = level, FontSize = 13, FontWeight = FontWeights.Bold, + Foreground = BrushFromHex(color), + }); + textStack.Children.Add(new TextBlock + { + Text = desc, FontSize = 11, + Foreground = ThemeResourceHelper.Secondary(this), + TextWrapping = TextWrapping.Wrap, + MaxWidth = 220, + }); + sp.Children.Add(textStack); + btn.Content = sp; + + var capturedLevel = level; + btn.Click += (_, _) => + { + Llm.FilePermission = capturedLevel; + UpdatePermissionUI(); + SaveConversationSettings(); + PermissionPopup.IsOpen = false; + }; + PermissionItems.Children.Add(btn); + } + PermissionPopup.IsOpen = true; + } + + private bool _autoWarningDismissed; // Auto 경고 배너 사용자가 닫았는지 + + private void BtnAutoWarningClose_Click(object sender, RoutedEventArgs e) + { + _autoWarningDismissed = true; + if (AutoPermissionWarning != null) + AutoPermissionWarning.Visibility = Visibility.Collapsed; + } + + private void UpdatePermissionUI() + { + if (PermissionLabel == null || PermissionIcon == null) return; + var perm = Llm.FilePermission; + PermissionLabel.Text = perm; + PermissionIcon.Text = perm switch + { + "Auto" => "\uE73E", + "Deny" => "\uE711", + _ => "\uE8D7", + }; + + // Auto 모드일 때 경고 색상 + 배너 표시 + if (perm == "Auto") + { + var warnColor = new SolidColorBrush(Color.FromRgb(0xDD, 0x6B, 0x20)); + PermissionLabel.Foreground = warnColor; + PermissionIcon.Foreground = warnColor; + // Auto 전환 시 새 대화에서만 1회 필수 표시 (기존 대화에서 이미 Auto였으면 숨김) + ChatConversation? convForWarn; + lock (_convLock) convForWarn = _currentConversation; + var isExisting = convForWarn != null && convForWarn.Messages.Count > 0 && convForWarn.Permission == "Auto"; + if (AutoPermissionWarning != null && !_autoWarningDismissed && !isExisting) + AutoPermissionWarning.Visibility = Visibility.Visible; + } + else + { + _autoWarningDismissed = false; // Auto가 아닌 모드로 전환하면 리셋 + var defaultFg = ThemeResourceHelper.Secondary(this); + var iconFg = perm == "Deny" ? new SolidColorBrush(Color.FromRgb(0xC5, 0x0F, 0x1F)) + : new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); // Ask = 파란색 + PermissionLabel.Foreground = defaultFg; + PermissionIcon.Foreground = iconFg; + if (AutoPermissionWarning != null) + AutoPermissionWarning.Visibility = Visibility.Collapsed; + } + } + + // ──── 데이터 활용 수준 메뉴 ──── + + private void BtnDataUsage_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + if (DataUsagePopup == null) return; + DataUsageItems.Children.Clear(); + + var options = new (string Key, string Sym, string Label, string Desc, string Color)[] + { + ("active", "\uE9F5", "적극 활용", "폴더 내 문서를 자동 탐색하여 보고서 작성에 적극 활용합니다", "#107C10"), + ("passive", "\uE8FD", "소극 활용", "사용자가 요청할 때만 폴더 데이터를 참조합니다", "#D97706"), + ("none", "\uE8D8", "활용하지 않음", "폴더 내 문서를 읽거나 참조하지 않습니다", "#9CA3AF"), + }; + + foreach (var (key, sym, label, desc, color) in options) + { + var isActive = key.Equals(_folderDataUsage, StringComparison.OrdinalIgnoreCase); + + var template = new ControlTemplate(typeof(Button)); + var bdFactory = new FrameworkElementFactory(typeof(Border)); + bdFactory.SetValue(Border.BackgroundProperty, Brushes.Transparent); + bdFactory.SetValue(Border.CornerRadiusProperty, new CornerRadius(8)); + bdFactory.SetValue(Border.PaddingProperty, new Thickness(12, 8, 12, 8)); + bdFactory.Name = "Bd"; + var cpFactory = new FrameworkElementFactory(typeof(ContentPresenter)); + cpFactory.SetValue(ContentPresenter.HorizontalAlignmentProperty, HorizontalAlignment.Left); + cpFactory.SetValue(ContentPresenter.VerticalAlignmentProperty, VerticalAlignment.Center); + bdFactory.AppendChild(cpFactory); + template.VisualTree = bdFactory; + var hoverTrigger = new Trigger { Property = UIElement.IsMouseOverProperty, Value = true }; + hoverTrigger.Setters.Add(new Setter(Border.BackgroundProperty, + new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)), "Bd")); + template.Triggers.Add(hoverTrigger); + + var btn = new Button + { + Template = template, + BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, + HorizontalContentAlignment = HorizontalAlignment.Left, + Margin = new Thickness(0, 1, 0, 1), + }; + ApplyHoverScaleAnimation(btn, 1.02); + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + // 커스텀 체크 아이콘 + sp.Children.Add(CreateCheckIcon(isActive)); + sp.Children.Add(new TextBlock + { + Text = sym, FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 14, + Foreground = BrushFromHex(color), + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 10, 0), + }); + var textStack = new StackPanel(); + textStack.Children.Add(new TextBlock + { + Text = label, FontSize = 13, FontWeight = FontWeights.Bold, + Foreground = BrushFromHex(color), + }); + textStack.Children.Add(new TextBlock + { + Text = desc, FontSize = 11, + Foreground = ThemeResourceHelper.Secondary(this), + TextWrapping = TextWrapping.Wrap, + MaxWidth = 240, + }); + sp.Children.Add(textStack); + btn.Content = sp; + + var capturedKey = key; + btn.Click += (_, _) => + { + _folderDataUsage = capturedKey; + UpdateDataUsageUI(); + SaveConversationSettings(); + DataUsagePopup.IsOpen = false; + }; + DataUsageItems.Children.Add(btn); + } + DataUsagePopup.IsOpen = true; + } + + private void UpdateDataUsageUI() + { + if (DataUsageLabel == null || DataUsageIcon == null) return; + var (label, icon, color) = _folderDataUsage switch + { + "passive" => ("소극", "\uE8FD", "#D97706"), + "none" => ("미사용", "\uE8D8", "#9CA3AF"), + _ => ("적극", "\uE9F5", "#107C10"), + }; + DataUsageLabel.Text = label; + DataUsageIcon.Text = icon; + DataUsageIcon.Foreground = BrushFromHex(color); + } + + /// Cowork/Code 탭 진입 시 설정의 기본 권한을 적용. + private void ApplyTabDefaultPermission() + { + if (_activeTab == "Chat") + { + // Chat 탭: 경고 배너 숨기고 기본 Ask 모드로 복원 + Llm.FilePermission = "Ask"; + UpdatePermissionUI(); + return; + } + var defaultPerm = Llm.DefaultAgentPermission; + if (!string.IsNullOrEmpty(defaultPerm)) + { + Llm.FilePermission = defaultPerm; + UpdatePermissionUI(); + } + } + + // ─── 파일 첨부 ───────────────────────────────────────────────────────── + + private void BtnAttach_Click(object sender, RoutedEventArgs e) + { + var dlg = new Microsoft.Win32.OpenFileDialog + { + Multiselect = true, + Title = "첨부할 파일을 선택하세요", + Filter = "모든 파일 (*.*)|*.*|텍스트 (*.txt;*.md;*.csv)|*.txt;*.md;*.csv|코드 (*.cs;*.py;*.js;*.ts)|*.cs;*.py;*.js;*.ts", + }; + + // 작업 폴더가 있으면 초기 경로 설정 + var workFolder = GetCurrentWorkFolder(); + if (!string.IsNullOrEmpty(workFolder) && System.IO.Directory.Exists(workFolder)) + dlg.InitialDirectory = workFolder; + + if (dlg.ShowDialog() != true) return; + + foreach (var file in dlg.FileNames) + AddAttachedFile(file); + } + + private static readonly HashSet ImageExtensions = new(StringComparer.OrdinalIgnoreCase) + { + ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".webp" + }; + + private void AddAttachedFile(string filePath) + { + if (_attachedFiles.Contains(filePath)) return; + + // 파일 크기 제한 (10MB) + try + { + var fi = new System.IO.FileInfo(filePath); + if (fi.Length > 10 * 1024 * 1024) + { + CustomMessageBox.Show($"파일이 너무 큽니다 (10MB 초과):\n{fi.Name}", "첨부 제한", MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + + // 이미지 파일 → Vision API용 base64 변환 + var ext = fi.Extension.ToLowerInvariant(); + if (ImageExtensions.Contains(ext) && Llm.EnableImageInput) + { + var maxKb = Llm.MaxImageSizeKb; + if (maxKb <= 0) maxKb = 5120; + if (fi.Length > maxKb * 1024) + { + CustomMessageBox.Show($"이미지가 너무 큽니다 ({fi.Length / 1024}KB, 최대 {maxKb}KB).", + "이미지 크기 초과", MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + + var bytes = System.IO.File.ReadAllBytes(filePath); + var mimeType = ext switch + { + ".jpg" or ".jpeg" => "image/jpeg", + ".gif" => "image/gif", + ".bmp" => "image/bmp", + ".webp" => "image/webp", + _ => "image/png", + }; + var attachment = new ImageAttachment + { + Base64 = Convert.ToBase64String(bytes), + MimeType = mimeType, + FileName = fi.Name, + }; + + // 중복 확인 + if (_pendingImages.Any(i => i.FileName == attachment.FileName)) return; + + _pendingImages.Add(attachment); + AddImagePreview(attachment); + return; + } + } + catch (Exception) { return; } + + _attachedFiles.Add(filePath); + RefreshAttachedFilesUI(); + } + + private void RemoveAttachedFile(string filePath) + { + _attachedFiles.Remove(filePath); + RefreshAttachedFilesUI(); + } + + private void RefreshAttachedFilesUI() + { + AttachedFilesPanel.Items.Clear(); + if (_attachedFiles.Count == 0) + { + AttachedFilesPanel.Visibility = Visibility.Collapsed; + return; + } + + AttachedFilesPanel.Visibility = Visibility.Visible; + var secondaryBrush = ThemeResourceHelper.Secondary(this); + var hintBg = ThemeResourceHelper.Hint(this); + + foreach (var file in _attachedFiles.ToList()) + { + var fileName = System.IO.Path.GetFileName(file); + var capturedFile = file; + + var chip = new Border + { + Background = hintBg, + CornerRadius = new CornerRadius(6), + Padding = new Thickness(8, 4, 4, 4), + Margin = new Thickness(0, 0, 4, 4), + Cursor = Cursors.Hand, + }; + + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + sp.Children.Add(new TextBlock + { + Text = "\uE8A5", FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 10, + Foreground = secondaryBrush, VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 4, 0), + }); + sp.Children.Add(new TextBlock + { + Text = fileName, FontSize = 11, Foreground = secondaryBrush, + VerticalAlignment = VerticalAlignment.Center, MaxWidth = 150, TextTrimming = TextTrimming.CharacterEllipsis, + ToolTip = file, + }); + var removeBtn = new Button + { + Content = new TextBlock { Text = "\uE711", FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 8, Foreground = secondaryBrush }, + Background = Brushes.Transparent, BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, Padding = new Thickness(4, 2, 4, 2), Margin = new Thickness(2, 0, 0, 0), + }; + removeBtn.Click += (_, _) => RemoveAttachedFile(capturedFile); + sp.Children.Add(removeBtn); + chip.Child = sp; + AttachedFilesPanel.Items.Add(chip); + } + } + + /// 첨부 파일 내용을 시스템 메시지로 변환합니다. + private string BuildFileContextPrompt() + { + if (_attachedFiles.Count == 0) return ""; + + var sb = new System.Text.StringBuilder(); + sb.AppendLine("\n[첨부 파일 컨텍스트]"); + + foreach (var file in _attachedFiles) + { + try + { + var ext = System.IO.Path.GetExtension(file).ToLowerInvariant(); + var isBinary = ext is ".exe" or ".dll" or ".zip" or ".7z" or ".rar" or ".tar" or ".gz" + or ".png" or ".jpg" or ".jpeg" or ".gif" or ".bmp" or ".ico" or ".webp" or ".svg" + or ".pdf" or ".docx" or ".xlsx" or ".pptx" or ".doc" or ".xls" or ".ppt" + or ".mp3" or ".mp4" or ".avi" or ".mov" or ".mkv" or ".wav" or ".flac" + or ".psd" or ".ai" or ".sketch" or ".fig" + or ".msi" or ".iso" or ".img" or ".bin" or ".dat" or ".db" or ".sqlite"; + if (isBinary) + { + sb.AppendLine($"\n--- {System.IO.Path.GetFileName(file)} (바이너리 파일, 내용 생략) ---"); + continue; + } + + var content = System.IO.File.ReadAllText(file); + // 최대 8000자로 제한 + if (content.Length > 8000) + content = content[..8000] + "\n... (이하 생략)"; + + sb.AppendLine($"\n--- {System.IO.Path.GetFileName(file)} ---"); + sb.AppendLine(content); + } + catch (Exception ex) + { + sb.AppendLine($"\n--- {System.IO.Path.GetFileName(file)} (읽기 실패: {ex.Message}) ---"); + } + } + + return sb.ToString(); + } + + private void ResizeGrip_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) + { + var newW = Width + e.HorizontalChange; + var newH = Height + e.VerticalChange; + if (newW >= MinWidth) Width = newW; + if (newH >= MinHeight) Height = newH; + } + + // ─── 사이드바 토글 ─────────────────────────────────────────────────── + + private void BtnToggleSidebar_Click(object sender, RoutedEventArgs e) + { + _sidebarVisible = !_sidebarVisible; + if (_sidebarVisible) + { + // 사이드바 열기, 아이콘 바 숨기기 + IconBarColumn.Width = new GridLength(0); + IconBarPanel.Visibility = Visibility.Collapsed; + SidebarPanel.Visibility = Visibility.Visible; + ToggleSidebarIcon.Text = "\uE76B"; + AnimateSidebar(0, 270, () => SidebarColumn.MinWidth = 200); + } + else + { + // 사이드바 닫기, 아이콘 바 표시 + SidebarColumn.MinWidth = 0; + ToggleSidebarIcon.Text = "\uE76C"; + AnimateSidebar(270, 0, () => + { + SidebarPanel.Visibility = Visibility.Collapsed; + IconBarColumn.Width = new GridLength(52); + IconBarPanel.Visibility = Visibility.Visible; + }); + } + } + + private void AnimateSidebar(double from, double to, Action? onComplete = null) + { + var duration = 200.0; + var start = DateTime.UtcNow; + var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(10) }; + EventHandler tickHandler = null!; + tickHandler = (_, _) => + { + var elapsed = (DateTime.UtcNow - start).TotalMilliseconds; + var t = Math.Min(elapsed / duration, 1.0); + t = 1 - (1 - t) * (1 - t); + SidebarColumn.Width = new GridLength(from + (to - from) * t); + if (elapsed >= duration) + { + timer.Stop(); + timer.Tick -= tickHandler; + SidebarColumn.Width = new GridLength(to); + onComplete?.Invoke(); + } + }; + timer.Tick += tickHandler; + timer.Start(); + } + + // ─── 대화 목록 ──────────────────────────────────────────────────────── + + public void RefreshConversationList() + { + var metas = _storage.LoadAllMeta(); + // 프리셋 카테고리 → 아이콘/색상 매핑 (ChatCategory에 없는 코워크/코드 카테고리 지원) + var allPresets = Services.PresetService.GetByTabWithCustom("Cowork", Llm.CustomPresets) + .Concat(Services.PresetService.GetByTabWithCustom("Code", Llm.CustomPresets)) + .Concat(Services.PresetService.GetByTabWithCustom("Chat", Llm.CustomPresets)); + var presetMap = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var p in allPresets) + presetMap.TryAdd(p.Category, (p.Symbol, p.Color)); + + var items = metas.Select(c => + { + var symbol = ChatCategory.GetSymbol(c.Category); + var color = ChatCategory.GetColor(c.Category); + // ChatCategory 기본값이면 프리셋에서 검색 + if (symbol == "\uE8BD" && color == "#6B7280" && c.Category != ChatCategory.General) + { + if (presetMap.TryGetValue(c.Category, out var pm)) + { + symbol = pm.Symbol; + color = pm.Color; + } + } + return new ConversationMeta + { + Id = c.Id, + Title = c.Title, + Pinned = c.Pinned, + Category = c.Category, + Symbol = symbol, + ColorHex = color, + Tab = string.IsNullOrEmpty(c.Tab) ? "Chat" : c.Tab, + UpdatedAtText = FormatDate(c.UpdatedAt), + UpdatedAt = c.UpdatedAt, + Preview = c.Preview ?? "", + ParentId = c.ParentId, + }; + }).ToList(); + + // 탭 필터 — 현재 활성 탭의 대화만 표시 + items = items.Where(i => i.Tab == _activeTab).ToList(); + + // 카테고리 필터 적용 + if (_selectedCategory == "__custom__") + { + // 커스텀 프리셋으로 만든 대화만 표시 + var customCats = Llm.CustomPresets + .Select(c => $"custom_{c.Id}").ToHashSet(); + items = items.Where(i => customCats.Contains(i.Category)).ToList(); + } + else if (!string.IsNullOrEmpty(_selectedCategory)) + items = items.Where(i => i.Category == _selectedCategory).ToList(); + + // 검색 필터 (제목 + 내용 미리보기) + var search = SearchBox?.Text?.Trim() ?? ""; + if (!string.IsNullOrEmpty(search)) + items = items.Where(i => + i.Title.Contains(search, StringComparison.OrdinalIgnoreCase) || + i.Preview.Contains(search, StringComparison.OrdinalIgnoreCase) + ).ToList(); + + RenderConversationList(items); + } + + private const int ConversationPageSize = 50; + private List? _pendingConversations; + + private void RenderConversationList(List items) + { + ConversationPanel.Children.Clear(); + _pendingConversations = null; + + if (items.Count == 0) + { + var empty = new TextBlock + { + Text = "대화가 없습니다", + FontSize = 12, + Foreground = (ThemeResourceHelper.Secondary(this)), + HorizontalAlignment = HorizontalAlignment.Center, + Margin = new Thickness(0, 20, 0, 0) + }; + ConversationPanel.Children.Add(empty); + return; + } + + // 오늘 / 이전 그룹 분리 + var today = DateTime.Today; + var todayItems = items.Where(i => i.UpdatedAt.Date == today).ToList(); + var olderItems = items.Where(i => i.UpdatedAt.Date < today).ToList(); + + var allOrdered = new List<(string Group, ConversationMeta Item)>(); + foreach (var item in todayItems) allOrdered.Add(("오늘", item)); + foreach (var item in olderItems) allOrdered.Add(("이전", item)); + + // 첫 페이지만 렌더링 + var firstPage = allOrdered.Take(ConversationPageSize).ToList(); + string? lastGroup = null; + foreach (var (group, item) in firstPage) + { + if (group != lastGroup) { AddGroupHeader(group); lastGroup = group; } + AddConversationItem(item); + } + + // 나머지가 있으면 "더 보기" 버튼 + if (allOrdered.Count > ConversationPageSize) + { + _pendingConversations = items; + AddLoadMoreButton(allOrdered.Count - ConversationPageSize); + } + } + + private void AddLoadMoreButton(int remaining) + { + var secondaryText = ThemeResourceHelper.Secondary(this); + var accentBrush = ThemeResourceHelper.Accent(this); + var btn = new Border + { + Background = Brushes.Transparent, + CornerRadius = new CornerRadius(8), + Cursor = Cursors.Hand, + Padding = new Thickness(8, 10, 8, 10), + Margin = new Thickness(6, 4, 6, 4), + HorizontalAlignment = HorizontalAlignment.Stretch, + }; + var sp = new StackPanel { HorizontalAlignment = HorizontalAlignment.Center }; + sp.Children.Add(new TextBlock + { + Text = $"더 보기 ({remaining}개 남음)", + FontSize = 12, + Foreground = accentBrush, + HorizontalAlignment = HorizontalAlignment.Center, + }); + btn.Child = sp; + btn.MouseEnter += (s, _) => { if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x12, 0xFF, 0xFF, 0xFF)); }; + btn.MouseLeave += (s, _) => { if (s is Border b) b.Background = Brushes.Transparent; }; + btn.MouseLeftButtonUp += (_, _) => + { + // 전체 목록 렌더링 + if (_pendingConversations != null) + { + var all = _pendingConversations; + _pendingConversations = null; + ConversationPanel.Children.Clear(); + + var today = DateTime.Today; + var todayItems = all.Where(i => i.UpdatedAt.Date == today).ToList(); + var olderItems = all.Where(i => i.UpdatedAt.Date < today).ToList(); + + if (todayItems.Count > 0) + { + AddGroupHeader("오늘"); + foreach (var item in todayItems) AddConversationItem(item); + } + if (olderItems.Count > 0) + { + AddGroupHeader("이전"); + foreach (var item in olderItems) AddConversationItem(item); + } + } + }; + ConversationPanel.Children.Add(btn); + } + + private void AddGroupHeader(string text) + { + var header = new TextBlock + { + Text = text, + FontSize = 11, + FontWeight = FontWeights.SemiBold, + Foreground = (ThemeResourceHelper.Secondary(this)), + Margin = new Thickness(8, 12, 0, 4) + }; + ConversationPanel.Children.Add(header); + } + + private void AddConversationItem(ConversationMeta item) + { + var isSelected = false; + lock (_convLock) + isSelected = _currentConversation?.Id == item.Id; + + var isBranch = !string.IsNullOrEmpty(item.ParentId); + var border = new Border + { + Background = isSelected + ? new SolidColorBrush(Color.FromArgb(0x30, 0x4B, 0x5E, 0xFC)) + : Brushes.Transparent, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(10, 8, 10, 8), + Margin = isBranch ? new Thickness(16, 1, 0, 1) : new Thickness(0, 1, 0, 1), + Cursor = Cursors.Hand + }; + + var grid = new Grid(); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(28) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + // 카테고리 아이콘 (고정 시 핀 아이콘, 그 외 카테고리 색상) + Brush iconBrush; + if (item.Pinned) + iconBrush = Brushes.Orange; + else + { + try { iconBrush = ThemeResourceHelper.HexBrush(item.ColorHex); } + catch (Exception) { iconBrush = ThemeResourceHelper.Accent(this); } + } + var iconText = item.Pinned ? "\uE718" : !string.IsNullOrEmpty(item.ParentId) ? "\uE8A5" : item.Symbol; + if (!string.IsNullOrEmpty(item.ParentId)) iconBrush = new SolidColorBrush(Color.FromRgb(0x8B, 0x5C, 0xF6)); // 분기: 보라색 + var icon = new TextBlock + { + Text = iconText, + FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 13, + Foreground = iconBrush, + VerticalAlignment = VerticalAlignment.Center + }; + Grid.SetColumn(icon, 0); + grid.Children.Add(icon); + + // 제목 + 날짜 (선택 시 약간 밝게) + var titleColor = ThemeResourceHelper.Primary(this); + var dateColor = ThemeResourceHelper.HintFg(this); + + var stack = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; + var title = new TextBlock + { + Text = item.Title, + FontSize = 12.5, + Foreground = titleColor, + TextTrimming = TextTrimming.CharacterEllipsis + }; + var date = new TextBlock + { + Text = item.UpdatedAtText, + FontSize = 10, + Foreground = dateColor, + Margin = new Thickness(0, 2, 0, 0) + }; + stack.Children.Add(title); + stack.Children.Add(date); + Grid.SetColumn(stack, 1); + grid.Children.Add(stack); + + // 카테고리 변경 버튼 (호버 시 표시) + var catBtn = new Button + { + Content = new TextBlock + { + Text = "\uE70F", // Edit + FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 10, + Foreground = (ThemeResourceHelper.Secondary(this)) + }, + Background = Brushes.Transparent, + BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, + VerticalAlignment = VerticalAlignment.Center, + Visibility = Visibility.Collapsed, + Padding = new Thickness(4), + ToolTip = _activeTab == "Cowork" ? "작업 유형" : "대화 주제 변경" + }; + var capturedId = item.Id; + catBtn.Click += (_, _) => ShowConversationMenu(capturedId); + Grid.SetColumn(catBtn, 2); + grid.Children.Add(catBtn); + + // 선택 시 좌측 액센트 바 + if (isSelected) + { + border.BorderBrush = ThemeResourceHelper.Accent(this); + border.BorderThickness = new Thickness(2, 0, 0, 0); + } + + border.Child = grid; + + // 호버 이벤트 — 배경 + 미세 확대 + border.RenderTransformOrigin = new Point(0.5, 0.5); + border.RenderTransform = new ScaleTransform(1, 1); + var selectedBg = new SolidColorBrush(Color.FromArgb(0x30, 0x4B, 0x5E, 0xFC)); + border.MouseEnter += (_, _) => + { + if (!isSelected) + border.Background = new SolidColorBrush(Color.FromArgb(0x15, 0xFF, 0xFF, 0xFF)); + catBtn.Visibility = Visibility.Visible; + var st = border.RenderTransform as ScaleTransform; + st?.BeginAnimation(ScaleTransform.ScaleXProperty, new DoubleAnimation(1.02, TimeSpan.FromMilliseconds(120))); + st?.BeginAnimation(ScaleTransform.ScaleYProperty, new DoubleAnimation(1.02, TimeSpan.FromMilliseconds(120))); + }; + border.MouseLeave += (_, _) => + { + if (!isSelected) + border.Background = Brushes.Transparent; + catBtn.Visibility = Visibility.Collapsed; + var st = border.RenderTransform as ScaleTransform; + st?.BeginAnimation(ScaleTransform.ScaleXProperty, new DoubleAnimation(1.0, TimeSpan.FromMilliseconds(150))); + st?.BeginAnimation(ScaleTransform.ScaleYProperty, new DoubleAnimation(1.0, TimeSpan.FromMilliseconds(150))); + }; + + // 클릭 — 이미 선택된 대화면 제목 편집, 아니면 대화 전환 + border.MouseLeftButtonDown += (_, _) => + { + try + { + if (isSelected) + { + // 이미 선택된 대화 → 제목 편집 모드 + EnterTitleEditMode(title, item.Id, titleColor); + return; + } + // 스트리밍 중이면 취소 + if (_isStreaming) + { + _streamCts?.Cancel(); + _cursorTimer.Stop(); + _typingTimer.Stop(); + _elapsedTimer.Stop(); + _activeStreamText = null; + _elapsedLabel = null; + _isStreaming = false; + } + var conv = _storage.Load(item.Id); + if (conv != null) + { + // Tab 보정 + if (string.IsNullOrEmpty(conv.Tab)) conv.Tab = _activeTab; + lock (_convLock) _currentConversation = conv; + _tabConversationId[_activeTab] = conv.Id; + UpdateChatTitle(); + RenderMessages(); + RefreshConversationList(); + } + } + catch (Exception ex) + { + LogService.Error($"대화 전환 오류: {ex.Message}"); + } + }; + + // 우클릭 → 대화 관리 메뉴 바로 표시 + border.MouseRightButtonUp += (_, me) => + { + me.Handled = true; + // 선택되지 않은 대화를 우클릭하면 먼저 선택 + if (!isSelected) + { + var conv = _storage.Load(item.Id); + if (conv != null) + { + if (string.IsNullOrEmpty(conv.Tab)) conv.Tab = _activeTab; + lock (_convLock) _currentConversation = conv; + _tabConversationId[_activeTab] = conv.Id; + UpdateChatTitle(); + RenderMessages(); + } + } + // Dispatcher로 지연 호출 — 마우스 이벤트 완료 후 Popup 열기 + Dispatcher.BeginInvoke(new Action(() => ShowConversationMenu(item.Id)), DispatcherPriority.Input); + }; + + ConversationPanel.Children.Add(border); + } + + // ─── 대화 제목 인라인 편집 ──────────────────────────────────────────── + + private void EnterTitleEditMode(TextBlock titleTb, string conversationId, Brush titleColor) + { + try + { + // titleTb가 이미 부모에서 분리된 경우(편집 중) 무시 + var parent = titleTb.Parent as StackPanel; + if (parent == null) return; + + var idx = parent.Children.IndexOf(titleTb); + if (idx < 0) return; + + var editBox = new TextBox + { + Text = titleTb.Text, + FontSize = 12.5, + Foreground = titleColor, + Background = Brushes.Transparent, + BorderBrush = ThemeResourceHelper.Accent(this), + BorderThickness = new Thickness(0, 0, 0, 1), + CaretBrush = titleColor, + Padding = new Thickness(0), + Margin = new Thickness(0), + }; + + // 안전하게 자식 교체: 먼저 제거 후 삽입 + parent.Children.RemoveAt(idx); + parent.Children.Insert(idx, editBox); + + var committed = false; + void CommitEdit() + { + if (committed) return; + committed = true; + + var newTitle = editBox.Text.Trim(); + if (string.IsNullOrEmpty(newTitle)) newTitle = titleTb.Text; + + titleTb.Text = newTitle; + // editBox가 아직 parent에 있는지 확인 후 교체 + try + { + var currentIdx = parent.Children.IndexOf(editBox); + if (currentIdx >= 0) + { + parent.Children.RemoveAt(currentIdx); + parent.Children.Insert(currentIdx, titleTb); + } + } + catch (Exception) { /* 부모가 이미 해제된 경우 무시 */ } + + var conv = _storage.Load(conversationId); + if (conv != null) + { + conv.Title = newTitle; + _storage.Save(conv); + lock (_convLock) + { + if (_currentConversation?.Id == conversationId) + _currentConversation.Title = newTitle; + } + UpdateChatTitle(); + } + } + + void CancelEdit() + { + if (committed) return; + committed = true; + try + { + var currentIdx = parent.Children.IndexOf(editBox); + if (currentIdx >= 0) + { + parent.Children.RemoveAt(currentIdx); + parent.Children.Insert(currentIdx, titleTb); + } + } + catch (Exception) { /* 부모가 이미 해제된 경우 무시 */ } + } + + editBox.KeyDown += (_, ke) => + { + if (ke.Key == Key.Enter) { ke.Handled = true; CommitEdit(); } + if (ke.Key == Key.Escape) { ke.Handled = true; CancelEdit(); } + }; + editBox.LostFocus += (_, _) => CommitEdit(); + + editBox.Focus(); + editBox.SelectAll(); + } + catch (Exception ex) + { + LogService.Error($"제목 편집 오류: {ex.Message}"); + } + } + + // ─── 카테고리 변경 팝업 ────────────────────────────────────────────── + + private void ShowConversationMenu(string conversationId) + { + var conv = _storage.Load(conversationId); + var isPinned = conv?.Pinned ?? false; + + var primaryText = ThemeResourceHelper.Primary(this); + var secondaryText = ThemeResourceHelper.Secondary(this); + var hoverBg = ThemeResourceHelper.HoverBg(this); + + var (popup, stack) = PopupMenuHelper.Create(this, this, PlacementMode.MousePoint, minWidth: 200); + + // 메뉴 항목 헬퍼 — PopupMenuHelper.MenuItem 래핑 (아이콘 색상 개별 지정) + Border CreateMenuItem(string icon, string text, Brush iconColor, Action onClick) + => PopupMenuHelper.MenuItem(text, primaryText, hoverBg, + () => { popup.IsOpen = false; onClick(); }, + icon: icon, iconColor: iconColor, fontSize: 12.5); + + Border CreateSeparator() => PopupMenuHelper.Separator(); + + // 고정/해제 + stack.Children.Add(CreateMenuItem( + isPinned ? "\uE77A" : "\uE718", + isPinned ? "고정 해제" : "상단 고정", + ThemeResourceHelper.Accent(this), + () => + { + var c = _storage.Load(conversationId); + if (c != null) + { + c.Pinned = !c.Pinned; + _storage.Save(c); + lock (_convLock) { if (_currentConversation?.Id == conversationId) _currentConversation.Pinned = c.Pinned; } + RefreshConversationList(); + } + })); + + // 이름 변경 + stack.Children.Add(CreateMenuItem("\uE8AC", "이름 변경", secondaryText, () => + { + // 대화 목록에서 해당 항목 찾아서 편집 모드 진입 + foreach (UIElement child in ConversationPanel.Children) + { + if (child is Border b && b.Child is Grid g) + { + foreach (UIElement gc in g.Children) + { + if (gc is StackPanel sp && sp.Children.Count > 0 && sp.Children[0] is TextBlock tb) + { + // title과 매칭 + if (conv != null && tb.Text == conv.Title) + { + var titleColor = ThemeResourceHelper.Primary(this); + EnterTitleEditMode(tb, conversationId, titleColor); + return; + } + } + } + } + } + })); + + // Cowork/Code 탭: 작업 유형 읽기 전용 표시 + if ((_activeTab == "Cowork" || _activeTab == "Code") && conv != null) + { + var catKey = conv.Category ?? ChatCategory.General; + // ChatCategory 또는 프리셋에서 아이콘/라벨 검색 + string catSymbol = "\uE8BD", catLabel = catKey, catColor = "#6B7280"; + var chatCat = ChatCategory.All.FirstOrDefault(c => c.Key == catKey); + if (chatCat != default && chatCat.Key != ChatCategory.General) + { + catSymbol = chatCat.Symbol; catLabel = chatCat.Label; catColor = chatCat.Color; + } + else + { + var preset = Services.PresetService.GetByTabWithCustom(_activeTab, Llm.CustomPresets) + .FirstOrDefault(p => p.Category == catKey); + if (preset != null) + { + catSymbol = preset.Symbol; catLabel = preset.Label; catColor = preset.Color; + } + } + + stack.Children.Add(CreateSeparator()); + var infoSp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(10, 4, 10, 4) }; + try + { + var catBrush = ThemeResourceHelper.HexBrush(catColor); + infoSp.Children.Add(new TextBlock + { + Text = catSymbol, FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 12, Foreground = catBrush, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 6, 0), + }); + infoSp.Children.Add(new TextBlock + { + Text = catLabel, FontSize = 12, Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + } + catch (Exception) + { + infoSp.Children.Add(new TextBlock { Text = catLabel, FontSize = 12, Foreground = primaryText }); + } + stack.Children.Add(infoSp); + } + + // Chat 탭만 분류 변경 표시 (Cowork/Code 탭은 분류 불필요) + var showCategorySection = _activeTab == "Chat"; + + if (showCategorySection) + { + stack.Children.Add(CreateSeparator()); + + // 분류 헤더 + stack.Children.Add(new TextBlock + { + Text = "분류 변경", + FontSize = 10.5, + Foreground = secondaryText, + Margin = new Thickness(10, 4, 0, 4), + FontWeight = FontWeights.SemiBold, + }); + + var currentCategory = conv?.Category ?? ChatCategory.General; + var accentBrush = ThemeResourceHelper.Accent(this); + + foreach (var (key, label, symbol, color) in ChatCategory.All) + { + var capturedKey = key; + var isCurrentCat = capturedKey == currentCategory; + + // 카테고리 항목 (체크 표시 포함) + var catItem = new Border + { + Background = Brushes.Transparent, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(10, 7, 10, 7), + Margin = new Thickness(0, 1, 0, 1), + Cursor = Cursors.Hand, + }; + var catGrid = new Grid(); + catGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(24) }); + catGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + catGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(20) }); + + var catIcon = new TextBlock + { + Text = symbol, FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 12, Foreground = BrushFromHex(color), VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(catIcon, 0); + catGrid.Children.Add(catIcon); + + var catText = new TextBlock + { + Text = label, FontSize = 12.5, Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + FontWeight = isCurrentCat ? FontWeights.Bold : FontWeights.Normal, + }; + Grid.SetColumn(catText, 1); + catGrid.Children.Add(catText); + + if (isCurrentCat) + { + var check = CreateSimpleCheck(accentBrush, 14); + Grid.SetColumn(check, 2); + catGrid.Children.Add(check); + } + + catItem.Child = catGrid; + catItem.MouseEnter += (s, _) => { if (s is Border b) b.Background = hoverBg; }; + catItem.MouseLeave += (s, _) => { if (s is Border b) b.Background = Brushes.Transparent; }; + catItem.MouseLeftButtonUp += (_, _) => + { + popup.IsOpen = false; + var c = _storage.Load(conversationId); + if (c != null) + { + c.Category = capturedKey; + var preset = Services.PresetService.GetByCategory(capturedKey); + if (preset != null) + c.SystemCommand = preset.SystemPrompt; + _storage.Save(c); + lock (_convLock) + { + if (_currentConversation?.Id == conversationId) + { + _currentConversation.Category = capturedKey; + if (preset != null) + _currentConversation.SystemCommand = preset.SystemPrompt; + } + } + // 현재 대화의 카테고리가 변경되면 입력 안내 문구도 갱신 + bool isCurrent; + lock (_convLock) { isCurrent = _currentConversation?.Id == conversationId; } + if (isCurrent && preset != null && !string.IsNullOrEmpty(preset.Placeholder)) + { + _promptCardPlaceholder = preset.Placeholder; + UpdateWatermarkVisibility(); + if (string.IsNullOrEmpty(InputBox.Text)) + { + InputWatermark.Text = preset.Placeholder; + InputWatermark.Visibility = Visibility.Visible; + } + } + else if (isCurrent) + { + ClearPromptCardPlaceholder(); + } + RefreshConversationList(); + } + }; + stack.Children.Add(catItem); + } + } // end showCategorySection + + stack.Children.Add(CreateSeparator()); + + // 삭제 + stack.Children.Add(CreateMenuItem("\uE74D", "이 대화 삭제", Brushes.IndianRed, () => + { + var result = CustomMessageBox.Show("이 대화를 삭제하시겠습니까?", "대화 삭제", + MessageBoxButton.YesNo, MessageBoxImage.Question); + if (result != MessageBoxResult.Yes) return; + _storage.Delete(conversationId); + lock (_convLock) + { + if (_currentConversation?.Id == conversationId) + { + _currentConversation = null; + MessagePanel.Children.Clear(); + EmptyState.Visibility = Visibility.Visible; + UpdateChatTitle(); + } + } + RefreshConversationList(); + })); + + popup.IsOpen = true; + } + + // ─── 검색 ──────────────────────────────────────────────────────────── + + private void SearchBox_TextChanged(object sender, TextChangedEventArgs e) + { + RefreshConversationList(); + } + + private static string FormatDate(DateTime dt) + { + var diff = DateTime.Now - dt; + if (diff.TotalMinutes < 1) return "방금 전"; + if (diff.TotalHours < 1) return $"{(int)diff.TotalMinutes}분 전"; + if (diff.TotalDays < 1) return $"{(int)diff.TotalHours}시간 전"; + if (diff.TotalDays < 7) return $"{(int)diff.TotalDays}일 전"; + return dt.ToString("MM/dd"); + } + + private void UpdateChatTitle() + { + lock (_convLock) + { + ChatTitle.Text = _currentConversation?.Title ?? ""; + } + } + + // ─── 메시지 렌더링 → ChatWindow.MessageRendering.cs ───────────────── + + // ─── 메시지 등장 애니메이션 ────────────────────────────────────────── + + private static void ApplyMessageEntryAnimation(FrameworkElement element) + { + element.Opacity = 0; + element.RenderTransform = new TranslateTransform(0, 16); + element.BeginAnimation(UIElement.OpacityProperty, + new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(350)) + { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } }); + ((TranslateTransform)element.RenderTransform).BeginAnimation( + TranslateTransform.YProperty, + new DoubleAnimation(16, 0, TimeSpan.FromMilliseconds(400)) + { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } }); + } + + // ─── 메시지 편집 ────────────────────────────────────────────────────── + + private bool _isEditing; // 편집 모드 중복 방지 + + private void EnterEditMode(StackPanel wrapper, string originalText) + { + if (_isStreaming || _isEditing) return; + _isEditing = true; + + // wrapper 위치(인덱스) 기억 + var idx = MessagePanel.Children.IndexOf(wrapper); + if (idx < 0) { _isEditing = false; return; } + + // 편집 UI 생성 + var editPanel = new StackPanel + { + HorizontalAlignment = HorizontalAlignment.Right, + MaxWidth = 540, + Margin = wrapper.Margin, + }; + + var editBox = new TextBox + { + Text = originalText, + FontSize = 13.5, + Foreground = ThemeResourceHelper.Primary(this), + Background = ThemeResourceHelper.ItemBg(this), + CaretBrush = ThemeResourceHelper.Accent(this), + BorderBrush = ThemeResourceHelper.Accent(this), + BorderThickness = new Thickness(1.5), + Padding = new Thickness(14, 10, 14, 10), + TextWrapping = TextWrapping.Wrap, + AcceptsReturn = false, + MaxHeight = 200, + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + }; + // 둥근 모서리 + var editBorder = new Border + { + CornerRadius = new CornerRadius(14), + Child = editBox, + ClipToBounds = true, + }; + editPanel.Children.Add(editBorder); + + // 버튼 바 + var btnBar = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(0, 6, 0, 0), + }; + + var accentBrush = ThemeResourceHelper.Accent(this); + var secondaryBrush = ThemeResourceHelper.Secondary(this); + + // 취소 버튼 + var cancelBtn = new Button + { + Content = new TextBlock { Text = "취소", FontSize = 12, Foreground = secondaryBrush }, + Background = Brushes.Transparent, + BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, + Padding = new Thickness(12, 5, 12, 5), + Margin = new Thickness(0, 0, 6, 0), + }; + cancelBtn.Click += (_, _) => + { + _isEditing = false; + if (idx >= 0 && idx < MessagePanel.Children.Count) + MessagePanel.Children[idx] = wrapper; // 원래 버블 복원 + }; + btnBar.Children.Add(cancelBtn); + + // 전송 버튼 + var sendBtn = new Button + { + Cursor = Cursors.Hand, + Padding = new Thickness(0), + }; + sendBtn.Template = (ControlTemplate)System.Windows.Markup.XamlReader.Parse( + "" + + "" + + "" + + ""); + sendBtn.Click += (_, _) => + { + var newText = editBox.Text.Trim(); + if (!string.IsNullOrEmpty(newText)) + _ = SubmitEditAsync(idx, newText); + }; + btnBar.Children.Add(sendBtn); + + editPanel.Children.Add(btnBar); + + // 기존 wrapper → editPanel 교체 + MessagePanel.Children[idx] = editPanel; + + // Enter 키로도 전송 + editBox.KeyDown += (_, ke) => + { + if (ke.Key == Key.Enter && Keyboard.Modifiers == ModifierKeys.None) + { + ke.Handled = true; + var newText = editBox.Text.Trim(); + if (!string.IsNullOrEmpty(newText)) + _ = SubmitEditAsync(idx, newText); + } + if (ke.Key == Key.Escape) + { + ke.Handled = true; + _isEditing = false; + if (idx >= 0 && idx < MessagePanel.Children.Count) + MessagePanel.Children[idx] = wrapper; + } + }; + + editBox.Focus(); + editBox.SelectAll(); + } + + private async Task SubmitEditAsync(int bubbleIndex, string newText) + { + _isEditing = false; + if (_isStreaming) return; + + ChatConversation conv; + lock (_convLock) + { + if (_currentConversation == null) return; + conv = _currentConversation; + } + + // bubbleIndex에 해당하는 user 메시지 찾기 + // UI의 children 중 user 메시지가 아닌 것(system)은 스킵됨 + // 데이터 모델에서 해당 위치의 user 메시지 찾기 + int userMsgIdx = -1; + int uiIdx = 0; + lock (_convLock) + { + for (int i = 0; i < conv.Messages.Count; i++) + { + if (conv.Messages[i].Role == "system") continue; + if (uiIdx == bubbleIndex) + { + userMsgIdx = i; + break; + } + uiIdx++; + } + } + + if (userMsgIdx < 0) return; + + // 데이터 모델에서 편집된 메시지 이후 모두 제거 + lock (_convLock) + { + conv.Messages[userMsgIdx].Content = newText; + while (conv.Messages.Count > userMsgIdx + 1) + conv.Messages.RemoveAt(conv.Messages.Count - 1); + } + + // UI에서 편집된 버블 이후 모두 제거 + while (MessagePanel.Children.Count > bubbleIndex + 1) + MessagePanel.Children.RemoveAt(MessagePanel.Children.Count - 1); + + // 편집된 메시지를 새 버블로 교체 + MessagePanel.Children.RemoveAt(bubbleIndex); + AddMessageBubble("user", newText, animate: false); + + // 마지막 위치에 삽입되도록 조정 (AddMessageBubble은 끝에 추가됨) + // bubbleIndex가 끝이 아니면 이동 — 이 경우 이후가 다 제거되었으므로 끝에 추가됨 + + // AI 재응답 + await SendRegenerateAsync(conv); + try { _storage.Save(conv); } catch (Exception ex) { Services.LogService.Debug($"대화 저장 실패: {ex.Message}"); } + RefreshConversationList(); + } + + // ─── 스트리밍 커서 깜빡임 + AI 아이콘 펄스 ──────────────────────────── + + private void StopAiIconPulse() + { + if (_aiIconPulseStopped || _activeAiIcon == null) return; + _activeAiIcon.BeginAnimation(UIElement.OpacityProperty, null); + _activeAiIcon.Opacity = 1.0; + _activeAiIcon = null; + _aiIconPulseStopped = true; + } + + private void CursorTimer_Tick(object? sender, EventArgs e) + { + _cursorVisible = !_cursorVisible; + // 커서 상태만 토글 — 실제 텍스트 갱신은 _typingTimer가 담당 + if (_activeStreamText != null && _displayedLength > 0) + { + var displayed = _cachedStreamContent.Length > 0 + ? _cachedStreamContent[..Math.Min(_displayedLength, _cachedStreamContent.Length)] + : ""; + _activeStreamText.Text = displayed + (_cursorVisible ? "\u258c" : " "); + } + } + + private void ElapsedTimer_Tick(object? sender, EventArgs e) + { + var elapsed = DateTime.UtcNow - _streamStartTime; + var sec = (int)elapsed.TotalSeconds; + if (_elapsedLabel != null) + _elapsedLabel.Text = $"{sec}s"; + + // 하단 상태바 시간 갱신 + if (StatusElapsed != null) + StatusElapsed.Text = $"{sec}초"; + } + + private void TypingTimer_Tick(object? sender, EventArgs e) + { + if (_activeStreamText == null || string.IsNullOrEmpty(_cachedStreamContent)) return; + + var targetLen = _cachedStreamContent.Length; + if (_displayedLength >= targetLen) return; + + // 버퍼에 쌓인 미표시 글자 수에 따라 속도 적응 + var pending = targetLen - _displayedLength; + int step; + if (pending > 200) step = Math.Min(pending / 5, 40); // 대량 버퍼: 빠르게 따라잡기 + else if (pending > 50) step = Math.Min(pending / 4, 15); // 중간 버퍼: 적당히 가속 + else step = Math.Min(3, pending); // 소량: 자연스러운 1~3자 + + _displayedLength += step; + + var displayed = _cachedStreamContent[.._displayedLength]; + _activeStreamText.Text = displayed + (_cursorVisible ? "\u258c" : " "); + + // 스트리밍 중에는 즉시 스크롤 (부드러운 애니메이션은 지연 유발) + if (!_userScrolled) + MessageScroll.ScrollToVerticalOffset(MessageScroll.ScrollableHeight); + } + + // ─── 전송 ────────────────────────────────────────────────────────────── + + public void SendInitialMessage(string message) + { + StartNewConversation(); + InputBox.Text = message; + _ = SendMessageAsync(); + } + + private void StartNewConversation() + { + // 현재 대화가 있으면 저장 후 새 대화 시작 + lock (_convLock) + { + if (_currentConversation != null && _currentConversation.Messages.Count > 0) + try { _storage.Save(_currentConversation); } catch (Exception) { /* 대화 저장 실패 — UI 차단 방지 */ } + _currentConversation = new ChatConversation { Tab = _activeTab }; + // 작업 폴더가 설정에 있으면 새 대화에 자동 연결 (Cowork/Code 탭) + var workFolder = Llm.WorkFolder; + if (!string.IsNullOrEmpty(workFolder) && _activeTab != "Chat") + _currentConversation.WorkFolder = workFolder; + } + // 탭 기억 초기화 (새 대화이므로) + _tabConversationId[_activeTab] = null; + MessagePanel.Children.Clear(); + EmptyState.Visibility = Visibility.Visible; + _attachedFiles.Clear(); + RefreshAttachedFilesUI(); + UpdateChatTitle(); + RefreshConversationList(); + UpdateFolderBar(); + if (_activeTab == "Cowork") BuildBottomBar(); + } + + /// 설정에 저장된 탭별 마지막 대화 ID를 복원하고, 현재 탭의 대화를 로드합니다. + private void RestoreLastConversations() + { + var saved = Llm.LastConversationIds; + if (saved == null || saved.Count == 0) return; + + foreach (var kv in saved) + { + if (_tabConversationId.ContainsKey(kv.Key) && !string.IsNullOrEmpty(kv.Value)) + _tabConversationId[kv.Key] = kv.Value; + } + + // 현재 활성 탭의 대화를 즉시 로드 + var currentTabId = _tabConversationId.GetValueOrDefault(_activeTab); + if (!string.IsNullOrEmpty(currentTabId)) + { + var conv = _storage.Load(currentTabId); + if (conv != null) + { + if (string.IsNullOrEmpty(conv.Tab)) conv.Tab = _activeTab; + lock (_convLock) _currentConversation = conv; + MessagePanel.Children.Clear(); + foreach (var msg in conv.Messages) + AddMessageBubble(msg.Role, msg.Content, animate: false, message: msg); + EmptyState.Visibility = conv.Messages.Count > 0 ? Visibility.Collapsed : Visibility.Visible; + UpdateChatTitle(); + UpdateFolderBar(); + LoadConversationSettings(); + } + } + } + + /// 현재 _tabConversationId를 설정에 저장합니다. + private void SaveLastConversations() + { + var dict = new Dictionary(); + foreach (var kv in _tabConversationId) + { + if (!string.IsNullOrEmpty(kv.Value)) + dict[kv.Key] = kv.Value; + } + Llm.LastConversationIds = dict; + try { _settings.Save(); } catch (Exception) { /* 설정 저장 실패 */ } + } + + private async void BtnSend_Click(object sender, RoutedEventArgs e) => await SendMessageAsync(); + + private async void InputBox_PreviewKeyDown(object sender, KeyEventArgs e) + { + // Ctrl+V: 클립보드 이미지 붙여넣기 + if (e.Key == Key.V && Keyboard.Modifiers.HasFlag(ModifierKeys.Control)) + { + if (TryPasteClipboardImage()) + { + e.Handled = true; + return; + } + // 이미지가 아니면 기본 텍스트 붙여넣기로 위임 + } + + if (e.Key == Key.Enter) + { + if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)) + { + // Shift+Enter → 줄바꿈 (AcceptsReturn=true이므로 기본 동작으로 위임) + return; + } + + // 슬래시 팝업이 열려 있으면 선택된 항목 실행 + if (SlashPopup.IsOpen && _slashSelectedIndex >= 0) + { + e.Handled = true; + ExecuteSlashSelectedItem(); + return; + } + + // /help 직접 입력 시 도움말 창 표시 + if (InputBox.Text.Trim().Equals("/help", StringComparison.OrdinalIgnoreCase)) + { + e.Handled = true; + InputBox.Text = ""; + SlashPopup.IsOpen = false; + ShowSlashHelpWindow(); + return; + } + + // Enter만 → 메시지 전송 + e.Handled = true; + await SendMessageAsync(); + } + } + + /// 클립보드에 이미지가 있으면 붙여넣기. 성공 시 true. + private bool TryPasteClipboardImage() + { + if (!Llm.EnableImageInput) return false; + if (!Clipboard.ContainsImage()) return false; + + try + { + var img = Clipboard.GetImage(); + if (img == null) return false; + + // base64 인코딩 + var encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); + encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(img)); + using var ms = new System.IO.MemoryStream(); + encoder.Save(ms); + var bytes = ms.ToArray(); + + // 크기 제한 확인 + var maxKb = Llm.MaxImageSizeKb; + if (maxKb <= 0) maxKb = 5120; + if (bytes.Length > maxKb * 1024) + { + CustomMessageBox.Show($"이미지가 너무 큽니다 ({bytes.Length / 1024}KB, 최대 {maxKb}KB).", + "이미지 크기 초과", MessageBoxButton.OK, MessageBoxImage.Warning); + return true; // 처리됨 (에러이지만 이미지였음) + } + + var base64 = Convert.ToBase64String(bytes); + var attachment = new ImageAttachment + { + Base64 = base64, + MimeType = "image/png", + FileName = $"clipboard_{DateTime.Now:HHmmss}.png", + }; + + _pendingImages.Add(attachment); + AddImagePreview(attachment, img); + return true; + } + catch (Exception ex) + { + Services.LogService.Debug($"클립보드 이미지 붙여넣기 실패: {ex.Message}"); + return false; + } + } + + /// 이미지 미리보기 UI 추가. + private void AddImagePreview(ImageAttachment attachment, System.Windows.Media.Imaging.BitmapSource? thumbnail = null) + { + var secondaryBrush = ThemeResourceHelper.Secondary(this); + var hintBg = ThemeResourceHelper.Hint(this); + + var chip = new Border + { + Background = hintBg, + CornerRadius = new CornerRadius(6), + Padding = new Thickness(4), + Margin = new Thickness(0, 0, 4, 4), + }; + + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + + // 썸네일 이미지 + if (thumbnail != null) + { + sp.Children.Add(new System.Windows.Controls.Image + { + Source = thumbnail, + MaxHeight = 48, MaxWidth = 64, + Stretch = Stretch.Uniform, + Margin = new Thickness(0, 0, 4, 0), + }); + } + else + { + // base64에서 썸네일 생성 + sp.Children.Add(new TextBlock + { + Text = "\uE8B9", FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 16, + Foreground = secondaryBrush, VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(2, 0, 4, 0), + }); + } + + sp.Children.Add(new TextBlock + { + Text = attachment.FileName, FontSize = 10, Foreground = secondaryBrush, + VerticalAlignment = VerticalAlignment.Center, MaxWidth = 100, + TextTrimming = TextTrimming.CharacterEllipsis, + }); + + var capturedAttachment = attachment; + var capturedChip = chip; + var removeBtn = new Button + { + Content = new TextBlock { Text = "\uE711", FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 8, Foreground = secondaryBrush }, + Background = Brushes.Transparent, BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, Padding = new Thickness(4, 2, 4, 2), Margin = new Thickness(2, 0, 0, 0), + }; + removeBtn.Click += (_, _) => + { + _pendingImages.Remove(capturedAttachment); + AttachedFilesPanel.Items.Remove(capturedChip); + if (_pendingImages.Count == 0 && _attachedFiles.Count == 0) + AttachedFilesPanel.Visibility = Visibility.Collapsed; + }; + sp.Children.Add(removeBtn); + chip.Child = sp; + + AttachedFilesPanel.Items.Add(chip); + AttachedFilesPanel.Visibility = Visibility.Visible; + } + + // ─── 슬래시 명령어 + 드래그 앤 드롭 → ChatWindow.SlashCommands.cs ─── + + // ─── /help 도움말 창 ───────────────────────────────────────────────── + + private void ShowSlashHelpWindow() + { + var bg = ThemeResourceHelper.Background(this); + var fg = ThemeResourceHelper.Primary(this); + var fg2 = ThemeResourceHelper.Secondary(this); + var accent = ThemeResourceHelper.Accent(this); + var itemBg = ThemeResourceHelper.ItemBg(this); + var hoverBg = ThemeResourceHelper.HoverBg(this); + + var win = new Window + { + Title = "AX Agent — 슬래시 명령어 도움말", + Width = 560, Height = 640, MinWidth = 440, MinHeight = 500, + WindowStyle = WindowStyle.None, AllowsTransparency = true, + Background = Brushes.Transparent, ResizeMode = ResizeMode.CanResize, + WindowStartupLocation = WindowStartupLocation.CenterOwner, Owner = this, + Icon = Icon, + }; + + var mainBorder = new Border + { + Background = bg, CornerRadius = new CornerRadius(16), + BorderBrush = ThemeResourceHelper.Border(this), + BorderThickness = new Thickness(1), Margin = new Thickness(10), + Effect = new System.Windows.Media.Effects.DropShadowEffect { Color = Colors.Black, BlurRadius = 20, ShadowDepth = 4, Opacity = 0.3 }, + }; + + var rootGrid = new Grid(); + rootGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(52) }); + rootGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); + + // 헤더 + var headerBorder = new Border + { + CornerRadius = new CornerRadius(16, 16, 0, 0), + Background = new LinearGradientBrush( + Color.FromRgb(26, 27, 46), Color.FromRgb(59, 78, 204), + new Point(0, 0), new Point(1, 1)), + Padding = new Thickness(20, 0, 20, 0), + }; + var headerGrid = new Grid(); + var headerStack = new StackPanel { Orientation = Orientation.Horizontal, VerticalAlignment = VerticalAlignment.Center }; + headerStack.Children.Add(new TextBlock { Text = "\uE946", FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 16, Foreground = Brushes.LightCyan, Margin = new Thickness(0, 0, 10, 0), VerticalAlignment = VerticalAlignment.Center }); + headerStack.Children.Add(new TextBlock { Text = "슬래시 명령어 (/ Commands)", FontSize = 15, FontWeight = FontWeights.SemiBold, Foreground = Brushes.White, VerticalAlignment = VerticalAlignment.Center }); + headerGrid.Children.Add(headerStack); + + var closeBtn = new Border { Width = 30, Height = 30, CornerRadius = new CornerRadius(8), Background = Brushes.Transparent, Cursor = Cursors.Hand, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center }; + closeBtn.Child = new TextBlock { Text = "\uE711", FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 11, Foreground = new SolidColorBrush(Color.FromArgb(136, 170, 255, 204)), HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; + closeBtn.MouseEnter += (_, _) => closeBtn.Background = new SolidColorBrush(Color.FromArgb(34, 255, 255, 255)); + closeBtn.MouseLeave += (_, _) => closeBtn.Background = Brushes.Transparent; + closeBtn.MouseLeftButtonDown += (_, me) => { me.Handled = true; win.Close(); }; + headerGrid.Children.Add(closeBtn); + headerBorder.Child = headerGrid; + Grid.SetRow(headerBorder, 0); + rootGrid.Children.Add(headerBorder); + + // 콘텐츠 + var scroll = new ScrollViewer { VerticalScrollBarVisibility = ScrollBarVisibility.Auto, Padding = new Thickness(20, 14, 20, 20) }; + var contentPanel = new StackPanel(); + + // 설명 + contentPanel.Children.Add(new TextBlock { Text = "입력창에 /를 입력하면 사용할 수 있는 명령어가 표시됩니다.\n명령어를 선택한 후 내용을 입력하면 해당 기능이 적용됩니다.", FontSize = 12, Foreground = fg2, TextWrapping = TextWrapping.Wrap, Margin = new Thickness(0, 0, 0, 16), LineHeight = 20 }); + + // 공통 명령어 섹션 + AddHelpSection(contentPanel, "📌 공통 명령어", "모든 탭(Chat, Cowork, Code)에서 사용 가능", fg, fg2, accent, itemBg, hoverBg, + ("/summary", "텍스트/문서를 핵심 포인트 중심으로 요약합니다."), + ("/translate", "텍스트를 영어로 번역합니다. 원문의 톤을 유지합니다."), + ("/explain", "내용을 쉽고 자세하게 설명합니다. 예시를 포함합니다."), + ("/fix", "맞춤법, 문법, 자연스러운 표현을 교정합니다.")); + + // 개발 명령어 섹션 + AddHelpSection(contentPanel, "🛠️ 개발 명령어", "Cowork, Code 탭에서만 사용 가능", fg, fg2, accent, itemBg, hoverBg, + ("/review", "Git diff를 분석하여 버그, 성능, 보안 이슈를 찾습니다."), + ("/pr", "변경사항을 PR 설명 형식(Summary, Changes, Test Plan)으로 요약합니다."), + ("/test", "코드에 대한 단위 테스트를 자동 생성합니다."), + ("/structure", "프로젝트의 폴더/파일 구조를 분석하고 설명합니다."), + ("/build", "프로젝트를 빌드합니다. 오류 발생 시 분석합니다."), + ("/search", "자연어로 코드베이스를 시맨틱 검색합니다.")); + + // 스킬 명령어 섹션 + var skills = SkillService.Skills; + if (skills.Count > 0) + { + var skillItems = skills.Select(s => ($"/{s.Name}", s.Description)).ToArray(); + AddHelpSection(contentPanel, "⚡ 스킬 명령어", $"{skills.Count}개 로드됨 — %APPDATA%\\AxCopilot\\skills\\에서 추가 가능", fg, fg2, accent, itemBg, hoverBg, skillItems); + } + + // 사용 팁 + contentPanel.Children.Add(new Border { Height = 1, Background = new SolidColorBrush(Color.FromArgb(30, 255, 255, 255)), Margin = new Thickness(0, 12, 0, 12) }); + var tipPanel = new StackPanel(); + tipPanel.Children.Add(new TextBlock { Text = "💡 사용 팁", FontSize = 13, FontWeight = FontWeights.SemiBold, Foreground = fg, Margin = new Thickness(0, 0, 0, 8) }); + var tips = new[] + { + "/ 입력 시 현재 탭에 맞는 명령어만 자동완성됩니다.", + "파일을 드래그하면 유형별 AI 액션 팝업이 나타납니다.", + "스킬 파일(*.skill.md)을 추가하면 나만의 워크플로우를 만들 수 있습니다.", + "Cowork/Code 탭에서 에이전트가 도구를 활용하여 더 강력한 작업을 수행합니다.", + }; + foreach (var tip in tips) + { + tipPanel.Children.Add(new TextBlock { Text = $"• {tip}", FontSize = 12, Foreground = fg2, Margin = new Thickness(8, 2, 0, 2), TextWrapping = TextWrapping.Wrap, LineHeight = 18 }); + } + contentPanel.Children.Add(tipPanel); + + scroll.Content = contentPanel; + Grid.SetRow(scroll, 1); + rootGrid.Children.Add(scroll); + + mainBorder.Child = rootGrid; + win.Content = mainBorder; + // 헤더 영역에서만 드래그 이동 (닫기 버튼 클릭 방해 방지) + headerBorder.MouseLeftButtonDown += (_, me) => { try { win.DragMove(); } catch (Exception) { /* 드래그 이동 실패 — 마우스 릴리즈 시 발생 가능 */ } }; + win.ShowDialog(); + } + + private static void AddHelpSection(StackPanel parent, string title, string subtitle, + Brush fg, Brush fg2, Brush accent, Brush itemBg, Brush hoverBg, + params (string Cmd, string Desc)[] items) + { + parent.Children.Add(new TextBlock { Text = title, FontSize = 14, FontWeight = FontWeights.SemiBold, Foreground = fg, Margin = new Thickness(0, 8, 0, 2) }); + parent.Children.Add(new TextBlock { Text = subtitle, FontSize = 11, Foreground = fg2, Margin = new Thickness(0, 0, 0, 8) }); + + foreach (var (cmd, desc) in items) + { + var row = new Border { Background = itemBg, CornerRadius = new CornerRadius(8), Padding = new Thickness(12, 8, 12, 8), Margin = new Thickness(0, 3, 0, 3) }; + var grid = new Grid(); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(120) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + + var cmdText = new TextBlock { Text = cmd, FontSize = 13, FontWeight = FontWeights.SemiBold, Foreground = accent, VerticalAlignment = VerticalAlignment.Center, FontFamily = ThemeResourceHelper.Consolas }; + Grid.SetColumn(cmdText, 0); + grid.Children.Add(cmdText); + + var descText = new TextBlock { Text = desc, FontSize = 12, Foreground = fg2, VerticalAlignment = VerticalAlignment.Center, TextWrapping = TextWrapping.Wrap }; + Grid.SetColumn(descText, 1); + grid.Children.Add(descText); + + row.Child = grid; + row.MouseEnter += (_, _) => row.Background = hoverBg; + row.MouseLeave += (_, _) => row.Background = itemBg; + parent.Children.Add(row); + } + } + + private async Task SendMessageAsync() + { + var rawText = InputBox.Text.Trim(); + + // 슬래시 칩이 활성화된 경우 명령어 앞에 붙임 + var text = _activeSlashCmd != null + ? (_activeSlashCmd + " " + rawText).Trim() + : rawText; + HideSlashChip(restoreText: false); + + if (string.IsNullOrEmpty(text) || _isStreaming) return; + + // placeholder 정리 + ClearPromptCardPlaceholder(); + + // 슬래시 명령어 처리 + var (slashSystem, displayText) = ParseSlashCommand(text); + + // 탭 전환 시에도 올바른 탭에 저장하기 위해 시작 시점의 탭을 캡처 + var originTab = _activeTab; + + ChatConversation conv; + lock (_convLock) + { + if (_currentConversation == null) _currentConversation = new ChatConversation { Tab = _activeTab }; + conv = _currentConversation; + } + + var userMsg = new ChatMessage { Role = "user", Content = text }; + lock (_convLock) conv.Messages.Add(userMsg); + + if (conv.Messages.Count(m => m.Role == "user") == 1) + conv.Title = text.Length > 30 ? text[..30] + "…" : text; + + UpdateChatTitle(); + AddMessageBubble("user", text); + InputBox.Text = ""; + EmptyState.Visibility = Visibility.Collapsed; + + // 대화 통계 기록 + Services.UsageStatisticsService.RecordChat(_activeTab); + + ForceScrollToEnd(); // 사용자 메시지 전송 시 강제 하단 이동 + PlayRainbowGlow(); // 무지개 글로우 애니메이션 + + _isStreaming = true; + BtnSend.IsEnabled = false; + BtnSend.Visibility = Visibility.Collapsed; + BtnStop.Visibility = Visibility.Visible; + if (_activeTab == "Cowork" || _activeTab == "Code") + BtnPause.Visibility = Visibility.Visible; + _streamCts = new CancellationTokenSource(); + + var assistantMsg = new ChatMessage { Role = "assistant", Content = "" }; + lock (_convLock) conv.Messages.Add(assistantMsg); + + // 어시스턴트 스트리밍 컨테이너 + var streamContainer = CreateStreamingContainer(out var streamText); + MessagePanel.Children.Add(streamContainer); + ForceScrollToEnd(); // 응답 시작 시 강제 하단 이동 + + var sb = new System.Text.StringBuilder(); + _activeStreamText = streamText; + _cachedStreamContent = ""; + _displayedLength = 0; + _cursorVisible = true; + _aiIconPulseStopped = false; + _cursorTimer.Start(); + _typingTimer.Start(); + _streamStartTime = DateTime.UtcNow; + _elapsedTimer.Start(); + SetStatus("응답 생성 중...", spinning: true); + + // ── 자동 모델 라우팅 (try 외부 선언 — finally에서 정리) ── + ModelRouteResult? routeResult = null; + + try + { + List sendMessages; + lock (_convLock) sendMessages = conv.Messages.SkipLast(1).ToList(); + + // 시스템 명령어가 있으면 삽입 + if (!string.IsNullOrEmpty(conv.SystemCommand)) + sendMessages.Insert(0, new ChatMessage { Role = "system", Content = conv.SystemCommand }); + + // 슬래시 명령어 시스템 프롬프트 삽입 + if (!string.IsNullOrEmpty(slashSystem)) + sendMessages.Insert(0, new ChatMessage { Role = "system", Content = slashSystem }); + + // 첨부 파일 컨텍스트 삽입 + if (_attachedFiles.Count > 0) + { + var fileContext = BuildFileContextPrompt(); + if (!string.IsNullOrEmpty(fileContext)) + { + var lastUserIdx = sendMessages.FindLastIndex(m => m.Role == "user"); + if (lastUserIdx >= 0) + sendMessages[lastUserIdx] = new ChatMessage { Role = "user", Content = sendMessages[lastUserIdx].Content + fileContext }; + } + // 첨부 파일 목록 기록 후 항상 정리 (파일 읽기 실패해도) + userMsg.AttachedFiles = _attachedFiles.ToList(); + _attachedFiles.Clear(); + RefreshAttachedFilesUI(); + } + + // ── 이미지 첨부 ── + if (_pendingImages.Count > 0) + { + userMsg.Images = _pendingImages.ToList(); + // 마지막 사용자 메시지에 이미지 데이터 연결 + var lastUserIdx = sendMessages.FindLastIndex(m => m.Role == "user"); + if (lastUserIdx >= 0) + sendMessages[lastUserIdx] = new ChatMessage + { + Role = "user", + Content = sendMessages[lastUserIdx].Content, + Images = _pendingImages.ToList(), + }; + _pendingImages.Clear(); + AttachedFilesPanel.Items.Clear(); + if (_attachedFiles.Count == 0) AttachedFilesPanel.Visibility = Visibility.Collapsed; + } + + // ── 자동 모델 라우팅 ── + if (Llm.EnableAutoRouter) + { + routeResult = _router.Route(text); + if (routeResult != null) + { + _llm.PushRouteOverride(routeResult.Service, routeResult.Model); + SetStatus($"라우팅: {routeResult.DetectedIntent} → {routeResult.DisplayName}", spinning: true); + } + } + + if (_activeTab is "Cowork" or "Code") + { + // Phase 34: Cowork/Code 공통 에이전트 루프 실행 + var agentResponse = await RunAgentLoopAsync(_activeTab, sendMessages, _streamCts!.Token); + sb.Append(agentResponse); + assistantMsg.Content = agentResponse; + StopAiIconPulse(); + _cachedStreamContent = agentResponse; + } + else if (Llm.Streaming) + { + await foreach (var chunk in _llm.StreamAsync(sendMessages, _streamCts.Token)) + { + sb.Append(chunk); + StopAiIconPulse(); + _cachedStreamContent = sb.ToString(); + // UI 스레드에 제어 양보 — DispatcherTimer가 화면 갱신할 수 있도록 + await Dispatcher.InvokeAsync(() => { }, DispatcherPriority.Background); + } + _cachedStreamContent = sb.ToString(); + assistantMsg.Content = _cachedStreamContent; + + // 타이핑 애니메이션이 남은 버퍼를 소진할 때까지 대기 (최대 600ms) + var drainStart = DateTime.UtcNow; + while (_displayedLength < _cachedStreamContent.Length + && (DateTime.UtcNow - drainStart).TotalMilliseconds < 600) + { + await Dispatcher.InvokeAsync(() => { }, DispatcherPriority.Background); + } + } + else + { + var response = await _llm.SendAsync(sendMessages, _streamCts.Token); + sb.Append(response); + assistantMsg.Content = response; + } + } + catch (OperationCanceledException) + { + if (sb.Length == 0) sb.Append("(취소됨)"); + assistantMsg.Content = sb.ToString(); + } + catch (Exception ex) + { + var errMsg = $"⚠ 오류: {ex.Message}"; + sb.Clear(); sb.Append(errMsg); + assistantMsg.Content = errMsg; + AddRetryButton(); + } + finally + { + // 자동 라우팅 오버라이드 해제 + if (routeResult != null) + { + _llm.ClearRouteOverride(); + UpdateModelLabel(); + } + + _cursorTimer.Stop(); + _elapsedTimer.Stop(); + _typingTimer.Stop(); + HideStickyProgress(); // 에이전트 프로그레스 바 + 타이머 정리 + StopRainbowGlow(); // 레인보우 글로우 종료 + _activeStreamText = null; + _elapsedLabel = null; + _cachedStreamContent = ""; + _isStreaming = false; + BtnSend.IsEnabled = true; + BtnStop.Visibility = Visibility.Collapsed; + BtnSend.Visibility = Visibility.Visible; + _streamCts?.Dispose(); + _streamCts = null; + SetStatusIdle(); + } + + // 스트리밍 plaintext → 마크다운 렌더링으로 교체 + FinalizeStreamingContainer(streamContainer, streamText, assistantMsg.Content, assistantMsg); + AutoScrollIfNeeded(); + + try { _storage.Save(conv); } catch (Exception ex) { Services.LogService.Debug($"대화 저장 실패: {ex.Message}"); } + _tabConversationId[originTab] = conv.Id; + RefreshConversationList(); + } + + // ─── Agent Support → ChatWindow.AgentSupport.cs ─── + // ─── Task Decomposition UI → ChatWindow.TaskDecomposition.cs ─── + // ─── 응답 재생성 ────────────────────────────────────────────────────── + + private async Task RegenerateLastAsync() + { + if (_isStreaming) return; + ChatConversation conv; + lock (_convLock) + { + if (_currentConversation == null) return; + conv = _currentConversation; + } + + // 마지막 assistant 메시지 제거 + lock (_convLock) + { + if (conv.Messages.Count > 0 && conv.Messages[^1].Role == "assistant") + conv.Messages.RemoveAt(conv.Messages.Count - 1); + } + + // UI에서 마지막 AI 응답 제거 + if (MessagePanel.Children.Count > 0) + MessagePanel.Children.RemoveAt(MessagePanel.Children.Count - 1); + + // 재전송 + await SendRegenerateAsync(conv); + } + + /// "수정 후 재시도" — 피드백 입력 패널을 표시하고, 사용자 지시를 추가하여 재생성합니다. + private void ShowRetryWithFeedbackInput() + { + if (_isStreaming) return; + var accentBrush = ThemeResourceHelper.Accent(this); + var itemBg = ThemeResourceHelper.ItemBg(this); + var primaryText = ThemeResourceHelper.Primary(this); + var secondaryText = ThemeResourceHelper.Secondary(this); + var borderBrush = ThemeResourceHelper.Border(this); + + var container = new Border + { + Margin = new Thickness(40, 4, 40, 8), + Padding = new Thickness(14, 10, 14, 10), + CornerRadius = new CornerRadius(12), + Background = itemBg, + HorizontalAlignment = HorizontalAlignment.Stretch, + }; + + var stack = new StackPanel(); + stack.Children.Add(new TextBlock + { + Text = "어떻게 수정하면 좋을지 알려주세요:", + FontSize = 12, + Foreground = secondaryText, + Margin = new Thickness(0, 0, 0, 6), + }); + + var textBox = new TextBox + { + MinHeight = 38, + MaxHeight = 80, + AcceptsReturn = true, + TextWrapping = TextWrapping.Wrap, + FontSize = 13, + Background = ThemeResourceHelper.Background(this), + Foreground = primaryText, + CaretBrush = primaryText, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Padding = new Thickness(10, 6, 10, 6), + }; + stack.Children.Add(textBox); + + var btnRow = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(0, 8, 0, 0), + }; + + var sendBtn = new Border + { + Background = accentBrush, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(14, 6, 14, 6), + Cursor = Cursors.Hand, + Margin = new Thickness(6, 0, 0, 0), + }; + sendBtn.Child = new TextBlock { Text = "재시도", FontSize = 12, FontWeight = FontWeights.SemiBold, Foreground = Brushes.White }; + sendBtn.MouseEnter += (s, _) => ((Border)s).Opacity = 0.85; + sendBtn.MouseLeave += (s, _) => ((Border)s).Opacity = 1.0; + sendBtn.MouseLeftButtonUp += (_, _) => + { + var feedback = textBox.Text.Trim(); + if (string.IsNullOrEmpty(feedback)) return; + MessagePanel.Children.Remove(container); + _ = RetryWithFeedbackAsync(feedback); + }; + + var cancelBtn = new Border + { + Background = Brushes.Transparent, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(12, 6, 12, 6), + Cursor = Cursors.Hand, + }; + cancelBtn.Child = new TextBlock { Text = "취소", FontSize = 12, Foreground = secondaryText }; + cancelBtn.MouseLeftButtonUp += (_, _) => MessagePanel.Children.Remove(container); + + btnRow.Children.Add(cancelBtn); + btnRow.Children.Add(sendBtn); + stack.Children.Add(btnRow); + container.Child = stack; + + ApplyMessageEntryAnimation(container); + MessagePanel.Children.Add(container); + ForceScrollToEnd(); + textBox.Focus(); + } + + /// 사용자 피드백과 함께 마지막 응답을 재생성합니다. + private async Task RetryWithFeedbackAsync(string feedback) + { + if (_isStreaming) return; + ChatConversation conv; + lock (_convLock) + { + if (_currentConversation == null) return; + conv = _currentConversation; + } + + // 마지막 assistant 메시지 제거 + lock (_convLock) + { + if (conv.Messages.Count > 0 && conv.Messages[^1].Role == "assistant") + conv.Messages.RemoveAt(conv.Messages.Count - 1); + } + + // UI에서 마지막 AI 응답 제거 + if (MessagePanel.Children.Count > 0) + MessagePanel.Children.RemoveAt(MessagePanel.Children.Count - 1); + + // 피드백을 사용자 메시지로 추가 + var feedbackMsg = new ChatMessage + { + Role = "user", + Content = $"[이전 응답에 대한 수정 요청] {feedback}\n\n위 피드백을 반영하여 다시 작성해주세요." + }; + lock (_convLock) conv.Messages.Add(feedbackMsg); + + // 피드백 메시지 UI 표시 + AddMessageBubble("user", $"[수정 요청] {feedback}", true); + + // 재전송 + await SendRegenerateAsync(conv); + } + + private async Task SendRegenerateAsync(ChatConversation conv) + { + _isStreaming = true; + BtnSend.IsEnabled = false; + BtnSend.Visibility = Visibility.Collapsed; + BtnStop.Visibility = Visibility.Visible; + _streamCts = new CancellationTokenSource(); + + var assistantMsg = new ChatMessage { Role = "assistant", Content = "" }; + lock (_convLock) conv.Messages.Add(assistantMsg); + + var streamContainer = CreateStreamingContainer(out var streamText); + MessagePanel.Children.Add(streamContainer); + ForceScrollToEnd(); // 응답 시작 시 강제 하단 이동 + + var sb = new System.Text.StringBuilder(); + _activeStreamText = streamText; + _cachedStreamContent = ""; + _displayedLength = 0; + _cursorVisible = true; + _aiIconPulseStopped = false; + _cursorTimer.Start(); + _typingTimer.Start(); + _streamStartTime = DateTime.UtcNow; + _elapsedTimer.Start(); + SetStatus("에이전트 작업 중...", spinning: true); + + try + { + List sendMessages; + lock (_convLock) sendMessages = conv.Messages.SkipLast(1).ToList(); + if (!string.IsNullOrEmpty(conv.SystemCommand)) + sendMessages.Insert(0, new ChatMessage { Role = "system", Content = conv.SystemCommand }); + + await foreach (var chunk in _llm.StreamAsync(sendMessages, _streamCts.Token)) + { + sb.Append(chunk); + StopAiIconPulse(); + _cachedStreamContent = sb.ToString(); + await Dispatcher.InvokeAsync(() => { }, DispatcherPriority.Background); + } + _cachedStreamContent = sb.ToString(); + assistantMsg.Content = _cachedStreamContent; + + // 타이핑 애니메이션이 남은 버퍼를 소진할 때까지 대기 (최대 600ms) + var drainStart2 = DateTime.UtcNow; + while (_displayedLength < _cachedStreamContent.Length + && (DateTime.UtcNow - drainStart2).TotalMilliseconds < 600) + { + await Dispatcher.InvokeAsync(() => { }, DispatcherPriority.Background); + } + } + catch (OperationCanceledException) + { + if (sb.Length == 0) sb.Append("(취소됨)"); + assistantMsg.Content = sb.ToString(); + } + catch (Exception ex) + { + var errMsg = $"⚠ 오류: {ex.Message}"; + sb.Clear(); sb.Append(errMsg); + assistantMsg.Content = errMsg; + AddRetryButton(); + } + finally + { + _cursorTimer.Stop(); + _elapsedTimer.Stop(); + _typingTimer.Stop(); + HideStickyProgress(); // 에이전트 프로그레스 바 + 타이머 정리 + StopRainbowGlow(); // 레인보우 글로우 종료 + _activeStreamText = null; + _elapsedLabel = null; + _cachedStreamContent = ""; + _isStreaming = false; + BtnSend.IsEnabled = true; + BtnStop.Visibility = Visibility.Collapsed; + BtnSend.Visibility = Visibility.Visible; + _streamCts?.Dispose(); + _streamCts = null; + SetStatusIdle(); + } + + FinalizeStreamingContainer(streamContainer, streamText, assistantMsg.Content, assistantMsg); + AutoScrollIfNeeded(); + + try { _storage.Save(conv); } catch (Exception ex) { Services.LogService.Debug($"대화 저장 실패: {ex.Message}"); } + _tabConversationId[conv.Tab ?? _activeTab] = conv.Id; + RefreshConversationList(); + } + + /// 메시지 버블의 MaxWidth를 창 너비에 비례하여 계산합니다 (최소 500, 최대 1200). + private double GetMessageMaxWidth() + { + var scrollWidth = MessageScroll.ActualWidth; + if (scrollWidth < 100) scrollWidth = 700; // 초기화 전 기본값 + // 좌우 마진(40+80=120)을 빼고 전체의 90% + var maxW = (scrollWidth - 120) * 0.90; + return Math.Clamp(maxW, 500, 1200); + } + + private StackPanel CreateStreamingContainer(out TextBlock streamText) + { + var msgMaxWidth = GetMessageMaxWidth(); + var container = new StackPanel + { + HorizontalAlignment = HorizontalAlignment.Left, + Width = msgMaxWidth, + MaxWidth = msgMaxWidth, + Margin = new Thickness(40, 8, 80, 8), + Opacity = 0, + RenderTransform = new TranslateTransform(0, 10) + }; + + // 컨테이너 페이드인 + 슬라이드 업 + container.BeginAnimation(UIElement.OpacityProperty, + new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(280))); + ((TranslateTransform)container.RenderTransform).BeginAnimation( + TranslateTransform.YProperty, + new DoubleAnimation(10, 0, TimeSpan.FromMilliseconds(300)) + { EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseOut } }); + + var headerGrid = new Grid { Margin = new Thickness(0, 0, 0, 4) }; + headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + + var aiIcon = new TextBlock + { + Text = "\uE8BD", FontFamily = ThemeResourceHelper.SegoeMdl2, FontSize = 12, + Foreground = ThemeResourceHelper.Accent(this), + VerticalAlignment = VerticalAlignment.Center + }; + // AI 아이콘 펄스 애니메이션 (응답 대기 중) + aiIcon.BeginAnimation(UIElement.OpacityProperty, + new DoubleAnimation(1.0, 0.35, TimeSpan.FromMilliseconds(700)) + { AutoReverse = true, RepeatBehavior = RepeatBehavior.Forever, + EasingFunction = new SineEase() }); + _activeAiIcon = aiIcon; + Grid.SetColumn(aiIcon, 0); + headerGrid.Children.Add(aiIcon); + + var (streamAgentName, _, _) = GetAgentIdentity(); + var aiNameTb = new TextBlock + { + Text = streamAgentName, FontSize = 11, FontWeight = FontWeights.SemiBold, + Foreground = ThemeResourceHelper.Accent(this), + Margin = new Thickness(6, 0, 0, 0), VerticalAlignment = VerticalAlignment.Center + }; + Grid.SetColumn(aiNameTb, 1); + headerGrid.Children.Add(aiNameTb); + + // 실시간 경과 시간 (헤더 우측) + _elapsedLabel = new TextBlock + { + Text = "0s", + FontSize = 10.5, + Foreground = ThemeResourceHelper.Secondary(this), + HorizontalAlignment = HorizontalAlignment.Right, + VerticalAlignment = VerticalAlignment.Center, + Opacity = 0.5, + }; + Grid.SetColumn(_elapsedLabel, 2); + headerGrid.Children.Add(_elapsedLabel); + + container.Children.Add(headerGrid); + + streamText = new TextBlock + { + Text = "\u258c", // 블록 커서만 표시 (첫 청크 전) + FontSize = 13.5, + Foreground = ThemeResourceHelper.Secondary(this), + TextWrapping = TextWrapping.Wrap, LineHeight = 22, + }; + container.Children.Add(streamText); + return container; + } + + // ─── 스트리밍 완료 후 마크다운 렌더링으로 교체 ─────────────────────── + + private void FinalizeStreamingContainer(StackPanel container, TextBlock streamText, string finalContent, ChatMessage? message = null) + { + // 스트리밍 plaintext 블록 제거 + container.Children.Remove(streamText); + + // 마크다운 렌더링 + var primaryText = ThemeResourceHelper.Primary(this); + var secondaryText = ThemeResourceHelper.Secondary(this); + var accentBrush = ThemeResourceHelper.Accent(this); + var codeBgBrush = ThemeResourceHelper.Hint(this); + + var mdPanel = MarkdownRenderer.Render(finalContent, primaryText, secondaryText, accentBrush, codeBgBrush); + mdPanel.Margin = new Thickness(0, 0, 0, 4); + mdPanel.Opacity = 0; + container.Children.Add(mdPanel); + mdPanel.BeginAnimation(UIElement.OpacityProperty, + new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(180))); + + // 액션 버튼 바 + 토큰 표시 + var btnColor = ThemeResourceHelper.Secondary(this); + var capturedContent = finalContent; + var actionBar = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Left, + Margin = new Thickness(0, 6, 0, 0) + }; + actionBar.Children.Add(CreateActionButton("\uE8C8", "복사", btnColor, () => + { + try { Clipboard.SetText(capturedContent); } catch (Exception) { /* 클립보드 접근 실패 */ } + })); + actionBar.Children.Add(CreateActionButton("\uE72C", "다시 생성", btnColor, () => _ = RegenerateLastAsync())); + actionBar.Children.Add(CreateActionButton("\uE70F", "수정 후 재시도", btnColor, () => ShowRetryWithFeedbackInput())); + AddLinkedFeedbackButtons(actionBar, btnColor, message); + + container.Children.Add(actionBar); + + // 경과 시간 + 토큰 사용량 (우측 하단, 별도 줄) + var elapsed = DateTime.UtcNow - _streamStartTime; + var elapsedText = elapsed.TotalSeconds < 60 + ? $"{elapsed.TotalSeconds:0.#}s" + : $"{(int)elapsed.TotalMinutes}m {elapsed.Seconds}s"; + + var usage = _llm.LastTokenUsage; + // 에이전트 루프(Cowork/Code)에서는 누적 토큰 사용, 일반 대화에서는 마지막 호출 토큰 사용 + var isAgentTab = _activeTab is "Cowork" or "Code"; + var displayInput = isAgentTab && _agentCumulativeInputTokens > 0 + ? _agentCumulativeInputTokens + : usage?.PromptTokens ?? 0; + var displayOutput = isAgentTab && _agentCumulativeOutputTokens > 0 + ? _agentCumulativeOutputTokens + : usage?.CompletionTokens ?? 0; + + if (displayInput > 0 || displayOutput > 0) + { + UpdateStatusTokens(displayInput, displayOutput); + Services.UsageStatisticsService.RecordTokens(displayInput, displayOutput); + } + string tokenText; + if (displayInput > 0 || displayOutput > 0) + tokenText = $"{FormatTokenCount(displayInput)} + {FormatTokenCount(displayOutput)} = {FormatTokenCount(displayInput + displayOutput)} tokens"; + else if (usage != null) + tokenText = $"{FormatTokenCount(usage.PromptTokens)} + {FormatTokenCount(usage.CompletionTokens)} = {FormatTokenCount(usage.TotalTokens)} tokens"; + else + tokenText = $"~{FormatTokenCount(EstimateTokenCount(finalContent))} tokens"; + + var metaText = new TextBlock + { + Text = $"{elapsedText} · {tokenText}", + FontSize = 10.5, + Foreground = ThemeResourceHelper.Secondary(this), + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(0, 6, 0, 0), + Opacity = 0.6, + }; + container.Children.Add(metaText); + + // Suggestion chips — AI가 번호 선택지를 제시한 경우 클릭 가능 버튼 표시 + var chips = ParseSuggestionChips(finalContent); + if (chips.Count > 0) + { + var chipPanel = new WrapPanel + { + Margin = new Thickness(0, 8, 0, 4), + HorizontalAlignment = HorizontalAlignment.Left, + }; + foreach (var (num, label) in chips) + { + var chipBorder = new Border + { + Background = ThemeResourceHelper.ItemBg(this), + BorderBrush = ThemeResourceHelper.Border(this), + BorderThickness = new Thickness(1), + CornerRadius = new CornerRadius(16), + Padding = new Thickness(14, 7, 14, 7), + Margin = new Thickness(0, 0, 8, 6), + Cursor = Cursors.Hand, + RenderTransformOrigin = new Point(0.5, 0.5), + RenderTransform = new ScaleTransform(1, 1), + }; + chipBorder.Child = new TextBlock + { + Text = $"{num}. {label}", + FontSize = 12.5, + Foreground = ThemeResourceHelper.Primary(this), + }; + + var chipHover = ThemeResourceHelper.HoverBg(this); + var chipNormal = ThemeResourceHelper.ItemBg(this); + chipBorder.MouseEnter += (s, _) => + { + if (s is Border b && b.RenderTransform is ScaleTransform st) + { st.ScaleX = 1.02; st.ScaleY = 1.02; b.Background = chipHover; } + }; + chipBorder.MouseLeave += (s, _) => + { + if (s is Border b && b.RenderTransform is ScaleTransform st) + { st.ScaleX = 1.0; st.ScaleY = 1.0; b.Background = chipNormal; } + }; + + var capturedLabel = $"{num}. {label}"; + var capturedPanel = chipPanel; + chipBorder.MouseLeftButtonDown += (_, _) => + { + // 칩 패널 제거 (1회용) + if (capturedPanel.Parent is Panel parent) + parent.Children.Remove(capturedPanel); + // 선택한 옵션을 사용자 메시지로 전송 + InputBox.Text = capturedLabel; + _ = SendMessageAsync(); + }; + chipPanel.Children.Add(chipBorder); + } + container.Children.Add(chipPanel); + } + } + + /// AI 응답에서 번호 선택지를 파싱합니다. (1. xxx / 2. xxx 패턴) + private static List<(string Num, string Label)> ParseSuggestionChips(string content) + { + var chips = new List<(string, string)>(); + if (string.IsNullOrEmpty(content)) return chips; + + var lines = content.Split('\n'); + // 마지막 번호 목록 블록을 찾음 (연속된 번호 라인) + var candidates = new List<(string, string)>(); + var lastBlockStart = -1; + + for (int i = 0; i < lines.Length; i++) + { + var line = lines[i].Trim(); + // "1. xxx", "2) xxx", "① xxx" 등 번호 패턴 + var m = System.Text.RegularExpressions.Regex.Match(line, @"^(\d+)[.\)]\s+(.+)$"); + if (m.Success) + { + if (lastBlockStart < 0 || i == lastBlockStart + candidates.Count) + { + if (lastBlockStart < 0) { lastBlockStart = i; candidates.Clear(); } + candidates.Add((m.Groups[1].Value, m.Groups[2].Value.TrimEnd())); + } + else + { + // 새로운 블록 시작 + lastBlockStart = i; + candidates.Clear(); + candidates.Add((m.Groups[1].Value, m.Groups[2].Value.TrimEnd())); + } + } + else if (!string.IsNullOrWhiteSpace(line)) + { + // 번호 목록이 아닌 줄이 나오면 블록 리셋 + lastBlockStart = -1; + candidates.Clear(); + } + // 빈 줄은 블록 유지 (번호 목록 사이 빈 줄 허용) + } + + // 2개 이상 선택지, 10개 이하일 때만 chips로 표시 + if (candidates.Count >= 2 && candidates.Count <= 10) + chips.AddRange(candidates); + + return chips; + } + + /// 토큰 수를 k/m 단위로 포맷 + private static string FormatTokenCount(int count) => count switch + { + >= 1_000_000 => $"{count / 1_000_000.0:0.#}m", + >= 1_000 => $"{count / 1_000.0:0.#}k", + _ => count.ToString(), + }; + + /// 토큰 수 추정 (한국어~3자/토큰, 영어~4자/토큰, 혼합 평균 ~3자/토큰) + private static int EstimateTokenCount(string text) + { + if (string.IsNullOrEmpty(text)) return 0; + // 한국어 문자 비율에 따라 가중 + int cjk = 0; + foreach (var c in text) + if (c >= 0xAC00 && c <= 0xD7A3 || c >= 0x3000 && c <= 0x9FFF) cjk++; + double ratio = text.Length > 0 ? (double)cjk / text.Length : 0; + double charsPerToken = 4.0 - ratio * 2.0; // 영어 4, 한국어 2 + return Math.Max(1, (int)Math.Round(text.Length / charsPerToken)); + } + + // ─── 생성 중지 ────────────────────────────────────────────────────── + + private void StopGeneration() + { + _streamCts?.Cancel(); + } + + // ─── 대화 내보내기 ────────────────────────────────────────────────── + + // ─── 대화 분기 (Fork) ────────────────────────────────────────────── + + private void ForkConversation(ChatConversation source, int atIndex) + { + var branchCount = _storage.LoadAllMeta() + .Count(m => m.ParentId == source.Id) + 1; + + var fork = new ChatConversation + { + Title = $"{source.Title} (분기 {branchCount})", + Tab = source.Tab, + Category = source.Category, + WorkFolder = source.WorkFolder, + SystemCommand = source.SystemCommand, + ParentId = source.Id, + BranchLabel = $"분기 {branchCount}", + BranchAtIndex = atIndex, + }; + + // 분기 시점까지의 메시지 복제 + for (int i = 0; i <= atIndex && i < source.Messages.Count; i++) + { + var m = source.Messages[i]; + fork.Messages.Add(new ChatMessage + { + Role = m.Role, + Content = m.Content, + Timestamp = m.Timestamp, + }); + } + + try + { + _storage.Save(fork); + ShowToast($"분기 생성: {fork.Title}"); + + // 분기 대화로 전환 + lock (_convLock) _currentConversation = fork; + ChatTitle.Text = fork.Title; + RenderMessages(); + RefreshConversationList(); + } + catch (Exception ex) + { + ShowToast($"분기 실패: {ex.Message}", "\uE783"); + } + } + + // ─── 커맨드 팔레트 ───────────────────────────────────────────────── + + private void OpenCommandPalette() + { + var palette = new CommandPaletteWindow(ExecuteCommand) { Owner = this }; + palette.ShowDialog(); + } + + private void ExecuteCommand(string commandId) + { + switch (commandId) + { + case "tab:chat": TabChat.IsChecked = true; break; + case "tab:cowork": TabCowork.IsChecked = true; break; + case "tab:code": if (TabCode.IsEnabled) TabCode.IsChecked = true; break; + case "new_conversation": StartNewConversation(); break; + case "search_conversation": ToggleMessageSearch(); break; + case "change_model": BtnModelSelector_Click(this, new RoutedEventArgs()); break; + case "open_settings": BtnSettings_Click(this, new RoutedEventArgs()); break; + case "open_statistics": new StatisticsWindow().Show(); break; + case "change_folder": FolderPathLabel_Click(FolderPathLabel, null!); break; + case "toggle_devmode": + var llm = Llm; + llm.DevMode = !llm.DevMode; + _settings.Save(); + UpdateAnalyzerButtonVisibility(); + ShowToast(llm.DevMode ? "개발자 모드 켜짐" : "개발자 모드 꺼짐"); + break; + case "open_audit_log": + try { System.Diagnostics.Process.Start("explorer.exe", Services.AuditLogService.GetAuditFolder()); } catch (Exception) { /* 감사 로그 폴더 열기 실패 */ } + break; + case "paste_clipboard": + try { var text = Clipboard.GetText(); if (!string.IsNullOrEmpty(text)) InputBox.Text += text; } catch (Exception) { /* 클립보드 접근 실패 */ } + break; + case "export_conversation": ExportConversation(); break; + } + } + + private void ExportConversation() + { + ChatConversation? conv; + lock (_convLock) conv = _currentConversation; + if (conv == null || conv.Messages.Count == 0) return; + + var dlg = new Microsoft.Win32.SaveFileDialog + { + FileName = $"{conv.Title}", + DefaultExt = ".md", + Filter = "Markdown (*.md)|*.md|JSON (*.json)|*.json|HTML (*.html)|*.html|PDF 인쇄용 HTML (*.pdf.html)|*.pdf.html|Text (*.txt)|*.txt" + }; + if (dlg.ShowDialog() != true) return; + + var ext = System.IO.Path.GetExtension(dlg.FileName).ToLowerInvariant(); + string content; + + if (ext == ".json") + { + content = System.Text.Json.JsonSerializer.Serialize(conv, new System.Text.Json.JsonSerializerOptions + { + WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }); + } + else if (dlg.FileName.EndsWith(".pdf.html")) + { + // PDF 인쇄용 HTML — 브라우저에서 자동으로 인쇄 대화상자 표시 + content = PdfExportService.BuildHtml(conv); + System.IO.File.WriteAllText(dlg.FileName, content, System.Text.Encoding.UTF8); + PdfExportService.OpenInBrowser(dlg.FileName); + ShowToast("PDF 인쇄용 HTML이 생성되어 브라우저에서 열렸습니다"); + return; + } + else if (ext == ".html") + { + content = ExportToHtml(conv); + } + else + { + var sb = new System.Text.StringBuilder(); + sb.AppendLine($"# {conv.Title}"); + sb.AppendLine($"_생성: {conv.CreatedAt:yyyy-MM-dd HH:mm} · 주제: {conv.Category}_"); + sb.AppendLine(); + + foreach (var msg in conv.Messages) + { + if (msg.Role == "system") continue; + var label = msg.Role == "user" ? "**사용자**" : "**AI**"; + sb.AppendLine($"{label} ({msg.Timestamp:HH:mm})"); + sb.AppendLine(); + sb.AppendLine(msg.Content); + if (msg.AttachedFiles is { Count: > 0 }) + { + sb.AppendLine(); + sb.AppendLine("_첨부 파일: " + string.Join(", ", msg.AttachedFiles.Select(System.IO.Path.GetFileName)) + "_"); + } + sb.AppendLine(); + sb.AppendLine("---"); + sb.AppendLine(); + } + content = sb.ToString(); + } + + System.IO.File.WriteAllText(dlg.FileName, content, System.Text.Encoding.UTF8); + } + + private static string ExportToHtml(ChatConversation conv) + { + var sb = new System.Text.StringBuilder(); + sb.AppendLine(""); + sb.AppendLine($"{System.Net.WebUtility.HtmlEncode(conv.Title)}"); + sb.AppendLine(""); + sb.AppendLine($"

      {System.Net.WebUtility.HtmlEncode(conv.Title)}

      "); + sb.AppendLine($"

      생성: {conv.CreatedAt:yyyy-MM-dd HH:mm} · 주제: {conv.Category}

      "); + + foreach (var msg in conv.Messages) + { + if (msg.Role == "system") continue; + var cls = msg.Role == "user" ? "user" : "ai"; + var label = msg.Role == "user" ? "사용자" : "AI"; + sb.AppendLine($"
      "); + sb.AppendLine($"
      {label} · {msg.Timestamp:HH:mm}
      "); + sb.AppendLine($"
      {System.Net.WebUtility.HtmlEncode(msg.Content)}
      "); + sb.AppendLine("
      "); + } + + sb.AppendLine(""); + return sb.ToString(); + } + + // ─── 버튼 이벤트 ────────────────────────────────────────────────────── + + private void ChatWindow_KeyDown(object sender, KeyEventArgs e) + { + var mod = Keyboard.Modifiers; + + // Ctrl 단축키 + if (mod == ModifierKeys.Control) + { + switch (e.Key) + { + case Key.N: BtnNewChat_Click(this, new RoutedEventArgs()); e.Handled = true; break; + case Key.W: Close(); e.Handled = true; break; + case Key.E: ExportConversation(); e.Handled = true; break; + case Key.L: InputBox.Text = ""; InputBox.Focus(); e.Handled = true; break; + case Key.B: BtnToggleSidebar_Click(this, new RoutedEventArgs()); e.Handled = true; break; + case Key.M: BtnModelSelector_Click(this, new RoutedEventArgs()); e.Handled = true; break; + case Key.OemComma: BtnSettings_Click(this, new RoutedEventArgs()); e.Handled = true; break; + case Key.F: ToggleMessageSearch(); e.Handled = true; break; + case Key.D1: TabChat.IsChecked = true; e.Handled = true; break; + case Key.D2: TabCowork.IsChecked = true; e.Handled = true; break; + case Key.D3: if (TabCode.IsEnabled) TabCode.IsChecked = true; e.Handled = true; break; + } + } + + // Ctrl+Shift 단축키 + if (mod == (ModifierKeys.Control | ModifierKeys.Shift)) + { + switch (e.Key) + { + case Key.C: + // 마지막 AI 응답 복사 + ChatConversation? conv; + lock (_convLock) conv = _currentConversation; + if (conv != null) + { + var lastAi = conv.Messages.LastOrDefault(m => m.Role == "assistant"); + if (lastAi != null) + try { Clipboard.SetText(lastAi.Content); } catch (Exception) { /* 클립보드 접근 실패 */ } + } + e.Handled = true; + break; + case Key.R: + // 마지막 응답 재생성 + _ = RegenerateLastAsync(); + e.Handled = true; + break; + case Key.D: + // 모든 대화 삭제 + BtnDeleteAll_Click(this, new RoutedEventArgs()); + e.Handled = true; + break; + case Key.P: + // 커맨드 팔레트 + OpenCommandPalette(); + e.Handled = true; + break; + } + } + + // Escape: 검색 바 닫기 또는 스트리밍 중지 + if (e.Key == Key.Escape) + { + if (MessageSearchBar.Visibility == Visibility.Visible) { CloseMessageSearch(); e.Handled = true; } + else if (_isStreaming) { StopGeneration(); e.Handled = true; } + } + + // 슬래시 명령 팝업 키 처리 + if (SlashPopup.IsOpen) + { + if (e.Key == Key.Escape) + { + SlashPopup.IsOpen = false; + _slashSelectedIndex = -1; + e.Handled = true; + } + else if (e.Key == Key.Up) + { + SlashPopup_ScrollByDelta(120); // 위로 1칸 + e.Handled = true; + } + else if (e.Key == Key.Down) + { + SlashPopup_ScrollByDelta(-120); // 아래로 1칸 + e.Handled = true; + } + else if (e.Key == Key.Enter && _slashSelectedIndex >= 0) + { + e.Handled = true; + ExecuteSlashSelectedItem(); + } + } + } + + private void BtnStop_Click(object sender, RoutedEventArgs e) => StopGeneration(); + + private void BtnPause_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + if (_agentLoop.IsPaused) + { + _agentLoop.Resume(); + PauseIcon.Text = "\uE769"; // 일시정지 아이콘 + BtnPause.ToolTip = "일시정지"; + } + else + { + _ = _agentLoop.PauseAsync(); + PauseIcon.Text = "\uE768"; // 재생 아이콘 + BtnPause.ToolTip = "재개"; + } + } + private void BtnExport_Click(object sender, RoutedEventArgs e) => ExportConversation(); + + // ─── 메시지 내 검색 (Ctrl+F) ───────────────────────────────────────── + + private List _searchMatchIndices = new(); + private int _searchCurrentIndex = -1; + + private void ToggleMessageSearch() + { + if (MessageSearchBar.Visibility == Visibility.Visible) + CloseMessageSearch(); + else + { + MessageSearchBar.Visibility = Visibility.Visible; + SearchTextBox.Focus(); + SearchTextBox.SelectAll(); + } + } + + private void CloseMessageSearch() + { + MessageSearchBar.Visibility = Visibility.Collapsed; + SearchTextBox.Text = ""; + SearchResultCount.Text = ""; + _searchMatchIndices.Clear(); + _searchCurrentIndex = -1; + // 하이라이트 제거 + ClearSearchHighlights(); + } + + private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e) + { + var query = SearchTextBox.Text.Trim(); + if (string.IsNullOrEmpty(query)) + { + SearchResultCount.Text = ""; + _searchMatchIndices.Clear(); + _searchCurrentIndex = -1; + ClearSearchHighlights(); + return; + } + + // 현재 대화의 메시지에서 검색 + ChatConversation? conv; + lock (_convLock) conv = _currentConversation; + if (conv == null) return; + + _searchMatchIndices.Clear(); + for (int i = 0; i < conv.Messages.Count; i++) + { + if (conv.Messages[i].Content.Contains(query, StringComparison.OrdinalIgnoreCase)) + _searchMatchIndices.Add(i); + } + + if (_searchMatchIndices.Count > 0) + { + _searchCurrentIndex = 0; + SearchResultCount.Text = $"1/{_searchMatchIndices.Count}"; + HighlightSearchResult(); + } + else + { + _searchCurrentIndex = -1; + SearchResultCount.Text = "결과 없음"; + } + } + + private void SearchPrev_Click(object sender, RoutedEventArgs e) + { + if (_searchMatchIndices.Count == 0) return; + _searchCurrentIndex = (_searchCurrentIndex - 1 + _searchMatchIndices.Count) % _searchMatchIndices.Count; + SearchResultCount.Text = $"{_searchCurrentIndex + 1}/{_searchMatchIndices.Count}"; + HighlightSearchResult(); + } + + private void SearchNext_Click(object sender, RoutedEventArgs e) + { + if (_searchMatchIndices.Count == 0) return; + _searchCurrentIndex = (_searchCurrentIndex + 1) % _searchMatchIndices.Count; + SearchResultCount.Text = $"{_searchCurrentIndex + 1}/{_searchMatchIndices.Count}"; + HighlightSearchResult(); + } + + private void SearchClose_Click(object sender, RoutedEventArgs e) => CloseMessageSearch(); + + private void HighlightSearchResult() + { + if (_searchCurrentIndex < 0 || _searchCurrentIndex >= _searchMatchIndices.Count) return; + var msgIndex = _searchMatchIndices[_searchCurrentIndex]; + + // MessagePanel에서 해당 메시지 인덱스의 자식 요소를 찾아 스크롤 + // 메시지 패널의 자식 수가 대화 메시지 수와 정확히 일치하지 않을 수 있으므로 + // (배너, 계획카드 등 섞임) BringIntoView로 대략적 위치 이동 + if (msgIndex < MessagePanel.Children.Count) + { + var element = MessagePanel.Children[msgIndex] as FrameworkElement; + element?.BringIntoView(); + } + else if (MessagePanel.Children.Count > 0) + { + // 범위 밖이면 마지막 자식으로 이동 + (MessagePanel.Children[^1] as FrameworkElement)?.BringIntoView(); + } + } + + private void ClearSearchHighlights() + { + // 현재는 BringIntoView 기반이므로 별도 하이라이트 제거 불필요 + } + + // ─── 에러 복구 재시도 버튼 ────────────────────────────────────────────── + + private void AddRetryButton() + { + Dispatcher.Invoke(() => + { + var retryBorder = new Border + { + Background = new SolidColorBrush(Color.FromArgb(0x18, 0xEF, 0x44, 0x44)), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(12, 8, 12, 8), + Margin = new Thickness(40, 4, 80, 4), + HorizontalAlignment = HorizontalAlignment.Left, + Cursor = System.Windows.Input.Cursors.Hand, + }; + var retrySp = new StackPanel { Orientation = Orientation.Horizontal }; + retrySp.Children.Add(new TextBlock + { + Text = "\uE72C", FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 12, Foreground = new SolidColorBrush(Color.FromRgb(0xEF, 0x44, 0x44)), + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 6, 0), + }); + retrySp.Children.Add(new TextBlock + { + Text = "재시도", FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = new SolidColorBrush(Color.FromRgb(0xEF, 0x44, 0x44)), + VerticalAlignment = VerticalAlignment.Center, + }); + retryBorder.Child = retrySp; + retryBorder.MouseEnter += (s, _) => { if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x30, 0xEF, 0x44, 0x44)); }; + retryBorder.MouseLeave += (s, _) => { if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x18, 0xEF, 0x44, 0x44)); }; + retryBorder.MouseLeftButtonUp += (_, _) => + { + lock (_convLock) + { + if (_currentConversation != null) + { + var lastIdx = _currentConversation.Messages.Count - 1; + if (lastIdx >= 0 && _currentConversation.Messages[lastIdx].Role == "assistant") + _currentConversation.Messages.RemoveAt(lastIdx); + } + } + _ = RegenerateLastAsync(); + }; + MessagePanel.Children.Add(retryBorder); + ForceScrollToEnd(); + }); + } + + // ─── 메시지 우클릭 컨텍스트 메뉴 ─────────────────────────────────────── + + private void ShowMessageContextMenu(string content, string role) + { + var menu = CreateThemedContextMenu(); + var primaryText = ThemeResourceHelper.Primary(this); + var secondaryText = ThemeResourceHelper.Secondary(this); + + void AddItem(string icon, string label, Action action) + { + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + sp.Children.Add(new TextBlock + { + Text = icon, FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 12, Foreground = secondaryText, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 8, 0), + }); + sp.Children.Add(new TextBlock + { + Text = label, FontSize = 12, Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + var mi = new MenuItem { Header = sp, Padding = new Thickness(8, 6, 16, 6) }; + mi.Click += (_, _) => action(); + menu.Items.Add(mi); + } + + // 복사 + AddItem("\uE8C8", "텍스트 복사", () => + { + try { Clipboard.SetText(content); ShowToast("복사되었습니다"); } catch (Exception) { /* 클립보드 접근 실패 */ } + }); + + // 마크다운 복사 + AddItem("\uE943", "마크다운 복사", () => + { + try { Clipboard.SetText(content); ShowToast("마크다운으로 복사됨"); } catch (Exception) { /* 클립보드 접근 실패 */ } + }); + + // 인용하여 답장 + AddItem("\uE97A", "인용하여 답장", () => + { + var quote = content.Length > 200 ? content[..200] + "..." : content; + var lines = quote.Split('\n'); + var quoted = string.Join("\n", lines.Select(l => $"> {l}")); + InputBox.Text = quoted + "\n\n"; + InputBox.Focus(); + InputBox.CaretIndex = InputBox.Text.Length; + }); + + menu.Items.Add(new Separator()); + + // 재생성 (AI 응답만) + if (role == "assistant") + { + AddItem("\uE72C", "응답 재생성", () => _ = RegenerateLastAsync()); + } + + // 대화 분기 (Fork) + AddItem("\uE8A5", "여기서 분기", () => + { + ChatConversation? conv; + lock (_convLock) conv = _currentConversation; + if (conv == null) return; + + var idx = conv.Messages.FindLastIndex(m => m.Role == role && m.Content == content); + if (idx < 0) return; + + ForkConversation(conv, idx); + }); + + menu.Items.Add(new Separator()); + + // 이후 메시지 모두 삭제 + var msgContent = content; + var msgRole = role; + AddItem("\uE74D", "이후 메시지 모두 삭제", () => + { + ChatConversation? conv; + lock (_convLock) conv = _currentConversation; + if (conv == null) return; + + var idx = conv.Messages.FindLastIndex(m => m.Role == msgRole && m.Content == msgContent); + if (idx < 0) return; + + var removeCount = conv.Messages.Count - idx; + if (MessageBox.Show($"이 메시지 포함 {removeCount}개 메시지를 삭제하시겠습니까?", + "메시지 삭제", MessageBoxButton.YesNo, MessageBoxImage.Warning) != MessageBoxResult.Yes) + return; + + conv.Messages.RemoveRange(idx, removeCount); + try { _storage.Save(conv); } catch (Exception ex) { Services.LogService.Debug($"대화 저장 실패: {ex.Message}"); } + RenderMessages(); + ShowToast($"{removeCount}개 메시지 삭제됨"); + }); + + menu.IsOpen = true; + } + + // ─── 팁 알림 ────────────────────────────────────────────────────── + + private static readonly string[] Tips = + [ + "💡 작업 폴더에 AX.md 파일을 만들면 매번 시스템 프롬프트에 자동 주입됩니다. 프로젝트 설계 원칙이나 코딩 규칙을 기록하세요.", + "💡 Ctrl+1/2/3으로 Chat/Cowork/Code 탭을 빠르게 전환할 수 있습니다.", + "💡 Ctrl+F로 현재 대화 내 메시지를 검색할 수 있습니다.", + "💡 메시지를 우클릭하면 복사, 인용 답장, 재생성, 삭제를 할 수 있습니다.", + "💡 코드 블록을 더블클릭하면 전체화면으로 볼 수 있고, 💾 버튼으로 파일 저장이 가능합니다.", + "💡 Cowork 에이전트가 만든 파일은 자동으로 날짜_시간 접미사가 붙어 덮어쓰기를 방지합니다.", + "💡 Code 탭에서 개발 언어를 선택하면 해당 언어 우선으로 코드를 생성합니다.", + "💡 파일 탐색기(하단 바 '파일' 버튼)에서 더블클릭으로 프리뷰, 우클릭으로 관리할 수 있습니다.", + "💡 에이전트가 계획을 제시하면 '수정 요청'으로 방향을 바꾸거나 '취소'로 중단할 수 있습니다.", + "💡 Code 탭은 빌드/테스트를 자동으로 실행합니다. 프로젝트 폴더를 먼저 선택하세요.", + "💡 무드 갤러리에서 10가지 디자인 템플릿 중 원하는 스타일을 미리보기로 선택할 수 있습니다.", + "💡 Git 연동: Code 탭에서 에이전트가 git status, diff, commit을 수행합니다. (push는 직접)", + "💡 설정 → AX Agent → 공통에서 개발자 모드를 켜면 에이전트 동작을 스텝별로 검증할 수 있습니다.", + "💡 트레이 아이콘 우클릭 → '사용 통계'에서 대화 빈도와 토큰 사용량을 확인할 수 있습니다.", + "💡 대화 제목을 클릭하면 이름을 변경할 수 있습니다.", + "💡 LLM 오류 발생 시 '재시도' 버튼이 자동으로 나타납니다.", + "💡 검색란에서 대화 제목뿐 아니라 첫 메시지 내용까지 검색됩니다.", + "💡 프리셋 선택 후에도 대화가 리셋되지 않습니다. 진행 중인 대화에서 프리셋을 변경할 수 있습니다.", + "💡 Shift+Enter로 퍼지 검색 결과의 파일이 있는 폴더를 열 수 있습니다.", + "💡 최근 폴더를 우클릭하면 '폴더 열기', '경로 복사', '목록에서 삭제'가 가능합니다.", + "💡 Cowork/Code 에이전트 작업 완료 시 시스템 트레이에 알림이 표시됩니다.", + "💡 마크다운 테이블, 인용(>), 취소선(~~), 링크([text](url))가 모두 렌더링됩니다.", + "💡 ⚠ 데이터 폴더를 워크스페이스로 지정할 때는 반드시 백업을 먼저 만드세요!", + "💡 드라이브 루트(C:\\, D:\\)는 작업공간으로 설정할 수 없습니다. 하위 폴더를 선택하세요.", + ]; + private int _tipIndex; + private DispatcherTimer? _tipDismissTimer; + + private void ShowRandomTip() + { + if (!Llm.ShowTips) return; + if (_activeTab != "Cowork" && _activeTab != "Code") return; + + var tip = Tips[_tipIndex % Tips.Length]; + _tipIndex++; + + // 토스트 스타일로 표시 (기존 토스트와 다른 위치/색상) + ShowTip(tip); + } + + private void ShowTip(string message) + { + _tipDismissTimer?.Stop(); + + ToastText.Text = message; + ToastIcon.Text = "\uE82F"; // 전구 아이콘 + ToastBorder.Visibility = Visibility.Visible; + ToastBorder.BeginAnimation(UIElement.OpacityProperty, + new System.Windows.Media.Animation.DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(300))); + + var duration = Llm.TipDurationSeconds; + if (duration <= 0) return; // 0이면 수동 닫기 (자동 사라짐 없음) + + _tipDismissTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(duration) }; + _tipDismissTimer.Tick += (_, _) => + { + _tipDismissTimer.Stop(); + var fadeOut = new System.Windows.Media.Animation.DoubleAnimation(1, 0, TimeSpan.FromMilliseconds(300)); + fadeOut.Completed += (_, _) => ToastBorder.Visibility = Visibility.Collapsed; + ToastBorder.BeginAnimation(UIElement.OpacityProperty, fadeOut); + }; + _tipDismissTimer.Start(); + } + + // ─── 프로젝트 문맥 파일 (AX.md) ────────────────────────────────── + + /// + /// 작업 폴더에 AX.md가 있으면 내용을 읽어 시스템 프롬프트에 주입합니다. + /// Claude Code와 동일한 파일명/형식을 사용합니다. + /// + private static string LoadProjectContext(string workFolder) + { + if (string.IsNullOrEmpty(workFolder)) return ""; + + // Phase 30-C: HierarchicalMemoryService — 4-layer 계층 메모리 통합 조회 + try + { + var hierMemory = new AxCopilot.Services.Agent.HierarchicalMemoryService(); + var merged = hierMemory.BuildMergedContext(workFolder, 8000); + if (!string.IsNullOrWhiteSpace(merged)) + { + // @include 지시어 해석 + if (merged.Contains("@")) + { + try + { + var resolver = new AxCopilot.Services.Agent.AxMdIncludeResolver(); + merged = resolver.ResolveAsync(merged, workFolder).GetAwaiter().GetResult(); + } + catch (Exception) { /* @include 실패 시 원본 유지 */ } + } + return $"\n## Project Context (Hierarchical Memory)\n{merged}\n"; + } + } + catch (Exception) { /* 계층 메모리 실패 시 레거시 폴백 */ } + + // 레거시 폴백: 단일 AX.md 탐색 (작업 폴더 → 상위 폴더 순) + var searchDir = workFolder; + for (int i = 0; i < 3; i++) + { + if (string.IsNullOrEmpty(searchDir)) break; + var filePath = System.IO.Path.Combine(searchDir, "AX.md"); + if (System.IO.File.Exists(filePath)) + { + try + { + var content = System.IO.File.ReadAllText(filePath); + if (content.Contains("@")) + { + try + { + var resolver = new AxCopilot.Services.Agent.AxMdIncludeResolver(); + var baseDir = System.IO.Path.GetDirectoryName(filePath) ?? workFolder; + content = resolver.ResolveAsync(content, baseDir).GetAwaiter().GetResult(); + } + catch (Exception) { /* 비핵심 작업 실패 — UI 차단 방지 */ } + } + if (content.Length > 8000) content = content[..8000] + "\n... (8000자 초과 생략)"; + return $"\n## Project Context (from AX.md)\n{content}\n"; + } + catch (Exception) { /* 비핵심 작업 실패 — UI 차단 방지 */ } + } + searchDir = System.IO.Directory.GetParent(searchDir)?.FullName; + } + return ""; + } + + /// Phase 27-B: 현재 파일 경로에 매칭되는 스킬을 시스템 프롬프트에 자동 주입. + private string BuildPathBasedSkillSection() + { + try + { + // 현재 대화에서 언급된 파일 경로 추출 (최근 메시지에서) + var recentFiles = GetRecentlyMentionedFiles(); + if (recentFiles.Count == 0) return ""; + + var allSkills = AxCopilot.Services.Agent.SkillService.Skills; + var activator = new AxCopilot.Services.Agent.PathBasedSkillActivator(); + + var matchedSkills = new List(); + foreach (var file in recentFiles) + { + var matches = activator.GetActiveSkillsForFile(allSkills, file); + foreach (var m in matches) + { + if (!matchedSkills.Any(s => s.Name == m.Name)) + matchedSkills.Add(m); + } + } + + return activator.BuildSkillContextInjection(matchedSkills); + } + catch (Exception) { return ""; } + } + + /// 최근 대화에서 파일 경로를 추출합니다. + private List GetRecentlyMentionedFiles() + { + var files = new List(); + if (_currentConversation?.Messages == null) return files; + + // 최근 5개 메시지에서 파일 경로 패턴 탐색 + var recent = _currentConversation.Messages.TakeLast(5); + foreach (var msg in recent) + { + if (string.IsNullOrEmpty(msg.Content)) continue; + // 간단한 파일 경로 패턴: 확장자가 있는 경로 + var pathMatches = System.Text.RegularExpressions.Regex.Matches( + msg.Content, @"[\w./\\-]+\.\w{1,10}"); + foreach (System.Text.RegularExpressions.Match m in pathMatches) + { + var path = m.Value; + if (path.Contains('.') && !path.StartsWith("http")) + files.Add(path); + } + } + return files.Distinct().Take(10).ToList(); + } + + // ─── 무지개 글로우 애니메이션 ───────────────────────────────────────── + + private DispatcherTimer? _rainbowTimer; + private DateTime _rainbowStartTime; + + /// 입력창 테두리에 무지개 그라데이션 회전 애니메이션을 재생합니다 (3초). + private void PlayRainbowGlow() + { + if (!Llm.EnableChatRainbowGlow) return; + + _rainbowTimer?.Stop(); + _rainbowStartTime = DateTime.UtcNow; + + // 페이드인 (빠르게) + InputGlowBorder.BeginAnimation(UIElement.OpacityProperty, + new System.Windows.Media.Animation.DoubleAnimation(0, 0.9, TimeSpan.FromMilliseconds(150))); + + // 그라데이션 회전 타이머 (~60fps) — 스트리밍 종료까지 지속 + _rainbowTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(16) }; + _rainbowTimer.Tick += (_, _) => + { + var elapsed = (DateTime.UtcNow - _rainbowStartTime).TotalMilliseconds; + + // 그라데이션 오프셋 회전 + var shift = (elapsed / 1500.0) % 1.0; // 1.5초에 1바퀴 (느리게) + var brush = InputGlowBorder.BorderBrush as LinearGradientBrush; + if (brush == null) return; + + // 시작/끝점 회전 (원형 이동) + var angle = shift * Math.PI * 2; + brush.StartPoint = new Point(0.5 + 0.5 * Math.Cos(angle), 0.5 + 0.5 * Math.Sin(angle)); + brush.EndPoint = new Point(0.5 - 0.5 * Math.Cos(angle), 0.5 - 0.5 * Math.Sin(angle)); + }; + _rainbowTimer.Start(); + } + + /// 레인보우 글로우 효과를 페이드아웃하며 중지합니다. + private void StopRainbowGlow() + { + _rainbowTimer?.Stop(); + _rainbowTimer = null; + if (InputGlowBorder.Opacity > 0) + { + var fadeOut = new System.Windows.Media.Animation.DoubleAnimation( + InputGlowBorder.Opacity, 0, TimeSpan.FromMilliseconds(600)); + fadeOut.Completed += (_, _) => InputGlowBorder.Opacity = 0; + InputGlowBorder.BeginAnimation(UIElement.OpacityProperty, fadeOut); + } + } + + // ─── 토스트 알림 ────────────────────────────────────────────────────── + + private DispatcherTimer? _toastHideTimer; + + private void ShowToast(string message, string icon = "\uE73E", int durationMs = 2000) + { + _toastHideTimer?.Stop(); + + ToastText.Text = message; + ToastIcon.Text = icon; + ToastBorder.Visibility = Visibility.Visible; + + // 페이드인 + ToastBorder.BeginAnimation(UIElement.OpacityProperty, + new System.Windows.Media.Animation.DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(200))); + + // 자동 숨기기 + _toastHideTimer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(durationMs) }; + _toastHideTimer.Tick += (_, _) => + { + _toastHideTimer.Stop(); + var fadeOut = new System.Windows.Media.Animation.DoubleAnimation(1, 0, TimeSpan.FromMilliseconds(300)); + fadeOut.Completed += (_, _) => ToastBorder.Visibility = Visibility.Collapsed; + ToastBorder.BeginAnimation(UIElement.OpacityProperty, fadeOut); + }; + _toastHideTimer.Start(); + } + + // ─── 대화 주제 버튼 / 커스텀 프리셋 관리 → ChatWindow.Presets.cs ───── + + // ─── 프롬프트 템플릿 · 모델 전환 · 대화 관리 → ChatWindow.ModelSelector.cs ─── + + // ─── 미리보기/파일 탐색기 → ChatWindow.PreviewAndFiles.cs ─── + + // ─── 하단 상태바 ────────────────────────────────────────────────────── + + private System.Windows.Media.Animation.Storyboard? _statusSpinStoryboard; + + private void UpdateStatusBar(AgentEvent evt) + { + var toolLabel = evt.ToolName switch + { + "file_read" or "document_read" => "파일 읽기", + "file_write" => "파일 쓰기", + "file_edit" => "파일 수정", + "html_create" => "HTML 생성", + "xlsx_create" => "Excel 생성", + "docx_create" => "Word 생성", + "csv_create" => "CSV 생성", + "md_create" => "Markdown 생성", + "folder_map" => "폴더 탐색", + "glob" => "파일 검색", + "grep" => "내용 검색", + "process" => "명령 실행", + _ => evt.ToolName, + }; + + switch (evt.Type) + { + case AgentEventType.Thinking: + SetStatus("생각 중...", spinning: true); + break; + case AgentEventType.Planning: + SetStatus($"계획 수립 중 — {evt.StepTotal}단계", spinning: true); + break; + case AgentEventType.ToolCall: + SetStatus($"{toolLabel} 실행 중...", spinning: true); + break; + case AgentEventType.ToolResult: + SetStatus(evt.Success ? $"{toolLabel} 완료" : $"{toolLabel} 실패", spinning: false); + break; + case AgentEventType.StepStart: + SetStatus($"[{evt.StepCurrent}/{evt.StepTotal}] {TruncateForStatus(evt.Summary)}", spinning: true); + break; + case AgentEventType.StepDone: + SetStatus($"[{evt.StepCurrent}/{evt.StepTotal}] 단계 완료", spinning: true); + break; + case AgentEventType.SkillCall: + SetStatus($"스킬 실행 중: {TruncateForStatus(evt.Summary)}", spinning: true); + break; + case AgentEventType.Complete: + SetStatus("작업 완료", spinning: false); + StopStatusAnimation(); + break; + case AgentEventType.Error: + SetStatus("오류 발생", spinning: false); + StopStatusAnimation(); + break; + case AgentEventType.Paused: + SetStatus("⏸ 일시정지", spinning: false); + break; + case AgentEventType.Resumed: + SetStatus("▶ 재개됨", spinning: true); + break; + } + } + + private void SetStatus(string text, bool spinning) + { + if (StatusLabel != null) StatusLabel.Text = text; + if (spinning) StartStatusAnimation(); + } + + private void StartStatusAnimation() + { + if (_statusSpinStoryboard != null) return; + + var anim = new System.Windows.Media.Animation.DoubleAnimation + { + From = 0, To = 360, + Duration = TimeSpan.FromSeconds(2), + RepeatBehavior = System.Windows.Media.Animation.RepeatBehavior.Forever, + }; + + _statusSpinStoryboard = new System.Windows.Media.Animation.Storyboard(); + System.Windows.Media.Animation.Storyboard.SetTarget(anim, StatusDiamond); + System.Windows.Media.Animation.Storyboard.SetTargetProperty(anim, + new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)")); + _statusSpinStoryboard.Children.Add(anim); + _statusSpinStoryboard.Begin(); + } + + private void StopStatusAnimation() + { + _statusSpinStoryboard?.Stop(); + _statusSpinStoryboard = null; + } + + private void SetStatusIdle() + { + StopStatusAnimation(); + if (StatusLabel != null) StatusLabel.Text = "대기 중"; + if (StatusElapsed != null) StatusElapsed.Text = ""; + if (StatusTokens != null) StatusTokens.Text = ""; + } + + private void UpdateStatusTokens(int inputTokens, int outputTokens) + { + if (StatusTokens == null) return; + var llm = Llm; + var (inCost, outCost) = Services.TokenEstimator.EstimateCost( + inputTokens, outputTokens, llm.Service, llm.Model); + var totalCost = inCost + outCost; + var costText = totalCost > 0 ? $" · {Services.TokenEstimator.FormatCost(totalCost)}" : ""; + StatusTokens.Text = $"↑{Services.TokenEstimator.Format(inputTokens)} ↓{Services.TokenEstimator.Format(outputTokens)}{costText}"; + } + + private static string TruncateForStatus(string? text, int max = 40) + { + if (string.IsNullOrEmpty(text)) return ""; + return text.Length <= max ? text : text[..max] + "…"; + } + + // ─── 헬퍼 ───────────────────────────────────────────────────────────── + private static System.Windows.Media.SolidColorBrush BrushFromHex(string hex) + { + var c = ThemeResourceHelper.HexColor(hex); + return new System.Windows.Media.SolidColorBrush(c); + } +} diff --git a/src/AxCopilot/Views/ColorPickResultWindow.xaml b/src/AxCopilot/Views/ColorPickResultWindow.xaml new file mode 100644 index 0000000..209c309 --- /dev/null +++ b/src/AxCopilot/Views/ColorPickResultWindow.xaml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/ColorPickResultWindow.xaml.cs b/src/AxCopilot/Views/ColorPickResultWindow.xaml.cs new file mode 100644 index 0000000..1aa6768 --- /dev/null +++ b/src/AxCopilot/Views/ColorPickResultWindow.xaml.cs @@ -0,0 +1,57 @@ +using System.Windows; +using System.Windows.Media; +using System.Windows.Threading; + +namespace AxCopilot.Views; + +/// +/// 스포이드 색상 추출 결과를 반투명 창으로 5초간 표시합니다. +/// 클릭 위치 근처에 나타나며, HEX 코드를 클립보드에 복사합니다. +/// +public partial class ColorPickResultWindow : Window +{ + private readonly DispatcherTimer _timer; + + public ColorPickResultWindow(System.Drawing.Color color, double screenX, double screenY) + { + InitializeComponent(); + + // 색상 표시 + var wpfColor = Color.FromRgb(color.R, color.G, color.B); + ColorPreview.Fill = new SolidColorBrush(wpfColor); + HexText.Text = $"#{color.R:X2}{color.G:X2}{color.B:X2}"; + RgbText.Text = $"RGB({color.R}, {color.G}, {color.B})"; + + // 클립보드에 HEX 코드 복사 + try { Clipboard.SetText(HexText.Text); } + catch (Exception) { } + + // 위치: 클릭 지점 오른쪽 아래 + var area = SystemParameters.WorkArea; + Left = Math.Min(screenX + 20, area.Right - 200); + Top = Math.Min(screenY + 20, area.Bottom - 160); + + // 5초 타이머 + _timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) }; + _timer.Tick += (_, _) => Close(); + _timer.Start(); + + // 클릭으로 닫기 + MouseDown += (_, _) => Close(); + + // 등장 애니메이션 + Opacity = 0; + Loaded += (_, _) => + { + var anim = new System.Windows.Media.Animation.DoubleAnimation(0, 1, + TimeSpan.FromMilliseconds(200)); + BeginAnimation(OpacityProperty, anim); + }; + } + + protected override void OnClosed(EventArgs e) + { + _timer.Stop(); + base.OnClosed(e); + } +} diff --git a/src/AxCopilot/Views/CommandPaletteWindow.xaml b/src/AxCopilot/Views/CommandPaletteWindow.xaml new file mode 100644 index 0000000..3417e1b --- /dev/null +++ b/src/AxCopilot/Views/CommandPaletteWindow.xaml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/CommandPaletteWindow.xaml.cs b/src/AxCopilot/Views/CommandPaletteWindow.xaml.cs new file mode 100644 index 0000000..f32c79f --- /dev/null +++ b/src/AxCopilot/Views/CommandPaletteWindow.xaml.cs @@ -0,0 +1,147 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; + +namespace AxCopilot.Views; + +/// +/// Ctrl+Shift+P로 호출되는 커맨드 팔레트. +/// 모든 기능에 빠르게 접근할 수 있는 통합 명령 검색 창입니다. +/// +public partial class CommandPaletteWindow : Window +{ + private readonly Action? _onExecute; + private readonly List _commands = new(); + // 향후 키보드 탐색용 + // private int _selectedIndex = -1; + + public string? SelectedCommand { get; private set; } + + public CommandPaletteWindow(Action? onExecute = null) + { + InitializeComponent(); + _onExecute = onExecute; + RegisterCommands(); + RenderItems(""); + Loaded += (_, _) => { SearchBox.Focus(); }; + } + + private void RegisterCommands() + { + // 탭 전환 + _commands.Add(new("Chat 탭으로 전환", "탭 전환", "\uE8BD", "tab:chat")); + _commands.Add(new("Cowork 탭으로 전환", "탭 전환", "\uE8BD", "tab:cowork")); + _commands.Add(new("Code 탭으로 전환", "탭 전환", "\uE8BD", "tab:code")); + + // 대화 관리 + _commands.Add(new("새 대화 시작", "대화", "\uE710", "new_conversation")); + _commands.Add(new("대화 검색", "대화", "\uE721", "search_conversation")); + + // 모델 변경 + _commands.Add(new("모델 변경", "설정", "\uEA86", "change_model")); + + // 프리셋 + _commands.Add(new("프리셋 선택", "프리셋", "\uE71D", "select_preset")); + + // 설정 + _commands.Add(new("설정 열기", "앱", "\uE713", "open_settings")); + _commands.Add(new("테마 변경", "앱", "\uE790", "change_theme")); + _commands.Add(new("통계 보기", "앱", "\uE9F9", "open_statistics")); + + // 파일 + _commands.Add(new("작업 폴더 변경", "파일", "\uED25", "change_folder")); + _commands.Add(new("파일 탐색기 열기", "파일", "\uE8B7", "open_file_explorer")); + + // 에이전트 + _commands.Add(new("개발자 모드 토글", "에이전트", "\uE71C", "toggle_devmode")); + _commands.Add(new("감사 로그 보기", "에이전트", "\uE9D9", "open_audit_log")); + + // 도구 + _commands.Add(new("클립보드에서 붙여넣기", "도구", "\uE77F", "paste_clipboard")); + _commands.Add(new("대화 내보내기", "도구", "\uE78C", "export_conversation")); + } + + private void RenderItems(string query) + { + ResultPanel.Children.Clear(); + + var filtered = string.IsNullOrWhiteSpace(query) + ? _commands + : _commands.Where(c => + c.Label.Contains(query, StringComparison.OrdinalIgnoreCase) || + c.Category.Contains(query, StringComparison.OrdinalIgnoreCase) || + (Core.FuzzyEngine.IsChosung(query) && Core.FuzzyEngine.ContainsChosung(c.Label, query))).ToList(); + + for (int i = 0; i < filtered.Count; i++) + { + var cmd = filtered[i]; + var idx = i; + + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + sp.Children.Add(new TextBlock + { + Text = cmd.Icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, Foreground = FindResource("AccentColor") as Brush ?? Brushes.CornflowerBlue, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 10, 0), + }); + var textSp = new StackPanel(); + textSp.Children.Add(new TextBlock + { + Text = cmd.Label, FontSize = 13, + Foreground = FindResource("PrimaryText") as Brush ?? Brushes.White, + }); + textSp.Children.Add(new TextBlock + { + Text = cmd.Category, FontSize = 10.5, + Foreground = FindResource("SecondaryText") as Brush ?? Brushes.Gray, + }); + sp.Children.Add(textSp); + + var item = new Border + { + Child = sp, Background = Brushes.Transparent, + CornerRadius = new CornerRadius(8), Cursor = Cursors.Hand, + Padding = new Thickness(10, 8, 14, 8), Margin = new Thickness(0, 1, 0, 1), + }; + + var hoverBg = FindResource("HintBackground") as Brush ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + item.MouseEnter += (s, _) => { if (s is Border b) b.Background = hoverBg; }; + item.MouseLeave += (s, _) => { if (s is Border b) b.Background = Brushes.Transparent; }; + item.MouseLeftButtonUp += (_, _) => ExecuteCommand(cmd.CommandId); + + ResultPanel.Children.Add(item); + } + } + + private void ExecuteCommand(string commandId) + { + SelectedCommand = commandId; + _onExecute?.Invoke(commandId); + Close(); + } + + private void SearchBox_TextChanged(object sender, TextChangedEventArgs e) + { + RenderItems(SearchBox.Text); + } + + private void Window_PreviewKeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Escape) { Close(); e.Handled = true; } + else if (e.Key == Key.Enter && ResultPanel.Children.Count > 0) + { + // 첫 번째 항목 실행 + var filtered = string.IsNullOrWhiteSpace(SearchBox.Text) + ? _commands : _commands.Where(c => + c.Label.Contains(SearchBox.Text, StringComparison.OrdinalIgnoreCase) || + c.Category.Contains(SearchBox.Text, StringComparison.OrdinalIgnoreCase)).ToList(); + if (filtered.Count > 0) ExecuteCommand(filtered[0].CommandId); + e.Handled = true; + } + } + + private void Window_Deactivated(object sender, EventArgs e) => Close(); + + private record CommandEntry(string Label, string Category, string Icon, string CommandId); +} diff --git a/src/AxCopilot/Views/Controls/AgentInputArea.xaml b/src/AxCopilot/Views/Controls/AgentInputArea.xaml new file mode 100644 index 0000000..f245efc --- /dev/null +++ b/src/AxCopilot/Views/Controls/AgentInputArea.xaml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/Controls/AgentInputArea.xaml.cs b/src/AxCopilot/Views/Controls/AgentInputArea.xaml.cs new file mode 100644 index 0000000..34de874 --- /dev/null +++ b/src/AxCopilot/Views/Controls/AgentInputArea.xaml.cs @@ -0,0 +1,169 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; + +namespace AxCopilot.Views.Controls; + +/// +/// Phase 32-D: 멀티기능 입력 영역. +/// @ 멘션, / 스킬, 첨부, Ctrl+Enter 전송, 모델/권한/Plan 칩 표시. +/// +public partial class AgentInputArea : UserControl +{ + private bool _isStreaming; + + /// 메시지 전송 이벤트. 인자: 입력 텍스트. + public event EventHandler? MessageSent; + + /// 중단 요청 이벤트. + public event EventHandler? StopRequested; + + /// @ 멘션 클릭 이벤트. + public event EventHandler? MentionRequested; + + /// / 스킬 클릭 이벤트. + public event EventHandler? SkillRequested; + + /// 첨부 클릭 이벤트. + public event EventHandler? AttachRequested; + + /// 입력 텍스트. + public string Text + { + get => InputBox.Text; + set => InputBox.Text = value; + } + + /// 스트리밍 상태 (전송 → 중단 버튼 전환). + public bool IsStreaming + { + get => _isStreaming; + set + { + _isStreaming = value; + UpdateSendButton(value); + } + } + + public AgentInputArea() + { + InitializeComponent(); + } + + /// 하단 칩 텍스트를 업데이트합니다. + public void UpdateChips(string model, string permission, string planMode) + { + TxtModelChip.Text = model.Length > 15 ? model[..15] + "…" : model; + TxtPermissionChip.Text = permission; + TxtPlanChip.Text = planMode switch + { + "auto" => "Plan: Auto", + "always" => "Plan: Always", + _ => "Plan: Off", + }; + } + + /// 첨부 파일 칩을 추가합니다. + public void AddAttachmentChip(string fileName) + { + var chip = new Border + { + CornerRadius = new CornerRadius(8), + Padding = new Thickness(6, 2, 6, 2), + Margin = new Thickness(0, 0, 4, 0), + Background = TryFindResource("ItemBackground") as System.Windows.Media.Brush, + }; + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + sp.Children.Add(new TextBlock + { + Text = fileName, + FontSize = 10, + Foreground = TryFindResource("SecondaryText") as System.Windows.Media.Brush, + MaxWidth = 100, + TextTrimming = TextTrimming.CharacterEllipsis, + }); + // 제거 버튼 + var remove = new TextBlock + { + Text = "\xE711", + FontFamily = new System.Windows.Media.FontFamily("Segoe MDL2 Assets"), + FontSize = 8, + Foreground = TryFindResource("SecondaryText") as System.Windows.Media.Brush, + Margin = new Thickness(4, 0, 0, 0), + Cursor = Cursors.Hand, + VerticalAlignment = VerticalAlignment.Center, + }; + remove.MouseLeftButtonUp += (_, _) => AttachmentChips.Children.Remove(chip); + sp.Children.Add(remove); + chip.Child = sp; + AttachmentChips.Children.Add(chip); + } + + /// 첨부 파일 목록을 초기화합니다. + public void ClearAttachments() => AttachmentChips.Children.Clear(); + + /// 입력 포커스를 설정합니다. + public void FocusInput() => InputBox.Focus(); + + #region ── 이벤트 핸들러 ── + + private void InputBox_KeyDown(object sender, KeyEventArgs e) + { + // Ctrl+Enter → 전송 + if (e.Key == Key.Enter && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) + { + e.Handled = true; + TrySend(); + } + } + + private void InputBox_TextChanged(object sender, TextChangedEventArgs e) + { + // 높이 자동 조절은 TextBox의 MinHeight/MaxHeight로 처리됨 + } + + private void BtnSend_Click(object sender, MouseButtonEventArgs e) + { + if (_isStreaming) + StopRequested?.Invoke(this, EventArgs.Empty); + else + TrySend(); + } + + private void BtnMention_Click(object sender, MouseButtonEventArgs e) + => MentionRequested?.Invoke(this, EventArgs.Empty); + + private void BtnSkill_Click(object sender, MouseButtonEventArgs e) + => SkillRequested?.Invoke(this, EventArgs.Empty); + + private void BtnAttach_Click(object sender, MouseButtonEventArgs e) + => AttachRequested?.Invoke(this, EventArgs.Empty); + + #endregion + + private void TrySend() + { + var text = InputBox.Text.Trim(); + if (string.IsNullOrEmpty(text)) return; + + MessageSent?.Invoke(this, text); + InputBox.Clear(); + ClearAttachments(); + } + + private void UpdateSendButton(bool streaming) + { + if (streaming) + { + IconSend.Text = "\xE71A"; // Stop icon + TxtSendLabel.Text = " 중단"; + BtnSend.Background = TryFindResource("ItemBackground") as System.Windows.Media.Brush; + } + else + { + IconSend.Text = "\xE724"; // Send icon + TxtSendLabel.Text = " 전송"; + BtnSend.Background = TryFindResource("AccentColor") as System.Windows.Media.Brush; + } + } +} diff --git a/src/AxCopilot/Views/Controls/AgentSessionHeaderBar.xaml b/src/AxCopilot/Views/Controls/AgentSessionHeaderBar.xaml new file mode 100644 index 0000000..1b459de --- /dev/null +++ b/src/AxCopilot/Views/Controls/AgentSessionHeaderBar.xaml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/Controls/AgentSessionHeaderBar.xaml.cs b/src/AxCopilot/Views/Controls/AgentSessionHeaderBar.xaml.cs new file mode 100644 index 0000000..a36fce2 --- /dev/null +++ b/src/AxCopilot/Views/Controls/AgentSessionHeaderBar.xaml.cs @@ -0,0 +1,108 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; + +namespace AxCopilot.Views.Controls; + +/// +/// Phase 32-C: 세션 헤더 바 (Codex 스타일). +/// 모델/Plan/권한 칩을 인라인 표시하고, 클릭 시 빠른 전환. +/// +public partial class AgentSessionHeaderBar : UserControl +{ + private string _planMode = "off"; // off → auto → always + private string _permissionMode = "Ask"; // Ask → Auto → Deny → Bypass + + /// 모델 선택 클릭 이벤트. + public event EventHandler? ModelChipClicked; + + /// Plan 모드 변경 이벤트. 인자: 새 모드 ("off"/"auto"/"always"). + public event EventHandler? PlanModeChanged; + + /// 권한 모드 변경 이벤트. 인자: 새 모드. + public event EventHandler? PermissionModeChanged; + + /// 설정 패널 토글 요청. + public event EventHandler? SettingsRequested; + + public AgentSessionHeaderBar() + { + InitializeComponent(); + } + + /// 탭 레이블을 업데이트합니다. + public void SetTabLabel(string tab) => TxtTabLabel.Text = tab; + + /// 모델명 칩을 업데이트합니다. + public void SetModel(string modelName) + { + // 긴 모델명은 축약 + var display = modelName.Length > 20 ? modelName[..20] + "…" : modelName; + TxtModelChip.Text = display; + } + + /// Plan 모드를 설정합니다. + public void SetPlanMode(string mode) + { + _planMode = mode; + TxtPlanChip.Text = mode switch + { + "auto" => "Plan: Auto", + "always" => "Plan: Always", + _ => "Plan: Off", + }; + + // 활성 상태 색상 + var icon = ChipPlan.Child is StackPanel sp && sp.Children[0] is System.Windows.Controls.TextBlock tb ? tb : null; + if (icon != null) + { + icon.Foreground = mode != "off" + ? (TryFindResource("AccentColor") as Brush ?? Brushes.DodgerBlue) + : (TryFindResource("SecondaryText") as Brush ?? Brushes.Gray); + } + } + + /// 권한 모드를 설정합니다. + public void SetPermissionMode(string mode) + { + _permissionMode = mode; + TxtPermissionChip.Text = mode; + } + + #region ── 이벤트 핸들러 ── + + private void ChipModel_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + => ModelChipClicked?.Invoke(this, EventArgs.Empty); + + private void ChipPlan_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + // 3-state 순환: off → auto → always → off + _planMode = _planMode switch + { + "off" => "auto", + "auto" => "always", + _ => "off", + }; + SetPlanMode(_planMode); + PlanModeChanged?.Invoke(this, _planMode); + } + + private void ChipPermission_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + // 4-state 순환: Ask → Auto → Deny → Bypass → Ask + _permissionMode = _permissionMode switch + { + "Ask" => "Auto", + "Auto" => "Deny", + "Deny" => "Bypass", + _ => "Ask", + }; + SetPermissionMode(_permissionMode); + PermissionModeChanged?.Invoke(this, _permissionMode); + } + + private void BtnSettings_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + => SettingsRequested?.Invoke(this, EventArgs.Empty); + + #endregion +} diff --git a/src/AxCopilot/Views/Controls/AgentSettingsPanel.xaml b/src/AxCopilot/Views/Controls/AgentSettingsPanel.xaml new file mode 100644 index 0000000..240f836 --- /dev/null +++ b/src/AxCopilot/Views/Controls/AgentSettingsPanel.xaml @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/Controls/AgentSettingsPanel.xaml.cs b/src/AxCopilot/Views/Controls/AgentSettingsPanel.xaml.cs new file mode 100644 index 0000000..e466ab0 --- /dev/null +++ b/src/AxCopilot/Views/Controls/AgentSettingsPanel.xaml.cs @@ -0,0 +1,280 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.Animation; +using AxCopilot.Services; + +namespace AxCopilot.Views.Controls; + +/// +/// Phase 32-A: 우측 슬라이드인 설정 패널. +/// ChatWindow 내부에서 AX Agent 설정을 인라인으로 제어합니다. +/// CC의 Claude.ai 설정 패널과 동등한 UX. +/// +public partial class AgentSettingsPanel : UserControl +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + private bool _isOpen; + private bool _isLoading = true; // 초기 로드 중 이벤트 발생 방지 + + /// 설정 패널 열림/닫힘 상태. + public bool IsOpen + { + get => _isOpen; + set + { + if (_isOpen == value) return; + _isOpen = value; + AnimateSlide(value); + } + } + + /// 설정 변경 시 발생하는 이벤트. + public event EventHandler? SettingsChanged; + + /// 닫기 요청 이벤트. + public event EventHandler? CloseRequested; + + public AgentSettingsPanel() + { + InitializeComponent(); + Visibility = Visibility.Collapsed; + } + + /// 현재 설정값으로 UI를 초기화합니다. + public void LoadFromSettings(SettingsService settings, string activeTab) + { + _isLoading = true; + + var llm = settings.Settings.Llm; + + TxtCurrentTab.Text = activeTab; + TxtServiceName.Text = llm.Service ?? "Ollama"; + TxtModelName.Text = llm.Model ?? "unknown"; + TxtApiEndpoint.Text = llm.OllamaEndpoint ?? ""; + + SliderMaxIterations.Value = llm.MaxAgentIterations > 0 ? llm.MaxAgentIterations : 25; + TxtMaxIterations.Text = ((int)SliderMaxIterations.Value).ToString(); + + SliderMaxRetry.Value = llm.MaxRetryOnError > 0 ? llm.MaxRetryOnError : 3; + TxtMaxRetry.Text = ((int)SliderMaxRetry.Value).ToString(); + + ChkParallelTools.IsChecked = llm.EnableParallelTools; + + SliderAutoCompact.Value = llm.AutoCompactThreshold > 0 ? llm.AutoCompactThreshold : 80; + TxtAutoCompact.Text = ((int)SliderAutoCompact.Value).ToString(); + + ChkDevMode.IsChecked = llm.DevMode; + + // 탭별 설정 표시 + PanelCoworkSettings.Visibility = activeTab == "Cowork" ? Visibility.Visible : Visibility.Collapsed; + PanelCodeSettings.Visibility = activeTab == "Code" ? Visibility.Visible : Visibility.Collapsed; + + if (activeTab == "Cowork") + { + ChkCoworkVerify.IsChecked = llm.EnableCoworkVerification; + } + else if (activeTab == "Code") + { + ChkCodeLsp.IsChecked = llm.Code?.EnableLsp ?? true; + ChkCodeVerify.IsChecked = llm.Code?.EnableCodeVerification ?? false; + } + + // 도구 토글 동적 생성 + BuildToolToggles(settings); + + _isLoading = false; + } + + /// 활성 탭 변경 시 UI를 업데이트합니다. + public void UpdateActiveTab(string tab) + { + TxtCurrentTab.Text = tab; + PanelCoworkSettings.Visibility = tab == "Cowork" ? Visibility.Visible : Visibility.Collapsed; + PanelCodeSettings.Visibility = tab == "Code" ? Visibility.Visible : Visibility.Collapsed; + } + + private void BuildToolToggles(SettingsService settings) + { + PanelToolToggles.Children.Clear(); + + var registry = CurrentApp?.GetType().GetProperty("ToolRegistry")?.GetValue(CurrentApp) as Services.Agent.ToolRegistry; + if (registry == null) return; + + var disabled = new HashSet( + settings.Settings.Llm.DisabledTools ?? new List(), + StringComparer.OrdinalIgnoreCase); + + foreach (var tool in registry.All.OrderBy(t => t.Name)) + { + var grid = new Grid { Margin = new Thickness(0, 0, 0, 4) }; + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + var label = new TextBlock + { + Text = tool.Name, + FontSize = 11, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(label, 0); + + var toggle = new CheckBox + { + IsChecked = !disabled.Contains(tool.Name), + Tag = tool.Name, + VerticalAlignment = VerticalAlignment.Center, + }; + if (TryFindResource("ToggleSwitch") is Style toggleStyle) + toggle.Style = toggleStyle; + toggle.Checked += ToolToggle_Changed; + toggle.Unchecked += ToolToggle_Changed; + Grid.SetColumn(toggle, 1); + + grid.Children.Add(label); + grid.Children.Add(toggle); + PanelToolToggles.Children.Add(grid); + } + } + + #region ── 이벤트 핸들러 ── + + private void BtnClose_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + IsOpen = false; + CloseRequested?.Invoke(this, EventArgs.Empty); + } + + private void BtnServiceSelector_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + // TODO: 서비스 선택 팝업 (Ollama/vLLM/Gemini/Claude) + } + + private void BtnModelSelector_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + // TODO: 모델 선택 팝업 — ChatWindow의 기존 모델 선택 로직 재사용 + } + + private void TxtApiEndpoint_LostFocus(object sender, RoutedEventArgs e) + { + if (_isLoading) return; + SaveSetting(s => s.Llm.OllamaEndpoint = TxtApiEndpoint.Text); + } + + private void SliderMaxIterations_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (_isLoading || TxtMaxIterations == null) return; + var val = (int)SliderMaxIterations.Value; + TxtMaxIterations.Text = val.ToString(); + SaveSetting(s => s.Llm.MaxAgentIterations = val); + } + + private void SliderMaxRetry_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (_isLoading || TxtMaxRetry == null) return; + var val = (int)SliderMaxRetry.Value; + TxtMaxRetry.Text = val.ToString(); + SaveSetting(s => s.Llm.MaxRetryOnError = val); + } + + private void ChkParallelTools_Changed(object sender, RoutedEventArgs e) + { + if (_isLoading) return; + SaveSetting(s => s.Llm.EnableParallelTools = ChkParallelTools.IsChecked == true); + } + + private void ChkCoworkVerify_Changed(object sender, RoutedEventArgs e) + { + if (_isLoading) return; + SaveSetting(s => s.Llm.EnableCoworkVerification = ChkCoworkVerify.IsChecked == true); + } + + private void ChkCodeLsp_Changed(object sender, RoutedEventArgs e) + { + if (_isLoading) return; + SaveSetting(s => { if (s.Llm.Code != null) s.Llm.Code.EnableLsp = ChkCodeLsp.IsChecked == true; }); + } + + private void ChkCodeVerify_Changed(object sender, RoutedEventArgs e) + { + if (_isLoading) return; + SaveSetting(s => { if (s.Llm.Code != null) s.Llm.Code.EnableCodeVerification = ChkCodeVerify.IsChecked == true; }); + } + + private void SliderAutoCompact_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) + { + if (_isLoading || TxtAutoCompact == null) return; + var val = (int)SliderAutoCompact.Value; + TxtAutoCompact.Text = val.ToString(); + SaveSetting(s => s.Llm.AutoCompactThreshold = val); + } + + private void ChkProjectRules_Changed(object sender, RoutedEventArgs e) + { + if (_isLoading) return; + // 프로젝트 규칙 활성/비활성 — 현재 세션에만 영향 + } + + private void ChkDevMode_Changed(object sender, RoutedEventArgs e) + { + if (_isLoading) return; + SaveSetting(s => s.Llm.DevMode = ChkDevMode.IsChecked == true); + } + + private void ToolToggle_Changed(object sender, RoutedEventArgs e) + { + if (_isLoading || sender is not CheckBox chk || chk.Tag is not string toolName) return; + + SaveSetting(s => + { + s.Llm.DisabledTools ??= new List(); + if (chk.IsChecked == true) + s.Llm.DisabledTools.Remove(toolName); + else if (!s.Llm.DisabledTools.Contains(toolName)) + s.Llm.DisabledTools.Add(toolName); + }); + } + + #endregion + + #region ── 설정 저장 & 애니메이션 ── + + private void SaveSetting(Action apply) + { + var svc = CurrentApp?.SettingsService; + if (svc == null) return; + + apply(svc.Settings); + svc.Save(); + SettingsChanged?.Invoke(this, EventArgs.Empty); + } + + private void AnimateSlide(bool open) + { + if (open) + { + Visibility = Visibility.Visible; + var anim = new DoubleAnimation(300, 0, TimeSpan.FromMilliseconds(200)) + { + EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseOut } + }; + SlideTransform.BeginAnimation(TranslateTransform.XProperty, anim); + } + else + { + var anim = new DoubleAnimation(0, 300, TimeSpan.FromMilliseconds(150)) + { + EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseIn } + }; + anim.Completed += (_, _) => + { + if (!_isOpen) Visibility = Visibility.Collapsed; + }; + SlideTransform.BeginAnimation(TranslateTransform.XProperty, anim); + } + } + + #endregion +} diff --git a/src/AxCopilot/Views/Controls/AgentSidebarView.xaml b/src/AxCopilot/Views/Controls/AgentSidebarView.xaml new file mode 100644 index 0000000..b1488c7 --- /dev/null +++ b/src/AxCopilot/Views/Controls/AgentSidebarView.xaml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/Controls/AgentSidebarView.xaml.cs b/src/AxCopilot/Views/Controls/AgentSidebarView.xaml.cs new file mode 100644 index 0000000..d076b45 --- /dev/null +++ b/src/AxCopilot/Views/Controls/AgentSidebarView.xaml.cs @@ -0,0 +1,232 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.Animation; + +namespace AxCopilot.Views.Controls; + +/// +/// Phase 32-B: 좌측 사이드바 (Claude.ai 스타일). +/// 탭 세그먼트(Chat/Cowork/Code) + 새 대화 + 검색 + 대화 이력. +/// +public partial class AgentSidebarView : UserControl +{ + private bool _isCollapsed; + private string _activeTab = "Chat"; + + /// 탭 전환 이벤트. 인자: 탭 이름 ("Chat", "Cowork", "Code"). + public event EventHandler? TabChanged; + + /// 새 대화 요청 이벤트. + public event EventHandler? NewChatRequested; + + /// 대화 선택 이벤트. 인자: 대화 ID. + public event EventHandler? ConversationSelected; + + /// 전체 삭제 요청 이벤트. + public event EventHandler? DeleteAllRequested; + + /// 설정 패널 토글 요청 이벤트. + public event EventHandler? SettingsRequested; + + /// 접기/펼치기 토글 이벤트. + public event EventHandler? CollapseToggled; + + /// 사이드바가 접혀있는지 여부. + public bool IsCollapsed => _isCollapsed; + + /// 현재 활성 탭. + public string ActiveTab => _activeTab; + + public AgentSidebarView() + { + InitializeComponent(); + UpdateTabHighlight("Chat"); + } + + /// 탭을 외부에서 변경합니다. + public void SetActiveTab(string tab) + { + _activeTab = tab; + UpdateTabHighlight(tab); + } + + /// 대화 이력 목록을 갱신합니다. + public void RefreshConversations(IEnumerable items) + { + ConversationList.Children.Clear(); + + string? lastGroup = null; + foreach (var item in items) + { + var group = GetDateGroup(item.UpdatedAt); + if (group != lastGroup) + { + lastGroup = group; + var header = new TextBlock + { + Text = group, + FontSize = 11, + FontWeight = FontWeights.SemiBold, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + Margin = new Thickness(8, 12, 0, 4), + }; + ConversationList.Children.Add(header); + } + + var border = new Border + { + CornerRadius = new CornerRadius(6), + Padding = new Thickness(10, 8, 10, 8), + Margin = new Thickness(0, 1, 0, 1), + Cursor = System.Windows.Input.Cursors.Hand, + Tag = item.Id, + Background = item.IsActive + ? (TryFindResource("ItemHoverBackground") as Brush ?? Brushes.Transparent) + : Brushes.Transparent, + }; + + var title = new TextBlock + { + Text = item.Title, + FontSize = 12, + Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.White, + TextTrimming = TextTrimming.CharacterEllipsis, + MaxWidth = 200, + }; + + border.Child = title; + border.MouseLeftButtonUp += (s, e) => + { + if (s is Border b && b.Tag is string id) + ConversationSelected?.Invoke(this, id); + }; + + // 호버 효과 + border.MouseEnter += (s, _) => + { + if (s is Border b) + b.Background = TryFindResource("ItemHoverBackground") as Brush ?? Brushes.Transparent; + }; + border.MouseLeave += (s, _) => + { + if (s is Border b && b.Tag is string id) + b.Background = items.Any(i => i.Id == id && i.IsActive) + ? (TryFindResource("ItemHoverBackground") as Brush ?? Brushes.Transparent) + : Brushes.Transparent; + }; + + ConversationList.Children.Add(border); + } + } + + #region ── 이벤트 핸들러 ── + + private void TabChat_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + _activeTab = "Chat"; + UpdateTabHighlight("Chat"); + TabChanged?.Invoke(this, "Chat"); + } + + private void TabCowork_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + _activeTab = "Cowork"; + UpdateTabHighlight("Cowork"); + TabChanged?.Invoke(this, "Cowork"); + } + + private void TabCode_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + _activeTab = "Code"; + UpdateTabHighlight("Code"); + TabChanged?.Invoke(this, "Code"); + } + + private void BtnNewChat_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + => NewChatRequested?.Invoke(this, EventArgs.Empty); + + private void BtnDeleteAll_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + => DeleteAllRequested?.Invoke(this, EventArgs.Empty); + + private void BtnSettings_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + => SettingsRequested?.Invoke(this, EventArgs.Empty); + + private void BtnCollapse_Click(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + _isCollapsed = !_isCollapsed; + AnimateCollapse(_isCollapsed); + CollapseToggled?.Invoke(this, _isCollapsed); + } + + private void TxtSearch_TextChanged(object sender, TextChangedEventArgs e) + { + // 검색 필터링은 ChatWindow에서 처리 + } + + #endregion + + #region ── UI 헬퍼 ── + + private void UpdateTabHighlight(string tab) + { + var accentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.DodgerBlue; + var transparentBrush = Brushes.Transparent; + + TabChat.Background = tab == "Chat" ? accentBrush : transparentBrush; + TabCowork.Background = tab == "Cowork" ? accentBrush : transparentBrush; + TabCode.Background = tab == "Code" ? accentBrush : transparentBrush; + + // 선택 탭 텍스트 색상 조정 + SetTabTextColor(TabChat, tab == "Chat"); + SetTabTextColor(TabCowork, tab == "Cowork"); + SetTabTextColor(TabCode, tab == "Code"); + } + + private void SetTabTextColor(Border tab, bool isActive) + { + if (tab.Child is TextBlock txt) + { + txt.Foreground = isActive + ? Brushes.White + : (TryFindResource("PrimaryText") as Brush ?? Brushes.White); + } + } + + private void AnimateCollapse(bool collapse) + { + var targetWidth = collapse ? 48.0 : 260.0; + var anim = new DoubleAnimation(Width, targetWidth, TimeSpan.FromMilliseconds(180)) + { + EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseInOut } + }; + BeginAnimation(WidthProperty, anim); + + // 접힌 상태: 제목/검색/대화 이력 숨김 + var vis = collapse ? Visibility.Collapsed : Visibility.Visible; + TxtTitle.Visibility = vis; + TxtSearch.Visibility = vis; + ConversationList.Visibility = vis; + } + + private static string GetDateGroup(DateTime date) + { + var today = DateTime.Today; + if (date.Date == today) return "오늘"; + if (date.Date == today.AddDays(-1)) return "어제"; + if (date.Date > today.AddDays(-7)) return "이전 7일"; + if (date.Date > today.AddDays(-30)) return "이전 30일"; + return date.ToString("yyyy-MM"); + } + + #endregion + + /// 대화 이력 표시용 DTO. + public class ConversationItem + { + public string Id { get; set; } = ""; + public string Title { get; set; } = ""; + public DateTime UpdatedAt { get; set; } + public bool IsActive { get; set; } + } +} diff --git a/src/AxCopilot/Views/CustomMessageBox.cs b/src/AxCopilot/Views/CustomMessageBox.cs new file mode 100644 index 0000000..c797b2a --- /dev/null +++ b/src/AxCopilot/Views/CustomMessageBox.cs @@ -0,0 +1,350 @@ +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; + +namespace AxCopilot.Views; + +/// +/// 기본 MessageBox를 대체하는 커스텀 다이얼로그. +/// 테마 리소스를 사용하여 앱 디자인과 일관된 모습을 제공합니다. +/// +internal sealed class CustomMessageBox : Window +{ + private MessageBoxResult _result = MessageBoxResult.None; + + private CustomMessageBox(string message, string title, MessageBoxButton buttons, MessageBoxImage icon) + { + Title = title; + Width = 400; + MinWidth = 320; + MaxWidth = 520; + SizeToContent = SizeToContent.Height; + WindowStartupLocation = WindowStartupLocation.CenterScreen; + ResizeMode = ResizeMode.NoResize; + WindowStyle = WindowStyle.None; + AllowsTransparency = true; + Background = Brushes.Transparent; + Topmost = true; // 다른 창 위에 표시 + + var bgBrush = Application.Current.TryFindResource("LauncherBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)); + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + var borderBrush = Application.Current.TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + var itemBg = Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2B, 0x40)); + + // 루트 컨테이너 + var root = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(16), + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Padding = new Thickness(28, 24, 28, 20), + Effect = new DropShadowEffect + { + BlurRadius = 24, ShadowDepth = 4, Opacity = 0.3, Color = Colors.Black, + }, + }; + + var stack = new StackPanel(); + + // 타이틀 바 (드래그 가능) + var titleBar = new Grid { Margin = new Thickness(0, 0, 0, 16) }; + titleBar.MouseLeftButtonDown += (_, _) => { try { DragMove(); } catch (Exception) { } }; + + // 아이콘 + 제목 + var titlePanel = new StackPanel { Orientation = Orientation.Horizontal }; + + var (iconText, iconColor) = GetIconInfo(icon); + if (!string.IsNullOrEmpty(iconText)) + { + titlePanel.Children.Add(new TextBlock + { + Text = iconText, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 18, + Foreground = iconColor, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0), + }); + } + + titlePanel.Children.Add(new TextBlock + { + Text = title, + FontSize = 15, + FontWeight = FontWeights.SemiBold, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + titleBar.Children.Add(titlePanel); + + // 닫기 버튼 + var closeBtn = new Button + { + Content = "\uE8BB", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 10, + Foreground = secondaryText, + Background = Brushes.Transparent, + BorderThickness = new Thickness(0), + Padding = new Thickness(6), + Cursor = Cursors.Hand, + HorizontalAlignment = HorizontalAlignment.Right, + VerticalAlignment = VerticalAlignment.Center, + }; + closeBtn.Click += (_, _) => { _result = MessageBoxResult.Cancel; Close(); }; + titleBar.Children.Add(closeBtn); + stack.Children.Add(titleBar); + + // 메시지 본문 + stack.Children.Add(new TextBlock + { + Text = message, + FontSize = 13, + Foreground = primaryText, + TextWrapping = TextWrapping.Wrap, + LineHeight = 20, + Margin = new Thickness(0, 0, 0, 24), + }); + + // 버튼 영역 + var btnPanel = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + }; + + switch (buttons) + { + case MessageBoxButton.OK: + btnPanel.Children.Add(CreateButton("확인", accentBrush, true, MessageBoxResult.OK)); + break; + case MessageBoxButton.OKCancel: + btnPanel.Children.Add(CreateButton("취소", itemBg, false, MessageBoxResult.Cancel)); + btnPanel.Children.Add(CreateButton("확인", accentBrush, true, MessageBoxResult.OK)); + break; + case MessageBoxButton.YesNo: + btnPanel.Children.Add(CreateButton("아니오", itemBg, false, MessageBoxResult.No)); + btnPanel.Children.Add(CreateButton("예", accentBrush, true, MessageBoxResult.Yes)); + break; + case MessageBoxButton.YesNoCancel: + btnPanel.Children.Add(CreateButton("취소", itemBg, false, MessageBoxResult.Cancel)); + btnPanel.Children.Add(CreateButton("아니오", itemBg, false, MessageBoxResult.No)); + btnPanel.Children.Add(CreateButton("예", accentBrush, true, MessageBoxResult.Yes)); + break; + } + + stack.Children.Add(btnPanel); + root.Child = stack; + Content = root; + + // ESC로 닫기 + KeyDown += (_, e) => + { + if (e.Key == Key.Escape) + { + _result = buttons == MessageBoxButton.YesNo ? MessageBoxResult.No : MessageBoxResult.Cancel; + Close(); + } + else if (e.Key == Key.Enter) + { + _result = buttons switch + { + MessageBoxButton.YesNo or MessageBoxButton.YesNoCancel => MessageBoxResult.Yes, + _ => MessageBoxResult.OK, + }; + Close(); + } + }; + } + + private Button CreateButton(string text, Brush bg, bool isPrimary, MessageBoxResult result) + { + var btn = new Button + { + Content = text, + FontSize = 12.5, + FontWeight = isPrimary ? FontWeights.SemiBold : FontWeights.Normal, + Foreground = isPrimary ? Brushes.White : (Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White), + Background = bg, + BorderThickness = new Thickness(0), + Padding = new Thickness(20, 8, 20, 8), + Margin = new Thickness(6, 0, 0, 0), + Cursor = Cursors.Hand, + MinWidth = 80, + }; + + // 라운드 코너 템플릿 + var template = new ControlTemplate(typeof(Button)); + var border = new FrameworkElementFactory(typeof(Border)); + border.SetValue(Border.BackgroundProperty, bg); + border.SetValue(Border.CornerRadiusProperty, new CornerRadius(10)); + border.SetValue(Border.PaddingProperty, new Thickness(20, 8, 20, 8)); + var cp = new FrameworkElementFactory(typeof(ContentPresenter)); + cp.SetValue(ContentPresenter.HorizontalAlignmentProperty, HorizontalAlignment.Center); + cp.SetValue(ContentPresenter.VerticalAlignmentProperty, VerticalAlignment.Center); + border.AppendChild(cp); + template.VisualTree = border; + btn.Template = template; + + btn.Click += (_, _) => { _result = result; Close(); }; + return btn; + } + + private static (string icon, Brush color) GetIconInfo(MessageBoxImage image) => image switch + { + MessageBoxImage.Error => ("\uEA39", new SolidColorBrush(Color.FromRgb(0xE5, 0x3E, 0x3E))), + MessageBoxImage.Warning => ("\uE7BA", new SolidColorBrush(Color.FromRgb(0xDD, 0x6B, 0x20))), + MessageBoxImage.Information => ("\uE946", new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC))), + MessageBoxImage.Question => ("\uE9CE", new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC))), + _ => ("", Brushes.Transparent), + }; + + // ─── 정적 호출 메서드 (기존 MessageBox.Show 시그니처 호환) ────────────── + + public static MessageBoxResult Show(string message) + => Show(message, "AX Copilot", MessageBoxButton.OK, MessageBoxImage.None); + + public static MessageBoxResult Show(string message, string title) + => Show(message, title, MessageBoxButton.OK, MessageBoxImage.None); + + public static MessageBoxResult Show(string message, string title, MessageBoxButton buttons) + => Show(message, title, buttons, MessageBoxImage.None); + + public static MessageBoxResult Show(string message, string title, MessageBoxButton buttons, MessageBoxImage icon) + { + var dlg = new CustomMessageBox(message, title, buttons, icon); + + // 등장 애니메이션 (페이드인 + 스케일) + dlg.Opacity = 0; + dlg.Loaded += (_, _) => + { + var fadeIn = new System.Windows.Media.Animation.DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(150)); + dlg.BeginAnimation(OpacityProperty, fadeIn); + }; + + // ─── 부모 Window 하단에 토스트 알림 표시 ─── + var parentWindow = Application.Current.Windows.OfType() + .FirstOrDefault(w => w.IsActive && w is not CustomMessageBox) + ?? Application.Current.MainWindow; + + Border? toast = null; + Grid? rootGrid = null; + + if (parentWindow?.Content is Border outerBorder && outerBorder.Child is Grid grid) + { + rootGrid = grid; + toast = CreateToastBanner(title, icon); + rootGrid.Children.Add(toast); + } + else if (parentWindow?.Content is Grid directGrid) + { + rootGrid = directGrid; + toast = CreateToastBanner(title, icon); + rootGrid.Children.Add(toast); + } + + dlg.ShowDialog(); + + // 다이얼로그 닫힌 후 토스트 페이드아웃 + if (toast != null && rootGrid != null) + { + var fadeOut = new DoubleAnimation(1, 0, TimeSpan.FromMilliseconds(400)) + { + EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseIn }, + }; + fadeOut.Completed += (_, _) => rootGrid.Children.Remove(toast); + toast.BeginAnimation(OpacityProperty, fadeOut); + } + + return dlg._result; + } + + /// 하단 토스트 배너 생성. + private static Border CreateToastBanner(string title, MessageBoxImage icon) + { + var (iconText, iconColor) = GetIconInfo(icon); + if (string.IsNullOrEmpty(iconText)) + { + iconText = "\uE946"; // default info icon + iconColor = new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + } + + var panel = new StackPanel { Orientation = Orientation.Horizontal }; + panel.Children.Add(new TextBlock + { + Text = iconText, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, + Foreground = iconColor, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 8, 0), + }); + panel.Children.Add(new TextBlock + { + Text = title, + FontSize = 11.5, + FontWeight = FontWeights.SemiBold, + Foreground = Brushes.White, + VerticalAlignment = VerticalAlignment.Center, + }); + + var toast = new Border + { + Background = new SolidColorBrush(Color.FromArgb(0xE8, 0x2A, 0x2B, 0x40)), + CornerRadius = new CornerRadius(10), + Padding = new Thickness(16, 8, 16, 8), + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Bottom, + Margin = new Thickness(0, 0, 0, 12), + Effect = new DropShadowEffect + { + BlurRadius = 12, ShadowDepth = 2, Opacity = 0.3, Color = Colors.Black, + }, + Opacity = 0, + Child = panel, + }; + + // 모든 Grid Row/Column 스팬하도록 설정 + Grid.SetColumnSpan(toast, 10); + Grid.SetRowSpan(toast, 10); + + // 슬라이드업 + 페이드인 애니메이션 + var translate = new TranslateTransform(0, 20); + toast.RenderTransform = translate; + + toast.Loaded += (_, _) => + { + var fadeIn = new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(250)) + { + EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseOut }, + }; + var slideUp = new DoubleAnimation(20, 0, TimeSpan.FromMilliseconds(300)) + { + EasingFunction = new BackEase { EasingMode = EasingMode.EaseOut, Amplitude = 0.3 }, + }; + toast.BeginAnimation(OpacityProperty, fadeIn); + translate.BeginAnimation(TranslateTransform.YProperty, slideUp); + }; + + return toast; + } + + /// WinForms 호환 — 인스톨러에서도 사용 가능하도록 Window 없이 표시. + public static MessageBoxResult ShowStandalone(string message, string title, + MessageBoxButton buttons = MessageBoxButton.OK, MessageBoxImage icon = MessageBoxImage.None) + { + var dlg = new CustomMessageBox(message, title, buttons, icon); + dlg.ShowDialog(); + return dlg._result; + } +} diff --git a/src/AxCopilot/Views/CustomMoodDialog.cs b/src/AxCopilot/Views/CustomMoodDialog.cs new file mode 100644 index 0000000..856900a --- /dev/null +++ b/src/AxCopilot/Views/CustomMoodDialog.cs @@ -0,0 +1,283 @@ +using System.Text.RegularExpressions; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Shapes; + +namespace AxCopilot.Views; + +/// 커스텀 디자인 무드 추가/편집 다이얼로그. +internal sealed partial class CustomMoodDialog : Window +{ + private readonly TextBox _keyBox; + private readonly TextBox _labelBox; + private readonly TextBox _iconBox; + private readonly TextBox _descBox; + private readonly TextBox _cssBox; + private readonly bool _isEdit; + + public string MoodKey => _keyBox.Text.Trim().ToLowerInvariant(); + public string MoodLabel => _labelBox.Text.Trim(); + public string MoodIcon => _iconBox.Text.Trim(); + public string MoodDescription => _descBox.Text.Trim(); + public string MoodCss => _cssBox.Text; + + public CustomMoodDialog( + string existingKey = "", + string existingLabel = "", + string existingIcon = "🎯", + string existingDesc = "", + string existingCss = "") + { + _isEdit = !string.IsNullOrEmpty(existingKey); + Title = _isEdit ? "무드 편집" : "무드 추가"; + Width = 560; + SizeToContent = SizeToContent.Height; + WindowStartupLocation = WindowStartupLocation.CenterOwner; + ResizeMode = ResizeMode.NoResize; + WindowStyle = WindowStyle.None; + AllowsTransparency = true; + Background = Brushes.Transparent; + + var bgBrush = Application.Current.TryFindResource("LauncherBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)); + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush ?? Brushes.Blue; + var itemBg = Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2B, 0x40)); + var borderBrush = Application.Current.TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + + var root = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(16), + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Padding = new Thickness(28, 24, 28, 24), + Effect = new System.Windows.Media.Effects.DropShadowEffect + { + BlurRadius = 24, ShadowDepth = 4, Opacity = 0.3, Color = Colors.Black, + }, + }; + + var stack = new StackPanel(); + + // 헤더 + var header = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 0, 0, 20) }; + header.Children.Add(new TextBlock + { + Text = "\uE771", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 18, Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0), + }); + header.Children.Add(new TextBlock + { + Text = _isEdit ? "디자인 무드 편집" : "새 커스텀 디자인 무드", + FontSize = 17, FontWeight = FontWeights.Bold, + Foreground = primaryText, VerticalAlignment = VerticalAlignment.Center, + }); + stack.Children.Add(header); + + // ── 키 + 라벨 + 아이콘 (한 줄) ── + var row1 = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 0, 0, 8) }; + + // 키 + var keyStack = new StackPanel { Margin = new Thickness(0, 0, 12, 0) }; + AddLabel(keyStack, "키 (영문)", primaryText); + _keyBox = CreateTextBox(existingKey, primaryText, itemBg, accentBrush, borderBrush); + _keyBox.Width = 140; + _keyBox.IsEnabled = !_isEdit; // 편집 시 키 변경 불가 + keyStack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _keyBox }); + row1.Children.Add(keyStack); + + // 라벨 + var labelStack = new StackPanel { Margin = new Thickness(0, 0, 12, 0) }; + AddLabel(labelStack, "이름", primaryText); + _labelBox = CreateTextBox(existingLabel, primaryText, itemBg, accentBrush, borderBrush); + _labelBox.Width = 180; + labelStack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _labelBox }); + row1.Children.Add(labelStack); + + // 아이콘 (이모지) + var iconStack = new StackPanel(); + AddLabel(iconStack, "아이콘", primaryText); + _iconBox = CreateTextBox(existingIcon, primaryText, itemBg, accentBrush, borderBrush); + _iconBox.Width = 60; + _iconBox.TextAlignment = TextAlignment.Center; + iconStack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _iconBox }); + row1.Children.Add(iconStack); + + stack.Children.Add(row1); + + // ── 설명 ── + AddLabel(stack, "설명", primaryText); + _descBox = CreateTextBox(existingDesc, primaryText, itemBg, accentBrush, borderBrush); + stack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _descBox, Margin = new Thickness(0, 0, 0, 8) }); + + // ── CSS ── + AddSeparator(stack, borderBrush); + AddLabel(stack, "CSS 스타일", primaryText); + AddHint(stack, "문서에 적용될 CSS입니다. body, h1~h6, table, .callout 등의 스타일을 정의하세요.", secondaryText); + _cssBox = CreateTextBox(existingCss, primaryText, itemBg, accentBrush, borderBrush, multiline: true, height: 200); + _cssBox.FontFamily = new FontFamily("Consolas, Courier New, monospace"); + _cssBox.FontSize = 12; + stack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _cssBox }); + + // CSS 힌트 버튼 + var hintBtn = new TextBlock + { + Text = "CSS 예시 보기", + FontSize = 11, + Foreground = accentBrush, + Cursor = Cursors.Hand, + Margin = new Thickness(0, 6, 0, 0), + TextDecorations = TextDecorations.Underline, + }; + hintBtn.MouseLeftButtonDown += (_, _) => + { + if (string.IsNullOrWhiteSpace(_cssBox.Text)) + { + _cssBox.Text = CssExample; + } + }; + stack.Children.Add(hintBtn); + + // ── 버튼 바 ── + var btnBar = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(0, 20, 0, 0), + }; + + var cancelBtn = new Button + { + Content = "취소", Width = 80, + Padding = new Thickness(0, 8, 0, 8), + Margin = new Thickness(0, 0, 10, 0), + Background = Brushes.Transparent, Foreground = secondaryText, + BorderBrush = borderBrush, BorderThickness = new Thickness(1), + Cursor = Cursors.Hand, FontSize = 13, + }; + cancelBtn.Click += (_, _) => { DialogResult = false; Close(); }; + btnBar.Children.Add(cancelBtn); + + var okBtn = new Button + { + Content = _isEdit ? "저장" : "추가", Width = 80, + Padding = new Thickness(0, 8, 0, 8), + Background = accentBrush, Foreground = Brushes.White, + BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, FontSize = 13, FontWeight = FontWeights.SemiBold, + }; + okBtn.Click += (_, _) => Validate(); + btnBar.Children.Add(okBtn); + stack.Children.Add(btnBar); + + root.Child = stack; + Content = root; + + KeyDown += (_, ke) => { if (ke.Key == Key.Escape) { DialogResult = false; Close(); } }; + Loaded += (_, _) => { (_isEdit ? _labelBox : _keyBox).Focus(); }; + root.MouseLeftButtonDown += (_, me) => + { + if (me.LeftButton == MouseButtonState.Pressed) + try { DragMove(); } catch (Exception) { } + }; + } + + private void Validate() + { + if (string.IsNullOrWhiteSpace(_keyBox.Text)) + { + CustomMessageBox.Show("키를 입력하세요 (영문 소문자).", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + _keyBox.Focus(); return; + } + if (!Regex.IsMatch(_keyBox.Text.Trim(), @"^[a-z][a-z0-9_]{1,20}$")) + { + CustomMessageBox.Show("키는 영문 소문자로 시작하며, 소문자/숫자/밑줄만 허용됩니다 (2~21자).", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + _keyBox.Focus(); return; + } + if (string.IsNullOrWhiteSpace(_labelBox.Text)) + { + CustomMessageBox.Show("이름을 입력하세요.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + _labelBox.Focus(); return; + } + // 내장 무드 키와 충돌 확인 + if (!_isEdit) + { + var builtinKeys = new[] { "modern", "professional", "creative", "minimal", "elegant", "dark", "colorful", "corporate", "magazine", "dashboard" }; + if (builtinKeys.Contains(_keyBox.Text.Trim().ToLowerInvariant())) + { + CustomMessageBox.Show("내장 무드와 동일한 키는 사용할 수 없습니다.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + _keyBox.Focus(); return; + } + } + DialogResult = true; + Close(); + } + + private static void AddLabel(StackPanel parent, string text, Brush fg) => + parent.Children.Add(new TextBlock + { + Text = text, FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = fg, Margin = new Thickness(0, 0, 0, 6), + }); + + private static void AddHint(StackPanel parent, string text, Brush fg) => + parent.Children.Add(new TextBlock + { + Text = text, FontSize = 11, Foreground = fg, + Margin = new Thickness(0, 0, 0, 8), + }); + + private static void AddSeparator(StackPanel parent, Brush color) => + parent.Children.Add(new Rectangle + { + Height = 1, Fill = color, + Margin = new Thickness(0, 8, 0, 12), Opacity = 0.5, + }); + + private static TextBox CreateTextBox(string text, Brush fg, Brush bg, Brush caret, Brush border, bool multiline = false, int height = 100) + { + var tb = new TextBox + { + Text = text, FontSize = 13, + Padding = new Thickness(12, 8, 12, 8), + Foreground = fg, Background = bg, + CaretBrush = caret, BorderBrush = border, + BorderThickness = new Thickness(1), + }; + if (multiline) + { + tb.AcceptsReturn = true; + tb.AcceptsTab = true; + tb.TextWrapping = TextWrapping.Wrap; + tb.MinHeight = height; + tb.MaxHeight = height + 100; + tb.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; + } + return tb; + } + + private const string CssExample = @"body { + font-family: 'Pretendard', 'Noto Sans KR', sans-serif; + max-width: 900px; + margin: 0 auto; + padding: 40px; + color: #1a1a2e; + background: #f8f9fc; + line-height: 1.8; +} +h1 { color: #2d3748; border-bottom: 2px solid #4a90d9; padding-bottom: 8px; } +h2 { color: #4a5568; margin-top: 2em; } +table { width: 100%; border-collapse: collapse; margin: 1.5em 0; } +th { background: #4a90d9; color: white; padding: 10px; text-align: left; } +td { padding: 8px 10px; border-bottom: 1px solid #e2e8f0; } +tr:nth-child(even) { background: #f0f4f8; } +"; +} diff --git a/src/AxCopilot/Views/CustomPresetDialog.cs b/src/AxCopilot/Views/CustomPresetDialog.cs new file mode 100644 index 0000000..6f35ff7 --- /dev/null +++ b/src/AxCopilot/Views/CustomPresetDialog.cs @@ -0,0 +1,483 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Shapes; +using AxCopilot.Models; + +namespace AxCopilot.Views; + +/// 커스텀 프리셋 추가/편집 다이얼로그. +internal sealed class CustomPresetDialog : Window +{ + private readonly TextBox _nameBox; + private readonly TextBox _descBox; + private readonly TextBox _promptBox; + private readonly ComboBox _tabCombo; + private string _selectedColor; + private string _selectedSymbol; + private Border? _iconPreview; + private TextBlock? _iconPreviewText; + + public string PresetName => _nameBox.Text.Trim(); + public string PresetDescription => _descBox.Text.Trim(); + public string PresetSystemPrompt => _promptBox.Text.Trim(); + public string PresetTab => (_tabCombo.SelectedItem as ComboBoxItem)?.Tag?.ToString() ?? "Chat"; + public string PresetColor => _selectedColor; + public string PresetSymbol => _selectedSymbol; + + // 사전 정의 색상 팔레트 + private static readonly (string Label, string Hex)[] Colors = + { + ("인디고", "#6366F1"), + ("블루", "#3B82F6"), + ("티일", "#14B8A6"), + ("그린", "#22C55E"), + ("옐로우", "#EAB308"), + ("오렌지", "#F97316"), + ("레드", "#EF4444"), + ("핑크", "#EC4899"), + ("퍼플", "#A855F7"), + ("슬레이트", "#64748B"), + }; + + // 아이콘 셋트 — (카테고리, 아이콘 목록) + private static readonly (string Category, (string Label, string Symbol)[] Icons)[] IconSets = + { + ("업무", new[] + { + ("일반", "\uE771"), ("문서", "\uE8A5"), ("메일", "\uE715"), ("캘린더", "\uE787"), + ("차트", "\uE9D9"), ("발표", "\uE7F4"), ("계산기", "\uE8EF"), ("메모", "\uE70B"), + }), + ("기술", new[] + { + ("코드", "\uE943"), ("설정", "\uE713"), ("데이터", "\uEA86"), ("검색", "\uE721"), + ("보안", "\uE72E"), ("서버", "\uE839"), ("버그", "\uEBE8"), ("배포", "\uE7F8"), + }), + ("커뮤니케이션", new[] + { + ("대화", "\uE8BD"), ("사람", "\uE77B"), ("팀", "\uE716"), ("전화", "\uE717"), + ("알림", "\uEA8F"), ("공유", "\uE72D"), ("피드백", "\uE939"), ("질문", "\uE897"), + }), + ("콘텐츠", new[] + { + ("사진", "\uE722"), ("동영상", "\uE714"), ("음악", "\uE8D6"), ("글쓰기", "\uE70F"), + ("책", "\uE82D"), ("웹", "\uE774"), ("디자인", "\uE790"), ("다운로드", "\uE896"), + }), + ("분석", new[] + { + ("인사이트", "\uE9D9"), ("대시보드", "\uE809"), ("리포트", "\uE9F9"),("트렌드", "\uE8A1"), + ("필터", "\uE71C"), ("목표", "\uE7C1"), ("비교", "\uE8FD"), ("측정", "\uE7C8"), + }), + }; + + public CustomPresetDialog( + string existingName = "", + string existingDesc = "", + string existingPrompt = "", + string existingColor = "#6366F1", + string existingSymbol = "\uE713", + string existingTab = "Chat") + { + bool isEdit = !string.IsNullOrEmpty(existingName); + Title = isEdit ? "프리셋 편집" : "프리셋 추가"; + Width = 520; + SizeToContent = SizeToContent.Height; + WindowStartupLocation = WindowStartupLocation.CenterOwner; + ResizeMode = ResizeMode.NoResize; + WindowStyle = WindowStyle.None; + AllowsTransparency = true; + Background = Brushes.Transparent; + + _selectedColor = existingColor; + _selectedSymbol = existingSymbol; + + var bgBrush = Application.Current.TryFindResource("LauncherBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)); + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush ?? Brushes.Blue; + var itemBg = Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2B, 0x40)); + var borderBrush = Application.Current.TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + + var root = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(16), + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Padding = new Thickness(28, 24, 28, 24), + Effect = new System.Windows.Media.Effects.DropShadowEffect + { + BlurRadius = 24, ShadowDepth = 4, Opacity = 0.3, Color = System.Windows.Media.Colors.Black, + }, + }; + + var stack = new StackPanel(); + + // 헤더 + var header = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 0, 0, 20) }; + header.Children.Add(new TextBlock + { + Text = "\uE710", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 18, Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0), + }); + header.Children.Add(new TextBlock + { + Text = isEdit ? "프리셋 편집" : "새 커스텀 프리셋", + FontSize = 17, FontWeight = FontWeights.Bold, + Foreground = primaryText, VerticalAlignment = VerticalAlignment.Center, + }); + stack.Children.Add(header); + + // ── 프리셋 이름 ── + AddLabel(stack, "프리셋 이름", primaryText); + AddHint(stack, "대화 주제 버튼에 표시될 이름입니다", secondaryText); + _nameBox = CreateTextBox(existingName, primaryText, itemBg, accentBrush, borderBrush); + stack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _nameBox }); + + // ── 설명 ── + AddSeparator(stack, borderBrush); + AddLabel(stack, "설명", primaryText); + AddHint(stack, "프리셋 카드 하단에 표시될 짧은 설명입니다", secondaryText); + _descBox = CreateTextBox(existingDesc, primaryText, itemBg, accentBrush, borderBrush); + stack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _descBox }); + + // ── 아이콘 + 색상 ── + AddSeparator(stack, borderBrush); + AddLabel(stack, "아이콘 & 배경색", primaryText); + + var iconColorRow = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 0, 0, 8) }; + + // 아이콘 미리보기 (클릭하면 아이콘 선택 팝업) + _iconPreview = new Border + { + Width = 48, Height = 48, + CornerRadius = new CornerRadius(24), + Background = new SolidColorBrush(ParseColor(_selectedColor)) { Opacity = 0.2 }, + Cursor = Cursors.Hand, + Margin = new Thickness(0, 0, 16, 0), + ToolTip = "아이콘 선택", + }; + _iconPreviewText = new TextBlock + { + Text = _selectedSymbol, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 20, + Foreground = BrushFromHex(_selectedColor), + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + _iconPreview.Child = _iconPreviewText; + _iconPreview.MouseLeftButtonDown += (_, _) => ShowIconPickerPopup(); + iconColorRow.Children.Add(_iconPreview); + + // 탭 선택 + var tabStack = new StackPanel { Margin = new Thickness(0, 0, 16, 0) }; + tabStack.Children.Add(new TextBlock { Text = "탭", FontSize = 11, Foreground = secondaryText, Margin = new Thickness(0, 0, 0, 4) }); + _tabCombo = new ComboBox + { + Width = 100, FontSize = 12, + Foreground = primaryText, Background = itemBg, + BorderBrush = borderBrush, BorderThickness = new Thickness(1), + Padding = new Thickness(6, 4, 6, 4), + }; + _tabCombo.Items.Add(new ComboBoxItem { Content = "Chat", Tag = "Chat", IsSelected = existingTab == "Chat" }); + _tabCombo.Items.Add(new ComboBoxItem { Content = "Cowork", Tag = "Cowork", IsSelected = existingTab == "Cowork" }); + tabStack.Children.Add(_tabCombo); + iconColorRow.Children.Add(tabStack); + + // 색상 팔레트 + var colorStack = new StackPanel(); + colorStack.Children.Add(new TextBlock { Text = "배경색", FontSize = 11, Foreground = secondaryText, Margin = new Thickness(0, 0, 0, 4) }); + var colorPanel = new WrapPanel(); + foreach (var (label, hex) in Colors) + { + var colorHex = hex; + var swatch = new Border + { + Width = 22, Height = 22, + CornerRadius = new CornerRadius(11), + Background = BrushFromHex(hex), + Margin = new Thickness(0, 0, 5, 4), + Cursor = Cursors.Hand, + BorderThickness = new Thickness(2), + BorderBrush = hex == _selectedColor ? primaryText : Brushes.Transparent, + ToolTip = label, + }; + swatch.MouseLeftButtonDown += (s, _) => + { + _selectedColor = colorHex; + foreach (var child in colorPanel.Children) + if (child is Border b) b.BorderBrush = Brushes.Transparent; + if (s is Border clicked) clicked.BorderBrush = primaryText; + UpdateIconPreview(); + }; + colorPanel.Children.Add(swatch); + } + colorStack.Children.Add(colorPanel); + iconColorRow.Children.Add(colorStack); + stack.Children.Add(iconColorRow); + + // ── 시스템 프롬프트 ── + AddSeparator(stack, borderBrush); + AddLabel(stack, "시스템 프롬프트", primaryText); + AddHint(stack, "AI가 이 프리셋에서 따를 지침입니다. 비워두면 기본 프롬프트가 사용됩니다.", secondaryText); + _promptBox = CreateTextBox(existingPrompt, primaryText, itemBg, accentBrush, borderBrush, multiline: true); + stack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _promptBox }); + + // 글자 수 + var charCount = new TextBlock + { + FontSize = 10.5, Foreground = secondaryText, + Margin = new Thickness(0, 6, 0, 0), + HorizontalAlignment = HorizontalAlignment.Right, + }; + UpdateCharCount(charCount); + _promptBox.TextChanged += (_, _) => UpdateCharCount(charCount); + stack.Children.Add(charCount); + + // ── 버튼 바 ── + var btnBar = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(0, 20, 0, 0), + }; + + var cancelBtn = new Button + { + Content = "취소", Width = 80, + Padding = new Thickness(0, 8, 0, 8), + Margin = new Thickness(0, 0, 10, 0), + Background = Brushes.Transparent, Foreground = secondaryText, + BorderBrush = borderBrush, BorderThickness = new Thickness(1), + Cursor = Cursors.Hand, FontSize = 13, + }; + cancelBtn.Click += (_, _) => { DialogResult = false; Close(); }; + btnBar.Children.Add(cancelBtn); + + var okBtn = new Button + { + Content = isEdit ? "저장" : "추가", Width = 80, + Padding = new Thickness(0, 8, 0, 8), + Background = accentBrush, Foreground = Brushes.White, + BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, FontSize = 13, FontWeight = FontWeights.SemiBold, + }; + okBtn.Click += (_, _) => + { + if (string.IsNullOrWhiteSpace(_nameBox.Text)) + { + CustomMessageBox.Show("프리셋 이름을 입력하세요.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + _nameBox.Focus(); + return; + } + DialogResult = true; + Close(); + }; + btnBar.Children.Add(okBtn); + stack.Children.Add(btnBar); + + root.Child = stack; + Content = root; + + KeyDown += (_, ke) => { if (ke.Key == Key.Escape) { DialogResult = false; Close(); } }; + Loaded += (_, _) => { _nameBox.Focus(); _nameBox.SelectAll(); }; + root.MouseLeftButtonDown += (_, me) => + { + if (me.LeftButton == MouseButtonState.Pressed) + try { DragMove(); } catch (Exception) { } + }; + } + + private void UpdateIconPreview() + { + if (_iconPreview == null || _iconPreviewText == null) return; + _iconPreview.Background = new SolidColorBrush(ParseColor(_selectedColor)) { Opacity = 0.2 }; + _iconPreviewText.Text = _selectedSymbol; + _iconPreviewText.Foreground = BrushFromHex(_selectedColor); + } + + // ── 아이콘 피커 팝업 ──────────────────────────────────────────── + private void ShowIconPickerPopup() + { + var bgBrush = Application.Current.TryFindResource("LauncherBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)); + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var borderBrush = Application.Current.TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + var hoverBg = Application.Current.TryFindResource("ItemHoverBackground") as Brush ?? Brushes.Transparent; + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush ?? Brushes.Blue; + + // 별도 Window로 표시 (모달 다이얼로그 위에서 Popup 충돌 방지) + var pickerWin = new Window + { + Title = "아이콘 선택", + Width = 340, + SizeToContent = SizeToContent.Height, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, + ResizeMode = ResizeMode.NoResize, + WindowStyle = WindowStyle.None, + AllowsTransparency = true, + Background = Brushes.Transparent, + }; + + var popupBorder = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(12), + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Padding = new Thickness(12), + Effect = new System.Windows.Media.Effects.DropShadowEffect + { + BlurRadius = 16, ShadowDepth = 3, Opacity = 0.3, Color = System.Windows.Media.Colors.Black, + }, + }; + + var mainStack = new StackPanel(); + + // 타이틀 + 닫기 + var titleRow = new Grid(); + titleRow.Children.Add(new TextBlock + { + Text = "아이콘 선택", + FontSize = 14, FontWeight = FontWeights.SemiBold, + Foreground = primaryText, + Margin = new Thickness(0, 0, 0, 10), + HorizontalAlignment = HorizontalAlignment.Left, + }); + var closeBtn = new TextBlock + { + Text = "\uE711", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, Foreground = secondaryText, + Cursor = Cursors.Hand, + HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Top, + }; + closeBtn.MouseLeftButtonDown += (_, _) => pickerWin.Close(); + titleRow.Children.Add(closeBtn); + mainStack.Children.Add(titleRow); + + // 드래그로 창 이동 + popupBorder.MouseLeftButtonDown += (_, e) => { try { pickerWin.DragMove(); } catch (Exception) { } }; + + // 카테고리별 아이콘 그리드 + foreach (var (category, icons) in IconSets) + { + mainStack.Children.Add(new TextBlock + { + Text = category, + FontSize = 11, FontWeight = FontWeights.SemiBold, + Foreground = secondaryText, + Margin = new Thickness(0, 6, 0, 4), + }); + + var wrapPanel = new WrapPanel(); + foreach (var (label, symbol) in icons) + { + var capturedSymbol = symbol; + var isSelected = _selectedSymbol == symbol; + var iconBtn = new Border + { + Width = 36, Height = 36, + CornerRadius = new CornerRadius(8), + Background = isSelected ? new SolidColorBrush(ParseColor(_selectedColor)) { Opacity = 0.2 } : Brushes.Transparent, + BorderBrush = isSelected ? accentBrush : Brushes.Transparent, + BorderThickness = new Thickness(isSelected ? 1.5 : 0), + Cursor = Cursors.Hand, + Margin = new Thickness(0, 0, 4, 4), + ToolTip = label, + }; + iconBtn.Child = new TextBlock + { + Text = symbol, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 16, + Foreground = isSelected ? BrushFromHex(_selectedColor) : primaryText, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + + iconBtn.MouseEnter += (s, _) => { if (s is Border b && !(_selectedSymbol == capturedSymbol)) b.Background = hoverBg; }; + iconBtn.MouseLeave += (s, _) => { if (s is Border b && !(_selectedSymbol == capturedSymbol)) b.Background = Brushes.Transparent; }; + iconBtn.MouseLeftButtonDown += (_, e) => + { + e.Handled = true; + _selectedSymbol = capturedSymbol; + UpdateIconPreview(); + pickerWin.Close(); + }; + + wrapPanel.Children.Add(iconBtn); + } + mainStack.Children.Add(wrapPanel); + } + + popupBorder.Child = mainStack; + pickerWin.Content = popupBorder; + pickerWin.ShowDialog(); + } + + private static void AddLabel(StackPanel parent, string text, Brush fg) => + parent.Children.Add(new TextBlock + { + Text = text, FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = fg, Margin = new Thickness(0, 0, 0, 6), + }); + + private static void AddHint(StackPanel parent, string text, Brush fg) => + parent.Children.Add(new TextBlock + { + Text = text, FontSize = 11, Foreground = fg, + Margin = new Thickness(0, 0, 0, 8), + }); + + private static void AddSeparator(StackPanel parent, Brush color) => + parent.Children.Add(new Rectangle + { + Height = 1, Fill = color, + Margin = new Thickness(0, 12, 0, 12), Opacity = 0.5, + }); + + private static TextBox CreateTextBox(string text, Brush fg, Brush bg, Brush caret, Brush border, bool multiline = false) + { + var tb = new TextBox + { + Text = text, FontSize = 13, + Padding = new Thickness(12, 8, 12, 8), + Foreground = fg, Background = bg, + CaretBrush = caret, BorderBrush = border, + BorderThickness = new Thickness(1), + }; + if (multiline) + { + tb.AcceptsReturn = true; + tb.TextWrapping = TextWrapping.Wrap; + tb.MinHeight = 100; + tb.MaxHeight = 200; + tb.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; + } + return tb; + } + + private void UpdateCharCount(TextBlock tb) => + tb.Text = $"{_promptBox.Text.Length}자"; + + private static Brush BrushFromHex(string hex) + { + try { return ThemeResourceHelper.HexBrush(hex); } + catch (Exception) { return Brushes.Gray; } + } + + private static Color ParseColor(string hex) + { + try { return ThemeResourceHelper.HexColor(hex); } + catch (Exception) { return System.Windows.Media.Colors.Gray; } + } +} diff --git a/src/AxCopilot/Views/DiffViewerPanel.cs b/src/AxCopilot/Views/DiffViewerPanel.cs new file mode 100644 index 0000000..3a47ab0 --- /dev/null +++ b/src/AxCopilot/Views/DiffViewerPanel.cs @@ -0,0 +1,210 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using AxCopilot.Services; + +namespace AxCopilot.Views; + +/// +/// 에이전트 파일 수정 시 변경 전/후 diff를 보여주는 패널. +/// DiffService의 결과를 색상 하이라이트로 렌더링하고 +/// Accept/Reject 버튼으로 변경 승인/취소를 지원합니다. +/// +public class DiffViewerPanel : Border +{ + private readonly string _filePath; + private readonly string _oldContent; + private readonly string _newContent; + private readonly List _diffLines; + + /// 사용자가 Accept를 눌렀을 때 발생합니다. + public event EventHandler? Accepted; + + /// 사용자가 Reject를 눌렀을 때 발생합니다. + public event EventHandler? Rejected; + + public DiffViewerPanel(string filePath, string oldContent, string newContent) + { + _filePath = filePath; + _oldContent = oldContent; + _newContent = newContent; + _diffLines = DiffService.ComputeDiff(oldContent, newContent); + + CornerRadius = new CornerRadius(10); + Background = new SolidColorBrush(Color.FromRgb(0xFA, 0xFA, 0xFF)); + BorderBrush = new SolidColorBrush(Color.FromRgb(0xE0, 0xE0, 0xEC)); + BorderThickness = new Thickness(1); + Padding = new Thickness(0); + Margin = new Thickness(0, 8, 0, 8); + + Child = BuildContent(); + } + + private UIElement BuildContent() + { + var mainStack = new StackPanel(); + + // 헤더 + var header = new Border + { + Background = new SolidColorBrush(Color.FromRgb(0xF0, 0xF2, 0xFF)), + CornerRadius = new CornerRadius(10, 10, 0, 0), + Padding = new Thickness(14, 10, 14, 10), + }; + var headerGrid = new Grid(); + headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + headerGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + var summary = DiffService.GetSummary(_diffLines); + var titlePanel = new StackPanel { Orientation = Orientation.Horizontal }; + titlePanel.Children.Add(new TextBlock + { + Text = "\uE89A", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 13, Foreground = new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 8, 0), + }); + titlePanel.Children.Add(new TextBlock + { + Text = System.IO.Path.GetFileName(_filePath), + FontSize = 13, FontWeight = FontWeights.SemiBold, + Foreground = new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)), + VerticalAlignment = VerticalAlignment.Center, + }); + titlePanel.Children.Add(new TextBlock + { + Text = $" · {summary}", + FontSize = 11, + Foreground = new SolidColorBrush(Color.FromRgb(0x88, 0x88, 0xAA)), + VerticalAlignment = VerticalAlignment.Center, + }); + Grid.SetColumn(titlePanel, 0); + headerGrid.Children.Add(titlePanel); + + // Accept / Reject 버튼 + var btnPanel = new StackPanel { Orientation = Orientation.Horizontal }; + var acceptBtn = CreateButton("적용", Color.FromRgb(0x10, 0x7C, 0x10), Colors.White); + acceptBtn.Click += (_, _) => Accepted?.Invoke(this, EventArgs.Empty); + btnPanel.Children.Add(acceptBtn); + + var rejectBtn = CreateButton("취소", Colors.Transparent, Color.FromRgb(0xC5, 0x0F, 0x1F)); + rejectBtn.Click += (_, _) => Rejected?.Invoke(this, EventArgs.Empty); + btnPanel.Children.Add(rejectBtn); + + Grid.SetColumn(btnPanel, 1); + headerGrid.Children.Add(btnPanel); + + header.Child = headerGrid; + mainStack.Children.Add(header); + + // Diff 내용 + var scrollViewer = new ScrollViewer + { + MaxHeight = 300, + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, + }; + + var diffStack = new StackPanel { Margin = new Thickness(0) }; + + foreach (var line in _diffLines) + { + var (bg, fg, prefix) = line.Type switch + { + DiffService.DiffType.Added => ( + Color.FromRgb(0xE6, 0xFF, 0xED), + Color.FromRgb(0x16, 0x6C, 0x34), + "+"), + DiffService.DiffType.Removed => ( + Color.FromRgb(0xFF, 0xEB, 0xE9), + Color.FromRgb(0xCF, 0x22, 0x2E), + "-"), + _ => ( + Color.FromRgb(0xFF, 0xFF, 0xFF), + Color.FromRgb(0x66, 0x66, 0x88), + " ") + }; + + var lineNo = line.OldLineNo?.ToString() ?? ""; + var newLineNo = line.NewLineNo?.ToString() ?? ""; + + var linePanel = new Border + { + Background = new SolidColorBrush(bg), + Padding = new Thickness(8, 1, 8, 1), + }; + + var lineGrid = new Grid(); + lineGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(36) }); // old line + lineGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(36) }); // new line + lineGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(16) }); // prefix + lineGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); // content + + var oldLineText = new TextBlock + { + Text = lineNo, FontSize = 10, FontFamily = new FontFamily("Consolas"), + Foreground = new SolidColorBrush(Color.FromRgb(0xAA, 0xAA, 0xCC)), + HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 0, 4, 0), + }; + Grid.SetColumn(oldLineText, 0); + lineGrid.Children.Add(oldLineText); + + var newLineText = new TextBlock + { + Text = newLineNo, FontSize = 10, FontFamily = new FontFamily("Consolas"), + Foreground = new SolidColorBrush(Color.FromRgb(0xAA, 0xAA, 0xCC)), + HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 0, 4, 0), + }; + Grid.SetColumn(newLineText, 1); + lineGrid.Children.Add(newLineText); + + var prefixText = new TextBlock + { + Text = prefix, FontSize = 11, FontFamily = new FontFamily("Consolas"), + Foreground = new SolidColorBrush(fg), FontWeight = FontWeights.Bold, + }; + Grid.SetColumn(prefixText, 2); + lineGrid.Children.Add(prefixText); + + var contentText = new TextBlock + { + Text = line.Content, FontSize = 11, FontFamily = new FontFamily("Consolas"), + Foreground = new SolidColorBrush(fg), + TextWrapping = TextWrapping.NoWrap, + }; + Grid.SetColumn(contentText, 3); + lineGrid.Children.Add(contentText); + + linePanel.Child = lineGrid; + diffStack.Children.Add(linePanel); + } + + scrollViewer.Content = diffStack; + mainStack.Children.Add(scrollViewer); + + return mainStack; + } + + private static Button CreateButton(string text, Color bg, Color fg) + { + var btn = new Button { Cursor = System.Windows.Input.Cursors.Hand, Margin = new Thickness(4, 0, 0, 0) }; + var template = new ControlTemplate(typeof(Button)); + var bdFactory = new FrameworkElementFactory(typeof(Border)); + bdFactory.SetValue(Border.BackgroundProperty, new SolidColorBrush(bg)); + bdFactory.SetValue(Border.CornerRadiusProperty, new CornerRadius(6)); + bdFactory.SetValue(Border.PaddingProperty, new Thickness(12, 5, 12, 5)); + if (bg == Colors.Transparent) + { + bdFactory.SetValue(Border.BorderBrushProperty, new SolidColorBrush(fg)); + bdFactory.SetValue(Border.BorderThicknessProperty, new Thickness(1)); + } + var cpFactory = new FrameworkElementFactory(typeof(ContentPresenter)); + cpFactory.SetValue(ContentPresenter.HorizontalAlignmentProperty, HorizontalAlignment.Center); + bdFactory.AppendChild(cpFactory); + template.VisualTree = bdFactory; + btn.Template = template; + btn.Content = new TextBlock { Text = text, FontSize = 11, Foreground = new SolidColorBrush(fg), FontWeight = FontWeights.SemiBold }; + return btn; + } +} diff --git a/src/AxCopilot/Views/DockBarWindow.xaml b/src/AxCopilot/Views/DockBarWindow.xaml new file mode 100644 index 0000000..0a0ea63 --- /dev/null +++ b/src/AxCopilot/Views/DockBarWindow.xaml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + 0.45 + + + + + + + + + + diff --git a/src/AxCopilot/Views/DockBarWindow.xaml.cs b/src/AxCopilot/Views/DockBarWindow.xaml.cs new file mode 100644 index 0000000..3d81b9f --- /dev/null +++ b/src/AxCopilot/Views/DockBarWindow.xaml.cs @@ -0,0 +1,327 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Threading; +using AxCopilot.Services; + +namespace AxCopilot.Views; + +/// +/// 화면 하단에 고정되는 미니 독 바. +/// 설정(DockBarItems)에 따라 표시 항목이 결정됩니다. +/// 가능한 항목: launcher, clipboard, capture, agent, clock, cpu, ram, quickinput +/// +public partial class DockBarWindow : Window +{ + private DispatcherTimer? _timer; + private PerformanceCounter? _cpuCounter; + private TextBlock? _cpuText; + private TextBlock? _ramText; + private TextBlock? _clockText; + private TextBox? _quickInput; + + /// 런처에 검색어를 전달하는 콜백. + public Action? OnQuickSearch { get; set; } + + /// 캡처 직접 실행 콜백. + public Action? OnCapture { get; set; } + + /// AX Agent 대화창 열기 콜백. + public Action? OnOpenAgent { get; set; } + + // 표시 가능한 모든 아이템 정의 + private static readonly (string Key, string Icon, string Tooltip)[] AllItems = + { + ("launcher", "\uE721", "AX Commander"), + ("clipboard", "\uE77F", "클립보드 히스토리"), + ("capture", "\uE722", "화면 캡처"), + ("agent", "\uE8BD", "AX Agent"), + ("clock", "\uE823", "시계"), + ("cpu", "\uE950", "CPU"), + ("ram", "\uE7F4", "RAM"), + ("quickinput", "\uE8D3", "빠른 입력"), + }; + + private DispatcherTimer? _glowTimer; + + /// 설정 저장 콜백 (위치 저장용). + public Action? OnPositionChanged { get; set; } + + public DockBarWindow() + { + InitializeComponent(); + + MouseLeftButtonDown += (_, e) => { if (e.LeftButton == MouseButtonState.Pressed) try { DragMove(); } catch (Exception) { } }; + LocationChanged += (_, _) => OnPositionChanged?.Invoke(Left, Top); + Loaded += (_, _) => PositionDock(); + Closed += (_, _) => { _timer?.Stop(); _glowTimer?.Stop(); _cpuCounter?.Dispose(); }; + } + + /// 투명도, 위치, 글로우를 설정에서 적용합니다. + public void ApplySettings(double opacity, double left, double top, bool rainbowGlow) + { + Opacity = Math.Clamp(opacity, 0.3, 1.0); + + if (left >= 0 && top >= 0) + { + Left = left; + Top = top; + } + else + { + // -1이면 중앙으로 이동 + Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Loaded, PositionDock); + } + + if (rainbowGlow) + StartRainbowGlow(); + else + StopRainbowGlow(); + } + + private void StartRainbowGlow() + { + RainbowGlowBorder.Visibility = Visibility.Visible; + _glowTimer ??= new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(50) }; + var startAngle = 0.0; + _glowTimer.Tick += (_, _) => + { + startAngle += 2; + if (startAngle >= 360) startAngle -= 360; + var rad = startAngle * Math.PI / 180.0; + RainbowBrush.StartPoint = new Point(0.5 + 0.5 * Math.Cos(rad), 0.5 + 0.5 * Math.Sin(rad)); + RainbowBrush.EndPoint = new Point(0.5 - 0.5 * Math.Cos(rad), 0.5 - 0.5 * Math.Sin(rad)); + }; + _glowTimer.Start(); + } + + private void StopRainbowGlow() + { + _glowTimer?.Stop(); + RainbowGlowBorder.Visibility = Visibility.Collapsed; + } + + // 기획된 고정 표시 순서 + private static readonly string[] FixedOrder = + { "launcher", "clipboard", "capture", "agent", "clock", "cpu", "ram", "quickinput" }; + + /// 설정에서 표시 항목 목록을 받아 독 바를 빌드합니다. 표시 순서는 기획 순서 고정. + public void BuildFromSettings(List itemKeys) + { + DockContent.Children.Clear(); + _cpuText = null; _ramText = null; _clockText = null; _quickInput = null; + + var primaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.CornflowerBlue; + bool needTimer = false; + bool addedFirst = false; + + // 기획 순서에서 활성화된 항목만 순서대로 표시 + var enabledSet = new HashSet(itemKeys, StringComparer.OrdinalIgnoreCase); + foreach (var key in FixedOrder.Where(k => enabledSet.Contains(k))) + { + if (addedFirst) AddSeparator(); + addedFirst = true; + + switch (key) + { + case "launcher": + AddButton("\uE721", "AX Commander", primaryText, () => OnQuickSearch?.Invoke("")); + break; + case "clipboard": + AddButton("\uE77F", "클립보드", primaryText, () => OnQuickSearch?.Invoke("#")); + break; + case "capture": + AddButton("\uE722", "캡처", primaryText, () => + { + if (OnCapture != null) OnCapture(); + else OnQuickSearch?.Invoke("cap"); + }); + break; + case "agent": + AddButton("\uE8BD", "AI", primaryText, () => + { + if (OnOpenAgent != null) OnOpenAgent(); + else OnQuickSearch?.Invoke("!"); + }); + break; + case "clock": + _clockText = new TextBlock + { + Text = DateTime.Now.ToString("HH:mm"), + FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(6, 0, 6, 0), + }; + DockContent.Children.Add(_clockText); + needTimer = true; + break; + case "cpu": + var cpuPanel = new StackPanel { Orientation = Orientation.Horizontal, VerticalAlignment = VerticalAlignment.Center }; + cpuPanel.Children.Add(new TextBlock + { + Text = "\uE950", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 11, Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 3, 0) + }); + _cpuText = new TextBlock { Text = "0%", FontSize = 11, Foreground = secondaryText, VerticalAlignment = VerticalAlignment.Center, Width = 28, TextAlignment = TextAlignment.Right }; + cpuPanel.Children.Add(_cpuText); + DockContent.Children.Add(cpuPanel); + needTimer = true; + if (_cpuCounter == null) + try { _cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); _cpuCounter.NextValue(); } catch (Exception) { } + break; + case "ram": + var ramPanel = new StackPanel { Orientation = Orientation.Horizontal, VerticalAlignment = VerticalAlignment.Center }; + ramPanel.Children.Add(new TextBlock + { + Text = "\uE7F4", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 11, Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 3, 0) + }); + _ramText = new TextBlock { Text = "0%", FontSize = 11, Foreground = secondaryText, VerticalAlignment = VerticalAlignment.Center, Width = 28, TextAlignment = TextAlignment.Right }; + ramPanel.Children.Add(_ramText); + DockContent.Children.Add(ramPanel); + needTimer = true; + break; + case "quickinput": + var inputBorder = new Border + { + Background = TryFindResource("ItemBackground") as Brush ?? Brushes.Transparent, + CornerRadius = new CornerRadius(8), Padding = new Thickness(8, 3, 8, 3), + VerticalAlignment = VerticalAlignment.Center, + }; + var inputPanel = new StackPanel { Orientation = Orientation.Horizontal }; + inputPanel.Children.Add(new TextBlock + { + Text = "\uE721", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 11, Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 5, 0) + }); + _quickInput = new TextBox + { + Width = 100, FontSize = 11, + Foreground = primaryText, + CaretBrush = accentBrush, + Background = Brushes.Transparent, BorderThickness = new Thickness(0), + VerticalAlignment = VerticalAlignment.Center, + }; + _quickInput.KeyDown += QuickInput_KeyDown; + inputPanel.Children.Add(_quickInput); + inputBorder.Child = inputPanel; + DockContent.Children.Add(inputBorder); + break; + } + } + + if (needTimer) + { + _timer ??= new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; + _timer.Tick -= OnTick; + _timer.Tick += OnTick; + _timer.Start(); + OnTick(null, EventArgs.Empty); + } + } + + /// 사용 가능한 모든 아이템 키와 라벨 목록을 반환합니다. + public static IReadOnlyList<(string Key, string Icon, string Tooltip)> AvailableItems => AllItems; + + private void AddButton(string icon, string tooltip, Brush foreground, Action click) + { + var border = new Border + { + Width = 30, Height = 30, + CornerRadius = new CornerRadius(8), + Background = new SolidColorBrush(Color.FromArgb(0x01, 0xFF, 0xFF, 0xFF)), // 거의 투명하지만 히트 테스트 가능 + Cursor = Cursors.Hand, + ToolTip = tooltip, + Margin = new Thickness(2, 0, 2, 0), + }; + border.Child = new TextBlock + { + Text = icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, Foreground = foreground, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + IsHitTestVisible = false, // 텍스트가 이벤트를 가로채지 않도록 + }; + border.MouseEnter += (s, _) => { if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x22, 0xFF, 0xFF, 0xFF)); }; + border.MouseLeave += (s, _) => { if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x01, 0xFF, 0xFF, 0xFF)); }; + border.MouseLeftButtonDown += (_, e) => { e.Handled = true; click(); }; + DockContent.Children.Add(border); + } + + private void AddSeparator() + { + DockContent.Children.Add(new Border + { + Width = 1, Height = 20, Margin = new Thickness(6, 0, 6, 0), + Background = TryFindResource("SeparatorColor") as Brush ?? Brushes.Gray, + }); + } + + private void PositionDock() + { + var screen = SystemParameters.WorkArea; + Left = (screen.Width - ActualWidth) / 2 + screen.Left; + Top = screen.Bottom - ActualHeight - 8; + } + + private void OnTick(object? sender, EventArgs e) + { + if (_clockText != null) + _clockText.Text = DateTime.Now.ToString("HH:mm"); + + if (_cpuText != null) + { + try { _cpuText.Text = $"{_cpuCounter?.NextValue() ?? 0:F0}%"; } + catch (Exception) { _cpuText.Text = "-"; } + } + + if (_ramText != null) + { + try + { + var m = new MEMORYSTATUSEX { dwLength = (uint)Marshal.SizeOf() }; + _ramText.Text = GlobalMemoryStatusEx(ref m) ? $"{m.dwMemoryLoad}%" : "-"; + } + catch (Exception) { _ramText.Text = "-"; } + } + } + + [DllImport("kernel32.dll")] private static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); + + [StructLayout(LayoutKind.Sequential)] + private struct MEMORYSTATUSEX + { + public uint dwLength; public uint dwMemoryLoad; + public ulong ullTotalPhys, ullAvailPhys, ullTotalPageFile, ullAvailPageFile, ullTotalVirtual, ullAvailVirtual, ullAvailExtendedVirtual; + } + + private void QuickInput_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Enter && _quickInput != null && !string.IsNullOrWhiteSpace(_quickInput.Text)) + { + OnQuickSearch?.Invoke(_quickInput.Text); + _quickInput.Text = ""; + e.Handled = true; + } + else if (e.Key == Key.Escape && _quickInput != null) + { + _quickInput.Text = ""; + e.Handled = true; + } + } + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Escape) Hide(); + } +} diff --git a/src/AxCopilot/Views/EyeDropperWindow.xaml b/src/AxCopilot/Views/EyeDropperWindow.xaml new file mode 100644 index 0000000..7efc81d --- /dev/null +++ b/src/AxCopilot/Views/EyeDropperWindow.xaml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/EyeDropperWindow.xaml.cs b/src/AxCopilot/Views/EyeDropperWindow.xaml.cs new file mode 100644 index 0000000..5f56094 --- /dev/null +++ b/src/AxCopilot/Views/EyeDropperWindow.xaml.cs @@ -0,0 +1,135 @@ +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; + +namespace AxCopilot.Views; + +/// +/// 전체 화면 스포이드 모드. 마우스를 따라다니는 돋보기와 HEX 코드를 표시하고, +/// 클릭 시 해당 픽셀 색상을 캡처하여 ColorPickResultWindow를 표시합니다. +/// +public partial class EyeDropperWindow : Window +{ + [DllImport("user32.dll")] + private static extern bool GetCursorPos(out POINT lpPoint); + + [DllImport("gdi32.dll")] + private static extern uint GetPixel(IntPtr hdc, int x, int y); + + [DllImport("user32.dll")] + private static extern IntPtr GetDC(IntPtr hWnd); + + [DllImport("user32.dll")] + private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); + + [StructLayout(LayoutKind.Sequential)] + private struct POINT { public int X, Y; } + + /// 클릭으로 선택된 색상. null이면 취소. + public System.Drawing.Color? PickedColor { get; private set; } + public double PickX { get; private set; } + public double PickY { get; private set; } + + private readonly System.Drawing.Rectangle _screenBounds; + + public EyeDropperWindow() + { + InitializeComponent(); + + // 전체 모니터 영역 + _screenBounds = GetAllScreenBounds(); + Left = _screenBounds.X; + Top = _screenBounds.Y; + Width = _screenBounds.Width; + Height = _screenBounds.Height; + + Loaded += (_, _) => + { + Magnifier.Visibility = Visibility.Visible; + HexLabel.Visibility = Visibility.Visible; + }; + } + + private void Window_MouseMove(object sender, MouseEventArgs e) + { + var pos = e.GetPosition(RootCanvas); + var color = GetScreenPixelColor(); + + // 돋보기 위치 (커서 오른쪽 위) + Canvas.SetLeft(Magnifier, pos.X + 16); + Canvas.SetTop(Magnifier, pos.Y - 100); + + // HEX 레이블 위치 + Canvas.SetLeft(HexLabel, pos.X + 16); + Canvas.SetTop(HexLabel, pos.Y - 10); + + // 돋보기 색상 미리보기 + var wpfColor = System.Windows.Media.Color.FromRgb(color.R, color.G, color.B); + MagPreview.Fill = new SolidColorBrush(wpfColor); + HexLabelText.Text = $"#{color.R:X2}{color.G:X2}{color.B:X2}"; + } + + private void Window_MouseDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left) + { + PickedColor = GetScreenPixelColor(); + GetCursorPos(out var pt); + PickX = pt.X; + PickY = pt.Y; + Close(); + } + else if (e.ChangedButton == MouseButton.Right) + { + PickedColor = null; + Close(); + } + } + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Escape) + { + PickedColor = null; + Close(); + } + } + + private static System.Drawing.Color GetScreenPixelColor() + { + GetCursorPos(out var pt); + var hdc = GetDC(IntPtr.Zero); + try + { + uint pixel = GetPixel(hdc, pt.X, pt.Y); + int r = (int)(pixel & 0xFF); + int g = (int)((pixel >> 8) & 0xFF); + int b = (int)((pixel >> 16) & 0xFF); + return System.Drawing.Color.FromArgb(r, g, b); + } + finally + { + ReleaseDC(IntPtr.Zero, hdc); + } + } + + private static System.Drawing.Rectangle GetAllScreenBounds() + { + int left = 0, top = 0, right = 0, bottom = 0; + foreach (var screen in System.Windows.Forms.Screen.AllScreens) + { + var b = screen.Bounds; + left = Math.Min(left, b.Left); + top = Math.Min(top, b.Top); + right = Math.Max(right, b.Right); + bottom = Math.Max(bottom, b.Bottom); + } + return new System.Drawing.Rectangle(left, top, right - left, bottom - top); + } +} diff --git a/src/AxCopilot/Views/GuideViewerWindow.xaml b/src/AxCopilot/Views/GuideViewerWindow.xaml new file mode 100644 index 0000000..007509a --- /dev/null +++ b/src/AxCopilot/Views/GuideViewerWindow.xaml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/GuideViewerWindow.xaml.cs b/src/AxCopilot/Views/GuideViewerWindow.xaml.cs new file mode 100644 index 0000000..25e8e07 --- /dev/null +++ b/src/AxCopilot/Views/GuideViewerWindow.xaml.cs @@ -0,0 +1,166 @@ +using System; +using System.IO; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using Microsoft.Web.WebView2.Core; + +namespace AxCopilot.Views; + +public partial class GuideViewerWindow : Window +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + private string? _pendingHtml; + private Uri? _pendingUri; + + public GuideViewerWindow() + { + InitializeComponent(); + Loaded += OnLoaded; + KeyDown += (_, e) => { if (e.Key == Key.Escape) Close(); }; + StateChanged += (_, _) => + { + MaxBtnIcon.Text = WindowState == WindowState.Maximized ? "\uE923" : "\uE922"; + }; + } + + private async void OnLoaded(object sender, RoutedEventArgs e) + { + var devMode = CurrentApp?.SettingsService?.Settings?.Llm?.DevMode ?? false; + PrepareGuide(devMode); + + try + { + // WebView2 초기화 + var env = await CoreWebView2Environment.CreateAsync( + userDataFolder: Path.Combine(Path.GetTempPath(), "AxCopilot_GuideViewer")); + await GuideBrowser.EnsureCoreWebView2Async(env); + + // 초기화 완료 후 대기 중인 콘텐츠 로드 + if (_pendingHtml != null) + GuideBrowser.NavigateToString(_pendingHtml); + else if (_pendingUri != null) + GuideBrowser.Source = _pendingUri; + } + catch (Exception ex) + { + // WebView2 런타임 미설치 시 오류 메시지 표시 + System.Diagnostics.Debug.WriteLine($"WebView2 init error: {ex.Message}"); + } + } + + /// 개발자 모드 여부에 따라 적절한 가이드를 준비합니다. + public void PrepareGuide(bool devMode) + { + TitleText.Text = devMode ? "AX Copilot 개발자 가이드" : "AX Copilot 사용 가이드"; + Title = devMode ? "AX Copilot — 개발자 가이드" : "AX Copilot — 사용 가이드"; + + try + { + var exeDir = Path.GetDirectoryName(Environment.ProcessPath) + ?? AppContext.BaseDirectory; + var assetsDir = Path.Combine(exeDir, "Assets"); + + // 1차: 암호화된 가이드 파일 (.enc) 시도 + var encFile = devMode + ? Path.Combine(assetsDir, "guide_dev.enc") + : Path.Combine(assetsDir, "guide_user.enc"); + + if (File.Exists(encFile)) + { + _pendingHtml = Services.GuideEncryptor.DecryptToString(encFile); + return; + } + + // 2차: 평문 가이드 파일 (.htm) 폴백 (개발 환경) + var htmFile = devMode + ? Path.Combine(assetsDir, "AX Copilot 개발자가이드.htm") + : Path.Combine(assetsDir, "AX Copilot 사용가이드.htm"); + + if (File.Exists(htmFile)) + { + _pendingUri = new Uri(htmFile); + return; + } + + _pendingHtml = "" + + "

      가이드를 찾을 수 없습니다

      " + + $"

      경로: {encFile}

      "; + } + catch (Exception ex) + { + _pendingHtml = "" + + $"

      가이드 로드 오류

      {ex.Message}

      "; + } + } + + /// 외부에서 직접 가이드를 로드합니다 (WebView2 초기화 후 호출). + public void LoadGuide(bool devMode) + { + PrepareGuide(devMode); + if (GuideBrowser.CoreWebView2 != null) + { + if (_pendingHtml != null) + GuideBrowser.NavigateToString(_pendingHtml); + else if (_pendingUri != null) + GuideBrowser.Source = _pendingUri; + } + } + + // ─── 타이틀 바 ─────────────────────────────────────────────── + private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (e.ClickCount == 2) + { + ToggleMaximize(); + return; + } + DragMove(); + } + + private void MinBtn_Click(object sender, MouseButtonEventArgs e) + { + e.Handled = true; + WindowState = WindowState.Minimized; + } + + private void MaxBtn_Click(object sender, MouseButtonEventArgs e) + { + e.Handled = true; + ToggleMaximize(); + } + + private void CloseBtn_Click(object sender, MouseButtonEventArgs e) + { + e.Handled = true; + Close(); + } + + private void ToggleMaximize() + { + WindowState = WindowState == WindowState.Maximized + ? WindowState.Normal + : WindowState.Maximized; + } + + private void TitleBtn_Enter(object sender, MouseEventArgs e) + { + if (sender is Border b) + b.Background = TryFindResource("ItemHoverBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + } + + private void CloseBtnEnter(object sender, MouseEventArgs e) + { + if (sender is Border b) + b.Background = new SolidColorBrush(Color.FromArgb(0x44, 0xFF, 0x40, 0x40)); + } + + private void TitleBtn_Leave(object sender, MouseEventArgs e) + { + if (sender is Border b) + b.Background = Brushes.Transparent; + } +} diff --git a/src/AxCopilot/Views/HelpDetailWindow.xaml b/src/AxCopilot/Views/HelpDetailWindow.xaml new file mode 100644 index 0000000..7a7ff12 --- /dev/null +++ b/src/AxCopilot/Views/HelpDetailWindow.xaml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/LargeTypeWindow.xaml.cs b/src/AxCopilot/Views/LargeTypeWindow.xaml.cs new file mode 100644 index 0000000..ac8daab --- /dev/null +++ b/src/AxCopilot/Views/LargeTypeWindow.xaml.cs @@ -0,0 +1,48 @@ +using System.Windows; +using System.Windows.Input; + +namespace AxCopilot.Views; + +public partial class LargeTypeWindow : Window +{ + private readonly string _text; + + public LargeTypeWindow(string text) + { + _text = text; + InitializeComponent(); + } + + private void Window_Loaded(object sender, RoutedEventArgs e) + { + LargeText.Text = _text; + + // 텍스트 길이에 따라 기본 폰트 크기 결정 + // (Viewbox가 최종 크기를 조정하지만, 줄바꿈 결정을 위해 명시적 크기 필요) + LargeText.FontSize = _text.Length switch + { + <= 10 => 120, + <= 30 => 96, + <= 60 => 72, + <= 120 => 52, + _ => 38, + }; + + Focus(); + } + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Escape) Close(); + } + + private void Window_MouseDown(object sender, MouseButtonEventArgs e) + { + Close(); + } + + private void Close_Click(object sender, RoutedEventArgs e) + { + Close(); + } +} diff --git a/src/AxCopilot/Views/LauncherWindow.xaml b/src/AxCopilot/Views/LauncherWindow.xaml new file mode 100644 index 0000000..74f62ab --- /dev/null +++ b/src/AxCopilot/Views/LauncherWindow.xaml @@ -0,0 +1,740 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.5,0.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/LauncherWindow.xaml.cs b/src/AxCopilot/Views/LauncherWindow.xaml.cs new file mode 100644 index 0000000..6b8b9ea --- /dev/null +++ b/src/AxCopilot/Views/LauncherWindow.xaml.cs @@ -0,0 +1,1563 @@ +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Input; +using System.Windows.Interop; +using System.Windows.Media; +using System.Windows.Media.Animation; +using Microsoft.Win32; +using AxCopilot.Models; +using AxCopilot.ViewModels; + +namespace AxCopilot.Views; + +public partial class LauncherWindow : Window +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + [DllImport("user32.dll")] + private static extern bool SetForegroundWindow(IntPtr hWnd); + + [DllImport("user32.dll")] + private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + + [DllImport("user32.dll")] + private static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll")] + private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId); + + [DllImport("user32.dll")] + private static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach); + + [DllImport("kernel32.dll")] + private static extern uint GetCurrentThreadId(); + + private readonly LauncherViewModel _vm; + private System.Windows.Threading.DispatcherTimer? _indexStatusTimer; + + /// Ctrl+, 단축키로 설정 창을 여는 콜백 (App.xaml.cs에서 주입) + public Action? OpenSettingsAction { get; set; } + + public LauncherWindow(LauncherViewModel vm) + { + _vm = vm; + // 테마를 InitializeComponent 전에 적용 → 첫 렌더링부터 올바른 테마 표시 (깜빡임 방지) + ApplyTheme(); + InitializeComponent(); + DataContext = vm; + + vm.CloseRequested += (_, _) => Hide(); + vm.NotificationRequested += (_, msg) => ShowNotification(msg); + + // InputText가 코드에서 변경될 때 커서를 끝으로 이동 + // (F1→"help", Ctrl+B→"fav", Ctrl+D→"cd Downloads" 등 자동 입력 후 위화감 해소) + vm.PropertyChanged += (_, e) => + { + if (e.PropertyName == nameof(LauncherViewModel.InputText)) + { + // DispatcherPriority.Input: 바인딩 업데이트가 완료된 직후 실행 + Dispatcher.InvokeAsync( + () => { if (InputBox != null) InputBox.CaretIndex = InputBox.Text.Length; }, + System.Windows.Threading.DispatcherPriority.Input); + } + }; + + // 인덱싱 완료 시 상태 표시 + var app = (App)System.Windows.Application.Current; + if (app.IndexService != null) + { + app.IndexService.IndexRebuilt += (_, _) => + { + Dispatcher.BeginInvoke(() => + { + var svc = app.IndexService; + IndexStatusText.Text = $"✓ {svc.LastIndexCount:N0}개 항목 색인됨 ({svc.LastIndexDuration.TotalSeconds:F1}초)"; + IndexStatusText.Visibility = Visibility.Visible; + // 기존 타이머 정리 후 5초 후 자동 숨기기 + _indexStatusTimer?.Stop(); + _indexStatusTimer = new System.Windows.Threading.DispatcherTimer + { + Interval = TimeSpan.FromSeconds(5) + }; + _indexStatusTimer.Tick += (_, _) => { IndexStatusText.Visibility = Visibility.Collapsed; _indexStatusTimer.Stop(); }; + _indexStatusTimer.Start(); + }); + }; + } + } + + private void Window_Loaded(object sender, RoutedEventArgs e) + { + CenterOnScreen(); + ApplyTheme(); + Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input, () => + { + Activate(); + ForceForeground(); + InputBox.Focus(); + Keyboard.Focus(InputBox); + }); + } + + private static readonly Random _iconRng = new(); + private System.Windows.Media.Animation.Storyboard? _iconStoryboard; + private System.Windows.Threading.DispatcherTimer? _rainbowTimer; + + /// 외부에서 입력 텍스트를 설정합니다 (AI 명령 전달용). + public void SetInputText(string text) + { + if (InputBox == null) return; + InputBox.Text = text; + InputBox.CaretIndex = text.Length; + // 자동 실행 + _vm.InputText = text; + } + + /// + /// 포그라운드 창 전환 제한을 우회하여 확실히 포커스를 가져옵니다. + /// Windows는 현재 포그라운드 스레드가 아닌 스레드에서 SetForegroundWindow를 차단하므로, + /// AttachThreadInput으로 일시적으로 스레드를 연결합니다. + /// + private void ForceForeground() + { + try + { + var hwnd = new WindowInteropHelper(this).Handle; + if (hwnd == IntPtr.Zero) return; + + var foreHwnd = GetForegroundWindow(); + if (foreHwnd == hwnd) return; // 이미 포그라운드 + + uint foreThread = GetWindowThreadProcessId(foreHwnd, out _); + uint thisThread = GetCurrentThreadId(); + + if (foreThread != thisThread) + { + AttachThreadInput(thisThread, foreThread, true); + SetForegroundWindow(hwnd); + AttachThreadInput(thisThread, foreThread, false); + } + else + { + SetForegroundWindow(hwnd); + } + } + catch (Exception) { /* 포커스 강제 실패 시 기본 WPF Activate에 의존 */ } + } + + public new void Show() + { + _vm.RefreshPlaceholder(); + _vm.OnShown(); + _vm.InputText = ""; + base.Show(); + CenterOnScreen(); + AnimateIn(); + + // 포그라운드 강제 + 포커스를 3단계로 보장 + // 1단계: 즉시 활성화 + Activate(); + ForceForeground(); + + // 2단계: 레이아웃 완료 후 포커스 + Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Input, () => + { + Activate(); + InputBox.Focus(); + Keyboard.Focus(InputBox); + InputBox.SelectAll(); + }); + + // 3단계: 렌더링 완료 후 최종 포커스 보장 (애니메이션 끝난 뒤) + Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Loaded, () => + { + if (!InputBox.IsKeyboardFocused) + { + ForceForeground(); + InputBox.Focus(); + Keyboard.Focus(InputBox); + } + }); + + // 런처 테두리 표시 설정 + if (_vm.ShowLauncherBorder) + { + MainBorder.BorderThickness = new Thickness(1); + MainBorder.BorderBrush = (System.Windows.Media.Brush)FindResource("BorderColor"); + } + else + { + MainBorder.BorderThickness = new Thickness(0); + MainBorder.BorderBrush = System.Windows.Media.Brushes.Transparent; + } + + if (_vm.EnableIconAnimation) + ApplyRandomIconAnimation(); + else + ResetIconAnimation(); + + if (_vm.EnableRainbowGlow) + StartRainbowGlow(); + else + StopRainbowGlow(); + + UpdateSelectionGlow(); + } + + /// 아이콘 애니메이션을 중지하고 모든 픽셀을 완전 점등 상태로 복원합니다. + private void ResetIconAnimation() + { + _iconStoryboard?.Stop(); + _iconStoryboard = null; + var pixels = new[] { PixelBlue, PixelGreen1, PixelRed, PixelGreen2 }; + foreach (var p in pixels) + { + if (p == null) continue; + p.BeginAnimation(UIElement.OpacityProperty, null); + p.Opacity = 1; + } + if (IconRotate != null) { IconRotate.BeginAnimation(RotateTransform.AngleProperty, null); IconRotate.Angle = 45; } + if (IconScale != null) { IconScale.BeginAnimation(ScaleTransform.ScaleXProperty, null); IconScale.BeginAnimation(ScaleTransform.ScaleYProperty, null); IconScale.ScaleX = 1; IconScale.ScaleY = 1; } + } + + /// 10가지 다이아몬드 픽셀 애니메이션 효과 중 랜덤 1개를 적용합니다. + private void ApplyRandomIconAnimation() + { + _iconStoryboard?.Stop(); + + var pixels = new[] { PixelBlue, PixelGreen1, PixelRed, PixelGreen2 }; + if (pixels.Any(p => p == null) || IconRotate == null || IconScale == null) return; + + // 모든 상태 초기화 + foreach (var p in pixels) { p.BeginAnimation(UIElement.OpacityProperty, null); p.Opacity = 1; } + IconRotate.BeginAnimation(RotateTransform.AngleProperty, null); + IconScale.BeginAnimation(ScaleTransform.ScaleXProperty, null); + IconScale.BeginAnimation(ScaleTransform.ScaleYProperty, null); + IconRotate.Angle = 45; + IconScale.ScaleX = 1; IconScale.ScaleY = 1; + + var sb = new Storyboard { RepeatBehavior = new RepeatBehavior(3) }; + // 0~9: 기존 효과, 9: 정적(애니 없음), 10~14: 추가 효과, 15~19: 역동적 추가 효과 + int effect = _iconRng.Next(20); + + switch (effect) + { + case 0: // 순차 점멸 — 파랑→초록1→빨강→초록2 순서로 깜빡임 + for (int i = 0; i < 4; i++) + AddOpacityPulse(sb, pixels[i], i, 4.0); + break; + + case 1: // 전체 호흡 — 4개 동시에 밝아졌다 어두워짐 + foreach (var p in pixels) + { + var a = new DoubleAnimation(1, 0.35, TimeSpan.FromSeconds(1.5)) { AutoReverse = true }; + Storyboard.SetTarget(a, p); + Storyboard.SetTargetProperty(a, new PropertyPath(UIElement.OpacityProperty)); + sb.Children.Add(a); + } + break; + + case 2: // 대각선 교차 — 좌상+우하 vs 우상+좌하 번갈아 깜빡임 + AddGroupFlash(sb, new[] { pixels[0], pixels[3] }, 0, 3.2); + AddGroupFlash(sb, new[] { pixels[1], pixels[2] }, 1.6, 3.2); + break; + + case 3: // 시계방향 순회 점등 — 한 개씩 순서대로 밝아짐 + { + var order = new[] { pixels[0], pixels[1], pixels[3], pixels[2] }; + for (int i = 0; i < 4; i++) + { + var a = MakeKeyFrameAnim(new (double val, double sec)[] { + (0.15, 0), (0.15, i*0.5), (1, i*0.5+0.25), (1, i*0.5+0.7), (0.15, i*0.5+0.95), (0.15, 2.5) }); + Storyboard.SetTarget(a, order[i]); + Storyboard.SetTargetProperty(a, new PropertyPath(UIElement.OpacityProperty)); + sb.Children.Add(a); + } + break; + } + + case 4: // 💫 천천히 360도 회전 (PPT 회전판 효과) — 다이아몬드 전체가 돌아감 + { + var rot = new DoubleAnimation(45, 405, TimeSpan.FromSeconds(4)) + { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut } }; + Storyboard.SetTarget(rot, DiamondIcon); + Storyboard.SetTargetProperty(rot, new PropertyPath("RenderTransform.Children[0].Angle")); + sb.Children.Add(rot); + break; + } + + case 5: // 💫 펄스 확대/축소 (PPT 강조 효과) — 전체가 커졌다 작아짐 + { + var sx = new DoubleAnimation(1, 1.25, TimeSpan.FromSeconds(0.6)) + { AutoReverse = true, EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseInOut } }; + var sy = new DoubleAnimation(1, 1.25, TimeSpan.FromSeconds(0.6)) + { AutoReverse = true, EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseInOut } }; + Storyboard.SetTarget(sx, DiamondIcon); + Storyboard.SetTarget(sy, DiamondIcon); + Storyboard.SetTargetProperty(sx, new PropertyPath("RenderTransform.Children[1].ScaleX")); + Storyboard.SetTargetProperty(sy, new PropertyPath("RenderTransform.Children[1].ScaleY")); + sb.Children.Add(sx); + sb.Children.Add(sy); + break; + } + + case 6: // 💫 바운스 등장 — 작아졌다가 탄력적으로 커짐 (PPT 바운스) + { + sb.RepeatBehavior = RepeatBehavior.Forever; + var bx = new DoubleAnimationUsingKeyFrames(); + bx.KeyFrames.Add(new LinearDoubleKeyFrame(0.7, KT(0))); + bx.KeyFrames.Add(new EasingDoubleKeyFrame(1.15, KT(0.35), new BounceEase { Bounces = 2, Bounciness = 3 })); + bx.KeyFrames.Add(new LinearDoubleKeyFrame(1.0, KT(0.6))); + bx.KeyFrames.Add(new LinearDoubleKeyFrame(1.0, KT(3.0))); + var by = bx.Clone(); + Storyboard.SetTarget(bx, DiamondIcon); + Storyboard.SetTarget(by, DiamondIcon); + Storyboard.SetTargetProperty(bx, new PropertyPath("RenderTransform.Children[1].ScaleX")); + Storyboard.SetTargetProperty(by, new PropertyPath("RenderTransform.Children[1].ScaleY")); + sb.Children.Add(bx); + sb.Children.Add(by); + break; + } + + case 7: // 💫 진동 흔들림 (PPT 티터) — 좌우로 살짝 흔들림 + { + var shake = new DoubleAnimationUsingKeyFrames(); + shake.KeyFrames.Add(new LinearDoubleKeyFrame(45, KT(0))); + shake.KeyFrames.Add(new LinearDoubleKeyFrame(50, KT(0.08))); + shake.KeyFrames.Add(new LinearDoubleKeyFrame(40, KT(0.16))); + shake.KeyFrames.Add(new LinearDoubleKeyFrame(48, KT(0.24))); + shake.KeyFrames.Add(new LinearDoubleKeyFrame(42, KT(0.32))); + shake.KeyFrames.Add(new LinearDoubleKeyFrame(45, KT(0.4))); + shake.KeyFrames.Add(new LinearDoubleKeyFrame(45, KT(3.5))); + Storyboard.SetTarget(shake, DiamondIcon); + Storyboard.SetTargetProperty(shake, new PropertyPath("RenderTransform.Children[0].Angle")); + sb.Children.Add(shake); + break; + } + + case 8: // 💫 파도 — 좌측에서 우측으로 순차적으로 확대됐다 복귀 + { + for (int i = 0; i < 4; i++) + { + var wave = new DoubleAnimationUsingKeyFrames(); + double d = i * 0.3; + wave.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(0))); + wave.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(d))); + wave.KeyFrames.Add(new EasingDoubleKeyFrame(0.1, KT(d + 0.25), + new QuadraticEase { EasingMode = EasingMode.EaseOut })); + wave.KeyFrames.Add(new EasingDoubleKeyFrame(1, KT(d + 0.55), + new QuadraticEase { EasingMode = EasingMode.EaseIn })); + wave.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(3))); + Storyboard.SetTarget(wave, pixels[i]); + Storyboard.SetTargetProperty(wave, new PropertyPath(UIElement.OpacityProperty)); + sb.Children.Add(wave); + } + break; + } + + case 9: // 정적 — 완전 점등 상태 (쉬는 턴, 애니메이션 없음) + foreach (var p in pixels) p.Opacity = 1; + return; + + case 10: // 💫 역방향 회전 — 반시계 방향으로 천천히 회전 + { + var rot = new DoubleAnimation(45, -315, TimeSpan.FromSeconds(4.5)) + { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseInOut } }; + Storyboard.SetTarget(rot, DiamondIcon); + Storyboard.SetTargetProperty(rot, new PropertyPath("RenderTransform.Children[0].Angle")); + sb.Children.Add(rot); + break; + } + + case 11: // 💫 하트비트 — 짧은 이중 펄스가 규칙적으로 반복 + { + var hb = new DoubleAnimationUsingKeyFrames(); + hb.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(0))); + hb.KeyFrames.Add(new EasingDoubleKeyFrame(1.3, KT(0.1), new QuadraticEase { EasingMode = EasingMode.EaseOut })); + hb.KeyFrames.Add(new EasingDoubleKeyFrame(1.0, KT(0.22), new QuadraticEase { EasingMode = EasingMode.EaseIn })); + hb.KeyFrames.Add(new EasingDoubleKeyFrame(1.2, KT(0.32), new QuadraticEase { EasingMode = EasingMode.EaseOut })); + hb.KeyFrames.Add(new EasingDoubleKeyFrame(1.0, KT(0.44), new QuadraticEase { EasingMode = EasingMode.EaseIn })); + hb.KeyFrames.Add(new LinearDoubleKeyFrame(1.0, KT(2.8))); + var hby = hb.Clone(); + Storyboard.SetTarget(hb, DiamondIcon); + Storyboard.SetTarget(hby, DiamondIcon); + Storyboard.SetTargetProperty(hb, new PropertyPath("RenderTransform.Children[1].ScaleX")); + Storyboard.SetTargetProperty(hby, new PropertyPath("RenderTransform.Children[1].ScaleY")); + sb.Children.Add(hb); + sb.Children.Add(hby); + break; + } + + case 12: // 💫 별빛 반짝임 — 픽셀이 제각각 랜덤하게 반짝 + { + var offsets = new[] { 0.0, 0.5, 1.1, 1.6 }; + for (int i = 0; i < 4; i++) + { + double d = offsets[i]; + var twinkle = new DoubleAnimationUsingKeyFrames(); + twinkle.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(0))); + twinkle.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(d))); + twinkle.KeyFrames.Add(new LinearDoubleKeyFrame(0.05, KT(d + 0.15))); + twinkle.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(d + 0.35))); + twinkle.KeyFrames.Add(new LinearDoubleKeyFrame(0.5, KT(d + 0.5))); + twinkle.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(d + 0.65))); + twinkle.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(3.5))); + Storyboard.SetTarget(twinkle, pixels[i]); + Storyboard.SetTargetProperty(twinkle, new PropertyPath(UIElement.OpacityProperty)); + sb.Children.Add(twinkle); + } + break; + } + + case 13: // 💫 나선 등장 — 작게 시작해 회전하며 확대 + { + var spiralRot = new DoubleAnimation(45 - 180, 45, TimeSpan.FromSeconds(0.9)) + { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } }; + var spiralSx = new DoubleAnimation(0.4, 1, TimeSpan.FromSeconds(0.9)) + { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } }; + var spiralSy = new DoubleAnimation(0.4, 1, TimeSpan.FromSeconds(0.9)) + { EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } }; + // 등장 후 2.5초 대기, 다시 반복 + var hold = new DoubleAnimation(1, 1, TimeSpan.FromSeconds(2.5)) + { BeginTime = TimeSpan.FromSeconds(0.9) }; + Storyboard.SetTarget(spiralRot, DiamondIcon); + Storyboard.SetTarget(spiralSx, DiamondIcon); + Storyboard.SetTarget(spiralSy, DiamondIcon); + Storyboard.SetTarget(hold, DiamondIcon); + Storyboard.SetTargetProperty(spiralRot, new PropertyPath("RenderTransform.Children[0].Angle")); + Storyboard.SetTargetProperty(spiralSx, new PropertyPath("RenderTransform.Children[1].ScaleX")); + Storyboard.SetTargetProperty(spiralSy, new PropertyPath("RenderTransform.Children[1].ScaleY")); + Storyboard.SetTargetProperty(hold, new PropertyPath("RenderTransform.Children[1].ScaleX")); + sb.Children.Add(spiralRot); + sb.Children.Add(spiralSx); + sb.Children.Add(spiralSy); + break; + } + + case 14: // 💫 색상별 소멸·복원 — 픽셀이 하나씩 사라졌다 다시 나타남 + { + for (int i = 0; i < 4; i++) + { + double d = i * 0.6; + var vanish = new DoubleAnimationUsingKeyFrames(); + vanish.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(0))); + vanish.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(d))); + vanish.KeyFrames.Add(new EasingDoubleKeyFrame(0, KT(d + 0.3), + new QuadraticEase { EasingMode = EasingMode.EaseIn })); + vanish.KeyFrames.Add(new EasingDoubleKeyFrame(1, KT(d + 0.6), + new QuadraticEase { EasingMode = EasingMode.EaseOut })); + vanish.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(3.5))); + Storyboard.SetTarget(vanish, pixels[i]); + Storyboard.SetTargetProperty(vanish, new PropertyPath(UIElement.OpacityProperty)); + sb.Children.Add(vanish); + } + break; + } + + case 15: // 💫 스핀+확대 콤보 — 회전하면서 커졌다 작아짐 + { + var rot = new DoubleAnimation(45, 405, TimeSpan.FromSeconds(2)) + { EasingFunction = new BackEase { EasingMode = EasingMode.EaseInOut, Amplitude = 0.3 } }; + var sx = new DoubleAnimationUsingKeyFrames(); + sx.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(0))); + sx.KeyFrames.Add(new EasingDoubleKeyFrame(1.4, KT(1), new QuadraticEase { EasingMode = EasingMode.EaseOut })); + sx.KeyFrames.Add(new EasingDoubleKeyFrame(1, KT(2), new QuadraticEase { EasingMode = EasingMode.EaseIn })); + sx.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(3.5))); + var sy = sx.Clone(); + Storyboard.SetTarget(rot, DiamondIcon); + Storyboard.SetTarget(sx, DiamondIcon); + Storyboard.SetTarget(sy, DiamondIcon); + Storyboard.SetTargetProperty(rot, new PropertyPath("RenderTransform.Children[0].Angle")); + Storyboard.SetTargetProperty(sx, new PropertyPath("RenderTransform.Children[1].ScaleX")); + Storyboard.SetTargetProperty(sy, new PropertyPath("RenderTransform.Children[1].ScaleY")); + sb.Children.Add(rot); + sb.Children.Add(sx); + sb.Children.Add(sy); + break; + } + + case 16: // 💫 탄성 점프 — 위에서 떨어지며 바운스 (각 픽셀 시차) + { + for (int i = 0; i < 4; i++) + { + double d = i * 0.15; + var bounce = new DoubleAnimationUsingKeyFrames(); + bounce.KeyFrames.Add(new LinearDoubleKeyFrame(0, KT(0))); + bounce.KeyFrames.Add(new LinearDoubleKeyFrame(0, KT(d))); + bounce.KeyFrames.Add(new EasingDoubleKeyFrame(1, KT(d + 0.5), + new BounceEase { Bounces = 3, Bounciness = 2.5 })); + bounce.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(3))); + Storyboard.SetTarget(bounce, pixels[i]); + Storyboard.SetTargetProperty(bounce, new PropertyPath(UIElement.OpacityProperty)); + sb.Children.Add(bounce); + } + break; + } + + case 17: // 💫 진자 운동 — 좌우로 부드럽게 흔들리며 감쇠 + { + var pendulum = new DoubleAnimationUsingKeyFrames(); + pendulum.KeyFrames.Add(new LinearDoubleKeyFrame(45, KT(0))); + pendulum.KeyFrames.Add(new EasingDoubleKeyFrame(60, KT(0.3), new SineEase { EasingMode = EasingMode.EaseOut })); + pendulum.KeyFrames.Add(new EasingDoubleKeyFrame(30, KT(0.9), new SineEase { EasingMode = EasingMode.EaseInOut })); + pendulum.KeyFrames.Add(new EasingDoubleKeyFrame(55, KT(1.5), new SineEase { EasingMode = EasingMode.EaseInOut })); + pendulum.KeyFrames.Add(new EasingDoubleKeyFrame(38, KT(2.1), new SineEase { EasingMode = EasingMode.EaseInOut })); + pendulum.KeyFrames.Add(new EasingDoubleKeyFrame(45, KT(2.5), new SineEase { EasingMode = EasingMode.EaseIn })); + pendulum.KeyFrames.Add(new LinearDoubleKeyFrame(45, KT(4))); + Storyboard.SetTarget(pendulum, DiamondIcon); + Storyboard.SetTargetProperty(pendulum, new PropertyPath("RenderTransform.Children[0].Angle")); + sb.Children.Add(pendulum); + break; + } + + case 18: // 💫 폭죽 — 4개 픽셀이 동시에 빠르게 깜빡이다 정지 + { + for (int i = 0; i < 4; i++) + { + var rapid = new DoubleAnimationUsingKeyFrames(); + double offset = i * 0.08; + rapid.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(0))); + for (int j = 0; j < 6; j++) + { + double t = offset + j * 0.12; + rapid.KeyFrames.Add(new LinearDoubleKeyFrame(j % 2 == 0 ? 0.1 : 1, KT(t))); + } + rapid.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(1.2))); + rapid.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(3.5))); + Storyboard.SetTarget(rapid, pixels[i]); + Storyboard.SetTargetProperty(rapid, new PropertyPath(UIElement.OpacityProperty)); + sb.Children.Add(rapid); + } + // 동시에 빠르게 확대→축소 + var pop = new DoubleAnimationUsingKeyFrames(); + pop.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(0))); + pop.KeyFrames.Add(new EasingDoubleKeyFrame(1.5, KT(0.15), new QuadraticEase { EasingMode = EasingMode.EaseOut })); + pop.KeyFrames.Add(new EasingDoubleKeyFrame(0.8, KT(0.4), new ElasticEase { Oscillations = 2, Springiness = 5 })); + pop.KeyFrames.Add(new EasingDoubleKeyFrame(1, KT(0.7), new QuadraticEase { EasingMode = EasingMode.EaseOut })); + pop.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(3.5))); + var popY = pop.Clone(); + Storyboard.SetTarget(pop, DiamondIcon); + Storyboard.SetTarget(popY, DiamondIcon); + Storyboard.SetTargetProperty(pop, new PropertyPath("RenderTransform.Children[1].ScaleX")); + Storyboard.SetTargetProperty(popY, new PropertyPath("RenderTransform.Children[1].ScaleY")); + sb.Children.Add(pop); + sb.Children.Add(popY); + break; + } + + case 19: // 💫 DNA 이중나선 — 대각선 쌍이 교대로 밝아지며 회전 + { + // 대각선 쌍 교차 깜빡 + 느린 회전 + AddGroupFlash(sb, new[] { pixels[0], pixels[3] }, 0, 4); + AddGroupFlash(sb, new[] { pixels[1], pixels[2] }, 0.8, 4); + var dnaRot = new DoubleAnimation(45, 225, TimeSpan.FromSeconds(4)) + { EasingFunction = new SineEase { EasingMode = EasingMode.EaseInOut } }; + Storyboard.SetTarget(dnaRot, DiamondIcon); + Storyboard.SetTargetProperty(dnaRot, new PropertyPath("RenderTransform.Children[0].Angle")); + sb.Children.Add(dnaRot); + break; + } + } + + _iconStoryboard = sb; + sb.Completed += (_, _) => + { + if (_vm.EnableIconAnimation && IsVisible) + ApplyRandomIconAnimation(); + }; + sb.Begin(this, true); + } + + /// 아이콘 클릭 시 다른 랜덤 애니메이션으로 전환. + private void DiamondIcon_Click(object sender, MouseButtonEventArgs e) + { + if (!_vm.EnableIconAnimation) return; + ApplyRandomIconAnimation(); + } + + // ─── 무지개 글로우 상시 애니메이션 ──────────────────────────────────── + + /// 선택 아이템 상시 무지개 글로우 효과를 적용하거나 제거합니다. + private void UpdateSelectionGlow() + { + if (_vm.EnableSelectionGlow) + { + var gs = new System.Windows.Media.GradientStopCollection + { + new System.Windows.Media.GradientStop(System.Windows.Media.Color.FromRgb(0xFF, 0x6B, 0x6B), 0.00), + new System.Windows.Media.GradientStop(System.Windows.Media.Color.FromRgb(0xFE, 0xCA, 0x57), 0.17), + new System.Windows.Media.GradientStop(System.Windows.Media.Color.FromRgb(0x48, 0xDB, 0xFB), 0.33), + new System.Windows.Media.GradientStop(System.Windows.Media.Color.FromRgb(0xFF, 0x9F, 0xF3), 0.50), + new System.Windows.Media.GradientStop(System.Windows.Media.Color.FromRgb(0x54, 0xA0, 0xFF), 0.67), + new System.Windows.Media.GradientStop(System.Windows.Media.Color.FromRgb(0x5F, 0x27, 0xCD), 0.83), + new System.Windows.Media.GradientStop(System.Windows.Media.Color.FromRgb(0xFF, 0x6B, 0x6B), 1.00), + }; + Resources["SelectionGlowBrush"] = new System.Windows.Media.LinearGradientBrush( + gs, + new System.Windows.Point(0, 0), + new System.Windows.Point(1, 1)); + Resources["SelectionGlowVisibility"] = Visibility.Visible; + } + else + { + Resources["SelectionGlowBrush"] = System.Windows.Media.Brushes.Transparent; + Resources["SelectionGlowVisibility"] = Visibility.Collapsed; + } + } + + /// 무지개 글로우를 정지하고 숨깁니다. + private void StopRainbowGlow() + { + _rainbowTimer?.Stop(); + _rainbowTimer = null; + if (RainbowGlowBorder != null) RainbowGlowBorder.Opacity = 0; + } + + /// 런처 테두리 무지개 그라데이션 회전을 시작합니다. + private void StartRainbowGlow() + { + _rainbowTimer?.Stop(); + if (LauncherRainbowBrush == null || RainbowGlowBorder == null) return; + + _rainbowTimer = new System.Windows.Threading.DispatcherTimer + { + Interval = TimeSpan.FromMilliseconds(20) + }; + var startTime = DateTime.UtcNow; + _rainbowTimer.Tick += (_, _) => + { + if (!IsVisible) { _rainbowTimer?.Stop(); return; } + var elapsed = (DateTime.UtcNow - startTime).TotalMilliseconds; + var shift = (elapsed / 2000.0) % 1.0; // 2초에 1바퀴 (느리게) + var angle = shift * Math.PI * 2; + LauncherRainbowBrush.StartPoint = new Point(0.5 + 0.5 * Math.Cos(angle), 0.5 + 0.5 * Math.Sin(angle)); + LauncherRainbowBrush.EndPoint = new Point(0.5 - 0.5 * Math.Cos(angle), 0.5 - 0.5 * Math.Sin(angle)); + }; + _rainbowTimer.Start(); + } + + // ─── 애니메이션 헬퍼 ────────────────────────────────────────────────── + + private static KeyTime KT(double sec) => KeyTime.FromTimeSpan(TimeSpan.FromSeconds(sec)); + + private static void AddOpacityPulse(Storyboard sb, UIElement target, int index, double totalSec) + { + var a = new DoubleAnimationUsingKeyFrames(); + a.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(index))); + a.KeyFrames.Add(new LinearDoubleKeyFrame(0.25, KT(index + 0.5))); + a.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(index + 1))); + a.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(totalSec))); + Storyboard.SetTarget(a, target); + Storyboard.SetTargetProperty(a, new PropertyPath(UIElement.OpacityProperty)); + sb.Children.Add(a); + } + + private static void AddGroupFlash(Storyboard sb, UIElement[] group, double startSec, double totalSec) + { + foreach (var p in group) + { + var a = new DoubleAnimationUsingKeyFrames(); + a.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(0))); + a.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(startSec))); + a.KeyFrames.Add(new LinearDoubleKeyFrame(0.2, KT(startSec + 0.6))); + a.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(startSec + 1.2))); + a.KeyFrames.Add(new LinearDoubleKeyFrame(1, KT(totalSec))); + Storyboard.SetTarget(a, p); + Storyboard.SetTargetProperty(a, new PropertyPath(UIElement.OpacityProperty)); + sb.Children.Add(a); + } + } + + private static DoubleAnimationUsingKeyFrames MakeKeyFrameAnim((double val, double sec)[] frames) + { + var a = new DoubleAnimationUsingKeyFrames(); + foreach (var (val, sec) in frames) + a.KeyFrames.Add(new LinearDoubleKeyFrame(val, KT(sec))); + return a; + } + + private void CenterOnScreen() + { + var screen = SystemParameters.WorkArea; + // ActualHeight/ActualWidth는 첫 Show() 전 레이아웃 패스 이전에 0일 수 있음 → 기본값으로 보호 + var w = ActualWidth > 0 ? ActualWidth : 640; + var h = ActualHeight > 0 ? ActualHeight : 80; + Left = (screen.Width - w) / 2 + screen.Left; + Top = _vm.WindowPosition switch + { + "center" => (screen.Height - h) / 2 + screen.Top, + "bottom" => screen.Height * 0.75 + screen.Top, + _ => screen.Height * 0.2 + screen.Top, // "center-top" (기본) + }; + } + + // 지원 테마 이름 목록 + private static readonly HashSet KnownThemes = + new(StringComparer.OrdinalIgnoreCase) + { "Dark", "Light", "OLED", "Nord", "Monokai", "Catppuccin", "Sepia", "Alfred", "AlfredLight", "Codex" }; + + internal void ApplyTheme() => + ApplyTheme(_vm.ThemeSetting, _vm.CustomThemeColors); + + /// + /// 테마를 즉시 교체합니다. 설정 창 미리보기에서도 호출됩니다. + /// + internal void ApplyTheme(string? themeKey, AxCopilot.Models.CustomThemeColors? customColors) + { + var appDicts = System.Windows.Application.Current.Resources.MergedDictionaries; + // 기존 테마 딕셔너리 제거 (Source 기반 또는 커스텀 빌드) + var existing = appDicts.FirstOrDefault(d => + d.Source?.ToString().Contains("/Themes/") == true || d.Contains("LauncherBackground")); + if (existing != null) + appDicts.Remove(existing); + + var setting = (themeKey ?? "system").ToLowerInvariant(); + + if (setting == "custom" && customColors != null) + { + appDicts.Add(BuildCustomDictionary(customColors)); + UpdateSelectionGlow(); // 커스텀 테마도 AccentColor 적용 + return; + } + + var themeName = GetEffectiveThemeName(setting); + appDicts.Add(new ResourceDictionary + { + Source = new Uri($"pack://application:,,,/Themes/{themeName}.xaml") + }); + UpdateSelectionGlow(); // 테마 변경 시 AccentColor 기반으로 글로우 색 갱신 + } + + private static string GetEffectiveThemeName(string setting) => setting switch + { + "dark" => "Dark", + "light" => "Light", + "oled" => "OLED", + "nord" => "Nord", + "monokai" => "Monokai", + "catppuccin" => "Catppuccin", + "sepia" => "Sepia", + "alfred" => "Alfred", + "alfredlight" => "AlfredLight", + "codex" => "Codex", + _ => IsSystemDarkMode() ? "Dark" : "Light" // "system" 또는 미지원 값 + }; + + private static ResourceDictionary BuildCustomDictionary(CustomThemeColors c) + { + SolidColorBrush Brush(string hex) + { + var color = (Color)ColorConverter.ConvertFromString(hex); + return new SolidColorBrush(color); + } + + return new ResourceDictionary + { + { "LauncherBackground", Brush(c.LauncherBackground) }, + { "ItemBackground", Brush(c.ItemBackground) }, + { "ItemSelectedBackground", Brush(c.ItemSelectedBackground) }, + { "ItemSelectedHoverBackground", LightenBrush(Brush(c.ItemSelectedBackground), 0.15) }, + { "ItemHoverBackground", Brush(c.ItemHoverBackground) }, + { "PrimaryText", Brush(c.PrimaryText) }, + { "SecondaryText", Brush(c.SecondaryText) }, + { "PlaceholderText", Brush(c.PlaceholderText) }, + { "AccentColor", Brush(c.AccentColor) }, + { "SeparatorColor", Brush(c.SeparatorColor) }, + { "HintBackground", Brush(c.HintBackground) }, + { "HintText", Brush(c.HintText) }, + { "BorderColor", Brush(c.BorderColor) }, + { "ScrollbarThumb", Brush(c.ScrollbarThumb) }, + { "ShadowColor", (Color)ColorConverter.ConvertFromString(c.ShadowColor) }, + // 커스텀 테마: 사용자가 설정한 라운딩 적용 + { "WindowCornerRadius", new CornerRadius(Math.Clamp(c.WindowCornerRadius, 0, 30)) }, + { "ItemCornerRadius", new CornerRadius(Math.Clamp(c.ItemCornerRadius, 0, 20)) }, + }; + } + + /// SolidColorBrush를 지정 비율만큼 밝게 합니다. + private static SolidColorBrush LightenBrush(SolidColorBrush brush, double amount) + { + var c = brush.Color; + byte Clamp(int v) => (byte)Math.Min(255, Math.Max(0, v)); + return new SolidColorBrush(Color.FromRgb( + Clamp(c.R + (int)(255 * amount)), + Clamp(c.G + (int)(255 * amount)), + Clamp(c.B + (int)(255 * amount)))); + } + + private static bool IsSystemDarkMode() + { + try + { + using var key = Registry.CurrentUser.OpenSubKey( + @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"); + return key?.GetValue("AppsUseLightTheme") is int v && v == 0; + } + catch (Exception) { return true; } + } + + private void AnimateIn() + { + Opacity = 0; + + var ease = new System.Windows.Media.Animation.CubicEase + { EasingMode = System.Windows.Media.Animation.EasingMode.EaseOut }; + + var fadeAnim = new System.Windows.Media.Animation.DoubleAnimation(0, 1, + TimeSpan.FromMilliseconds(100)) { EasingFunction = ease }; + + var slideAnim = new System.Windows.Media.Animation.DoubleAnimation(-8, 0, + TimeSpan.FromMilliseconds(120)) { EasingFunction = ease }; + + BeginAnimation(OpacityProperty, fadeAnim); + + // Window에 AllowsTransparency=True 일 때 RenderTransform을 Window에 직접 설정하면 + // InvalidOperationException 발생 → Content(루트 Border)에 적용 + if (Content is System.Windows.FrameworkElement root) + { + var translate = new System.Windows.Media.TranslateTransform(0, -10); + root.RenderTransform = translate; + root.RenderTransformOrigin = new System.Windows.Point(0.5, 0); + translate.BeginAnimation(System.Windows.Media.TranslateTransform.YProperty, slideAnim); + } + } + + // ─── IME 보완 검색 ──────────────────────────────────────────────────────── + + /// + /// WPF 바인딩(UpdateSourceTrigger=PropertyChanged)은 한글 IME 조합 중에는 + /// ViewModel 업데이트를 지연하므로, TextChanged에서 직접 검색을 트리거합니다. + /// InputText 프로퍼티를 건드리지 않아 IME 조합 상태(音節)가 유지됩니다. + /// + private void InputBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) + { + // 바인딩이 이미 ViewModel을 업데이트한 경우(조합 완료 후)에는 중복 실행 방지 + if (_vm.InputText == InputBox.Text) return; + // 조합 중 텍스트로 즉시 검색 — InputText 바인딩 우회 + _ = _vm.TriggerImeSearchAsync(InputBox.Text); + } + + // ─── 키보드 이벤트 ──────────────────────────────────────────────────────── + + /// + /// Window 레벨 PreviewKeyDown — 터널링으로 먼저 실행되므로 + /// TextBox 내부 ScrollViewer가 Up/Down을 소비하기 전에 인터셉트합니다. + /// + private void Window_PreviewKeyDown(object sender, KeyEventArgs e) + { + bool shift = (Keyboard.Modifiers & ModifierKeys.Shift) != 0; + + switch (e.Key) + { + case Key.Escape: + if (_vm.IsActionMode) + _vm.ExitActionMode(); + else + Hide(); + e.Handled = true; + break; + + case Key.Enter: + // Ctrl+Enter, Alt+Enter → Window_KeyDown에서 처리 + if ((Keyboard.Modifiers & ModifierKeys.Control) != 0 || + (Keyboard.Modifiers & ModifierKeys.Alt) != 0) + return; + + if (shift) + { + // 퍼지 파일 검색 결과: Shift+Enter → 파일이 있는 폴더 열기 + if (_vm.SelectedItem?.Data is AxCopilot.Services.IndexEntry shiftEntry) + { + var expanded = Environment.ExpandEnvironmentVariables(shiftEntry.Path); + Hide(); + // File.Exists/Directory.Exists 생략 — 탐색기가 없는 경로는 알아서 처리 + // 폴더인 경우 바로 열기, 파일인 경우 /select로 위치 표시 + _ = Task.Run(() => + { + try + { + if (shiftEntry.Type == Services.IndexEntryType.Folder) + System.Diagnostics.Process.Start("explorer.exe", $"\"{expanded}\""); + else + System.Diagnostics.Process.Start("explorer.exe", $"/select,\"{expanded}\""); + } + catch (Exception) { } + }); + } + // 캡처 모드: 지연 캡처 타이머 표시 + else if (_vm.ActivePrefix != null && + _vm.ActivePrefix.Equals("cap", StringComparison.OrdinalIgnoreCase) && + _vm.ShowDelayTimerItems()) + { + // 타이머 선택 목록으로 전환됨 — Enter로 선택 + } + else if (_vm.MergeCount > 0) + _vm.ExecuteMerge(); + else + ShowLargeType(); + } + else if (_vm.IsActionMode && TryHandleSpecialAction()) + { + // 삭제/이름 변경 등 특수 액션 처리됨 — 별도 처리 + } + else + { + _ = _vm.ExecuteSelectedAsync(); + } + e.Handled = true; + break; + + case Key.Down: + if (shift) + { + _vm.ToggleMergeItem(_vm.SelectedItem); + _vm.SelectNext(); + } + else + { + _vm.SelectNext(); + } + ScrollToSelected(); + e.Handled = true; + break; + + case Key.Up: + if (shift) + { + _vm.ToggleMergeItem(_vm.SelectedItem); + _vm.SelectPrev(); + } + else + { + _vm.SelectPrev(); + } + ScrollToSelected(); + e.Handled = true; + break; + + case Key.Right: + // 커서가 입력 끝에 있고 선택된 항목이 파일/앱이면 액션 서브메뉴 진입 + if (InputBox.CaretIndex == InputBox.Text.Length + && InputBox.Text.Length > 0 + && _vm.CanEnterActionMode()) + { + _vm.EnterActionMode(_vm.SelectedItem!); + e.Handled = true; + } + break; + + case Key.PageDown: + for (int i = 0; i < 5 && _vm.Results.Count > 0; i++) _vm.SelectNext(); + ScrollToSelected(); + e.Handled = true; + break; + + case Key.PageUp: + for (int i = 0; i < 5 && _vm.Results.Count > 0; i++) _vm.SelectPrev(); + ScrollToSelected(); + e.Handled = true; + break; + + case Key.Home: + // 입력창 커서가 맨 앞이거나 입력이 없을 때 → 목록 첫 항목으로 이동 + if (InputBox.CaretIndex == 0 || string.IsNullOrEmpty(InputBox.Text)) + { + _vm.SelectFirst(); + ScrollToSelected(); + e.Handled = true; + } + break; + + case Key.End: + // 입력창 커서가 맨 끝이거나 입력이 없을 때 → 목록 마지막 항목으로 이동 + if (InputBox.CaretIndex == InputBox.Text.Length || string.IsNullOrEmpty(InputBox.Text)) + { + _vm.SelectLast(); + ScrollToSelected(); + e.Handled = true; + } + break; + + case Key.Tab: + // 자동완성: 선택된 항목의 Title을 입력창에 채우고 커서를 끝으로 이동 + if (_vm.SelectedItem != null) + { + _vm.InputText = _vm.SelectedItem.Title; + // 바인딩 업데이트 후 커서를 끝으로 — Dispatcher로 다음 렌더 사이클에 실행 + Dispatcher.BeginInvoke(() => + { + InputBox.CaretIndex = InputBox.Text.Length; + InputBox.Focus(); + }, System.Windows.Threading.DispatcherPriority.Input); + } + e.Handled = true; + break; + } + } + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + var mod = Keyboard.Modifiers; + + // ─── Ctrl+, → 설정 창 열기 ───────────────────────────────────────── + if (e.Key == Key.OemComma && mod == ModifierKeys.Control) + { + Hide(); + OpenSettingsAction?.Invoke(); + e.Handled = true; + return; + } + + // ─── F1 → 도움말 창 열기 ──────────────────────────────────────────── + if (e.Key == Key.F1) + { + _vm.InputText = "help"; + e.Handled = true; + return; + } + + // ─── F5 → 인덱스 새로 고침 ────────────────────────────────────────── + if (e.Key == Key.F5) + { + var app = (App)System.Windows.Application.Current; + _ = app.IndexService?.BuildAsync(CancellationToken.None); + IndexStatusText.Text = "⟳ 인덱스 재구축 중…"; + IndexStatusText.Visibility = Visibility.Visible; + e.Handled = true; + return; + } + + // ─── Delete → 항목 삭제 ───────────────────────────────────────────── + if (e.Key == Key.Delete && mod == ModifierKeys.None) + { + if (_vm.SelectedItem != null) + { + var input = _vm.InputText ?? ""; + // note 예약어 활성 상태에서 메모 개별 삭제 + if (input.StartsWith("note", StringComparison.OrdinalIgnoreCase) + && _vm.SelectedItem.Data is string noteContent + && noteContent != "__CLEAR__") + { + var title = _vm.SelectedItem.Title; + var result = CustomMessageBox.Show( + $"'{title}' 메모를 삭제하시겠습니까?", + "AX Copilot", + MessageBoxButton.OKCancel, + MessageBoxImage.Question); + + if (result == MessageBoxResult.OK) + { + Handlers.NoteHandler.DeleteNote(noteContent); + // 결과 목록 새로고침 (InputText 재설정으로 SearchAsync 트리거) + var current = _vm.InputText ?? ""; + _vm.InputText = current + " "; + _vm.InputText = current; + } + } + else + { + var title = _vm.SelectedItem.Title; + var result = CustomMessageBox.Show( + $"'{title}' 항목을 목록에서 제거하시겠습니까?", + "AX Copilot", + MessageBoxButton.OKCancel, + MessageBoxImage.Question); + + if (result == MessageBoxResult.OK) + _vm.RemoveSelectedFromRecent(); + } + } + e.Handled = true; + return; + } + + // ─── Ctrl+L → 입력창 초기화 ───────────────────────────────────────── + if (e.Key == Key.L && mod == ModifierKeys.Control) + { + _vm.ClearInput(); + InputBox.Focus(); + e.Handled = true; + return; + } + + // ─── Ctrl+C → 선택 항목 이름 복사 (결과 선택 시) ──────────────────── + if (e.Key == Key.C && mod == ModifierKeys.Control && _vm.SelectedItem?.Data is AxCopilot.Services.IndexEntry) + { + _vm.CopySelectedPath(); + ShowToast("이름 복사됨"); + e.Handled = true; + return; + } + + // ─── Ctrl+Shift+C → 전체 경로 복사 ────────────────────────────────── + if (e.Key == Key.C && mod == (ModifierKeys.Control | ModifierKeys.Shift)) + { + if (_vm.CopySelectedFullPath()) + ShowToast("경로 복사됨"); + e.Handled = true; + return; + } + + // ─── Ctrl+Shift+E → 파일 탐색기에서 열기 ──────────────────────────── + if (e.Key == Key.E && mod == (ModifierKeys.Control | ModifierKeys.Shift)) + { + if (_vm.OpenSelectedInExplorer()) + Hide(); + e.Handled = true; + return; + } + + // ─── Ctrl+Enter → 관리자 권한 실행 ────────────────────────────────── + if (e.Key == Key.Enter && mod == ModifierKeys.Control) + { + if (_vm.RunSelectedAsAdmin()) + Hide(); + e.Handled = true; + return; + } + + // ─── Alt+Enter → 파일 속성 보기 ───────────────────────────────────── + if (e.Key == Key.Enter && mod == ModifierKeys.Alt) + { + _vm.ShowSelectedProperties(); + e.Handled = true; + return; + } + + // ─── Ctrl+H → 클립보드 히스토리 ───────────────────────────────────── + if (e.Key == Key.H && mod == ModifierKeys.Control) + { + _vm.InputText = "#"; + Dispatcher.BeginInvoke(() => { InputBox.CaretIndex = InputBox.Text.Length; }, + System.Windows.Threading.DispatcherPriority.Input); + e.Handled = true; + return; + } + + // ─── Ctrl+R → 최근 실행 항목 ──────────────────────────────────────── + if (e.Key == Key.R && mod == ModifierKeys.Control) + { + _vm.InputText = "recent"; + Dispatcher.BeginInvoke(() => { InputBox.CaretIndex = InputBox.Text.Length; }, + System.Windows.Threading.DispatcherPriority.Input); + e.Handled = true; + return; + } + + // ─── Ctrl+B → 즐겨찾기 뷰 토글 (fav 이면 이전 검색으로, 아니면 fav로) ─ + if (e.Key == Key.B && mod == ModifierKeys.Control) + { + if (_vm.InputText.TrimStart().Equals("fav", StringComparison.OrdinalIgnoreCase)) + _vm.ClearInput(); + else + _vm.InputText = "fav"; + Dispatcher.BeginInvoke(() => { InputBox.CaretIndex = InputBox.Text.Length; }, + System.Windows.Threading.DispatcherPriority.Input); + e.Handled = true; + return; + } + + // ─── Ctrl+K → 단축키 도움말 모달 창 ───────────────────────────────── + if (e.Key == Key.K && mod == ModifierKeys.Control) + { + var helpWin = new ShortcutHelpWindow { Owner = this }; + helpWin.ShowDialog(); + e.Handled = true; + return; + } + + // ─── Ctrl+T → 터미널 열기 (선택 항목 경로, 없으면 홈) ──────────────── + if (e.Key == Key.T && mod == ModifierKeys.Control) + { + _vm.OpenSelectedInTerminal(); + Hide(); + e.Handled = true; + return; + } + + // ─── Ctrl+F → 파일 검색 모드 전환 ─────────────────────────────────── + if (e.Key == Key.F && mod == ModifierKeys.Control) + { + // 입력창 초기화 후 파일 타입 필터 힌트 + _vm.ClearInput(); + Dispatcher.BeginInvoke(() => + { + InputBox.Focus(); + InputBox.CaretIndex = InputBox.Text.Length; + }, System.Windows.Threading.DispatcherPriority.Input); + e.Handled = true; + return; + } + + // ─── Ctrl+P → 클립보드 모드에서 핀 토글 / 일반 모드에서 즐겨찾기 ─── + if (e.Key == Key.P && mod == ModifierKeys.Control) + { + if (_vm.IsClipboardMode && _vm.SelectedItem?.Data is Services.ClipboardEntry clipEntry) + { + var clipSvc = CurrentApp?.ClipboardHistoryService; + clipSvc?.TogglePin(clipEntry); + ShowToast(clipEntry.IsPinned ? "클립보드 핀 고정 📌" : "클립보드 핀 해제"); + // 검색 결과 갱신 + _vm.InputText = _vm.InputText; + } + else + { + var result = _vm.ToggleFavorite(); + if (result == true) + ShowToast("즐겨찾기에 추가됨 ⭐"); + else if (result == false) + ShowToast("즐겨찾기에서 제거됨"); + else + ShowToast("파일/폴더 항목을 선택하세요"); + } + e.Handled = true; + return; + } + + // ─── Ctrl+D → 다운로드 폴더 열기 ─────────────────────────────────── + if (e.Key == Key.D && mod == ModifierKeys.Control) + { + _vm.NavigateToDownloads(); + Dispatcher.BeginInvoke(() => { InputBox.CaretIndex = InputBox.Text.Length; }, + System.Windows.Threading.DispatcherPriority.Input); + e.Handled = true; + return; + } + + // ─── Ctrl+W → 런처 창 닫기 ────────────────────────────────────────── + if (e.Key == Key.W && mod == ModifierKeys.Control) + { + Hide(); + e.Handled = true; + return; + } + + // ─── F2 → 선택 파일 이름 바꾸기 ───────────────────────────────────── + if (e.Key == Key.F2) + { + if (_vm.SelectedItem?.Data is AxCopilot.Services.IndexEntry entry) + { + var path = Environment.ExpandEnvironmentVariables(entry.Path); + _vm.InputText = $"rename {path}"; + Dispatcher.BeginInvoke(() => { InputBox.CaretIndex = InputBox.Text.Length; }, + System.Windows.Threading.DispatcherPriority.Input); + } + e.Handled = true; + return; + } + + // ─── Ctrl+1~9 → n번째 결과 즉시 실행 ─────────────────────────────── + if (mod == ModifierKeys.Control) + { + int num = e.Key switch + { + Key.D1 => 1, Key.D2 => 2, Key.D3 => 3, + Key.D4 => 4, Key.D5 => 5, Key.D6 => 6, + Key.D7 => 7, Key.D8 => 8, Key.D9 => 9, + _ => 0 + }; + if (num > 0 && num <= _vm.Results.Count) + { + _vm.SelectedItem = _vm.Results[num - 1]; + _ = _vm.ExecuteSelectedAsync(); + Hide(); + e.Handled = true; + return; + } + } + } + + /// 단축키 도움말 팝업 + private void ShowShortcutHelp() + { + var lines = new[] + { + "[ 전역 ]", + "Alt+Space AX Commander 열기/닫기", + "", + "[ 탐색 ]", + "↑ / ↓ 결과 이동", + "Enter 선택 실행", + "Tab 자동완성", + "→ 액션 모드", + "Escape 닫기 / 뒤로", + "", + "[ 기능 ]", + "F1 도움말", + "F2 파일 이름 바꾸기", + "F5 인덱스 새로 고침", + "Delete 항목 제거", + "Ctrl+, 설정", + "Ctrl+L 입력 초기화", + "Ctrl+C 이름 복사", + "Ctrl+H 클립보드 히스토리", + "Ctrl+R 최근 실행", + "Ctrl+B 즐겨찾기", + "Ctrl+K 이 도움말", + "Ctrl+1~9 N번째 실행", + "Ctrl+Shift+C 경로 복사", + "Ctrl+Shift+E 탐색기에서 열기", + "Ctrl+Enter 관리자 실행", + "Alt+Enter 속성 보기", + "Shift+Enter 대형 텍스트", + }; + + CustomMessageBox.Show( + string.Join("\n", lines), + "AX Commander — 단축키 도움말", + MessageBoxButton.OK, + MessageBoxImage.Information); + } + + /// 오버레이 토스트 표시 (페이드인 → 2초 대기 → 페이드아웃) + private void ShowToast(string message, string icon = "\uE73E") + { + ToastText.Text = message; + ToastIcon.Text = icon; + ToastOverlay.Visibility = Visibility.Visible; + ToastOverlay.Opacity = 0; + + // 페이드인 + var fadeIn = (System.Windows.Media.Animation.Storyboard)FindResource("ToastFadeIn"); + fadeIn.Begin(this); + + _indexStatusTimer?.Stop(); + _indexStatusTimer = new System.Windows.Threading.DispatcherTimer + { + Interval = TimeSpan.FromSeconds(2) + }; + _indexStatusTimer.Tick += (_, _) => + { + _indexStatusTimer.Stop(); + // 페이드아웃 후 Collapsed + var fadeOut = (System.Windows.Media.Animation.Storyboard)FindResource("ToastFadeOut"); + EventHandler? onCompleted = null; + onCompleted = (__, ___) => + { + fadeOut.Completed -= onCompleted; + ToastOverlay.Visibility = Visibility.Collapsed; + }; + fadeOut.Completed += onCompleted; + fadeOut.Begin(this); + }; + _indexStatusTimer.Start(); + } + + /// + /// 액션 모드에서 특수 처리가 필요한 동작(삭제/이름변경)을 처리합니다. + /// 처리되면 true 반환 → ExecuteSelectedAsync 호출 생략. + /// + private bool TryHandleSpecialAction() + { + if (_vm.SelectedItem?.Data is not AxCopilot.ViewModels.FileActionData actionData) + return false; + + switch (actionData.Action) + { + case AxCopilot.ViewModels.FileAction.DeleteToRecycleBin: + { + var path = actionData.Path; + var name = System.IO.Path.GetFileName(path); + var r = CustomMessageBox.Show( + $"'{name}'\n\n이 항목을 휴지통으로 보내겠습니까?", + "AX Copilot — 삭제 확인", + MessageBoxButton.OKCancel, + MessageBoxImage.Warning); + + if (r == MessageBoxResult.OK) + { + try + { + SendToRecycleBin(path); + _vm.ExitActionMode(); + ShowToast("휴지통으로 이동됨", "\uE74D"); + } + catch (Exception ex) + { + CustomMessageBox.Show($"삭제 실패: {ex.Message}", "오류", + MessageBoxButton.OK, MessageBoxImage.Error); + } + } + else + { + _vm.ExitActionMode(); + } + return true; + } + + case AxCopilot.ViewModels.FileAction.Rename: + { + var path = actionData.Path; + _vm.ExitActionMode(); + _vm.InputText = $"rename {path}"; + Dispatcher.BeginInvoke(() => { InputBox.CaretIndex = InputBox.Text.Length; }, + System.Windows.Threading.DispatcherPriority.Input); + return true; + } + + default: + return false; + } + } + + // ─── Shell32 휴지통 삭제 ──────────────────────────────────────────────── + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct SHFILEOPSTRUCT + { + public IntPtr hwnd; + public uint wFunc; + [MarshalAs(UnmanagedType.LPWStr)] public string pFrom; + [MarshalAs(UnmanagedType.LPWStr)] public string? pTo; + public ushort fFlags; + [MarshalAs(UnmanagedType.Bool)] public bool fAnyOperationsAborted; + public IntPtr hNameMappings; + [MarshalAs(UnmanagedType.LPWStr)] public string? lpszProgressTitle; + } + + [DllImport("shell32.dll", CharSet = CharSet.Unicode)] + private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp); + + private const uint FO_DELETE = 0x0003; + private const ushort FOF_ALLOWUNDO = 0x0040; + private const ushort FOF_NOCONFIRMATION = 0x0010; + private const ushort FOF_SILENT = 0x0004; + + /// 파일·폴더를 Windows 휴지통으로 보냅니다. + private void SendToRecycleBin(string path) + { + // pFrom은 null-terminated + 추가 null 필요 + var op = new SHFILEOPSTRUCT + { + hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle, + wFunc = FO_DELETE, + pFrom = path + '\0', + fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT, + }; + int result = SHFileOperation(ref op); + if (result != 0) + throw new System.ComponentModel.Win32Exception(result, $"SHFileOperation 실패 (코드 {result})"); + } + + private void ShowLargeType() + { + // 클립보드 항목 → 시스템 클립보드에 자동 복사 + 외부 앱에서 열기 + if (_vm.SelectedItem?.Data is Services.ClipboardEntry clipEntry) + { + try + { + // 자동 클립보드 복사 억제 (히스토리 중복 방지) + CurrentApp?.ClipboardHistoryService?.SuppressNextCapture(); + + if (!clipEntry.IsText && clipEntry.Image != null) + { + // 원본 이미지가 있으면 원본 사용, 없으면 썸네일 사용 + var originalImg = Services.ClipboardHistoryService.LoadOriginalImage(clipEntry.OriginalImagePath); + var imgToUse = originalImg ?? clipEntry.Image; + + // 시스템 클립보드에 원본 복사 + Clipboard.SetImage(imgToUse); + + // 이미지: PNG로 저장 → 기본 이미지 뷰어 + string path; + if (!string.IsNullOrEmpty(clipEntry.OriginalImagePath) && + System.IO.File.Exists(clipEntry.OriginalImagePath)) + { + path = clipEntry.OriginalImagePath; // 원본 파일 직접 열기 + } + else + { + path = Services.TempFileService.CreateTempFile("clip_image", ".png"); + var encoder = new System.Windows.Media.Imaging.PngBitmapEncoder(); + encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(imgToUse)); + using var fs = new System.IO.FileStream(path, System.IO.FileMode.Create); + encoder.Save(fs); + } + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(path) { UseShellExecute = true }); + } + else if (!string.IsNullOrEmpty(clipEntry.Text)) + { + // 시스템 클립보드에 텍스트 복사 + Clipboard.SetText(clipEntry.Text); + + // 텍스트: txt로 저장 → 메모장 + var path = Services.TempFileService.CreateTempFile("clip_text", ".txt"); + System.IO.File.WriteAllText(path, clipEntry.Text, System.Text.Encoding.UTF8); + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("notepad.exe", $"\"{path}\"") { UseShellExecute = true }); + } + } + catch (Exception ex) + { + Services.LogService.Warn($"클립보드 외부 뷰어 실패: {ex.Message}"); + } + return; + } + + var text = _vm.GetLargeTypeText(); + if (string.IsNullOrWhiteSpace(text)) return; + new LargeTypeWindow(text).Show(); + } + + /// 이미 선택된 아이템을 클릭하면 Execute, 아직 선택되지 않은 아이템 클릭은 선택만. + private SDK.LauncherItem? _lastClickedItem; + private DateTime _lastClickTime; + + private void ResultList_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + // 클릭한 ListViewItem 찾기 + var dep = e.OriginalSource as DependencyObject; + while (dep != null && dep is not System.Windows.Controls.ListViewItem) + dep = System.Windows.Media.VisualTreeHelper.GetParent(dep); + if (dep is not System.Windows.Controls.ListViewItem lvi) return; + + var clickedItem = lvi.Content as SDK.LauncherItem; + if (clickedItem == null) return; + + var now = DateTime.UtcNow; + var timeSinceLastClick = (now - _lastClickTime).TotalMilliseconds; + + if (_lastClickedItem == clickedItem && timeSinceLastClick < 600) + { + // 같은 아이템을 짧은 간격으로 재클릭 → 액션 모드 또는 실행 + if (!_vm.IsActionMode && _vm.CanEnterActionMode()) + { + _vm.EnterActionMode(clickedItem); + e.Handled = true; + } + else + { + _ = _vm.ExecuteSelectedAsync(); + e.Handled = true; + } + _lastClickedItem = null; + return; + } + + // 첫 번째 클릭 → 선택만 + _lastClickedItem = clickedItem; + _lastClickTime = now; + } + + private void ResultList_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + _ = _vm.ExecuteSelectedAsync(); + } + + private void Window_Deactivated(object sender, EventArgs e) + { + // 설정 › 기능 › "포커스 잃으면 닫기"가 켜진 경우에만 자동 숨김 + if (_vm.CloseOnFocusLost) Hide(); + } + + private void ScrollToSelected() + { + if (_vm.SelectedItem != null) + ResultList.ScrollIntoView(_vm.SelectedItem); + } + + private void ShowNotification(string message) + { + // 시스템 트레이 토스트 알림 표시 + // App.xaml.cs의 TrayIcon을 통해 처리 + } +} diff --git a/src/AxCopilot/Views/ModelRegistrationDialog.cs b/src/AxCopilot/Views/ModelRegistrationDialog.cs new file mode 100644 index 0000000..29df61b --- /dev/null +++ b/src/AxCopilot/Views/ModelRegistrationDialog.cs @@ -0,0 +1,414 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Shapes; + +namespace AxCopilot.Views; + +/// 모델 등록/편집 다이얼로그. 별칭 + 실제 모델명 입력. +internal sealed class ModelRegistrationDialog : Window +{ + private readonly TextBox _aliasBox; + private readonly TextBox _modelBox; + private readonly TextBox _endpointBox; + private readonly TextBox _apiKeyBox; + + // CP4D 인증 필드 + private readonly ComboBox _authTypeBox; + private readonly StackPanel _cp4dPanel; + private readonly TextBox _cp4dUrlBox; + private readonly TextBox _cp4dUsernameBox; + private readonly PasswordBox _cp4dPasswordBox; + + public string ModelAlias => _aliasBox.Text.Trim(); + public string ModelName => _modelBox.Text.Trim(); + public string Endpoint => _endpointBox.Text.Trim(); + public string ApiKey => _apiKeyBox.Text.Trim(); + public string AuthType => (_authTypeBox.SelectedItem as ComboBoxItem)?.Tag?.ToString() ?? "bearer"; + public string Cp4dUrl => _cp4dUrlBox.Text.Trim(); + public string Cp4dUsername => _cp4dUsernameBox.Text.Trim(); + public string Cp4dPassword => _cp4dPasswordBox.Password.Trim(); + + public ModelRegistrationDialog(string service, string existingAlias = "", string existingModel = "", + string existingEndpoint = "", string existingApiKey = "", + string existingAuthType = "bearer", string existingCp4dUrl = "", + string existingCp4dUsername = "", string existingCp4dPassword = "") + { + bool isEdit = !string.IsNullOrEmpty(existingAlias); + Title = isEdit ? "모델 편집" : "모델 추가"; + Width = 420; + SizeToContent = SizeToContent.Height; + WindowStartupLocation = WindowStartupLocation.CenterOwner; + ResizeMode = ResizeMode.NoResize; + WindowStyle = WindowStyle.None; + AllowsTransparency = true; + Background = Brushes.Transparent; + + var bgBrush = Application.Current.TryFindResource("LauncherBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)); + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush ?? Brushes.Blue; + var itemBg = Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2B, 0x40)); + var borderBrush = Application.Current.TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + + // 루트 컨테이너 + var root = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(16), + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Padding = new Thickness(28, 24, 28, 24), + Effect = new System.Windows.Media.Effects.DropShadowEffect + { + BlurRadius = 24, + ShadowDepth = 4, + Opacity = 0.3, + Color = Colors.Black, + }, + }; + + var stack = new StackPanel(); + + // 헤더 + var header = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 0, 0, 20) }; + header.Children.Add(new TextBlock + { + Text = "\uEA86", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 18, + Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0), + }); + header.Children.Add(new TextBlock + { + Text = isEdit ? "모델 편집" : "새 모델 등록", + FontSize = 17, + FontWeight = FontWeights.Bold, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + stack.Children.Add(header); + + // 서비스 표시 + var serviceLabel = service == "vllm" ? "vLLM" : "Ollama"; + var serviceBadge = new Border + { + Background = accentBrush, + CornerRadius = new CornerRadius(6), + Padding = new Thickness(10, 3, 10, 3), + Margin = new Thickness(0, 0, 0, 16), + HorizontalAlignment = HorizontalAlignment.Left, + Opacity = 0.85, + }; + serviceBadge.Child = new TextBlock + { + Text = $"{serviceLabel} 서비스", + FontSize = 11, + FontWeight = FontWeights.SemiBold, + Foreground = Brushes.White, + }; + stack.Children.Add(serviceBadge); + + // 별칭 입력 + stack.Children.Add(new TextBlock + { + Text = "별칭 (표시 이름)", + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = primaryText, + Margin = new Thickness(0, 0, 0, 6), + }); + stack.Children.Add(new TextBlock + { + Text = "채팅 화면에서 표시될 이름입니다. 예: 코드 리뷰 전용, 일반 대화", + FontSize = 11, + Foreground = secondaryText, + Margin = new Thickness(0, 0, 0, 8), + }); + _aliasBox = new TextBox + { + Text = existingAlias, + FontSize = 13, + Padding = new Thickness(12, 8, 12, 8), + Foreground = primaryText, + Background = itemBg, + CaretBrush = accentBrush, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + }; + var aliasBorder = new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _aliasBox }; + stack.Children.Add(aliasBorder); + + // 구분선 + stack.Children.Add(new Rectangle + { + Height = 1, + Fill = borderBrush, + Margin = new Thickness(0, 16, 0, 16), + Opacity = 0.5, + }); + + // 모델명 입력 + stack.Children.Add(new TextBlock + { + Text = "실제 모델명", + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = primaryText, + Margin = new Thickness(0, 0, 0, 6), + }); + stack.Children.Add(new TextBlock + { + Text = "서버에 배포된 실제 모델 ID (예: llama3:8b, qwen2:7b)", + FontSize = 11, + Foreground = secondaryText, + Margin = new Thickness(0, 0, 0, 8), + }); + _modelBox = new TextBox + { + Text = existingModel, + FontSize = 13, + Padding = new Thickness(12, 8, 12, 8), + Foreground = primaryText, + Background = itemBg, + CaretBrush = accentBrush, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + }; + var modelBorder = new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _modelBox }; + stack.Children.Add(modelBorder); + + // 구분선 + stack.Children.Add(new Rectangle + { + Height = 1, Fill = borderBrush, + Margin = new Thickness(0, 16, 0, 16), Opacity = 0.5, + }); + + // 서버 엔드포인트 입력 + stack.Children.Add(new TextBlock + { + Text = "서버 엔드포인트 (선택)", + FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = primaryText, Margin = new Thickness(0, 0, 0, 6), + }); + stack.Children.Add(new TextBlock + { + Text = "이 모델 전용 서버 주소. 비워두면 기본 엔드포인트를 사용합니다.", + FontSize = 11, Foreground = secondaryText, Margin = new Thickness(0, 0, 0, 8), + }); + _endpointBox = new TextBox + { + Text = existingEndpoint, + FontSize = 13, Padding = new Thickness(12, 8, 12, 8), + Foreground = primaryText, Background = itemBg, + CaretBrush = accentBrush, BorderBrush = borderBrush, BorderThickness = new Thickness(1), + }; + stack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _endpointBox }); + + // ── 인증 방식 선택 ────────────────────────────────────────────────── + stack.Children.Add(new TextBlock + { + Text = "인증 방식", + FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = primaryText, Margin = new Thickness(0, 10, 0, 6), + }); + _authTypeBox = new ComboBox + { + FontSize = 13, Padding = new Thickness(8, 6, 8, 6), + Foreground = primaryText, Background = itemBg, + BorderBrush = borderBrush, BorderThickness = new Thickness(1), + }; + var bearerItem = new ComboBoxItem { Content = "Bearer 토큰 (API 키)", Tag = "bearer" }; + var cp4dItem = new ComboBoxItem { Content = "CP4D (IBM Cloud Pak for Data)", Tag = "cp4d" }; + _authTypeBox.Items.Add(bearerItem); + _authTypeBox.Items.Add(cp4dItem); + _authTypeBox.SelectedItem = existingAuthType == "cp4d" ? cp4dItem : bearerItem; + stack.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _authTypeBox }); + + // ── Bearer 인증: API 키 입력 ──────────────────────────────────────── + var apiKeyPanel = new StackPanel(); + apiKeyPanel.Children.Add(new TextBlock + { + Text = "API 키 (선택)", + FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = primaryText, Margin = new Thickness(0, 10, 0, 6), + }); + _apiKeyBox = new TextBox + { + Text = existingApiKey, + FontSize = 13, Padding = new Thickness(12, 8, 12, 8), + Foreground = primaryText, Background = itemBg, + CaretBrush = accentBrush, BorderBrush = borderBrush, BorderThickness = new Thickness(1), + }; + apiKeyPanel.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _apiKeyBox }); + stack.Children.Add(apiKeyPanel); + + // ── CP4D 인증: URL + 사용자명 + 비밀번호 ──────────────────────────── + _cp4dPanel = new StackPanel { Visibility = existingAuthType == "cp4d" ? Visibility.Visible : Visibility.Collapsed }; + + _cp4dPanel.Children.Add(new TextBlock + { + Text = "CP4D 서버 URL", + FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = primaryText, Margin = new Thickness(0, 10, 0, 6), + }); + _cp4dPanel.Children.Add(new TextBlock + { + Text = "예: https://cpd-host.example.com", + FontSize = 11, Foreground = secondaryText, Margin = new Thickness(0, 0, 0, 6), + }); + _cp4dUrlBox = new TextBox + { + Text = existingCp4dUrl, + FontSize = 13, Padding = new Thickness(12, 8, 12, 8), + Foreground = primaryText, Background = itemBg, + CaretBrush = accentBrush, BorderBrush = borderBrush, BorderThickness = new Thickness(1), + }; + _cp4dPanel.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _cp4dUrlBox }); + + _cp4dPanel.Children.Add(new TextBlock + { + Text = "사용자 이름", + FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = primaryText, Margin = new Thickness(0, 10, 0, 6), + }); + _cp4dUsernameBox = new TextBox + { + Text = existingCp4dUsername, + FontSize = 13, Padding = new Thickness(12, 8, 12, 8), + Foreground = primaryText, Background = itemBg, + CaretBrush = accentBrush, BorderBrush = borderBrush, BorderThickness = new Thickness(1), + }; + _cp4dPanel.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _cp4dUsernameBox }); + + _cp4dPanel.Children.Add(new TextBlock + { + Text = "비밀번호 / API 키", + FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = primaryText, Margin = new Thickness(0, 10, 0, 6), + }); + _cp4dPasswordBox = new PasswordBox + { + Password = existingCp4dPassword, + FontSize = 13, Padding = new Thickness(12, 8, 12, 8), + Foreground = primaryText, Background = itemBg, + CaretBrush = accentBrush, BorderBrush = borderBrush, BorderThickness = new Thickness(1), + }; + _cp4dPanel.Children.Add(new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _cp4dPasswordBox }); + + stack.Children.Add(_cp4dPanel); + + // 인증 방식 전환 시 패널 표시/숨김 + _authTypeBox.SelectionChanged += (_, _) => + { + var isCp4d = AuthType == "cp4d"; + _cp4dPanel.Visibility = isCp4d ? Visibility.Visible : Visibility.Collapsed; + apiKeyPanel.Visibility = isCp4d ? Visibility.Collapsed : Visibility.Visible; + }; + // 초기 상태 설정 + apiKeyPanel.Visibility = existingAuthType == "cp4d" ? Visibility.Collapsed : Visibility.Visible; + + // 보안 안내 + var securityNote = new StackPanel + { + Orientation = Orientation.Horizontal, + Margin = new Thickness(0, 12, 0, 0), + }; + securityNote.Children.Add(new TextBlock + { + Text = "\uE72E", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 11, + Foreground = new SolidColorBrush(Color.FromRgb(0x38, 0xA1, 0x69)), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 6, 0), + }); + securityNote.Children.Add(new TextBlock + { + Text = "모델명은 AES-256으로 암호화되어 설정 파일에 저장됩니다", + FontSize = 10.5, + Foreground = secondaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + stack.Children.Add(securityNote); + + // 버튼 바 + var btnBar = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(0, 24, 0, 0), + }; + + var cancelBtn = new Button + { + Content = "취소", + Width = 80, + Padding = new Thickness(0, 8, 0, 8), + Margin = new Thickness(0, 0, 10, 0), + Background = Brushes.Transparent, + Foreground = secondaryText, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Cursor = Cursors.Hand, + FontSize = 13, + }; + cancelBtn.Click += (_, _) => { DialogResult = false; Close(); }; + btnBar.Children.Add(cancelBtn); + + var okBtn = new Button + { + Content = isEdit ? "저장" : "등록", + Width = 80, + Padding = new Thickness(0, 8, 0, 8), + Background = accentBrush, + Foreground = Brushes.White, + BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, + FontSize = 13, + FontWeight = FontWeights.SemiBold, + }; + okBtn.Click += (_, _) => + { + if (string.IsNullOrWhiteSpace(_aliasBox.Text)) + { + CustomMessageBox.Show("별칭을 입력하세요.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + _aliasBox.Focus(); + return; + } + if (string.IsNullOrWhiteSpace(_modelBox.Text)) + { + CustomMessageBox.Show("모델명을 입력하세요.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + _modelBox.Focus(); + return; + } + DialogResult = true; + Close(); + }; + btnBar.Children.Add(okBtn); + stack.Children.Add(btnBar); + + root.Child = stack; + Content = root; + + // 키보드 핸들링 + KeyDown += (_, ke) => + { + if (ke.Key == Key.Escape) { DialogResult = false; Close(); } + }; + Loaded += (_, _) => { _aliasBox.Focus(); _aliasBox.SelectAll(); }; + + // 드래그 이동 + root.MouseLeftButtonDown += (_, me) => + { + if (me.LeftButton == System.Windows.Input.MouseButtonState.Pressed) + try { DragMove(); } catch (Exception) { } + }; + } +} diff --git a/src/AxCopilot/Views/PlanViewerWindow.cs b/src/AxCopilot/Views/PlanViewerWindow.cs new file mode 100644 index 0000000..268069a --- /dev/null +++ b/src/AxCopilot/Views/PlanViewerWindow.cs @@ -0,0 +1,931 @@ +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Interop; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; + +namespace AxCopilot.Views; + +/// +/// 에이전트 실행 계획을 상세히 보여주는 별도 창. +/// - 항목 기본 접힘 / 클릭으로 펼침 +/// - 모두 열기 / 모두 닫기 툴바 +/// - 사방 가장자리 드래그 리사이즈 +/// - 항목 드래그로 순서 변경 +/// +internal sealed class PlanViewerWindow : Window +{ + // ── Win32 Resize ── + [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + private const int WM_NCHITTEST = 0x0084; + private const int HTLEFT = 10, HTRIGHT = 11, HTTOP = 12, HTTOPLEFT = 13, + HTTOPRIGHT = 14, HTBOTTOM = 15, HTBOTTOMLEFT = 16, HTBOTTOMRIGHT = 17; + private const int ResizeGrip = 12; // 사방 12px 영역에서 리사이즈 가능 + + private const string DragDataFormat = "PlanStepIndex"; + + private readonly StackPanel _stepsPanel; + private readonly ScrollViewer _scrollViewer; + private readonly StackPanel _btnPanel; + private readonly Border _statusBar; + private readonly TextBlock _statusText; + private readonly TextBlock _progressText; + + // 펼침 상태 관리 + private readonly HashSet _expandedSteps = new(); + + // 드래그 상태 + private int _dragSourceIndex = -1; + private Point _dragStartPoint; + + private TaskCompletionSource? _tcs; + private string _planText = ""; + private List _steps = new(); + private int _currentStep = -1; + private bool _isExecuting; + + public PlanViewerWindow() + { + Width = 640; + Height = 520; + MinWidth = 480; + MinHeight = 360; + WindowStartupLocation = WindowStartupLocation.CenterScreen; + WindowStyle = WindowStyle.None; + AllowsTransparency = true; + Background = Brushes.Transparent; + ResizeMode = ResizeMode.CanResize; // WndProc로 직접 처리 + ShowInTaskbar = false; + + var bgBrush = Application.Current.TryFindResource("LauncherBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)); + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + var borderBrush = Application.Current.TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + + var root = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(14), + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Effect = new DropShadowEffect { BlurRadius = 20, ShadowDepth = 4, Opacity = 0.35, Color = Colors.Black }, + }; + + var mainGrid = new Grid(); + mainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); // 0: 타이틀 바 + mainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); // 1: 상태 바 + mainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); // 2: 툴바 (모두 열기/닫기) + mainGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); // 3: 단계 목록 + mainGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); // 4: 하단 버튼 + + // ── 타이틀 바 ── + var titleBar = new Grid { Background = Brushes.Transparent, Margin = new Thickness(20, 14, 12, 0) }; + titleBar.MouseLeftButtonDown += TitleBar_MouseLeftButtonDown; + + var titleSp = new StackPanel { Orientation = Orientation.Horizontal }; + titleSp.Children.Add(new TextBlock + { + Text = "\uE9D2", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 18, Foreground = accentBrush, VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0), + }); + titleSp.Children.Add(new TextBlock + { + Text = "실행 계획", FontSize = 16, FontWeight = FontWeights.Bold, + Foreground = primaryText, VerticalAlignment = VerticalAlignment.Center, + }); + titleBar.Children.Add(titleSp); + + var closeBtn = new Border + { + Width = 32, Height = 32, CornerRadius = new CornerRadius(8), + Background = Brushes.Transparent, Cursor = Cursors.Hand, + HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center, + Child = new TextBlock + { + Text = "\uE8BB", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, Foreground = secondaryText, + HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, + }, + }; + closeBtn.MouseEnter += (s, _) => ((Border)s).Background = new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + closeBtn.MouseLeave += (s, _) => ((Border)s).Background = Brushes.Transparent; + closeBtn.MouseLeftButtonUp += (_, _) => Hide(); + titleBar.Children.Add(closeBtn); + Grid.SetRow(titleBar, 0); + mainGrid.Children.Add(titleBar); + + // ── 상태 바 (진행률) ── + _statusBar = new Border + { + Visibility = Visibility.Collapsed, + Margin = new Thickness(20, 8, 20, 0), + Padding = new Thickness(12, 6, 12, 6), + CornerRadius = new CornerRadius(8), + Background = new SolidColorBrush(Color.FromArgb(0x15, + ((SolidColorBrush)accentBrush).Color.R, + ((SolidColorBrush)accentBrush).Color.G, + ((SolidColorBrush)accentBrush).Color.B)), + }; + var statusGrid = new Grid(); + _statusText = new TextBlock { Text = "실행 중...", FontSize = 12, Foreground = accentBrush, VerticalAlignment = VerticalAlignment.Center }; + statusGrid.Children.Add(_statusText); + _progressText = new TextBlock + { + Text = "", FontSize = 12, Foreground = secondaryText, + HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Center, + }; + statusGrid.Children.Add(_progressText); + _statusBar.Child = statusGrid; + Grid.SetRow(_statusBar, 1); + mainGrid.Children.Add(_statusBar); + + // ── 툴바: 모두 열기 / 모두 닫기 ── + var hoverBgTb = Application.Current.TryFindResource("ItemHoverBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + var toolBar = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(20, 6, 20, 0), + }; + + var expandAllBtn = MakeToolbarButton("\uE70D", "모두 열기", secondaryText, hoverBgTb); + expandAllBtn.MouseLeftButtonUp += (_, _) => + { + for (int i = 0; i < _steps.Count; i++) _expandedSteps.Add(i); + RenderSteps(); + }; + toolBar.Children.Add(expandAllBtn); + + var collapseAllBtn = MakeToolbarButton("\uE70E", "모두 닫기", secondaryText, hoverBgTb); + collapseAllBtn.MouseLeftButtonUp += (_, _) => { _expandedSteps.Clear(); RenderSteps(); }; + toolBar.Children.Add(collapseAllBtn); + + Grid.SetRow(toolBar, 2); + mainGrid.Children.Add(toolBar); + + // ── 컨텐츠: 단계 목록 ── + _scrollViewer = new ScrollViewer + { + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + Margin = new Thickness(16, 6, 16, 0), + Padding = new Thickness(4), + }; + _stepsPanel = new StackPanel(); + _scrollViewer.Content = _stepsPanel; + Grid.SetRow(_scrollViewer, 3); + mainGrid.Children.Add(_scrollViewer); + + // ── 하단 버튼 패널 ── + _btnPanel = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Center, + Margin = new Thickness(20, 12, 20, 16), + }; + Grid.SetRow(_btnPanel, 4); + mainGrid.Children.Add(_btnPanel); + + root.Child = mainGrid; + Content = root; + + // Win32 Resize 훅 + SourceInitialized += (_, _) => + { + var hwnd = new WindowInteropHelper(this).Handle; + var src = HwndSource.FromHwnd(hwnd); + src?.AddHook(WndProc); + }; + } + + // ════════════════════════════════════════════════════════════ + // 툴바 버튼 팩토리 + // ════════════════════════════════════════════════════════════ + + private static Border MakeToolbarButton(string icon, string label, Brush fg, Brush hoverBg) + { + var btn = new Border + { + CornerRadius = new CornerRadius(6), + Padding = new Thickness(8, 3, 8, 3), + Margin = new Thickness(0, 0, 4, 0), + Background = Brushes.Transparent, + Cursor = Cursors.Hand, + }; + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + sp.Children.Add(new TextBlock + { + Text = icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 9, Foreground = fg, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 4, 0), + }); + sp.Children.Add(new TextBlock { Text = label, FontSize = 11.5, Foreground = fg }); + btn.Child = sp; + btn.MouseEnter += (s, _) => ((Border)s).Background = hoverBg; + btn.MouseLeave += (s, _) => ((Border)s).Background = Brushes.Transparent; + return btn; + } + + // ════════════════════════════════════════════════════════════ + // 창 이동 / 리사이즈 + // ════════════════════════════════════════════════════════════ + + private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (e.ClickCount == 2) return; + try { DragMove(); } catch (Exception) { } + } + + private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + if (msg == WM_NCHITTEST) + { + var pt = PointFromScreen(new Point( + (short)(lParam.ToInt32() & 0xFFFF), + (short)(lParam.ToInt32() >> 16))); + var w = ActualWidth; + var h = ActualHeight; + + int hit = 0; + if (pt.X < ResizeGrip && pt.Y < ResizeGrip) hit = HTTOPLEFT; + else if (pt.X > w - ResizeGrip && pt.Y < ResizeGrip) hit = HTTOPRIGHT; + else if (pt.X < ResizeGrip && pt.Y > h - ResizeGrip) hit = HTBOTTOMLEFT; + else if (pt.X > w - ResizeGrip && pt.Y > h - ResizeGrip) hit = HTBOTTOMRIGHT; + else if (pt.X < ResizeGrip) hit = HTLEFT; + else if (pt.X > w - ResizeGrip) hit = HTRIGHT; + else if (pt.Y < ResizeGrip) hit = HTTOP; + else if (pt.Y > h - ResizeGrip) hit = HTBOTTOM; + + if (hit != 0) { handled = true; return (IntPtr)hit; } + } + return IntPtr.Zero; + } + + // ════════════════════════════════════════════════════════════ + // 공개 API + // ════════════════════════════════════════════════════════════ + + public Task ShowPlanAsync(string planText, List steps, TaskCompletionSource tcs) + { + _planText = planText; + _steps = steps; + _tcs = tcs; + _currentStep = -1; + _isExecuting = false; + _expandedSteps.Clear(); // 새 계획 표시 시 모두 접힌 상태로 시작 + + RenderSteps(); + BuildApprovalButtons(); + _statusBar.Visibility = Visibility.Collapsed; + + Show(); + Activate(); + return tcs.Task; + } + + public void SwitchToExecutionMode() + { + _isExecuting = true; + _statusBar.Visibility = Visibility.Visible; + _statusText.Text = "▶ 계획 실행 중..."; + _progressText.Text = $"0 / {_steps.Count}"; + BuildExecutionButtons(); + } + + public void UpdateCurrentStep(int stepIndex) + { + if (stepIndex < 0 || stepIndex >= _steps.Count) return; + _currentStep = stepIndex; + _progressText.Text = $"{stepIndex + 1} / {_steps.Count}"; + _expandedSteps.Add(stepIndex); // 현재 실행 중인 단계는 자동 펼침 + RenderSteps(); + } + + public void MarkComplete() + { + _isExecuting = false; + _statusText.Text = "✓ 계획 실행 완료"; + _statusText.Foreground = new SolidColorBrush(Color.FromRgb(0x10, 0xB9, 0x81)); + _progressText.Text = $"{_steps.Count} / {_steps.Count}"; + _currentStep = _steps.Count; + RenderSteps(); + BuildCloseButton(); + } + + public string PlanText => _planText; + public List Steps => _steps; + + // ════════════════════════════════════════════════════════════ + // 단계 목록 렌더링 + // ════════════════════════════════════════════════════════════ + + private void RenderSteps() + { + _stepsPanel.Children.Clear(); + + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + var itemBg = Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2B, 0x40)); + var hoverBg = Application.Current.TryFindResource("ItemHoverBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + + var canEdit = !_isExecuting && _currentStep < 0; // 승인 대기 중에만 편집/순서변경 가능 + + for (int i = 0; i < _steps.Count; i++) + { + var step = _steps[i]; + var capturedIdx = i; + var isComplete = i < _currentStep; + var isCurrent = i == _currentStep; + var isPending = i > _currentStep; + var isExpanded = _expandedSteps.Contains(i); + + // ─ 카드 Border ─ + var card = new Border + { + CornerRadius = new CornerRadius(10), + Padding = new Thickness(10, 7, 10, 7), + Margin = new Thickness(0, 0, 0, 5), + Background = isCurrent + ? new SolidColorBrush(Color.FromArgb(0x18, + ((SolidColorBrush)accentBrush).Color.R, + ((SolidColorBrush)accentBrush).Color.G, + ((SolidColorBrush)accentBrush).Color.B)) + : itemBg, + BorderBrush = isCurrent ? accentBrush : Brushes.Transparent, + BorderThickness = new Thickness(isCurrent ? 1.5 : 0), + AllowDrop = canEdit, + }; + + // 열기/닫기 토글 — 텍스트 또는 배경 클릭 + card.Cursor = Cursors.Hand; + card.MouseLeftButtonUp += (s, e) => + { + // 드래그 직후 클릭이 발생하는 경우 무시 + if (e.OriginalSource is Border src && src.Tag?.ToString() == "DragHandle") return; + if (_expandedSteps.Contains(capturedIdx)) _expandedSteps.Remove(capturedIdx); + else _expandedSteps.Add(capturedIdx); + RenderSteps(); + }; + + // ─ 카드 Grid: [drag?][badge][*text][chevron][edit?] ─ + var cardGrid = new Grid(); + int badgeCol = canEdit ? 1 : 0; + int textCol = canEdit ? 2 : 1; + int chevCol = canEdit ? 3 : 2; + int editCol = canEdit ? 4 : -1; + + if (canEdit) + cardGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); // drag + cardGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); // badge + cardGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); // text + cardGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); // chevron + if (canEdit) + cardGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); // edit btns + + // ── 드래그 핸들 (편집 모드 전용) ── + if (canEdit) + { + var dimColor = Color.FromArgb(0x55, 0x80, 0x80, 0x80); + var dimBrush = new SolidColorBrush(dimColor); + var dragHandle = new Border + { + Tag = "DragHandle", + Width = 20, Cursor = Cursors.SizeAll, + Background = Brushes.Transparent, + Margin = new Thickness(0, 0, 6, 0), + VerticalAlignment = VerticalAlignment.Center, + Child = new TextBlock + { + Text = "\uE8FD", // Sort/Lines 아이콘 (드래그 핸들) + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 11, + Foreground = dimBrush, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }, + }; + dragHandle.MouseEnter += (s, _) => + ((TextBlock)((Border)s).Child).Foreground = secondaryText; + dragHandle.MouseLeave += (s, _) => + ((TextBlock)((Border)s).Child).Foreground = dimBrush; + + // 드래그 시작 — 마우스 눌림 위치 기록 + dragHandle.PreviewMouseLeftButtonDown += (s, e) => + { + _dragSourceIndex = capturedIdx; + _dragStartPoint = e.GetPosition(_stepsPanel); + e.Handled = true; // 카드 클릭(expand) 이벤트 방지 + }; + // 충분히 움직이면 DragDrop 시작 + dragHandle.PreviewMouseMove += (s, e) => + { + if (_dragSourceIndex < 0 || e.LeftButton != MouseButtonState.Pressed) return; + var cur = e.GetPosition(_stepsPanel); + if (Math.Abs(cur.X - _dragStartPoint.X) > SystemParameters.MinimumHorizontalDragDistance || + Math.Abs(cur.Y - _dragStartPoint.Y) > SystemParameters.MinimumVerticalDragDistance) + { + int idx = _dragSourceIndex; + _dragSourceIndex = -1; + DragDrop.DoDragDrop((DependencyObject)s, + new DataObject(DragDataFormat, idx), DragDropEffects.Move); + // DoDragDrop 완료 후 비주얼 정리 + Dispatcher.InvokeAsync(RenderSteps); + } + }; + dragHandle.PreviewMouseLeftButtonUp += (_, _) => _dragSourceIndex = -1; + + Grid.SetColumn(dragHandle, 0); + cardGrid.Children.Add(dragHandle); + + // ── 카드 Drop 이벤트 ── + card.DragOver += (s, e) => + { + if (!e.Data.GetDataPresent(DragDataFormat)) return; + int src = (int)e.Data.GetData(DragDataFormat); + if (src != capturedIdx) + { + ((Border)s).BorderBrush = accentBrush; + ((Border)s).BorderThickness = new Thickness(1.5); + e.Effects = DragDropEffects.Move; + } + else e.Effects = DragDropEffects.None; + e.Handled = true; + }; + card.DragLeave += (s, _) => + { + bool isCurr = _currentStep == capturedIdx; + ((Border)s).BorderBrush = isCurr ? accentBrush : Brushes.Transparent; + ((Border)s).BorderThickness = new Thickness(isCurr ? 1.5 : 0); + }; + card.Drop += (s, e) => + { + if (!e.Data.GetDataPresent(DragDataFormat)) { e.Handled = true; return; } + int srcIdx = (int)e.Data.GetData(DragDataFormat); + int dstIdx = capturedIdx; + if (srcIdx != dstIdx && srcIdx >= 0 && srcIdx < _steps.Count) + { + var item = _steps[srcIdx]; + _steps.RemoveAt(srcIdx); + // srcIdx < dstIdx 이면 제거 후 인덱스가 1 감소 + int insertAt = srcIdx < dstIdx ? dstIdx - 1 : dstIdx; + _steps.Insert(insertAt, item); + _expandedSteps.Clear(); + RenderSteps(); + } + e.Handled = true; + }; + } + + // ── 상태 배지 ── + UIElement badge; + if (isComplete) + { + badge = new TextBlock + { + Text = "\uE73E", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 13, Foreground = new SolidColorBrush(Color.FromRgb(0x10, 0xB9, 0x81)), + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 10, 0), + Width = 20, TextAlignment = TextAlignment.Center, + }; + } + else if (isCurrent) + { + badge = new TextBlock + { + Text = "\uE768", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 13, Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 10, 0), + Width = 20, TextAlignment = TextAlignment.Center, + }; + } + else + { + badge = new Border + { + Width = 22, Height = 22, CornerRadius = new CornerRadius(11), + Background = new SolidColorBrush(Color.FromArgb(0x25, 0x80, 0x80, 0x80)), + Margin = new Thickness(0, 0, 10, 0), VerticalAlignment = VerticalAlignment.Center, + Child = new TextBlock + { + Text = $"{i + 1}", FontSize = 11, Foreground = secondaryText, + FontWeight = FontWeights.SemiBold, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }, + }; + } + Grid.SetColumn(badge, badgeCol); + cardGrid.Children.Add(badge); + + // ── 단계 텍스트 ── + var textBlock = new TextBlock + { + Text = step, + FontSize = 13, + Foreground = isComplete ? secondaryText : primaryText, + VerticalAlignment = VerticalAlignment.Center, + Opacity = isPending && _isExecuting ? 0.6 : 1.0, + TextDecorations = isComplete ? TextDecorations.Strikethrough : null, + Margin = new Thickness(0, 0, 4, 0), + }; + if (isExpanded) + { + textBlock.TextWrapping = TextWrapping.Wrap; + textBlock.TextTrimming = TextTrimming.None; + } + else + { + textBlock.TextWrapping = TextWrapping.NoWrap; + textBlock.TextTrimming = TextTrimming.CharacterEllipsis; + textBlock.ToolTip = step; // 접힌 상태: 호버 시 전체 텍스트 툴팁 + } + Grid.SetColumn(textBlock, textCol); + cardGrid.Children.Add(textBlock); + + // ── 펼침/접힘 Chevron ── + var chevron = new Border + { + Width = 22, Height = 22, CornerRadius = new CornerRadius(4), + Background = Brushes.Transparent, Cursor = Cursors.Hand, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, canEdit ? 4 : 0, 0), + Child = new TextBlock + { + Text = isExpanded ? "\uE70E" : "\uE70D", // ChevronUp / ChevronDown + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 9, + Foreground = new SolidColorBrush(Color.FromArgb(0x70, 0x80, 0x80, 0x80)), + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }, + }; + chevron.MouseEnter += (s, _) => ((Border)s).Background = hoverBg; + chevron.MouseLeave += (s, _) => ((Border)s).Background = Brushes.Transparent; + chevron.MouseLeftButtonUp += (_, e) => + { + if (_expandedSteps.Contains(capturedIdx)) _expandedSteps.Remove(capturedIdx); + else _expandedSteps.Add(capturedIdx); + RenderSteps(); + e.Handled = true; + }; + Grid.SetColumn(chevron, chevCol); + cardGrid.Children.Add(chevron); + + // ── 편집 버튼 (위/아래/편집/삭제) ── + if (canEdit) + { + var editBtnPanel = new StackPanel + { + Orientation = Orientation.Horizontal, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(2, 0, 0, 0), + }; + + if (i > 0) + { + var upBtn = CreateMiniButton("\uE70E", secondaryText, hoverBg); + upBtn.ToolTip = "위로 이동"; + upBtn.MouseLeftButtonUp += (_, e) => { SwapSteps(capturedIdx, capturedIdx - 1); e.Handled = true; }; + editBtnPanel.Children.Add(upBtn); + } + if (i < _steps.Count - 1) + { + var downBtn = CreateMiniButton("\uE70D", secondaryText, hoverBg); + downBtn.ToolTip = "아래로 이동"; + downBtn.MouseLeftButtonUp += (_, e) => { SwapSteps(capturedIdx, capturedIdx + 1); e.Handled = true; }; + editBtnPanel.Children.Add(downBtn); + } + + var editBtn = CreateMiniButton("\uE70F", accentBrush, hoverBg); + editBtn.ToolTip = "편집"; + editBtn.MouseLeftButtonUp += (_, e) => { EditStep(capturedIdx); e.Handled = true; }; + editBtnPanel.Children.Add(editBtn); + + var delBtn = CreateMiniButton("\uE74D", new SolidColorBrush(Color.FromRgb(0xDC, 0x26, 0x26)), hoverBg); + delBtn.ToolTip = "삭제"; + delBtn.MouseLeftButtonUp += (_, e) => + { + if (_steps.Count > 1) + { + _steps.RemoveAt(capturedIdx); + _expandedSteps.Remove(capturedIdx); + RenderSteps(); + } + e.Handled = true; + }; + editBtnPanel.Children.Add(delBtn); + + Grid.SetColumn(editBtnPanel, editCol); + cardGrid.Children.Add(editBtnPanel); + } + + card.Child = cardGrid; + _stepsPanel.Children.Add(card); + } + + // ── 단계 추가 버튼 (편집 모드) ── + if (canEdit) + { + var st2 = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var hb2 = Application.Current.TryFindResource("ItemHoverBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + var addBtn = new Border + { + CornerRadius = new CornerRadius(10), + Padding = new Thickness(14, 8, 14, 8), + Margin = new Thickness(0, 4, 0, 0), + Background = Brushes.Transparent, + BorderBrush = new SolidColorBrush(Color.FromArgb(0x30, 0x80, 0x80, 0x80)), + BorderThickness = new Thickness(1), + Cursor = Cursors.Hand, + }; + var addSp = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Center }; + addSp.Children.Add(new TextBlock + { + Text = "\uE710", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, Foreground = st2, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 6, 0), + }); + addSp.Children.Add(new TextBlock { Text = "단계 추가", FontSize = 12, Foreground = st2 }); + addBtn.Child = addSp; + addBtn.MouseEnter += (s, _) => ((Border)s).Background = hb2; + addBtn.MouseLeave += (s, _) => ((Border)s).Background = Brushes.Transparent; + addBtn.MouseLeftButtonUp += (_, _) => + { + _steps.Add("새 단계"); + RenderSteps(); + EditStep(_steps.Count - 1); + }; + _stepsPanel.Children.Add(addBtn); + } + + // 현재 단계로 자동 스크롤 + if (_currentStep >= 0 && _stepsPanel.Children.Count > _currentStep) + { + _stepsPanel.UpdateLayout(); + var target = (FrameworkElement)_stepsPanel.Children[Math.Min(_currentStep, _stepsPanel.Children.Count - 1)]; + target.BringIntoView(); + } + } + + // ════════════════════════════════════════════════════════════ + // 단계 편집 / 교환 + // ════════════════════════════════════════════════════════════ + + private void SwapSteps(int a, int b) + { + if (a < 0 || b < 0 || a >= _steps.Count || b >= _steps.Count) return; + (_steps[a], _steps[b]) = (_steps[b], _steps[a]); + RenderSteps(); + } + + private void EditStep(int index) + { + if (index < 0 || index >= _steps.Count) return; + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var itemBg = Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2B, 0x40)); + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + + if (index >= _stepsPanel.Children.Count) return; + + var editCard = new Border + { + CornerRadius = new CornerRadius(10), + Padding = new Thickness(10, 8, 10, 8), + Margin = new Thickness(0, 0, 0, 5), + Background = itemBg, + BorderBrush = accentBrush, + BorderThickness = new Thickness(1.5), + }; + + var textBox = new TextBox + { + Text = _steps[index], + FontSize = 13, + Background = Brushes.Transparent, + Foreground = primaryText, + CaretBrush = primaryText, + BorderThickness = new Thickness(0), + AcceptsReturn = false, + TextWrapping = TextWrapping.Wrap, + Padding = new Thickness(4), + }; + + var capturedIdx = index; + textBox.KeyDown += (_, e) => + { + if (e.Key == Key.Enter) { _steps[capturedIdx] = textBox.Text.Trim(); RenderSteps(); e.Handled = true; } + if (e.Key == Key.Escape) { RenderSteps(); e.Handled = true; } + }; + textBox.LostFocus += (_, _) => { _steps[capturedIdx] = textBox.Text.Trim(); RenderSteps(); }; + + editCard.Child = textBox; + _stepsPanel.Children[index] = editCard; + textBox.Focus(); + textBox.SelectAll(); + } + + // ════════════════════════════════════════════════════════════ + // 하단 버튼 빌드 + // ════════════════════════════════════════════════════════════ + + private void BuildApprovalButtons() + { + _btnPanel.Children.Clear(); + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + + var approveBtn = CreateActionButton("\uE73E", "승인", accentBrush, Brushes.White, true); + approveBtn.MouseLeftButtonUp += (_, _) => + { + _tcs?.TrySetResult(null); + SwitchToExecutionMode(); + }; + _btnPanel.Children.Add(approveBtn); + + var editBtn = CreateActionButton("\uE70F", "수정 요청", accentBrush, accentBrush, false); + editBtn.MouseLeftButtonUp += (_, _) => ShowEditInput(); + _btnPanel.Children.Add(editBtn); + + var reconfirmBtn = CreateActionButton("\uE72C", "재확인", + Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White, false); + reconfirmBtn.MouseLeftButtonUp += (_, _) => + _tcs?.TrySetResult("계획을 다시 검토하고 더 구체적으로 수정해주세요."); + _btnPanel.Children.Add(reconfirmBtn); + + var cancelBrush = new SolidColorBrush(Color.FromRgb(0xDC, 0x26, 0x26)); + var cancelBtn = CreateActionButton("\uE711", "취소", cancelBrush, cancelBrush, false); + cancelBtn.MouseLeftButtonUp += (_, _) => { _tcs?.TrySetResult("취소"); Hide(); }; + _btnPanel.Children.Add(cancelBtn); + } + + private void BuildExecutionButtons() + { + _btnPanel.Children.Clear(); + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var hideBtn = CreateActionButton("\uE921", "숨기기", secondaryText, + Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White, false); + hideBtn.MouseLeftButtonUp += (_, _) => Hide(); + _btnPanel.Children.Add(hideBtn); + } + + private void BuildCloseButton() + { + _btnPanel.Children.Clear(); + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + var closeBtn = CreateActionButton("\uE73E", "닫기", accentBrush, Brushes.White, true); + closeBtn.MouseLeftButtonUp += (_, _) => Hide(); + _btnPanel.Children.Add(closeBtn); + } + + private void ShowEditInput() + { + var editPanel = new Border + { + Margin = new Thickness(20, 0, 20, 12), + Padding = new Thickness(12, 8, 12, 8), + CornerRadius = new CornerRadius(10), + Background = Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2B, 0x40)), + }; + var editStack = new StackPanel(); + editStack.Children.Add(new TextBlock + { + Text = "수정 사항을 입력하세요:", + FontSize = 11.5, + Foreground = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + Margin = new Thickness(0, 0, 0, 6), + }); + var textBox = new TextBox + { + MinHeight = 44, + MaxHeight = 120, + AcceptsReturn = true, + TextWrapping = TextWrapping.Wrap, + FontSize = 13, + Background = Application.Current.TryFindResource("LauncherBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)), + Foreground = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White, + CaretBrush = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White, + BorderBrush = Application.Current.TryFindResource("BorderColor") as Brush ?? Brushes.Gray, + BorderThickness = new Thickness(1), + Padding = new Thickness(10, 8, 10, 8), + }; + editStack.Children.Add(textBox); + + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + var sendBtn = new Border + { + Background = accentBrush, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(14, 6, 14, 6), + Margin = new Thickness(0, 8, 0, 0), + Cursor = Cursors.Hand, + HorizontalAlignment = HorizontalAlignment.Right, + Child = new TextBlock + { + Text = "전송", FontSize = 12.5, FontWeight = FontWeights.SemiBold, Foreground = Brushes.White, + }, + }; + sendBtn.MouseEnter += (s, _) => ((Border)s).Opacity = 0.85; + sendBtn.MouseLeave += (s, _) => ((Border)s).Opacity = 1.0; + sendBtn.MouseLeftButtonUp += (_, _) => + { + var feedback = textBox.Text.Trim(); + if (string.IsNullOrEmpty(feedback)) return; + _tcs?.TrySetResult(feedback); + }; + editStack.Children.Add(sendBtn); + editPanel.Child = editStack; + + if (_btnPanel.Parent is Grid parentGrid) + { + for (int i = parentGrid.Children.Count - 1; i >= 0; i--) + { + if (parentGrid.Children[i] is Border b && b.Tag?.ToString() == "EditPanel") + parentGrid.Children.RemoveAt(i); + } + editPanel.Tag = "EditPanel"; + Grid.SetRow(editPanel, 4); // row 4 = 하단 버튼 행 (toolBar 추가로 1 증가) + parentGrid.Children.Add(editPanel); + _btnPanel.Margin = new Thickness(20, 0, 20, 16); + textBox.Focus(); + } + } + + // ════════════════════════════════════════════════════════════ + // 공통 버튼 팩토리 + // ════════════════════════════════════════════════════════════ + + private static Border CreateMiniButton(string icon, Brush fg, Brush hoverBg) + { + var btn = new Border + { + Width = 24, Height = 24, + CornerRadius = new CornerRadius(6), + Background = Brushes.Transparent, + Cursor = Cursors.Hand, + Margin = new Thickness(1, 0, 1, 0), + Child = new TextBlock + { + Text = icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 10, Foreground = fg, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }, + }; + btn.MouseEnter += (s, _) => ((Border)s).Background = hoverBg; + btn.MouseLeave += (s, _) => ((Border)s).Background = Brushes.Transparent; + return btn; + } + + private static Border CreateActionButton(string icon, string text, Brush borderColor, + Brush textColor, bool filled) + { + var color = ((SolidColorBrush)borderColor).Color; + var btn = new Border + { + CornerRadius = new CornerRadius(12), + Padding = new Thickness(16, 8, 16, 8), + Margin = new Thickness(4, 0, 4, 0), + Cursor = Cursors.Hand, + Background = filled ? borderColor + : new SolidColorBrush(Color.FromArgb(0x18, color.R, color.G, color.B)), + BorderBrush = filled ? Brushes.Transparent + : new SolidColorBrush(Color.FromArgb(0x80, color.R, color.G, color.B)), + BorderThickness = new Thickness(filled ? 0 : 1.2), + }; + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + sp.Children.Add(new TextBlock + { + Text = icon, FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, Foreground = filled ? Brushes.White : textColor, + VerticalAlignment = VerticalAlignment.Center, Margin = new Thickness(0, 0, 6, 0), + }); + sp.Children.Add(new TextBlock + { + Text = text, FontSize = 12.5, FontWeight = FontWeights.SemiBold, + Foreground = filled ? Brushes.White : textColor, + }); + btn.Child = sp; + btn.MouseEnter += (s, _) => ((Border)s).Opacity = 0.85; + btn.MouseLeave += (s, _) => ((Border)s).Opacity = 1.0; + return btn; + } +} diff --git a/src/AxCopilot/Views/PopupMenuHelper.cs b/src/AxCopilot/Views/PopupMenuHelper.cs new file mode 100644 index 0000000..0ca2a09 --- /dev/null +++ b/src/AxCopilot/Views/PopupMenuHelper.cs @@ -0,0 +1,186 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Effects; + +namespace AxCopilot.Views; + +/// +/// Phase 34: 커스텀 팝업 메뉴 생성 헬퍼. +/// ChatWindow에서 6회 이상 반복되는 Popup+Border+StackPanel 패턴을 통합합니다. +/// +/// 사용법: +/// +/// var (popup, stack) = PopupMenuHelper.Create(targetElement, this, minWidth: 240); +/// stack.Children.Add(PopupMenuHelper.MenuItem("항목", fg, hoverBg, () => { ... popup.IsOpen = false; })); +/// popup.IsOpen = true; +/// +/// +public static class PopupMenuHelper +{ + /// + /// 테마 적용된 팝업 메뉴 (Popup + 라운드 Border + ScrollViewer + StackPanel)를 생성합니다. + /// + /// 팝업의 PlacementTarget + /// 테마 리소스 조회용 FrameworkElement + /// 배치 모드 (기본: Top) + /// 최소 너비 (기본: 220) + /// 최대 높이 (기본: 460) + /// (Popup, 내부 StackPanel) 튜플 + public static (Popup Popup, StackPanel Stack) Create( + UIElement target, + FrameworkElement owner, + PlacementMode placement = PlacementMode.Top, + double minWidth = 220, + double maxHeight = 460) + { + var bg = ThemeResourceHelper.Background(owner); + var border = ThemeResourceHelper.Border(owner); + + var popup = new Popup + { + StaysOpen = false, + AllowsTransparency = true, + PopupAnimation = PopupAnimation.Fade, + PlacementTarget = target, + Placement = placement, + }; + + var container = new Border + { + Background = bg, + BorderBrush = border, + BorderThickness = new Thickness(1), + CornerRadius = new CornerRadius(12), + Padding = new Thickness(6), + MinWidth = minWidth, + MaxHeight = maxHeight, + Effect = new DropShadowEffect + { + BlurRadius = 16, + ShadowDepth = 4, + Opacity = 0.3, + Color = Colors.Black, + }, + }; + + var scroll = new ScrollViewer + { + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + MaxHeight = maxHeight - 20, + }; + + var stack = new StackPanel(); + scroll.Content = stack; + container.Child = scroll; + popup.Child = container; + + return (popup, stack); + } + + /// + /// 팝업 메뉴 항목 (Border + Grid: 텍스트 + 체크 아이콘)을 생성합니다. + /// + public static Border MenuItem( + string text, + Brush foreground, + Brush hoverBackground, + Action? onClick = null, + bool isChecked = false, + string? icon = null, + Brush? iconColor = null, + double fontSize = 13) + { + var item = new Border + { + Background = Brushes.Transparent, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(10, 7, 10, 7), + Margin = new Thickness(0, 1, 0, 1), + Cursor = Cursors.Hand, + }; + + var grid = new Grid(); + // 아이콘 열 (옵션) + if (!string.IsNullOrEmpty(icon)) + { + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(24) }); + var iconTb = new TextBlock + { + Text = icon, + FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 13, + Foreground = iconColor ?? foreground, + VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(iconTb, 0); + grid.Children.Add(iconTb); + } + + // 텍스트 열 + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + var textTb = new TextBlock + { + Text = text, + FontSize = fontSize, + Foreground = foreground, + VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(textTb, string.IsNullOrEmpty(icon) ? 0 : 1); + grid.Children.Add(textTb); + + // 체크 아이콘 열 + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(20) }); + if (isChecked) + { + var check = new TextBlock + { + Text = "\uE73E", + FontFamily = ThemeResourceHelper.SegoeMdl2, + FontSize = 12, + Foreground = ThemeResourceHelper.Brush("AccentColor", Brushes.DodgerBlue), + VerticalAlignment = VerticalAlignment.Center, + HorizontalAlignment = HorizontalAlignment.Right, + }; + Grid.SetColumn(check, string.IsNullOrEmpty(icon) ? 1 : 2); + grid.Children.Add(check); + } + + item.Child = grid; + + // 호버 효과 + item.MouseEnter += (_, _) => item.Background = hoverBackground; + item.MouseLeave += (_, _) => item.Background = Brushes.Transparent; + + if (onClick != null) + item.MouseLeftButtonUp += (_, _) => onClick(); + + return item; + } + + /// 구분선을 생성합니다. + public static Border Separator(Brush? color = null) + { + return new Border + { + Height = 1, + Background = color ?? ThemeResourceHelper.Brush("SeparatorColor", Brushes.Gray), + Margin = new Thickness(8, 4, 8, 4), + }; + } + + /// 섹션 제목을 생성합니다. + public static TextBlock SectionHeader(string text, Brush? foreground = null) + { + return new TextBlock + { + Text = text, + FontSize = 11, + FontWeight = FontWeights.SemiBold, + Foreground = foreground ?? ThemeResourceHelper.Brush("SecondaryText", Brushes.Gray), + Margin = new Thickness(10, 8, 10, 4), + }; + } +} diff --git a/src/AxCopilot/Views/PreviewWindow.xaml b/src/AxCopilot/Views/PreviewWindow.xaml new file mode 100644 index 0000000..d98572f --- /dev/null +++ b/src/AxCopilot/Views/PreviewWindow.xaml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/PreviewWindow.xaml.cs b/src/AxCopilot/Views/PreviewWindow.xaml.cs new file mode 100644 index 0000000..f2f42db --- /dev/null +++ b/src/AxCopilot/Views/PreviewWindow.xaml.cs @@ -0,0 +1,505 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Interop; +using System.Windows.Media; +using Microsoft.Web.WebView2.Core; + +namespace AxCopilot.Views; + +/// 파일 미리보기 별도 창. WebView2 HWND airspace 문제를 근본적으로 회피합니다. +public partial class PreviewWindow : Window +{ + private static PreviewWindow? _instance; + + private readonly List _tabs = new(); + private string? _activeTab; + private bool _webViewInitialized; + private string? _selectedMood; + + private static readonly string WebView2DataFolder = + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "WebView2_Preview"); + + private static readonly HashSet PreviewableExtensions = new(StringComparer.OrdinalIgnoreCase) + { + ".html", ".htm", ".md", ".csv", ".txt", ".json", ".xml", ".log", + }; + + public PreviewWindow() + { + InitializeComponent(); + Loaded += OnLoaded; + SourceInitialized += OnSourceInitialized; + KeyDown += (_, e) => { if (e.Key == Key.Escape) Close(); }; + StateChanged += (_, _) => + { + MaxBtnIcon.Text = WindowState == WindowState.Maximized ? "\uE923" : "\uE922"; + }; + Closed += (_, _) => _instance = null; + } + + // ─── 상하좌우 리사이즈 (WindowStyle=None 대응) ───────────── + [DllImport("user32.dll")] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + + private const int WM_NCHITTEST = 0x0084; + private const int HTLEFT = 10, HTRIGHT = 11, HTTOP = 12, HTTOPLEFT = 13, HTTOPRIGHT = 14; + private const int HTBOTTOM = 15, HTBOTTOMLEFT = 16, HTBOTTOMRIGHT = 17; + + private void OnSourceInitialized(object? sender, EventArgs e) + { + var hwndSource = (HwndSource)PresentationSource.FromVisual(this); + hwndSource?.AddHook(WndProc); + } + + private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + if (msg == WM_NCHITTEST) + { + var pt = PointFromScreen(new Point( + (short)(lParam.ToInt32() & 0xFFFF), + (short)((lParam.ToInt32() >> 16) & 0xFFFF))); + const double grip = 8; // 리사이즈 가능 영역 (px) + var w = ActualWidth; + var h = ActualHeight; + + if (pt.X < grip && pt.Y < grip) { handled = true; return (IntPtr)HTTOPLEFT; } + if (pt.X > w - grip && pt.Y < grip) { handled = true; return (IntPtr)HTTOPRIGHT; } + if (pt.X < grip && pt.Y > h - grip) { handled = true; return (IntPtr)HTBOTTOMLEFT; } + if (pt.X > w - grip && pt.Y > h - grip) { handled = true; return (IntPtr)HTBOTTOMRIGHT; } + if (pt.X < grip) { handled = true; return (IntPtr)HTLEFT; } + if (pt.X > w - grip) { handled = true; return (IntPtr)HTRIGHT; } + if (pt.Y < grip) { handled = true; return (IntPtr)HTTOP; } + if (pt.Y > h - grip) { handled = true; return (IntPtr)HTBOTTOM; } + } + return IntPtr.Zero; + } + + // ─── 싱글턴 팩토리 ────────────────────────────────────────── + + /// 파일을 미리보기 창에 표시합니다. 이미 열려 있으면 탭을 추가합니다. + public static void ShowPreview(string filePath, string? mood = null) + { + if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) + return; + + var ext = Path.GetExtension(filePath).ToLowerInvariant(); + if (!PreviewableExtensions.Contains(ext)) + return; + + Application.Current.Dispatcher.Invoke(() => + { + if (_instance == null || !_instance.IsLoaded) + { + _instance = new PreviewWindow(); + // 부모 창의 테마 리소스 전달 + var mainWindow = Application.Current.MainWindow; + if (mainWindow != null) + { + foreach (var dict in mainWindow.Resources.MergedDictionaries) + _instance.Resources.MergedDictionaries.Add(dict); + } + _instance._selectedMood = mood; + _instance.Show(); + } + + _instance.AddTab(filePath); + _instance.Activate(); + }); + } + + /// 이미 열린 파일의 콘텐츠만 새로고침합니다. 활성 탭이 아닌 파일도 탭 목록에 있으면 활성 탭으로 전환 후 새로고침. + public static void RefreshIfOpen(string filePath) + { + if (_instance == null || !_instance.IsLoaded) return; + Application.Current.Dispatcher.Invoke(() => + { + // 현재 활성 탭이면 즉시 새로고침 + if (_instance._activeTab != null && + string.Equals(_instance._activeTab, filePath, StringComparison.OrdinalIgnoreCase)) + { + _instance.LoadContent(filePath); + return; + } + + // 탭 목록에 있으면 해당 탭으로 전환 후 새로고침 + var existing = _instance._tabs.FirstOrDefault( + t => string.Equals(t, filePath, StringComparison.OrdinalIgnoreCase)); + if (existing != null) + { + _instance._activeTab = existing; + _instance.LoadContent(existing); + _instance.RebuildTabs(); + } + }); + } + + /// 현재 미리보기 창이 열려 있는지 반환합니다. + public static bool IsOpen => _instance != null && _instance.IsLoaded; + + // ─── 초기화 ───────────────────────────────────────────────── + + private async void OnLoaded(object sender, RoutedEventArgs e) + { + try + { + var env = await CoreWebView2Environment.CreateAsync( + userDataFolder: WebView2DataFolder); + await PreviewBrowser.EnsureCoreWebView2Async(env); + _webViewInitialized = true; + + // 대기 중인 콘텐츠 로드 + if (_activeTab != null) + LoadContent(_activeTab); + } + catch (Exception ex) + { + Services.LogService.Warn($"PreviewWindow WebView2 초기화 실패: {ex.Message}"); + } + } + + // ─── 탭 관리 ──────────────────────────────────────────────── + + private void AddTab(string filePath) + { + if (!_tabs.Contains(filePath, StringComparer.OrdinalIgnoreCase)) + _tabs.Add(filePath); + + _activeTab = filePath; + RebuildTabs(); + LoadContent(filePath); + } + + private void CloseTab(string filePath) + { + _tabs.RemoveAll(t => string.Equals(t, filePath, StringComparison.OrdinalIgnoreCase)); + + if (_tabs.Count == 0) + { + Close(); + return; + } + + if (string.Equals(_activeTab, filePath, StringComparison.OrdinalIgnoreCase)) + { + _activeTab = _tabs[^1]; + LoadContent(_activeTab); + } + + RebuildTabs(); + } + + private void RebuildTabs() + { + TabPanel.Children.Clear(); + + var accentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.CornflowerBlue; + var secondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var primaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var borderBrush = TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + + foreach (var tabPath in _tabs) + { + var fileName = Path.GetFileName(tabPath); + var isActive = string.Equals(tabPath, _activeTab, StringComparison.OrdinalIgnoreCase); + + var tabBorder = new Border + { + Background = Brushes.Transparent, + BorderBrush = isActive ? accentBrush : Brushes.Transparent, + BorderThickness = new Thickness(0, 0, 0, isActive ? 2 : 0), + Padding = new Thickness(10, 6, 6, 6), + Cursor = Cursors.Hand, + MaxWidth = _tabs.Count <= 3 ? 220 : (_tabs.Count <= 5 ? 160 : 110), + }; + + var tabContent = new StackPanel { Orientation = Orientation.Horizontal }; + + tabContent.Children.Add(new TextBlock + { + Text = fileName, + FontSize = 11.5, + Foreground = isActive ? primaryText : secondaryText, + FontWeight = isActive ? FontWeights.SemiBold : FontWeights.Normal, + VerticalAlignment = VerticalAlignment.Center, + TextTrimming = TextTrimming.CharacterEllipsis, + MaxWidth = tabBorder.MaxWidth - 36, + ToolTip = tabPath, + }); + + // 닫기 버튼 + var closePath = tabPath; + var closeBtn = new Border + { + Background = Brushes.Transparent, + CornerRadius = new CornerRadius(3), + Padding = new Thickness(4, 2, 4, 2), + Margin = new Thickness(6, 0, 0, 0), + Cursor = Cursors.Hand, + VerticalAlignment = VerticalAlignment.Center, + Child = new TextBlock + { + Text = "\uE711", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 8, + Foreground = secondaryText, + VerticalAlignment = VerticalAlignment.Center, + }, + }; + closeBtn.MouseEnter += (s, _) => + { + if (s is Border b) + b.Background = new SolidColorBrush(Color.FromArgb(0x30, 0xFF, 0x50, 0x50)); + }; + closeBtn.MouseLeave += (s, _) => + { + if (s is Border b) b.Background = Brushes.Transparent; + }; + closeBtn.MouseLeftButtonUp += (_, me) => + { + me.Handled = true; + CloseTab(closePath); + }; + + tabContent.Children.Add(closeBtn); + tabBorder.Child = tabContent; + + // 탭 클릭 → 활성화 + var clickPath = tabPath; + tabBorder.MouseLeftButtonUp += (_, me) => + { + if (me.Handled) return; + me.Handled = true; + _activeTab = clickPath; + RebuildTabs(); + LoadContent(clickPath); + }; + + // 호버 효과 + tabBorder.MouseEnter += (s, _) => + { + if (s is Border b && !string.Equals(clickPath, _activeTab, StringComparison.OrdinalIgnoreCase)) + b.Background = new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + }; + tabBorder.MouseLeave += (s, _) => + { + if (s is Border b) b.Background = Brushes.Transparent; + }; + + TabPanel.Children.Add(tabBorder); + + // 구분선 + if (tabPath != _tabs[^1]) + { + TabPanel.Children.Add(new Border + { + Width = 1, Height = 14, + Background = borderBrush, + Margin = new Thickness(2, 0, 2, 0), + VerticalAlignment = VerticalAlignment.Center, + }); + } + } + + // 타이틀 업데이트 + if (_activeTab != null) + TitleText.Text = $"미리보기 — {Path.GetFileName(_activeTab)}"; + } + + // ─── 콘텐츠 로드 ──────────────────────────────────────────── + + private async void LoadContent(string filePath) + { + var ext = Path.GetExtension(filePath).ToLowerInvariant(); + + PreviewBrowser.Visibility = Visibility.Collapsed; + TextScroll.Visibility = Visibility.Collapsed; + DataGridContent.Visibility = Visibility.Collapsed; + EmptyMessage.Visibility = Visibility.Collapsed; + + if (!File.Exists(filePath)) + { + EmptyMessage.Text = "파일을 찾을 수 없습니다"; + EmptyMessage.Visibility = Visibility.Visible; + return; + } + + try + { + switch (ext) + { + case ".html": + case ".htm": + if (!_webViewInitialized) return; // OnLoaded에서 재시도 + PreviewBrowser.Source = new Uri(filePath); + PreviewBrowser.Visibility = Visibility.Visible; + break; + + case ".csv": + LoadCsvContent(filePath); + DataGridContent.Visibility = Visibility.Visible; + break; + + case ".md": + if (!_webViewInitialized) return; + var mdText = File.ReadAllText(filePath); + if (mdText.Length > 50000) mdText = mdText[..50000]; + var mdHtml = Services.Agent.TemplateService.RenderMarkdownToHtml( + mdText, _selectedMood ?? "modern"); + PreviewBrowser.NavigateToString(mdHtml); + PreviewBrowser.Visibility = Visibility.Visible; + break; + + case ".txt": + case ".json": + case ".xml": + case ".log": + var text = File.ReadAllText(filePath); + if (text.Length > 50000) text = text[..50000] + "\n\n... (이후 생략)"; + TextContent.Text = text; + TextScroll.Visibility = Visibility.Visible; + break; + + default: + EmptyMessage.Text = "미리보기할 수 없는 파일 형식입니다"; + EmptyMessage.Visibility = Visibility.Visible; + break; + } + } + catch (Exception ex) + { + TextContent.Text = $"미리보기 오류: {ex.Message}"; + TextScroll.Visibility = Visibility.Visible; + } + + await System.Threading.Tasks.Task.CompletedTask; // async 경고 방지 + } + + private void LoadCsvContent(string filePath) + { + var lines = File.ReadAllLines(filePath); + if (lines.Length == 0) return; + + var dt = new DataTable(); + var headers = ParseCsvLine(lines[0]); + foreach (var h in headers) + dt.Columns.Add(h); + + var maxRows = Math.Min(lines.Length, 501); + for (int i = 1; i < maxRows; i++) + { + var vals = ParseCsvLine(lines[i]); + var row = dt.NewRow(); + for (int j = 0; j < Math.Min(vals.Length, headers.Length); j++) + row[j] = vals[j]; + dt.Rows.Add(row); + } + + DataGridContent.ItemsSource = dt.DefaultView; + } + + private static string[] ParseCsvLine(string line) + { + var fields = new List(); + var current = new StringBuilder(); + bool inQuotes = false; + + for (int i = 0; i < line.Length; i++) + { + char c = line[i]; + if (inQuotes) + { + if (c == '"' && i + 1 < line.Length && line[i + 1] == '"') + { current.Append('"'); i++; } + else if (c == '"') inQuotes = false; + else current.Append(c); + } + else + { + if (c == '"') inQuotes = true; + else if (c == ',') { fields.Add(current.ToString()); current.Clear(); } + else current.Append(c); + } + } + fields.Add(current.ToString()); + return fields.ToArray(); + } + + // ─── 타이틀 바 ────────────────────────────────────────────── + + private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (e.ClickCount == 2) { ToggleMaximize(); return; } + DragMove(); + } + + private void OpenExternalBtn_Click(object sender, MouseButtonEventArgs e) + { + e.Handled = true; + if (_activeTab == null || !File.Exists(_activeTab)) return; + try + { + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo + { + FileName = _activeTab, + UseShellExecute = true, + }); + } + catch (Exception ex) + { + Services.LogService.Warn($"외부 프로그램 열기 실패: {ex.Message}"); + } + } + + private void MinBtn_Click(object sender, MouseButtonEventArgs e) + { + e.Handled = true; + WindowState = WindowState.Minimized; + } + + private void MaxBtn_Click(object sender, MouseButtonEventArgs e) + { + e.Handled = true; + ToggleMaximize(); + } + + private void CloseBtn_Click(object sender, MouseButtonEventArgs e) + { + e.Handled = true; + Close(); + } + + private void ToggleMaximize() + { + WindowState = WindowState == WindowState.Maximized + ? WindowState.Normal + : WindowState.Maximized; + } + + private void TitleBtn_Enter(object sender, MouseEventArgs e) + { + if (sender is Border b) + b.Background = TryFindResource("ItemHoverBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + } + + private void CloseBtnEnter(object sender, MouseEventArgs e) + { + if (sender is Border b) + b.Background = new SolidColorBrush(Color.FromArgb(0x44, 0xFF, 0x40, 0x40)); + } + + private void TitleBtn_Leave(object sender, MouseEventArgs e) + { + if (sender is Border b) + b.Background = Brushes.Transparent; + } +} diff --git a/src/AxCopilot/Views/PromptTemplateDialog.cs b/src/AxCopilot/Views/PromptTemplateDialog.cs new file mode 100644 index 0000000..3f3467e --- /dev/null +++ b/src/AxCopilot/Views/PromptTemplateDialog.cs @@ -0,0 +1,244 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Shapes; + +namespace AxCopilot.Views; + +/// 프롬프트 템플릿 추가/편집 다이얼로그. +internal sealed class PromptTemplateDialog : Window +{ + private readonly TextBox _nameBox; + private readonly TextBox _contentBox; + + public string TemplateName => _nameBox.Text.Trim(); + public string TemplateContent => _contentBox.Text.Trim(); + + public PromptTemplateDialog(string existingName = "", string existingContent = "") + { + bool isEdit = !string.IsNullOrEmpty(existingName); + Title = isEdit ? "템플릿 편집" : "템플릿 추가"; + Width = 480; + SizeToContent = SizeToContent.Height; + WindowStartupLocation = WindowStartupLocation.CenterOwner; + ResizeMode = ResizeMode.NoResize; + WindowStyle = WindowStyle.None; + AllowsTransparency = true; + Background = Brushes.Transparent; + + var bgBrush = Application.Current.TryFindResource("LauncherBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)); + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush ?? Brushes.Blue; + var itemBg = Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2B, 0x40)); + var borderBrush = Application.Current.TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + + // 루트 컨테이너 + var root = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(16), + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Padding = new Thickness(28, 24, 28, 24), + Effect = new System.Windows.Media.Effects.DropShadowEffect + { + BlurRadius = 24, + ShadowDepth = 4, + Opacity = 0.3, + Color = Colors.Black, + }, + }; + + var stack = new StackPanel(); + + // 헤더 + var header = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 0, 0, 20) }; + header.Children.Add(new TextBlock + { + Text = "\uE8A5", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 18, + Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0), + }); + header.Children.Add(new TextBlock + { + Text = isEdit ? "템플릿 편집" : "새 프롬프트 템플릿", + FontSize = 17, + FontWeight = FontWeights.Bold, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + stack.Children.Add(header); + + // 템플릿 이름 입력 + stack.Children.Add(new TextBlock + { + Text = "템플릿 이름", + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = primaryText, + Margin = new Thickness(0, 0, 0, 6), + }); + stack.Children.Add(new TextBlock + { + Text = "목록에 표시될 이름입니다. 예: 코드 리뷰 요청, 번역 요청", + FontSize = 11, + Foreground = secondaryText, + Margin = new Thickness(0, 0, 0, 8), + }); + _nameBox = new TextBox + { + Text = existingName, + FontSize = 13, + Padding = new Thickness(12, 8, 12, 8), + Foreground = primaryText, + Background = itemBg, + CaretBrush = accentBrush, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + }; + var nameBorder = new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _nameBox }; + stack.Children.Add(nameBorder); + + // 구분선 + stack.Children.Add(new Rectangle + { + Height = 1, + Fill = borderBrush, + Margin = new Thickness(0, 16, 0, 16), + Opacity = 0.5, + }); + + // 프롬프트 내용 입력 + stack.Children.Add(new TextBlock + { + Text = "프롬프트 내용", + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = primaryText, + Margin = new Thickness(0, 0, 0, 6), + }); + stack.Children.Add(new TextBlock + { + Text = "채팅 입력란에 자동으로 삽입될 텍스트입니다.", + FontSize = 11, + Foreground = secondaryText, + Margin = new Thickness(0, 0, 0, 8), + }); + _contentBox = new TextBox + { + Text = existingContent, + FontSize = 13, + Padding = new Thickness(12, 8, 12, 8), + Foreground = primaryText, + Background = itemBg, + CaretBrush = accentBrush, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + AcceptsReturn = true, + TextWrapping = TextWrapping.Wrap, + MinHeight = 100, + MaxHeight = 240, + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + }; + var contentBorder = new Border { CornerRadius = new CornerRadius(8), ClipToBounds = true, Child = _contentBox }; + stack.Children.Add(contentBorder); + + // 글자 수 표시 + var charCount = new TextBlock + { + FontSize = 10.5, + Foreground = secondaryText, + Margin = new Thickness(0, 6, 0, 0), + HorizontalAlignment = HorizontalAlignment.Right, + }; + UpdateCharCount(charCount); + _contentBox.TextChanged += (_, _) => UpdateCharCount(charCount); + stack.Children.Add(charCount); + + // 버튼 바 + var btnBar = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(0, 20, 0, 0), + }; + + var cancelBtn = new Button + { + Content = "취소", + Width = 80, + Padding = new Thickness(0, 8, 0, 8), + Margin = new Thickness(0, 0, 10, 0), + Background = Brushes.Transparent, + Foreground = secondaryText, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Cursor = Cursors.Hand, + FontSize = 13, + }; + cancelBtn.Click += (_, _) => { DialogResult = false; Close(); }; + btnBar.Children.Add(cancelBtn); + + var okBtn = new Button + { + Content = isEdit ? "저장" : "추가", + Width = 80, + Padding = new Thickness(0, 8, 0, 8), + Background = accentBrush, + Foreground = Brushes.White, + BorderThickness = new Thickness(0), + Cursor = Cursors.Hand, + FontSize = 13, + FontWeight = FontWeights.SemiBold, + }; + okBtn.Click += (_, _) => + { + if (string.IsNullOrWhiteSpace(_nameBox.Text)) + { + CustomMessageBox.Show("템플릿 이름을 입력하세요.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + _nameBox.Focus(); + return; + } + if (string.IsNullOrWhiteSpace(_contentBox.Text)) + { + CustomMessageBox.Show("프롬프트 내용을 입력하세요.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + _contentBox.Focus(); + return; + } + DialogResult = true; + Close(); + }; + btnBar.Children.Add(okBtn); + stack.Children.Add(btnBar); + + root.Child = stack; + Content = root; + + // 키보드 핸들링 + KeyDown += (_, ke) => + { + if (ke.Key == Key.Escape) { DialogResult = false; Close(); } + }; + Loaded += (_, _) => { _nameBox.Focus(); _nameBox.SelectAll(); }; + + // 드래그 이동 + root.MouseLeftButtonDown += (_, me) => + { + if (me.LeftButton == System.Windows.Input.MouseButtonState.Pressed) + try { DragMove(); } catch (Exception) { } + }; + } + + private void UpdateCharCount(TextBlock tb) + { + var len = _contentBox.Text.Length; + tb.Text = $"{len}자"; + } +} diff --git a/src/AxCopilot/Views/RegionSelectWindow.xaml b/src/AxCopilot/Views/RegionSelectWindow.xaml new file mode 100644 index 0000000..555109e --- /dev/null +++ b/src/AxCopilot/Views/RegionSelectWindow.xaml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/RegionSelectWindow.xaml.cs b/src/AxCopilot/Views/RegionSelectWindow.xaml.cs new file mode 100644 index 0000000..783d316 --- /dev/null +++ b/src/AxCopilot/Views/RegionSelectWindow.xaml.cs @@ -0,0 +1,192 @@ +using System.Drawing; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.IO; + +namespace AxCopilot.Views; + +/// +/// 전체 화면 위에 반투명 오버레이를 표시하고 마우스 드래그로 캡처 영역을 선택합니다. +/// ShowDialog() 후 SelectedRect로 결과를 얻습니다. +/// +public partial class RegionSelectWindow : Window +{ + public System.Drawing.Rectangle? SelectedRect { get; private set; } + + private readonly System.Drawing.Rectangle _screenBounds; + private System.Windows.Point _startPoint; + private System.Windows.Point _endPoint; + private bool _isDragging; + + public RegionSelectWindow(Bitmap fullScreenshot, System.Drawing.Rectangle screenBounds) + { + InitializeComponent(); + + _screenBounds = screenBounds; + + // 창을 모든 모니터 전체에 걸쳐 표시 + Left = screenBounds.X; + Top = screenBounds.Y; + Width = screenBounds.Width; + Height = screenBounds.Height; + + // 전체 화면 스크린샷을 배경으로 렌더링 + RootCanvas.Background = CreateFrozenBrush(fullScreenshot); + + // 오버레이 초기 크기 설정 + OverlayTop.Width = screenBounds.Width; + OverlayTop.Height = screenBounds.Height; + OverlayBottom.Width = screenBounds.Width; + OverlayLeft.Width = 0; + OverlayRight.Width = 0; + + // 가이드 텍스트 중앙 배치 (Loaded 이후) + Loaded += (_, _) => + { + Canvas.SetLeft(GuideText, (Width - GuideText.ActualWidth) / 2); + Canvas.SetTop(GuideText, (Height - GuideText.ActualHeight) / 2); + }; + } + + private static ImageBrush CreateFrozenBrush(Bitmap bmp) + { + using var ms = new MemoryStream(); + bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); + ms.Position = 0; + var img = new BitmapImage(); + img.BeginInit(); + img.StreamSource = ms; + img.CacheOption = BitmapCacheOption.OnLoad; + img.EndInit(); + img.Freeze(); + var brush = new ImageBrush(img) { Stretch = Stretch.None, AlignmentX = AlignmentX.Left, AlignmentY = AlignmentY.Top }; + brush.Freeze(); + return brush; + } + + private void Window_MouseDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton != MouseButton.Left) return; + _startPoint = e.GetPosition(RootCanvas); + _isDragging = true; + GuideText.Visibility = Visibility.Collapsed; + SelectionBorder.Visibility = Visibility.Visible; + SizeLabel.Visibility = Visibility.Visible; + CaptureMouse(); + } + + private void Window_MouseMove(object sender, MouseEventArgs e) + { + if (!_isDragging) return; + var cur = e.GetPosition(RootCanvas); + UpdateSelection(_startPoint, cur); + } + + private void Window_MouseUp(object sender, MouseButtonEventArgs e) + { + if (!_isDragging || e.ChangedButton != MouseButton.Left) return; + _isDragging = false; + ReleaseMouseCapture(); + + var cur = e.GetPosition(RootCanvas); + _endPoint = cur; + var rect = MakeRect(_startPoint, cur); + + if (rect.Width < 4 || rect.Height < 4) + { + // 너무 작으면 무시, 다시 드래그 가능 + return; + } + + // 선택 완료 — 화살표 키로 미세 조정 후 Enter/더블클릭으로 확정, Esc로 취소 + // SizeLabel 하단에 힌트 표시 + SizeLabelText.Text += " · ↑↓←→ 미세조정 · Enter 확정"; + } + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Escape) + { + SelectedRect = null; + Close(); + return; + } + + // 드래그 완료 후 화살표 키로 선택 영역 미세 조정 + if (!_isDragging && SelectionBorder.Visibility == Visibility.Visible) + { + double dx = 0, dy = 0; + bool shift = Keyboard.Modifiers.HasFlag(ModifierKeys.Shift); + double step = shift ? 10 : 1; // Shift 누르면 10px 단위 + + switch (e.Key) + { + case Key.Left: dx = -step; break; + case Key.Right: dx = step; break; + case Key.Up: dy = -step; break; + case Key.Down: dy = step; break; + case Key.Enter: + // Enter 키로 현재 선택 확정 + var r = MakeRect(_startPoint, _endPoint); + if (r.Width >= 4 && r.Height >= 4) + { + var dpi = VisualTreeHelper.GetDpi(this); + SelectedRect = new System.Drawing.Rectangle( + (int)(r.X * dpi.DpiScaleX) + _screenBounds.X, + (int)(r.Y * dpi.DpiScaleY) + _screenBounds.Y, + (int)(r.Width * dpi.DpiScaleX), + (int)(r.Height * dpi.DpiScaleY)); + } + Close(); + return; + default: return; + } + + _endPoint = new System.Windows.Point(_endPoint.X + dx, _endPoint.Y + dy); + UpdateSelection(_startPoint, _endPoint); + e.Handled = true; + } + } + + private void UpdateSelection(System.Windows.Point a, System.Windows.Point b) + { + var rect = MakeRect(a, b); + + Canvas.SetLeft(SelectionBorder, rect.X); + Canvas.SetTop(SelectionBorder, rect.Y); + SelectionBorder.Width = rect.Width; + SelectionBorder.Height = rect.Height; + + // 바깥 마스크 업데이트 + OverlayTop.Width = Width; + OverlayTop.Height = rect.Y; + + OverlayBottom.Width = Width; + OverlayBottom.Height = Height - rect.Y - rect.Height; + Canvas.SetTop(OverlayBottom, rect.Y + rect.Height); + + OverlayLeft.Width = rect.X; + OverlayLeft.Height = rect.Height; + Canvas.SetTop(OverlayLeft, rect.Y); + + OverlayRight.Width = Width - rect.X - rect.Width; + OverlayRight.Height = rect.Height; + Canvas.SetLeft(OverlayRight, rect.X + rect.Width); + Canvas.SetTop(OverlayRight, rect.Y); + + // 크기 레이블 + var dpiScale = VisualTreeHelper.GetDpi(this); + var pw = (int)(rect.Width * dpiScale.DpiScaleX); + var ph = (int)(rect.Height * dpiScale.DpiScaleY); + SizeLabelText.Text = $"{pw} × {ph}"; + Canvas.SetLeft(SizeLabel, rect.X + rect.Width + 8); + Canvas.SetTop(SizeLabel, rect.Y + rect.Height + 4); + } + + private static Rect MakeRect(System.Windows.Point a, System.Windows.Point b) => + new(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y), + Math.Abs(b.X - a.X), Math.Abs(b.Y - a.Y)); +} diff --git a/src/AxCopilot/Views/ReminderPopupWindow.xaml b/src/AxCopilot/Views/ReminderPopupWindow.xaml new file mode 100644 index 0000000..954c658 --- /dev/null +++ b/src/AxCopilot/Views/ReminderPopupWindow.xaml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/ReminderPopupWindow.xaml.cs b/src/AxCopilot/Views/ReminderPopupWindow.xaml.cs new file mode 100644 index 0000000..eca4ac6 --- /dev/null +++ b/src/AxCopilot/Views/ReminderPopupWindow.xaml.cs @@ -0,0 +1,141 @@ +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Interop; +using System.Windows.Threading; +using AxCopilot.Services; + +namespace AxCopilot.Views; + +/// +/// 잠금 해제 시 화면 모서리에 표시되는 격려 팝업. +/// 테마는 Application.Current.Resources의 DynamicResource로 자동 적용됩니다. +/// 포커스를 빼앗지 않으며(WS_EX_NOACTIVATE), 지정된 초 후 자동으로 닫힙니다. +/// +public partial class ReminderPopupWindow : Window +{ + // ─── 포커스 방지 P/Invoke (64비트 안전) ──────────────────────────────────── + [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")] + private static extern IntPtr GetWindowLongPtr(IntPtr hwnd, int nIndex); + [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")] + private static extern IntPtr SetWindowLongPtr(IntPtr hwnd, int nIndex, IntPtr dwNewLong); + + private const int GWL_EXSTYLE = -20; + private const int WS_EX_NOACTIVATE = 0x08000000; + private const int WS_EX_TOOLWINDOW = 0x00000080; + + // ─── 타이머 ─────────────────────────────────────────────────────────────── + private readonly DispatcherTimer _timer; + private readonly EventHandler _tickHandler; + private int _remaining; + + public ReminderPopupWindow( + string quoteText, + string? author, + TimeSpan todayUsage, + SettingsService settings) + { + InitializeComponent(); + + var cfg = settings.Settings.Reminder; + + // ── 문구 / 출처 ── + QuoteText.Text = quoteText; + if (!string.IsNullOrWhiteSpace(author)) + { + AuthorText.Text = $"— {author}"; + AuthorText.Visibility = Visibility.Visible; + } + + // ── 근무 시간 ── + var h = (int)todayUsage.TotalHours; + var m = todayUsage.Minutes; + UsageText.Text = h > 0 + ? $"오늘 총 {h}시간 {m}분 근무 중" + : m >= 1 + ? $"오늘 총 {m}분 근무 중" + : "오늘 방금 시작했습니다"; + + // ── 카운트다운 ── + _remaining = Math.Max(3, cfg.DisplaySeconds); + CountdownBar.Maximum = _remaining; + CountdownBar.Value = _remaining; + + // ── 위치: 레이아웃 완료 후 설정 ── + Loaded += (_, _) => + { + SetNoActivate(); + PositionWindow(cfg.Corner); + AnimateIn(); + }; + + // ── 타이머 ── + _tickHandler = (_, _) => + { + _remaining--; + CountdownBar.Value = _remaining; + if (_remaining <= 0) Close(); + }; + _timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; + _timer.Tick += _tickHandler; + _timer.Start(); + + // ── Esc 키 닫기 ── + KeyDown += (_, e) => + { + if (e.Key == System.Windows.Input.Key.Escape) Close(); + }; + } + + // ─── 포커스 방지 ───────────────────────────────────────────────────────── + + protected override void OnSourceInitialized(EventArgs e) + { + base.OnSourceInitialized(e); + SetNoActivate(); + } + + private void SetNoActivate() + { + var hwnd = new WindowInteropHelper(this).Handle; + if (hwnd == IntPtr.Zero) return; + var style = (long)GetWindowLongPtr(hwnd, GWL_EXSTYLE); + SetWindowLongPtr(hwnd, GWL_EXSTYLE, (IntPtr)(style | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW)); + } + + // ─── 위치 계산 ──────────────────────────────────────────────────────────── + + private void PositionWindow(string corner) + { + var area = SystemParameters.WorkArea; + const double margin = 20; + + Left = corner.Contains("left") + ? area.Left + margin + : area.Right - ActualWidth - margin; + + Top = corner.Contains("top") + ? area.Top + margin + : area.Bottom - ActualHeight - margin; + } + + // ─── 등장 애니메이션 ────────────────────────────────────────────────────── + + private void AnimateIn() + { + Opacity = 0; + var anim = new System.Windows.Media.Animation.DoubleAnimation(0, 1, + TimeSpan.FromMilliseconds(280)); + BeginAnimation(OpacityProperty, anim); + } + + // ─── 이벤트 ─────────────────────────────────────────────────────────────── + + private void CloseBtn_Click(object sender, RoutedEventArgs e) => Close(); + + protected override void OnClosed(EventArgs e) + { + _timer.Stop(); + _timer.Tick -= _tickHandler; + base.OnClosed(e); + } +} diff --git a/src/AxCopilot/Views/ResourceMonitorWindow.xaml b/src/AxCopilot/Views/ResourceMonitorWindow.xaml new file mode 100644 index 0000000..3a8d4c0 --- /dev/null +++ b/src/AxCopilot/Views/ResourceMonitorWindow.xaml @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/ResourceMonitorWindow.xaml.cs b/src/AxCopilot/Views/ResourceMonitorWindow.xaml.cs new file mode 100644 index 0000000..a2e1487 --- /dev/null +++ b/src/AxCopilot/Views/ResourceMonitorWindow.xaml.cs @@ -0,0 +1,328 @@ +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Interop; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Threading; + +namespace AxCopilot.Views; + +/// +/// CPU · RAM · 드라이브 · 상위 프로세스를 실시간으로 표시하는 플로팅 위젯. +/// info cpu 또는 info ram 항목의 Enter로 열립니다. +/// +public partial class ResourceMonitorWindow : Window +{ + // ─── P/Invoke ─────────────────────────────────────────────────────────── + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); + + [DllImport("user32.dll")] private static extern void ReleaseCapture(); + [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + private const int WM_NCLBUTTONDOWN = 0xA1; + private const int HTBOTTOMRIGHT = 17; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + private struct MEMORYSTATUSEX + { + public uint dwLength; + public uint dwMemoryLoad; + public ulong ullTotalPhys; + public ulong ullAvailPhys; + public ulong ullTotalPageFile; + public ulong ullAvailPageFile; + public ulong ullTotalVirtual; + public ulong ullAvailVirtual; + public ulong ullAvailExtendedVirtual; + } + + // ─── 내부 모델 ────────────────────────────────────────────────────────── + + public sealed class DriveDisplayItem : INotifyPropertyChanged + { + private string _label = ""; + private string _detail = ""; + private double _barWidth = 0; + private Brush _barColor = Brushes.Green; + + public string Label { get => _label; set { _label = value; OnPropertyChanged(); } } + public string Detail { get => _detail; set { _detail = value; OnPropertyChanged(); } } + public double BarWidth { get => _barWidth; set { _barWidth = value; OnPropertyChanged(); } } + public Brush BarColor { get => _barColor; set { _barColor = value; OnPropertyChanged(); } } + + /// 탐색기로 드라이브 루트를 여는 커맨드 + public ICommand OpenCommand { get; init; } = null!; + + public event PropertyChangedEventHandler? PropertyChanged; + private void OnPropertyChanged([CallerMemberName] string? n = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(n)); + } + + public sealed class ProcessDisplayItem + { + public string Rank { get; init; } = ""; + public string Name { get; init; } = ""; + public string MemText { get; init; } = ""; + public double BarWidth{ get; init; } + } + + // ─── 필드 ─────────────────────────────────────────────────────────────── + + private readonly DispatcherTimer _timer; + private static PerformanceCounter? _cpuCounter; + private static float _cpuCached; + private static DateTime _cpuUpdated = DateTime.MinValue; + private readonly ObservableCollection _drives = new(); + + // 드라이브 진행바 최대 너비 (px) + private const double MaxBarWidth = 160.0; + + public ResourceMonitorWindow() + { + InitializeComponent(); + DriveList.ItemsSource = _drives; + + // 첫 CPU 카운터 초기화 (첫 샘플은 0이라 무의미) + if (_cpuCounter == null) + { + try + { + _cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); + _cpuCounter.NextValue(); + } + catch (Exception) { /* PerformanceCounter 미지원 환경 */ } + } + + // 드라이브 목록 초기 구성 (클릭 커맨드 포함) + InitDrives(); + + // 1초 주기 갱신 + _timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; + _timer.Tick += (_, _) => Refresh(); + _timer.Start(); + + Refresh(); // 즉시 첫 갱신 + } + + // ─── 드라이브 목록 초기화 ─────────────────────────────────────────────── + + private void InitDrives() + { + _drives.Clear(); + foreach (var d in DriveInfo.GetDrives().Where(d => d.IsReady && d.DriveType == DriveType.Fixed)) + { + var root = d.RootDirectory.FullName; + _drives.Add(new DriveDisplayItem + { + OpenCommand = new RelayCommand(() => + { + try { Process.Start(new ProcessStartInfo("explorer.exe", root) { UseShellExecute = true }); } + catch (Exception) { /* 무시 */ } + }) + }); + } + } + + // ─── 갱신 ──────────────────────────────────────────────────────────────── + + private void Refresh() + { + RefreshCpu(); + RefreshRam(); + RefreshDrives(); + RefreshProcesses(); + RefreshUptime(); + } + + private void RefreshCpu() + { + try + { + if (_cpuCounter == null) { CpuValueText.Text = "—"; return; } + if ((DateTime.Now - _cpuUpdated).TotalMilliseconds > 800) + { + _cpuCached = _cpuCounter.NextValue(); + _cpuUpdated = DateTime.Now; + } + var pct = (int)Math.Clamp(_cpuCached, 0, 100); + CpuValueText.Text = $"{pct}%"; + + // 색상: 낮음=파랑, 높음=빨강 + var barBrush = pct > 80 ? new SolidColorBrush(Color.FromRgb(0xDC, 0x26, 0x26)) + : pct > 50 ? new SolidColorBrush(Color.FromRgb(0xD9, 0x77, 0x06)) + : new SolidColorBrush(Color.FromRgb(0x4B, 0x9E, 0xFC)); + CpuValueText.Foreground = barBrush; + CpuBar.Background = barBrush; + CpuBar.Width = (CpuBar.Parent as FrameworkElement)?.ActualWidth * pct / 100.0 ?? 0; + + // 프로세서 이름 (최초 1회) + if (string.IsNullOrEmpty(CpuNameText.Text)) + CpuNameText.Text = GetProcessorName(); + } + catch (Exception) { CpuValueText.Text = "—"; } + } + + private void RefreshRam() + { + var mem = new MEMORYSTATUSEX { dwLength = (uint)Marshal.SizeOf() }; + if (!GlobalMemoryStatusEx(ref mem)) return; + + var totalGb = mem.ullTotalPhys / 1024.0 / 1024 / 1024; + var usedGb = (mem.ullTotalPhys - mem.ullAvailPhys) / 1024.0 / 1024 / 1024; + var freeGb = mem.ullAvailPhys / 1024.0 / 1024 / 1024; + var pct = (int)mem.dwMemoryLoad; + + RamValueText.Text = $"{pct}%"; + RamDetailText.Text = $"사용: {usedGb:F1} GB / 전체: {totalGb:F1} GB / 여유: {freeGb:F1} GB"; + RamBar.Width = (RamBar.Parent as FrameworkElement)?.ActualWidth * pct / 100.0 ?? 0; + + var barBrush = pct > 85 ? new SolidColorBrush(Color.FromRgb(0xDC, 0x26, 0x26)) + : pct > 65 ? new SolidColorBrush(Color.FromRgb(0xD9, 0x77, 0x06)) + : new SolidColorBrush(Color.FromRgb(0x7C, 0x3A, 0xED)); + RamValueText.Foreground = barBrush; + RamBar.Background = barBrush; + } + + private void RefreshDrives() + { + var drives = DriveInfo.GetDrives() + .Where(d => d.IsReady && d.DriveType == DriveType.Fixed) + .ToList(); + + // 드라이브 수가 바뀌면 재초기화 + if (drives.Count != _drives.Count) InitDrives(); + + for (int i = 0; i < drives.Count && i < _drives.Count; i++) + { + var d = drives[i]; + var totalGb = d.TotalSize / 1024.0 / 1024 / 1024; + var freeGb = d.AvailableFreeSpace / 1024.0 / 1024 / 1024; + var usedGb = totalGb - freeGb; + var pct = (int)(usedGb / totalGb * 100); + var lbl = string.IsNullOrWhiteSpace(d.VolumeLabel) ? d.Name.TrimEnd('\\') : $"{d.Name.TrimEnd('\\')} ({d.VolumeLabel})"; + + _drives[i].Label = lbl; + _drives[i].Detail = $"{freeGb:F1}GB 여유"; + _drives[i].BarWidth = MaxBarWidth * pct / 100.0; + _drives[i].BarColor = pct > 90 + ? new SolidColorBrush(Color.FromRgb(0xDC, 0x26, 0x26)) + : pct > 75 + ? new SolidColorBrush(Color.FromRgb(0xD9, 0x77, 0x06)) + : new SolidColorBrush(Color.FromRgb(0x05, 0x96, 0x69)); + } + } + + private void RefreshProcesses() + { + try + { + // 메모리 기준 상위 7개 (WorkingSet64 — 비동기 수집 없이도 빠름) + var procs = Process.GetProcesses() + .OrderByDescending(p => { try { return p.WorkingSet64; } catch (Exception) { return 0L; } }) + .Take(7) + .ToList(); + + long maxMem = procs.Count > 0 ? (long)(procs[0].WorkingSet64 > 0 ? procs[0].WorkingSet64 : 1) : 1; + + var items = procs.Select((p, i) => + { + long ws = 0; + string name = ""; + try { ws = p.WorkingSet64; name = p.ProcessName; } catch (Exception) { name = "—"; } + var mb = ws / 1024.0 / 1024; + return new ProcessDisplayItem + { + Rank = $"{i + 1}", + Name = name, + MemText = mb > 1024 ? $"{mb / 1024:F1} GB" : $"{mb:F0} MB", + BarWidth = Math.Max(2, 46.0 * ws / maxMem) + }; + }).ToList(); + + ProcessList.ItemsSource = items; + } + catch (Exception) { /* 권한 부족 등 무시 */ } + } + + private void RefreshUptime() + { + var uptime = TimeSpan.FromMilliseconds(Environment.TickCount64); + var d = (int)uptime.TotalDays; + var h = uptime.Hours; + var m = uptime.Minutes; + UptimeText.Text = d > 0 ? $"가동: {d}일 {h}시간 {m}분" + : h > 0 ? $"가동: {h}시간 {m}분" + : $"가동: {m}분 {uptime.Seconds}초"; + } + + // ─── 이벤트 ───────────────────────────────────────────────────────────── + + private void ResizeGrip_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + if (e.ButtonState != System.Windows.Input.MouseButtonState.Pressed) return; + ReleaseCapture(); + SendMessage(new WindowInteropHelper(this).Handle, WM_NCLBUTTONDOWN, (IntPtr)HTBOTTOMRIGHT, IntPtr.Zero); + } + + private void Close_Click(object sender, RoutedEventArgs e) => Close(); + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Escape) Close(); + } + + private void Window_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left && e.LeftButton == System.Windows.Input.MouseButtonState.Pressed) + try { DragMove(); } catch (Exception) { } + } + + /// Ctrl+마우스 휠로 창 높이 조절 (투명 창에서는 OS 리사이즈 그립이 없으므로) + protected override void OnMouseWheel(System.Windows.Input.MouseWheelEventArgs e) + { + if (Keyboard.Modifiers == ModifierKeys.Control) + { + var delta = e.Delta > 0 ? 40 : -40; + var newH = Height + delta; + if (newH >= MinHeight && newH <= 900) + Height = newH; + e.Handled = true; + return; + } + base.OnMouseWheel(e); + } + + protected override void OnClosed(EventArgs e) + { + _timer.Stop(); + base.OnClosed(e); + } + + // ─── 헬퍼 ─────────────────────────────────────────────────────────────── + + private static string GetProcessorName() + { + try + { + using var key = Microsoft.Win32.Registry.LocalMachine + .OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0"); + return key?.GetValue("ProcessorNameString") as string ?? ""; + } + catch (Exception) { return ""; } + } + + /// 간단한 ICommand 구현 (RelayCommand) + private sealed class RelayCommand(Action execute) : ICommand + { + public event EventHandler? CanExecuteChanged { add { } remove { } } + public bool CanExecute(object? _) => true; + public void Execute(object? _) => execute(); + } +} diff --git a/src/AxCopilot/Views/SettingsWindow.xaml b/src/AxCopilot/Views/SettingsWindow.xaml new file mode 100644 index 0000000..7742b11 --- /dev/null +++ b/src/AxCopilot/Views/SettingsWindow.xaml @@ -0,0 +1,5224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AX Commander 테두리에 무지개빛 회전 애니메이션을 표시합니다. + GPU 가속을 사용하므로 저사양 PC에서는 끄는 것을 권장합니다. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AX Commander에서 ; 다음 키워드를 입력하면 미리 저장된 텍스트를 즉시 붙여넣습니다. + + + 변수: {date} + {time} + {datetime} + {year} + {month} + {day} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 별칭 입력: 쉼표로 구분해서 입력 (예: + 잠금, l + ) → AX Commander에서 + /잠금 + 또는 + /l + 로 실행 + + + + + + + + + + + + + + + + + + + /lock + + + + + + + + + + + + + + + + + + + + /sleep + + + + + + + + + + + + + + + + + + + + /hibernate + + + + + + + + + + + + + + + + + + + + /restart + + + + + + + + + + + + + + + + + + + + /shutdown + + + + + + + + + + + + + + + + + + + + /logout + + + + + + + + + + + + + + + + + + + + /recycle + + + + + + + + + + + + + + + 별칭을 모두 지우고 기본 명령어만 사용합니다. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 키워드를 입력하면 AX Commander에서 예약어 없이 바로 앱·URL·폴더를 열 수 있습니다. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI가 도구(파일 읽기/쓰기, 검색, Git 등)를 실행할 때 + 그 전(Pre) 또는 후(Post)에 사용자가 등록한 + 스크립트를 자동으로 실행하는 확장 기능입니다. + + ■ 동작 흐름 + AI 판단 → [Pre 훅] → 도구 실행 → [Post 훅] → 다음 단계 + + ■ 활용 예시 + • 파일 수정 후 자동 백업 스크립트 실행 + • Git 커밋 전 린트/테스트 자동 검사 + • 모든 도구 호출을 로그 파일에 기록 + • 특정 도구 실행 시 알림 표시 + + ■ 안전 설계 + • 훅 실패 시에도 AI 작업은 정상 진행됩니다 + • 타임아웃 초과 시 스크립트가 자동 종료됩니다 + • 각 훅을 개별적으로 켜고 끌 수 있습니다 + + 지원 스크립트: .bat, .cmd, .ps1 + + + + + + + + + + + + + + + + + + + + + 훅 스크립트가 이 시간 내에 완료되지 않으면 + 자동으로 강제 종료됩니다. + + • 간단한 로깅: 3~5초 권장 + • 린트/테스트 실행: 10~20초 권장 + • 타임아웃 시 AI 작업은 정상 진행됩니다 + + + + + + + + + + + + + + + + + + 스크립트에 환경 변수로 도구 실행 정보가 전달됩니다. + 스크립트 내에서 이 값을 읽어 원하는 작업을 수행하세요. + + ■ 공통 (Pre/Post 모두) + AX_TOOL_NAME — 실행된 도구 이름 (예: file_write) + AX_TOOL_TIMING — 실행 시점 (pre 또는 post) + AX_TOOL_INPUT — 도구에 전달된 입력 (JSON) + AX_WORK_FOLDER — 현재 작업 폴더 경로 + + ■ Post 전용 (도구 실행 후에만) + AX_TOOL_OUTPUT — 도구 실행 결과 텍스트 + AX_TOOL_SUCCESS — 성공 여부 (true / false) + + ■ 훅 설정 항목 + • 대상 도구: * (전체) 또는 특정 도구명 + • 타이밍: Pre (실행 전) / Post (실행 후) + • 스크립트: 실행할 .bat/.cmd/.ps1 파일 경로 + + ■ 스크립트 예시 (backup.bat) + @echo off + echo [%date%] %AX_TOOL_NAME% >> log.txt + + + + + + + + + + + + + + + + + + + + + + + + + + + + 마크다운 기반 재사용 워크플로우 시스템입니다. + *.skill.md 파일로 스킬을 정의하면 슬래시 명령어(/)로 호출할 수 있습니다. + + 스킬 폴더: %APPDATA%\AxCopilot\skills\ + 예: /daily-standup, /bug-hunt, /code-explain + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Language Server Protocol을 사용하여 AI가 코드를 더 정확하게 이해합니다. + • 심볼 정의 위치 찾기 (Goto Definition) + • 심볼이 사용된 모든 위치 검색 (Find References) + • 파일 내 클래스/메서드/필드 목록 조회 + 지원 언어: C#, TypeScript, Python, C++, Java + 해당 언어 서버가 PC에 설치되어 있어야 동작합니다. + + + + + + + + + + + + + + + + + + + + + 프로젝트 파일을 자동으로 분석하여, 자연어 질문으로 관련 코드를 찾습니다. + 예: "사용자 인증 로직", "DB 연결 설정" + 작업 폴더 변경 시 자동으로 재인덱싱됩니다. + 큰 프로젝트에서는 인덱싱에 시간이 걸릴 수 있습니다. + + + + + + + + + + + + + + + + + + + + + + + + + + 코드 시맨틱 검색 시 이 크기(KB)를 초과하는 파일은 인덱싱하지 않습니다. + 큰 파일(빌드 산출물, 데이터 파일)을 제외하여 성능을 보호합니다. + 일반적으로 500KB가 적정합니다. + + + + + + + + + + + + + + + + + + + + + + AI가 파일을 수정하면 변경 전/후를 색상으로 구분하여 보여줍니다. + 추가된 줄(녹색), 삭제된 줄(빨강)을 한눈에 확인하고 + 적용/취소 버튼으로 변경을 승인하거나 되돌릴 수 있습니다. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI가 파일 읽기/쓰기, 명령 실행 등 도구를 사용한 이력을 날짜별 JSON 파일로 기록합니다. + 30일이 지난 로그는 자동 삭제됩니다. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AI가 큰 작업을 여러 개의 작은 작업으로 나누어 동시에 실행할 수 있습니다. + 이 값은 동시에 실행할 수 있는 최대 작업 수를 제한합니다. + 값이 클수록 빠르지만 CPU/메모리 사용량이 증가합니다. + + + + + + + + + + + + + + + + + + + + + + + + 현재 사용 중인 AI 모델이 응답하지 않을 때, 여기서 선택한 모델을 순서대로 시도합니다. + 여러 모델을 켜두면 안정성이 높아집니다. + + + + + + + + + + + + + + + + + + + + + + + + 외부 도구 서버를 연결하여 AI가 다양한 작업을 수행할 수 있게 합니다. + 예: DB 조회, Jira 이슈 관리, Slack 메시지 등 + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/SettingsWindow.xaml.cs b/src/AxCopilot/Views/SettingsWindow.xaml.cs new file mode 100644 index 0000000..00ef26b --- /dev/null +++ b/src/AxCopilot/Views/SettingsWindow.xaml.cs @@ -0,0 +1,3216 @@ +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using AxCopilot.Services; +using AxCopilot.ViewModels; + +namespace AxCopilot.Views; + +public partial class SettingsWindow : Window +{ + private readonly SettingsViewModel _vm; + private readonly Action _previewCallback; + private readonly Action _revertCallback; + private bool _saved; + /// App 인스턴스 캐시 — Application.Current as App 반복 호출 제거. + private static App? CurrentApp => System.Windows.Application.Current as App; + + /// + /// 핫키 녹화 시작/종료를 외부(App.xaml.cs)에 알리는 콜백. + /// true = 녹화 시작(핫키 일시 정지), false = 녹화 종료(핫키 재개) + /// + public Action? SuspendHotkeyCallback { get; set; } + + /// 테마 키를 받아 런처에 즉시 미리보기 적용 + /// 취소/X 닫기 시 원래 설정으로 복원 + public SettingsWindow(SettingsViewModel vm, Action previewCallback, Action revertCallback) + { + InitializeComponent(); + _vm = vm; + _previewCallback = previewCallback; + _revertCallback = revertCallback; + DataContext = vm; + + vm.ThemePreviewRequested += (_, _) => _previewCallback(vm.SelectedThemeKey); + vm.SaveCompleted += (_, _) => + { + _saved = true; + Close(); + // 인덱스 재빌드를 백그라운드에서 조용히 실행 (UI 차단 없음) + _ = Task.Run(async () => + { + try + { + var indexService = CurrentApp?.IndexService; + if (indexService != null) + await indexService.BuildAsync(); + } + catch (Exception) { /* 인덱싱 실패해도 설정 저장은 완료 */ } + }); + }; + + Loaded += async (_, _) => + { + RefreshHotkeyBadges(); + SetVersionText(); + EnsureHotkeyInCombo(); + BuildQuoteCategoryCheckboxes(); + BuildDockBarSettings(); + BuildTextActionCommandsPanel(); + MoveBlockSectionToEtc(); + + // 스킬이 아직 로드되지 않았으면 백그라운드에서 로드 후 UI 구성 + var app = CurrentApp; + var skillsLoaded = Services.Agent.SkillService.Skills.Count > 0; + if (!skillsLoaded && (app?.SettingsService?.Settings.Llm.EnableSkillSystem ?? false)) + { + // 스킬 로드 (RuntimeDetector 포함)를 백그라운드에서 실행 + await Task.Run(() => + { + Services.Agent.SkillService.EnsureSkillFolder(); + Services.Agent.SkillService.LoadSkills(app?.SettingsService?.Settings.Llm.SkillsFolderPath); + }); + } + + BuildToolRegistryPanel(); + LoadAdvancedSettings(); + RefreshStorageInfo(); + // 개발자 모드는 저장된 설정 유지 (끄면 하위 기능 모두 비활성) + UpdateDevModeContentVisibility(); + // AI 기능 토글 초기화 + ApplyAiEnabledState(app?.SettingsService?.Settings.AiEnabled ?? false, init: true); + // 네트워크 모드 토글 초기화 (사내 모드 = true = 차단) + if (InternalModeToggle != null) + InternalModeToggle.IsChecked = app?.SettingsService?.Settings.InternalModeEnabled ?? true; + }; + } + + // ─── 에이전트 차단 섹션 → 기타 탭 이동 ────────────────────────────────────── + + private void MoveBlockSectionToEtc() + { + if (AgentBlockSection == null || AgentEtcContent == null) return; + var parent = AgentBlockSection.Parent as Panel; + if (parent != null) + { + parent.Children.Remove(AgentBlockSection); + AgentBlockSection.Margin = new Thickness(0, 0, 0, 16); + AgentEtcContent.Children.Add(AgentBlockSection); + } + } + + // ─── 접기/열기 가능 섹션 헬퍼 ────────────────────────────────────────── + private Border CreateCollapsibleSection(string title, UIElement content, bool expanded = true) + { + var headerColor = ThemeResourceHelper.HexBrush("#AAAACC"); + var section = new StackPanel(); + var contentPanel = new StackPanel { Visibility = expanded ? Visibility.Visible : Visibility.Collapsed }; + if (content is Panel panel) + { + // 패널의 자식들을 contentPanel로 옮김 (StackPanel 등) + contentPanel.Children.Add(content); + } + else + { + contentPanel.Children.Add(content); + } + + var arrow = new TextBlock + { + Text = "\uE70D", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 9, + Foreground = headerColor, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 6, 0), + RenderTransformOrigin = new Point(0.5, 0.5), + RenderTransform = new RotateTransform(expanded ? 90 : 0), + }; + var titleBlock = new TextBlock + { + Text = title, + FontSize = 10.5, + FontWeight = FontWeights.SemiBold, + Foreground = headerColor, + VerticalAlignment = VerticalAlignment.Center, + }; + var headerPanel = new StackPanel { Orientation = Orientation.Horizontal }; + headerPanel.Children.Add(arrow); + headerPanel.Children.Add(titleBlock); + + var header = new Border + { + Background = Brushes.Transparent, + Cursor = Cursors.Hand, + Padding = new Thickness(2, 10, 2, 6), + Child = headerPanel, + }; + header.MouseLeftButtonUp += (s, e) => + { + bool isNowVisible = contentPanel.Visibility == Visibility.Visible; + contentPanel.Visibility = isNowVisible ? Visibility.Collapsed : Visibility.Visible; + arrow.RenderTransform = new RotateTransform(isNowVisible ? 0 : 90); + }; + header.MouseEnter += (s, _) => titleBlock.Foreground = ThemeResourceHelper.HexBrush("#CCCCEE"); + header.MouseLeave += (s, _) => titleBlock.Foreground = headerColor; + + section.Children.Add(header); + section.Children.Add(contentPanel); + + return new Border + { + Child = section, + Margin = new Thickness(0, 2, 0, 0), + }; + } + + private Border CreateCollapsibleSection(string title, IEnumerable children, bool expanded = true) + { + var contentPanel = new StackPanel(); + foreach (var child in children) + contentPanel.Children.Add(child); + return CreateCollapsibleSection(title, contentPanel, expanded); + } + + // ─── 도구/커넥터 관리 UI (기타 탭) ───────────────────────────────────────────── + + private void BuildToolRegistryPanel() + { + if (AgentEtcContent == null) return; + + // 도구 목록 데이터 (카테고리별) + var toolGroups = new (string Category, string Icon, string IconColor, (string Name, string Desc)[] Tools)[] + { + ("파일/검색", "\uE8B7", "#F59E0B", new[] + { + ("file_read", "파일 읽기 — 텍스트/바이너리 파일의 내용을 읽습니다"), + ("file_write", "파일 쓰기 — 새 파일을 생성하거나 기존 파일을 덮어씁니다"), + ("file_edit", "파일 편집 — 줄 번호 기반으로 파일의 특정 부분을 수정합니다"), + ("glob", "파일 패턴 검색 — 글로브 패턴으로 파일을 찾습니다 (예: **/*.cs)"), + ("grep_tool", "텍스트 검색 — 정규식으로 파일 내용을 검색합니다"), + ("folder_map", "폴더 구조 — 프로젝트의 디렉토리 트리를 조회합니다"), + ("document_read", "문서 읽기 — PDF, DOCX 등 문서 파일의 텍스트를 추출합니다"), + }), + ("프로세스/빌드", "\uE756", "#06B6D4", new[] + { + ("process", "프로세스 실행 — 외부 명령/프로그램을 실행합니다"), + ("build_run", "빌드/테스트 — 프로젝트 타입을 감지하여 빌드/테스트를 실행합니다"), + ("dev_env_detect", "개발 환경 감지 — IDE, 런타임, 빌드 도구를 자동으로 인식합니다"), + }), + ("코드 분석", "\uE943", "#818CF8", new[] + { + ("search_codebase", "코드 키워드 검색 — TF-IDF 기반으로 관련 코드를 찾습니다"), + ("code_review", "AI 코드 리뷰 — Git diff 분석, 파일 정적 검사, PR 요약"), + ("lsp", "LSP 인텔리전스 — 정의 이동, 참조 검색, 심볼 목록 (C#/TS/Python)"), + ("test_loop", "테스트 루프 — 테스트 생성/실행/분석 자동화"), + ("git_tool", "Git 작업 — status, log, diff, commit 등 Git 명령 실행"), + ("snippet_runner", "코드 실행 — C#/Python/JavaScript 스니펫 즉시 실행"), + }), + ("문서 생성", "\uE8A5", "#34D399", new[] + { + ("excel_create", "Excel 생성 — .xlsx 스프레드시트를 생성합니다"), + ("docx_create", "Word 생성 — .docx 문서를 생성합니다"), + ("csv_create", "CSV 생성 — CSV 파일을 생성합니다"), + ("markdown_create", "마크다운 생성 — .md 파일을 생성합니다"), + ("html_create", "HTML 생성 — HTML 파일을 생성합니다"), + ("chart_create", "차트 생성 — 데이터 시각화 차트를 생성합니다"), + ("batch_create", "배치 생성 — 스크립트 파일을 생성합니다"), + ("document_review", "문서 검증 — 문서 품질을 검사합니다"), + ("format_convert", "포맷 변환 — 문서 형식을 변환합니다"), + }), + ("데이터 처리", "\uE9F5", "#F59E0B", new[] + { + ("json_tool", "JSON 처리 — JSON 파싱, 변환, 검증, 포맷팅"), + ("regex_tool", "정규식 — 정규식 테스트, 추출, 치환"), + ("diff_tool", "텍스트 비교 — 두 파일/텍스트 비교, 통합 diff 출력"), + ("base64_tool", "인코딩 — Base64/URL 인코딩, 디코딩"), + ("hash_tool", "해시 계산 — MD5/SHA256 해시 계산 (파일/텍스트)"), + ("datetime_tool", "날짜/시간 — 날짜 변환, 타임존, 기간 계산"), + }), + ("시스템/환경", "\uE770", "#06B6D4", new[] + { + ("clipboard_tool", "클립보드 — Windows 클립보드 읽기/쓰기 (텍스트/이미지)"), + ("notify_tool", "알림 — Windows 시스템 알림 전송"), + ("env_tool", "환경변수 — 환경변수 읽기/설정 (프로세스 범위)"), + ("zip_tool", "압축 — 파일 압축(zip) / 해제"), + ("http_tool", "HTTP — 로컬/사내 HTTP API 호출 (GET/POST)"), + ("sql_tool", "SQLite — SQLite DB 쿼리 실행 (로컬 파일)"), + }), + ("에이전트", "\uE99A", "#F472B6", new[] + { + ("spawn_agent", "서브에이전트 — 하위 작업을 병렬로 실행하는 서브에이전트를 생성합니다"), + ("wait_agents", "에이전트 대기 — 실행 중인 서브에이전트의 결과를 수집합니다"), + ("memory", "에이전트 메모리 — 프로젝트 규칙, 선호도를 저장/검색합니다"), + ("skill_manager", "스킬 관리 — 스킬 목록 조회, 상세 정보, 재로드"), + ("project_rules", "프로젝트 지침 — AX.md 개발 지침을 읽고 씁니다"), + }), + }; + + // 도구 목록을 섹션으로 그룹화 + var toolCards = new List(); + + // 설명 + // 도구 헤더 + toolCards.Add(new TextBlock + { + Text = $"등록된 도구/커넥터 ({toolGroups.Sum(g => g.Tools.Length)})", + FontSize = 13, + FontWeight = FontWeights.SemiBold, + Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.White, + Margin = new Thickness(2, 4, 0, 4), + }); + toolCards.Add(new TextBlock + { + Text = "에이전트가 사용할 수 있는 도구 목록입니다. 코워크/코드 탭에서 LLM이 자동으로 호출합니다.", + FontSize = 11, + Foreground = TryFindResource("SecondaryText") as Brush + ?? ThemeResourceHelper.HexBrush("#9999BB"), + Margin = new Thickness(2, 0, 0, 10), + TextWrapping = TextWrapping.Wrap, + }); + + foreach (var group in toolGroups) + { + // 카테고리 카드 + var card = new Border + { + Background = TryFindResource("ItemBackground") as Brush ?? Brushes.White, + CornerRadius = new CornerRadius(10), + Padding = new Thickness(14, 10, 14, 10), + Margin = new Thickness(0, 0, 0, 6), + }; + + var cardPanel = new StackPanel(); + + // 도구 아이템 패널 (접기/열기 대상) + var toolItemsPanel = new StackPanel { Visibility = Visibility.Collapsed }; + + // 접기/열기 화살표 + var arrow = new TextBlock + { + Text = "\uE70D", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 9, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 6, 0), + RenderTransformOrigin = new Point(0.5, 0.5), + RenderTransform = new RotateTransform(0), + }; + + // 카테고리 헤더 (클릭 가능) + var catHeader = new Border + { + Background = Brushes.Transparent, + Cursor = Cursors.Hand, + }; + var catHeaderPanel = new StackPanel { Orientation = Orientation.Horizontal }; + catHeaderPanel.Children.Add(arrow); + catHeaderPanel.Children.Add(new TextBlock + { + Text = group.Icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, + Foreground = ThemeResourceHelper.HexBrush(group.IconColor), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 8, 0), + }); + var catTitle = new TextBlock + { + Text = $"{group.Category} ({group.Tools.Length})", + FontSize = 12.5, + FontWeight = FontWeights.SemiBold, + Foreground = TryFindResource("PrimaryText") as Brush + ?? ThemeResourceHelper.HexBrush("#1A1B2E"), + VerticalAlignment = VerticalAlignment.Center, + }; + catHeaderPanel.Children.Add(catTitle); + catHeader.Child = catHeaderPanel; + + // 클릭 시 접기/열기 토글 + catHeader.MouseLeftButtonDown += (s, e) => + { + e.Handled = true; + bool isVisible = toolItemsPanel.Visibility == Visibility.Visible; + toolItemsPanel.Visibility = isVisible ? Visibility.Collapsed : Visibility.Visible; + arrow.RenderTransform = new RotateTransform(isVisible ? 0 : 90); + }; + + cardPanel.Children.Add(catHeader); + + // 구분선 + toolItemsPanel.Children.Add(new Border + { + Height = 1, + Background = TryFindResource("BorderColor") as Brush + ?? ThemeResourceHelper.HexBrush("#F0F0F4"), + Margin = new Thickness(0, 6, 0, 4), + }); + + // 도구 아이템 + foreach (var (name, toolDesc) in group.Tools) + { + var row = new Grid { Margin = new Thickness(0, 3, 0, 3) }; + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) }); + row.ColumnDefinitions.Add(new ColumnDefinition()); + + var nameBlock = new TextBlock + { + Text = name, + FontSize = 12, + FontFamily = new FontFamily("Consolas, Cascadia Code, Segoe UI"), + Foreground = TryFindResource("AccentColor") as Brush + ?? ThemeResourceHelper.HexBrush("#4B5EFC"), + VerticalAlignment = VerticalAlignment.Center, + MinWidth = 130, + Margin = new Thickness(4, 0, 12, 0), + }; + Grid.SetColumn(nameBlock, 0); + row.Children.Add(nameBlock); + + var descBlock = new TextBlock + { + Text = toolDesc, + FontSize = 11.5, + Foreground = TryFindResource("SecondaryText") as Brush + ?? ThemeResourceHelper.HexBrush("#6666AA"), + VerticalAlignment = VerticalAlignment.Center, + TextWrapping = TextWrapping.Wrap, + }; + Grid.SetColumn(descBlock, 1); + row.Children.Add(descBlock); + + toolItemsPanel.Children.Add(row); + } + + cardPanel.Children.Add(toolItemsPanel); + card.Child = cardPanel; + toolCards.Add(card); + } + + // ── 도구 목록을 직접 추가 (카테고리별 접기/열기) ── + foreach (var card in toolCards) + AgentEtcContent.Children.Insert(AgentEtcContent.Children.Count, card); + + int insertIdx = AgentEtcContent.Children.Count; + + // ── 로드된 스킬 목록 ── + BuildSkillListSection(ref insertIdx); + } + + private void BuildSkillListSection(ref int insertIdx) + { + if (AgentEtcContent == null) return; + + var skills = Services.Agent.SkillService.Skills; + if (skills.Count == 0) return; + + var accentColor = ThemeResourceHelper.HexColor("#4B5EFC"); + var subtleText = ThemeResourceHelper.HexColor("#6666AA"); + + // 스킬 콘텐츠를 모아서 접기/열기 섹션에 넣기 + var skillItems = new List(); + + // 설명 + skillItems.Add(new TextBlock + { + Text = "/ 명령으로 호출할 수 있는 스킬 목록입니다. 앱 내장 + 사용자 추가 스킬이 포함됩니다.\n" + + "(스킬은 사용자가 직접 /명령어를 입력해야 실행됩니다. LLM이 자동 호출하지 않습니다.)", + FontSize = 11, + Foreground = new SolidColorBrush(subtleText), + Margin = new Thickness(2, 0, 0, 10), + TextWrapping = TextWrapping.Wrap, + }); + + // 내장 스킬 / 고급 스킬 분류 + var builtIn = skills.Where(s => string.IsNullOrEmpty(s.Requires)).ToList(); + var advanced = skills.Where(s => !string.IsNullOrEmpty(s.Requires)).ToList(); + + // 내장 스킬 카드 + if (builtIn.Count > 0) + { + var card = CreateSkillGroupCard("내장 스킬", "\uE768", "#34D399", builtIn); + skillItems.Add(card); + } + + // 고급 스킬 (런타임 의존) 카드 + if (advanced.Count > 0) + { + var card = CreateSkillGroupCard("고급 스킬 (런타임 필요)", "\uE9D9", "#A78BFA", advanced); + skillItems.Add(card); + } + + // ── 스킬 가져오기/내보내기 버튼 ── + var btnPanel = new StackPanel + { + Orientation = Orientation.Horizontal, + Margin = new Thickness(2, 4, 0, 10), + }; + + // 가져오기 버튼 + var importBtn = new Border + { + Background = ThemeResourceHelper.HexBrush("#4B5EFC"), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(14, 7, 14, 7), + Margin = new Thickness(0, 0, 8, 0), + Cursor = Cursors.Hand, + }; + var importContent = new StackPanel { Orientation = Orientation.Horizontal }; + importContent.Children.Add(new TextBlock + { + Text = "\uE8B5", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, + Foreground = Brushes.White, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 6, 0), + }); + importContent.Children.Add(new TextBlock + { + Text = "스킬 가져오기 (.zip)", + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = Brushes.White, + VerticalAlignment = VerticalAlignment.Center, + }); + importBtn.Child = importContent; + importBtn.MouseLeftButtonUp += SkillImport_Click; + importBtn.MouseEnter += (s, _) => ((Border)s).Opacity = 0.85; + importBtn.MouseLeave += (s, _) => ((Border)s).Opacity = 1.0; + btnPanel.Children.Add(importBtn); + + // 내보내기 버튼 + var exportBtn = new Border + { + Background = ThemeResourceHelper.HexBrush("#F0F1F5"), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(14, 7, 14, 7), + Cursor = Cursors.Hand, + }; + var exportContent = new StackPanel { Orientation = Orientation.Horizontal }; + exportContent.Children.Add(new TextBlock + { + Text = "\uEDE1", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, + Foreground = ThemeResourceHelper.HexBrush("#555"), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 6, 0), + }); + exportContent.Children.Add(new TextBlock + { + Text = "스킬 내보내기", + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = ThemeResourceHelper.HexBrush("#444"), + VerticalAlignment = VerticalAlignment.Center, + }); + exportBtn.Child = exportContent; + exportBtn.MouseLeftButtonUp += SkillExport_Click; + exportBtn.MouseEnter += (s, _) => ((Border)s).Opacity = 0.85; + exportBtn.MouseLeave += (s, _) => ((Border)s).Opacity = 1.0; + btnPanel.Children.Add(exportBtn); + + skillItems.Add(btnPanel); + + // ── 갤러리/통계 링크 버튼 ── + var linkPanel = new StackPanel + { + Orientation = Orientation.Horizontal, + Margin = new Thickness(2, 0, 0, 12), + }; + + var galleryBtn = new Border + { + CornerRadius = new CornerRadius(8), + Padding = new Thickness(14, 7, 14, 7), + Margin = new Thickness(0, 0, 8, 0), + Background = new SolidColorBrush(Color.FromArgb(0x18, 0x4B, 0x5E, 0xFC)), + Cursor = Cursors.Hand, + }; + var galleryContent = new StackPanel { Orientation = Orientation.Horizontal }; + galleryContent.Children.Add(new TextBlock + { + Text = "\uE768", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, + Foreground = ThemeResourceHelper.HexBrush("#4B5EFC"), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 6, 0), + }); + galleryContent.Children.Add(new TextBlock + { + Text = "스킬 갤러리 열기", + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = ThemeResourceHelper.HexBrush("#4B5EFC"), + }); + galleryBtn.Child = galleryContent; + galleryBtn.MouseLeftButtonUp += (_, _) => + { + var win = new SkillGalleryWindow(); + win.Owner = Window.GetWindow(this); + win.ShowDialog(); + }; + galleryBtn.MouseEnter += (s, _) => ((Border)s).Opacity = 0.8; + galleryBtn.MouseLeave += (s, _) => ((Border)s).Opacity = 1.0; + linkPanel.Children.Add(galleryBtn); + + var statsBtn = new Border + { + CornerRadius = new CornerRadius(8), + Padding = new Thickness(14, 7, 14, 7), + Background = new SolidColorBrush(Color.FromArgb(0x18, 0xA7, 0x8B, 0xFA)), + Cursor = Cursors.Hand, + }; + var statsContent = new StackPanel { Orientation = Orientation.Horizontal }; + statsContent.Children.Add(new TextBlock + { + Text = "\uE9D9", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, + Foreground = ThemeResourceHelper.HexBrush("#A78BFA"), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 6, 0), + }); + statsContent.Children.Add(new TextBlock + { + Text = "실행 통계 보기", + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = ThemeResourceHelper.HexBrush("#A78BFA"), + }); + statsBtn.Child = statsContent; + statsBtn.MouseLeftButtonUp += (_, _) => + { + var win = new AgentStatsDashboardWindow(); + win.Owner = Window.GetWindow(this); + win.ShowDialog(); + }; + statsBtn.MouseEnter += (s, _) => ((Border)s).Opacity = 0.8; + statsBtn.MouseLeave += (s, _) => ((Border)s).Opacity = 1.0; + linkPanel.Children.Add(statsBtn); + + skillItems.Add(linkPanel); + + // ── 스킬 섹션 직접 추가 ── + // 스킬 헤더 + var skillHeader = new TextBlock + { + Text = $"슬래시 스킬 ({skills.Count})", + FontSize = 13, + FontWeight = FontWeights.SemiBold, + Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.White, + Margin = new Thickness(2, 16, 0, 8), + }; + AgentEtcContent.Children.Insert(insertIdx++, skillHeader); + foreach (var item in skillItems) + AgentEtcContent.Children.Insert(insertIdx++, item); + } + + private Border CreateSkillGroupCard(string title, string icon, string colorHex, + List skills) + { + var color = ThemeResourceHelper.HexColor(colorHex); + var card = new Border + { + Background = TryFindResource("ItemBackground") as Brush ?? Brushes.White, + CornerRadius = new CornerRadius(10), + Padding = new Thickness(14, 10, 14, 10), + Margin = new Thickness(0, 0, 0, 6), + }; + + var panel = new StackPanel(); + + // 스킬 아이템 패널 (접기/열기 대상) + var skillItemsPanel = new StackPanel { Visibility = Visibility.Collapsed }; + + // 접기/열기 화살표 + var arrow = new TextBlock + { + Text = "\uE70D", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 9, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 6, 0), + RenderTransformOrigin = new Point(0.5, 0.5), + RenderTransform = new RotateTransform(0), + }; + + // 카테고리 헤더 (클릭 가능) + var catHeader = new Border + { + Background = Brushes.Transparent, + Cursor = Cursors.Hand, + }; + var catHeaderPanel = new StackPanel { Orientation = Orientation.Horizontal }; + catHeaderPanel.Children.Add(arrow); + catHeaderPanel.Children.Add(new TextBlock + { + Text = icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, + Foreground = new SolidColorBrush(color), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 8, 0), + }); + catHeaderPanel.Children.Add(new TextBlock + { + Text = $"{title} ({skills.Count})", + FontSize = 12.5, + FontWeight = FontWeights.SemiBold, + Foreground = TryFindResource("PrimaryText") as Brush + ?? ThemeResourceHelper.HexBrush("#1A1B2E"), + VerticalAlignment = VerticalAlignment.Center, + }); + catHeader.Child = catHeaderPanel; + + // 클릭 시 접기/열기 토글 + catHeader.MouseLeftButtonDown += (s, e) => + { + e.Handled = true; + bool isVisible = skillItemsPanel.Visibility == Visibility.Visible; + skillItemsPanel.Visibility = isVisible ? Visibility.Collapsed : Visibility.Visible; + arrow.RenderTransform = new RotateTransform(isVisible ? 0 : 90); + }; + + panel.Children.Add(catHeader); + + // 구분선 + skillItemsPanel.Children.Add(new Border + { + Height = 1, + Background = TryFindResource("BorderColor") as Brush + ?? ThemeResourceHelper.HexBrush("#F0F0F4"), + Margin = new Thickness(0, 2, 0, 4), + }); + + // 스킬 아이템 + foreach (var skill in skills) + { + var row = new StackPanel { Margin = new Thickness(0, 4, 0, 4) }; + + // 위 줄: 스킬 명칭 + 가용성 뱃지 + var namePanel = new StackPanel { Orientation = Orientation.Horizontal }; + namePanel.Children.Add(new TextBlock + { + Text = $"/{skill.Name}", + FontSize = 12, + FontFamily = new FontFamily("Consolas, Cascadia Code, Segoe UI"), + Foreground = skill.IsAvailable + ? (TryFindResource("AccentColor") as Brush ?? ThemeResourceHelper.HexBrush("#4B5EFC")) + : Brushes.Gray, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(4, 0, 8, 0), + Opacity = skill.IsAvailable ? 1.0 : 0.5, + }); + + if (!skill.IsAvailable && !string.IsNullOrEmpty(skill.Requires)) + { + namePanel.Children.Add(new Border + { + Background = new SolidColorBrush(Color.FromArgb(0x20, 0xF8, 0x71, 0x71)), + CornerRadius = new CornerRadius(4), + Padding = new Thickness(5, 1, 5, 1), + VerticalAlignment = VerticalAlignment.Center, + Child = new TextBlock + { + Text = skill.UnavailableHint, + FontSize = 9, + Foreground = new SolidColorBrush(Color.FromRgb(0xF8, 0x71, 0x71)), + FontWeight = FontWeights.SemiBold, + }, + }); + } + else if (skill.IsAvailable && !string.IsNullOrEmpty(skill.Requires)) + { + namePanel.Children.Add(new Border + { + Background = new SolidColorBrush(Color.FromArgb(0x20, 0x34, 0xD3, 0x99)), + CornerRadius = new CornerRadius(4), + Padding = new Thickness(5, 1, 5, 1), + VerticalAlignment = VerticalAlignment.Center, + Child = new TextBlock + { + Text = "✓ 사용 가능", + FontSize = 9, + Foreground = new SolidColorBrush(Color.FromRgb(0x34, 0xD3, 0x99)), + FontWeight = FontWeights.SemiBold, + }, + }); + } + + row.Children.Add(namePanel); + + // 아래 줄: 설명 (뱃지와 구분되도록 위 여백 추가) + row.Children.Add(new TextBlock + { + Text = $"{skill.Label} — {skill.Description}", + FontSize = 11.5, + Foreground = TryFindResource("SecondaryText") as Brush + ?? ThemeResourceHelper.HexBrush("#6666AA"), + TextWrapping = TextWrapping.Wrap, + Margin = new Thickness(4, 3, 0, 0), + Opacity = skill.IsAvailable ? 1.0 : 0.5, + }); + + skillItemsPanel.Children.Add(row); + } + + panel.Children.Add(skillItemsPanel); + card.Child = panel; + return card; + } + + // ─── 선택 텍스트 AI 명령 설정 ──────────────────────────────────────────────── + + private void BuildTextActionCommandsPanel() + { + if (TextActionCommandsPanel == null) return; + TextActionCommandsPanel.Children.Clear(); + + var svc = CurrentApp?.SettingsService; + if (svc == null) return; + var enabled = svc.Settings.Launcher.TextActionCommands; + var toggleStyle = TryFindResource("ToggleSwitch") as Style; + + foreach (var (key, label) in TextActionPopup.AvailableCommands) + { + var row = new Grid { Margin = new Thickness(0, 3, 0, 3) }; + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + row.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + var labelBlock = new TextBlock + { + Text = label, FontSize = 12.5, + VerticalAlignment = VerticalAlignment.Center, + Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.Black, + }; + Grid.SetColumn(labelBlock, 0); + row.Children.Add(labelBlock); + + var capturedKey = key; + var cb = new CheckBox + { + IsChecked = enabled.Contains(key, StringComparer.OrdinalIgnoreCase), + HorizontalAlignment = HorizontalAlignment.Right, + VerticalAlignment = VerticalAlignment.Center, + }; + if (toggleStyle != null) cb.Style = toggleStyle; + cb.Checked += (_, _) => + { + if (!enabled.Contains(capturedKey)) enabled.Add(capturedKey); + svc.Save(); + }; + cb.Unchecked += (_, _) => + { + // 최소 1개 유지 + if (enabled.Count <= 1) { cb.IsChecked = true; return; } + enabled.RemoveAll(x => x == capturedKey); + svc.Save(); + }; + Grid.SetColumn(cb, 1); + row.Children.Add(cb); + + TextActionCommandsPanel.Children.Add(row); + } + } + + // ─── 테마 하위 탭 전환 ────────────────────────────────────────────────────── + + private void ThemeSubTab_Checked(object sender, RoutedEventArgs e) + { + if (ThemeSelectPanel == null || ThemeColorsPanel == null) return; + if (ThemeSubTabSelect?.IsChecked == true) + { + ThemeSelectPanel.Visibility = Visibility.Visible; + ThemeColorsPanel.Visibility = Visibility.Collapsed; + } + else + { + ThemeSelectPanel.Visibility = Visibility.Collapsed; + ThemeColorsPanel.Visibility = Visibility.Visible; + } + } + + // ─── 일반 하위 탭 전환 (일반 + 알림) ────────────────────────────────────── + + private bool _notifyMoved; + + private void GeneralSubTab_Checked(object sender, RoutedEventArgs e) + { + if (GeneralMainPanel == null || GeneralNotifyPanel == null) return; + + // 알림 탭 내용을 최초 1회 NotifyContent로 이동 + if (!_notifyMoved && NotifyContent != null) + { + MoveNotifyTabContent(); + _notifyMoved = true; + } + + GeneralMainPanel.Visibility = GeneralSubTabMain?.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + GeneralNotifyPanel.Visibility = GeneralSubTabNotify?.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + if (GeneralStoragePanel != null) + { + GeneralStoragePanel.Visibility = GeneralSubTabStorage?.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + if (GeneralSubTabStorage?.IsChecked == true) RefreshStorageInfo2(); + } + } + + private void MoveNotifyTabContent() + { + // XAML의 알림 TabItem에서 ScrollViewer → StackPanel 내용을 NotifyContent로 이동 + // 사이드 네비의 "알림" 탭을 찾아서 숨기기 + var mainTab = Content as System.Windows.Controls.Grid; + var tabControl = mainTab?.Children.OfType().FirstOrDefault() + ?? FindVisualChild(this); + if (tabControl == null) return; + + TabItem? notifyTab = null; + foreach (TabItem tab in tabControl.Items) + { + if (tab.Header?.ToString() == "알림") { notifyTab = tab; break; } + } + + if (notifyTab?.Content is ScrollViewer sv && sv.Content is StackPanel sp) + { + // 내용물을 NotifyContent로 복제 이동 + var children = sp.Children.Cast().ToList(); + sp.Children.Clear(); + foreach (var child in children) + NotifyContent.Children.Add(child); + } + + // 알림 탭 숨기기 + if (notifyTab != null) notifyTab.Visibility = Visibility.Collapsed; + } + + private static T? FindVisualChild(DependencyObject parent) where T : DependencyObject + { + for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) + { + var child = VisualTreeHelper.GetChild(parent, i); + if (child is T t) return t; + var result = FindVisualChild(child); + if (result != null) return result; + } + return null; + } + + // ─── 독 바 설정 ──────────────────────────────────────────────────────────── + + private void BuildDockBarSettings() + { + var svc = CurrentApp?.SettingsService; + if (svc == null) return; + var launcher = svc.Settings.Launcher; + + // 토글 바인딩 + ChkDockAutoShow.IsChecked = launcher.DockBarAutoShow; + ChkDockAutoShow.Checked += (_, _) => + { + launcher.DockBarAutoShow = true; svc.Save(); + CurrentApp?.ToggleDockBar(); + }; + ChkDockAutoShow.Unchecked += (_, _) => + { + launcher.DockBarAutoShow = false; svc.Save(); + // 끄기 시에는 설정만 저장 — 독 바를 토글하지 않음 (이미 표시 중이면 유지, 다음 재시작 시 안 뜸) + }; + + ChkDockRainbowGlow.IsChecked = launcher.DockBarRainbowGlow; + ChkDockRainbowGlow.Checked += (_, _) => { launcher.DockBarRainbowGlow = true; svc.Save(); RefreshDock(); }; + ChkDockRainbowGlow.Unchecked += (_, _) => { launcher.DockBarRainbowGlow = false; svc.Save(); RefreshDock(); }; + + SliderDockOpacity.Value = launcher.DockBarOpacity; + SliderDockOpacity.ValueChanged += (_, e) => { launcher.DockBarOpacity = e.NewValue; svc.Save(); RefreshDock(); }; + + // 표시 항목 토글 리스트 + if (DockItemsPanel == null) return; + DockItemsPanel.Children.Clear(); + var toggleStyle = TryFindResource("ToggleSwitch") as System.Windows.Style; + var enabled = launcher.DockBarItems; + + foreach (var (key, icon, tooltip) in DockBarWindow.AvailableItems) + { + var row = new System.Windows.Controls.Grid { Margin = new Thickness(0, 3, 0, 3) }; + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + row.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + var label = new TextBlock + { + Text = $"{tooltip}", + FontSize = 12.5, + VerticalAlignment = VerticalAlignment.Center, + Foreground = TryFindResource("PrimaryText") as System.Windows.Media.Brush ?? System.Windows.Media.Brushes.Black, + }; + System.Windows.Controls.Grid.SetColumn(label, 0); + row.Children.Add(label); + + var capturedKey = key; + var cb = new CheckBox + { + IsChecked = enabled.Contains(key), + HorizontalAlignment = HorizontalAlignment.Right, + VerticalAlignment = VerticalAlignment.Center, + }; + if (toggleStyle != null) cb.Style = toggleStyle; + cb.Checked += (_, _) => { if (!enabled.Contains(capturedKey)) enabled.Add(capturedKey); svc.Save(); RefreshDock(); }; + cb.Unchecked += (_, _) => { enabled.RemoveAll(x => x == capturedKey); svc.Save(); RefreshDock(); }; + System.Windows.Controls.Grid.SetColumn(cb, 1); + row.Children.Add(cb); + + DockItemsPanel.Children.Add(row); + } + } + + private static SolidColorBrush BrushFromHex(string hex) + { + try { return ThemeResourceHelper.HexBrush(hex); } + catch (Exception) { return new SolidColorBrush(Colors.Gray); } + } + + private static void RefreshDock() + { + CurrentApp?.RefreshDockBar(); + } + + private void BtnDockResetPosition_Click(object sender, RoutedEventArgs e) + { + var result = CustomMessageBox.Show( + "독 바를 화면 하단 중앙으로 이동하시겠습니까?", + "독 바 위치 초기화", + MessageBoxButton.YesNo, MessageBoxImage.Question); + if (result != MessageBoxResult.Yes) return; + + var svc = CurrentApp?.SettingsService; + if (svc == null) return; + svc.Settings.Launcher.DockBarLeft = -1; + svc.Settings.Launcher.DockBarTop = -1; + svc.Save(); + + // 즉시 독 바 위치 이동 + CurrentApp?.RefreshDockBar(); + } + + // ─── 저장 공간 관리 ────────────────────────────────────────────────────── + + private void RefreshStorageInfo() + { + if (StorageSummaryText == null) return; + var report = StorageAnalyzer.Analyze(); + + StorageSummaryText.Text = $"앱 전체 사용량: {StorageAnalyzer.FormatSize(report.TotalAppUsage)}"; + StorageDriveText.Text = $"드라이브 {report.DriveLabel} 여유: {StorageAnalyzer.FormatSize(report.DriveFreeSpace)} / {StorageAnalyzer.FormatSize(report.DriveTotalSpace)}"; + + if (StorageDetailPanel == null) return; + StorageDetailPanel.Children.Clear(); + + var items = new (string Label, long Size)[] + { + ("대화 기록", report.Conversations), + ("감사 로그", report.AuditLogs), + ("앱 로그", report.Logs), + ("코드 인덱스", report.CodeIndex), + ("임베딩 DB", report.EmbeddingDb), + ("클립보드 히스토리", report.ClipboardHistory), + ("플러그인", report.Plugins), + ("JSON 스킬", report.Skills), + }; + + foreach (var (label, size) in items) + { + if (size == 0) continue; + var row = new Grid { Margin = new Thickness(0, 2, 0, 2) }; + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + row.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + var labelTb = new TextBlock { Text = label, FontSize = 12, Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.Black, VerticalAlignment = VerticalAlignment.Center }; + Grid.SetColumn(labelTb, 0); + row.Children.Add(labelTb); + + var sizeTb = new TextBlock { Text = StorageAnalyzer.FormatSize(size), FontSize = 12, FontFamily = new FontFamily("Consolas"), Foreground = Brushes.Gray, VerticalAlignment = VerticalAlignment.Center }; + Grid.SetColumn(sizeTb, 1); + row.Children.Add(sizeTb); + + StorageDetailPanel.Children.Add(row); + } + } + + private void BtnStorageRefresh_Click(object sender, RoutedEventArgs e) => RefreshStorageInfo(); + + private void RefreshStorageInfo2() + { + if (StorageSummaryText2 == null) return; + var report = StorageAnalyzer.Analyze(); + StorageSummaryText2.Text = $"앱 전체 사용량: {StorageAnalyzer.FormatSize(report.TotalAppUsage)}"; + StorageDriveText2.Text = $"드라이브 {report.DriveLabel} 여유: {StorageAnalyzer.FormatSize(report.DriveFreeSpace)} / {StorageAnalyzer.FormatSize(report.DriveTotalSpace)}"; + + if (StorageDetailPanel2 == null) return; + StorageDetailPanel2.Children.Clear(); + var items = new (string Label, long Size)[] + { + ("대화 기록", report.Conversations), ("감사 로그", report.AuditLogs), + ("앱 로그", report.Logs), ("코드 인덱스", report.CodeIndex), + ("임베딩 DB", report.EmbeddingDb), + ("클립보드 히스토리", report.ClipboardHistory), + ("플러그인", report.Plugins), ("JSON 스킬", report.Skills), + }; + foreach (var (label, size) in items) + { + if (size == 0) continue; + var row = new Grid { Margin = new Thickness(0, 2, 0, 2) }; + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + row.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + var labelTb = new TextBlock { Text = label, FontSize = 12, Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.Black }; + Grid.SetColumn(labelTb, 0); row.Children.Add(labelTb); + var sizeTb = new TextBlock { Text = StorageAnalyzer.FormatSize(size), FontSize = 12, FontFamily = new FontFamily("Consolas"), Foreground = Brushes.Gray }; + Grid.SetColumn(sizeTb, 1); row.Children.Add(sizeTb); + StorageDetailPanel2.Children.Add(row); + } + } + + private void BtnStorageRefresh2_Click(object sender, RoutedEventArgs e) => RefreshStorageInfo2(); + + private void BtnStorageCleanup_Click(object sender, RoutedEventArgs e) + { + // 테마 리소스 조회 + var bgBrush = TryFindResource("LauncherBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)); + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subFgBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var borderBrush = TryFindResource("BorderColor") as Brush ?? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + var itemBg = TryFindResource("ItemBackground") as Brush ?? new SolidColorBrush(Color.FromArgb(0x10, 0xFF, 0xFF, 0xFF)); + var hoverBg = TryFindResource("ItemHoverBackground") as Brush ?? new SolidColorBrush(Color.FromArgb(0x22, 0xFF, 0xFF, 0xFF)); + var shadowColor = TryFindResource("ShadowColor") is Color sc ? sc : Colors.Black; + + // 보관 기간 선택 팝업 — 커스텀 버튼으로 날짜 선택 + var popup = new Window + { + WindowStyle = WindowStyle.None, AllowsTransparency = true, Background = Brushes.Transparent, + Width = 360, SizeToContent = SizeToContent.Height, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, ShowInTaskbar = false, Topmost = true, + }; + + int selectedDays = -1; + + var outerBorder = new Border + { + Background = bgBrush, CornerRadius = new CornerRadius(14), BorderBrush = borderBrush, + BorderThickness = new Thickness(1), Margin = new Thickness(16), + Effect = new System.Windows.Media.Effects.DropShadowEffect { BlurRadius = 20, ShadowDepth = 4, Opacity = 0.3, Color = shadowColor }, + }; + + var stack = new StackPanel { Margin = new Thickness(24, 20, 24, 20) }; + stack.Children.Add(new TextBlock { Text = "보관 기간 선택", FontSize = 15, FontWeight = FontWeights.SemiBold, Foreground = fgBrush, Margin = new Thickness(0, 0, 0, 6) }); + stack.Children.Add(new TextBlock { Text = "선택한 기간 이전의 데이터를 삭제합니다.\n※ 통계/대화 기록은 삭제되지 않습니다.", FontSize = 12, Foreground = subFgBrush, TextWrapping = TextWrapping.Wrap, Margin = new Thickness(0, 0, 0, 16) }); + + var btnDays = new (int Days, string Label)[] { (7, "최근 7일만 보관"), (14, "최근 14일만 보관"), (30, "최근 30일만 보관"), (0, "전체 삭제") }; + foreach (var (days, label) in btnDays) + { + var d = days; + var isDelete = d == 0; + var deleteBg = new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0x44, 0x44)); + var deleteBorder = new SolidColorBrush(Color.FromArgb(0x40, 0xFF, 0x44, 0x44)); + var deleteText = new SolidColorBrush(Color.FromRgb(0xFF, 0x66, 0x66)); + var btn = new Border + { + CornerRadius = new CornerRadius(10), Cursor = Cursors.Hand, + Padding = new Thickness(14, 10, 14, 10), Margin = new Thickness(0, 0, 0, 6), + Background = isDelete ? deleteBg : itemBg, + BorderBrush = isDelete ? deleteBorder : borderBrush, + BorderThickness = new Thickness(1), + }; + btn.Child = new TextBlock { Text = label, FontSize = 13, Foreground = isDelete ? deleteText : fgBrush }; + var normalBg = isDelete ? deleteBg : itemBg; + btn.MouseEnter += (s, _) => { if (s is Border b) b.Background = hoverBg; }; + btn.MouseLeave += (s, _) => { if (s is Border b) b.Background = normalBg; }; + btn.MouseLeftButtonUp += (_, _) => { selectedDays = d; popup.Close(); }; + stack.Children.Add(btn); + } + + // 취소 + var cancelBtn = new Border { CornerRadius = new CornerRadius(10), Cursor = Cursors.Hand, Padding = new Thickness(14, 8, 14, 8), Margin = new Thickness(0, 6, 0, 0), Background = Brushes.Transparent }; + cancelBtn.Child = new TextBlock { Text = "취소", FontSize = 12, Foreground = subFgBrush, HorizontalAlignment = HorizontalAlignment.Center }; + cancelBtn.MouseLeftButtonUp += (_, _) => popup.Close(); + stack.Children.Add(cancelBtn); + + outerBorder.Child = stack; + popup.Content = outerBorder; + popup.ShowDialog(); + + if (selectedDays < 0) return; + + // 삭제 전 확인 + var confirmMsg = selectedDays == 0 + ? "전체 데이터를 삭제합니다. 정말 진행하시겠습니까?" + : $"최근 {selectedDays}일 이전의 데이터를 삭제합니다. 정말 진행하시겠습니까?"; + var confirm = CustomMessageBox.Show(confirmMsg, "삭제 확인", MessageBoxButton.YesNo, MessageBoxImage.Warning); + if (confirm != MessageBoxResult.Yes) return; + + var freed = StorageAnalyzer.Cleanup( + retainDays: selectedDays, + cleanConversations: false, + cleanAuditLogs: true, + cleanLogs: true, + cleanCodeIndex: true, + cleanClipboard: selectedDays == 0 + ); + + CustomMessageBox.Show( + $"{StorageAnalyzer.FormatSize(freed)}를 확보했습니다.", + "정리 완료", MessageBoxButton.OK, MessageBoxImage.Information); + + RefreshStorageInfo(); + } + + // ─── 알림 카테고리 체크박스 ─────────────────────────────────────────────── + + private void BuildQuoteCategoryCheckboxes() + { + if (QuoteCategoryPanel == null) return; + QuoteCategoryPanel.Children.Clear(); + + var enabled = _vm.GetReminderCategories(); + var toggleStyle = TryFindResource("ToggleSwitch") as Style; + + foreach (var (key, label, countFunc) in Services.QuoteService.Categories) + { + var count = countFunc(); + var displayLabel = key == "today_events" + ? $"{label} ({count}개, 오늘 {Services.QuoteService.GetTodayMatchCount()}개)" + : $"{label} ({count}개)"; + + // 좌: 라벨, 우: 토글 스위치 + var row = new Grid { Margin = new Thickness(0, 3, 0, 3) }; + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + row.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + var labelBlock = new TextBlock + { + Text = displayLabel, + FontSize = 12.5, + VerticalAlignment = VerticalAlignment.Center, + Foreground = TryFindResource("PrimaryText") as System.Windows.Media.Brush + ?? System.Windows.Media.Brushes.White, + }; + Grid.SetColumn(labelBlock, 0); + row.Children.Add(labelBlock); + + var cb = new CheckBox + { + IsChecked = enabled.Contains(key, StringComparer.OrdinalIgnoreCase), + Tag = key, + HorizontalAlignment = HorizontalAlignment.Right, + VerticalAlignment = VerticalAlignment.Center, + }; + if (toggleStyle != null) cb.Style = toggleStyle; + cb.Checked += (s, _) => + { + if (s is CheckBox c && c.Tag is string k && !enabled.Contains(k)) + enabled.Add(k); + }; + cb.Unchecked += (s, _) => + { + if (s is CheckBox c && c.Tag is string k) + enabled.RemoveAll(x => x.Equals(k, StringComparison.OrdinalIgnoreCase)); + }; + Grid.SetColumn(cb, 1); + row.Children.Add(cb); + + QuoteCategoryPanel.Children.Add(row); + } + } + + // ─── 버전 표시 ────────────────────────────────────────────────────────── + + /// + /// 하단 버전 텍스트를 AxCopilot.csproj <Version> 값에서 동적으로 읽어 설정합니다. + /// 버전을 올릴 때는 AxCopilot.csproj → <Version> 하나만 수정하면 됩니다. + /// 이 함수와 SettingsWindow.xaml 의 VersionInfoText 는 항상 함께 유지됩니다. + /// + private void SetVersionText() + { + try + { + var asm = System.Reflection.Assembly.GetExecutingAssembly(); + // FileVersionInfo 에서 읽어야 csproj 이 반영됩니다. + var fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(asm.Location); + var ver = fvi.ProductVersion ?? fvi.FileVersion ?? "?"; + // 빌드 메타데이터 제거 (예: "1.0.3+gitabcdef" → "1.0.3") + var plusIdx = ver.IndexOf('+'); + if (plusIdx > 0) ver = ver[..plusIdx]; + VersionInfoText.Text = $"AX Copilot · v{ver}"; + } + catch (Exception) + { + VersionInfoText.Text = "AX Copilot"; + } + } + + // ─── 핫키 (콤보박스 선택 방식) ────────────────────────────────────────── + + /// 이전 녹화기에서 호출되던 초기화 — 콤보박스 전환 후 무연산 (호환용) + private void RefreshHotkeyBadges() { /* 콤보박스 SelectedValue 바인딩으로 대체 */ } + + /// 현재 핫키가 콤보박스 목록에 없으면 항목으로 추가합니다. + private void EnsureHotkeyInCombo() + { + if (HotkeyCombo == null) return; + var hotkey = _vm.Hotkey; + if (string.IsNullOrWhiteSpace(hotkey)) return; + + // 이미 목록에 있는지 확인 + foreach (System.Windows.Controls.ComboBoxItem item in HotkeyCombo.Items) + { + if (item.Tag is string tag && tag == hotkey) return; + } + + // 목록에 없으면 현재 값을 추가 + var display = hotkey.Replace("+", " + "); + var newItem = new System.Windows.Controls.ComboBoxItem + { + Content = $"{display} (사용자 정의)", + Tag = hotkey + }; + HotkeyCombo.Items.Insert(0, newItem); + HotkeyCombo.SelectedIndex = 0; + } + + /// Window-level PreviewKeyDown — 핫키 녹화 제거 후 잔여 호출 보호 + private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { } + + /// WPF Key → HotkeyParser가 인식하는 문자열 이름. + private static string GetKeyName(Key key) => key switch + { + Key.Space => "Space", + Key.Enter or Key.Return => "Enter", + Key.Tab => "Tab", + Key.Back => "Backspace", + Key.Delete => "Delete", + Key.Escape => "Escape", + Key.Home => "Home", + Key.End => "End", + Key.PageUp => "PageUp", + Key.PageDown => "PageDown", + Key.Left => "Left", + Key.Right => "Right", + Key.Up => "Up", + Key.Down => "Down", + Key.Insert => "Insert", + // A–Z + >= Key.A and <= Key.Z => key.ToString(), + // 0–9 (메인 키보드) + >= Key.D0 and <= Key.D9 => ((int)(key - Key.D0)).ToString(), + // F1–F12 + >= Key.F1 and <= Key.F12 => key.ToString(), + // 기호 + Key.OemTilde => "`", + Key.OemMinus => "-", + Key.OemPlus => "=", + Key.OemOpenBrackets => "[", + Key.OemCloseBrackets => "]", + Key.OemPipe or Key.OemBackslash => "\\", + Key.OemSemicolon => ";", + Key.OemQuotes => "'", + Key.OemComma => ",", + Key.OemPeriod => ".", + Key.OemQuestion => "/", + _ => key.ToString() + }; + + private void HotkeyCombo_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) + { + // 콤보박스 선택이 바뀌면 ViewModel의 Hotkey를 업데이트 + // (바인딩이 SelectedValue에 연결되어 자동 처리되지만, + // 기존 RefreshHotkeyBadges 호출은 콤보박스 도입으로 불필요) + } + + // ─── 기존 이벤트 핸들러 ────────────────────────────────────────────────── + + private async void BtnTestConnection_Click(object sender, RoutedEventArgs e) + { + var btn = sender as Button; + if (btn != null) btn.Content = "테스트 중..."; + try + { + // 현재 UI 값으로 임시 LLM 서비스 생성하여 테스트 (설정 저장/창 닫기 없이) + var llm = new Services.LlmService(_vm.Service); + var (ok, msg) = await llm.TestConnectionAsync(); + llm.Dispose(); + CustomMessageBox.Show(msg, ok ? "연결 성공" : "연결 실패", + MessageBoxButton.OK, + ok ? MessageBoxImage.Information : MessageBoxImage.Warning); + } + catch (Exception ex) + { + CustomMessageBox.Show(ex.Message, "오류", MessageBoxButton.OK, MessageBoxImage.Error); + } + finally + { + if (btn != null) btn.Content = "테스트"; + } + } + + // ─── 등록 모델 관리 ────────────────────────────────────────────────── + + private bool IsEncryptionEnabled => + CurrentApp?.SettingsService?.Settings.Llm.EncryptionEnabled ?? false; + + /// 현재 선택된 서비스 서브탭 이름을 반환합니다. + private string GetCurrentServiceSubTab() + { + if (SvcTabOllama?.IsChecked == true) return "ollama"; + if (SvcTabVllm?.IsChecked == true) return "vllm"; + if (SvcTabGemini?.IsChecked == true) return "gemini"; + if (SvcTabClaude?.IsChecked == true) return "claude"; + return _vm.LlmService; // 폴백 + } + + private void BtnBrowseSkillFolder_Click(object sender, RoutedEventArgs e) + { + var dlg = new System.Windows.Forms.FolderBrowserDialog + { + Description = "스킬 파일이 있는 폴더를 선택하세요", + ShowNewFolderButton = true, + }; + if (!string.IsNullOrEmpty(_vm.SkillsFolderPath) && System.IO.Directory.Exists(_vm.SkillsFolderPath)) + dlg.SelectedPath = _vm.SkillsFolderPath; + if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) + _vm.SkillsFolderPath = dlg.SelectedPath; + } + + private void BtnOpenSkillFolder_Click(object sender, RoutedEventArgs e) + { + // 기본 스킬 폴더 열기 (사용자 앱데이터) + var folder = !string.IsNullOrEmpty(_vm.SkillsFolderPath) && System.IO.Directory.Exists(_vm.SkillsFolderPath) + ? _vm.SkillsFolderPath + : System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "AxCopilot", "skills"); + if (!System.IO.Directory.Exists(folder)) System.IO.Directory.CreateDirectory(folder); + try { System.Diagnostics.Process.Start("explorer.exe", folder); } catch (Exception) { } + } + + // ─── 스킬 가져오기/내보내기 ────────────────────────────────────────── + + private void SkillImport_Click(object sender, MouseButtonEventArgs e) + { + var dlg = new Microsoft.Win32.OpenFileDialog + { + Filter = "스킬 패키지 (*.zip)|*.zip", + Title = "가져올 스킬 zip 파일을 선택하세요", + }; + if (dlg.ShowDialog() != true) return; + + var count = Services.Agent.SkillService.ImportSkills(dlg.FileName); + if (count > 0) + CustomMessageBox.Show($"스킬 {count}개를 성공적으로 가져왔습니��.\n스킬 목록이 갱신됩니다.", "스킬 가져오기"); + else + CustomMessageBox.Show("스킬 가져오기에 실패했습니다.\nzip 파일에 .skill.md 또는 SKILL.md 파일이 포함되어야 합니다.", "스킬 가져오기"); + } + + private void SkillExport_Click(object sender, MouseButtonEventArgs e) + { + var skills = Services.Agent.SkillService.Skills; + if (skills.Count == 0) + { + CustomMessageBox.Show("내보낼 스킬이 없습니다.", "스킬 내보내기"); + return; + } + + // 스킬 선택 팝업 + var popup = new Window + { + WindowStyle = WindowStyle.None, + AllowsTransparency = true, + Background = Brushes.Transparent, + SizeToContent = SizeToContent.WidthAndHeight, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, + MaxHeight = 450, + }; + + var bgBrush = TryFindResource("LauncherBackground") as Brush ?? Brushes.White; + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.Black; + var subFgBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + + var outer = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(12), + Padding = new Thickness(20), + MinWidth = 360, + Effect = new System.Windows.Media.Effects.DropShadowEffect + { + BlurRadius = 20, ShadowDepth = 4, Opacity = 0.3, + Color = Colors.Black, + }, + }; + var mainPanel = new StackPanel(); + mainPanel.Children.Add(new TextBlock + { + Text = "내보낼 스킬 선택", + FontSize = 15, + FontWeight = FontWeights.SemiBold, + Foreground = fgBrush, + Margin = new Thickness(0, 0, 0, 12), + }); + + var checkBoxes = new List<(CheckBox cb, Services.Agent.SkillDefinition skill)>(); + var listPanel = new StackPanel(); + foreach (var skill in skills) + { + var cb = new CheckBox + { + Content = $"/{skill.Name} — {skill.Label}", + FontSize = 12.5, + Foreground = fgBrush, + Margin = new Thickness(0, 3, 0, 3), + IsChecked = false, + }; + checkBoxes.Add((cb, skill)); + listPanel.Children.Add(cb); + } + var scrollViewer = new ScrollViewer + { + Content = listPanel, + MaxHeight = 280, + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + }; + mainPanel.Children.Add(scrollViewer); + + // 버튼 행 + var btnRow = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(0, 14, 0, 0), + }; + var cancelBtn = new Border + { + Background = ThemeResourceHelper.HexBrush("#F0F1F5"), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(16, 7, 16, 7), + Margin = new Thickness(0, 0, 8, 0), + Cursor = Cursors.Hand, + Child = new TextBlock { Text = "취소", FontSize = 12, Foreground = subFgBrush }, + }; + cancelBtn.MouseLeftButtonUp += (_, _) => popup.Close(); + btnRow.Children.Add(cancelBtn); + + var okBtn = new Border + { + Background = ThemeResourceHelper.HexBrush("#4B5EFC"), + CornerRadius = new CornerRadius(8), + Padding = new Thickness(16, 7, 16, 7), + Cursor = Cursors.Hand, + Child = new TextBlock { Text = "내보내기", FontSize = 12, FontWeight = FontWeights.SemiBold, Foreground = Brushes.White }, + }; + okBtn.MouseLeftButtonUp += (_, _) => + { + var selected = checkBoxes.Where(x => x.cb.IsChecked == true).Select(x => x.skill).ToList(); + if (selected.Count == 0) + { + CustomMessageBox.Show("내보낼 스킬을 선택하세요.", "스킬 내보내기"); + return; + } + + // 저장 폴더 선택 + var folderDlg = new System.Windows.Forms.FolderBrowserDialog + { + Description = "스킬 zip을 저장할 폴더를 선택하세요", + }; + if (folderDlg.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + + int exported = 0; + foreach (var skill in selected) + { + var result = Services.Agent.SkillService.ExportSkill(skill, folderDlg.SelectedPath); + if (result != null) exported++; + } + + popup.Close(); + if (exported > 0) + CustomMessageBox.Show($"{exported}개 스킬을 내보냈습니다.\n경로: {folderDlg.SelectedPath}", "스킬 내보내기"); + else + CustomMessageBox.Show("내보내기에 실패했습니다.", "스킬 내보내기"); + }; + btnRow.Children.Add(okBtn); + mainPanel.Children.Add(btnRow); + + outer.Child = mainPanel; + popup.Content = outer; + popup.KeyDown += (_, ke) => { if (ke.Key == Key.Escape) popup.Close(); }; + popup.ShowDialog(); + } + + private void BtnAddModel_Click(object sender, RoutedEventArgs e) + { + var currentService = GetCurrentServiceSubTab(); + var dlg = new ModelRegistrationDialog(currentService); + dlg.Owner = this; + if (dlg.ShowDialog() == true) + { + _vm.RegisteredModels.Add(new ViewModels.RegisteredModelRow + { + Alias = dlg.ModelAlias, + EncryptedModelName = Services.CryptoService.EncryptIfEnabled(dlg.ModelName, IsEncryptionEnabled), + Service = currentService, + Endpoint = dlg.Endpoint, + ApiKey = Services.CryptoService.EncryptIfEnabled(dlg.ApiKey, IsEncryptionEnabled), + AuthType = dlg.AuthType, + Cp4dUrl = dlg.Cp4dUrl, + Cp4dUsername = dlg.Cp4dUsername, + Cp4dPassword = Services.CryptoService.EncryptIfEnabled(dlg.Cp4dPassword, IsEncryptionEnabled), + }); + BuildFallbackModelsPanel(); + } + } + + private void BtnEditModel_Click(object sender, RoutedEventArgs e) + { + if (sender is not Button btn || btn.Tag is not ViewModels.RegisteredModelRow row) return; + + string currentModel = Services.CryptoService.DecryptIfEnabled(row.EncryptedModelName, IsEncryptionEnabled); + string currentApiKey = Services.CryptoService.DecryptIfEnabled(row.ApiKey ?? "", IsEncryptionEnabled); + string cp4dPw = Services.CryptoService.DecryptIfEnabled(row.Cp4dPassword ?? "", IsEncryptionEnabled); + + var currentService = GetCurrentServiceSubTab(); + var dlg = new ModelRegistrationDialog(currentService, row.Alias, currentModel, + row.Endpoint, currentApiKey, + row.AuthType ?? "bearer", row.Cp4dUrl ?? "", row.Cp4dUsername ?? "", cp4dPw); + dlg.Owner = this; + if (dlg.ShowDialog() == true) + { + row.Alias = dlg.ModelAlias; + row.EncryptedModelName = Services.CryptoService.EncryptIfEnabled(dlg.ModelName, IsEncryptionEnabled); + row.Service = currentService; + row.Endpoint = dlg.Endpoint; + row.ApiKey = Services.CryptoService.EncryptIfEnabled(dlg.ApiKey, IsEncryptionEnabled); + row.AuthType = dlg.AuthType; + row.Cp4dUrl = dlg.Cp4dUrl; + row.Cp4dUsername = dlg.Cp4dUsername; + row.Cp4dPassword = Services.CryptoService.EncryptIfEnabled(dlg.Cp4dPassword, IsEncryptionEnabled); + BuildFallbackModelsPanel(); + } + } + + private void BtnDeleteModel_Click(object sender, RoutedEventArgs e) + { + if (sender is not Button btn || btn.Tag is not ViewModels.RegisteredModelRow row) return; + var result = CustomMessageBox.Show($"'{row.Alias}' 모델을 삭제하시겠습니까?", "모델 삭제", + MessageBoxButton.YesNo, MessageBoxImage.Question); + if (result == MessageBoxResult.Yes) + { + _vm.RegisteredModels.Remove(row); + BuildFallbackModelsPanel(); + } + } + + // ─── 프롬프트 템플릿 관리 ──────────────────────────────────────────── + + private void BtnAddTemplate_Click(object sender, RoutedEventArgs e) + { + var dlg = new PromptTemplateDialog(); + dlg.Owner = this; + if (dlg.ShowDialog() == true) + { + _vm.PromptTemplates.Add(new ViewModels.PromptTemplateRow + { + Name = dlg.TemplateName, + Content = dlg.TemplateContent, + }); + } + } + + private void BtnEditTemplate_Click(object sender, RoutedEventArgs e) + { + if (sender is not Button btn || btn.Tag is not ViewModels.PromptTemplateRow row) return; + var dlg = new PromptTemplateDialog(row.Name, row.Content); + dlg.Owner = this; + if (dlg.ShowDialog() == true) + { + row.Name = dlg.TemplateName; + row.Content = dlg.TemplateContent; + } + } + + private void BtnDeleteTemplate_Click(object sender, RoutedEventArgs e) + { + if (sender is not Button btn || btn.Tag is not ViewModels.PromptTemplateRow row) return; + var result = CustomMessageBox.Show($"'{row.Name}' 템플릿을 삭제하시겠습니까?", "템플릿 삭제", + MessageBoxButton.YesNo, MessageBoxImage.Question); + if (result == MessageBoxResult.Yes) + _vm.PromptTemplates.Remove(row); + } + + // ─── AX Agent 서브탭 전환 ─────────────────────────────────────────── + + private void AgentSubTab_Checked(object sender, RoutedEventArgs e) + { + if (AgentPanelCommon == null) return; // 초기화 전 방어 + AgentPanelCommon.Visibility = AgentTabCommon.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + AgentPanelChat.Visibility = AgentTabChat.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + AgentPanelCoworkCode.Visibility = AgentTabCoworkCode.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + AgentPanelCowork.Visibility = AgentTabCowork.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + AgentPanelCode.Visibility = AgentTabCode.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + if (AgentPanelDev != null) + AgentPanelDev.Visibility = AgentTabDev.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + if (AgentPanelEtc != null) + AgentPanelEtc.Visibility = AgentTabEtc.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + if (AgentPanelTools != null) + { + var show = AgentTabTools.IsChecked == true; + AgentPanelTools.Visibility = show ? Visibility.Visible : Visibility.Collapsed; + if (show) LoadToolCards(); + } + } + + // ─── 도구 관리 카드 UI ────────────────────────────────────────────── + + private bool _toolCardsLoaded; + private HashSet _disabledTools = new(StringComparer.OrdinalIgnoreCase); + + /// 도구 카드 UI를 카테고리별로 생성합니다. + private void LoadToolCards() + { + if (_toolCardsLoaded || ToolCardsPanel == null) return; + _toolCardsLoaded = true; + + var app = CurrentApp; + var settings = app?.SettingsService?.Settings.Llm; + using var tools = Services.Agent.ToolRegistry.CreateDefault(); + _disabledTools = new HashSet(settings?.DisabledTools ?? new(), StringComparer.OrdinalIgnoreCase); + var disabled = _disabledTools; + + // 카테고리 매핑 + var categories = new Dictionary> + { + ["파일/검색"] = new(), + ["문서 생성"] = new(), + ["문서 품질"] = new(), + ["코드/개발"] = new(), + ["데이터/유틸"] = new(), + ["시스템"] = new(), + }; + + var toolCategoryMap = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + // 파일/검색 + ["file_read"] = "파일/검색", ["file_write"] = "파일/검색", ["file_edit"] = "파일/검색", + ["glob"] = "파일/검색", ["grep"] = "파일/검색", ["folder_map"] = "파일/검색", + ["document_read"] = "파일/검색", ["file_watch"] = "파일/검색", + // 문서 생성 + ["excel_skill"] = "문서 생성", ["docx_skill"] = "문서 생성", ["csv_skill"] = "문서 생성", + ["markdown_skill"] = "문서 생성", ["html_skill"] = "문서 생성", ["chart_skill"] = "문서 생성", + ["batch_skill"] = "문서 생성", ["pptx_skill"] = "문서 생성", + ["document_planner"] = "문서 생성", ["document_assembler"] = "문서 생성", + // 문서 품질 + ["document_review"] = "문서 품질", ["format_convert"] = "문서 품질", + ["template_render"] = "문서 품질", ["text_summarize"] = "문서 품질", + // 코드/개발 + ["dev_env_detect"] = "코드/개발", ["build_run"] = "코드/개발", ["git_tool"] = "코드/개발", + ["lsp"] = "코드/개발", ["sub_agent"] = "코드/개발", ["wait_agents"] = "코드/개발", + ["code_search"] = "코드/개발", ["test_loop"] = "코드/개발", + ["code_review"] = "코드/개발", ["project_rule"] = "코드/개발", + // 시스템 + ["process"] = "시스템", ["skill_manager"] = "시스템", ["memory"] = "시스템", + ["clipboard"] = "시스템", ["notify"] = "시스템", ["env"] = "시스템", + ["image_analyze"] = "시스템", + }; + + foreach (var tool in tools.All) + { + var cat = toolCategoryMap.TryGetValue(tool.Name, out var c) ? c : "데이터/유틸"; + if (categories.ContainsKey(cat)) + categories[cat].Add(tool); + else + categories["데이터/유틸"].Add(tool); + } + + var accentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.CornflowerBlue; + var secondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var itemBg = TryFindResource("ItemBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0xF5, 0xF5, 0xF8)); + + foreach (var kv in categories) + { + if (kv.Value.Count == 0) continue; + + // 카테고리 헤더 + var header = new TextBlock + { + Text = $"{kv.Key} ({kv.Value.Count})", + FontSize = 13, FontWeight = FontWeights.SemiBold, + Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.Black, + Margin = new Thickness(0, 8, 0, 6), + }; + ToolCardsPanel.Children.Add(header); + + // 카드 WrapPanel + var wrap = new WrapPanel { Margin = new Thickness(0, 0, 0, 4) }; + foreach (var tool in kv.Value.OrderBy(t => t.Name)) + { + var isEnabled = !disabled.Contains(tool.Name); + var card = CreateToolCard(tool, isEnabled, disabled, accentBrush, secondaryText, itemBg); + wrap.Children.Add(card); + } + ToolCardsPanel.Children.Add(wrap); + } + + // MCP 서버 상태 + LoadMcpStatus(); + } + + /// 개별 도구 카드를 생성합니다 (이름 + 설명 + 토글). + private Border CreateToolCard(Services.Agent.IAgentTool tool, bool isEnabled, + HashSet disabled, Brush accentBrush, Brush secondaryText, Brush itemBg) + { + var card = new Border + { + Background = itemBg, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(10, 8, 10, 8), + Margin = new Thickness(0, 0, 8, 8), + Width = 240, + BorderBrush = isEnabled ? Brushes.Transparent : new SolidColorBrush(Color.FromArgb(0x30, 0xDC, 0x26, 0x26)), + BorderThickness = new Thickness(1), + }; + + var grid = new Grid(); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + // 이름 + 설명 + var textStack = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; + var nameBlock = new TextBlock + { + Text = tool.Name, + FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.Black, + TextTrimming = TextTrimming.CharacterEllipsis, + }; + textStack.Children.Add(nameBlock); + + var desc = tool.Description; + if (desc.Length > 50) desc = desc[..50] + "…"; + var descBlock = new TextBlock + { + Text = desc, + FontSize = 10.5, + Foreground = secondaryText, + TextTrimming = TextTrimming.CharacterEllipsis, + Margin = new Thickness(0, 2, 0, 0), + }; + textStack.Children.Add(descBlock); + Grid.SetColumn(textStack, 0); + grid.Children.Add(textStack); + + // 토글 (CheckBox + ToggleSwitch 스타일) + var toggle = new CheckBox + { + IsChecked = isEnabled, + Style = TryFindResource("ToggleSwitch") as Style, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(8, 0, 0, 0), + }; + toggle.Checked += (_, _) => + { + disabled.Remove(tool.Name); + card.BorderBrush = Brushes.Transparent; + }; + toggle.Unchecked += (_, _) => + { + disabled.Add(tool.Name); + card.BorderBrush = new SolidColorBrush(Color.FromArgb(0x30, 0xDC, 0x26, 0x26)); + }; + Grid.SetColumn(toggle, 1); + grid.Children.Add(toggle); + + card.Child = grid; + return card; + } + + /// MCP 서버 연결 상태 표시를 생성합니다. + private void LoadMcpStatus() + { + if (McpStatusPanel == null) return; + McpStatusPanel.Children.Clear(); + + var app = CurrentApp; + var settings = app?.SettingsService?.Settings.Llm; + var mcpServers = settings?.McpServers; + + if (mcpServers == null || mcpServers.Count == 0) + { + McpStatusPanel.Children.Add(new TextBlock + { + Text = "등록된 MCP 서버가 없습니다.", + FontSize = 12, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + Margin = new Thickness(0, 4, 0, 0), + }); + return; + } + + var itemBg = TryFindResource("ItemBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0xF5, 0xF5, 0xF8)); + + foreach (var server in mcpServers) + { + var row = new Border + { + Background = itemBg, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(12, 8, 12, 8), + Margin = new Thickness(0, 0, 0, 6), + }; + + var grid = new Grid(); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + // 상태 아이콘 + var statusDot = new Border + { + Width = 8, Height = 8, + CornerRadius = new CornerRadius(4), + Background = new SolidColorBrush(Color.FromRgb(0x34, 0xA8, 0x53)), // 녹색 (등록됨) + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 8, 0), + }; + Grid.SetColumn(statusDot, 0); + grid.Children.Add(statusDot); + + // 서버 이름 + 명령 + var infoStack = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; + infoStack.Children.Add(new TextBlock + { + Text = server.Name ?? "(이름 없음)", + FontSize = 12, FontWeight = FontWeights.SemiBold, + Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.Black, + }); + infoStack.Children.Add(new TextBlock + { + Text = server.Command ?? "", + FontSize = 10.5, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + TextTrimming = TextTrimming.CharacterEllipsis, + }); + Grid.SetColumn(infoStack, 1); + grid.Children.Add(infoStack); + + // 상태 텍스트 + var statusText = new TextBlock + { + Text = "등록됨", + FontSize = 11, + Foreground = new SolidColorBrush(Color.FromRgb(0x34, 0xA8, 0x53)), + VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(statusText, 2); + grid.Children.Add(statusText); + + row.Child = grid; + McpStatusPanel.Children.Add(row); + } + } + + // ─── 기능 설정 서브탭 전환 ────────────────────────────────────────── + private void FuncSubTab_Checked(object sender, RoutedEventArgs e) + { + if (FuncPanel_AI == null) return; // 초기화 전 방어 + + FuncPanel_AI.Visibility = FuncSubTab_AI.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + FuncPanel_Launcher.Visibility = FuncSubTab_Launcher.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + FuncPanel_Design.Visibility = FuncSubTab_Design.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + } + + // ─── 접기/열기 섹션 토글 ─────────────────────────────────────────── + private void CollapsibleSection_Toggle(object sender, System.Windows.Input.MouseButtonEventArgs e) + { + if (sender is Border border && border.Tag is System.Windows.Controls.Expander expander) + expander.IsExpanded = !expander.IsExpanded; + } + + private void ServiceSubTab_Checked(object sender, RoutedEventArgs e) + { + if (SvcPanelOllama == null) return; // 초기화 전 방어 + SvcPanelOllama.Visibility = SvcTabOllama.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + SvcPanelVllm.Visibility = SvcTabVllm.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + SvcPanelGemini.Visibility = SvcTabGemini.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + SvcPanelClaude.Visibility = SvcTabClaude.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + } + + private void ThemeCard_Click(object sender, RoutedEventArgs e) + { + if (sender is Button btn && btn.Tag is string key) + _vm.SelectTheme(key); + } + + private void ColorSwatch_Click(object sender, RoutedEventArgs e) + { + if (sender is Button btn && btn.Tag is ColorRowModel row) + _vm.PickColor(row); + } + + private void DevModeCheckBox_Checked(object sender, RoutedEventArgs e) + { + if (sender is not CheckBox cb || !cb.IsChecked.GetValueOrDefault()) return; + // 설정 창 로드 중 바인딩에 의한 자동 Checked 이벤트 무시 (이미 활성화된 상태 복원) + if (!IsLoaded) return; + + // 테마 리소스 조회 + var bgBrush = TryFindResource("LauncherBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x1E, 0x1E, 0x2E)); + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subFgBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var borderBrush = TryFindResource("BorderColor") as Brush ?? new SolidColorBrush(Color.FromRgb(0x40, 0x40, 0x60)); + var itemBg = TryFindResource("ItemBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2A, 0x40)); + + // 비밀번호 확인 다이얼로그 + var dlg = new Window + { + Title = "개발자 모드 — 비밀번호 확인", + Width = 340, SizeToContent = SizeToContent.Height, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, ResizeMode = ResizeMode.NoResize, + WindowStyle = WindowStyle.None, AllowsTransparency = true, + Background = Brushes.Transparent, + }; + var border = new Border + { + Background = bgBrush, CornerRadius = new CornerRadius(12), + BorderBrush = borderBrush, BorderThickness = new Thickness(1), Padding = new Thickness(20), + }; + var stack = new StackPanel(); + stack.Children.Add(new TextBlock + { + Text = "\U0001f512 개발자 모드 활성화", + FontSize = 15, FontWeight = FontWeights.SemiBold, + Foreground = fgBrush, Margin = new Thickness(0, 0, 0, 12), + }); + stack.Children.Add(new TextBlock + { + Text = "비밀번호를 입력하세요:", + FontSize = 12, Foreground = subFgBrush, Margin = new Thickness(0, 0, 0, 6), + }); + var pwBox = new PasswordBox + { + FontSize = 14, Padding = new Thickness(8, 6, 8, 6), + Background = itemBg, Foreground = fgBrush, BorderBrush = borderBrush, PasswordChar = '*', + }; + stack.Children.Add(pwBox); + + var btnRow = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 16, 0, 0) }; + var cancelBtn = new Button { Content = "취소", Padding = new Thickness(16, 6, 16, 6), Margin = new Thickness(0, 0, 8, 0) }; + cancelBtn.Click += (_, _) => { dlg.DialogResult = false; }; + btnRow.Children.Add(cancelBtn); + var okBtn = new Button { Content = "확인", Padding = new Thickness(16, 6, 16, 6), IsDefault = true }; + okBtn.Click += (_, _) => + { + if (pwBox.Password == "mouse12#") + dlg.DialogResult = true; + else + { + pwBox.Clear(); + pwBox.Focus(); + } + }; + btnRow.Children.Add(okBtn); + stack.Children.Add(btnRow); + border.Child = stack; + dlg.Content = border; + dlg.Loaded += (_, _) => pwBox.Focus(); + + if (dlg.ShowDialog() != true) + { + // 비밀번호 실패/취소 — 체크 해제 + DevMode 강제 false + _vm.DevMode = false; + cb.IsChecked = false; + } + UpdateDevModeContentVisibility(); + } + + private void DevModeCheckBox_Unchecked(object sender, RoutedEventArgs e) + { + UpdateDevModeContentVisibility(); + } + + /// 개발자 모드 활성화 상태에 따라 개발자 탭 내용 표시/숨김. + private void UpdateDevModeContentVisibility() + { + if (DevModeContent != null) + DevModeContent.Visibility = _vm.DevMode ? Visibility.Visible : Visibility.Collapsed; + } + + // ─── AI 기능 활성화 토글 ──────────────────────────────────────────────── + + /// AI 기능 토글 상태를 UI와 설정에 반영합니다. + private void ApplyAiEnabledState(bool enabled, bool init = false) + { + // 토글 스위치 체크 상태 동기화 (init 시에는 이벤트 억제) + if (AiEnabledToggle != null && AiEnabledToggle.IsChecked != enabled) + { + AiEnabledToggle.IsChecked = enabled; + } + // AX Agent 탭 가시성 + if (AgentTabItem != null) + AgentTabItem.Visibility = enabled ? Visibility.Visible : Visibility.Collapsed; + } + + private void AiEnabled_Changed(object sender, RoutedEventArgs e) + { + if (!IsLoaded) return; + var tryEnable = AiEnabledToggle?.IsChecked == true; + + // 비활성화는 즉시 적용 (비밀번호 불필요) + if (!tryEnable) + { + var app2 = CurrentApp; + if (app2?.SettingsService?.Settings != null) + { + app2.SettingsService.Settings.AiEnabled = false; + app2.SettingsService.Save(); + } + ApplyAiEnabledState(false); + return; + } + + // 이미 활성화된 상태에서 설정 창이 열릴 때 토글 복원으로 인한 이벤트 → 비밀번호 불필요 + var currentApp = CurrentApp; + if (currentApp?.SettingsService?.Settings.AiEnabled == true) return; + + // 새로 활성화하는 경우에만 비밀번호 확인 + var bgBrush = TryFindResource("LauncherBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x1E, 0x1E, 0x2E)); + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subFgBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var borderBrush = TryFindResource("BorderColor") as Brush ?? new SolidColorBrush(Color.FromRgb(0x40, 0x40, 0x60)); + var itemBg = TryFindResource("ItemBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2A, 0x40)); + + var dlg = new Window + { + Title = "AI 기능 활성화 — 비밀번호 확인", + Width = 340, SizeToContent = SizeToContent.Height, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, ResizeMode = ResizeMode.NoResize, + WindowStyle = WindowStyle.None, AllowsTransparency = true, + Background = Brushes.Transparent, + }; + var border = new Border + { + Background = bgBrush, CornerRadius = new CornerRadius(12), + BorderBrush = borderBrush, BorderThickness = new Thickness(1), Padding = new Thickness(20), + }; + var stack = new StackPanel(); + stack.Children.Add(new TextBlock + { + Text = "\U0001f512 AI 기능 활성화", + FontSize = 15, FontWeight = FontWeights.SemiBold, + Foreground = fgBrush, Margin = new Thickness(0, 0, 0, 12), + }); + stack.Children.Add(new TextBlock + { + Text = "비밀번호를 입력하세요:", + FontSize = 12, Foreground = subFgBrush, Margin = new Thickness(0, 0, 0, 6), + }); + var pwBox = new PasswordBox + { + FontSize = 14, Padding = new Thickness(8, 6, 8, 6), + Background = itemBg, Foreground = fgBrush, BorderBrush = borderBrush, PasswordChar = '*', + }; + stack.Children.Add(pwBox); + + var btnRow = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 16, 0, 0) }; + var cancelBtn = new Button { Content = "취소", Padding = new Thickness(16, 6, 16, 6), Margin = new Thickness(0, 0, 8, 0) }; + cancelBtn.Click += (_, _) => { dlg.DialogResult = false; }; + btnRow.Children.Add(cancelBtn); + var okBtn = new Button { Content = "확인", Padding = new Thickness(16, 6, 16, 6), IsDefault = true }; + okBtn.Click += (_, _) => + { + if (pwBox.Password == SettingsPassword) + dlg.DialogResult = true; + else + { + pwBox.Clear(); + pwBox.Focus(); + } + }; + btnRow.Children.Add(okBtn); + stack.Children.Add(btnRow); + border.Child = stack; + dlg.Content = border; + dlg.Loaded += (_, _) => pwBox.Focus(); + + if (dlg.ShowDialog() == true) + { + var app = CurrentApp; + if (app?.SettingsService?.Settings != null) + { + app.SettingsService.Settings.AiEnabled = true; + app.SettingsService.Save(); + } + ApplyAiEnabledState(true); + } + else + { + // 취소/실패 — 토글 원상복구 + if (AiEnabledToggle != null) AiEnabledToggle.IsChecked = false; + } + } + + // ─── 사내/사외 모드 토글 ───────────────────────────────────────────────────── + + private const string SettingsPassword = "axgo123!"; + + private void NetworkMode_Changed(object sender, RoutedEventArgs e) + { + if (!IsLoaded) return; + var tryInternalMode = InternalModeToggle?.IsChecked == true; // true = 사내(차단), false = 사외(허용) + + // 사내 모드로 전환(차단 강화)은 비밀번호 불필요 + if (tryInternalMode) + { + var app2 = CurrentApp; + if (app2?.SettingsService?.Settings != null) + { + app2.SettingsService.Settings.InternalModeEnabled = true; + app2.SettingsService.Save(); + } + return; + } + + // 이미 사외 모드인 경우 토글 복원으로 인한 이벤트 → 비밀번호 불필요 + var currentApp = CurrentApp; + if (currentApp?.SettingsService?.Settings.InternalModeEnabled == false) return; + + // 사외 모드 활성화(외부 허용)는 비밀번호 확인 필요 + var bgBrush = TryFindResource("LauncherBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x1E, 0x1E, 0x2E)); + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subFgBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var borderBrush = TryFindResource("BorderColor") as Brush ?? new SolidColorBrush(Color.FromRgb(0x40, 0x40, 0x60)); + var itemBg = TryFindResource("ItemBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2A, 0x40)); + + var dlg = new Window + { + Title = "사외 모드 활성화 — 비밀번호 확인", + Width = 340, SizeToContent = SizeToContent.Height, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, ResizeMode = ResizeMode.NoResize, + WindowStyle = WindowStyle.None, AllowsTransparency = true, + Background = Brushes.Transparent, + }; + var border = new Border + { + Background = bgBrush, CornerRadius = new CornerRadius(12), + BorderBrush = borderBrush, BorderThickness = new Thickness(1), Padding = new Thickness(20), + }; + var stack = new StackPanel(); + stack.Children.Add(new TextBlock + { + Text = "🌐 사외 모드 활성화", + FontSize = 15, FontWeight = FontWeights.SemiBold, + Foreground = fgBrush, Margin = new Thickness(0, 0, 0, 8), + }); + stack.Children.Add(new TextBlock + { + Text = "사외 모드에서는 인터넷 검색과 외부 HTTP 접속이 허용됩니다.\n비밀번호를 입력하세요:", + FontSize = 12, Foreground = subFgBrush, Margin = new Thickness(0, 0, 0, 10), + TextWrapping = TextWrapping.Wrap, + }); + var pwBox = new PasswordBox + { + FontSize = 14, Padding = new Thickness(8, 6, 8, 6), + Background = itemBg, Foreground = fgBrush, BorderBrush = borderBrush, PasswordChar = '*', + }; + stack.Children.Add(pwBox); + + var btnRow = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 16, 0, 0) }; + var cancelBtn = new Button { Content = "취소", Padding = new Thickness(16, 6, 16, 6), Margin = new Thickness(0, 0, 8, 0) }; + cancelBtn.Click += (_, _) => { dlg.DialogResult = false; }; + btnRow.Children.Add(cancelBtn); + var okBtn = new Button { Content = "확인", Padding = new Thickness(16, 6, 16, 6), IsDefault = true }; + okBtn.Click += (_, _) => + { + if (pwBox.Password == SettingsPassword) + dlg.DialogResult = true; + else + { + pwBox.Clear(); + pwBox.Focus(); + } + }; + btnRow.Children.Add(okBtn); + stack.Children.Add(btnRow); + border.Child = stack; + dlg.Content = border; + dlg.Loaded += (_, _) => pwBox.Focus(); + + if (dlg.ShowDialog() == true) + { + var app = CurrentApp; + if (app?.SettingsService?.Settings != null) + { + app.SettingsService.Settings.InternalModeEnabled = false; + app.SettingsService.Save(); + } + } + else + { + // 취소/실패 — 토글 원상복구 (사내 모드 유지) + if (InternalModeToggle != null) InternalModeToggle.IsChecked = true; + } + } + + private void StepApprovalCheckBox_Checked(object sender, RoutedEventArgs e) + { + if (sender is not CheckBox cb || !cb.IsChecked.GetValueOrDefault()) return; + // 설정 창 로드 중 바인딩에 의한 자동 Checked 이벤트 무시 (이미 활성화된 상태 복원) + if (!IsLoaded) return; + + // 테마 리소스 조회 + var bgBrush = TryFindResource("LauncherBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x1E, 0x1E, 0x2E)); + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subFgBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var borderBrush = TryFindResource("BorderColor") as Brush ?? new SolidColorBrush(Color.FromRgb(0x40, 0x40, 0x60)); + var itemBg = TryFindResource("ItemBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2A, 0x40)); + + var dlg = new Window + { + Title = "스텝 바이 스텝 승인 — 비밀번호 확인", + Width = 340, SizeToContent = SizeToContent.Height, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, ResizeMode = ResizeMode.NoResize, + WindowStyle = WindowStyle.None, AllowsTransparency = true, + Background = Brushes.Transparent, + }; + var border = new Border + { + Background = bgBrush, CornerRadius = new CornerRadius(12), + BorderBrush = borderBrush, BorderThickness = new Thickness(1), Padding = new Thickness(20), + }; + var stack = new StackPanel(); + stack.Children.Add(new TextBlock + { + Text = "\U0001f50d 스텝 바이 스텝 승인 활성화", + FontSize = 15, FontWeight = FontWeights.SemiBold, + Foreground = fgBrush, Margin = new Thickness(0, 0, 0, 12), + }); + stack.Children.Add(new TextBlock + { + Text = "개발자 비밀번호를 입력하세요:", + FontSize = 12, Foreground = subFgBrush, Margin = new Thickness(0, 0, 0, 6), + }); + var pwBox = new PasswordBox + { + FontSize = 14, Padding = new Thickness(8, 6, 8, 6), + Background = itemBg, Foreground = fgBrush, BorderBrush = borderBrush, PasswordChar = '*', + }; + stack.Children.Add(pwBox); + + var btnRow = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 16, 0, 0) }; + var cancelBtn = new Button { Content = "취소", Padding = new Thickness(16, 6, 16, 6), Margin = new Thickness(0, 0, 8, 0) }; + cancelBtn.Click += (_, _) => { dlg.DialogResult = false; }; + btnRow.Children.Add(cancelBtn); + var okBtn = new Button { Content = "확인", Padding = new Thickness(16, 6, 16, 6), IsDefault = true }; + okBtn.Click += (_, _) => + { + if (pwBox.Password == "mouse12#") + dlg.DialogResult = true; + else + { + pwBox.Clear(); + pwBox.Focus(); + } + }; + btnRow.Children.Add(okBtn); + stack.Children.Add(btnRow); + border.Child = stack; + dlg.Content = border; + dlg.Loaded += (_, _) => pwBox.Focus(); + + if (dlg.ShowDialog() != true) + { + cb.IsChecked = false; + } + } + + private void BtnClearMemory_Click(object sender, RoutedEventArgs e) + { + var result = CustomMessageBox.Show( + "에이전트 메모리를 초기화하면 학습된 모든 규칙과 선호도가 삭제됩니다.\n계속하시겠습니까?", + "에이전트 메모리 초기화", + MessageBoxButton.YesNo, + MessageBoxImage.Warning); + if (result != MessageBoxResult.Yes) return; + + var app = CurrentApp; + app?.MemoryService?.Clear(); + CustomMessageBox.Show("에이전트 메모리가 초기화되었습니다.", "완료", MessageBoxButton.OK, MessageBoxImage.Information); + } + + // ─── 에이전트 훅 관리 ───────────────────────────────────────────────── + + private void AddHookBtn_Click(object sender, MouseButtonEventArgs e) + { + ShowHookEditDialog(null, -1); + } + + /// 플레이스홀더(워터마크) TextBlock 생성 헬퍼. + private static TextBlock CreatePlaceholder(string text, Brush foreground, string? currentValue) + { + return new TextBlock + { + Text = text, + FontSize = 13, + Foreground = foreground, + Opacity = 0.45, + IsHitTestVisible = false, + VerticalAlignment = VerticalAlignment.Center, + Padding = new Thickness(14, 8, 14, 8), + Visibility = string.IsNullOrEmpty(currentValue) ? Visibility.Visible : Visibility.Collapsed, + }; + } + + private void ShowHookEditDialog(Models.AgentHookEntry? existing, int index) + { + var bgBrush = TryFindResource("LauncherBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x1E, 0x1E, 0x2E)); + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subFgBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var borderBrush = TryFindResource("BorderColor") as Brush ?? new SolidColorBrush(Color.FromRgb(0x40, 0x40, 0x60)); + var itemBg = TryFindResource("ItemBackground") as Brush ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2A, 0x40)); + var accentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.CornflowerBlue; + + var isNew = existing == null; + var dlg = new Window + { + Title = isNew ? "훅 추가" : "훅 편집", + Width = 420, SizeToContent = SizeToContent.Height, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, ResizeMode = ResizeMode.NoResize, + WindowStyle = WindowStyle.None, AllowsTransparency = true, + Background = Brushes.Transparent, + }; + + var border = new Border + { + Background = bgBrush, CornerRadius = new CornerRadius(12), + BorderBrush = borderBrush, BorderThickness = new Thickness(1), Padding = new Thickness(20), + }; + var stack = new StackPanel(); + + // 제목 + stack.Children.Add(new TextBlock + { + Text = isNew ? "\u2699 훅 추가" : "\u2699 훅 편집", + FontSize = 15, FontWeight = FontWeights.SemiBold, + Foreground = fgBrush, Margin = new Thickness(0, 0, 0, 14), + }); + + // ESC 키로 닫기 + dlg.KeyDown += (_, e) => { if (e.Key == System.Windows.Input.Key.Escape) dlg.Close(); }; + + // 훅 이름 + stack.Children.Add(new TextBlock { Text = "훅 이름", FontSize = 12, Foreground = subFgBrush, Margin = new Thickness(0, 0, 0, 4) }); + var nameBox = new TextBox + { + Text = existing?.Name ?? "", FontSize = 13, + Foreground = fgBrush, Background = itemBg, + BorderBrush = borderBrush, Padding = new Thickness(12, 8, 12, 8), + }; + var nameHolder = CreatePlaceholder("예: 코드 리뷰 후 알림", subFgBrush, existing?.Name); + nameBox.TextChanged += (_, _) => nameHolder.Visibility = string.IsNullOrEmpty(nameBox.Text) ? Visibility.Visible : Visibility.Collapsed; + var nameGrid = new Grid(); + nameGrid.Children.Add(nameBox); + nameGrid.Children.Add(nameHolder); + stack.Children.Add(nameGrid); + + // 대상 도구 + stack.Children.Add(new TextBlock { Text = "대상 도구 (* = 모든 도구)", FontSize = 12, Foreground = subFgBrush, Margin = new Thickness(0, 10, 0, 4) }); + var toolBox = new TextBox + { + Text = existing?.ToolName ?? "*", FontSize = 13, + Foreground = fgBrush, Background = itemBg, + BorderBrush = borderBrush, Padding = new Thickness(12, 8, 12, 8), + }; + var toolHolder = CreatePlaceholder("예: file_write, grep_tool", subFgBrush, existing?.ToolName ?? "*"); + toolBox.TextChanged += (_, _) => toolHolder.Visibility = string.IsNullOrEmpty(toolBox.Text) ? Visibility.Visible : Visibility.Collapsed; + var toolGrid = new Grid(); + toolGrid.Children.Add(toolBox); + toolGrid.Children.Add(toolHolder); + stack.Children.Add(toolGrid); + + // 타이밍 + stack.Children.Add(new TextBlock { Text = "실행 타이밍", FontSize = 12, Foreground = subFgBrush, Margin = new Thickness(0, 10, 0, 4) }); + var timingPanel = new StackPanel { Orientation = Orientation.Horizontal }; + var preRadio = new RadioButton { Content = "Pre (실행 전)", Foreground = fgBrush, FontSize = 13, Margin = new Thickness(0, 0, 16, 0), IsChecked = (existing?.Timing ?? "post") == "pre" }; + var postRadio = new RadioButton { Content = "Post (실행 후)", Foreground = fgBrush, FontSize = 13, IsChecked = (existing?.Timing ?? "post") != "pre" }; + timingPanel.Children.Add(preRadio); + timingPanel.Children.Add(postRadio); + stack.Children.Add(timingPanel); + + // 스크립트 경로 + stack.Children.Add(new TextBlock { Text = "스크립트 경로 (.bat / .cmd / .ps1)", FontSize = 12, Foreground = subFgBrush, Margin = new Thickness(0, 10, 0, 4) }); + var pathGrid = new Grid(); + pathGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + pathGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + var pathInnerGrid = new Grid(); + var pathBox = new TextBox + { + Text = existing?.ScriptPath ?? "", FontSize = 13, + Foreground = fgBrush, Background = itemBg, + BorderBrush = borderBrush, Padding = new Thickness(12, 8, 12, 8), + }; + var pathHolder = CreatePlaceholder("예: C:\\scripts\\review-notify.bat", subFgBrush, existing?.ScriptPath); + pathBox.TextChanged += (_, _) => pathHolder.Visibility = string.IsNullOrEmpty(pathBox.Text) ? Visibility.Visible : Visibility.Collapsed; + pathInnerGrid.Children.Add(pathBox); + pathInnerGrid.Children.Add(pathHolder); + Grid.SetColumn(pathInnerGrid, 0); + pathGrid.Children.Add(pathInnerGrid); + + var browseBtn = new Border + { + Background = itemBg, CornerRadius = new CornerRadius(6), + Padding = new Thickness(10, 6, 10, 6), Margin = new Thickness(6, 0, 0, 0), + Cursor = Cursors.Hand, VerticalAlignment = VerticalAlignment.Center, + }; + browseBtn.Child = new TextBlock { Text = "...", FontSize = 13, Foreground = accentBrush }; + browseBtn.MouseLeftButtonUp += (_, _) => + { + var ofd = new Microsoft.Win32.OpenFileDialog + { + Filter = "스크립트 파일|*.bat;*.cmd;*.ps1|모든 파일|*.*", + Title = "훅 스크립트 선택", + }; + if (ofd.ShowDialog() == true) pathBox.Text = ofd.FileName; + }; + Grid.SetColumn(browseBtn, 1); + pathGrid.Children.Add(browseBtn); + stack.Children.Add(pathGrid); + + // 추가 인수 + stack.Children.Add(new TextBlock { Text = "추가 인수 (선택)", FontSize = 12, Foreground = subFgBrush, Margin = new Thickness(0, 10, 0, 4) }); + var argsBox = new TextBox + { + Text = existing?.Arguments ?? "", FontSize = 13, + Foreground = fgBrush, Background = itemBg, + BorderBrush = borderBrush, Padding = new Thickness(12, 8, 12, 8), + }; + var argsHolder = CreatePlaceholder("예: --verbose --output log.txt", subFgBrush, existing?.Arguments); + argsBox.TextChanged += (_, _) => argsHolder.Visibility = string.IsNullOrEmpty(argsBox.Text) ? Visibility.Visible : Visibility.Collapsed; + var argsGrid = new Grid(); + argsGrid.Children.Add(argsBox); + argsGrid.Children.Add(argsHolder); + stack.Children.Add(argsGrid); + + // 버튼 행 + var btnRow = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 16, 0, 0) }; + var cancelBorder = new Border + { + Background = itemBg, CornerRadius = new CornerRadius(8), + Padding = new Thickness(16, 8, 16, 8), Margin = new Thickness(0, 0, 8, 0), Cursor = Cursors.Hand, + }; + cancelBorder.Child = new TextBlock { Text = "취소", FontSize = 13, Foreground = subFgBrush }; + cancelBorder.MouseLeftButtonUp += (_, _) => dlg.Close(); + btnRow.Children.Add(cancelBorder); + + var saveBorder = new Border + { + Background = accentBrush, CornerRadius = new CornerRadius(8), + Padding = new Thickness(16, 8, 16, 8), Cursor = Cursors.Hand, + }; + saveBorder.Child = new TextBlock { Text = isNew ? "추가" : "저장", FontSize = 13, Foreground = Brushes.White, FontWeight = FontWeights.SemiBold }; + saveBorder.MouseLeftButtonUp += (_, _) => + { + if (string.IsNullOrWhiteSpace(nameBox.Text) || string.IsNullOrWhiteSpace(pathBox.Text)) + { + CustomMessageBox.Show("훅 이름과 스크립트 경로를 입력하세요.", "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + return; + } + var entry = new Models.AgentHookEntry + { + Name = nameBox.Text.Trim(), + ToolName = string.IsNullOrWhiteSpace(toolBox.Text) ? "*" : toolBox.Text.Trim(), + Timing = preRadio.IsChecked == true ? "pre" : "post", + ScriptPath = pathBox.Text.Trim(), + Arguments = argsBox.Text.Trim(), + Enabled = existing?.Enabled ?? true, + }; + + var hooks = _vm.Service.Settings.Llm.AgentHooks; + if (isNew) + hooks.Add(entry); + else if (index >= 0 && index < hooks.Count) + hooks[index] = entry; + + BuildHookCards(); + dlg.Close(); + }; + btnRow.Children.Add(saveBorder); + stack.Children.Add(btnRow); + + border.Child = stack; + dlg.Content = border; + dlg.ShowDialog(); + } + + private void BuildHookCards() + { + if (HookListPanel == null) return; + HookListPanel.Children.Clear(); + + var hooks = _vm.Service.Settings.Llm.AgentHooks; + var primaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.Black; + var secondaryText = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.Blue; + + for (int i = 0; i < hooks.Count; i++) + { + var hook = hooks[i]; + var idx = i; + + var card = new Border + { + Background = TryFindResource("ItemBackground") as Brush ?? Brushes.LightGray, + CornerRadius = new CornerRadius(8), Padding = new Thickness(10, 8, 10, 8), + Margin = new Thickness(0, 0, 0, 4), + }; + + var grid = new Grid(); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); // 토글 + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); // 정보 + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); // 편집 + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); // 삭제 + + // 토글 + var toggle = new CheckBox + { + IsChecked = hook.Enabled, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 8, 0), + Style = TryFindResource("ToggleSwitch") as Style, + }; + var capturedHook = hook; + toggle.Checked += (_, _) => capturedHook.Enabled = true; + toggle.Unchecked += (_, _) => capturedHook.Enabled = false; + Grid.SetColumn(toggle, 0); + grid.Children.Add(toggle); + + // 정보 + var info = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; + var timingBadge = hook.Timing == "pre" ? "PRE" : "POST"; + var timingColor = hook.Timing == "pre" ? "#FF9800" : "#4CAF50"; + var headerPanel = new StackPanel { Orientation = Orientation.Horizontal }; + headerPanel.Children.Add(new TextBlock + { + Text = hook.Name, FontSize = 13, FontWeight = FontWeights.SemiBold, + Foreground = primaryText, VerticalAlignment = VerticalAlignment.Center, + }); + headerPanel.Children.Add(new Border + { + Background = ThemeResourceHelper.HexBrush(timingColor), + CornerRadius = new CornerRadius(4), Padding = new Thickness(5, 1, 5, 1), + Margin = new Thickness(6, 0, 0, 0), VerticalAlignment = VerticalAlignment.Center, + Child = new TextBlock { Text = timingBadge, FontSize = 9, Foreground = Brushes.White, FontWeight = FontWeights.Bold }, + }); + if (hook.ToolName != "*") + { + headerPanel.Children.Add(new Border + { + Background = new SolidColorBrush(Color.FromArgb(40, 100, 100, 255)), + CornerRadius = new CornerRadius(4), Padding = new Thickness(5, 1, 5, 1), + Margin = new Thickness(4, 0, 0, 0), VerticalAlignment = VerticalAlignment.Center, + Child = new TextBlock { Text = hook.ToolName, FontSize = 9, Foreground = accentBrush }, + }); + } + info.Children.Add(headerPanel); + info.Children.Add(new TextBlock + { + Text = System.IO.Path.GetFileName(hook.ScriptPath), + FontSize = 11, Foreground = secondaryText, + TextTrimming = TextTrimming.CharacterEllipsis, MaxWidth = 200, + }); + Grid.SetColumn(info, 1); + grid.Children.Add(info); + + // 편집 버튼 + var editBtn = new Border + { + Cursor = Cursors.Hand, VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(4, 0, 4, 0), Padding = new Thickness(6), + }; + editBtn.Child = new TextBlock + { + Text = "\uE70F", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, Foreground = secondaryText, + }; + editBtn.MouseLeftButtonUp += (_, _) => ShowHookEditDialog(hooks[idx], idx); + Grid.SetColumn(editBtn, 2); + grid.Children.Add(editBtn); + + // 삭제 버튼 + var delBtn = new Border + { + Cursor = Cursors.Hand, VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 0, 0), Padding = new Thickness(6), + }; + delBtn.Child = new TextBlock + { + Text = "\uE74D", FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, Foreground = new SolidColorBrush(Color.FromRgb(0xEF, 0x53, 0x50)), + }; + delBtn.MouseLeftButtonUp += (_, _) => + { + hooks.RemoveAt(idx); + BuildHookCards(); + }; + Grid.SetColumn(delBtn, 3); + grid.Children.Add(delBtn); + + card.Child = grid; + HookListPanel.Children.Add(card); + } + } + + // ─── MCP 서버 관리 ───────────────────────────────────────────────── + private void BtnAddMcpServer_Click(object sender, RoutedEventArgs e) + { + var dlg = new InputDialog("MCP 서버 추가", "서버 이름:", placeholder: "예: my-mcp-server"); + dlg.Owner = this; + if (dlg.ShowDialog() != true || string.IsNullOrWhiteSpace(dlg.ResponseText)) return; + + var name = dlg.ResponseText.Trim(); + var cmdDlg = new InputDialog("MCP 서버 추가", "실행 명령:", placeholder: "예: npx -y @anthropic/mcp-server"); + cmdDlg.Owner = this; + if (cmdDlg.ShowDialog() != true || string.IsNullOrWhiteSpace(cmdDlg.ResponseText)) return; + + var entry = new Models.McpServerEntry { Name = name, Command = cmdDlg.ResponseText.Trim(), Enabled = true }; + _vm.Service.Settings.Llm.McpServers.Add(entry); + BuildMcpServerCards(); + } + + private void BuildMcpServerCards() + { + if (McpServerListPanel == null) return; + McpServerListPanel.Children.Clear(); + + var servers = _vm.Service.Settings.Llm.McpServers; + var primaryText = TryFindResource("PrimaryText") as System.Windows.Media.Brush ?? System.Windows.Media.Brushes.Black; + var secondaryText = TryFindResource("SecondaryText") as System.Windows.Media.Brush ?? System.Windows.Media.Brushes.Gray; + var accentBrush = TryFindResource("AccentColor") as System.Windows.Media.Brush ?? System.Windows.Media.Brushes.Blue; + + for (int i = 0; i < servers.Count; i++) + { + var srv = servers[i]; + var idx = i; + + var card = new Border + { + Background = TryFindResource("ItemBackground") as System.Windows.Media.Brush, + CornerRadius = new CornerRadius(10), + Padding = new Thickness(14, 10, 14, 10), + Margin = new Thickness(0, 4, 0, 0), + BorderBrush = TryFindResource("BorderColor") as System.Windows.Media.Brush, + BorderThickness = new Thickness(1), + }; + + var grid = new Grid(); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + var info = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; + info.Children.Add(new TextBlock + { + Text = srv.Name, FontSize = 13.5, FontWeight = FontWeights.SemiBold, Foreground = primaryText, + }); + var detailSp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 0, 0) }; + detailSp.Children.Add(new Border + { + Background = srv.Enabled ? accentBrush : System.Windows.Media.Brushes.Gray, + CornerRadius = new CornerRadius(4), Padding = new Thickness(6, 1, 6, 1), Margin = new Thickness(0, 0, 8, 0), Opacity = 0.8, + Child = new TextBlock { Text = srv.Enabled ? "활성" : "비활성", FontSize = 10, Foreground = System.Windows.Media.Brushes.White, FontWeight = FontWeights.SemiBold }, + }); + detailSp.Children.Add(new TextBlock + { + Text = $"{srv.Command} {string.Join(" ", srv.Args)}", FontSize = 11, + Foreground = secondaryText, VerticalAlignment = VerticalAlignment.Center, + MaxWidth = 300, TextTrimming = TextTrimming.CharacterEllipsis, + }); + info.Children.Add(detailSp); + Grid.SetColumn(info, 0); + grid.Children.Add(info); + + var btnPanel = new StackPanel { Orientation = Orientation.Horizontal, VerticalAlignment = VerticalAlignment.Center }; + + // 활성/비활성 토글 + var toggleBtn = new Button + { + Content = srv.Enabled ? "\uE73E" : "\uE711", + FontFamily = new System.Windows.Media.FontFamily("Segoe MDL2 Assets"), + FontSize = 12, ToolTip = srv.Enabled ? "비활성화" : "활성화", + Background = System.Windows.Media.Brushes.Transparent, BorderThickness = new Thickness(0), + Foreground = srv.Enabled ? accentBrush : System.Windows.Media.Brushes.Gray, + Padding = new Thickness(6, 4, 6, 4), Cursor = Cursors.Hand, + }; + toggleBtn.Click += (_, _) => { servers[idx].Enabled = !servers[idx].Enabled; BuildMcpServerCards(); }; + btnPanel.Children.Add(toggleBtn); + + // 삭제 + var delBtn = new Button + { + Content = "\uE74D", FontFamily = new System.Windows.Media.FontFamily("Segoe MDL2 Assets"), + FontSize = 12, ToolTip = "삭제", + Background = System.Windows.Media.Brushes.Transparent, BorderThickness = new Thickness(0), + Foreground = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(0xDD, 0x44, 0x44)), + Padding = new Thickness(6, 4, 6, 4), Cursor = Cursors.Hand, + }; + delBtn.Click += (_, _) => { servers.RemoveAt(idx); BuildMcpServerCards(); }; + btnPanel.Children.Add(delBtn); + + Grid.SetColumn(btnPanel, 1); + grid.Children.Add(btnPanel); + card.Child = grid; + McpServerListPanel.Children.Add(card); + } + } + + // ─── 감사 로그 폴더 열기 ──────────────────────────────────────────── + private void BtnOpenAuditLog_Click(object sender, RoutedEventArgs e) + { + try { System.Diagnostics.Process.Start("explorer.exe", Services.AuditLogService.GetAuditFolder()); } catch (Exception) { } + } + + // ─── 폴백/MCP 텍스트 박스 로드/저장 ─────────────────────────────────── + private void BuildFallbackModelsPanel() + { + if (FallbackModelsPanel == null) return; + FallbackModelsPanel.Children.Clear(); + + var llm = _vm.Service.Settings.Llm; + var fallbacks = llm.FallbackModels; + var toggleStyle = TryFindResource("ToggleSwitch") as Style; + + // 서비스별로 모델 수집 (순서 고정: Ollama → vLLM → Gemini → Claude) + var sections = new (string Service, string Label, string Color, List Models)[] + { + ("ollama", "Ollama", "#107C10", new()), + ("vllm", "vLLM", "#0078D4", new()), + ("gemini", "Gemini", "#4285F4", new()), + ("claude", "Claude", "#8B5CF6", new()), + }; + + // RegisteredModels → ViewModel과 AppSettings 양쪽에서 수집 (저장 전에도 반영) + // 1) ViewModel의 RegisteredModels (UI에서 방금 추가한 것 포함) + foreach (var row in _vm.RegisteredModels) + { + var svc = (row.Service ?? "").ToLowerInvariant(); + var modelName = !string.IsNullOrEmpty(row.Alias) ? row.Alias : row.EncryptedModelName; + var section = sections.FirstOrDefault(s => s.Service == svc); + if (section.Models != null && !string.IsNullOrEmpty(modelName) && !section.Models.Contains(modelName)) + section.Models.Add(modelName); + } + // 2) AppSettings의 RegisteredModels (기존 저장된 것 — ViewModel에 없는 경우 보완) + foreach (var m in llm.RegisteredModels) + { + var svc = (m.Service ?? "").ToLowerInvariant(); + var modelName = !string.IsNullOrEmpty(m.Alias) ? m.Alias : m.EncryptedModelName; + var section = sections.FirstOrDefault(s => s.Service == svc); + if (section.Models != null && !string.IsNullOrEmpty(modelName) && !section.Models.Contains(modelName)) + section.Models.Add(modelName); + } + + // 현재 활성 모델 추가 (중복 제거) + if (!string.IsNullOrEmpty(llm.OllamaModel) && !sections[0].Models.Contains(llm.OllamaModel)) + sections[0].Models.Add(llm.OllamaModel); + if (!string.IsNullOrEmpty(llm.VllmModel) && !sections[1].Models.Contains(llm.VllmModel)) + sections[1].Models.Add(llm.VllmModel); + + // Gemini/Claude 고정 모델 목록 + foreach (var gm in new[] { "gemini-2.5-flash", "gemini-2.5-pro", "gemini-2.0-flash", "gemini-1.5-pro", "gemini-1.5-flash" }) + if (!sections[2].Models.Contains(gm)) sections[2].Models.Add(gm); + foreach (var cm in new[] { "claude-sonnet-4-6", "claude-opus-4-6", "claude-haiku-4-5", "claude-sonnet-4-5" }) + if (!sections[3].Models.Contains(cm)) sections[3].Models.Add(cm); + + // 렌더링 — 모델이 없는 섹션도 헤더는 표시 + foreach (var (service, svcLabel, svcColor, models) in sections) + { + FallbackModelsPanel.Children.Add(new TextBlock + { + Text = svcLabel, + FontSize = 11, FontWeight = FontWeights.SemiBold, + Foreground = BrushFromHex(svcColor), + Margin = new Thickness(0, 8, 0, 4), + }); + + if (models.Count == 0) + { + FallbackModelsPanel.Children.Add(new TextBlock + { + Text = "등록된 모델 없음", + FontSize = 11, Foreground = Brushes.Gray, FontStyle = FontStyles.Italic, + Margin = new Thickness(8, 2, 0, 4), + }); + continue; + } + + foreach (var modelName in models) + { + var fullKey = $"{service}:{modelName}"; + + var row = new Grid { Margin = new Thickness(8, 2, 0, 2) }; + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + row.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + + var label = new TextBlock + { + Text = modelName, FontSize = 12, FontFamily = new FontFamily("Consolas, Courier New"), + VerticalAlignment = VerticalAlignment.Center, + Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.Black, + }; + Grid.SetColumn(label, 0); + row.Children.Add(label); + + var captured = fullKey; + var cb = new CheckBox + { + IsChecked = fallbacks.Contains(fullKey, StringComparer.OrdinalIgnoreCase), + HorizontalAlignment = HorizontalAlignment.Right, + VerticalAlignment = VerticalAlignment.Center, + }; + if (toggleStyle != null) cb.Style = toggleStyle; + cb.Checked += (_, _) => + { + if (!fallbacks.Contains(captured)) fallbacks.Add(captured); + FallbackModelsBox.Text = string.Join("\n", fallbacks); + }; + cb.Unchecked += (_, _) => + { + fallbacks.RemoveAll(x => x.Equals(captured, StringComparison.OrdinalIgnoreCase)); + FallbackModelsBox.Text = string.Join("\n", fallbacks); + }; + Grid.SetColumn(cb, 1); + row.Children.Add(cb); + + FallbackModelsPanel.Children.Add(row); + } + } + } + + private void LoadAdvancedSettings() + { + var llm = _vm.Service.Settings.Llm; + if (FallbackModelsBox != null) + FallbackModelsBox.Text = string.Join("\n", llm.FallbackModels); + BuildFallbackModelsPanel(); + if (McpServersBox != null) + { + try + { + var json = System.Text.Json.JsonSerializer.Serialize(llm.McpServers, + new System.Text.Json.JsonSerializerOptions { WriteIndented = true, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); + McpServersBox.Text = json; + } + catch (Exception) { McpServersBox.Text = "[]"; } + } + BuildMcpServerCards(); + BuildHookCards(); + } + + private void SaveAdvancedSettings() + { + var llm = _vm.Service.Settings.Llm; + if (FallbackModelsBox != null) + { + llm.FallbackModels = FallbackModelsBox.Text + .Split('\n', StringSplitOptions.RemoveEmptyEntries) + .Select(s => s.Trim()) + .Where(s => s.Length > 0) + .ToList(); + } + if (McpServersBox != null && !string.IsNullOrWhiteSpace(McpServersBox.Text)) + { + try + { + llm.McpServers = System.Text.Json.JsonSerializer.Deserialize>( + McpServersBox.Text) ?? new(); + } + catch (Exception) { /* JSON 파싱 실패 시 기존 유지 */ } + } + + // 도구 비활성 목록 저장 + if (_toolCardsLoaded) + llm.DisabledTools = _disabledTools.ToList(); + } + + private void AddSnippet_Click(object sender, RoutedEventArgs e) + { + if (!_vm.AddSnippet()) + CustomMessageBox.Show( + "키워드와 내용은 필수 항목입니다.\n동일한 키워드가 이미 존재하면 추가할 수 없습니다.", + "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + } + + private void DeleteSnippet_Click(object sender, RoutedEventArgs e) + { + if (sender is Button btn && btn.Tag is ViewModels.SnippetRowModel row) + _vm.RemoveSnippet(row); + } + + private void Browse_Click(object sender, RoutedEventArgs e) => _vm.BrowseTarget(); + + private void AddShortcut_Click(object sender, RoutedEventArgs e) + { + if (!_vm.AddShortcut()) + CustomMessageBox.Show( + "키워드와 실행 대상은 필수 항목입니다.\n이미 동일한 키워드가 존재하면 추가할 수 없습니다.", + "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + } + + private void DeleteShortcut_Click(object sender, RoutedEventArgs e) + { + if (sender is Button btn && btn.Tag is ViewModels.AppShortcutModel shortcut) + _vm.RemoveShortcut(shortcut); + } + + private void AddBatchCommand_Click(object sender, RoutedEventArgs e) + { + if (!_vm.AddBatchCommand()) + CustomMessageBox.Show( + "키워드와 명령어는 필수 항목입니다.\n동일한 키워드가 이미 존재하면 추가할 수 없습니다.", + "입력 오류", MessageBoxButton.OK, MessageBoxImage.Warning); + } + + private void DeleteBatchCommand_Click(object sender, RoutedEventArgs e) + { + if (sender is Button btn && btn.Tag is ViewModels.BatchCommandModel cmd) + _vm.RemoveBatchCommand(cmd); + } + + private void ResetCommandAliases_Click(object sender, RoutedEventArgs e) + { + _vm.ResetSystemCommandAliases(); + } + + private void AddIndexPath_Click(object sender, RoutedEventArgs e) + { + var text = NewIndexPathBox?.Text?.Trim() ?? ""; + if (!string.IsNullOrWhiteSpace(text)) + { + _vm.AddIndexPath(text); + if (NewIndexPathBox != null) NewIndexPathBox.Text = ""; + } + } + + private void BrowseIndexPath_Click(object sender, RoutedEventArgs e) => _vm.BrowseIndexPath(); + + private void ResetCapPrefix_Click(object sender, RoutedEventArgs e) => _vm.ResetCapPrefix(); + + private void ResetCapGlobalHotkey_Click(object sender, RoutedEventArgs e) => _vm.ResetCapGlobalHotkey(); + + private void CapHotkeyRecorder_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) + { + e.Handled = true; + var key = e.Key == System.Windows.Input.Key.System ? e.SystemKey : e.Key; + + // 수정자만 입력된 경우 무시 + if (key is System.Windows.Input.Key.LeftCtrl or System.Windows.Input.Key.RightCtrl + or System.Windows.Input.Key.LeftAlt or System.Windows.Input.Key.RightAlt + or System.Windows.Input.Key.LeftShift or System.Windows.Input.Key.RightShift + or System.Windows.Input.Key.LWin or System.Windows.Input.Key.RWin) + return; + + if (key == System.Windows.Input.Key.Escape) return; + + var parts = new List(); + if (System.Windows.Input.Keyboard.Modifiers.HasFlag(System.Windows.Input.ModifierKeys.Control)) parts.Add("Ctrl"); + if (System.Windows.Input.Keyboard.Modifiers.HasFlag(System.Windows.Input.ModifierKeys.Alt)) parts.Add("Alt"); + if (System.Windows.Input.Keyboard.Modifiers.HasFlag(System.Windows.Input.ModifierKeys.Shift)) parts.Add("Shift"); + if (System.Windows.Input.Keyboard.Modifiers.HasFlag(System.Windows.Input.ModifierKeys.Windows)) parts.Add("Win"); + + var keyName = key switch + { + System.Windows.Input.Key.Snapshot => "PrintScreen", + System.Windows.Input.Key.Scroll => "ScrollLock", + System.Windows.Input.Key.Pause => "Pause", + _ => key.ToString() + }; + parts.Add(keyName); + + var hotkey = string.Join("+", parts); + if (AxCopilot.Core.HotkeyParser.TryParse(hotkey, out _)) + _vm.CapGlobalHotkey = hotkey; + } + + private void ReminderCorner_Click(object sender, RoutedEventArgs e) + { + if (sender is System.Windows.Controls.RadioButton rb && rb.Tag is string corner) + _vm.ReminderCorner = corner; + } + + private void ReminderPreview_Click(object sender, RoutedEventArgs e) + { + try + { + var svc = _vm.Service; + var (text, author) = Services.QuoteService.GetRandom(svc.Settings.Reminder.EnabledCategories); + var usage = TimeSpan.FromMinutes(42); // 샘플 값 + + // 현재 편집 중인 값을 임시로 적용 + var cfg = svc.Settings.Reminder; + var origCorner = cfg.Corner; + var origSeconds = cfg.DisplaySeconds; + cfg.Corner = _vm.ReminderCorner; + cfg.DisplaySeconds = _vm.ReminderDisplaySeconds; + + var popup = new ReminderPopupWindow(text, author, usage, svc); + popup.Show(); + + cfg.Corner = origCorner; + cfg.DisplaySeconds = origSeconds; + } + catch (Exception ex) + { + Services.LogService.Warn($"알림 미리보기 실패: {ex.Message}"); + } + } + + private void RemoveIndexPath_Click(object sender, RoutedEventArgs e) + { + if (sender is Button btn && btn.Tag is string path) + _vm.RemoveIndexPath(path); + } + + private void AddExtension_Click(object sender, RoutedEventArgs e) + { + var text = NewExtensionBox?.Text?.Trim() ?? ""; + if (!string.IsNullOrWhiteSpace(text)) + { + _vm.AddExtension(text); + if (NewExtensionBox != null) NewExtensionBox.Text = ""; + } + } + + private void RemoveExtension_Click(object sender, RoutedEventArgs e) + { + if (sender is Button btn && btn.Tag is string ext) + _vm.RemoveExtension(ext); + } + + private void Save_Click(object sender, RoutedEventArgs e) + { + SaveAdvancedSettings(); // 폴백/MCP 텍스트 박스 → settings 저장 + _vm.Save(); + CustomMessageBox.Show("설정이 저장되었습니다.", "AX Copilot", MessageBoxButton.OK, MessageBoxImage.Information); + } + + private void Cancel_Click(object sender, RoutedEventArgs e) + { + Close(); + } + + private void ExportSettings_Click(object sender, RoutedEventArgs e) + { + var dlg = new Microsoft.Win32.SaveFileDialog + { + Title = "설정 내보내기", + Filter = "AX Copilot 설정|*.axsettings", + FileName = $"AxCopilot_Settings_{DateTime.Now:yyyyMMdd}", + DefaultExt = ".axsettings" + }; + if (dlg.ShowDialog() != true) return; + + try + { + var srcPath = SettingsService.SettingsPath; + if (System.IO.File.Exists(srcPath)) + { + System.IO.File.Copy(srcPath, dlg.FileName, overwrite: true); + CustomMessageBox.Show( + $"설정이 내보내졌습니다:\n{dlg.FileName}", + "AX Copilot", MessageBoxButton.OK, + MessageBoxImage.Information); + } + } + catch (Exception ex) + { + CustomMessageBox.Show($"내보내기 실패: {ex.Message}", "오류"); + } + } + + private void ImportSettings_Click(object sender, RoutedEventArgs e) + { + var dlg = new Microsoft.Win32.OpenFileDialog + { + Title = "설정 불러오기", + Filter = "AX Copilot 설정|*.axsettings|모든 파일|*.*" + }; + if (dlg.ShowDialog() != true) return; + + var result = CustomMessageBox.Show( + "설정을 불러오면 현재 설정이 덮어씌워집니다.\n계속하시겠습니까?", + "AX Copilot — 설정 불러오기", + MessageBoxButton.YesNo, + MessageBoxImage.Question); + + if (result != System.Windows.MessageBoxResult.Yes) return; + + try + { + var fileContent = System.IO.File.ReadAllText(dlg.FileName); + // 암호화된 파일인지 판별: PortableDecrypt 시도 + var json = CryptoService.PortableDecrypt(fileContent); + if (string.IsNullOrEmpty(json)) + { + // 평문 JSON일 수 있음 — 직접 파싱 시도 + try + { + var test = System.Text.Json.JsonSerializer.Deserialize(fileContent); + if (test != null) json = fileContent; + } + catch (Exception) { } + } + + if (string.IsNullOrEmpty(json)) + { + CustomMessageBox.Show("유효하지 않은 설정 파일입니다.", "오류"); + return; + } + + // 유효한 설정인지 최종 확인 + var settings = System.Text.Json.JsonSerializer.Deserialize(json); + if (settings == null) + { + CustomMessageBox.Show("설정 파일을 파싱할 수 없습니다.", "오류"); + return; + } + + // 암호화하여 저장 + var encrypted = CryptoService.PortableEncrypt(json); + System.IO.File.WriteAllText(SettingsService.SettingsPath, encrypted); + + CustomMessageBox.Show( + "설정이 불러와졌습니다.\n변경 사항을 적용하려면 앱을 재시작하세요.", + "AX Copilot", MessageBoxButton.OK, + MessageBoxImage.Information); + Close(); + } + catch (Exception ex) + { + CustomMessageBox.Show($"불러오기 실패: {ex.Message}", "오류"); + } + } + + protected override void OnClosing(System.ComponentModel.CancelEventArgs e) + { + // 저장하지 않고 닫아도 확인 없이 바로 닫힘 (revert는 OnClosed에서 처리) + base.OnClosing(e); + } + + protected override void OnClosed(EventArgs e) + { + if (!_saved) _revertCallback(); + base.OnClosed(e); + } +} diff --git a/src/AxCopilot/Views/ShortcutHelpWindow.xaml b/src/AxCopilot/Views/ShortcutHelpWindow.xaml new file mode 100644 index 0000000..66a1d59 --- /dev/null +++ b/src/AxCopilot/Views/ShortcutHelpWindow.xaml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/ShortcutHelpWindow.xaml.cs b/src/AxCopilot/Views/ShortcutHelpWindow.xaml.cs new file mode 100644 index 0000000..bf18ad2 --- /dev/null +++ b/src/AxCopilot/Views/ShortcutHelpWindow.xaml.cs @@ -0,0 +1,240 @@ +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Interop; +using System.Windows.Media; + +namespace AxCopilot.Views; + +/// Ctrl+K로 열리는 단축키 참조 모달 창 +public partial class ShortcutHelpWindow : Window +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + // ─── P/Invoke ──────────────────────────────────────────────────────────── + [DllImport("user32.dll")] private static extern void ReleaseCapture(); + [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + private const int WM_NCLBUTTONDOWN = 0xA1; + private const int HTBOTTOMRIGHT = 17; + + // (키 문자열, 설명, 아이콘 코드, 배경색) + private record ShortcutRow(string Key, string Description, string Icon = "\uE72D", string Color = "#4B5EFC"); + + public ShortcutHelpWindow() + { + InitializeComponent(); + Loaded += (_, _) => + { + // 저장된 설정 로드 + var svc = CurrentApp?.SettingsService; + if (svc != null) + ThemeColorChk.IsChecked = svc.Settings.Launcher.ShortcutHelpUseThemeColor; + + BuildItems(); + }; + } + + private void BuildItems() + { + bool useTheme = ThemeColorChk.IsChecked == true; + + // ── 탐색 ────────────────────────────────────────────────────────── + var nav = new[] + { + new ShortcutRow("↑ / ↓", "결과 목록 위/아래로 이동", "\uE74A", "#4B5EFC"), + new ShortcutRow("PageUp / PageDown","목록 5칸 빠른 이동", "\uE74A", "#4B5EFC"), + new ShortcutRow("Home / End", "목록 처음 항목 / 마지막 항목으로 점프", "\uE74A", "#4B5EFC"), + new ShortcutRow("Tab", "선택 항목 제목을 입력창에 자동 완성", "\uE748", "#7B68EE"), + new ShortcutRow("→", "파일/앱 선택 시 액션 모드(복사·실행 등) 진입", "\uE76C", "#107C10"), + new ShortcutRow("Escape", "액션 모드면 일반 모드로 복귀, 아니면 AX Commander 닫기", "\uE711", "#C50F1F"), + }; + + // ── 파일 동작 ────────────────────────────────────────────────────── + var file = new[] + { + new ShortcutRow("Enter", "선택 항목 실행 (파일 열기·명령 실행·URL 열기 등)", "\uE768", "#107C10"), + new ShortcutRow("Ctrl+Enter", "선택 파일·앱을 관리자(UAC 상승) 권한으로 실행", "\uE7EF", "#C50F1F"), + new ShortcutRow("Alt+Enter", "선택 항목의 Windows 속성 대화 상자 열기", "\uE7EE", "#8B2FC9"), + new ShortcutRow("Ctrl+C", "선택 항목의 파일 이름(확장자 제외)을 클립보드에 복사","\uE8C8", "#0078D4"), + new ShortcutRow("Ctrl+Shift+C", "선택 항목의 전체 경로를 클립보드에 복사", "\uE8C8", "#0078D4"), + new ShortcutRow("Ctrl+Shift+E", "파일 탐색기를 열고 선택 항목 위치를 하이라이트", "\uE8DA", "#107C10"), + new ShortcutRow("Ctrl+T", "선택 항목 폴더 경로에서 터미널(wt/cmd) 열기", "\uE756", "#323130"), + new ShortcutRow("Ctrl+P", "선택 항목을 즐겨찾기에 추가 (이미 있으면 제거)", "\uE734", "#D97706"), + new ShortcutRow("F2", "선택 파일·폴더의 이름 변경 모드로 전환", "\uE70F", "#6B2C91"), + new ShortcutRow("Delete", "선택 항목을 최근 목록에서 제거 (확인 후 실행)", "\uE74D", "#C50F1F"), + }; + + // ── 뷰 전환 ──────────────────────────────────────────────────────── + var view = new[] + { + new ShortcutRow("Ctrl+B", "즐겨찾기 목록 보기 (다시 누르면 닫기, 토글)", "\uE735", "#D97706"), + new ShortcutRow("Ctrl+R", "최근 실행 목록 보기 (다시 누르면 닫기, 토글)", "\uE81C", "#0078D4"), + new ShortcutRow("Ctrl+H", "클립보드 히스토리 목록 보기", "\uE77F", "#8B2FC9"), + new ShortcutRow("Ctrl+D", "다운로드 폴더 경로 바로 열기", "\uE8B7", "#107C10"), + new ShortcutRow("Ctrl+F", "입력 초기화 후 파일 검색 모드로 포커스 이동", "\uE71E", "#4B5EFC"), + new ShortcutRow("F1", "헬프 화면 열기 (help 입력과 동일)", "\uE897", "#4B5EFC"), + }; + + // ── 실행 및 기타 ─────────────────────────────────────────────────── + var run = new[] + { + new ShortcutRow("Ctrl+1 ~ Ctrl+9", "표시 중인 N번째 결과를 즉시 실행 (번호 배지와 연동)", "\uE8C4", "#107C10"), + new ShortcutRow("Ctrl+L", "입력창 전체 초기화", "\uE711", "#9999BB"), + new ShortcutRow("Ctrl+W", "AX Commander 창 즉시 닫기", "\uE711", "#9999BB"), + new ShortcutRow("Ctrl+K", "이 단축키 참조 창 열기", "\uE8FD", "#4B5EFC"), + new ShortcutRow("Ctrl+,", "설정 창 열기", "\uE713", "#4B5EFC"), + new ShortcutRow("F5", "파일 인덱스 즉시 재구축", "\uE72C", "#107C10"), + new ShortcutRow("Shift+Enter", "Large Type / 병합 실행 / 캡처 모드: 지연 캡처(3/5/10초) 타이머", "\uE8A7", "#7B68EE"), + }; + + // ── 입력 예약어 ─────────────────────────────────────────────────── + var prefix = new[] + { + new ShortcutRow("cd [경로/별칭]", "지정한 경로 또는 등록된 폴더 별칭을 탐색기로 열기", "\uE8DA", "#107C10"), + new ShortcutRow("~ [이름]", "워크스페이스 저장(save)/복원(restore)/목록(list)", "\uE8B7", "#C50F1F"), + new ShortcutRow("# [검색어]", "클립보드 히스토리 검색·붙여넣기", "\uE77F", "#8B2FC9"), + new ShortcutRow("fav [검색어]", "즐겨찾기 목록 검색 및 열기. add/del 로 관리", "\uE735", "#D97706"), + new ShortcutRow("recent [검색어]", "최근 실행 항목 검색", "\uE81C", "#0078D4"), + new ShortcutRow("cap [모드]", "화면 캡처 (region/window/scroll/screen) · Shift+Enter: 지연 캡처", "\uE722", "#C09010"), + new ShortcutRow("help [검색어]", "도움말 및 기능 목록 검색", "\uE897", "#4B5EFC"), + new ShortcutRow("/ [명령]", "시스템 명령 (lock/sleep/restart/shutdown 등)", "\uE7E8", "#C50F1F"), + new ShortcutRow("! [질문]", "AX Agent — Ollama/vLLM/Gemini/Claude", "\uE8BD", "#8B2FC9"), + }; + + NavigationItems.Items.Clear(); + FileActionItems.Items.Clear(); + ViewItems.Items.Clear(); + RunItems.Items.Clear(); + PrefixItems.Items.Clear(); + + Populate(NavigationItems, nav, useTheme); + Populate(FileActionItems, file, useTheme); + Populate(ViewItems, view, useTheme); + Populate(RunItems, run, useTheme); + Populate(PrefixItems, prefix, useTheme); + } + + private static void Populate(ItemsControl control, ShortcutRow[] rows, bool useThemeColor) + { + // 현재 테마에서 텍스트/배경 색상 읽기 + var primaryText = System.Windows.Application.Current.TryFindResource("PrimaryText") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x33, 0x33, 0x55)); + var itemBg = System.Windows.Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0xEE, 0xEE, 0xFF)); + var accentBrush = System.Windows.Application.Current.TryFindResource("AccentColor") as SolidColorBrush; + var accentHex = accentBrush != null ? $"#{accentBrush.Color.R:X2}{accentBrush.Color.G:X2}{accentBrush.Color.B:X2}" : "#4B5EFC"; + + foreach (var row in rows) + { + var colorHex = useThemeColor ? accentHex : row.Color; + + var grid = new Grid { Margin = new Thickness(0, 0, 0, 3) }; + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(28) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(148) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + + // 아이콘 배지 + var iconBorder = new Border + { + Width = 22, Height = 22, + CornerRadius = new CornerRadius(5), + Background = ParseBrush(colorHex + "22"), + VerticalAlignment = VerticalAlignment.Center, + HorizontalAlignment = HorizontalAlignment.Center, + }; + iconBorder.Child = new TextBlock + { + Text = row.Icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 10, + Foreground = ParseBrush(colorHex), + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(iconBorder, 0); + grid.Children.Add(iconBorder); + + // 키 배지 — 테마 ItemBackground 사용 + var keyBorder = new Border + { + Background = itemBg, + CornerRadius = new CornerRadius(5), + Padding = new Thickness(7, 3, 7, 3), + Margin = new Thickness(4, 1, 8, 1), + VerticalAlignment = VerticalAlignment.Center, + HorizontalAlignment = HorizontalAlignment.Left, + }; + keyBorder.Child = new TextBlock + { + Text = row.Key, + FontFamily = new FontFamily("Consolas, Courier New"), + FontSize = 11, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(keyBorder, 1); + grid.Children.Add(keyBorder); + + // 설명 — 테마 PrimaryText 사용 + var desc = new TextBlock + { + Text = row.Description, + FontSize = 11.5, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + TextWrapping = TextWrapping.Wrap, + LineHeight = 16, + }; + Grid.SetColumn(desc, 2); + grid.Children.Add(desc); + + control.Items.Add(grid); + } + } + + private static SolidColorBrush ParseBrush(string hex) + { + try { return ThemeResourceHelper.HexBrush(hex); } + catch (Exception) { return new SolidColorBrush(Colors.Transparent); } + } + + // ─── 테마 색상 체크박스 ───────────────────────────────────────────────── + + private void ThemeColorChk_Changed(object sender, RoutedEventArgs e) + { + // 설정 저장 + var svc = CurrentApp?.SettingsService; + if (svc != null) + { + svc.Settings.Launcher.ShortcutHelpUseThemeColor = ThemeColorChk.IsChecked == true; + svc.Save(); + } + // 목록 다시 그리기 + BuildItems(); + } + + // ─── 리사이즈 그립 ────────────────────────────────────────────────────── + + private void ResizeGrip_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (e.ButtonState != MouseButtonState.Pressed) return; + ReleaseCapture(); + SendMessage(new WindowInteropHelper(this).Handle, WM_NCLBUTTONDOWN, (IntPtr)HTBOTTOMRIGHT, IntPtr.Zero); + } + + // ─── 이벤트 ───────────────────────────────────────────────────────────── + + private void Close_Click(object sender, RoutedEventArgs e) => Close(); + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Escape) Close(); + } + + private void Window_MouseDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left && e.LeftButton == MouseButtonState.Pressed) + try { DragMove(); } catch (Exception) { } + } +} diff --git a/src/AxCopilot/Views/SkillEditorWindow.xaml b/src/AxCopilot/Views/SkillEditorWindow.xaml new file mode 100644 index 0000000..dff7777 --- /dev/null +++ b/src/AxCopilot/Views/SkillEditorWindow.xaml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/SkillEditorWindow.xaml.cs b/src/AxCopilot/Views/SkillEditorWindow.xaml.cs new file mode 100644 index 0000000..345215a --- /dev/null +++ b/src/AxCopilot/Views/SkillEditorWindow.xaml.cs @@ -0,0 +1,528 @@ +using System.IO; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using AxCopilot.Services; +using AxCopilot.Services.Agent; + +namespace AxCopilot.Views; + +/// 스킬 시각적 편집기. 새 스킬 생성 또는 기존 스킬 편집을 GUI로 지원합니다. +public partial class SkillEditorWindow : Window +{ + // ── 아이콘 후보 목록 (Segoe MDL2 Assets 코드포인트) ── + private static readonly string[] IconCandidates = + [ + "\uE70F", // Edit + "\uE8A5", // Document + "\uE943", // Code + "\uE74C", // Search + "\uE8B7", // Folder + "\uE896", // People + "\uE713", // Settings + "\uE753", // Cloud + "\uE774", // Camera + "\uE8D6", // Mail + "\uE8F1", // Lightbulb + "\uE7C3", // Data + "\uECA7", // Rocket + "\uE71E", // Chart + "\uE8C8", // Copy + "\uE8F6", // Process + "\uE81E", // Link + "\uEBD2", // AI + "\uE9D9", // Globe + "\uE77B", // Shield + ]; + + private string _selectedIcon = "\uE70F"; + private SkillDefinition? _editingSkill; + private readonly ToolRegistry _toolRegistry; + + /// 새 스킬 모드로 열기. + public SkillEditorWindow() + { + InitializeComponent(); + _toolRegistry = ToolRegistry.CreateDefault(); + Loaded += (_, _) => { BuildIconSelector(); BuildToolChecklist(); UpdatePreview(); }; + } + + /// 편집 모드로 열기. + public SkillEditorWindow(SkillDefinition skill) : this() + { + _editingSkill = skill; + Loaded += (_, _) => LoadSkill(skill); + } + + // ─── 타이틀바 ───────────────────────────────────────────────────────── + + private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + // 타이틀바 우측 닫기 버튼 영역에서는 DragMove 실행하지 않음 + var pos = e.GetPosition(this); + if (pos.X > ActualWidth - 50) return; + + if (e.ClickCount == 2) + WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized; + else DragMove(); + } + + private void BtnClose_Click(object sender, MouseButtonEventArgs e) => Close(); + private void BtnCancel_Click(object sender, MouseButtonEventArgs e) => Close(); + + // ─── 아이콘 선택기 ──────────────────────────────────────────────────── + + private void BuildIconSelector() + { + IconSelectorPanel.Children.Clear(); + var accentBrush = new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + var subBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var bgBrush = TryFindResource("ItemBackground") as Brush ?? Brushes.Transparent; + + foreach (var icon in IconCandidates) + { + var isSelected = icon == _selectedIcon; + var border = new Border + { + Width = 34, + Height = 34, + CornerRadius = new CornerRadius(8), + Margin = new Thickness(0, 0, 4, 4), + Cursor = Cursors.Hand, + Background = isSelected ? accentBrush : bgBrush, + BorderBrush = isSelected ? accentBrush : Brushes.Transparent, + BorderThickness = new Thickness(1.5), + Tag = icon, + }; + border.Child = new TextBlock + { + Text = icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, + Foreground = isSelected ? Brushes.White : subBrush, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + border.MouseLeftButtonUp += (s, _) => + { + if (s is Border b && b.Tag is string ic) + { + _selectedIcon = ic; + BuildIconSelector(); + } + }; + // 호버 + var capturedIcon = icon; + border.MouseEnter += (s, _) => + { + if (s is Border b && capturedIcon != _selectedIcon) + b.Background = new SolidColorBrush(Color.FromArgb(0x30, 0x4B, 0x5E, 0xFC)); + }; + border.MouseLeave += (s, _) => + { + if (s is Border b && capturedIcon != _selectedIcon) + b.Background = bgBrush; + }; + + IconSelectorPanel.Children.Add(border); + } + } + + // ─── 도구 체크리스트 ────────────────────────────────────────────────── + + private void BuildToolChecklist() + { + ToolCheckListPanel.Children.Clear(); + var tools = _toolRegistry.All.OrderBy(t => t.Name).ToList(); + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + + // 기존 스킬 편집 시 활성 도구 파싱 + var activeTools = new HashSet(StringComparer.OrdinalIgnoreCase); + if (_editingSkill != null && !string.IsNullOrWhiteSpace(_editingSkill.AllowedTools)) + { + foreach (var t in _editingSkill.AllowedTools.Split(',', StringSplitOptions.RemoveEmptyEntries)) + activeTools.Add(t.Trim()); + } + + foreach (var tool in tools) + { + var cb = new CheckBox + { + Tag = tool.Name, + IsChecked = activeTools.Count == 0 || activeTools.Contains(tool.Name), + Margin = new Thickness(0, 0, 0, 4), + Style = TryFindResource("ToggleSwitch") as Style, + }; + + var row = new StackPanel + { + Orientation = Orientation.Horizontal, + Margin = new Thickness(0, 0, 0, 2), + }; + row.Children.Add(cb); + row.Children.Add(new TextBlock + { + Text = tool.Name, + FontSize = 11.5, + FontFamily = new FontFamily("Consolas"), + Foreground = fgBrush, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(6, 0, 0, 0), + }); + + // 설명 툴팁 + if (!string.IsNullOrEmpty(tool.Description)) + row.ToolTip = tool.Description; + + ToolCheckListPanel.Children.Add(row); + } + } + + /// 체크된 도구 이름 목록을 가져옵니다. + private List GetCheckedTools() + { + var result = new List(); + foreach (var child in ToolCheckListPanel.Children) + { + if (child is StackPanel row && row.Children.Count > 0 && row.Children[0] is CheckBox cb) + { + if (cb.IsChecked == true && cb.Tag is string name) + result.Add(name); + } + } + return result; + } + + // ─── 템플릿 삽입 ────────────────────────────────────────────────────── + + private void BtnInsertTemplate_Click(object sender, MouseButtonEventArgs e) + { + if (sender is not FrameworkElement el || el.Tag is not string tag) return; + + var template = tag switch + { + "tools" => BuildToolListTemplate(), + "format" => """ + ## 출력 형식 + + 1. 결과를 사용자에게 한국어로 설명합니다. + 2. 코드 블록은 마크다운 형식으로 감쌉니다. + 3. 핵심 정보를 먼저 제시하고, 세부 사항은 뒤에 붙입니다. + """, + "steps" => """ + ## 실행 단계 + + 1. **분석**: 사용자의 요청을 분석합니다. + 2. **계획**: 수행할 작업을 계획합니다. + 3. **실행**: 도구를 사용하여 작업을 수행합니다. + 4. **검증**: 결과를 검증합니다. + 5. **보고**: 결과를 사용자에게 보고합니다. + """, + _ => "", + }; + + if (string.IsNullOrEmpty(template)) return; + + var insertPos = TxtInstructions.CaretIndex; + var prefix = insertPos > 0 && TxtInstructions.Text.Length > 0 + && TxtInstructions.Text[insertPos - 1] != '\n' ? "\n\n" : ""; + TxtInstructions.Text = TxtInstructions.Text.Insert(insertPos, prefix + template.Trim()); + TxtInstructions.CaretIndex = insertPos + prefix.Length + template.Trim().Length; + TxtInstructions.Focus(); + } + + private string BuildToolListTemplate() + { + var checkedTools = GetCheckedTools(); + if (checkedTools.Count == 0) + return "## 사용 가능한 도구\n\n(도구가 선택되지 않았습니다. 우측 패널에서 도구를 선택하세요.)"; + + var lines = new List { "## 사용 가능한 도구", "" }; + foreach (var toolName in checkedTools) + { + var tool = _toolRegistry.All.FirstOrDefault(t => t.Name == toolName); + if (tool != null) + lines.Add($"- **{tool.Name}**: {tool.Description}"); + } + return string.Join("\n", lines); + } + + // ─── 미리보기 업데이트 ──────────────────────────────────────────────── + + private void TxtInstructions_TextChanged(object sender, TextChangedEventArgs e) => UpdatePreview(); + + private void UpdatePreview() + { + if (PreviewTokens == null || PreviewFileName == null) return; + + var content = GenerateSkillContent(); + var tokens = TokenEstimator.Estimate(content); + PreviewTokens.Text = $"예상 토큰: ~{tokens:N0}자 | {content.Length:N0}자"; + + var name = string.IsNullOrWhiteSpace(TxtName?.Text) ? "new-skill" : TxtName.Text.Trim(); + PreviewFileName.Text = $"{name}.skill.md"; + } + + // ─── 스킬 콘텐츠 생성 ──────────────────────────────────────────────── + + private string GenerateSkillContent() + { + var name = TxtName?.Text?.Trim() ?? "new-skill"; + var label = TxtLabel?.Text?.Trim() ?? ""; + var desc = TxtDescription?.Text?.Trim() ?? ""; + var instructions = TxtInstructions?.Text ?? ""; + + // 런타임 요구사항 + var requiresTag = ""; + if (CmbRequires?.SelectedItem is ComboBoxItem cbi && cbi.Tag is string req && !string.IsNullOrEmpty(req)) + requiresTag = req; + + // 도구 목록 + var checkedTools = GetCheckedTools(); + var allToolCount = _toolRegistry.All.Count; + var allowedToolsStr = checkedTools.Count < allToolCount + ? string.Join(", ", checkedTools) + : ""; // 전체 선택이면 비워둠 + + // YAML 프론트매터 생성 + var yaml = new List { "---" }; + yaml.Add($"name: {name}"); + if (!string.IsNullOrEmpty(label)) yaml.Add($"label: {label}"); + if (!string.IsNullOrEmpty(desc)) yaml.Add($"description: {desc}"); + yaml.Add($"icon: {_selectedIcon}"); + if (!string.IsNullOrEmpty(requiresTag)) yaml.Add($"requires: {requiresTag}"); + if (!string.IsNullOrEmpty(allowedToolsStr)) yaml.Add($"allowed-tools: {allowedToolsStr}"); + yaml.Add("---"); + yaml.Add(""); + + return string.Join("\n", yaml) + instructions; + } + + // ─── 미리보기 버튼 ─────────────────────────────────────────────────── + + private void BtnPreview_Click(object sender, MouseButtonEventArgs e) + { + var content = GenerateSkillContent(); + + var previewWin = new Window + { + Title = "스킬 파일 미리보기", + Width = 640, + Height = 520, + WindowStyle = WindowStyle.None, + AllowsTransparency = true, + Background = Brushes.Transparent, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, + }; + + var bgBrush = TryFindResource("LauncherBackground") as Brush ?? Brushes.White; + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var itemBg = TryFindResource("ItemBackground") as Brush ?? Brushes.Transparent; + var borderBrush = TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + + var outerBorder = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(12), + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Effect = new System.Windows.Media.Effects.DropShadowEffect + { + BlurRadius = 20, ShadowDepth = 4, Opacity = 0.3, Color = Colors.Black, + }, + }; + + var grid = new Grid(); + grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(44) }); + grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); + grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); + + // 타이틀바 + var titleBar = new Border + { + Background = itemBg, + CornerRadius = new CornerRadius(12, 12, 0, 0), + }; + titleBar.MouseLeftButtonDown += (_, _) => previewWin.DragMove(); + var titleText = new TextBlock + { + Text = "미리보기 — .skill.md", + FontSize = 14, + FontWeight = FontWeights.SemiBold, + Foreground = fgBrush, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(16, 0, 0, 0), + }; + titleBar.Child = titleText; + Grid.SetRow(titleBar, 0); + + // 콘텐츠 + var textBox = new TextBox + { + Text = content, + FontFamily = new FontFamily("Consolas, Cascadia Code, Segoe UI"), + FontSize = 12.5, + IsReadOnly = true, + AcceptsReturn = true, + TextWrapping = TextWrapping.Wrap, + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + Background = itemBg, + Foreground = fgBrush, + BorderThickness = new Thickness(0), + Padding = new Thickness(16, 12, 16, 12), + Margin = new Thickness(8, 8, 8, 0), + }; + Grid.SetRow(textBox, 1); + + // 하단 + var bottomBar = new Border + { + Padding = new Thickness(16, 10, 16, 10), + CornerRadius = new CornerRadius(0, 0, 12, 12), + }; + var closeBtn = new Border + { + CornerRadius = new CornerRadius(8), + Padding = new Thickness(18, 8, 18, 8), + Background = itemBg, + Cursor = Cursors.Hand, + HorizontalAlignment = HorizontalAlignment.Right, + }; + closeBtn.Child = new TextBlock + { + Text = "닫기", + FontSize = 12.5, + Foreground = subBrush, + }; + closeBtn.MouseLeftButtonUp += (_, _) => previewWin.Close(); + closeBtn.MouseEnter += (s, _) => + { + if (s is Border b) b.Background = new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + }; + closeBtn.MouseLeave += (s, _) => + { + if (s is Border b) b.Background = itemBg; + }; + bottomBar.Child = closeBtn; + Grid.SetRow(bottomBar, 2); + + grid.Children.Add(titleBar); + grid.Children.Add(textBox); + grid.Children.Add(bottomBar); + outerBorder.Child = grid; + previewWin.Content = outerBorder; + previewWin.ShowDialog(); + } + + // ─── 저장 ───────────────────────────────────────────────────────────── + + private void BtnSave_Click(object sender, MouseButtonEventArgs e) + { + // 유효성 검사 + var name = TxtName.Text.Trim(); + if (string.IsNullOrWhiteSpace(name)) + { + StatusText.Text = "⚠ 이름을 입력하세요."; + StatusText.Foreground = new SolidColorBrush(Color.FromRgb(0xF8, 0x71, 0x71)); + TxtName.Focus(); + return; + } + + // 영문 + 하이픈 + 숫자만 허용 + if (!System.Text.RegularExpressions.Regex.IsMatch(name, @"^[a-zA-Z][a-zA-Z0-9\-]*$")) + { + StatusText.Text = "⚠ 이름은 영문으로 시작하며 영문, 숫자, 하이픈만 사용 가능합니다."; + StatusText.Foreground = new SolidColorBrush(Color.FromRgb(0xF8, 0x71, 0x71)); + TxtName.Focus(); + return; + } + + if (string.IsNullOrWhiteSpace(TxtInstructions.Text)) + { + StatusText.Text = "⚠ 지시사항을 입력하세요."; + StatusText.Foreground = new SolidColorBrush(Color.FromRgb(0xF8, 0x71, 0x71)); + TxtInstructions.Focus(); + return; + } + + var content = GenerateSkillContent(); + + // 저장 경로 결정 + string savePath; + if (_editingSkill != null) + { + // 편집 모드: 기존 파일 덮어쓰기 + savePath = _editingSkill.FilePath; + } + else + { + // 새 스킬: 사용자 폴더에 저장 + var userFolder = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "skills"); + if (!Directory.Exists(userFolder)) + Directory.CreateDirectory(userFolder); + + savePath = Path.Combine(userFolder, $"{name}.skill.md"); + + // 파일 이름 충돌 시 숫자 추가 + if (File.Exists(savePath)) + { + var counter = 2; + while (File.Exists(Path.Combine(userFolder, $"{name}_{counter}.skill.md"))) + counter++; + savePath = Path.Combine(userFolder, $"{name}_{counter}.skill.md"); + } + } + + try + { + File.WriteAllText(savePath, content, System.Text.Encoding.UTF8); + SkillService.LoadSkills(); + + StatusText.Text = $"✓ 저장 완료: {Path.GetFileName(savePath)}"; + StatusText.Foreground = new SolidColorBrush(Color.FromRgb(0x34, 0xD3, 0x99)); + + // 편집 결과 반환 + DialogResult = true; + } + catch (Exception ex) + { + CustomMessageBox.Show($"저장 실패: {ex.Message}", "스킬 저장"); + } + } + + // ─── 편집 모드 로드 ─────────────────────────────────────────────────── + + private void LoadSkill(SkillDefinition skill) + { + TitleText.Text = "스킬 편집"; + TxtName.Text = skill.Name; + TxtLabel.Text = skill.Label; + TxtDescription.Text = skill.Description; + TxtInstructions.Text = skill.SystemPrompt; + + // 아이콘 선택 + _selectedIcon = IconCandidates.Contains(skill.Icon) ? skill.Icon : IconCandidates[0]; + BuildIconSelector(); + + // 런타임 요구사항 + for (int i = 0; i < CmbRequires.Items.Count; i++) + { + if (CmbRequires.Items[i] is ComboBoxItem item + && item.Tag is string tag + && string.Equals(tag, skill.Requires, StringComparison.OrdinalIgnoreCase)) + { + CmbRequires.SelectedIndex = i; + break; + } + } + + // 도구 체크리스트 (BuildToolChecklist에서 이미 _editingSkill 기반으로 설정됨) + UpdatePreview(); + } +} diff --git a/src/AxCopilot/Views/SkillGalleryWindow.xaml b/src/AxCopilot/Views/SkillGalleryWindow.xaml new file mode 100644 index 0000000..ca49b9c --- /dev/null +++ b/src/AxCopilot/Views/SkillGalleryWindow.xaml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/SkillGalleryWindow.xaml.cs b/src/AxCopilot/Views/SkillGalleryWindow.xaml.cs new file mode 100644 index 0000000..8505fa9 --- /dev/null +++ b/src/AxCopilot/Views/SkillGalleryWindow.xaml.cs @@ -0,0 +1,631 @@ +using System.IO; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using AxCopilot.Services.Agent; + +namespace AxCopilot.Views; + +/// 스킬 갤러리 창. 설치된 모든 스킬을 카드 형태로 표시하고 관리합니다. +public partial class SkillGalleryWindow : Window +{ + private string _selectedCategory = "전체"; + + public SkillGalleryWindow() + { + InitializeComponent(); + Loaded += (_, _) => { BuildCategoryFilter(); RenderSkills(); }; + } + + // ─── 타이틀바 ───────────────────────────────────────────────────────── + + private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + // 타이틀바 우측 버튼 영역에서는 DragMove 실행하지 않음 + var pos = e.GetPosition(this); + if (pos.X > ActualWidth - 160) return; // 우측 버튼 영역 보호 + + if (e.ClickCount == 2) + WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized; + else DragMove(); + } + + private void BtnClose_Click(object sender, MouseButtonEventArgs e) => Close(); + + // ─── 버튼 ───────────────────────────────────────────────────────────── + + private void BtnAddSkill_Click(object sender, MouseButtonEventArgs e) + { + var editor = new SkillEditorWindow { Owner = this }; + if (editor.ShowDialog() == true) + { + BuildCategoryFilter(); + RenderSkills(); + } + } + + private void BtnImport_Click(object sender, MouseButtonEventArgs e) + { + var dlg = new Microsoft.Win32.OpenFileDialog + { + Filter = "스킬 패키지 (*.zip)|*.zip", + Title = "가져올 스킬 zip 파일을 선택하세요", + }; + if (dlg.ShowDialog() != true) return; + + var count = SkillService.ImportSkills(dlg.FileName); + if (count > 0) + { + CustomMessageBox.Show($"스킬 {count}개를 성공적으로 가져왔습니다.", "스킬 가져오기"); + BuildCategoryFilter(); + RenderSkills(); + } + else + CustomMessageBox.Show("스킬 가져오기에 실패했습니다.", "스킬 가져오기"); + } + + // ─── 카테고리 필터 ───────────────────────────────────────────────────── + + private void BuildCategoryFilter() + { + CategoryFilterBar.Children.Clear(); + var skills = SkillService.Skills; + + var categories = new[] { "전체" } + .Concat(skills + .Select(s => string.IsNullOrEmpty(s.Requires) ? "내장" : "고급 (런타임)") + .Distinct()) + .ToList(); + + // 사용자 스킬이 있으면 추가 + var userFolder = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "skills"); + var hasUser = skills.Any(s => + s.FilePath.StartsWith(userFolder, StringComparison.OrdinalIgnoreCase)); + if (hasUser && !categories.Contains("사용자")) + categories.Add("사용자"); + + foreach (var cat in categories) + { + var btn = new Border + { + Tag = cat, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(14, 5, 14, 5), + Margin = new Thickness(0, 0, 6, 0), + Background = cat == _selectedCategory + ? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)) + : TryFindResource("ItemBackground") as Brush ?? Brushes.Transparent, + Cursor = Cursors.Hand, + }; + btn.Child = new TextBlock + { + Text = cat, + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = cat == _selectedCategory + ? Brushes.White + : TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + }; + btn.MouseLeftButtonUp += (s, _) => + { + if (s is Border b && b.Tag is string tag) + { + _selectedCategory = tag; + BuildCategoryFilter(); + RenderSkills(); + } + }; + CategoryFilterBar.Children.Add(btn); + } + } + + // ─── 스킬 목록 렌더링 ────────────────────────────────────────────────── + + private void RenderSkills() + { + SkillListPanel.Children.Clear(); + var skills = FilterSkills(SkillService.Skills); + + var userFolder = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "skills"); + + foreach (var skill in skills) + SkillListPanel.Children.Add(BuildSkillCard(skill, userFolder)); + + if (skills.Count == 0) + SkillListPanel.Children.Add(new TextBlock + { + Text = "표시할 스킬이 없습니다.", + FontSize = 13, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + Margin = new Thickness(0, 20, 0, 0), + HorizontalAlignment = HorizontalAlignment.Center, + }); + + var total = SkillService.Skills.Count; + var avail = SkillService.Skills.Count(s => s.IsAvailable); + GalleryStatus.Text = $"총 {total}개 스킬 | 사용 가능 {avail}개 | 런타임 필요 {total - avail}개"; + } + + private List FilterSkills(IReadOnlyList skills) + { + var userFolder = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "AxCopilot", "skills"); + + return _selectedCategory switch + { + "내장" => skills.Where(s => string.IsNullOrEmpty(s.Requires) + && !s.FilePath.StartsWith(userFolder, StringComparison.OrdinalIgnoreCase)).ToList(), + "고급 (런타임)" => skills.Where(s => !string.IsNullOrEmpty(s.Requires)).ToList(), + "사용자" => skills.Where(s => s.FilePath.StartsWith(userFolder, StringComparison.OrdinalIgnoreCase)).ToList(), + _ => skills.ToList(), + }; + } + + private Border BuildSkillCard(SkillDefinition skill, string userFolder) + { + var bgBrush = TryFindResource("ItemBackground") as Brush ?? Brushes.Transparent; + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + + var isUser = skill.FilePath.StartsWith(userFolder, StringComparison.OrdinalIgnoreCase); + var isAdvanced = !string.IsNullOrEmpty(skill.Requires); + + var card = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(10), + Padding = new Thickness(14, 10, 14, 10), + Margin = new Thickness(0, 0, 0, 6), + }; + + var grid = new Grid(); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) }); + grid.ColumnDefinitions.Add(new ColumnDefinition()); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) }); + + // ── 아이콘 원 ── + var iconBorder = new Border + { + Width = 38, + Height = 38, + CornerRadius = new CornerRadius(10), + Background = new SolidColorBrush(Color.FromArgb(0x30, 0x4B, 0x5E, 0xFC)), + Margin = new Thickness(0, 0, 12, 0), + VerticalAlignment = VerticalAlignment.Center, + }; + iconBorder.Child = new TextBlock + { + Text = skill.Icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 16, + Foreground = skill.IsAvailable + ? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)) + : subBrush, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(iconBorder, 0); + + // ── 정보 ── + var infoPanel = new StackPanel { VerticalAlignment = VerticalAlignment.Center }; + + // 이름 + 뱃지들 + var nameRow = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 0, 0, 3) }; + nameRow.Children.Add(new TextBlock + { + Text = $"/{skill.Name}", + FontSize = 13, + FontWeight = FontWeights.SemiBold, + FontFamily = new FontFamily("Consolas"), + Foreground = skill.IsAvailable + ? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)) + : subBrush, + Opacity = skill.IsAvailable ? 1.0 : 0.6, + VerticalAlignment = VerticalAlignment.Center, + }); + nameRow.Children.Add(new TextBlock + { + Text = $" {skill.Label}", + FontSize = 12.5, + Foreground = fgBrush, + VerticalAlignment = VerticalAlignment.Center, + }); + + // 소스 뱃지 + if (isUser) + nameRow.Children.Add(MakeBadge("사용자", "#34D399")); + else if (isAdvanced) + nameRow.Children.Add(MakeBadge("고급", "#A78BFA")); + else + nameRow.Children.Add(MakeBadge("내장", "#9CA3AF")); + + // 비가용 뱃지 + if (!skill.IsAvailable) + nameRow.Children.Add(MakeBadge(skill.UnavailableHint, "#F87171")); + + infoPanel.Children.Add(nameRow); + infoPanel.Children.Add(new TextBlock + { + Text = skill.Description, + FontSize = 11.5, + Foreground = subBrush, + TextWrapping = TextWrapping.Wrap, + Opacity = skill.IsAvailable ? 1.0 : 0.6, + }); + Grid.SetColumn(infoPanel, 1); + + // ── 액션 버튼들 ── + var actions = new StackPanel + { + Orientation = Orientation.Horizontal, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(8, 0, 0, 0), + }; + + // 편집 + actions.Children.Add(MakeActionBtn("\uE70F", "#3B82F6", isUser ? "편집 (시각적 편집기)" : "편집 (파일 열기)", + () => + { + if (isUser) + { + var editor = new SkillEditorWindow(skill) { Owner = this }; + if (editor.ShowDialog() == true) + { + SkillService.LoadSkills(); + BuildCategoryFilter(); + RenderSkills(); + } + } + else + { + try { System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(skill.FilePath) { UseShellExecute = true }); } + catch (Exception ex) { CustomMessageBox.Show($"파일을 열 수 없습니다: {ex.Message}", "편집"); } + } + })); + + // 복제 (사용자 스킬/폴더 스킬만) + actions.Children.Add(MakeActionBtn("\uE8C8", "#10B981", "복제", + () => + { + try + { + var destFolder = Path.Combine(userFolder); + if (!Directory.Exists(destFolder)) Directory.CreateDirectory(destFolder); + + var srcName = Path.GetFileNameWithoutExtension(skill.FilePath); + var destPath = Path.Combine(destFolder, $"{srcName}_copy.skill.md"); + var counter = 2; + while (File.Exists(destPath)) + destPath = Path.Combine(destFolder, $"{srcName}_copy{counter++}.skill.md"); + + File.Copy(skill.FilePath, destPath); + SkillService.LoadSkills(); + BuildCategoryFilter(); + RenderSkills(); + } + catch (Exception ex) { CustomMessageBox.Show($"복제 실패: {ex.Message}", "복제"); } + })); + + // 내보내기 + actions.Children.Add(MakeActionBtn("\uEDE1", "#F59E0B", "내보내기 (.zip)", + () => + { + var folderDlg = new System.Windows.Forms.FolderBrowserDialog + { Description = "내보낼 폴더를 선택하세요" }; + if (folderDlg.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; + var result = SkillService.ExportSkill(skill, folderDlg.SelectedPath); + if (result != null) + CustomMessageBox.Show($"내보내기 완료:\n{result}", "내보내기"); + else + CustomMessageBox.Show("내보내기에 실패했습니다.", "내보내기"); + })); + + // 삭제 (사용자 스킬만) + if (isUser) + { + actions.Children.Add(MakeActionBtn("\uE74D", "#F87171", "삭제", + () => + { + var confirm = CustomMessageBox.Show( + $"스킬 '/{skill.Name}'을 삭제하시겠습니까?", + "스킬 삭제", + MessageBoxButton.YesNo, MessageBoxImage.Question); + if (confirm != MessageBoxResult.Yes) return; + try + { + File.Delete(skill.FilePath); + SkillService.LoadSkills(); + BuildCategoryFilter(); + RenderSkills(); + } + catch (Exception ex) { CustomMessageBox.Show($"삭제 실패: {ex.Message}", "삭제"); } + })); + } + + Grid.SetColumn(actions, 2); + + grid.Children.Add(iconBorder); + grid.Children.Add(infoPanel); + grid.Children.Add(actions); + card.Child = grid; + + // 호버 효과 + 카드 클릭 → 상세 보기 + card.Cursor = Cursors.Hand; + card.MouseEnter += (_, _) => + { + card.Background = new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + }; + card.MouseLeave += (_, _) => card.Background = bgBrush; + card.MouseLeftButtonUp += (_, e) => + { + // 액션 버튼 클릭은 무시 (버블링 방지) + if (e.OriginalSource is FrameworkElement src) + { + var parent = src; + while (parent != null) + { + if (parent == actions) return; + parent = VisualTreeHelper.GetParent(parent) as FrameworkElement; + } + } + ShowSkillDetail(skill); + }; + + return card; + } + + private Border MakeBadge(string text, string colorHex) + { + var col = (Color)ColorConverter.ConvertFromString(colorHex); + return new Border + { + Background = new SolidColorBrush(Color.FromArgb(0x25, col.R, col.G, col.B)), + CornerRadius = new CornerRadius(4), + Padding = new Thickness(5, 1, 5, 1), + Margin = new Thickness(6, 0, 0, 0), + VerticalAlignment = VerticalAlignment.Center, + Child = new TextBlock + { + Text = text, + FontSize = 9.5, + FontWeight = FontWeights.SemiBold, + Foreground = new SolidColorBrush(col), + }, + }; + } + + private Border MakeActionBtn(string icon, string colorHex, string tooltip, Action action) + { + var col = (Color)ColorConverter.ConvertFromString(colorHex); + var btn = new Border + { + Width = 28, + Height = 28, + CornerRadius = new CornerRadius(6), + Background = Brushes.Transparent, + Cursor = Cursors.Hand, + Margin = new Thickness(2, 0, 0, 0), + ToolTip = tooltip, + Child = new TextBlock + { + Text = icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 12, + Foreground = new SolidColorBrush(col), + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }, + }; + btn.MouseEnter += (_, _) => + btn.Background = new SolidColorBrush(Color.FromArgb(0x20, col.R, col.G, col.B)); + btn.MouseLeave += (_, _) => btn.Background = Brushes.Transparent; + btn.MouseLeftButtonUp += (_, _) => action(); + return btn; + } + + // ─── 스킬 상세 보기 팝업 ─────────────────────────────────────────────── + + private void ShowSkillDetail(SkillDefinition skill) + { + var bgBrush = TryFindResource("LauncherBackground") as Brush ?? Brushes.Black; + var fgBrush = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var subBrush = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var itemBg = TryFindResource("ItemBackground") as Brush ?? Brushes.Transparent; + var borderBr = TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + + var popup = new Window + { + Title = $"/{skill.Name}", + Width = 580, + Height = 480, + WindowStyle = WindowStyle.None, + AllowsTransparency = true, + Background = Brushes.Transparent, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + Owner = this, + }; + + var outerBorder = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(12), + BorderBrush = borderBr, + BorderThickness = new Thickness(1, 1, 1, 1), + Effect = new System.Windows.Media.Effects.DropShadowEffect + { + BlurRadius = 20, + ShadowDepth = 4, + Opacity = 0.3, + Color = Colors.Black, + }, + }; + + var mainGrid = new Grid(); + mainGrid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(44) }); + mainGrid.RowDefinitions.Add(new RowDefinition()); + + // ── 타이틀바 ── + var titleBar = new Border + { + CornerRadius = new CornerRadius(12, 12, 0, 0), + Background = itemBg, + }; + titleBar.MouseLeftButtonDown += (_, e) => + { + var pos = e.GetPosition(popup); + if (pos.X > popup.ActualWidth - 50) return; + popup.DragMove(); + }; + + var titleGrid = new Grid { Margin = new Thickness(16, 0, 12, 0) }; + var titleLeft = new StackPanel { Orientation = Orientation.Horizontal, VerticalAlignment = VerticalAlignment.Center }; + titleLeft.Children.Add(new TextBlock + { + Text = skill.Icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, + Foreground = new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 1, 8, 0), + }); + titleLeft.Children.Add(new TextBlock + { + Text = $"/{skill.Name} {skill.Label}", + FontSize = 14, + FontWeight = FontWeights.SemiBold, + Foreground = fgBrush, + VerticalAlignment = VerticalAlignment.Center, + }); + titleGrid.Children.Add(titleLeft); + + var closeBtn = new Border + { + Width = 28, Height = 28, + CornerRadius = new CornerRadius(6), + Cursor = Cursors.Hand, + HorizontalAlignment = HorizontalAlignment.Right, + VerticalAlignment = VerticalAlignment.Center, + }; + closeBtn.Child = new TextBlock + { + Text = "\uE8BB", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 10, + Foreground = subBrush, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + closeBtn.MouseEnter += (s, _) => ((Border)s).Background = + new SolidColorBrush(Color.FromArgb(0x33, 0xFF, 0x44, 0x44)); + closeBtn.MouseLeave += (s, _) => ((Border)s).Background = Brushes.Transparent; + closeBtn.MouseLeftButtonUp += (_, _) => popup.Close(); + titleGrid.Children.Add(closeBtn); + + titleBar.Child = titleGrid; + Grid.SetRow(titleBar, 0); + + // ── 본문: 스킬 정보 + 프롬프트 미리보기 ── + var body = new ScrollViewer + { + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + Padding = new Thickness(20, 16, 20, 16), + }; + + var bodyPanel = new StackPanel(); + + // 메타 정보 + var metaGrid = new Grid { Margin = new Thickness(0, 0, 0, 14) }; + metaGrid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(80) }); + metaGrid.ColumnDefinitions.Add(new ColumnDefinition()); + + void AddMetaRow(string label, string value, int row) + { + if (string.IsNullOrEmpty(value)) return; + metaGrid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); + var lb = new TextBlock + { + Text = label, FontSize = 11.5, Foreground = subBrush, + Margin = new Thickness(0, 2, 0, 2), + }; + Grid.SetRow(lb, row); Grid.SetColumn(lb, 0); + metaGrid.Children.Add(lb); + + var vb = new TextBlock + { + Text = value, FontSize = 11.5, Foreground = fgBrush, + TextWrapping = TextWrapping.Wrap, + Margin = new Thickness(0, 2, 0, 2), + }; + Grid.SetRow(vb, row); Grid.SetColumn(vb, 1); + metaGrid.Children.Add(vb); + } + + var metaRow = 0; + AddMetaRow("명령어", $"/{skill.Name}", metaRow++); + AddMetaRow("라벨", skill.Label, metaRow++); + AddMetaRow("설명", skill.Description, metaRow++); + if (!string.IsNullOrEmpty(skill.Requires)) + AddMetaRow("런타임", skill.Requires, metaRow++); + if (!string.IsNullOrEmpty(skill.AllowedTools)) + AddMetaRow("허용 도구", skill.AllowedTools, metaRow++); + AddMetaRow("상태", skill.IsAvailable ? "✓ 사용 가능" : $"✗ {skill.UnavailableHint}", metaRow++); + AddMetaRow("경로", skill.FilePath, metaRow++); + + bodyPanel.Children.Add(metaGrid); + + // 구분선 + bodyPanel.Children.Add(new Border + { + Height = 1, + Background = borderBr, + Margin = new Thickness(0, 4, 0, 12), + }); + + // 프롬프트 내용 미리보기 + bodyPanel.Children.Add(new TextBlock + { + Text = "시스템 프롬프트 (미리보기)", + FontSize = 11, + FontWeight = FontWeights.SemiBold, + Foreground = subBrush, + Margin = new Thickness(0, 0, 0, 6), + }); + + var promptBorder = new Border + { + Background = itemBg, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(12, 10, 12, 10), + }; + var promptText = skill.SystemPrompt; + if (promptText.Length > 2000) + promptText = promptText[..2000] + "\n\n... (이하 생략)"; + + promptBorder.Child = new TextBlock + { + Text = promptText, + FontSize = 11.5, + FontFamily = new FontFamily("Consolas, Cascadia Code, Segoe UI"), + Foreground = fgBrush, + TextWrapping = TextWrapping.Wrap, + Opacity = 0.85, + }; + bodyPanel.Children.Add(promptBorder); + + body.Content = bodyPanel; + Grid.SetRow(body, 1); + + mainGrid.Children.Add(titleBar); + mainGrid.Children.Add(body); + outerBorder.Child = mainGrid; + popup.Content = outerBorder; + + popup.ShowDialog(); + } +} diff --git a/src/AxCopilot/Views/StatisticsWindow.xaml b/src/AxCopilot/Views/StatisticsWindow.xaml new file mode 100644 index 0000000..0532133 --- /dev/null +++ b/src/AxCopilot/Views/StatisticsWindow.xaml @@ -0,0 +1,821 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 아직 명령어 사용 데이터가 없습니다. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/StatisticsWindow.xaml.cs b/src/AxCopilot/Views/StatisticsWindow.xaml.cs new file mode 100644 index 0000000..b1c5c08 --- /dev/null +++ b/src/AxCopilot/Views/StatisticsWindow.xaml.cs @@ -0,0 +1,49 @@ +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Input; +using System.Windows.Interop; +using AxCopilot.ViewModels; + +namespace AxCopilot.Views; + +public partial class StatisticsWindow : Window +{ + [DllImport("user32.dll")] private static extern void ReleaseCapture(); + [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + private const int WM_NCLBUTTONDOWN = 0xA1; + private const int HTBOTTOMRIGHT = 17; + + private readonly StatisticsViewModel _vm; + + public StatisticsWindow() + { + InitializeComponent(); + _vm = new StatisticsViewModel(); + DataContext = _vm; + } + + private void Window_MouseDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left && e.LeftButton == MouseButtonState.Pressed) + try { DragMove(); } catch (Exception) { } + } + + private void ResizeGrip_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (e.ButtonState != MouseButtonState.Pressed) return; + ReleaseCapture(); + SendMessage(new WindowInteropHelper(this).Handle, WM_NCLBUTTONDOWN, (IntPtr)HTBOTTOMRIGHT, IntPtr.Zero); + } + + private void Close_Click(object sender, RoutedEventArgs e) => Close(); + + private void Refresh_Click(object sender, RoutedEventArgs e) => _vm.Refresh(); + + private void StatsTab_Click(object sender, RoutedEventArgs e) + { + if (PanelMain == null || PanelCommander == null || PanelAgent == null) return; + PanelMain.Visibility = StatsTabMain.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + PanelCommander.Visibility = StatsTabCommander.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + PanelAgent.Visibility = StatsTabAgent.IsChecked == true ? Visibility.Visible : Visibility.Collapsed; + } +} diff --git a/src/AxCopilot/Views/TextActionPopup.xaml b/src/AxCopilot/Views/TextActionPopup.xaml new file mode 100644 index 0000000..78e0e81 --- /dev/null +++ b/src/AxCopilot/Views/TextActionPopup.xaml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/TextActionPopup.xaml.cs b/src/AxCopilot/Views/TextActionPopup.xaml.cs new file mode 100644 index 0000000..45a3b49 --- /dev/null +++ b/src/AxCopilot/Views/TextActionPopup.xaml.cs @@ -0,0 +1,204 @@ +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; + +namespace AxCopilot.Views; + +/// +/// 텍스트가 선택된 상태에서 핫키를 누르면 커서 위치에 표시되는 액션 선택 팝업. +/// ↑↓ 화살표로 이동, Enter로 실행, Esc로 닫기. +/// +public partial class TextActionPopup : Window +{ + [DllImport("user32.dll")] + private static extern bool GetCursorPos(out POINT lpPoint); + + [StructLayout(LayoutKind.Sequential)] + private struct POINT { public int X; public int Y; } + + public enum ActionResult { None, OpenLauncher, Translate, Summarize, GrammarFix, Explain, Rewrite } + + public ActionResult SelectedAction { get; private set; } = ActionResult.None; + public string SelectedText { get; private set; } = ""; + + private int _selectedIndex; + private readonly List<(ActionResult Action, string Icon, string Label)> _items; + + // 전체 명령 정의 (key → ActionResult, icon, label) + private static readonly (string Key, ActionResult Action, string Icon, string Label)[] AllCommands = + { + ("translate", ActionResult.Translate, "\uE774", "번역"), + ("summarize", ActionResult.Summarize, "\uE8D2", "요약"), + ("grammar", ActionResult.GrammarFix, "\uE8AC", "문법 교정"), + ("explain", ActionResult.Explain, "\uE946", "설명"), + ("rewrite", ActionResult.Rewrite, "\uE70F", "다시 쓰기"), + }; + + /// 사용 가능한 전체 명령 키와 라벨 목록. + public static IReadOnlyList<(string Key, string Label)> AvailableCommands + => AllCommands.Select(c => (c.Key, c.Label)).ToList(); + + public TextActionPopup(string selectedText, List? enabledCommands = null) + { + InitializeComponent(); + + SelectedText = selectedText; + var preview = selectedText.Replace("\r\n", " ").Replace("\n", " "); + PreviewText.Text = preview.Length > 60 ? preview[..57] + "…" : preview; + + // 설정에서 활성화된 명령만 표시 + var enabled = enabledCommands ?? AllCommands.Select(c => c.Key).ToList(); + + _items = new() { (ActionResult.OpenLauncher, "\uE8A7", "AX Commander 열기") }; + foreach (var cmd in AllCommands) + { + if (enabled.Contains(cmd.Key, StringComparer.OrdinalIgnoreCase)) + _items.Add((cmd.Action, cmd.Icon, cmd.Label)); + } + + BuildMenuItems(); + PositionAtCursor(); + + Loaded += (_, _) => + { + Focus(); + UpdateSelection(); + }; + } + + private void BuildMenuItems() + { + var primaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var accentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.CornflowerBlue; + + for (int i = 0; i < _items.Count; i++) + { + var (action, icon, label) = _items[i]; + var idx = i; + + var sp = new StackPanel { Orientation = Orientation.Horizontal }; + sp.Children.Add(new TextBlock + { + Text = icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, + Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 10, 0), + Width = 20, + TextAlignment = TextAlignment.Center, + }); + sp.Children.Add(new TextBlock + { + Text = label, + FontSize = 13, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + + var border = new Border + { + Child = sp, + CornerRadius = new CornerRadius(8), + Padding = new Thickness(10, 8, 14, 8), + Margin = new Thickness(0, 1, 0, 1), + Background = Brushes.Transparent, + Cursor = Cursors.Hand, + Tag = idx, + }; + + border.MouseEnter += (s, _) => + { + if (s is Border b && b.Tag is int n) + { + _selectedIndex = n; + UpdateSelection(); + } + }; + + border.MouseLeftButtonUp += (_, _) => + { + SelectedAction = action; + Close(); + }; + + MenuItems.Children.Add(border); + } + } + + private void UpdateSelection() + { + var hoverBrush = TryFindResource("ItemHoverBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + var selectedBrush = TryFindResource("ItemSelectedBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x44, 0x4B, 0x5E, 0xFC)); + + for (int i = 0; i < MenuItems.Children.Count; i++) + { + if (MenuItems.Children[i] is Border b) + b.Background = i == _selectedIndex ? selectedBrush : Brushes.Transparent; + } + } + + private void PositionAtCursor() + { + GetCursorPos(out var pt); + + // DPI 보정 + var source = PresentationSource.FromVisual(this); + double dpiX = 1.0, dpiY = 1.0; + if (source?.CompositionTarget != null) + { + dpiX = source.CompositionTarget.TransformFromDevice.M11; + dpiY = source.CompositionTarget.TransformFromDevice.M22; + } + + Left = pt.X * dpiX; + Top = pt.Y * dpiY + 10; // 커서 아래쪽에 표시 + + // 화면 밖으로 나가지 않도록 보정 + var screen = SystemParameters.WorkArea; + if (Left + 280 > screen.Right) Left = screen.Right - 280; + if (Top + 300 > screen.Bottom) Top = pt.Y * dpiY - 300; // 위쪽으로 + if (Left < screen.Left) Left = screen.Left; + if (Top < screen.Top) Top = screen.Top; + } + + private void Window_KeyDown(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.Up: + _selectedIndex = (_selectedIndex - 1 + _items.Count) % _items.Count; + UpdateSelection(); + e.Handled = true; + break; + + case Key.Down: + _selectedIndex = (_selectedIndex + 1) % _items.Count; + UpdateSelection(); + e.Handled = true; + break; + + case Key.Enter: + SelectedAction = _items[_selectedIndex].Action; + Close(); + e.Handled = true; + break; + + case Key.Escape: + SelectedAction = ActionResult.None; + Close(); + e.Handled = true; + break; + } + } + + private void Window_Deactivated(object? sender, EventArgs e) + { + // 포커스를 잃으면 자동 닫기 + if (IsVisible) Close(); + } +} diff --git a/src/AxCopilot/Views/ThemeResourceHelper.cs b/src/AxCopilot/Views/ThemeResourceHelper.cs new file mode 100644 index 0000000..b52e84a --- /dev/null +++ b/src/AxCopilot/Views/ThemeResourceHelper.cs @@ -0,0 +1,119 @@ +using System.Windows; +using System.Windows.Media; + +namespace AxCopilot.Views; + +/// +/// Phase 33-E: 테마 리소스 헬퍼. +/// TryFindResource("XXX") as Brush ?? Brushes.YYY 패턴이 +/// ChatWindow.xaml.cs에 176회 이상 반복되는 것을 단일 메서드로 통합합니다. +/// +/// 사용법: +/// +/// var fg = ThemeResourceHelper.Brush(this, "PrimaryText", Brushes.White); +/// var bg = ThemeResourceHelper.Brush(this, "LauncherBackground"); +/// +/// +public static class ThemeResourceHelper +{ + // ─── 사전 정의 리소스 키 (매직 스트링 방지) ────────────────── + + public const string PrimaryText = "PrimaryText"; + public const string SecondaryText = "SecondaryText"; + public const string AccentColor = "AccentColor"; + public const string LauncherBackground = "LauncherBackground"; + public const string ItemBackground = "ItemBackground"; + public const string ItemHoverBackground = "ItemHoverBackground"; + public const string BorderColor = "BorderColor"; + public const string HintBackground = "HintBackground"; + public const string HintText = "HintText"; + public const string SeparatorColor = "SeparatorColor"; + + /// + /// 테마 리소스에서 Brush를 조회합니다. + /// 리소스가 없으면 을 반환합니다. + /// + public static Brush Brush(FrameworkElement element, string key, Brush? fallback = null) + => element.TryFindResource(key) as Brush ?? fallback ?? Brushes.Transparent; + + /// Brush 오버로드 — Application 수준 리소스 조회. + public static Brush Brush(string key, Brush? fallback = null) + => Application.Current?.TryFindResource(key) as Brush ?? fallback ?? Brushes.Transparent; + + /// PrimaryText 색상을 반환합니다. + public static Brush Primary(FrameworkElement el) + => Brush(el, PrimaryText, Brushes.White); + + /// SecondaryText 색상을 반환합니다. + public static Brush Secondary(FrameworkElement el) + => Brush(el, SecondaryText, Brushes.Gray); + + /// AccentColor 색상을 반환합니다. + public static Brush Accent(FrameworkElement el) + => Brush(el, AccentColor, Brushes.DodgerBlue); + + /// LauncherBackground 색상을 반환합니다. + public static Brush Background(FrameworkElement el) + => Brush(el, LauncherBackground, Brushes.Black); + + /// ItemBackground 색상을 반환합니다. + public static Brush ItemBg(FrameworkElement el) + => Brush(el, ItemBackground, Brushes.DarkGray); + + /// ItemHoverBackground 색상을 반환합니다. + public static Brush HoverBg(FrameworkElement el) + => Brush(el, ItemHoverBackground, Brushes.DimGray); + + /// BorderColor 색상을 반환합니다. + public static Brush Border(FrameworkElement el) + => Brush(el, BorderColor, Brushes.Gray); + + /// HintBackground 색상을 반환합니다. + public static Brush Hint(FrameworkElement el) + => Brush(el, HintBackground, Brushes.DarkGray); + + /// HintText 색상을 반환합니다. + public static Brush HintFg(FrameworkElement el) + => Brush(el, HintText, Brushes.DarkGray); + + /// SeparatorColor 색상을 반환합니다. + public static Brush Separator(FrameworkElement el) + => Brush(el, SeparatorColor, Brushes.Gray); + + /// + /// Segoe MDL2 Assets 글리프 TextBlock을 생성합니다. + /// ChatWindow에서 50+ 회 반복되는 패턴을 통합합니다. + /// + public static System.Windows.Controls.TextBlock Icon( + string glyph, double fontSize = 14, + Brush? foreground = null, VerticalAlignment vAlign = VerticalAlignment.Center) + { + return new System.Windows.Controls.TextBlock + { + Text = glyph, + FontFamily = SegoeMdl2, + FontSize = fontSize, + Foreground = foreground ?? Brushes.White, + VerticalAlignment = vAlign, + }; + } + + /// + /// HEX 문자열을 SolidColorBrush로 변환합니다. + /// new SolidColorBrush((Color)ColorConverter.ConvertFromString(hex)) 패턴을 통합합니다. + /// + public static SolidColorBrush HexBrush(string hex) + => new((Color)ColorConverter.ConvertFromString(hex)); + + /// + /// HEX 문자열을 Color로 변환합니다. + /// + public static Color HexColor(string hex) + => (Color)ColorConverter.ConvertFromString(hex); + + /// Segoe MDL2 Assets FontFamily (캐시됨). + public static readonly FontFamily SegoeMdl2 = new("Segoe MDL2 Assets"); + + /// Consolas FontFamily (캐시됨). + public static readonly FontFamily Consolas = new("Consolas"); +} diff --git a/src/AxCopilot/Views/TrayContextMenu.cs b/src/AxCopilot/Views/TrayContextMenu.cs new file mode 100644 index 0000000..f4f277e --- /dev/null +++ b/src/AxCopilot/Views/TrayContextMenu.cs @@ -0,0 +1,373 @@ +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Text; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace AxCopilot.Views; + +/// +/// 모던 카드 스타일 트레이 컨텍스트 메뉴 팩토리. +/// 배경색은 현재 WPF 테마 리소스를 실시간으로 읽어 적용합니다. +/// +internal static class TrayContextMenu +{ + // Segoe MDL2 Assets 글리프 상수 + internal const string GlyphOpen = "\uE7C5"; // Launch + internal const string GlyphSettings = "\uE713"; // Settings + internal const string GlyphReload = "\uE72C"; // Refresh + internal const string GlyphFolder = "\uE838"; // Folder + internal const string GlyphInfo = "\uE946"; // Info + internal const string GlyphStats = "\uE9D9"; // Chart + internal const string GlyphChat = "\uE8BD"; // Chat + internal const string GlyphGuide = "\uE736"; // ReadingList (사용 가이드) + internal const string GlyphAutoRun = "\uE82F"; // Lightbulb (전구) + internal const string GlyphExit = "\uE711"; // Cancel + + // 1×1 투명 더미 이미지 — OnRenderItemImage 콜백을 강제로 트리거하기 위함 + private static readonly System.Drawing.Bitmap DummyImage = new(1, 1); + + /// + /// 현재 화면의 DPI 배율을 반환합니다 (100% = 1.0, 150% = 1.5). + /// WinForms는 논리 픽셀 값을 DPI 배율만큼 자동 확대하므로, + /// 이 값으로 역산하여 모든 PC에서 동일한 물리적 크기를 유지합니다. + /// + private static float GetDpiScale() + { + try + { + using var g = System.Drawing.Graphics.FromHwnd(IntPtr.Zero); + return Math.Max(1f, g.DpiX / 96f); + } + catch (Exception) { return 1f; } + } + + /// 논리 픽셀 값을 DPI 역산하여 물리적 크기가 동일하게 유지되도록 변환합니다. + private static int Dp(int logicalPx, float dpiScale) => + Math.Max(1, (int)Math.Round(logicalPx / dpiScale)); + + /// 외부에서 DPI 보정된 Padding을 생성할 때 사용합니다. + public static System.Windows.Forms.Padding DpiPadding(int left, int top, int right, int bottom) + { + var s = GetDpiScale(); + return new System.Windows.Forms.Padding(Dp(left, s), Dp(top, s), Dp(right, s), Dp(bottom, s)); + } + + public static ToolStripMenuItem MakeItem(string text, string glyph, EventHandler onClick) + { + var s = GetDpiScale(); + var item = new ToolStripMenuItem(text) + { + Tag = glyph, + Image = DummyImage, // Image가 있어야 OnRenderItemImage가 호출됨 + Padding = new Padding(Dp(4, s), Dp(10, s), Dp(16, s), Dp(10, s)), + }; + item.Click += onClick; + return item; + } + + /// 패딩이 적용된 ContextMenuStrip을 생성합니다. + public static ContextMenuStrip CreateMenu() + { + var s = GetDpiScale(); + var menu = new ContextMenuStrip(); + menu.Renderer = new ModernTrayRenderer(); + // Point 단위 폰트는 DPI 자동 확대되므로 역산 적용 + // Point 단위는 DPI와 무관하게 동일한 물리 크기 → 역산하지 않음 + menu.Font = new Font("Segoe UI", 10f, GraphicsUnit.Point); + menu.ShowImageMargin = true; + // 너비를 넉넉히 잡아 좌측 아이콘~테두리 간 여백 확보 + menu.ImageScalingSize = new Size(Dp(52, s), Dp(32, s)); + menu.MinimumSize = new Size(Dp(280, s), 0); + + // 팝업이 열릴 때 모서리를 둥글게 클리핑 + menu.Opened += (_, _) => ApplyRoundedCorners(menu); + return menu; + } + + private static void ApplyRoundedCorners(ContextMenuStrip menu) + { + try + { + var rgn = CreateRoundRectRgn(0, 0, menu.Width, menu.Height, 16, 16); + if (rgn == IntPtr.Zero) return; + // SetWindowRgn 성공 시 시스템이 핸들 소유권을 가져감 → DeleteObject 불필요 + // 실패 시 직접 해제해야 GDI 누수 방지 + if (SetWindowRgn(menu.Handle, rgn, true) == 0) + DeleteObject(rgn); + } + catch (Exception) { /* 클리핑 실패 시 사각형으로 폴백 */ } + } + + [DllImport("gdi32.dll")] + private static extern IntPtr CreateRoundRectRgn(int x1, int y1, int x2, int y2, int cx, int cy); + + [DllImport("gdi32.dll")] + private static extern bool DeleteObject(IntPtr hObject); + + [DllImport("user32.dll")] + private static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw); + + /// + /// 모든 아이템 추가 후 호출하여 상하 테두리 여백을 적용합니다. + /// WinForms ContextMenuStrip은 Padding/DefaultPadding/DisplayRectangle 모두 + /// 내부 레이아웃이 무시하므로, 첫/마지막 아이템의 Margin으로 처리합니다. + /// + public static void ApplySpacing(ContextMenuStrip menu, int top = 10, int bottom = 10, int left = 0, int right = 0) + { + if (menu.Items.Count == 0) return; + var s = GetDpiScale(); + int t = Dp(top, s), b = Dp(bottom, s), l = Dp(left, s), r = Dp(right, s); + + foreach (ToolStripItem item in menu.Items) + { + var m = item.Margin; + item.Margin = new Padding(m.Left + l, m.Top, m.Right + r, m.Bottom); + } + var first = menu.Items[0]; + first.Margin = new Padding(first.Margin.Left, t, first.Margin.Right, first.Margin.Bottom); + var last = menu.Items[menu.Items.Count - 1]; + last.Margin = new Padding(last.Margin.Left, last.Margin.Top, last.Margin.Right, b); + } +} + +// ───────────────────────────────────────────────────────────────────────────── + +internal sealed class ModernTrayRenderer : ToolStripProfessionalRenderer +{ + // 전구(자동 실행) 활성 색상 — 앰버 글로우 + private static readonly Color BulbOnColor = Color.FromArgb(255, 185, 0); + private static readonly Color BulbGlowHalo = Color.FromArgb(50, 255, 185, 0); + + public ModernTrayRenderer() : base(new ModernColorTable()) { } + + // ─── 테마 색상 리더 ───────────────────────────────────────────────── + + private static Color ThemeColor(string key, Color fallback) + { + try + { + if (System.Windows.Application.Current?.Resources[key] + is System.Windows.Media.SolidColorBrush b) + return Color.FromArgb(b.Color.A, b.Color.R, b.Color.G, b.Color.B); + } + catch (Exception) { } + return fallback; + } + + private static Color BgColor => ThemeColor("LauncherBackground", Color.FromArgb(250, 250, 252)); + private static Color HoverColor => ThemeColor("ItemHoverBackground", Color.FromArgb(234, 234, 247)); + private static Color AccentColor => ThemeColor("AccentColor", Color.FromArgb(75, 94, 252)); + private static Color TextColor => ThemeColor("PrimaryText", Color.FromArgb(22, 23, 42)); + private static Color TextDimColor => ThemeColor("SecondaryText", Color.FromArgb(90, 92, 128)); + private static Color SepColor => ThemeColor("SeparatorColor", Color.FromArgb(228, 228, 242)); + private static Color BorderColor => ThemeColor("BorderColor", Color.FromArgb(210, 210, 232)); + private static Color IconColor => ThemeColor("SecondaryText", Color.FromArgb(110, 112, 148)); + + // ─── 배경 ──────────────────────────────────────────────────────────── + + protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) + { + using var br = new SolidBrush(BgColor); + e.Graphics.FillRectangle(br, e.AffectedBounds); + } + + protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) + { + var g = e.Graphics; + g.SmoothingMode = SmoothingMode.AntiAlias; + using var pen = new Pen(BorderColor, 1f); + // ApplyRoundedCorners 의 clip radius(14) 보다 0.5px 안쪽에 그려야 + // 창 경계 밖으로 삐져나오지 않음 + var rect = new RectangleF(0.5f, 0.5f, + e.ToolStrip.Width - 1f, + e.ToolStrip.Height - 1f); + using var path = BuildRoundedPath(rect, 15f); + g.DrawPath(pen, path); + g.SmoothingMode = SmoothingMode.Default; + } + + protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) + { + // 거터 없음 — 전체 배경과 동일한 색 + using var br = new SolidBrush(BgColor); + e.Graphics.FillRectangle(br, e.AffectedBounds); + } + + // ─── 아이템 배경 ───────────────────────────────────────────────────── + + protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) + { + var g = e.Graphics; + var item = e.Item; + + // 기본 배경 (항상 메뉴 배경색으로 초기화) + using var bg = new SolidBrush(BgColor); + g.FillRectangle(bg, 0, 0, item.Width, item.Height); + + if (!item.Selected || !item.Enabled) return; + + // 호버: 안쪽에 둥근 모서리 하이라이트 + g.SmoothingMode = SmoothingMode.AntiAlias; + using var hoverBr = new SolidBrush(HoverColor); + DrawRoundedFill(g, hoverBr, new RectangleF(6, 2, item.Width - 12, item.Height - 4), 8f); + g.SmoothingMode = SmoothingMode.Default; + } + + // ─── 구분선 ────────────────────────────────────────────────────────── + + protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e) + { + int y = e.Item.Height / 2; + using var pen = new Pen(SepColor); + e.Graphics.DrawLine(pen, 16, y, e.Item.Width - 16, y); + } + + // ─── 텍스트 ────────────────────────────────────────────────────────── + + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) + { + e.TextColor = e.Item.Enabled ? TextColor : TextDimColor; + e.TextFormat = TextFormatFlags.Left | TextFormatFlags.VerticalCenter; + base.OnRenderItemText(e); + } + + // ─── 아이콘 (일반 아이템 + CheckOnClick 모두 처리) ─────────────────── + + protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e) + { + // 모든 아이템의 글리프를 여기서 그린다 + DrawGlyph(e.Graphics, e.Item, e.ImageRectangle); + } + + protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) + { + // CheckOnClick 항목: 기본 체크마크 대신 글리프 아이콘을 그린다 + DrawGlyph(e.Graphics, e.Item, e.ImageRectangle); + } + + // ─── 글리프 렌더러 ─────────────────────────────────────────────────── + + private static void DrawGlyph(Graphics g, ToolStripItem item, Rectangle bounds) + { + if (item.Tag is not string glyph || string.IsNullOrEmpty(glyph)) return; + if (bounds.Width <= 0 || bounds.Height <= 0) return; + + g.TextRenderingHint = TextRenderingHint.AntiAlias; + + bool isLightbulb = glyph == TrayContextMenu.GlyphAutoRun; + bool isChecked = item is ToolStripMenuItem { Checked: true }; + + Color glyphColor; + if (isLightbulb && isChecked) + { + // 전구 켜짐 — 앰버 글로우 효과 + DrawLightbulbGlow(g, glyph, bounds); + glyphColor = BulbOnColor; + } + else if (isLightbulb && !isChecked) + { + // 전구 꺼짐 — 확실히 구분되는 진한 회색 + glyphColor = Color.FromArgb(120, 120, 140); + } + else if (item.Selected && item.Enabled) + { + glyphColor = AccentColor; + } + else + { + glyphColor = IconColor; + } + + // Point 단위는 DPI와 무관하게 동일한 물리 크기 → 역산하지 않음 + using var font = new Font("Segoe MDL2 Assets", 12f, GraphicsUnit.Point); + using var br = new SolidBrush(glyphColor); + var fmt = StringFormat.GenericTypographic; + var size = g.MeasureString(glyph, font, 0, fmt); + // 넓은 아이콘 영역 내 중앙 정렬 + float x = bounds.X + (bounds.Width - size.Width) / 2f + 2f; + float y = bounds.Y + (bounds.Height - size.Height) / 2f; + g.DrawString(glyph, font, br, x, y, fmt); + } + + private static void DrawLightbulbGlow(Graphics g, string glyph, Rectangle bounds) + { + // 중심에서 균일하게 퍼지는 원형 앰버 글로우 + g.SmoothingMode = SmoothingMode.AntiAlias; + float cx = bounds.X + bounds.Width / 2f; + float cy = bounds.Y + bounds.Height / 2f; + float radius = Math.Max(bounds.Width, bounds.Height) * 0.85f; + + var glowRect = new RectangleF(cx - radius, cy - radius, radius * 2, radius * 2); + using var path = new GraphicsPath(); + path.AddEllipse(glowRect); + using var brush = new PathGradientBrush(path) + { + CenterColor = Color.FromArgb(60, 255, 185, 0), + SurroundColors = new[] { Color.FromArgb(0, 255, 185, 0) }, + CenterPoint = new PointF(cx, cy) + }; + g.FillEllipse(brush, glowRect); + g.SmoothingMode = SmoothingMode.Default; + } + + // ─── 유틸 ──────────────────────────────────────────────────────────── + + private static GraphicsPath BuildRoundedPath(RectangleF rect, float radius) + { + float d = radius * 2f; + var path = new GraphicsPath(); + 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 void DrawRoundedFill(Graphics g, Brush brush, RectangleF rect, float radius) + { + using var path = BuildRoundedPath(rect, radius); + g.FillPath(brush, path); + } +} + +// ───────────────────────────────────────────────────────────────────────────── + +internal sealed class ModernColorTable : ProfessionalColorTable +{ + private static Color TC(string key, Color fb) + { + try + { + if (System.Windows.Application.Current?.Resources[key] + is System.Windows.Media.SolidColorBrush b) + return Color.FromArgb(b.Color.A, b.Color.R, b.Color.G, b.Color.B); + } + catch (Exception) { } + return fb; + } + + private static Color Bg => TC("LauncherBackground", Color.FromArgb(250, 250, 252)); + private static Color Hover => TC("ItemHoverBackground", Color.FromArgb(234, 234, 247)); + private static Color Border => TC("BorderColor", Color.FromArgb(210, 210, 232)); + private static Color Sep => TC("SeparatorColor", Color.FromArgb(228, 228, 242)); + + public override Color MenuBorder => Border; + public override Color ToolStripDropDownBackground => Bg; + public override Color ImageMarginGradientBegin => Bg; + public override Color ImageMarginGradientMiddle => Bg; + public override Color ImageMarginGradientEnd => Bg; + public override Color MenuItemSelected => Hover; + public override Color MenuItemSelectedGradientBegin => Hover; + public override Color MenuItemSelectedGradientEnd => Hover; + public override Color MenuItemBorder => Color.Transparent; + public override Color MenuItemPressedGradientBegin => Hover; + public override Color MenuItemPressedGradientEnd => Hover; + public override Color SeparatorLight => Sep; + public override Color SeparatorDark => Sep; + public override Color CheckBackground => Color.Transparent; + public override Color CheckSelectedBackground => Color.Transparent; + public override Color CheckPressedBackground => Color.Transparent; +} + diff --git a/src/AxCopilot/Views/TrayMenuWindow.xaml b/src/AxCopilot/Views/TrayMenuWindow.xaml new file mode 100644 index 0000000..5cd1129 --- /dev/null +++ b/src/AxCopilot/Views/TrayMenuWindow.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/src/AxCopilot/Views/TrayMenuWindow.xaml.cs b/src/AxCopilot/Views/TrayMenuWindow.xaml.cs new file mode 100644 index 0000000..238774d --- /dev/null +++ b/src/AxCopilot/Views/TrayMenuWindow.xaml.cs @@ -0,0 +1,271 @@ +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; + +namespace AxCopilot.Views; + +/// +/// WPF 기반 커스텀 트레이 컨텍스트 메뉴. +/// WinForms ContextMenuStrip의 DPI 불일치 문제를 근본 해결합니다. +/// +public partial class TrayMenuWindow : Window +{ + private System.Windows.Threading.DispatcherTimer? _autoCloseTimer; + + public TrayMenuWindow() + { + InitializeComponent(); + + // 마우스가 메뉴 밖으로 나가면 일정 시간 후 자동 닫힘 + MouseLeave += (_, _) => + { + _autoCloseTimer?.Stop(); + _autoCloseTimer = new System.Windows.Threading.DispatcherTimer + { + Interval = TimeSpan.FromMilliseconds(400) + }; + _autoCloseTimer.Tick += (_, _) => { _autoCloseTimer.Stop(); Hide(); }; + _autoCloseTimer.Start(); + }; + + // 마우스가 다시 메뉴 위로 오면 타이머 취소 + MouseEnter += (_, _) => + { + _autoCloseTimer?.Stop(); + }; + } + + // ─── 아이템 빌더 API ───────────────────────────────────────────────── + + /// 일반 메뉴 항목을 추가합니다. + public TrayMenuWindow AddItem(string glyph, string text, Action onClick) + { + var item = CreateItemBorder(glyph, text); + item.MouseLeftButtonUp += (_, _) => { Hide(); onClick(); }; + MenuPanel.Children.Add(item); + return this; + } + + /// 일반 메뉴 항목을 추가하고 Border 참조를 반환합니다 (동적 가시성 제어용). + public TrayMenuWindow AddItem(string glyph, string text, Action onClick, out Border itemRef) + { + var item = CreateItemBorder(glyph, text); + item.MouseLeftButtonUp += (_, _) => { Hide(); onClick(); }; + MenuPanel.Children.Add(item); + itemRef = item; + return this; + } + + // 전구 아이콘 활성 색상 — 앰버(노란) 글로우 + private static readonly Brush BulbOnBrush = new SolidColorBrush(Color.FromRgb(255, 185, 0)); + private static readonly Brush BulbOffBrush = new SolidColorBrush(Color.FromRgb(120, 120, 140)); + + /// 토글(체크) 메뉴 항목을 추가합니다. + public TrayMenuWindow AddToggleItem(string glyph, string text, bool initialChecked, + Action onToggle, out Func getChecked, out Action setText) + { + bool isChecked = initialChecked; + var glyphBlock = new TextBlock + { + Text = glyph, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, + Foreground = isChecked ? BulbOnBrush : BulbOffBrush, + VerticalAlignment = VerticalAlignment.Center, + Width = 20, + TextAlignment = TextAlignment.Center, + }; + + // 켜진 상태에서 글로우 이펙트 적용 + if (isChecked) + glyphBlock.Effect = new System.Windows.Media.Effects.DropShadowEffect + { + Color = Color.FromRgb(255, 185, 0), BlurRadius = 12, ShadowDepth = 0, Opacity = 0.7 + }; + + var label = new TextBlock + { + Text = text, + FontSize = 13, + VerticalAlignment = VerticalAlignment.Center, + }; + label.SetResourceReference(TextBlock.ForegroundProperty, "PrimaryText"); + + var panel = new StackPanel + { + Orientation = Orientation.Horizontal, + Children = { glyphBlock, label }, + }; + + var border = new Border + { + Child = panel, + CornerRadius = new CornerRadius(6), + Padding = new Thickness(12, 8, 16, 8), + Cursor = Cursors.Hand, + Background = Brushes.Transparent, + }; + + border.MouseEnter += (_, _) => + border.Background = TryFindResource("ItemHoverBackground") as Brush ?? Brushes.Transparent; + border.MouseLeave += (_, _) => + border.Background = Brushes.Transparent; + + border.MouseLeftButtonUp += (_, _) => + { + isChecked = !isChecked; + glyphBlock.Foreground = isChecked ? BulbOnBrush : BulbOffBrush; + glyphBlock.Effect = isChecked + ? new System.Windows.Media.Effects.DropShadowEffect + { Color = Color.FromRgb(255, 185, 0), BlurRadius = 12, ShadowDepth = 0, Opacity = 0.7 } + : null; + onToggle(isChecked); + }; + + getChecked = () => isChecked; + setText = t => label.Text = t; + MenuPanel.Children.Add(border); + return this; + } + + /// 구분선을 추가합니다. + public TrayMenuWindow AddSeparator() + { + var sep = new Border + { + Height = 1, + Margin = new Thickness(16, 5, 16, 5), + }; + sep.SetResourceReference(Border.BackgroundProperty, "SeparatorColor"); + MenuPanel.Children.Add(sep); + return this; + } + + // ─── 팝업 표시 ──────────────────────────────────────────────────────── + + /// 트레이 아이콘 근처에 메뉴를 표시합니다. + public void ShowAtTray() + { + var workArea = SystemParameters.WorkArea; + + // 먼저 표시하여 ActualWidth/ActualHeight 확정 + Opacity = 0; + Show(); + UpdateLayout(); + + double menuW = ActualWidth; + double menuH = ActualHeight; + + // 마우스 커서 위치 (물리 픽셀 → WPF 논리 좌표) + var cursorPos = GetCursorPosition(); + double dpiScale = VisualTreeHelper.GetDpi(this).PixelsPerDip; + double cx = cursorPos.X / dpiScale; + double cy = cursorPos.Y / dpiScale; + + // 메뉴 우하단이 커서에서 살짝 떨어지도록 배치 + double left = cx - menuW - 8; + double top = cy - menuH - 8; + + // 화면 밖 보정 + if (left < workArea.Left) left = workArea.Left + 4; + if (top < workArea.Top) top = workArea.Top + 4; + if (left + menuW > workArea.Right) left = workArea.Right - menuW - 4; + if (top + menuH > workArea.Bottom) top = workArea.Bottom - menuH - 4; + + Left = left; + Top = top; + + // 활성화하여 Deactivated 이벤트가 정상 작동하도록 보장 + Activate(); + + // 페이드 인 애니메이션 + var fadeIn = new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(120)) + { + EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut } + }; + BeginAnimation(OpacityProperty, fadeIn); + } + + /// 메뉴를 표시하기 직전에 동적 항목을 갱신할 수 있는 이벤트. + public event Action? Opening; + + /// Opening 이벤트를 트리거하고 메뉴를 표시합니다. + public void ShowWithUpdate() + { + Opening?.Invoke(); + ShowAtTray(); + } + + // ─── 내부 헬퍼 ──────────────────────────────────────────────────────── + + private Border CreateItemBorder(string glyph, string text) + { + var glyphBlock = new TextBlock + { + Text = glyph, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 14, + VerticalAlignment = VerticalAlignment.Center, + Width = 20, + TextAlignment = TextAlignment.Center, + }; + glyphBlock.SetResourceReference(TextBlock.ForegroundProperty, "SecondaryText"); + + var label = new TextBlock + { + Text = text, + FontSize = 13, + VerticalAlignment = VerticalAlignment.Center, + }; + label.SetResourceReference(TextBlock.ForegroundProperty, "PrimaryText"); + + var panel = new StackPanel + { + Orientation = Orientation.Horizontal, + Children = { glyphBlock, label }, + }; + + var border = new Border + { + Child = panel, + CornerRadius = new CornerRadius(6), + Padding = new Thickness(12, 8, 16, 8), + Cursor = Cursors.Hand, + Background = Brushes.Transparent, + }; + + border.MouseEnter += (_, _) => + { + border.Background = TryFindResource("ItemHoverBackground") as Brush ?? Brushes.Transparent; + glyphBlock.Foreground = TryFindResource("AccentColor") as Brush ?? Brushes.Blue; + }; + border.MouseLeave += (_, _) => + { + border.Background = Brushes.Transparent; + glyphBlock.SetResourceReference(TextBlock.ForegroundProperty, "SecondaryText"); + }; + + return border; + } + + private void Window_Deactivated(object sender, EventArgs e) + { + Hide(); + } + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool GetCursorPos(out POINT lpPoint); + + [StructLayout(LayoutKind.Sequential)] + private struct POINT { public int X; public int Y; } + + private static POINT GetCursorPosition() + { + GetCursorPos(out var pt); + return pt; + } +} diff --git a/src/AxCopilot/Views/UserAskDialog.cs b/src/AxCopilot/Views/UserAskDialog.cs new file mode 100644 index 0000000..dd34505 --- /dev/null +++ b/src/AxCopilot/Views/UserAskDialog.cs @@ -0,0 +1,345 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; + +namespace AxCopilot.Views; + +/// +/// 에이전트가 사용자에게 질문할 때 표시하는 커스텀 대화 상자. +/// 선택지 버튼 + 직접 입력 텍스트 박스를 제공합니다. +/// +internal sealed class UserAskDialog : Window +{ + private string _selectedResponse = ""; + private readonly TextBox _customInput; + private readonly StackPanel _optionPanel; + + public string SelectedResponse => _selectedResponse; + + private UserAskDialog(string question, List options, string defaultValue) + { + Width = 460; + MinWidth = 380; + MaxWidth = 560; + SizeToContent = SizeToContent.Height; + WindowStartupLocation = WindowStartupLocation.CenterScreen; + ResizeMode = ResizeMode.NoResize; + WindowStyle = WindowStyle.None; + AllowsTransparency = true; + Background = Brushes.Transparent; + Topmost = true; + + var bgBrush = Application.Current.TryFindResource("LauncherBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x1A, 0x1B, 0x2E)); + var primaryText = Application.Current.TryFindResource("PrimaryText") as Brush ?? Brushes.White; + var secondaryText = Application.Current.TryFindResource("SecondaryText") as Brush ?? Brushes.Gray; + var accentBrush = Application.Current.TryFindResource("AccentColor") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x4B, 0x5E, 0xFC)); + var borderBrush = Application.Current.TryFindResource("BorderColor") as Brush ?? Brushes.Gray; + var itemBg = Application.Current.TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromRgb(0x2A, 0x2B, 0x40)); + var hoverBg = Application.Current.TryFindResource("ItemHoverBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + + // 루트 + var root = new Border + { + Background = bgBrush, + CornerRadius = new CornerRadius(16), + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Padding = new Thickness(24, 20, 24, 18), + Effect = new DropShadowEffect + { + BlurRadius = 24, ShadowDepth = 4, Opacity = 0.3, Color = Colors.Black, + }, + }; + + var stack = new StackPanel(); + + // 타이틀 바 (드래그 가능) + var titleBar = new Grid { Margin = new Thickness(0, 0, 0, 12) }; + titleBar.MouseLeftButtonDown += (_, _) => { try { DragMove(); } catch (Exception) { } }; + var titleSp = new StackPanel { Orientation = Orientation.Horizontal }; + titleSp.Children.Add(new TextBlock + { + Text = "\uE9CE", + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 16, + Foreground = accentBrush, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 8, 0), + }); + titleSp.Children.Add(new TextBlock + { + Text = "AX Agent — 질문", + FontSize = 14, + FontWeight = FontWeights.SemiBold, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + }); + titleBar.Children.Add(titleSp); + stack.Children.Add(titleBar); + + // 구분선 + stack.Children.Add(new Border + { + Height = 1, + Background = borderBrush, + Opacity = 0.3, + Margin = new Thickness(0, 0, 0, 14), + }); + + // 질문 텍스트 + stack.Children.Add(new TextBlock + { + Text = question, + FontSize = 13.5, + Foreground = primaryText, + TextWrapping = TextWrapping.Wrap, + Margin = new Thickness(0, 0, 0, 16), + LineHeight = 20, + }); + + // 선택지 버튼들 + _optionPanel = new StackPanel { Margin = new Thickness(0, 0, 0, 12) }; + Border? selectedBorder = null; + + foreach (var option in options) + { + var capturedOption = option; + var optBorder = new Border + { + Background = itemBg, + CornerRadius = new CornerRadius(10), + Padding = new Thickness(14, 10, 14, 10), + Margin = new Thickness(0, 0, 0, 6), + Cursor = Cursors.Hand, + BorderBrush = Brushes.Transparent, + BorderThickness = new Thickness(1.5), + }; + + var optSp = new StackPanel { Orientation = Orientation.Horizontal }; + var radioCircle = new Border + { + Width = 18, Height = 18, + CornerRadius = new CornerRadius(9), + BorderBrush = secondaryText, + BorderThickness = new Thickness(1.5), + Margin = new Thickness(0, 0, 10, 0), + VerticalAlignment = VerticalAlignment.Center, + Child = new Border + { + Width = 10, Height = 10, + CornerRadius = new CornerRadius(5), + Background = Brushes.Transparent, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }, + }; + optSp.Children.Add(radioCircle); + optSp.Children.Add(new TextBlock + { + Text = capturedOption, + FontSize = 13, + Foreground = primaryText, + VerticalAlignment = VerticalAlignment.Center, + TextWrapping = TextWrapping.Wrap, + }); + optBorder.Child = optSp; + + optBorder.MouseEnter += (s, _) => + { + var b = (Border)s; + if (b.BorderBrush != accentBrush) + b.Background = hoverBg; + }; + optBorder.MouseLeave += (s, _) => + { + var b = (Border)s; + if (b.BorderBrush != accentBrush) + b.Background = itemBg; + }; + optBorder.MouseLeftButtonUp += (s, _) => + { + // 이전 선택 해제 + if (selectedBorder != null) + { + selectedBorder.BorderBrush = Brushes.Transparent; + selectedBorder.Background = itemBg; + var prevCircle = FindRadioCircle(selectedBorder); + if (prevCircle != null) prevCircle.Background = Brushes.Transparent; + } + + // 현재 선택 + var cur = (Border)s; + cur.BorderBrush = accentBrush; + cur.Background = new SolidColorBrush(Color.FromArgb(0x15, + ((SolidColorBrush)accentBrush).Color.R, + ((SolidColorBrush)accentBrush).Color.G, + ((SolidColorBrush)accentBrush).Color.B)); + var circle = FindRadioCircle(cur); + if (circle != null) circle.Background = accentBrush; + selectedBorder = cur; + + _selectedResponse = capturedOption; + if (_customInput != null) _customInput.Text = ""; // 선택지 고르면 직접 입력 초기화 + }; + + _optionPanel.Children.Add(optBorder); + } + stack.Children.Add(_optionPanel); + + // 직접 입력 영역 + stack.Children.Add(new TextBlock + { + Text = "또는 직접 입력:", + FontSize = 11.5, + Foreground = secondaryText, + Margin = new Thickness(2, 0, 0, 6), + }); + + _customInput = new TextBox + { + MinHeight = 40, + MaxHeight = 100, + AcceptsReturn = true, + TextWrapping = TextWrapping.Wrap, + FontSize = 13, + Background = itemBg, + Foreground = primaryText, + CaretBrush = primaryText, + BorderBrush = borderBrush, + BorderThickness = new Thickness(1), + Padding = new Thickness(10, 8, 10, 8), + Text = defaultValue, + }; + _customInput.TextChanged += (_, _) => + { + if (!string.IsNullOrEmpty(_customInput.Text)) + { + // 직접 입력 시 선택 해제 + if (selectedBorder != null) + { + selectedBorder.BorderBrush = Brushes.Transparent; + selectedBorder.Background = itemBg; + var prevCircle = FindRadioCircle(selectedBorder); + if (prevCircle != null) prevCircle.Background = Brushes.Transparent; + selectedBorder = null; + } + _selectedResponse = _customInput.Text; + } + }; + stack.Children.Add(_customInput); + + // 하단 버튼 + var btnPanel = new StackPanel + { + Orientation = Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Right, + Margin = new Thickness(0, 16, 0, 0), + }; + + // 확인 버튼 + var confirmBtn = new Border + { + Background = accentBrush, + CornerRadius = new CornerRadius(10), + Padding = new Thickness(20, 9, 20, 9), + Cursor = Cursors.Hand, + Margin = new Thickness(8, 0, 0, 0), + }; + confirmBtn.Child = new TextBlock + { + Text = "확인", + FontSize = 13, + FontWeight = FontWeights.SemiBold, + Foreground = Brushes.White, + }; + confirmBtn.MouseEnter += (s, _) => ((Border)s).Opacity = 0.85; + confirmBtn.MouseLeave += (s, _) => ((Border)s).Opacity = 1.0; + confirmBtn.MouseLeftButtonUp += (_, _) => + { + if (string.IsNullOrWhiteSpace(_selectedResponse) && !string.IsNullOrWhiteSpace(defaultValue)) + _selectedResponse = defaultValue; + DialogResult = true; + Close(); + }; + btnPanel.Children.Add(confirmBtn); + + // 취소 버튼 + var cancelBtn = new Border + { + Background = Brushes.Transparent, + CornerRadius = new CornerRadius(10), + Padding = new Thickness(16, 9, 16, 9), + Cursor = Cursors.Hand, + BorderBrush = new SolidColorBrush(Color.FromArgb(0x40, 0xDC, 0x26, 0x26)), + BorderThickness = new Thickness(1), + }; + cancelBtn.Child = new TextBlock + { + Text = "취소", + FontSize = 13, + Foreground = new SolidColorBrush(Color.FromRgb(0xDC, 0x26, 0x26)), + }; + cancelBtn.MouseEnter += (s, _) => ((Border)s).Opacity = 0.85; + cancelBtn.MouseLeave += (s, _) => ((Border)s).Opacity = 1.0; + cancelBtn.MouseLeftButtonUp += (_, _) => + { + _selectedResponse = ""; + DialogResult = false; + Close(); + }; + // 취소를 왼쪽에 배치 + btnPanel.Children.Insert(0, cancelBtn); + + stack.Children.Add(btnPanel); + + root.Child = stack; + Content = root; + + // 등장 애니메이션 + root.RenderTransformOrigin = new Point(0.5, 0.5); + root.RenderTransform = new ScaleTransform(0.95, 0.95); + root.Opacity = 0; + Loaded += (_, _) => + { + var fade = new DoubleAnimation(0, 1, TimeSpan.FromMilliseconds(150)); + root.BeginAnimation(OpacityProperty, fade); + var scaleX = new DoubleAnimation(0.95, 1, TimeSpan.FromMilliseconds(200)) + { EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseOut } }; + var scaleY = new DoubleAnimation(0.95, 1, TimeSpan.FromMilliseconds(200)) + { EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseOut } }; + ((ScaleTransform)root.RenderTransform).BeginAnimation(ScaleTransform.ScaleXProperty, scaleX); + ((ScaleTransform)root.RenderTransform).BeginAnimation(ScaleTransform.ScaleYProperty, scaleY); + }; + + // ESC → 취소 + KeyDown += (_, e) => + { + if (e.Key == Key.Escape) { _selectedResponse = ""; DialogResult = false; Close(); } + if (e.Key == Key.Enter && !_customInput.IsFocused) { DialogResult = true; Close(); } + }; + } + + private static Border? FindRadioCircle(Border optionBorder) + { + if (optionBorder.Child is StackPanel sp && sp.Children.Count > 0 && sp.Children[0] is Border outer + && outer.Child is Border inner) + return inner; + return null; + } + + /// 에이전트 질문 다이얼로그를 표시합니다. + /// 사용자 응답 문자열. 취소 시 null. + public static string? Show(string question, List options, string defaultValue = "") + { + var dlg = new UserAskDialog(question, options, defaultValue); + var result = dlg.ShowDialog(); + return result == true ? dlg.SelectedResponse : null; + } +} diff --git a/src/AxCopilot/Views/WorkflowAnalyzerWindow.xaml b/src/AxCopilot/Views/WorkflowAnalyzerWindow.xaml new file mode 100644 index 0000000..94efa8a --- /dev/null +++ b/src/AxCopilot/Views/WorkflowAnalyzerWindow.xaml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AxCopilot/Views/WorkflowAnalyzerWindow.xaml.cs b/src/AxCopilot/Views/WorkflowAnalyzerWindow.xaml.cs new file mode 100644 index 0000000..a8b0c0a --- /dev/null +++ b/src/AxCopilot/Views/WorkflowAnalyzerWindow.xaml.cs @@ -0,0 +1,929 @@ +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using System.Windows.Interop; +using System.Windows.Media; +using System.Windows.Shapes; +using AxCopilot.Services.Agent; + +namespace AxCopilot.Views; + +/// +/// 에이전트 워크플로우 분석기. +/// 에이전트 실행 과정을 세로 타임라인 형태로 실시간 시각화합니다. +/// 개발자 모드 → 워크플로우 시각화 설정이 켜져있을 때 자동으로 열립니다. +/// +public partial class WorkflowAnalyzerWindow : Window +{ + private static App? CurrentApp => System.Windows.Application.Current as App; + + private readonly DateTime _startTime = DateTime.Now; + private int _totalToolCalls; + private int _totalInputTokens; + private int _totalOutputTokens; + private int _maxIteration; + private int _successCount; + private int _failCount; + private string _logLevel = "simple"; + private bool _autoScroll = true; + private string _activeTab = "timeline"; // timeline | bottleneck + + // 병목 분석 데이터 수집 + private readonly List _waterfallEntries = new(); + private readonly Dictionary _toolTimeAccum = new(); + private readonly List<(int Iteration, int Input, int Output)> _tokenTrend = new(); + private long _lastEventMs; // 워터폴 시작 시간 기준 + + // ─── 상하좌우 리사이즈 (WindowStyle=None 대응) ───────────── + [DllImport("user32.dll")] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + + private const int WM_NCHITTEST = 0x0084; + private const int HTLEFT = 10, HTRIGHT = 11, HTTOP = 12, HTTOPLEFT = 13, HTTOPRIGHT = 14; + private const int HTBOTTOM = 15, HTBOTTOMLEFT = 16, HTBOTTOMRIGHT = 17; + + public WorkflowAnalyzerWindow() + { + InitializeComponent(); + SourceInitialized += (_, _) => + { + var hwndSource = (HwndSource)PresentationSource.FromVisual(this); + hwndSource?.AddHook(WndProc); + }; + + // 로그 레벨 표시 + _logLevel = CurrentApp?.SettingsService?.Settings.Llm.AgentLogLevel ?? "simple"; + LogLevelBadge.Text = _logLevel switch + { + "debug" => "DEBUG", + "detailed" => "DETAILED", + _ => "SIMPLE", + }; + + // 시작 위치: 화면 우측 하단 + Loaded += (_, _) => + { + var screen = SystemParameters.WorkArea; + Left = screen.Right - ActualWidth - 20; + Top = screen.Bottom - ActualHeight - 20; + UpdateTabVisuals(); + }; + + // 자동 스크롤 감지 + TimelineScroller.ScrollChanged += (_, e) => + { + _autoScroll = Math.Abs(e.ExtentHeight - e.ViewportHeight - e.VerticalOffset) < 30; + }; + } + + /// 에이전트 이벤트를 수신하여 타임라인에 추가합니다. + public void OnAgentEvent(AgentEvent evt) + { + if (!Dispatcher.CheckAccess()) + { + Dispatcher.Invoke(() => OnAgentEvent(evt)); + return; + } + + // 요약 카드 업데이트 + if (evt.Iteration > _maxIteration) _maxIteration = evt.Iteration; + if (evt.InputTokens > 0) _totalInputTokens += evt.InputTokens; + if (evt.OutputTokens > 0) _totalOutputTokens += evt.OutputTokens; + + if (evt.Type is AgentEventType.ToolCall) + _totalToolCalls++; + if (evt.Type is AgentEventType.ToolResult) + _successCount++; + if (evt.Type is AgentEventType.Error) + _failCount++; + + UpdateSummaryCards(); + + // ── 병목 분석 데이터 수집 ── + CollectBottleneckData(evt); + + // 타임라인 노드 추가 + var node = CreateTimelineNode(evt); + TimelinePanel.Children.Add(node); + + // 자동 스크롤 + if (_autoScroll) + TimelineScroller.ScrollToEnd(); + + // 상태 바 + StatusText.Text = evt.Type switch + { + AgentEventType.Complete => "✓ 완료", + AgentEventType.Error => $"⚠ 오류: {Truncate(evt.Summary, 60)}", + AgentEventType.ToolCall => $"실행 중: {evt.ToolName}", + AgentEventType.Thinking => "사고 중...", + AgentEventType.Planning => "계획 수립 중...", + _ => StatusText.Text, + }; + + // 완료 시 병목 분석 차트 자동 갱신 + if (evt.Type == AgentEventType.Complete) + RenderBottleneckCharts(); + } + + /// 타임라인을 초기화합니다. + public void Reset() + { + TimelinePanel.Children.Clear(); + DetailPanel.Visibility = Visibility.Collapsed; + _totalToolCalls = 0; + _totalInputTokens = 0; + _totalOutputTokens = 0; + _maxIteration = 0; + _successCount = 0; + _failCount = 0; + _waterfallEntries.Clear(); + _toolTimeAccum.Clear(); + _tokenTrend.Clear(); + _lastEventMs = 0; + UpdateSummaryCards(); + ClearBottleneckCharts(); + StatusText.Text = "대기 중..."; + } + + /// 타임라인 탭을 활성화합니다. + public void SwitchToTimelineTab() + { + _activeTab = "timeline"; + UpdateTabVisuals(); + } + + /// 병목 분석 탭을 활성화합니다. 외부(ChatWindow)에서 호출합니다. + public void SwitchToBottleneckTab() + { + _activeTab = "bottleneck"; + UpdateTabVisuals(); + RenderBottleneckCharts(); + } + + // ─── 탭 전환 ────────────────────────────────────────────────── + + private void TabTimeline_Click(object sender, MouseButtonEventArgs e) + { + _activeTab = "timeline"; + UpdateTabVisuals(); + } + + private void TabBottleneck_Click(object sender, MouseButtonEventArgs e) + { + _activeTab = "bottleneck"; + UpdateTabVisuals(); + RenderBottleneckCharts(); + } + + private void UpdateTabVisuals() + { + var accentBrush = TryFindResource("AccentColor") as Brush ?? Brushes.CornflowerBlue; + var itemBg = TryFindResource("ItemBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x15, 0xFF, 0xFF, 0xFF)); + var primaryText = TryFindResource("PrimaryText") as Brush ?? Brushes.White; + + var isTimeline = _activeTab == "timeline"; + TabTimeline.Background = isTimeline ? accentBrush : itemBg; + TabBottleneck.Background = !isTimeline ? accentBrush : itemBg; + + // 활성 탭: 흰색 텍스트 (AccentColor 배경 위 가시성), 비활성: PrimaryText + TabTimelineIcon.Foreground = isTimeline ? Brushes.White : primaryText; + TabTimelineText.Foreground = isTimeline ? Brushes.White : primaryText; + TabBottleneckIcon.Foreground = !isTimeline ? Brushes.White : primaryText; + TabBottleneckText.Foreground = !isTimeline ? Brushes.White : primaryText; + + TimelineScroller.Visibility = isTimeline ? Visibility.Visible : Visibility.Collapsed; + BottleneckScroller.Visibility = !isTimeline ? Visibility.Visible : Visibility.Collapsed; + DetailPanel.Visibility = isTimeline && DetailPanel.Tag != null + ? Visibility.Visible : Visibility.Collapsed; + } + + // ─── 병목 분석 데이터 수집 ────────────────────────────────────── + + private record WaterfallEntry(string Label, long StartMs, long DurationMs, string Type, bool IsBottleneck = false); + + private void CollectBottleneckData(AgentEvent evt) + { + var currentMs = (long)(evt.Timestamp - _startTime).TotalMilliseconds; + + // 워터폴: LLM Thinking과 ToolResult (소요시간이 있는 이벤트) + if (evt.Type == AgentEventType.Thinking && evt.Iteration > 0) + { + // LLM 호출 시작 기록 (종료 시점은 다음 ToolCall/Complete 이벤트에서 계산) + _lastEventMs = currentMs; + } + else if (evt.Type == AgentEventType.ToolCall) + { + // 이전 LLM 사고 시간 = 현재 - 마지막 이벤트 + if (_lastEventMs > 0) + { + var llmDuration = currentMs - _lastEventMs; + if (llmDuration > 100) // 100ms 미만은 노이즈 + { + _waterfallEntries.Add(new WaterfallEntry( + $"LLM #{evt.Iteration}", _lastEventMs, llmDuration, "llm")); + } + } + _lastEventMs = currentMs; + } + else if (evt.Type == AgentEventType.ToolResult && evt.ElapsedMs > 0) + { + // 도구 실행 시간 + var toolStart = currentMs - evt.ElapsedMs; + _waterfallEntries.Add(new WaterfallEntry( + evt.ToolName, toolStart, evt.ElapsedMs, "tool")); + + // 도구별 누적 + var key = evt.ToolName; + _toolTimeAccum[key] = _toolTimeAccum.GetValueOrDefault(key) + evt.ElapsedMs; + + _lastEventMs = currentMs; + } + else if (evt.Type == AgentEventType.Complete && _lastEventMs > 0) + { + // 마지막 LLM 사고 시간 + var llmDuration = currentMs - _lastEventMs; + if (llmDuration > 100) + { + _waterfallEntries.Add(new WaterfallEntry( + $"LLM (마무리)", _lastEventMs, llmDuration, "llm")); + } + } + + // 토큰 추세 + if ((evt.InputTokens > 0 || evt.OutputTokens > 0) && evt.Iteration > 0) + { + // 같은 반복의 기존 항목이 있으면 업데이트 + var idx = _tokenTrend.FindIndex(t => t.Iteration == evt.Iteration); + if (idx >= 0) + { + var old = _tokenTrend[idx]; + _tokenTrend[idx] = (evt.Iteration, + old.Input + evt.InputTokens, + old.Output + evt.OutputTokens); + } + else + { + _tokenTrend.Add((evt.Iteration, evt.InputTokens, evt.OutputTokens)); + } + } + } + + // ─── 병목 분석 차트 렌더링 ───────────────────────────────────── + + private void ClearBottleneckCharts() + { + WaterfallCanvas.Children.Clear(); + ToolTimePanel.Children.Clear(); + TokenTrendCanvas.Children.Clear(); + } + + private void RenderBottleneckCharts() + { + ClearBottleneckCharts(); + RenderWaterfallChart(); + RenderToolTimeChart(); + RenderTokenTrendChart(); + } + + /// 워터폴 차트: LLM 호출과 도구 실행을 시간 순서로 표시. 병목 구간은 빨간색. + private void RenderWaterfallChart() + { + if (_waterfallEntries.Count == 0) + { + WaterfallCanvas.Height = 40; + var emptyMsg = new TextBlock + { + Text = "실행 데이터가 없습니다", + FontSize = 11, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + }; + Canvas.SetLeft(emptyMsg, 10); + Canvas.SetTop(emptyMsg, 10); + WaterfallCanvas.Children.Add(emptyMsg); + return; + } + + // 병목 판정: 평균 × 2.0 이상 = 빨강, × 1.5 이상 = 주황 + var avgDuration = _waterfallEntries.Average(e => e.DurationMs); + var maxEndMs = _waterfallEntries.Max(e => e.StartMs + e.DurationMs); + if (maxEndMs <= 0) maxEndMs = 1; + + var rowHeight = 22; + var labelWidth = 90.0; + var chartHeight = _waterfallEntries.Count * rowHeight + 10; + WaterfallCanvas.Height = Math.Max(chartHeight, 60); + + var canvasWidth = WaterfallCanvas.ActualWidth > 0 ? WaterfallCanvas.ActualWidth : 480; + var barAreaWidth = canvasWidth - labelWidth - 60; // 우측에 시간 텍스트 공간 + + for (int i = 0; i < _waterfallEntries.Count; i++) + { + var entry = _waterfallEntries[i]; + var y = i * rowHeight + 4; + + // 색상 결정 + Color barColor; + if (entry.DurationMs >= avgDuration * 2.0) + barColor = Color.FromRgb(0xEF, 0x44, 0x44); // 빨강 (병목) + else if (entry.DurationMs >= avgDuration * 1.5) + barColor = Color.FromRgb(0xF9, 0x73, 0x16); // 주황 (주의) + else if (entry.Type == "llm") + barColor = Color.FromRgb(0x60, 0xA5, 0xFA); // 파랑 (LLM) + else + barColor = Color.FromRgb(0x34, 0xD3, 0x99); // 녹색 (도구) + + // 라벨 + var label = new TextBlock + { + Text = Truncate(entry.Label, 12), + FontSize = 10, + FontFamily = new FontFamily("Consolas"), + Foreground = new SolidColorBrush(barColor), + Width = labelWidth, + TextAlignment = TextAlignment.Right, + }; + Canvas.SetLeft(label, 0); + Canvas.SetTop(label, y + 2); + WaterfallCanvas.Children.Add(label); + + // 바 + var barStart = (entry.StartMs / (double)maxEndMs) * barAreaWidth; + var barWidth = Math.Max((entry.DurationMs / (double)maxEndMs) * barAreaWidth, 3); + + var bar = new Rectangle + { + Width = barWidth, + Height = 14, + RadiusX = 3, RadiusY = 3, + Fill = new SolidColorBrush(barColor), + Opacity = 0.85, + ToolTip = $"{entry.Label}: {FormatMs(entry.DurationMs)}", + }; + Canvas.SetLeft(bar, labelWidth + 8 + barStart); + Canvas.SetTop(bar, y + 1); + WaterfallCanvas.Children.Add(bar); + + // 시간 텍스트 + var timeText = new TextBlock + { + Text = FormatMs(entry.DurationMs), + FontSize = 9, + Foreground = new SolidColorBrush(barColor), + FontFamily = new FontFamily("Consolas"), + }; + Canvas.SetLeft(timeText, labelWidth + 8 + barStart + barWidth + 4); + Canvas.SetTop(timeText, y + 3); + WaterfallCanvas.Children.Add(timeText); + + // 병목 아이콘 + if (entry.DurationMs >= avgDuration * 2.0) + { + var icon = new TextBlock + { + Text = "🔴", + FontSize = 9, + }; + Canvas.SetLeft(icon, labelWidth + 8 + barStart + barWidth + 44); + Canvas.SetTop(icon, y + 2); + WaterfallCanvas.Children.Add(icon); + } + } + } + + /// 도구별 누적 소요시간 수평 바 차트. + private void RenderToolTimeChart() + { + ToolTimePanel.Children.Clear(); + + if (_toolTimeAccum.Count == 0) + { + ToolTimePanel.Children.Add(new TextBlock + { + Text = "도구 실행 데이터가 없습니다", + FontSize = 11, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + Margin = new Thickness(0, 4, 0, 4), + }); + return; + } + + // LLM 시간 합산 + var llmTime = _waterfallEntries + .Where(e => e.Type == "llm") + .Sum(e => e.DurationMs); + var allEntries = _toolTimeAccum + .Select(kv => (Name: kv.Key, Ms: kv.Value)) + .ToList(); + if (llmTime > 0) + allEntries.Add(("LLM 호출", llmTime)); + + var sorted = allEntries.OrderByDescending(e => e.Ms).ToList(); + var maxMs = sorted.Max(e => e.Ms); + if (maxMs <= 0) maxMs = 1; + + foreach (var (name, ms) in sorted) + { + var isBottleneck = ms == sorted[0].Ms; + var barColor = name == "LLM 호출" + ? Color.FromRgb(0x60, 0xA5, 0xFA) + : isBottleneck + ? Color.FromRgb(0xEF, 0x44, 0x44) + : Color.FromRgb(0x34, 0xD3, 0x99); + + var row = new Grid { Margin = new Thickness(0, 2, 0, 2) }; + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(90) }); + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + row.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(60) }); + + // 도구명 + var nameText = new TextBlock + { + Text = Truncate(name, 12), + FontSize = 11, + FontFamily = new FontFamily("Consolas"), + Foreground = new SolidColorBrush(barColor), + TextAlignment = TextAlignment.Right, + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 8, 0), + }; + Grid.SetColumn(nameText, 0); + + // 바 + var barWidth = (ms / (double)maxMs); + var barBorder = new Border + { + Background = new SolidColorBrush(barColor), + CornerRadius = new CornerRadius(3), + Height = 14, + HorizontalAlignment = HorizontalAlignment.Left, + Width = 0, // 나중에 SizeChanged에서 설정 + Opacity = 0.8, + }; + var barContainer = new Border { Margin = new Thickness(0, 2, 0, 2) }; + barContainer.Child = barBorder; + barContainer.SizeChanged += (_, _) => + { + barBorder.Width = Math.Max(barContainer.ActualWidth * barWidth, 4); + }; + Grid.SetColumn(barContainer, 1); + + // 시간 + var timeText = new TextBlock + { + Text = FormatMs(ms), + FontSize = 10, + Foreground = new SolidColorBrush(barColor), + FontFamily = new FontFamily("Consolas"), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(4, 0, 0, 0), + }; + Grid.SetColumn(timeText, 2); + + row.Children.Add(nameText); + row.Children.Add(barContainer); + row.Children.Add(timeText); + ToolTimePanel.Children.Add(row); + } + } + + /// 반복별 토큰 추세 꺾은선 그래프. + private void RenderTokenTrendChart() + { + TokenTrendCanvas.Children.Clear(); + + if (_tokenTrend.Count < 2) + { + TokenTrendCanvas.Height = 40; + TokenTrendCanvas.Children.Add(new TextBlock + { + Text = _tokenTrend.Count == 0 ? "토큰 데이터가 없습니다" : "2회 이상 반복이 필요합니다", + FontSize = 11, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + }); + Canvas.SetLeft(TokenTrendCanvas.Children[0], 10); + Canvas.SetTop(TokenTrendCanvas.Children[0], 10); + return; + } + + TokenTrendCanvas.Height = 100; + var canvasWidth = TokenTrendCanvas.ActualWidth > 0 ? TokenTrendCanvas.ActualWidth : 480; + var canvasHeight = 90.0; + var marginLeft = 45.0; + var marginRight = 10.0; + var chartWidth = canvasWidth - marginLeft - marginRight; + var sorted = _tokenTrend.OrderBy(t => t.Iteration).ToList(); + var maxToken = sorted.Max(t => Math.Max(t.Input, t.Output)); + if (maxToken <= 0) maxToken = 1; + + // Y축 눈금 + for (int i = 0; i <= 2; i++) + { + var y = canvasHeight * (1 - i / 2.0); + var val = maxToken * i / 2; + var gridLine = new Line + { + X1 = marginLeft, Y1 = y, + X2 = canvasWidth - marginRight, Y2 = y, + Stroke = TryFindResource("BorderColor") as Brush ?? Brushes.Gray, + StrokeThickness = 0.5, + Opacity = 0.4, + }; + TokenTrendCanvas.Children.Add(gridLine); + + var yLabel = new TextBlock + { + Text = val >= 1000 ? $"{val / 1000.0:F0}k" : val.ToString(), + FontSize = 9, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + TextAlignment = TextAlignment.Right, + Width = marginLeft - 6, + }; + Canvas.SetLeft(yLabel, 0); + Canvas.SetTop(yLabel, y - 6); + TokenTrendCanvas.Children.Add(yLabel); + } + + // 입력 토큰 선 (파랑) + DrawPolyline(sorted.Select((t, i) => new Point( + marginLeft + (i / (double)(sorted.Count - 1)) * chartWidth, + canvasHeight * (1 - t.Input / (double)maxToken) + )).ToList(), "#3B82F6"); + + // 출력 토큰 선 (녹색) + DrawPolyline(sorted.Select((t, i) => new Point( + marginLeft + (i / (double)(sorted.Count - 1)) * chartWidth, + canvasHeight * (1 - t.Output / (double)maxToken) + )).ToList(), "#10B981"); + + // X축 라벨 + foreach (var (iter, _, _) in sorted) + { + var idx = sorted.FindIndex(t => t.Iteration == iter); + var x = marginLeft + (idx / (double)(sorted.Count - 1)) * chartWidth; + var xLabel = new TextBlock + { + Text = $"#{iter}", + FontSize = 9, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + }; + Canvas.SetLeft(xLabel, x - 8); + Canvas.SetTop(xLabel, canvasHeight + 2); + TokenTrendCanvas.Children.Add(xLabel); + } + + // 범례 + var legend = new StackPanel { Orientation = Orientation.Horizontal }; + legend.Children.Add(CreateLegendDot("#3B82F6", "입력")); + legend.Children.Add(CreateLegendDot("#10B981", "출력")); + Canvas.SetRight(legend, 10); + Canvas.SetTop(legend, 0); + TokenTrendCanvas.Children.Add(legend); + + // 컨텍스트 폭발 경고 + if (sorted.Count >= 3) + { + var inputValues = sorted.Select(t => t.Input).ToList(); + bool increasing = true; + for (int i = 1; i < inputValues.Count; i++) + { + if (inputValues[i] <= inputValues[i - 1]) { increasing = false; break; } + } + if (increasing && inputValues[^1] > inputValues[0] * 2) + { + var warning = new TextBlock + { + Text = "⚠ 컨텍스트 크기 급증", + FontSize = 10, + Foreground = new SolidColorBrush(Color.FromRgb(0xEF, 0x44, 0x44)), + FontWeight = FontWeights.SemiBold, + }; + Canvas.SetLeft(warning, marginLeft + 4); + Canvas.SetTop(warning, 0); + TokenTrendCanvas.Children.Add(warning); + } + } + } + + private void DrawPolyline(List points, string colorHex) + { + if (points.Count < 2) return; + var color = (Color)ColorConverter.ConvertFromString(colorHex); + + var polyline = new Polyline + { + Stroke = new SolidColorBrush(color), + StrokeThickness = 2, + StrokeLineJoin = PenLineJoin.Round, + }; + foreach (var p in points) + polyline.Points.Add(p); + TokenTrendCanvas.Children.Add(polyline); + + // 점 찍기 + foreach (var p in points) + { + var dot = new Ellipse + { + Width = 6, Height = 6, + Fill = new SolidColorBrush(color), + }; + Canvas.SetLeft(dot, p.X - 3); + Canvas.SetTop(dot, p.Y - 3); + TokenTrendCanvas.Children.Add(dot); + } + } + + private static StackPanel CreateLegendDot(string colorHex, string text) + { + var color = (Color)ColorConverter.ConvertFromString(colorHex); + var sp = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(8, 0, 0, 0) }; + sp.Children.Add(new Ellipse + { + Width = 6, Height = 6, + Fill = new SolidColorBrush(color), + VerticalAlignment = VerticalAlignment.Center, + Margin = new Thickness(0, 0, 3, 0), + }); + sp.Children.Add(new TextBlock + { + Text = text, + FontSize = 9, + Foreground = new SolidColorBrush(color), + VerticalAlignment = VerticalAlignment.Center, + }); + return sp; + } + + // ─── 타임라인 노드 생성 ──────────────────────────────────────── + + private Border CreateTimelineNode(AgentEvent evt) + { + var (icon, iconColor, label) = GetEventVisual(evt); + + var node = new Border + { + Background = Brushes.Transparent, + Margin = new Thickness(0, 1, 0, 1), + Padding = new Thickness(8, 6, 8, 6), + CornerRadius = new CornerRadius(8), + Cursor = Cursors.Hand, + Tag = evt, + }; + + var grid = new Grid(); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(28) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(3) }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); + + // 아이콘 원 + var iconBorder = new Border + { + Width = 22, Height = 22, + CornerRadius = new CornerRadius(11), + Background = new SolidColorBrush(iconColor), + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Top, + Margin = new Thickness(0, 2, 0, 0), + }; + iconBorder.Child = new TextBlock + { + Text = icon, + FontFamily = new FontFamily("Segoe MDL2 Assets"), + FontSize = 10, + Foreground = Brushes.White, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + Grid.SetColumn(iconBorder, 0); + grid.Children.Add(iconBorder); + + // 타임라인 세로 선 + var line = new Rectangle + { + Width = 2, + Fill = TryFindResource("BorderColor") as Brush ?? Brushes.Gray, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Stretch, + Opacity = 0.4, + }; + Grid.SetColumn(line, 1); + grid.Children.Add(line); + + // 내용 + var content = new StackPanel { Margin = new Thickness(8, 0, 0, 0) }; + + var headerPanel = new StackPanel { Orientation = Orientation.Horizontal }; + headerPanel.Children.Add(new TextBlock + { + Text = label, + FontSize = 12, + FontWeight = FontWeights.SemiBold, + Foreground = TryFindResource("PrimaryText") as Brush ?? Brushes.White, + VerticalAlignment = VerticalAlignment.Center, + }); + + if (evt.ElapsedMs > 0) + { + headerPanel.Children.Add(new TextBlock + { + Text = evt.ElapsedMs >= 1000 ? $" {evt.ElapsedMs / 1000.0:F1}s" : $" {evt.ElapsedMs}ms", + FontSize = 10, + Foreground = evt.ElapsedMs > 3000 + ? Brushes.OrangeRed + : TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + VerticalAlignment = VerticalAlignment.Center, + }); + } + + headerPanel.Children.Add(new TextBlock + { + Text = $" {evt.Timestamp:HH:mm:ss}", + FontSize = 9, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + VerticalAlignment = VerticalAlignment.Center, + Opacity = 0.6, + }); + content.Children.Add(headerPanel); + + if (!string.IsNullOrEmpty(evt.Summary)) + { + content.Children.Add(new TextBlock + { + Text = Truncate(evt.Summary, 120), + FontSize = 11, + Foreground = TryFindResource("SecondaryText") as Brush ?? Brushes.Gray, + TextWrapping = TextWrapping.Wrap, + Margin = new Thickness(0, 2, 0, 0), + LineHeight = 16, + }); + } + + if (evt.InputTokens > 0 || evt.OutputTokens > 0) + { + var tokenPanel = new StackPanel { Orientation = Orientation.Horizontal, Margin = new Thickness(0, 3, 0, 0) }; + tokenPanel.Children.Add(CreateBadge($"↑{evt.InputTokens:#,0}", "#3B82F6")); + tokenPanel.Children.Add(CreateBadge($"↓{evt.OutputTokens:#,0}", "#10B981")); + content.Children.Add(tokenPanel); + } + + Grid.SetColumn(content, 2); + grid.Children.Add(content); + node.Child = grid; + + var hoverBrush = TryFindResource("ItemHoverBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + node.MouseEnter += (_, _) => node.Background = hoverBrush; + node.MouseLeave += (_, _) => node.Background = Brushes.Transparent; + node.MouseLeftButtonUp += (_, _) => ShowDetail(evt); + + return node; + } + + private static (string Icon, Color Color, string Label) GetEventVisual(AgentEvent evt) + { + return evt.Type switch + { + AgentEventType.Thinking => ("\uE7BA", Color.FromRgb(0x60, 0xA5, 0xFA), "사고"), + AgentEventType.Planning => ("\uE9D5", Color.FromRgb(0xA7, 0x8B, 0xFA), "계획"), + AgentEventType.StepStart => ("\uE72A", Color.FromRgb(0x60, 0xA5, 0xFA), $"단계 {evt.StepCurrent}/{evt.StepTotal}"), + AgentEventType.StepDone => ("\uE73E", Color.FromRgb(0x34, 0xD3, 0x99), $"단계 완료"), + AgentEventType.ToolCall => ("\uE756", Color.FromRgb(0xFB, 0xBF, 0x24), evt.ToolName), + AgentEventType.ToolResult=> ("\uE73E", Color.FromRgb(0x34, 0xD3, 0x99), $"{evt.ToolName} ✓"), + AgentEventType.SkillCall => ("\uE768", Color.FromRgb(0xA7, 0x8B, 0xFA), $"스킬: {evt.ToolName}"), + AgentEventType.Error => ("\uE783", Color.FromRgb(0xF8, 0x71, 0x71), $"{evt.ToolName} ✗"), + AgentEventType.Complete => ("\uE930", Color.FromRgb(0x34, 0xD3, 0x99), "완료"), + AgentEventType.Decision => ("\uE8C8", Color.FromRgb(0xFB, 0xBF, 0x24), "의사결정"), + _ => ("\uE946", Color.FromRgb(0x6B, 0x72, 0x80), "이벤트"), + }; + } + + private static Border CreateBadge(string text, string colorHex) + { + var color = (Color)ColorConverter.ConvertFromString(colorHex); + return new Border + { + Background = new SolidColorBrush(Color.FromArgb(0x30, color.R, color.G, color.B)), + CornerRadius = new CornerRadius(4), + Padding = new Thickness(5, 1, 5, 1), + Margin = new Thickness(0, 0, 4, 0), + Child = new TextBlock + { + Text = text, + FontSize = 9, + Foreground = new SolidColorBrush(color), + FontWeight = FontWeights.SemiBold, + }, + }; + } + + // ─── 상세 패널 ───────────────────────────────────────────── + + private void ShowDetail(AgentEvent evt) + { + DetailPanel.Visibility = Visibility.Visible; + DetailPanel.Tag = evt; + var (_, color, label) = GetEventVisual(evt); + + DetailTitle.Text = label; + DetailBadge.Text = evt.Success ? "성공" : "실패"; + DetailBadge.Background = new SolidColorBrush(evt.Success + ? Color.FromRgb(0x34, 0xD3, 0x99) + : Color.FromRgb(0xF8, 0x71, 0x71)); + + var meta = $"시간: {evt.Timestamp:HH:mm:ss.fff}"; + if (evt.ElapsedMs > 0) + meta += $" | 소요: {(evt.ElapsedMs >= 1000 ? $"{evt.ElapsedMs / 1000.0:F1}s" : $"{evt.ElapsedMs}ms")}"; + if (evt.InputTokens > 0 || evt.OutputTokens > 0) + meta += $" | 토큰: 입력 {evt.InputTokens:#,0} / 출력 {evt.OutputTokens:#,0}"; + if (evt.Iteration > 0) + meta += $" | 반복 #{evt.Iteration}"; + DetailMeta.Text = meta; + + var contentText = evt.Summary ?? ""; + if (!string.IsNullOrEmpty(evt.ToolInput)) + contentText += $"\n\n파라미터:\n{Truncate(evt.ToolInput, 500)}"; + if (!string.IsNullOrEmpty(evt.FilePath)) + contentText += $"\n파일: {evt.FilePath}"; + DetailContent.Text = contentText; + } + + // ─── 요약 카드 업데이트 ────────────────────────────────────── + + private void UpdateSummaryCards() + { + var elapsed = (DateTime.Now - _startTime).TotalSeconds; + CardElapsed.Text = elapsed >= 60 ? $"{elapsed / 60:F0}m {elapsed % 60:F0}s" : $"{elapsed:F1}s"; + CardIterations.Text = _maxIteration.ToString(); + var totalTokens = _totalInputTokens + _totalOutputTokens; + CardTokens.Text = totalTokens >= 1000 ? $"{totalTokens / 1000.0:F1}k" : totalTokens.ToString(); + CardInputTokens.Text = _totalInputTokens >= 1000 ? $"{_totalInputTokens / 1000.0:F1}k" : _totalInputTokens.ToString(); + CardOutputTokens.Text = _totalOutputTokens >= 1000 ? $"{_totalOutputTokens / 1000.0:F1}k" : _totalOutputTokens.ToString(); + CardToolCalls.Text = _totalToolCalls.ToString(); + } + + // ─── 유틸리티 ──────────────────────────────────────────────── + + private static string FormatMs(long ms) + => ms >= 1000 ? $"{ms / 1000.0:F1}s" : $"{ms}ms"; + + // ─── 윈도우 이벤트 ──────────────────────────────────────────── + + private void TitleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + // 타이틀 바 버튼 영역 클릭 시 드래그 무시 (DragMove가 마우스를 캡처하여 MouseLeftButtonUp 차단 방지) + var src = e.OriginalSource as DependencyObject; + while (src != null && src != sender) + { + if (src is Border b && b.Name is "BtnClose" or "BtnMinimize" or "BtnClear") + return; + src = VisualTreeHelper.GetParent(src); + } + if (e.ClickCount == 1) DragMove(); + } + + private void BtnClose_Click(object sender, MouseButtonEventArgs e) => Hide(); + private void BtnMinimize_Click(object sender, MouseButtonEventArgs e) => WindowState = WindowState.Minimized; + private void BtnClear_Click(object sender, MouseButtonEventArgs e) => Reset(); + + private void TitleBtn_MouseEnter(object sender, MouseEventArgs e) + { + if (sender is Border b) + b.Background = TryFindResource("ItemHoverBackground") as Brush + ?? new SolidColorBrush(Color.FromArgb(0x18, 0xFF, 0xFF, 0xFF)); + } + + private void TitleBtn_MouseLeave(object sender, MouseEventArgs e) + { + if (sender is Border b) + b.Background = Brushes.Transparent; + } + + private static string Truncate(string text, int maxLen) + => text.Length <= maxLen ? text : text[..maxLen] + "…"; + + private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + if (msg == WM_NCHITTEST) + { + var pt = PointFromScreen(new Point( + (short)(lParam.ToInt32() & 0xFFFF), + (short)((lParam.ToInt32() >> 16) & 0xFFFF))); + const double grip = 8; + var w = ActualWidth; + var h = ActualHeight; + + if (pt.X < grip && pt.Y < grip) { handled = true; return (IntPtr)HTTOPLEFT; } + if (pt.X > w - grip && pt.Y < grip) { handled = true; return (IntPtr)HTTOPRIGHT; } + if (pt.X < grip && pt.Y > h - grip) { handled = true; return (IntPtr)HTBOTTOMLEFT; } + if (pt.X > w - grip && pt.Y > h - grip) { handled = true; return (IntPtr)HTBOTTOMRIGHT; } + if (pt.X < grip) { handled = true; return (IntPtr)HTLEFT; } + if (pt.X > w - grip) { handled = true; return (IntPtr)HTRIGHT; } + if (pt.Y < grip) { handled = true; return (IntPtr)HTTOP; } + if (pt.Y > h - grip) { handled = true; return (IntPtr)HTBOTTOM; } + } + return IntPtr.Zero; + } +} diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/duckduckgo.png b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/duckduckgo.png new file mode 100644 index 0000000..64ee943 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/duckduckgo.png differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/github.png b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/github.png new file mode 100644 index 0000000..52126e0 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/github.png differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/google.png b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/google.png new file mode 100644 index 0000000..8642fc1 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/google.png differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/namuwiki.png b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/namuwiki.png new file mode 100644 index 0000000..5423adf Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/namuwiki.png differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/naver.png b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/naver.png new file mode 100644 index 0000000..020e16d Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/naver.png differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/navermap.png b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/navermap.png new file mode 100644 index 0000000..9e0bfaf Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/navermap.png differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/wikipedia.png b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/wikipedia.png new file mode 100644 index 0000000..4405b8d Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/wikipedia.png differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/youtube.png b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/youtube.png new file mode 100644 index 0000000..c20e1d3 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/SearchEngines/youtube.png differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/guide_dev.enc b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/guide_dev.enc new file mode 100644 index 0000000..e798fe5 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/guide_dev.enc differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/guide_user.enc b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/guide_user.enc new file mode 100644 index 0000000..d1264f8 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/guide_user.enc differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/icon.ico b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/icon.ico new file mode 100644 index 0000000..273db74 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Assets/icon.ico differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.SDK.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.SDK.dll new file mode 100644 index 0000000..511c5bc Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.SDK.pdb b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.SDK.pdb new file mode 100644 index 0000000..de2e6fb Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.SDK.pdb differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.deps.json b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.deps.json new file mode 100644 index 0000000..aa4b430 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.deps.json @@ -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": "" + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.dll new file mode 100644 index 0000000..a960854 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.exe b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.exe new file mode 100644 index 0000000..6262bd4 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.exe differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.pdb b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.pdb new file mode 100644 index 0000000..7afc131 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.pdb differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.runtimeconfig.json b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.runtimeconfig.json new file mode 100644 index 0000000..c7a4117 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/AxCopilot.runtimeconfig.json @@ -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 + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/DocumentFormat.OpenXml.Framework.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/DocumentFormat.OpenXml.Framework.dll new file mode 100644 index 0000000..f9f3da9 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/DocumentFormat.OpenXml.Framework.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/DocumentFormat.OpenXml.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/DocumentFormat.OpenXml.dll new file mode 100644 index 0000000..fc7bada Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/DocumentFormat.OpenXml.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Markdig.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Markdig.dll new file mode 100644 index 0000000..4931e93 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Markdig.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Data.Sqlite.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Data.Sqlite.dll new file mode 100644 index 0000000..c5fef6d Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Data.Sqlite.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.dll new file mode 100644 index 0000000..4a27877 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.xml b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.xml new file mode 100644 index 0000000..d9d574c --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.xml @@ -0,0 +1,8879 @@ + + + + Microsoft.Web.WebView2.Core + + + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + + + Creates a CoreWebView2 object that wraps an existing COM ICoreWebView2 object. + This allows interacting with the CoreWebView2 using .NET, even if it was originally created using COM. + + Pointer to a COM object that implements the ICoreWebView2 COM interface. + Returns a .NET CoreWebView2 object that wraps the COM object. + Thrown when the provided COM pointer is null. + Thrown when the value is not an ICoreWebView2 COM object and cannot be wrapped. + + + + Returns the existing COM ICoreWebView2 object underlying this .NET CoreWebView2 object. + This allows interacting with the WebView2 control using COM APIs, + even if the control was originally created using .NET. + + Pointer to a COM object that implements the ICoreWebView2 COM interface. + + + + Print the current page to PDF asynchronously with the provided settings. + + + See for description of settings. Passing null for printSettings results in default print settings used. + + Use resultFilePath to specify the path to the PDF file. The host should provide an absolute path, including file name. If the path points to an existing file, the file will be overwritten. If the path is not valid, the method fails. + + The async PrintToPdf operation completes when the data has been written to the PDF file. If the application exits before printing is complete, the file is not saved. Only one `Printing` operation can be in progress at a time. + If PrintToPdf is called while a `PrintToPdf` or `PrintToPdfStream` or `Print` operation is in progress, the operation completes and returns false. + + + + + Adds a URI and resource context filter for corresponding request sources for the event. + + A URI to be added to the event. + A resource context filter to be added to the event. + A request source filter to be added to the event. + + + + Removes a matching WebResource filter that was previously added for the event. + + An URI to be added to the event. + A resource context filter to be added to the event. + A request source filter to be added to the event. + + + + Same as , but also has support for posting DOM + objects to page content. + + The web message to be posted to the top level document in + this WebView. + Additional DOM objects posted to the content. + + The event args is an instance of MessageEvent. The setting must be true or the message + will not be sent. The event arg's data property of the event arg is the + webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. + The event arg's source property of the event arg is a reference to the + window.chrome.webview object. For information about sending messages from the HTML + document in the WebView to the host, navigate to . The message is sent asynchronously. If a + navigation occurs before the message is posted to the page, the message is not be sent. + This additionalObjects is retrieved in web content via the DOM MessageEvent additionalObjects + property as an array-like list of DOM objects. Currently these type of objects can be + posted: + + + .NET / WinRT + DOM type + + + + [FileSystemHandle](https://developer.mozilla.org/docs/Web/API/FileSystemHandle) + + + null + null + + + The objects are posted to web content, following the + [structured-clone](https://developer.mozilla.org/docs/Web/API/Web_Workers_API/Structured_clone_algorithm) + semantics, meaning only objects that can be cloned can be posted. They will also behave as + if they had been created by the web content they are posted to. For example, if a + FileSystemFileHandle is posted to a web content it can only be re-transferred via + postMessage to other web content [with the same + origin](https://fs.spec.whatwg.org/#filesystemhandle). + Warning: An app needs to be mindful when using this API to post DOM objects as this API + provides the web content with unusual access to sensitive Web Platform features such as + filesystem access! Similar to PostWebMessageAsJson, the app should check the property right before posting the message to ensure the message + and objects will only be sent to the target web content that it expects to receive the DOM + objects. Additionally, the order of messages that are posted between PostWebMessageAsJson + and PostWebMessageAsJsonWithAdditionalObjects may not be preserved. + + + + + + + Opens the browser print preview dialog to print the current web page + + + + + Gets the object contains various modifiable settings for the running WebView. + + + + + Gets the URI of the current top level document. + + + This value potentially changes as a part of the event raised for some cases such as navigating to a different site or fragment navigations. It remains the same for other types of navigations such as page refreshes or history.pushState with the same URL as the current page. + + + + + + Gets the process ID of the browser process that hosts the WebView. + + + + + true if the WebView is able to navigate to a previous page in the navigation history. + + + If CanGoBack changes value, the event is raised. + + + + + + true if the WebView is able to navigate to a next page in the navigation history. + + + If CanGoForward changes value, the event is raised. + + + + + + Gets the title for the current top-level document. + + + If the document has no explicit title or is otherwise empty, a default that may or may not match the URI of the document is used. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DocumentTitle"::: + + + + + Indicates if the WebView contains a fullscreen HTML element. + + + + + NavigationStarting is raised when the WebView main frame is requesting permission to navigate to a different URI. + + + Redirects raise this event as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigationStarting"::: + + + + + ContentLoading is raised before any content is loaded, including scripts added with . ContentLoading is not raised if a same page navigation occurs (such as through fragment navigations or history.pushState navigations). + + + This operation follows the and events and precedes the and events. + + + + + + + + + SourceChanged is raised when the property changes. + + + SourceChanged is raised when navigating to a different site or fragment navigations. It is not raised for other types of navigations such as page refreshes or history.pushState with the same URL as the current page. This event is raised before for navigation to a new document. + + + + + + + HistoryChanged is raised for changes to joint session history, which consists of top-level and manual frame navigations. + + + Use HistoryChanged to verify that the or value has changed. HistoryChanged is also raised for using or . HistoryChanged is raised after and . CanGoBack is false for navigations initiated through CoreWebView2Frame APIs if there has not yet been a user gesture. + + + + + + + + + NavigationCompleted is raised when the WebView has completely loaded (body.onload has been raised) or loading stopped with error. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigationCompleted"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DOMContentLoaded"::: + + + + + FrameNavigationStarting is raised when a child frame in the WebView requests permission to navigate to a different URI. + + + Redirects raise this operation as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + + + FrameNavigationCompleted is raised when a child frame has completely loaded (body.onload has been raised) or loading stopped with error. + + + + + ScriptDialogOpening is raised when a JavaScript dialog (alert, confirm, prompt, or beforeunload) displays for the WebView. + + + This event only is raised if the property is set to false. This event suppresses dialogs or replaces default dialogs with custom dialogs. + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + + PermissionRequested is raised when content in a WebView requests permission to access some privileged resources. + + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + ProcessFailed is raised when a WebView process ends unexpectedly or becomes unresponsive. + + + ProcessFailed is raised when any of the processes in the WebView2 Process Group encounters one of the following conditions: + + + + Condition + Details + + + Unexpected exit + + The process indicated by the event args has exited unexpectedly (usually due to a crash). The failure might or might not be recoverable, and some failures are auto-recoverable. + + + + Unresponsiveness + + The process indicated by the event args has become unresponsive to user input. This is only reported for renderer processes, and will run every few seconds until the process becomes responsive again. + + + + + Note: When the failing process is the browser process, a event will run too. + + Your application can use to identify which condition and process the event is for, and to collect diagnostics and handle recovery if necessary. For more details about which cases need to be handled by your application, see . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ProcessFailed"::: + + + + + WebMessageReceived is raised when the setting is set and the top-level document of the WebView runs window.chrome.webview.postMessage or window.chrome.webview.postMessageWithAdditionalObjects. + + + The postMessage function is void postMessage(object) where object is any object supported by JSON conversion. + When postMessage is called, the handler's Invoke method will be called with the object parameter postMessage converted to a JSON string. + If the same page calls postMessage multiple times, the corresponding WebMessageReceived events are guaranteed to be fired in the same order. However, if multiple frames call postMessage, there is no guaranteed order. In addition, WebMessageReceived events caused by calls to postMessage are not guaranteed to be sequenced with events caused by DOM APIs. For example, if the page runs + + chrome.webview.postMessage("message"); + window.open(); + + then the event might be fired before the WebMessageReceived event. If you need the WebMessageReceived event to happen before anything else, then in the WebMessageReceived handler you can post a message back to the page and have the page wait until it receives that message before continuing. + + + + + NewWindowRequested is raised when content inside the WebView requests to open a new window, such as through window.open(). + + + The app can pass a target WebView that is considered the opened window or mark the event as , in which case WebView2 does not open a window. + If either Handled or properties are not set, the target content will be opened on a popup window. + If a deferral is not taken on the event args, scripts that resulted in the new window that are requested are blocked until the event handler returns. If a deferral is taken, then scripts are blocked until the deferral is completed. + + On Hololens 2, if the property is not set and the property is not set to true, the WebView2 will navigate to the . + If either of these properties are set, the WebView2 will not navigate to the and the the event will continue as normal. + + + + + DocumentTitleChanged is raised when the property changes and may be raised before or after the event. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DocumentTitleChanged"::: + + + + + + ContainsFullScreenElementChanged is raised when the property changes. + + + An HTML element inside the WebView may enter fullscreen to the size of the WebView or leave fullscreen. This event is useful when, for example, a video element requests to go fullscreen. The listener of this event may resize the WebView in response. + + + + + + WebResourceRequested is raised when the WebView is performing a URL request to a matching URL and resource context filter that was added with . + + + At least one filter must be added for the event to be raised. + The web resource requested may be blocked until the event handler returns if a deferral is not taken on the event args. If a deferral is taken, then the web resource requested is blocked until the deferral is completed. + + If this event is subscribed in the handler it should be called after the new window is set. For more details see . + + This event is by default raised for file, http, and https URI schemes. This is also raised for registered custome URI schemes. See for more details. + + + + + + WindowCloseRequested is raised when content inside the WebView requested to close the window, such as after window.close() is run. + + + The app should close the WebView and related app window if that makes sense to the app. + After the first window.close() call, this event may not fire for any immediate back to back window.close() calls. + + + + + Causes a navigation of the top level document to the specified URI. + + The URI to navigate to. + + For more information, navigate to [Navigation event](/microsoft-edge/webview2/concepts/navigation-events). Note that this operation starts a navigation and the corresponding event is raised sometime after Navigate runs. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Navigate"::: + + + + + + + Initiates a navigation to htmlContent as source HTML of a new document. + + A source HTML of a new document. + + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + string htmlContent = + @" + + + +

      Click me

      + + "; + webview.NavigateToString(htmlContent); +
      +
      + + + +
      + + + Adds the provided JavaScript to a list of scripts that should be run after the global object has been created, but before the HTML document has been parsed and before any other script included by the HTML document is run. + + The JavaScript code to be run. + A script ID that may be passed when calling . + + The injected script will apply to all future top level document and child frame navigations until removed with . + This is applied asynchronously and you must wait for the returned to complete before you can be sure that the script is ready to execute on future navigations. + If the method is run in handler, it should be called before the new window is set. For more details see . + + Note that if an HTML document has sandboxing of some kind via [sandbox](https://developer.mozilla.org/docs/Web/HTML/Element/iframe#attr-sandbox) properties or the [Content-Security-Policy HTTP header](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy) this will affect the script run here. So, for example, if the allow-modals keyword is not set then calls to the alert function will be ignored. + + + + + + Removes the corresponding JavaScript added via with the specified script ID. + + The ID corresponds to the JavaScript code to be removed from the list of scripts. + Both use and this method in handler at the same time sometimes causes trouble. Since invalid scripts will be ignored, the script IDs you got may not be valid anymore. + + + + Runs JavaScript code from the javaScript parameter in the current top-level document rendered in the WebView. + + The JavaScript code to be run in the current top-level document rendered in the WebView. + A JSON encoded string that represents the result of running the provided JavaScript. + + If the result is undefined, contains a reference cycle, or otherwise is not able to be encoded into JSON, the JSON null value is returned as the "null" string. + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. This method is applied asynchronously. If the method is run after the event during a navigation, the script runs in the new document when loading it, around the time is run. This operation works even if is set to false. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScript"::: + + + + + + Captures an image of what WebView is displaying. + + The format of the image to be captured. + The stream to which the resulting image binary data is written. + + When CapturePreviewAsync finishes writing to the stream, the Invoke method on the provided handler parameter is called. This method fails if called before the first event. For example if this is called in the event for the first navigation it will fail. For subsequent navigations, the method may not fail, but will not capture an image of a given webpage until the event has been fired for it. Any call to this method prior to that will result in a capture of the page being navigated away from. + + + + + + Reloads the current page. + + + This is similar to navigating to the URI of current top level document including all navigation events firing and respecting any entries in the HTTP cache. But, the back or forward history will not be modified. + + + + + Posts the specified webMessageAsJson to the top level document in this WebView. + + The web message to be posted to the top level document in this WebView. + + The event args is an instance of MessageEvent. The setting must be true or the message will not be sent. The event arg's data property of the event arg is the webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. The event arg's source property of the event arg is a reference to the window.chrome.webview object. For information about sending messages from the HTML document in the WebView to the host, navigate to . The message is sent asynchronously. If a navigation occurs before the message is posted to the page, the message is not be sent. + + + Runs the message event of the window.chrome.webview of the top-level document. JavaScript in that document may subscribe and unsubscribe to the event using the following code: + + window.chrome.webview.addEventListener('message', handler) + window.chrome.webview.removeEventListener('message', handler) + + + + + + + + + Posts a message that is a simple string rather than a JSON string representation of a JavaScript object. + + The web message to be posted to the top level document in this WebView. + + This behaves in exactly the same manner as , but the data property of the event arg of the window.chrome.webview message is a string with the same value as webMessageAsString. Use this instead of if you want to communicate using simple strings rather than JSON objects. + + + + + + + Runs an asynchronous DevToolsProtocol method. + + The full name of the method in the format {domain}.{method}. + A JSON formatted string containing the parameters for the corresponding method. + A JSON string that represents the method's return object. + + For more information about available methods, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). The returned task is completed when the method asynchronously completes and will return the method's return object as a JSON string. Note even though WebView2 dispatches the CDP messages in the order called, CDP method calls may be processed out of order. If you require CDP methods to run in a particular order, you should await for the previous method call. + + If the method is to run in handler it should be called + before the new window is set if the cdp messages should affect the initial navigation. If + called after setting the NewWindow property, the cdp messages + may or may not apply to the initial navigation and may only apply to the subsequent navigation. + For more details . + + + + + Navigates the WebView to the previous page in the navigation history. + + + + + Navigates the WebView to the next page in the navigation history. + + + + + Gets a DevTools Protocol event receiver that allows you to subscribe to a DevToolsProtocol event. + + The full name of the event in the format {domain}.{event}. + A Devtools Protocol event receiver. + + For more information about DevToolsProtocol events description and event args, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). + + + + + Stops all navigations and pending resource fetches. + + + Does not stop scripts. + + + + + Adds the provided host object to script running in the WebView with the specified name. + + The name of the host object. + The host object to be added to script. + + Host objects are exposed as host object proxies via window.chrome.webview.hostObjects.{name}. Host object proxies are promises and will resolve to an object representing the host object. Only the COM visible objects/properties/methods can be accessed from script. + The app can control which part of .NET objects are exposed using . + + JavaScript code in the WebView will be able to access appObject as following and then access attributes and methods of appObject. + + Note that while simple types, IDispatch and array are supported, and IUnknown objects that also implement IDispatch are treated as IDispatch, generic IUnknown, VT_DECIMAL, or VT_RECORD variant is not supported. Remote JavaScript objects like callback functions are represented as an VT_DISPATCH VARIANT with the object implementing IDispatch. The JavaScript callback method may be invoked using DISPID_VALUE for the DISPID. Such callback method invocations will return immediately and will not wait for the JavaScript function to run and so will not provide the return value of the JavaScript function. Nested arrays are supported up to a depth of 3. Arrays of by reference types are not supported. VT_EMPTY and VT_NULL are mapped into JavaScript as null. In JavaScript null and undefined are mapped to VT_EMPTY. + + Additionally, all host objects are exposed as window.chrome.webview.hostObjects.sync.{name}. Here the host objects are exposed as synchronous host object proxies. These are not promises and calls to functions or property access synchronously block running script waiting to communicate cross process for the host code to run. Accordingly this can result in reliability issues and it is recommended that you use the promise based asynchronous window.chrome.webview.hostObjects.{name} API described above. + + Synchronous host object proxies and asynchronous host object proxies can both proxy the same host object. Remote changes made by one proxy will be reflected in any other proxy of that same host object whether the other proxies and synchronous or asynchronous. + + While JavaScript is blocked on a synchronous call to native code, that native code is unable to call back to JavaScript. Attempts to do so will fail with HRESULT_FROM_WIN32(ERROR_POSSIBLE_DEADLOCK). + + Host object proxies are JavaScript Proxy objects that intercept all property get, property set, and method invocations. Properties or methods that are a part of the Function or Object prototype are run locally. Additionally any property or method in the array chrome.webview.hostObjects.options.forceLocalProperties will also be run locally. This defaults to including optional methods that have meaning in JavaScript like toJSON and Symbol.toPrimitive. You can add more to this array as required. + + There's a method chrome.webview.hostObjects.cleanupSome that will best effort garbage collect host object proxies. + + The chrome.webview.hostObjects.options object provides the ability to change some functionality of host objects. + + + + Options property + Details + + + forceLocalProperties + + This is an array of host object property names that will be run locally, instead of being called on the native host object. This defaults to then, toJSON, Symbol.toString, and Symbol.toPrimitive. You can add other properties to specify that they should be run locally on the JavaScript host object proxy. + + + + log + + This is a callback that will be called with debug information. For example, you can set this to console.log.bind(console) to have it print debug information to the console to help when troubleshooting host object usage. By default this is null. + + + + shouldSerializeDates + + By default this is false, and JavaScript Date objects will be sent to host objects as a string using JSON.stringify. You can set this property to true to have Date objects properly serialize as a System.DateTime when sending to the .NET host object, and have System.DateTime properties and return values create a JavaScript Date object. + + + + defaultSyncProxy + + When calling a method on a synchronous proxy, the result should also be a synchronous proxy. But in some cases, the sync/async context is lost (for example, when providing to native code a reference to a function, and then calling that function in native code). In these cases, the proxy will be asynchronous, unless this property is set. + + + + forceAsyncMethodMatches + + This is an array of regular expressions. When calling a method on a synchronous proxy, the method call will be performed asynchronously if the method name matches a string or regular expression in this array. Setting this value to Async will make any method that ends with Async be an asynchronous method call. If an async method doesn't match here and isn't forced to be asynchronous, the method will be invoked synchronously, blocking execution of the calling JavaScript and then returning the resolution of the promise, rather than returning a promise. + + + + ignoreMemberNotFoundError + + By default, an exception is thrown when attempting to get the value of a proxy property that doesn't exist on the corresponding native class. Setting this property to true switches the behavior to match Chakra WinRT projection (and general JavaScript) behavior of returning undefined with no error. + + + + shouldPassTypedArraysAsArrays + + By default, typed arrays are passed to the host as IDispatch. To instead pass typed arrays to the host as array, set this to true. + + + + + Host object proxies additionally have the following methods: + + + + Method name + Details + + + applyHostFunction, getHostProperty, setHostProperty + + Perform a method invocation, property get, or property set on the host object. You can use these to explicitly force a method or property to run remotely if there is a conflicting local method or property. For instance, proxy.toString() will run the local toString method on the proxy object. But proxy.applyHostFunction('toString') runs toString on the host proxied object instead. + + + + getLocalProperty, setLocalProperty + + Perform property get, or property set locally. You can use these methods to force getting or setting a property on the host object proxy itself rather than on the host object it represents. For instance, proxy.unknownProperty will get the property named unknownProperty from the host proxied object. But proxy.getLocalProperty('unknownProperty') will get the value of the property unknownProperty on the proxy object itself. + + + + addEventListener + + This method only exists on proxies for .NET objects. Bind the JavaScript handler to the C# event, so that the JavaScript handler can be called through the C# event. For example, chrome.webview.hostObjects.sample.addEventListener('TestEvent', () => { alert('Invoked from remote');}); bind an anonymous JavaScript function to a C# event called 'TestEvent'. When calling TestEvent?.Invoke() on C# side, the JavaScript function that was just bound will be called asynchronously. It allows adding more than one handler for an event, but if the handler is already in the list of event handler, it will not be added a second time. If the host object cannot find the event with the name passed in by the addEventListener function or it is no public or its return type is not void, an exception will be thrown. If the count and type of C# event's parameters do not match the count and type of JavaScript handler, invoke addEventListener will be successful but an exception will be passed to JavaScript when invoke the event on C# side. If the host object has defined addEventListener function, use the defined function rather than the additionally addEventListener function. + + + + removeEventListener + + This method only exists on proxies for .NET objects. Removes a handler previously bound with addEventListener(). If the handler does not exist in the list of event handler, nothing will happen. If the host object cannot find the event with the name passed in by the removeEventListener function or it is no public, an exception will be thrown. If the host object has defined removeEventListener function, use the defined function rather than the additionally removeEventListener function. + + + + sync + + Asynchronous host object proxies expose a sync method which returns a promise for a synchronous host object proxy for the same host object. For example, chrome.webview.hostObjects.sample.methodCall() returns an asynchronous host object proxy. You can use the sync method to obtain a synchronous host object proxy instead: + const syncProxy = await chrome.webview.hostObjects.sample.methodCall().sync() + + + + async + + Synchronous host object proxies expose an async method which blocks and returns an asynchronous host object proxy for the same host object. For example, chrome.webview.hostObjects.sync.sample.methodCall() returns a synchronous host object proxy. Calling the async method on this blocks and then returns an asynchronous host object proxy for the same host object: const asyncProxy = chrome.webview.hostObjects.sync.sample.methodCall().async() + + + + then + + Asynchronous host object proxies have a then method. This allows them to be awaitable. then will return a promise that resolves with a representation of the host object. If the proxy represents a JavaScript literal then a copy of that is returned locally. If the proxy represents a function then a non-awaitable proxy is returned. If the proxy represents a JavaScript object with a mix of literal properties and function properties, then the a copy of the object is returned with some properties as host object proxies. + + + + cancelPromise + + This method attempts to cancel the fulfillment of a promised value. If the promise hasn't already been fulfilled and cancelation is supported, the promise will get rejected. cancelPromise supports cancelation of IAsyncOperation and IAsyncAction methods. If the promise is successfully canceled, then calling await on the promise will throw. For example, chrome.webview.hostObjects.cancelPromise(promise); await promise; will throw with "Promise Canceled". Once a promise has been canceled, a subsequent cancel on the same promise will throw an exception as well. + + + + + All other property and method invocations (other than the above Remote object proxy methods, forceLocalProperties list, and properties on Function and Object prototypes) are run remotely. Asynchronous host object proxies return a promise representing asynchronous completion of remotely invoking the method, or getting the property. The promise resolves after the remote operations complete and the promises resolve to the resulting value of the operation. Synchronous host object proxies work similarly but block JavaScript execution and wait for the remote operation to complete. + + Setting a property on an asynchronous host object proxy works slightly differently. The set returns immediately and the return value is the value that will be set. This is a requirement of the JavaScript Proxy object. If you need to asynchronously wait for the property set to complete, use the setHostProperty method which returns a promise as described above. Synchronous object property set property synchronously blocks until the property is set. + + Exposing host objects to script has security risk. Please follow [best practices](/microsoft-edge/webview2/concepts/security). + + + To create a [IDispatch](/windows/win32/api/oaidl/nn-oaidl-idispatch) implementing class in C# use the following attributes on each class you intend to expose. + + // Bridge and BridgeAnotherClass are C# classes that implement IDispatch and works with AddHostObjectToScript. + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class BridgeAnotherClass + { + // Sample property. + public string Prop { get; set; } = "Example"; + } + + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class Bridge + { + public string Func(string param) + { + return "Example: " + param; + } + + public BridgeAnotherClass AnotherObject { get; set; } = new BridgeAnotherClass(); + + // Sample indexed property. + [System.Runtime.CompilerServices.IndexerName("Items")] + public string this[int index] + { + get { return m_dictionary[index]; } + set { m_dictionary[index] = value; } + } + private Dictionary<int, string> m_dictionary = new Dictionary<int, string>(); + } + + Then add instances of those classes via : + + webView.CoreWebView2.AddHostObjectToScript("bridge", new Bridge()); + + And then in script you can call the methods, and access those properties of the objects added via . + Note that `CoreWebView2.AddHostObjectToScript` only applies to the top-level document and not to frames. To add host objects to frames use `CoreWebView2Frame.AddHostObjectToScript`. + + // Find added objects on the hostObjects property + const bridge = chrome.webview.hostObjects.bridge; + + // Call a method and pass in a parameter. + // The result is another proxy promise so you must await to get the result. + console.log(await bridge.Func("testing...")); + + // A property may be another object as long as its class also implements + // IDispatch. + // Getting a property also gets a proxy promise you must await. + const propValue = await bridge.AnotherObject.Prop; + console.log(propValue); + + // Indexed properties + let index = 123; + bridge[index] = "test"; + let result = await bridge[index]; + console.log(result); + + + + + + + Removes the host object specified by the name so that it is no longer accessible from JavaScript code in the WebView. + + The name of the host object to be removed. + + While new access attempts are denied, if the object is already obtained by JavaScript code in the WebView, the JavaScript code continues to have access to that object. Running this method for a name that is already removed or never added fails. + + + + + Opens the DevTools window for the current document in the WebView. + + + Does nothing if run when the DevTools window is already open. + + + + + + + + Warning: This method and are deprecated. + + Removes a matching WebResource filter that was previously added for the event. + An URI to at which a web resource filter was added. + A previously added resource context filter to be removed. + A filter that was never added. + + If the same filter was added multiple times, then it must need to be removed as many times as it was added for the removal to be effective. + + + + + + Gets the object associated with this . + + + + + + Exposes the used to create this . + + + + + WebResourceResponseReceived is raised when the WebView receives the response for a request for a web resource (any URI resolution performed by the WebView; such as HTTP/HTTPS, file and data requests from redirects, navigations, declarations in HTML, implicit Favicon lookups, and fetch API usage in the document). + + + The host app can use this event to view the actual request and response for a web resource. There is no guarantee about the order in which the WebView processes the response and the host app's handler runs. The app's handler will not block the WebView from processing the response. + The event args include the as sent by the wire and received, including any additional headers added by the network stack that were not be included as part of the associated event, such as Authentication headers. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebResourceResponseReceived"::: + + + + + DOMContentLoaded is raised when the initial HTML document has been parsed. + + + This aligns with the the document's DOMContentLoaded event in HTML. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DOMContentLoaded"::: + + + + + Navigates using a constructed object. + + The constructed web resource object to provide post data or additional request headers during navigation. + + The headers in the override headers added by WebView2 runtime except for Cookie headers. Method can only be either GET or POST. Provided post data will only be sent only if the method is POST and the uri scheme is HTTP(S). + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigateWithWebResourceRequest"::: + + + + + Whether WebView is suspended. + + + True when WebView is suspended, from the time when has completed successfully until WebView is resumed. + + + + + An app may call this API to have the WebView2 consume less memory. + + + This is useful when a Win32 app becomes invisible, or when a Universal Windows Platform app is being suspended, during the suspended event handler before completing the suspended event. + + The property must be false when the API is called. Otherwise, the API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE). + + Suspending is similar to putting a tab to sleep in the Edge browser. Suspending pauses WebView script timers and animations, minimizes CPU usage for the associated browser renderer process and allows the operating system to reuse the memory that was used by the renderer process for other processes. + + Note that Suspend is best effort and considered completed successfully once the request is sent to browser renderer process. If there is a running script, the script will continue to run and the renderer process will be suspended after that script is done. + + See [Sleeping Tabs FAQ](https://techcommunity.microsoft.com/t5/articles/sleeping-tabs-faq/m-p/1705434) for conditions that might prevent WebView from being suspended. In those situations, the result of the async task is false. + + The WebView will be automatically resumed when it becomes visible. Therefore, the app normally does not have to call explicitly. + + The app can call and then periodically for an invisible WebView so that the invisible WebView can sync up with latest data and the page ready to show fresh content when it becomes visible. + + All WebView APIs can still be accessed when a WebView is suspended. Some APIs like Navigate will auto resume the WebView. To avoid unexpected auto resume, check property before calling APIs that might change WebView state. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="TrySuspend"::: + + + + + Resumes the WebView so that it resumes activities on the web page. + + + This API can be called while the WebView2 controller is invisible. + + The app can interact with the WebView immediately after . + + WebView will be automatically resumed when it becomes visible. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Resume"::: + + + + + Sets a mapping between a virtual host name and a folder path to make available to web sites via that host name. + + A virtual host name. + A folder path name to be mapped to the virtual host name. The length must not exceed the Windows MAX_PATH limit. + The level of access to resources under the virtual host from other sites. + + + After setting the mapping, documents loaded in the WebView can use HTTP or HTTPS URLs at the specified host name specified by hostName to access files in the local folder specified by folderPath. + This mapping applies to both top-level document and iframe navigations as well as subresource references from a document. This also applies to dedicated and shared worker scripts but does not apply to service worker scripts. + + Due to a current implementation limitation, media files accessed using virtual host name can be very slow to load. + + As the resource loaders for the current page might have already been created and running, changes to the mapping might not be applied to the current page and a reload of the page is needed to apply the new mapping. + + Both absolute and relative paths are supported for folderPath. Relative paths are interpreted as relative to the folder where the exe of the app is in. + + + For example, after calling SetVirtualHostNameToFolderMapping("appassets.example", "assets", CoreWebView2HostResourceAccessKind.Deny);, navigating to https://appassets.example/my-local-file.html will show content from my-local-file.html in the assets subfolder located on disk under the same path as the app's executable file. + + DOM elements that want to reference local files will have their host reference virtual host in the source. If there are multiple folders being used, define one unique virtual host per folder. + + + You should typically choose virtual host names that are never used by real sites. + If you own a domain such as example.com, another option is to use a subdomain reserved for the app (like my-app.example.com). + + + [RFC 6761](https://tools.ietf.org/html/rfc6761) has reserved several special-use domain names that are guaranteed to not be used by real sites (for example, .example, .test, and .invalid). + + + Note that using .local as the top-level domain name will work but can cause a delay during navigations. You should avoid using .local if you can. + + + Apps should use distinct domain names when mapping folder from different sources that should be isolated from each other. For instance, the app might use app-file.example for files that ship as part of the app, and book1.example might be used for files containing books from a less trusted source that were previously downloaded and saved to the disk by the app. + + + The host name used in the APIs is canonicalized using Chromium's host name parsing logic before being used internally. + For more information see [HTML5 2.6 URLs](https://dev.w3.org/html5/spec-LC/urls.html). + + + All host names that are canonicalized to the same string are considered identical. + For example, EXAMPLE.COM and example.com are treated as the same host name. + An international host name and its Punycode-encoded host name are considered the same host name. There is no DNS resolution for host name and the trailing '.' is not normalized as part of canonicalization. + + + Therefore example.com and example.com. are treated as different host names. Similarly, virtual-host-name and virtual-host-name.example.com are treated as different host names even if the machine has a DNS suffix of example.com. + + + Specify the minimal cross-origin access necessary to run the app. If there is not a need to access local resources from other origins, use . + + + + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + webView.Source = new Uri("https://appassets.example/index.html"); + + + This in an example on how to embed a local image. For more information see . + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + string c_navString = ""; + webview.NavigateToString(c_navString); + + + + + + + Clears a host name mapping for local folder that was added by . + + The host name to be removed from the mapping. + + + + + FrameCreated is raised when a new iframe is created. Handle this event to get access to objects. + + + + Use the to listen for when this iframe goes away. + + + + + DownloadStarting is raised when a download has begun, blocking the default download dialog, but not blocking the progress of the download. + + + The host can choose to cancel a download, change the result file path, and hide the default download dialog. If download is not handled or canceled, the download is saved to the default path after the event completes with default download dialog shown. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DownloadStarting"::: + + + + + ClientCertificateRequested is raised when WebView2 is making a request to an HTTP server that needs a client certificate for HTTP authentication. Read more about HTTP client certificates at [RFC 8446 The Transport Layer Security (TLS) Protocol Version 1.3](https://tools.ietf.org/html/rfc8446). + + + The host have several options for responding to client certificate requests: + + + + Scenario + Handled + Cancel + SelectedCertificate + + + Respond to server with a certificate + True + False + MutuallyTrustedCertificate value + + + Respond to server without certificate + True + False + null + + + Display default client certificate selection dialog prompt + False + False + n/a + + + Cancel the request + n/a + True + n/a + + + + If the host don't handle the event, WebView2 will show the default client certificate selection dialog prompt to the user. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClientCertificateRequested1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClientCertificateRequested2"::: + + + + + Opens the Browser Task Manager view as a new window in the foreground. + + + If the Browser Task Manager is already open, this will bring it into the foreground. WebView2 currently blocks the Shift+Esc shortcut for opening the task manager. An end user can open the browser task manager manually via the Browser task manager entry of the DevTools window's title bar's context menu. + + + + + Indicates whether all audio output from this CoreWebView2 is muted or not. Set to true will mute this CoreWebView2, and set to false will unmute this CoreWebView2. true if audio is muted. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleIsMuted"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="UpdateTitleWithMuteState"::: + + + + + Indicates whether any audio output from this CoreWebView2 is playing. true if audio is playing even if is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="UpdateTitleWithMuteState"::: + + + + + IsMutedChanged is raised when the mute state changes. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="IsMutedChanged"::: + + + + + IsDocumentPlayingAudioChanged is raised when document starts or stops playing audio. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="IsDocumentPlayingAudioChanged"::: + + + + + True if the default download dialog is currently open. + + + The value of this property changes only when the default download dialog is explicitly opened or closed. Hiding the WebView implicitly hides the dialog, but does not change the value of this property. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleDefaultDownloadDialog"::: + + + + + The default download dialog corner alignment. + + + The dialog can be aligned to any of the WebView corners (see ). When the WebView or dialog changes size, the dialog keeps it position relative to the corner. The dialog may become partially or completely outside of the WebView bounds if the WebView is small enough. Set the margin from the corner with the property. The corner alignment and margin should be set during initialization to ensure that they are correctly applied when the layout is first computed, otherwise they will not take effect until the next time the WebView position or size is updated. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SetDefaultDownloadDialogPosition"::: + + + + + The default download dialog margin relative to the WebView corner specified by . + + + The margin is a point that describes the vertical and horizontal distances between the chosen WebView corner and the default download dialog corner nearest to it. Positive values move the dialog towards the center of the WebView from the chosen WebView corner, and negative values move the dialog away from it. Use (0, 0) to align the dialog to the WebView corner with no margin. The corner alignment and margin should be set during initialization to ensure that they are correctly applied when the layout is first computed, otherwise they will not take effect until the next time the WebView position or size is updated. + + + + + Raised when the property changes. + + + This event comes after the event. Setting the property disables the default download dialog and ensures that this event is never raised. + + + + + Open the default download dialog. + + + If the dialog is opened before there are recent downloads, the dialog shows all past downloads for the current profile. Otherwise, the dialog shows only the recent downloads with a "See more" button for past downloads. Calling this method raises the event if the dialog was closed. No effect if the dialog is already open. + + + + + Close the default download dialog. + + + Calling this method raises the event if the dialog was open. No effect if the dialog is already closed. + + + + + BasicAuthenticationRequested event is raised when WebView encounters a Basic HTTP Authentication request as described in https://developer.mozilla.org/docs/Web/HTTP/Authentication, a Digest HTTP Authentication request as described in https://developer.mozilla.org/docs/Web/HTTP/Headers/Authorization#digest, an NTLM authentication or a Proxy Authentication request. + + + The host can provide a response with credentials for the authentication or cancel the request. If the host sets the Cancel property to false but does not provide either UserName or Password properties on the Response property, then WebView2 will show the default authentication challenge dialog prompt to the user. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BasicAuthenticationRequested"::: + + + + + ContextMenuRequested is raised when a context menu is requested by the user and the content inside WebView hasn't disabled context menus. + + + The host has the option to create their own context menu with the information provided in the event or can add items to or remove items from WebView context menu. If the host doesn't handle the event, WebView will display the default context menu. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="CustomContextMenu"::: + + + + + Runs an asynchronous DevToolsProtocol method for a specific session of an attached target. + + The sessionId for an attached target. null or empty string is treated as the session for the default target for the top page. + The full name of the method in the format {domain}.{method}. + A JSON formatted string containing the parameters for the corresponding method. + A JSON string that represents the method's return object. + + There could be multiple DevToolsProtocol targets in a WebView. + Besides the top level page, iframes from different origin and web workers are also separate targets. + Attaching to these targets allows interaction with them. + When the DevToolsProtocol is attached to a target, the connection is identified by a sessionId. + + To use this API, you must set the flatten parameter to true when calling Target.attachToTarget or Target.setAutoAttach DevToolsProtocol method. + Using Target.setAutoAttach is recommended as that would allow you to attach to dedicated worker targets, which are not discoverable via other APIs like Target.getTargets. + For more information about targets and sessions, navigate to [Chrome DevTools Protocol - Target domain]( https://chromedevtools.github.io/devtools-protocol/tot/Target). + + For more information about available methods, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). The handler's Invoke method will be called when the method asynchronously completes. Invoke will be called with the method's return object as a JSON string. + + + + + The current text of the statusbar as defined by [Window.statusbar](https://developer.mozilla.org/docs/Web/API/Window/statusbar). + + + + + StatusBarTextChanged event is raised when the text in the [Window.statusbar](https://developer.mozilla.org/docs/Web/API/Window/statusbar) changes. When the event is fired use the property to get the current statusbar text. + + + Events which cause causes can be anything from hover, url events, and others. There is not a finite list on how to cause the statusbar to change. + The developer must create the status bar and set the text. + + + + + The associated object of . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Profile"::: + + + + + The ServerCertificateErrorDetected event is raised when the WebView2 cannot verify server's digital certificate while loading a web page. + + + This event will raise for all web resources and follows the event. + + If you don't handle the event, WebView2 will show the default TLS interstitial error page to the user for navigations, and for non-navigations the web request is cancelled. + + Note that WebView2 before raising `ServerCertificateErrorDetected` raises a event with as FALSE and any of the below WebErrorStatuses that indicate a certificate failure. + + + + + + + + + + + + + + + + + + + + For more details see and handle ServerCertificateErrorDetected event or show the default TLS interstitial error page to the user according to the app needs. + + WebView2 caches the response when action is for the RequestUri's host and the server certificate in the session and the event won't be raised again. + + To raise the event again you must clear the cache using . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ServerCertificateErrorDetected"::: + + + + + Clears all cached decisions to proceed with TLS certificate errors from the event for all WebView2's sharing the same session. + + + + + Get the Uri as a string of the current Favicon. This will be an empty string if the page does not have a Favicon. + + + + + Raised when the Favicon has changed. This can include when a new page is loaded and thus by default no icon is set or the icon is set for the page by DOM or JavaScript. + + + The first argument is the Webview2 which saw the changed Favicon and the second is null. + + + + + Get the downloaded Favicon image for the current page and copy it to the image stream. + + The format to retrieve the Favicon in. + + An IStream populated with the downloaded Favicon. + + + + + Print the current web page asynchronously to the specified printer with the provided settings. + + + See for description of settings. Passing null for printSettings results in default print settings used. + + The method will return as if printerName doesn't match with the name of any installed printers on the user OS. + The method will throw ArgumentException if the caller provides invalid settings for a given printer. + + The async Print operation completes when it finishes printing to the printer. Only one Printing operation can be in progress at a time. If Print is called while a or or job is in progress, throws exception. This is only for printing operation on one webview. + + + + Error + PrintStatus + Notes + + + No + + Print operation succeeded. + + + No + + If specified printer is not found or printer status is not available, offline or error state. + + + No + + Print operation is failed. + + + ArgumentException + + If the caller provides invalid settings for the specified printer. + + + Exception + + Print operation is failed as printing job already in progress. + + + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PrintToPrinter"::: + + + + + Opens the print dialog to print the current web page. + + + See for descriptions of print dialog kinds. + + Invoking browser or system print dialog doesn't open new print dialog if it is already open. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ShowPrintUI"::: + + + + + Provides the Pdf data of current web page asynchronously for the provided settings. + + + Stream will be rewound to the start of the pdf data. + + See for description of settings. Passing null for printSettings results in default print settings used. + + The async PrintToPdfStream operation completes when it finishes writing to the stream. Only one Printing operation can be in progress at a time. If is called while a or or job is in progress, the throws an exception. This is only for printing operation on one webview. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PrintToPdfStream"::: + + + + + Share a shared buffer object with script of the main frame in the WebView. + + The object to be shared with script. + The desired given to script. + Additional data to be send to script. If it is not null or empty string, and it is not a valid JSON string, will be thrown. + + The script will receive a sharedbufferreceived event from chrome.webview. + The event arg for that event will have the following methods and properties. + + + + Property + Description + + + getBuffer() + A method that returns an ArrayBuffer object with the backing content from the shared buffer. + + + additionalData + An object as the result of parsing additionalDataAsJson as JSON string. This property will be undefined if additionalDataAsJson is nullptr or empty string. + + + source + With a value set as chrome.webview object. + + + + If access is , the script will only have read access to the buffer. + If the script tries to modify the content in a read only buffer, it will cause an access violation in WebView renderer process and crash the renderer process. + + If the shared buffer is already closed, the API throws with error code of RO_E_CLOSED. + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access to the shared buffer any more. + + The application can post the same shared buffer object to multiple web pages or iframes, or post to the same web page or iframe multiple times. + Each PostSharedBufferToScript will create a separate ArrayBuffer object with its own view of the memory and is separately released. + The underlying shared memory will be released when all the views are released. + + Sharing a buffer to script has security risk. You should only share buffer with trusted site. + If a buffer is shared to a untrusted site, possible sensitive information could be leaked. + If a buffer is shared as modifiable by the script and the script modifies it in an unexpected way, it could result in corrupted data that might even crash the application. + + The example code shows how to send data to script for one time read only consumption. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="OneTimeShareBuffer"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_2"::: + + + + + LaunchingExternalUriScheme is raised when a navigation request is made to a URI scheme that is registered with the OS. + + + The event handler may suppress the default dialog or replace the default dialog with a custom dialog. + If a is not taken on the event args, the external URI scheme launch is blocked until the event handler returns. + If a deferral is taken, the external URI scheme launch is blocked until the is completed. + The host also has the option to cancel the URI scheme launch. + + The and events will be raised, regardless of whether the property is set to true or false. + The event will be raised with the property set to false and the property set to regardless of whether the host sets the property. + The , and events will not be raised for this navigation to the external URI scheme regardless of the property. + The event will be raised after the event and before the event. + + The default will also be updated upon navigation to an external URI scheme. + If a setting on the interface has been changed, navigating to an external URI scheme will trigger the to update. + + The WebView2 may not display the default dialog based on user settings, browser settings, and whether the origin is determined as a [trustworthy origin](https://w3c.github.io/webappsec-secure-contexts#potentially-trustworthy-origin); however, the event will still be raised. + If the request is initiated by a cross-origin frame without a user gesture, the request will be blocked and the `LaunchingExternalUriScheme` event will not be raised. A URI scheme may be blocked for safety reasons. In this case the `LaunchingExternalUriScheme` event will not be raised. The default dialog may show an "always allow" checkbox which allows the user to opt-in to relaxed security (i.e. skipping future default dialogs) for the combination of the URI scheme and the origin of the page initiating this external URI scheme launch. The checkbox is offered so long as the group policy to show the checkbox is not explicitly disabled and there is a trustworthy initiating origin. If the user has checked this box, future attempts to launch this URI scheme will still raise the event. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="LaunchingExternalUriScheme"::: + + + + + Desired of a WebView. + + + An app may set to indicate desired memory consumption level of WebView. + Scripts will not be impacted and continue to run. + This is useful for inactive apps that still want to run scripts and/or keep network connections alive and therefore could not call and to reduce memory consumption. + These apps can set memory usage target level to when the app becomes inactive, and set back to when the app becomes active. + + It is not necessary to set CoreWebView2Controller's IsVisible property to false when setting the property. + + It is a best effort operation to change memory usage level, and the API will return before the operation completes. + + Setting the level to could potentially cause memory for some WebView browser processes to be swapped out to disk in some circumstances. It is a best effort to reduce memory usage as much as possible. + If a script runs after its related memory has been swapped out, the memory will be swapped back in to ensure the script can still run, but performance might be impacted. + Therefore, the app should set the level back to when the app becomes active again. Setting memory usage target level back to normal will not happen automatically. + + An app should choose to use either the combination of and or the combination of setting MemoryUsageTargetLevel to and . It is not advisable to mix them. + Trying to set while suspended will be ignored. + The and methods will change the . + will automatically set to while on suspended WebView will automatically set to . + Calling when the WebView is not suspended would not change . + + + + + The unique identifier of the main frame. It's the same kind of ID as with the and . + + + FrameId may not be valid if has not done any navigation. It's safe to get this value during or after the first event. Otherwise, it could return the invalid frame Id 0. + + + + + Runs JavaScript code from the javaScript parameter in the current top-level document rendered in the WebView, The result of the execution is returned asynchronously in the object which has methods and properties to obtain the successful result of script execution as well as any unhandled JavaScript exceptions. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScriptWithResult"::: + + + + + NotificationReceived is raised when a non-persistent notification is received. + + + + + SaveAsUIShowing is raised when browser trys to open a save as dialog. It includes opening dialog manually from context menu or programmatically from . + + + + + + Async method to programmatically trigger a Save As action for the currently loaded document. + + It opens a system modal dialog by default. If the property is `TRUE`, the system dialog is not opened. This method can return . + + + + + + This event will be raised during system FileTypePolicy checking the dangerous file extension list. + + + Developers can specify their own logic for determining whether to allow a particular type of file to be saved from the document origin URI. Developers can also determine the save decision based on other criteria. Here are two properties in to manage the decision, and . + Table of Properties' value and result: + + + + CancelSave + SuppressDefaultPolicy + Result + + + False + False + Perform the default policy check. It may show the security warning UI if the file extension is dangerous. + + + False + True + Skip the default policy check and the possible security warning. Start saving or downloading. + + + True + Any + Skip the default policy check and the possible security warning. Abort save or download. + + + + + + + ScreenCaptureStarting event is raised when the [Screen Capture API](https://www.w3.org/TR/screen-capture/) is requested by the user using getDisplayMedia(). + + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + Represents a certificate. Gives access to a certificate's metadata. + + + + + Converts this to a X509Certificate2. + + + An object created using PEM encoded data from + this object. + + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + Subject of the certificate. + + + + + Name of the certificate authority that issued the certificate. + + + + + Base64 encoding of DER encoded serial number of the certificate. Read more about DER at [RFC 7468 DER](https://tools.ietf.org/html/rfc7468#appendix-B). + + + + + Display name for a certificate. + + + + + Returns list of PEM encoded certificate issuer chain. In this list first element is the current certificate followed by intermediate1, intermediate2...intermediateN-1. Root certificate is the last element in the list. + + + + + PEM encoded data for the certificate. Returns Base64 encoding of DER encoded certificate. Read more about PEM at [RFC 1421 Privacy Enhanced Mail](https://tools.ietf.org/html/rfc1421). + + + + + Represents a client certificate. Gives access to a certificate's metadata. + + + + + Converts this to a X509Certificate2. + + + An object created using PEM encoded data from + this object. + + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + Subject of the certificate. + + + + + Name of the certificate authority that issued the certificate. + + + + + Base64 encoding of DER encoded serial number of the certificate. Read more about DER at [RFC 7468 DER](https://tools.ietf.org/html/rfc7468#appendix-B). + + + + + Display name for a certificate. + + + + + Returns list of PEM encoded client certificate issuer chain. In this list first element is the current certificate followed by intermediate1, intermediate2...intermediateN-1. Root certificate is the last element in the list. + + + + + Kind of a certificate. See for descriptions. + + + + + PEM encoded data for the certificate. Returns Base64 encoding of DER encoded certificate. Read more about PEM at [RFC 1421 Privacy Enhanced Mail](https://tools.ietf.org/html/rfc1421). + + + + + This class is the owner of the object, and + provides support for resizing, showing and hiding, focusing, and other + functionality related to windowing and composition. + + + The owns the , and if all references to the go away, the WebView will be closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + + + Gets the associated with this . + + + + + + Moves focus into WebView. + + The reason for moving focus. + + WebView will get focus and focus will be set to correspondent element in the page hosted in the WebView. For reason, focus is set to previously focused element or the default element if no previously focused element exists. For reason, focus is set to the first element. For reason, focus is set to the last element. WebView changes focus through user interaction including selecting into a WebView or Tab into it. For tabbing, the app runs MoveFocus with or to align with Tab and Shift+Tab respectively when it decides the WebView is the next tabbable element. + + + + + Determines whether to show or hide the WebView. + + + If IsVisible is set to false, the WebView is transparent and is not rendered. However, this does not affect the window containing the WebView (the ParentWindow parameter that was passed to or ). + If you want that window to disappear too, run the corresponding Hide method from the UI framework on it directly in addition to modifying this. + WebView as a child window does not get window messages when the top window is minimized or restored. For performance reasons, developers should set the IsVisible property of the WebView to false when the app window is minimized and back to true when the app window is restored. The app window does this by handling SIZE_MINIMIZED and SIZE_RESTORED command upon receiving WM_SIZE message. There are CPU and memory benefits when the page is hidden. For instance Chromium has code that throttles activities on the page like animations and some tasks are run less frequently. Similarly, WebView2 will purge some caches to reduce memory usage. + + + + + + Gets or sets the WebView bounds. + + + Bounds are relative to the . The app has two ways to position a WebView: + + + Create a child HWND that is the WebView parent HWND. Position the window where the WebView should be. Use (0, 0) for the top-left corner (the offset) of the Bounds of the WebView. + + + Use the top-most window of the app as the WebView parent HWND. For example, to position ebView correctly in the app, set the top-left corner of the Bounds of the WebView. + + + + The values of Bounds are limited by the coordinate space of the host. + + + + + Gets or sets the zoom factor for the WebView. + + + Note that changing zoom factor may cause window.innerWidth or window.innerHeight and page layout to change. A zoom factor that is applied by the host by setting this ZoomFactor property becomes the new default zoom for the WebView. This zoom factor applies across navigations and is the zoom factor WebView is returned to when the user presses Ctrl+0. When the zoom factor is changed by the user (resulting in the app receiving ), that zoom applies only for the current page. Any user applied zoom is only for the current page and is reset on a navigation. Specifying a ZoomFactor less than or equal to 0 is not allowed. WebView also has an internal supported zoom factor range. When a specified zoom factor is out of that range, it is normalized to be within the range, and a event is raised for the real applied zoom factor. When this range normalization happens, this reports the zoom factor specified during the previous modification of the ZoomFactor property until the event is received after WebView applies the normalized zoom factor. + + + + + Gets the parent window provided by the app or sets the parent window that this WebView is using to render content. + + + It initially returns the ParentWindow passed into or . Setting the property causes the WebView to re-parent the main WebView window to the newly provided window. + + + + + ZoomFactorChanged is raised when the property changes. + + + The event may be raised because the property was modified, or due to the user manually modifying the zoom. When it is modified using the property, the internal zoom factor is updated immediately and no ZoomFactorChanged event is raised. WebView associates the last used zoom factor for each site. It is possible for the zoom factor to change when navigating to a different page. When the zoom factor changes due to a navigation change, the ZoomFactorChanged event is raised right after the event. + + + + + + MoveFocusRequested is raised when user tries to tab out of the WebView. + + + The focus of the WebView has not changed when this event is raised. + + + + + GotFocus is raised when WebView gets focus. + + + + + LostFocus is raised when WebView loses focus. + + + In the case where event is raised, the focus is still on WebView when event is raised. LostFocus is only raised afterwards when code of the app or default action of event sets focus away from WebView. + + + + + AcceleratorKeyPressed is raised when an accelerator key or key combo is pressed or released while the WebView is focused. + + + A key is considered an accelerator if either of the following conditions are true: + + + + Ctrl or Alt is currently being held. + + + The pressed key does not map to a character. + + + + A few specific keys are never considered accelerators, such as Shift. The Escape key is always considered an accelerator. + + Autorepeated key events caused by holding the key down will also raise this event. Filter out the auto-repeated key events by verifying or . + + In windowed mode, this event is synchronous. Until you set to true or the event handler returns, the browser process is blocked and outgoing cross-process COM calls will fail with RPC_E_CANTCALLOUT_ININPUTSYNCCALL. All methods work, however. + + In windowless mode, the event is asynchronous. Further input do not reach the browser until the event handler returns or is set to true, but the browser process is not blocked, and outgoing COM calls work normally. + + It is recommended to set to true as early as you are able to know that you want to handle the accelerator key. + + + + + Updates and properties at the same time. + + The bounds to be updated. + The zoom factor to be updated. + + This operation is atomic from the perspective of the host. After returning from this function, the and properties are both updated if the function is successful, or neither is updated if the function fails. If and are both updated by the same scale (for example, and are both doubled), then the page does not display a change in window.innerWidth or window.innerHeight and the WebView renders the content at the new size and zoom without intermediate renderings. This function also updates just one of or by passing in the new value for one and the current value for the other. + + + + + Tells WebView that the main WebView parent (or any ancestor) HWND moved. + + + This is a notification separate from . This is needed for accessibility and certain dialogs in WebView to work correctly. + + + + + Closes the WebView and cleans up the underlying browser instance. + + + Cleaning up the browser instance releases the resources powering the WebView. The browser instance is shut down if no other WebViews are using it. + + After running Close, all methods fail and event handlers stop running. Specifically, the WebView releases the associated references to any associated event handlers when Close is run. + + Close is implicitly run when the loses the final reference and is destructed. But it is best practice to explicitly run Close to avoid any accidental cycle of references between the WebView and the app code. Specifically, if you capture a reference to the WebView in an event handler you create a reference cycle between the WebView and the event handler. Run Close to break the cycle by releasing all event handlers. But to avoid the situation, it is best to both explicitly run Close on the WebView and to not capture a reference to the WebView to ensure the WebView is cleaned up correctly. Close is synchronous and won't trigger the beforeunload event. + + + + + Gets or sets the WebView default background color. + + + The `DefaultBackgroundColor` is the color that renders underneath all web content. This means WebView renders this color when there is no web content loaded such as before the initial navigation or between navigations. This also means web pages with undefined css background properties or background properties containing transparent pixels will render their contents over this color. Web pages with defined and opaque background properties that span the page will obscure the `DefaultBackgroundColor` and display normally. The default value for this property is white to resemble the native browser experience. Currently this API only supports opaque colors and transparency. It will fail for colors with alpha values that don't equal 0 or 255 ie. translucent colors are not supported. It also does not support transparency on Windows 7. On Windows 7, setting DefaultBackgroundColor to a Color with an Alpha value other than 255 will result in failure. On any OS above Win7, choosing a transparent color will result in showing hosting app content. This means webpages without explicit background properties defined will render web content over hosting app content. + This property may also be set via the `WEBVIEW2_DEFAULT_BACKGROUND_COLOR` environment variable. There is a known issue with background color where just setting the color by property can still leave the app with a white flicker before the `DefaultBackgroundColor` property takes effect. Setting the color via environment variable solves this issue. The value must be a hex value that can optionally prepend a 0x. The value must account for the alpha value which is represented by the first 2 digits. So any hex value fewer than 8 digits will assume a prepended 00 to the hex value and result in a transparent color. `DefaultBackgroundColor` will return the result of this environment variable even if it has not been set directly. This environment variable can only set the `DefaultBackgroundColor` once. Subsequent updates to background color must be done by setting the property. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DefaultBackgroundColor"::: + + + + + Gets or sets the WebView rasterization scale. + + + The rasterization scale is the combination of the monitor DPI scale and text scaling set by the user. This value should be updated when the DPI scale of the app's top level window changes (i.e. monitor DPI scale changes or the window changes monitor) or when the text scale factor of the system changes. + Rasterization scale applies to the WebView content, as well as popups, context menus, scroll bars, and so on. Normal app scaling scenarios should use the property or method. + + + + + Determines whether the WebView will detect monitor scale changes. + + + ShouldDetectMonitorScaleChanges property determines whether the WebView attempts to track monitor DPI scale changes. When true, the WebView will track monitor DPI scale changes, update the property, and fire event. When false, the WebView will not track monitor DPI scale changes, and the app must update the property itself. event will never raise when ShouldDetectMonitorScaleChanges is false. Apps that want to set their own rasterization scale should set this property to false to avoid the WebView2 updating the property to match the monitor DPI scale. + + + + + Gets or sets the WebView bounds mode. + + + BoundsMode affects how setting the and properties work. Bounds mode can either be in mode or mode. + + + + + RasterizationScaleChanged is raised when the property changes. + + + The event is raised when the Webview detects that the monitor DPI scale has changed, is true, and the Webview has changed the property. + + + + + + Gets or sets the WebView allow external drop property. + + + The AllowExternalDrop is to configure the capability that dropping files into webview2 is allowed or permitted. The default value is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleAllowExternalDrop"::: + + + + + Used to manage profile options that created by . + + + Used to manage profile options that created by . + + + + + Manages the value of the controller's script locale. + + + The ScriptLocale property is to specify the default script + locale. It sets the default locale for all Intl JavaScript APIs and + other JavaScript APIs that depend on it, namely + Intl.DateTimeFormat() which affects string formatting like in + the time/date formats.The intended locale value is in the format of + BCP 47 Language Tags. More information can be found from [IETF + BCP47](https://www.ietf.org/rfc/bcp/bcp47.html ). The default value + for ScriptLocale will be depend on the WebView2 language and OS + region. If the language portions of the WebView2 language and OS + region match, then it will use the OS region. Otherwise, it will use + the WebView2 language. + + + OS Region + WebView2 Language + Default WebView2 ScriptLocale + + + en-GB + en-US + en-GB + + + es-MX + en-US + en-US + + + en-US + en-GB + en-US + + + You can set the ScriptLocale to the empty string to get the default ScriptLocale value. + Use OS specific APIs to determine the OS region to use with this property if you always want to match with the OS + region. For example: + + CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture; + return cultureInfo.Name + + + + + + Manage the name of the controller's profile. + + + The ProfileName property is to specify a profile name, which is only allowed to contain the following ASCII characters. It has a maximum length of 64 characters excluding the null-terminator. It is ASCII case insensitive. + + * alphabet characters: a-z and A-Z + * digit characters: 0-9 + * and '#', '@', '$', '(', ')', '+', '-', '_', '~', '.', ' ' (space). + + Note: the text must not end with a period '.' or ' ' (space). And, although upper-case letters are allowed, they're treated just as lower-case counterparts because the profile name will be mapped to the real profile directory path on disk and Windows file system handles path names in a case-insensitive way. + + + + + Manage the controller's InPrivate mode. + + + + + Provides a set of properties that are used to manage a . + + + + + Converts this to a System.Net.Cookie. + + + An object whose , , , , , , and , matches + those , , , + , , , and of this object. + + + The values of the properties other than those + specified above remain their default values. + + + + + + The expiration date and time for the cookie since the UNIX epoch. + + + Setting the Expires property to + makes this a session cookie, which is its default value. + + + + + Get or sets the cookie name. + + + + + Gets or sets the cookie value. + + + + + Gets the domain for which the cookie is valid. + + + The default value is the host that this cookie has been received from. Note that, for instance, .bing.com, bing.com, and www.bing.com are considered different domains. + + + + + Gets the path for which the cookie is valid. + + + The default value is "/", which means this cookie will be sent to all pages on the . + + + + + Determines whether this cookie is http-only. + + + + + Determines the SameSite status of the cookie which represents the enforcement mode of the cookie. + + + The default value is . + + + + + Gets or sets the security level of this cookie. + + + + + Determines whether this is a session cookie. The default value is false. + + + + + Creates, adds or updates, gets, or or view the cookies. + + + The changes would apply to the context of the user profile. That is, other WebViews under the same user profile could be affected. + + + + + Creates a CoreWebView2Cookie object whose params matches those of the given System.Net.Cookie. + + + A System.Net.Cookie whose params to be used to create a CoreWebView2Cookie. + + + An object whose , , , , , , and , matches those , , , , , , and of the given object. + + + The default value for the + property of the returned object is + . + + + + + + Creates a cookie object with a specified name, value, domain, and path. + + + One can set other optional properties after cookie creation. This only creates a cookie object and it is not added to the cookie manager until you call . name that starts with whitespace(s) is not allowed. + + The name for the to be created. It cannot start with whitespace(s). + + + + + + + Creates a cookie whose params matches those of the specified cookie. + + + + + Gets a list of cookies matching the specific URI. + + + You can modify the cookie objects by calling , and the changes will be applied to the webview. + + If uri is empty string or null, all cookies under the same profile are returned. + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetCookies"::: + + + + + Adds or updates a cookie with the given cookie data; may overwrite cookies with matching name, domain, and path if they exist. + + The to be added or updated. + + This method will fail if the domain of the given cookie is not specified. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AddOrUpdateCookie"::: + + + + + Deletes a cookie whose name and domain/path pair match those of the specified cookie. + + + + + Deletes cookies with matching name and uri. + + The name for the cookies to be deleted is required. + If uri is specified, deletes all cookies with the given name where domain and path match provided URI. + + + + Deletes cookies with matching name and domain/path pair. + + The name for the cookies to be deleted is required. + If domain is specified, deletes only cookies with the exact domain. + If path is specified, deletes only cookies with the exact path. + + + + Deletes all cookies under the same profile. + + + This could affect other WebViews under the same user profile. + + + + + Represents the registration of a custom scheme with the . + + + This allows the WebView2 app to be able to handle event for requests with the + specified scheme and be able to navigate the WebView2 to the custom + scheme. Once the environment is created, the registrations are valid and + immutable throughout the lifetime of the associated WebView2s' browser + process and any WebView2 environments sharing the browser process must be + created with identical custom scheme registrations, otherwise the + environment creation will fail. Any further attempts to register the same + scheme will fail during environment creation. The URIs of registered + custom schemes will be treated similar to http URIs for their origins. + They will have tuple origins for URIs with host and opaque origins for + URIs without host as specified in [7.5 Origin - HTML Living Standard](https://html.spec.whatwg.org/multipage/origin.html) For event, the cases of request + URIs and filter URIs with custom schemes will be normalized according to + generic URI syntax rules. Any non-ASCII characters will be preserved. The + registered custom schemes also participate in [CORS](https://developer.mozilla.org/docs/Web/HTTP/CORS) and adheres to + [CSP](https://developer.mozilla.org/docs/Web/HTTP/CSP). The app needs to + set the appropriate access headers in its event handler to allow CORS + requests. + + + custom-scheme-with-host://hostname/path/to/resource has origin of + custom-scheme-with-host://hostname. + custom-scheme-without-host:path/to/resource has origin of + custom-scheme-without-host:path/to/resource. + + + + + The name of the custom scheme to register. + + + + + Whether the sites with this scheme will be treated as a [Secure + Context](https://developer.mozilla.org/docs/Web/Security/Secure_Contexts) + like an HTTPS site. + + + + + Set this property to true if the URIs with this custom scheme + will have an authority component (a host for custom schemes). + Specifically, if you have a URI of the following form you should set the + HasAuthorityComponent value as listed. + + + + URI + Recommended HasAuthorityComponent value + + + custom-scheme-with-authority://host/path + true + + + custom-scheme-without-authority:path + false + + + + + When this property is set to true, the URIs with this scheme will + be interpreted as having a [scheme and + host](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-tuple) + origin similar to an http URI. Note that the port and user information + are never included in the computation of origins for custom schemes. If + this property is set to false, URIs with this scheme will have an + [opaque + origin](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque) + similar to a data URI. This property is false by default. Note: + For custom schemes registered as having authority component, navigations + to URIs without authority of such custom schemes will fail. However, if + the content inside WebView2 references a subresource with a URI that + does not have an authority component, but of a custom scheme that is + registered as having authority component, the URI will be interpreted as + a relative path as specified in + [RFC3986](https://www.rfc-editor.org/rfc/rfc3986). For example, + custom-scheme-with-authority:path will be interpreted as + custom-scheme-with-authority://host/path. However, this behavior + cannot be guaranteed to remain in future releases so it is recommended + not to rely on this behavior. + + + + + List of origins that are allowed to issue requests with the custom + scheme, such as XHRs and subresource requests that have an Origin + header. + + + The origin of any request (requests that have the [Origin + header](https://developer.mozilla.org/docs/Web/HTTP/Headers/Origin)) to + the custom scheme URI needs to be in this list. No-origin requests are + requests that do not have an Origin header, such as link navigations, + embedded images and are always allowed. Note that cross-origin + restrictions still apply. From any opaque origin (Origin header is + null), no cross-origin requests are allowed. If the list is empty, no + cross-origin request to this scheme is allowed. Origins are specified as + a string in the format of scheme://host:port. The origins are + string pattern matched with * (matches 0 or more characters) and + ? (matches 0 or 1 character) wildcards just like the URI matching + in the + API. For example, http://*.example.com:80. + + Here's a set of examples of what is allowed or not: + + + + Request URI + Originating URL + AllowedOrigins + Allowed + + + custom-scheme:request + https://www.example.com + {"https://www.example.com"} + Yes + + + custom-scheme:request + https://www.example.com + {"https://*.example.com"} + Yes + + + custom-scheme:request + https://www.example.com + {"https://www.example2.com"} + No + + + custom-scheme-with-authority://host/path + custom-scheme-with-authority://host2 + {""} + No + + + custom-scheme-with-authority://host/path + custom-scheme-with-authority2://host + {"custom-scheme-with-authority2://*"} + Yes + + + custom-scheme-without-authority:path + custom-scheme-without-authority:path2 + {"custom-scheme-without-authority:*"} + No + + + custom-scheme-without-authority:path + custom-scheme-without-authority:path2 + {"*"} + Yes + + + + + + + Initializes a new instance of the CoreWebView2CustomSchemeRegistration + class. + + + The name of the custom scheme to register. + + + + + Represents a download operation. Gives access to a download's metadata and supports a user canceling, pausing, or resuming a download. + + + + + The estimated end time of the download. + + + + + The total bytes to receive count. + + + + + The URI of the download. + + + + + The Content-Disposition header value from the download's HTTP response. If none, the value is an empty string. + + + + + MIME type of the downloaded content. + + + + + The number of bytes that have been written to the download file. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BytesReceivedChanged"::: + + + + + The absolute path to the download file, including file name. + + + Host can change this from . + + + + + The state of the download. A download can be in progress, interrupted, or completed. + + + See for descriptions of states. + + + + + The reason why connection with file host was broken. + + + See for descriptions of reasons. + + + + + Returns true if an interrupted download can be resumed. + + + Downloads with the following interrupt reasons may automatically resume without you calling any methods: , , . In these cases progress may be restarted with set to 0. + + + + + Event raised when the bytes received count is updated. + + + + + Event raised when the estimated end time changes. + + + + + Event raised when the state of the download changes. + + + Use to get the current state, and to get the reason if the download is interrupted. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="StateChanged"::: + + + + + Cancels the download. + + + If canceled, the default download dialog shows that the download was canceled. Host should use if download should be canceled without displaying the default download dialog. + + + + + Pauses the download. + + + If paused, the default download dialog shows that the download is paused. No effect if download is already paused. Pausing a download changes the state from in progress to interrupted, with interrupt reason set to . + + + + + Resumes a paused download. May also resume a download that was interrupted for another reason if returns true. + + + Resuming a download changes the state from interrupted to in progress. + + + + + This represents the WebView2 Environment. + + + WebViews created from an environment run on the Browser process specified with environment parameters and objects created from an environment should be used in the same environment. Using it in different environments are not guaranteed to be compatible and may fail. + + + + + + + + + + + + + + + + + + + Creates a WebView2 Environment using the installed or a custom WebView2 Runtime version. + + + The relative path to the folder that contains a custom version of WebView2 Runtime. + + To use a fixed version of the WebView2 Runtime, pass the + folder path that contains the fixed version of the WebView2 Runtime + to browserExecutableFolder. BrowserExecutableFolder supports both relative + (to the application's executable) and absolute file paths. To create WebView2 controls + that use the installed version of the WebView2 Runtime that exists on + user machines, pass a null or empty string to + browserExecutableFolder. In this scenario, the API tries to + find a compatible version of the WebView2 Runtime that is installed + on the user machine (first at the machine level, and then per user) + using the selected channel preference. The path of fixed version of + the WebView2 Runtime should not contain \Edge\Application\. When + such a path is used, the API fails with ERROR_NOT_SUPPORTED. + + + + The user data folder location for WebView2. + + The path is either an absolute file path or a relative file path + that is interpreted as relative to the compiled code for the + current process. The default user data folder {Executable File + Name}.WebView2 is created in the same directory next to the + compiled code for the app. WebView2 creation fails if the compiled + code is running in a directory in which the process does not have + permission to create a new directory. The app is responsible to + clean up the associated user data folder when it is done. + + + + Options used to create WebView2 Environment. + + As a browser process may be shared among WebViews, WebView creation + fails if the specified options does not match the options of + the WebViews that are currently running in the shared browser + process. + + + + + The default channel search order is the WebView2 Runtime, Beta, Dev, and + Canary. When an override WEBVIEW2_RELEASE_CHANNEL_PREFERENCE environment + variable or applicable releaseChannelPreference registry value is set to + 1, the channel search order is reversed. + + + To use a fixed version of the WebView2 Runtime, pass the relative + folder path that contains the fixed version of the WebView2 Runtime + to browserExecutableFolder. To create WebView2 controls that + use the installed version of the WebView2 Runtime that exists on + user machines, pass a null or empty string to + browserExecutableFolder. In this scenario, the API tries to + find a compatible version of the WebView2 Runtime that is installed + on the user machine (first at the machine level, and then per user) + using the selected channel preference. The path of fixed version of + the WebView2 Runtime should not contain \Edge\Application\. When + such a path is used, the API fails with the following error. + + + The , , and may be + overridden by values either specified in environment variables or in + the registry. + + + When creating a the following environment variables are verified. + + + + WEBVIEW2_BROWSER_EXECUTABLE_FOLDER + + + WEBVIEW2_USER_DATA_FOLDER + + + WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS + + + WEBVIEW2_RELEASE_CHANNEL_PREFERENCE + + + + If browser executable folder or user data folder is specified in an + environment variable or in the registry, the specified or values are overridden. If additional browser + arguments are specified in an environment variable or in the + registry, it is appended to the corresponding value in the specified + . + + + While not strictly overrides, additional environment variables may be set. + + + + Value + Description + + + WEBVIEW2_WAIT_FOR_SCRIPT_DEBUGGER + + When found with a non-empty value, this indicates that the WebView + is being launched under a script debugger. In this case, the WebView + issues a Page.waitForDebugger CDP command that runs the + script inside the WebView to pause on launch, until a debugger + issues a corresponding Runtime.runIfWaitingForDebugger CDP + command to resume the runtime. + Note that this environment variable does not have a registry key equivalent. + + + + WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER + + When found with a non-empty value, it indicates that the WebView is + being launched under a script debugger that also supports host apps + that use multiple WebViews. The value is used as the identifier for + a named pipe that is opened and written to when a new WebView is + created by the host app. The payload should match the payload of the + remote-debugging-port JSON target and an external debugger + may use it to attach to a specific WebView instance. The format of + the pipe created by the debugger should be + \\.\pipe\WebView2\Debugger\{app_name}\{pipe_name}, where the + following are true. + + + {app_name} is the host app exe file name, for example, WebView2Example.exe + {pipe_name} is the value set for WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER + + + To enable debugging of the targets identified by the JSON, you must + set the WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS environment + variable to send --remote-debugging-port={port_num}, where + the following is true. + + + {port_num} is the port on which the CDP server binds. + + + If both WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER and + WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS environment variables, + the WebViews hosted in your app and associated contents may exposed + to 3rd party apps such as debuggers. Note that this environment + variable does not have a registry key equivalent. + + + + + If none of those environment variables exist, then the registry is examined + next. + + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\BrowserExecutableFolder "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\ReleaseChannelPreference "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\AdditionalBrowserArguments "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\UserDataFolder "{AppId}"="" + + + + Use a group policy under Administrative Templates > + Microsoft Edge WebView2 to configure browser executable folder + and release channel preference. + + + + Value + Description + + + ERROR_DISK_FULL + + In the unlikely scenario where some instances of WebView are open during a + browser update, the deletion of the previous WebView2 Runtime may be + blocked. To avoid running out of disk space, a new WebView creation fails + with this error if it detects that too many previous WebView2 + Runtime versions exist. + + + + COREWEBVIEW2_MAX_INSTANCES + + The default maximum number of WebView2 Runtime versions allowed is 20. + To override the maximum number of the previous WebView2 Runtime versions + allowed, set the value of the following environment variable. + + + + ERROR_PRODUCT_UNINSTALLED + + If the Webview depends upon an installed WebView2 Runtime version and it is + uninstalled, any subsequent creation fails with this error. + + + + + First verify with Root as HKLM and then HKCU. AppId is first set to + the Application User Model ID of the process, then if no corresponding + registry key, the AppId is set to the compiled code name of the process, + or if that is not a registry key then *. If an override registry key is + found, use the browserExecutableFolder and userDataFolder registry + values as replacements and append additionalBrowserArguments registry + values for the corresponding values in the provided . + + + + + + Gets the browser version info including channel name if it is not the stable channel or WebView2 Runtime. + + + The relative path to the folder that contains the WebView2 Runtime. + + + WebView2 Runtime installation is missing. + + + + + Gets the browser version info including channel name if it is not the stable channel or WebView2 Runtime. + + + The relative path to the folder that contains the WebView2 Runtime. + + + The environment options used to create the environment. + + + WebView2 Runtime installation is missing. + + + Browser version info includes channel name if it is not the WebView2 Runtime. + Channel names are Beta, Dev, and Canary. The format of the return string + matches the format of . + If an override exists for BrowserExecutableFolder, ReleaseChannels, + or ChannelSearchKind, the override is used. The presence of an override + can result in a different channel used than the one expected based on the environment + options object. BrowserExecutableFolder takes precedence over the + other options. See + for more details on overrides. If an override is not specified, then the + parameters passed to GetAvailableBrowserVersionString are used. + The method fails if the loader is unable to find an installed WebView2 + Runtime or non-stable Microsoft Edge installation. + + + + + Compares two instances of browser versions correctly and returns an integer that indicates whether the first instance is older, the same as, or newer than the second instance. + + + One of the version strings to compare. + + + The other version string to compare. + + + An integer that indicates whether the first instance is older, the same as, or newer than the second instance. + + + Value Type + Condition + + + Less than zero + version1 is older than version2. + + + Zero + version1 is the same as version2. + + + Greater than zero + version1 is newer than version2. + + + + + + + Creates a new object. + + The request URI. + The HTTP request method. + + The raw request header string delimited by CRLF (optional in last header). + + uri parameter must be absolute URI. It's also possible to create this object with null headers string and then use the to construct the headers line by line. + + + + + + Creates a new object, + which can be passed as a parameter in and function for multiple profiles + support. + + + A that can be + passed when calling and . + + + The options is a settable property while the default for profile + name is an empty string and the default value for is + false. The profile will be created on disk or opened when calling + CreateCoreWebView2ControllerWithOptions no matter InPrivate mode is + enabled or not, and it will be released in memory when the + corresponding is closed but + still remain on disk. As WebView2 is built on top of Edge browser, + it follows Edge's behavior pattern. To create an InPrivate WebView, + we get an off-the-record profile (an InPrivate profile) from a + regular profile, then create the WebView with the off-the-record + profile. Also the profile name can be reused. + + + + + Asynchronously creates a new object. + + The HWND in which the WebView should be displayed and from which receive input. + + The options contains profileName and inPrivate parameters that could be used to create CoreWebView2Profile, and it can be used to create multiple WebViews with multiple profiles under a single user data directory. + + + Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + + Asynchronously creates a new object. + + The HWND in which the WebView should be displayed and from which receive input. + + The options contains profileName and inPrivate parameters that could be used to create CoreWebView2Profile, and it can be used to create multiple WebViews with multiple profiles under a single user data directory. + + + Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + + Set the path of the folder containing the `WebView2Loader.dll`. + + The path of the folder containing the `WebView2Loader.dll`. + + Thrown when `WebView2Loader.dll` has been successfully loaded. + + + This function allows you to set the path of the folder containing the `WebView2Loader.dll`. This should be the path of a folder containing `WebView2Loader.dll` and not a path to the `WebView2Loader.dll` file itself. + Note that the WebView2 SDK contains multiple `WebView2Loader.dll` files for different CPU architectures. When specifying folder path, you must specify one containing a `WebView2Loader.dll` module with a CPU architecture matching the current process CPU architecture. + This function is used to load the `WebView2Loader.dll` module during calls to any other static methods on `CoreWebView2Environment`. So, the path should be specified before any other API is called in `CoreWebView2Environment` class. Once `WebView2Loader.dll` is successfully loaded this function will throw an InvalidOperationException exception. + The path can be relative or absolute. Relative paths are relative to the path of the `Microsoft.Web.WebView2.Core.dll` module. + If the `WebView2Loader.dll` file does not exist in that path or LoadLibrary cannot load the file, or LoadLibrary fails for any other reason, an exception corresponding to the LoadLibrary failure is thrown when any other API is called in `CoreWebView2Environment` class. For instance, if the file cannot be found a `DllNotFoundException` exception will be thrown. + + + + + Gets the browser version info of the current , including channel name if it is not the stable channel. + + + It matches the format of the method. Channel names are beta, dev, and canary. + + + + + NewBrowserVersionAvailable is raised when a newer version of the WebView2 Runtime is installed and available using WebView2. + + + To use the newer version of the browser you must create a new environment and WebView. The event is only raised for new version from the same WebView2 Runtime from which the code is running. When not running with installed WebView2 Runtime, no event is raised. + + Because a user data folder is only able to be used by one browser process at a time, if you want to use the same user data folder in the WebViews using the new version of the browser, you must close the environment and instance of WebView that are using the older version of the browser first. Or simply prompt the user to restart the app. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SubscribeToNewBrowserVersionAvailable"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NewBrowserVersionAvailable"::: + + + + + Asynchronously creates a new WebView. + + The HWND in which the WebView should be displayed and from which receive input. + + The WebView adds a child window to the provided window during WebView creation. Z-order and other things impacted by sibling window order are affected accordingly. + + + HWND_MESSAGE is a valid parameter for ParentWindow for an invisible WebView for Windows 8 and above. In this case the window will never become visible. You are not able to reparent the window after you have created the WebView. This is not supported in Windows 7 or below. Passing this parameter in Windows 7 or below will return ERROR_INVALID_WINDOW_HANDLE in the controller callback. + + + + It can also accept a which is created by as the second parameter for multiple profiles support. As WebView2 is built on top of Edge browser, it follows Edge's behavior pattern. To create an InPrivate WebView, we gets an off-the-record profile (an InPrivate profile) from a regular profile, then create the WebView with the off-the-record profile. Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + It is recommended that the application set Application User Model ID for the process or the application window. If none is set, during WebView creation a generated Application User Model ID is set to root window of ParentWindow. + + + + It is recommended that the app handles restart manager messages, to gracefully restart it in the case when the app is using the WebView2 Runtime from a certain installation and that installation is being uninstalled. For example, if a user installs a version of the WebView2 Runtime and opts to use another version of the WebView2 Runtime for testing the app, and then uninstalls the 1st version of the WebView2 Runtime without closing the app, the app restarts to allow un-installation to succeed. + + + + When the app retries CreateCoreWebView2ControllerAsync upon failure, it is recommended that the app restarts from creating a new WebView2 Environment. If a WebView2 Runtime update happens, the version associated with a WebView2 Environment may have been removed and causing the object to no longer work. Creating a new WebView2 Environment works since it uses the latest version. + + + + WebView creation fails if a running instance using the same user data folder exists, and the Environment objects have different . For example, if a WebView was created with one , an attempt to create a WebView with a different using the same user data folder fails. + + + + WebView creation can fail with `E_UNEXPECTED` if runtime does not have permissions to the user data folder. + + + + + + Creates a new object. + + HTTP response content as stream. + The HTTP response status code. + The HTTP response reason phrase. + The raw response header string delimited by newline. + + It is also possible to create this object with empty headers string and then use the to construct the headers line by line. + + + + + + Asynchronously creates a new WebView for use with visual hosting. + + The HWND in which the app will connect the visual tree of the WebView. + + ParentWindow will be the HWND that the app will receive pointer/mouse input meant for the WebView (and will need to use or to forward). If the app moves the WebView visual tree to underneath a different window, then it needs to set to update the new parent HWND of the visual tree. + + Set property on the created to provide a visual to host the browser's visual tree. + + It is recommended that the application set Application User Model ID for the process or the application window. If none is set, during WebView creation a generated Application User Model ID is set to root window of ParentWindow. + + It can also accept a which is created by as the second parameter for multiple profiles support. + + CreateCoreWebView2CompositionController is supported in the following versions of Windows: + + + Windows 11 + + + Windows 10 + + + Windows Server 2019 + + + Windows Server 2016 + + + + + + + Creates an empty . + + + The returned needs to be populated with all of the relevant info before calling . + + + + + BrowserProcessExited is raised when the collection of WebView2 Runtime processes for the browser process of this terminate due to browser process failure or normal shutdown (for example, when all associated WebViews are closed), after all resources have been released (including the user data folder). + + + Multiple app processes can share a browser process by creating their webviews from a with the same user data folder. When the entire collection of WebView2Runtime processes for the browser process exit, all associated objects receive the BrowserProcessExited event. Multiple processes sharing the same browser process need to coordinate their use of the shared user data folder to avoid race conditions and unnecessary waits. For example, one process should not clear the user data folder at the same time that another process recovers from a crash by recreating its WebView controls; one process should not block waiting for the event if other app processes are using the same browser process (the browser process will not exit until those other processes have closed their webviews too). + + Note this is an event from , not . The difference between BrowserProcessExited and is that BrowserProcessExited is raised for any browser process exit (expected or unexpected, after all associated processes have exited too), while is raised for unexpected process exits of any kind (browser, render, GPU, and all other types), or for main frame render process unresponsiveness. To learn more about the WebView2 Process Model, go to [Process model](/microsoft-edge/webview2/concepts/process-model). + + In the case the browser process crashes, both BrowserProcessExited and events are raised, but the order is not guaranteed. These events are intended for different scenarios. It is up to the app to coordinate the handlers so they do not try to perform reliability recovery while also trying to move to a new WebView2 Runtime version or remove the user data folder. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SubscribeToBrowserProcessExited"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BrowserProcessExited"::: + + + + + Creates the used by the method. + + + + + Gets the user data folder that all CoreWebView2s created from this environment are using. + + + This could be either the value passed in by the developer when creating the environment object or the calculated one for default handling. And will always be an absolute path. + + + + + ProcessInfosChanged is raised when a collection of WebView2 Runtime processes changed due to new process being detected or when a existing process gone away. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ProcessInfosChanged"::: + + + + + Returns the list of all using same user data folder except for crashpad process. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetProcessInfos"::: + + + + + Create a custom object to insert into the WebView context menu. + + + CoreWebView2 will rewind the icon stream before decoding. + There is a limit of 1000 active custom context menu items at a given time per . Attempting to create more before deleting existing ones will fail with ERROR_NOT_ENOUGH_QUOTA. It is recommended to reuse custom ContextMenuItems across CoreWebView2ContextMenuRequested events for performance. The created object's property will default to true and property will default to false. A will be assigned that's unique across active custom context menu items, but command ID values of deleted custom ContextMenuItems can be reassigned. + + + + + Gets the failure report folder that all CoreWebView2s created from this environment are using. + + + + + Create a shared memory based buffer with the specified size in bytes. + + + The buffer can be shared with web contents in WebView by calling or . + Once shared, the same content of the buffer will be accessible from both the app process and script in WebView. + Modification to the content will be visible to all parties that have access to the buffer. + The shared buffer is presented to the script as ArrayBuffer. All JavaScript APIs that work for ArrayBuffer including Atomics APIs can be used on it. + There is currently a limitation that only size less than 2GB is supported. + + + + + Returns a snapshot collection of corresponding to all currently running processes associated with this excludes crashpad process. This provides the same list of as what's provided in , but additionally provides a list of associated which are actively running (showing or hiding UI elements) in the renderer process. See for more information. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetProcessExtendedInfos"::: + + + + + Creates a object from a path that represents a Web [FileSystemFileHandle](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle). + + The path pointed by the file. + This must be a syntactically correct fully qualified path, but it is not checked here whether it currently points to a file. If an invalid path is passed, an `InvalidArgumentException` will be thrown. Any other state validation will be done when this handle is accessed from web content and will cause the DOM exceptions described in [FileSystemFileHandle methods](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle#instance_methods) if access operations fail + + + This is used to specify whether the Handle should be created with a Read-only or Read-and-write web permission. + For the `permission` value specified here, the DOM [PermissionStatus](https://developer.mozilla.org/docs/Web/API/PermissionStatus) property will be `[granted](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)` and the unspecified permission will be `[prompt](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)`. Therefore, the web content then does not need to call [requestPermission](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) for the permission that was specified before attempting the permitted operation, but if it does, the promise will immediately be resolved with 'granted' PermissionStatus without firing the event or prompting the user for permission. Otherwise, `requestPermission` will behave as the status of permission is currently `prompt`, which means the `PermissionRequested` event will fire or the user will be prompted. + Note: An exception to this is, if there is a parent directory handle that has broader permissions in the same page context than specified in here, the handle will automatically inherit the most permissive permission of the parent handle when posted to that page context. i.e. If there is already a `FileSystemDirectoryHandle` to `C:\foo` that has write permission on a page, even though a to file `C:\example\file.txt` may be created with permission, when posted to that page, write permission will be automatically granted to the created handle. + Additionally, the app must have the same OS permissions that have propagated to the [WebView2 browser process](/microsoft-edge/webview2/concepts/process-model) for the path it wishes to give the web content to read/write the file. Specifically, the WebView2 browser process will run in same user, package identity, and app container of the app, but other means such as security context impersonations do not get propagated, so such permissions that the app has, will not be effective in WebView2. + + + + An app needs to be mindful that this object, when posted to the web content, provides it with unusual access to OS file system via the Web FileSystem API! The app should therefore only post objects for paths that it wants to allow access to the web content and it is not recommended that the web content "asks" for this path. The app should also check the source property of the target to ensure that it is sending to the web content of intended origin. Once the object is passed to web content, if the content is attempting a read, the file must be existing and available to read similar to a file chosen by [open file picker](https://developer.mozilla.org/docs/Web/API/Window/showOpenFilePicker), otherwise the read operation will [throw a DOM exception](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle/getFile#exceptions). For write operations, the file does not need to exist as `FileSystemFileHandle` will behave as a file path chosen by [save file picker](https://developer.mozilla.org/docs/Web/API/Window/showSaveFilePicker) and will create or overwrite the file, but the parent directory structure pointed by the file must exist and an existing file must be available to write and delete or the write operation will [throw a DOM exception](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle/createWritable#exceptions). + + + + + Creates a object from a path that represents a Web [FileSystemDirectoryHandle](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle). + + The path pointed by the directory. + + This must be a syntactically correct fully qualified path, but it is not checked here whether it currently points to a directory. Any other state validation will be done when this handle is accessed from web content and will cause DOM exceptions if access operations fail. If an invalid path is passed, an `InvalidArgumentException` will be thrown. + + + This is used to specify whether the Handle should be created with a Read-only or Read-and-write web permission. + For the permission value specified here, the Web [PermissionStatus](https://developer.mozilla.org/docs/Web/API/PermissionStatus) will be `[granted](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)` and the unspecified permission will be `[prompt](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)`. Therefore, the web content then does not need to call [requestPermission](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) for the permission that was specified before attempting the permitted operation, but if it does, the promise will immediately be resolved with 'granted' PermissionStatus without firing the WebView2 event or prompting the user for permission. Otherwise, `requestPermission` will behave as the status of permission is currently `Prompt`, which means the `PermissionRequested` event will fire or the user will be prompted. + Note: An exception to this is, if there is a parent directory handle that has broader permissions in the same page context than specified in here, the handle will automatically inherit the most permissive permission of the parent handle when posted to that page context. i.e. If there is already a `FileSystemDirectoryHandle` to `C:\foo` that has write permission on a page, even though a to directory `C:\example\directory` may be created with permission, when posted to that page, write permission will be automatically granted to the created handle. + Additionally, the app must have the same OS permissions that have propagated to the [WebView2 browser process](/microsoft-edge/webview2/concepts/process-model) for the path it wishes to give the web content to make any operations on the directory. Specifically, the WebView2 browser process will run in same user, package identity, and app container of the app, but other means such as security context impersonations do not get propagated, so such permissions that the app has, will not be effective in WebView2. + + + + An app needs to be mindful that this object, when posted to the web content, provides it with unusual access to OS file system via the Web FileSystem API! The app should therefore only post objects for paths that it wants to allow access to the web content and it is not recommended that the web content "asks" for this path. The app should also check the source property of the target to ensure that it is sending to the web content of intended origin. Once the object is passed to web content, the path must point to a directory as if it was chosen via [directory picker](https://developer.mozilla.org/docs/Web/API/Window/showDirectoryPicker) otherwise any IO operation done on the `FileSystemDirectoryHandle` will throw a DOM exception. + + + + + Options used to create WebView2 Environment. + + + Default values will use your defaulted Edge WebView2 Runtime binaries and + user data folder. + + + + + + + + + + + + + Initializes a new instance of the CoreWebView2EnvironmentOptions class. + + + AdditionalBrowserArguments can be specified to change the behavior of + the WebView. + + + The default language that WebView will run with. + + + The version of the Edge WebView2 Runtime binaries required to be + compatible with the calling application. + + + Set to true if single sign on be enabled using the end user's OS primary + account. Defaults to false. + + + List of custom scheme registrations to be applied to the . + + + + + Initializes a new instance of the CoreWebView2EnvironmentOptions class. + + + AdditionalBrowserArguments can be specified to change the behavior of + the WebView. + + + The default language that WebView will run with. + + + The version of the Edge WebView2 Runtime binaries required to be + compatible with the calling application. + + + Set to true if single sign on be enabled using the end user's OS primary + account. Defaults to false. + + + List of custom scheme registrations to be applied to the . + + + Set to CoreWebView2ChannelSearchKind.LeastStable so that environment + creation searches for binaries from least to most stable: + Canary -> Dev -> Beta -> WebView2 Runtime. + Defaults to CoreWebView2RuntimeChannel.MostStable. + + + The release channels that are searched for during environment creation. + + + + + List of custom scheme registrations to be applied to the + + + + + Gets or sets the additional browser arguments to change the behavior of the WebView. + + + + The arguments are passed to the browser process as part of the command. For more information about using command-line switches with Chromium browser processes, navigate to [Run Chromium with Flags](https://aka.ms/RunChromiumWithFlags). The value appended to a switch is appended to the browser process, for example, in --edge-webview-switches=xxx the value is xxx. If you specify a switch that is important to WebView functionality, it is ignored, for example, --user-data-dir. Specific features are disabled internally and blocked from being enabled. If a switch is specified multiple times, only the last instance is used. + + + + A merge of the different values of the same switch is not attempted, except for disabled and enabled features. The features specified by --enable-features and --disable-features will be merged with simple logic: + + + + The features are the union of the specified features and built-in features. If a feature is disabled, it is removed from the enabled features list. + + + + + If you specify command-line switches and sets this property, the --edge-webview-switches value takes precedence and is processed last. If a switch fails to parse, the switch is ignored. The default state for the operation is to run the browser process with no extra flags. + + + Please note that calling this API twice will replace the previous value rather than appending to it. If there are multiple switches, there should be a space in between them. The one exception is if multiple features are being enabled/disabled for a single switch, in which case the features should be comma-separated. Ex. "--disable-features=feature1,feature2 --some-other-switch --do-something" + + + + + + Gets or sets the default display language for WebView. + + + It applies to browser UIs such as context menu and dialogs. It also applies to the accept-languages HTTP header that WebView sends to websites. The intended locale value is in the format of BCP 47 Language Tags. More information can be found from [IETF BCP47](https://www.ietf.org/rfc/bcp/bcp47.html). + + + + + Gets or sets the version of the WebView2 Runtime binaries required to be compatible with your app. + + + This defaults to the WebView2 Runtime version that corresponds with the version of the SDK the app is using. The format of this value is the same as the format of the property and other BrowserVersion values. Only the version part of the BrowserVersion value is respected. The channel suffix, if it exists, is ignored. The version of the WebView2 Runtime binaries actually used may be different from the specified TargetCompatibleBrowserVersion. The binaries are only guaranteed to be compatible. Verify the actual version on the property. + + + + + Determines whether to enable single sign on with Azure Active Directory (AAD) resources inside WebView using the logged in Windows account and single sign on (SSO) with web sites using Microsoft account associated with the login in Windows account. + + + The default value is false. Universal Windows Platform apps must also declare enterpriseCloudSSO [restricted capability](/windows/uwp/packaging/app-capability-declarations#restricted-capabilities) for the single sign on (SSO) to work. + + + + + Determines whether other processes can create from created with the same user data folder and therefore sharing the same WebView browser process instance. + + + The default value is false. + + + + + When IsCustomCrashReportingEnabled is set to true, Windows won't send crash data to Microsoft endpoint. + + + The default value is false. In this case, WebView will respect OS consent. + + + + + The EnableTrackingPrevention property is used to enable/disable tracking prevention feature in WebView2. This property enable/disable tracking prevention for all the WebView2's created in the same environment. By default this feature is enabled to block potentially harmful trackers and trackers from sites that aren't visited before and set to or whatever value was last changed/persisted on the profile. + + + You can set this property to false to disable the tracking prevention feature if the app only renders content in the WebView2 that is known to be safe. Disabling this feature when creating environment also improves runtime performance by skipping related code. + + You shouldn't disable this property if WebView2 is being used as a "full browser" with arbitrary navigation and should protect end user privacy. + + There is property to control levels of tracking prevention of the WebView2's associated with a same profile. However, you can also disable tracking prevention later using property and value but that doesn't improves runtime performance. + + See for more details. + + Tracking prevention protects users from online tracking by restricting the ability of trackers to access browser-based storage as well as the network. See [Tracking prevention](/microsoft-edge/web-platform/tracking-prevention). + + + + + Enable/disable browser extensions. + + + When AreBrowserExtensionsEnabled is set to true, new extensions can be added to user profile and used. AreBrowserExtensionsEnabled is default to be false, in this case, new extensions can't be installed, and already installed extension won't be available to use in user profile. If connecting to an already running environment with a different value for AreBrowserExtensionsEnabled property, it will fail with HRESULT_FROM_WIN32(ERROR_INVALID_STATE). See for Extensions API details. + + + + + Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable so that the WebView2 loader searches for binaries from least to most stable: Canary -> Dev -> Beta -> WebView2 Runtime. + + + The ChannelSearchKind property is CoreWebView2ChannelSearchKind.MostStable by default and environment creation searches for a release channel on the machine from most to least stable using the first channel found. The default search order is: WebView2 Release -> Beta -> Dev -> Canary. Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable to reverse the search order so that environment creation searches for a channel from least to most stable. If a ReleaseChannels has been provided, environment creation will only search for channels in the set. See for more details on channels. This property can be overridden by the corresponding registry key ChannelSearchKind or the environment variable WEBVIEW2_CHANNEL_SEARCH_KIND. Set the value to 1 to reverse the search order. See for more details on overrides. + + + + + Sets the ReleaseChannels, which is a mask of one or more CoreWebView2ReleaseChannels indicating which channels environment creation should search for. + + + OR operation(s) can be applied to multiple CoreWebView2ReleaseChannels to create a mask. The default value is a mask of all the channels. By default, environment creation searches for channels from most to least stable, using the first channel found on the device. When ReleaseChannels is provided, environment creation will only search for the channels specified in the set. Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable to reverse the search order so that environment creation searches for the least stable build first. See for descriptions of each channel. Environment creation fails if it is unable to find any channel from the ReleaseChannels installed on the device. Use to verify which channel is used. If both a BrowserExecutableFolder and ReleaseChannels are provided, the BrowserExecutableFolder takes precedence. The ReleaseChannels can be overridden by the corresponding registry override ReleaseChannels or the environment variable WEBVIEW2_RELEASE_CHANNELS. Set the value to a comma-separated string of integers, which map to the following release channel values: Stable (0), Beta (1), Dev (2), and Canary (3). For example, the values "0,2" and "2,0" indicate that environment creation should only search for Dev channel and the WebView2 Runtime, using the order indicated by . Environment creation attempts to interpret each integer and treats any invalid entry as Stable channel. + + + + ReleaseChannels + Channel Search Kind: Most Stable (default) + Channel Search Kind: Least Stable + + + CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta + Beta -> WebView2 Runtime + + + CoreWebView2ReleaseChannels.Canary | CoreWebView2ReleaseChannels.Dev | CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta -> Dev -> Canary + Canary -> Dev -> Beta -> WebView2 Runtime + + + CoreWebView2ReleaseChannels.Canary + Canary + Canary + + + CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Canary | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta -> Canary + Canary -> Beta -> WebView2 Runtime + + + + + + + Set ScrollBar style to be used. + + + The default is CoreWebView2ScrollbarStyle.Default which specifies the default browser ScrollBar style. CSS styles that modify the ScrollBar applied on top of native ScrollBar styling that is selected with CoreWebView2ScrollbarStyle. + + + + + CoreWebView2Frame provides direct access to the iframes information and handling. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + + + Adds the provided host object to script running in the WebViewFrame with the specified name for the list of the specified origins. + The host object will be accessible for this iframe only if the iframe's origin during + access matches one of the origins which are passed. The provided origins + will be normalized before comparing to the origin of the document. + So the scheme name is made lower case, the host will be punycode decoded + as appropriate, default port values will be removed, and so on. + This means the origin's host may be punycode encoded or not and will match + regardless. If list contains malformed origin the call will fail. + The method can be called multiple times in a row without calling + RemoveHostObjectFromScript for the same object name. It will replace + the previous object with the new object and new list of origins. + List of origins will be treated as following: + 1. empty list - call will succeed and object will be added for the iframe + but it will not be exposed to any origin; + 2. list with origins - during access to host object from iframe the + origin will be checked that it belongs to this list; + 3. list with "*" element - host object will be available for iframe for + all origins. We suggest not to use this feature without understanding + security implications of giving access to host object from from iframes + with unknown origins. + 4. list with "file://" element - host object will be available for iframes + loaded via file protocol. + + + The name of the host object. + + + The host object to be added to script. + + + The list of the iframe origins for which host object will be accessible. + + + + + + The value of iframe's window.name property. The default value equals to iframe html tag declaring it. + + + + + NameChanged is raised when the iframe changes its window.name property. + + + + + + Destroyed event is raised when the iframe corresponding to this object is removed or the document containing that iframe is destroyed. + + + + + + Remove the host object specified by the name so that it is no longer accessible from JavaScript code in the iframe. + + + While new access attempts are denied, if the object is already obtained by JavaScript code in the iframe, the JavaScript code continues to have access to that object. Calling this method for a name that is already removed or was never added fails. If the iframe is destroyed this method will return fail also. + + + + + Check whether a frame is destroyed. Returns true during the event. + + + + + NavigationStarting is raised when the current frame is requesting permission to navigate to a different URI. + + + A frame navigation will raise a event and a event. All of the event handlers will be run before the event handlers. All of the event handlers share a common object. Whichever event handler is last to change the property will decide if the frame navigation will be cancelled. + Redirects raise this event as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + + + ContentLoading is raised before any content is loaded, including scripts added with . ContentLoading is not raised if a same page navigation occurs. + + + This operation follows the event and precedes the and events. + + + + + NavigationCompleted is raised when the current frame has completely loaded (body.onload has been raised) or loading stopped with error. + + + + + DOMContentLoaded is raised when the initial HTML document has been parsed. + + + This aligns with the the document's DOMContentLoaded event in HTML. + + + + + WebMessageReceived is raised when the setting is set and the iframe runs window.chrome.webview.postMessage. + + + The postMessage function is void postMessage(object) where object is any object supported by JSON conversion. + When postMessage is called, the handler's Invoke method will be called with the object parameter postMessage converted to a JSON string. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebMessageReceivedIFrame"::: + + + + + Runs JavaScript code from the javaScript parameter in the current frame. + + The JavaScript code to be run in the current frame. + A JSON encoded string that represents the result of running the provided JavaScript. + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. This method is applied asynchronously. + If the method is run before , the script will not be executed and the JSON null will be returned. + This operation works even if is set to false. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScriptFrame"::: + + + + + Posts the specified webMessageAsJson to the current frame. + + The web message to be posted to the iframe. + + The event args is an instance of MessageEvent. The setting must be true or the message will not be sent. The event arg's data property of the event arg is the webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. The event arg's source property of the event arg is a reference to the window.chrome.webview object. For information about sending messages from the iframe to the host, navigate to . The message is sent asynchronously. If a navigation occurs before the message is posted to the iframe, the message is not be sent. + + + Runs the message event of the window.chrome.webview of the iframe. JavaScript in that document may subscribe and unsubscribe to the event using the following code: + + window.chrome.webview.addEventListener('message', handler) + window.chrome.webview.removeEventListener('message', handler) + + + + + + + + + Posts a message that is a simple string rather than a JSON string representation of a JavaScript object. + + The web message to be posted to the iframe. + + This behaves in exactly the same manner as , but the data property of the event arg of the window.chrome.webview message is a string with the same value as webMessageAsString. Use this instead of if you want to communicate using simple strings rather than JSON objects. + + + + + + + PermissionRequested is raised when content in an iframe or any of its descendant iframes requests permission to access some privileged resources. + + + This relates to the PermissionRequested event on the CoreWebView2. + Both these events will be raised in the case of an iframe requesting permission. The CoreWebView2Frame's event handlers will be invoked before the event handlers on the CoreWebView2. If the Handled property of the PermissionRequestedEventArgs is set to TRUE within the CoreWebView2Frame event handler, then the event will not be raised on the CoreWebView2, and it's event handlers will not be invoked. + In the case of nested iframes, the PermissionRequested event will be raised from the top level iframe. + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + Share a shared buffer object with script of the iframe in the WebView. + + The object to be shared with script. + The desired given to script. + Additional data to be send to script. If it is not null or empty string, and it is not a valid JSON string, will be thrown. + + The script will receive a sharedbufferreceived event from chrome.webview. + The event arg for that event will have the following methods and properties. + + + + Property + Description + + + getBuffer() + A method that returns an ArrayBuffer object with the backing content from the shared buffer. + + + additionalData + An object as the result of parsing additionalDataAsJson as JSON string. This property will be undefined if additionalDataAsJson is nullptr or empty string. + + + source + With a value set as chrome.webview object. + + + + If access is , the script will only have read access to the buffer. + If the script tries to modify the content in a read only buffer, it will cause an access violation in WebView renderer process and crash the renderer process. + + If the shared buffer is already closed, the API throws with error code of RO_E_CLOSED. + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access to the shared buffer any more. + + The application can post the same shared buffer object to multiple web pages or iframes, or post to the same web page or iframe multiple times. + Each PostSharedBufferToScript will create a separate ArrayBuffer object with its own view of the memory and is separately released. + The underlying shared memory will be released when all the views are released. + + Sharing a buffer to script has security risk. You should only share buffer with trusted site. + If a buffer is shared to a untrusted site, possible sensitive information could be leaked. + If a buffer is shared as modifiable by the script and the script modifies it in an unexpected way, it could result in corrupted data that might even crash the application. + + The example code shows how to send data to script for one time read only consumption. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="OneTimeShareBuffer"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_2"::: + + + + + The unique identifier of the current frame. It's the same kind of ID as with the and . + + + + + ScreenCaptureStarting event is raised when the [Screen Capture API](https://www.w3.org/TR/screen-capture/) is requested by the user using getDisplayMedia(). + + + This relates to the ScreenCaptureStarting event on the CoreWebView2. + Both these events will be raised in the case of an iframe requesting screen capture. The CoreWebView2Frame's event handlers will be invoked before the event handlers on the CoreWebView2. If the Handled property of the ScreenCaptureStartingEventArgs is set to TRUE within the CoreWebView2Frame event handler, then the event will not be raised on the CoreWebView2, and it's event handlers will not be invoked. + In the case of nested iframes, the ScreenCaptureStarting event will be raised from the top level iframe. + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + + Iterator for a collection of HTTP headers. + + + + + + + + + + No COM support; throws instead. + + + No COM support. + + + + + + + + Gets the header in the + or collection at the + current position of the enumerator. + + + + + + true when the iterator has not run out of headers. + + + If the collection over which the iterator is iterating is empty or if the iterator has gone past the end of the collection then this is false. + + + + + HTTP request headers. + + + Used to inspect the HTTP request on event and event. It is possible to modify the HTTP request headers from a event, but not from a event. + + + + + + + + + + + + + Returns an enumerator that iterates through the or collection. + + + + + Gets the header value matching the name. + + The header value matching the name. + + + + Gets the header value matching the name using a . + + The header value matching the name. + + + + Checks whether the headers contain an entry that matches the header name. + + Whether the headers contain an entry that matches the header name. + + + + Adds or updates header that matches the name. + + + + + Removes header that matches the name. + + + + + Gets a over the collection of request headers. + + + + + HTTP response headers. + + + Used to construct a for the event. + + + + + + + + + + + Returns an enumerator that iterates through the or collection. + + + + + Appends header line with name and value. + + The header name to be appended. + The header value to be appended. + + + + Checks whether this CoreWebView2HttpResponseHeaders contain entries matching the header name. + + The name of the header to seek. + + + + Gets the first header value in the collection matching the name. + + The header name. + The first header value in the collection matching the name. + + + + Gets the header values matching the name. + + The header name. + + + + Gets a over the collection of entire . + + + + + Event args for the CoreWebView2InitializationCompleted event. + + + + + Initializes a new instance of the CoreWebView2InitializationCompletedEventArgs class. + + + Exception that occurred during initialization, or null if initialization was successful. + + + + + True if the init task completed successfully. + + + + + The exception thrown from the init task. If the task completed successfully, this property is null. + + + + + An object that represents a [HTML Notification object](https://developer.mozilla.org/docs/Web/API/Notification). + + + + + Specifies the time at which a notification is created or applicable + (past, present, or future). + + + + + Gets the vibration pattern for devices with vibration hardware to emit. + + + The vibration pattern can be represented by an array of 64-bit + unsigned integers describing a pattern of vibrations and pauses. See + [Vibration API](https://developer.mozilla.org/docs/Web/API/Vibration_API) for + more information. This corresponds to + [Notification.vibrate](https://developer.mozilla.org/docs/Web/API/Notification/vibrate) + DOM API. An empty list is returned if no vibration patterns are + specified. + + + + + A string representing the body text of the notification. + + + The default value is an empty string. + + + + + The text direction in which to display the notification. + + + This corresponds to [Notification.dir](https://developer.mozilla.org/docs/Web/API/Notification/dir) DOM API. The default value is . + + + + + The notification's language, as intended to be specified using a string representing a language tag (such as en-US) according to [BCP47](https://datatracker.ietf.org/doc/html/rfc5646). + + + Note that no validation is performed on this property and it can be any string the notification sender specifies. This corresponds to [Notification.lang](https://developer.mozilla.org/docs/Web/API/Notification/lang) DOM API. The default value is an empty string. + + + + + A string representing an identifying tag for the notification. + + + This corresponds to [Notification.tag](https://developer.mozilla.org/docs/Web/API/Notification/tag) DOM API. The default value is an empty string. + + + + + A string containing the URI of an icon to be displayed in the notification. + + + The default value is an empty string. + + + + + The title of the notification. + + + + + A string containing the URI of the image used to represent the notification when there isn't enough space to display the notification itself. + + + The default value is an empty string. + + + + + A string containing the URI of an image to be displayed in the notification. + + + The default value is an empty string. + + + + + Indicates whether the user should be notified after a new notification replaces an old one. + + + This corresponds to [Notification.renotify](https://developer.mozilla.org/docs/Web/API/Notification/renotify) DOM API. The default value is false. + + + + + A boolean value indicating that a notification should remain active until the user clicks or dismisses it, rather than closing automatically. + + + This corresponds to [Notification.requireInteraction](https://developer.mozilla.org/docs/Web/API/Notification/requireInteraction) DOM API. Note that you may not be able to necessarily implement this due to native API limitations. The default value is false. + + + + + Indicates whether the notification should be silent -- i.e., no sounds or vibrations should be issued, regardless of the device settings. + + + This corresponds to [Notification.silent](https://developer.mozilla.org/docs/Web/API/Notification/silent) DOM API. The default value is false. + + + + + This event is raised when the notification is closed by the web code, such as through notification.close(). + + + You don't need to call since this is coming from the web code. + + + + + The host may run this to report the notification has been displayed and it will cause the [show](https://developer.mozilla.org/docs/Web/API/Notification/show_event) event to be raised for non-persistent notifications. + + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false when this is called. + + + + + The host may run this to report the notification has been clicked, and it will cause the [click](https://developer.mozilla.org/docs/Web/API/Notification/click_event) event to be raised for non-persistent notifications. + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false or has not been run when this is called. + + + + The host may run this to report the notification was dismissed, and it will cause the [close](https://developer.mozilla.org/docs/Web/API/Notification/close_event) event to be raised for non-persistent notifications. + + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false or has not been run when this is called. + + + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + + + Clear the browsing data for the specified dataKinds between the + startTime and endTime. Overload the ClearBrowsingDataAsync method to + allow for additional time parameters. + + + + + Clear the entirety of the browsing data associated with the profile + it is called on. It clears the data regardless of timestamp. + + + + + The name of the profile. + + + + + InPrivate mode is enabled or not. + + + + + Full path of the profile directory. + + + + + The default download folder path. + + + The default value is the system default download folder path for the user. The default download folder path is persisted in the user data folder across sessions. The value should be an absolute path to a folder that the user and application can write to. Throws an exception if the value is invalid, and the default download path is not changed. Otherwise the path is changed immediately. If the directory does not yet exist, it is created at the time of the next download. If the host application does not have permission to create the directory, then the user is prompted to provide a new path through the Save As dialog. The user can override the default download folder path for a given download by choosing a different path in the Save As dialog. + + + + + The PreferredColorScheme property sets the overall color scheme of the WebView2s associated with this profile. + + + This sets the color scheme for WebView2 UI like dialogs, prompts, and menus by setting the media feature prefers-color-scheme. + The default value for this is , which will follow whatever color scheme the OS is currently set to. + + + + + Clear the browsing data of the associated profile. + + + Clears browsing data on the profile the method is called on. Additional optional parameters include the start time and end time to clear the browsing data between as well as the data specific data kinds to clear on the profile. The method may be overloaded to take: + + + No parameters - in which the entirety of the data on the profile will be cleared. + + + The data kind(s) - in which the data kind(s) will be cleared for their entirety. + + + The data kind(s), start time, and end time - in which the data kind(s) will be cleared between the start and end time. The start time will be offset by -1.0 and the end time will be offset by +1.0 to include the last fractional second on each respective end. The start time is inclusive in the time period while the end time is exclusive. + + + + The exposed methods are as follows: + + ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds dataKinds); + ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds dataKinds, DateTime startTime, DateTime endTime); + ClearBrowsingDataAsync(); + + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClearBrowsingData"::: + + + + + The PreferredTrackingPreventionLevel property allows you to control levels of tracking prevention for WebView2 which are associated with a profile. This level would apply to the context of the profile. That is, all WebView2s sharing the same profile will be affected and also the value is persisted in the user data folder. + + + See for descriptions of levels. + + If tracking prevention feature is enabled when creating the WebView2 environment, you can also disable tracking prevention later using this property and value but that doesn't improves runtime performance. + + There is property to enable/disable tracking prevention feature for all the WebView2's created in the same environment. If enabled, PreferredTrackingPreventionLevel is set to by default for all the WebView2's and profiles created in the same environment or is set to the level whatever value was last changed/persisted to the profile. If disabled PreferredTrackingPreventionLevel is not respected by WebView2. If PreferredTrackingPreventionLevel is set when the feature is disabled, the property value get changed and persisted but it will takes effect only if is true. + + See for more details. + + + + + Sets permission state for the given permission kind and origin asynchronously. + + + The state change persists across sessions until it is changed by another call to SetPermissionState, or by setting the State property in PermissionRequestedEventArgs. Setting the state to will erase any state saved in the profile and restore the default behavior. The origin should have a valid scheme and host (e.g. "https://www.example.com"), otherwise the method fails. Additional URI parts like path and fragment are ignored. For example, "https://wwww.example.com/app1/index.html/" is treated the same as "https://wwww.example.com". See the [MDN origin definition](https://developer.mozilla.org/docs/Glossary/Origin) for more details. + + + + + Invokes the handler with a collection of all nondefault permission settings. + + + Use this method to get the permission state set in the current and previous sessions. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetNonDefaultPermissionSettings"::: + + + + + Get the which Creates, adds or updates, gets, or or view the cookies for the current profile. + + + All CoreWebView2s associated with this profile share the same cookie values. Changes to cookies in this cookie manager apply to all CoreWebView2s associated with this profile. + + + + + + Determines whether password information will be autosaved. + + + When disabled, no new password data is saved and no Save/Update Password prompts are displayed. However, if there was password data already saved before disabling this setting, then that password information is auto-populated, suggestions are shown and clicking on one will populate the fields. + When enabled, password information is auto-populated, suggestions are shown and clicking on one will populate the fields, new data is saved, and a Save/Update Password prompt is displayed. The default value is false. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + + + Determines whether general form information will be saved and autofilled. + + + General autofill information includes information like names, street and email addresses, phone numbers, and arbitrary input. This excludes password information. When disabled, no suggestions appear, and no new information is saved. + When enabled, information is saved, suggestions appear, and clicking on one will populate the form fields. The default value is true. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + + + Add a browser extension to the current user profile from extensionFolderPath. + + The manifest.json folder path. + + See for descriptions of browser extensions. + + Adds the [browser extension](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions) using the extension path for unpacked extensions from the local device. Extension is running right after installation. + The extension folder path is the topmost folder of an unpacked browser extension and contains the browser extension manifest file. + If the extensionFolderPath is an invalid path or doesn't contain the extension manifest.json file, this function will return ERROR_FILE_NOT_FOUND to callers. + Installed extension will default to true. When is false, AddBrowserExtension will fail and return HRESULT ERROR_NOT_SUPPORTED. + During installation, the content of the extension is not copied to the user data folder. Once the extension is installed, changing the content of the extension will cause the extension to be removed from the installed profile. + When an extension is added the extension is persisted in the corresponding profile. The extension will still be installed the next time you use this profile. + When an extension is installed from a folder path, adding the same extension from the same folder path means reinstalleing this extension. When two extensions with the same Id are installed, only the later installed extension will be kept. + The following summarizes the possible error values that can be returned from AddBrowserExtension and a description of why these errors occur. + + + + Error value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + Extensions are disabled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Cannot find manifest.json file or it is not a valid extension manifest. + + + E_ACCESSDENIED + Cannot load extension with file or directory name starting with _, reserved for use by the system. + + + E_FAIL + Extension failed to install with other unknown reasons. + + + + + + + + Gets a snapshot of the set of extensions on current user profile. + + + See for descriptions of browser extensions. + + Gets a snapshot of the set of extensions installed at the time GetBrowserExtensions is called. If an extension is installed or uninstalled after GetBrowserExtensions completes, the list returned by GetBrowserExtensions remains the same. When AreBrowserExtensionsEnabled is false, GetBrowserExtensions won't return any extensions on current user profile. + + + + + Raised when profile is marked for deletion. + + + When this event is raised, the CoreWebView2Profile and its corresponding CoreWebView2s have been closed, and cannot be used anymore. + + + + + Delete this profile and close the corresponding s. + + + After the API is called, the profile will be marked for deletion. The local profile's directory will be deleted at browser process exit. If it fails to delete, because something else is holding the files open, WebView2 will try to delete the profile at all future browser process starts until successful. The corresponding CoreWebView2s will be closed and the event will be raised. See for more information. If you try to create a new profile with the same name as an existing profile that has been marked as deleted but hasn't yet been deleted, profile creation will fail with HRESULT_FROM_WIN32(ERROR_DELETE_PENDING). + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the URI of the document that sent this web message. + + + + + Gets the message posted from the WebView content to the host converted to a JSON string. + + + Run this operation to communicate using JavaScript objects. + + + For example, the following postMessage runs result in the following WebMessageAsJson values: + + + postMessage({'a': 'b'}) "{\"a\": \"b\"}" + postMessage(1.2) "1.2" + postMessage('example') "\"example\"" + + + + + + Gets the message posted from the WebView content to the host as a string. + + The message posted from the WebView content to the host. + The message posted is some other kind of JavaScript type. + + Run this operation to communicate using simple strings. + + + For example the following postMessage runs result in the following values returned by TryWebMessageAsString: + + + postMessage({'a': 'b'}) ArgumentException + postMessage(1.2) ArgumentException + postMessage('example') "example" + + + + + + Additional received WebMessage objects. + + + To pass AdditionalObjects via WebMessage to the app, use the chrome.webview.postMessageWithAdditionalObjects content API. Any DOM object type that can be natively representable that has been passed in to additionalObjects parameter will be accessible here. Currently a WebMessage object can be the type. + Entries in the collection can be nullptr if null or undefined was passed. Cast the object to the native type to access its specific properties. + + object additionalObject = eventArgs.AdditionalObjects[0]; + if (additionalObject is CoreWebView2File) + { + CoreWebView2File file = additionalObject as CoreWebView2File; + } else if ... + + + + + + This is used to complete deferrals on event args that support getting deferrals using the GetDeferral method. This class implements . + + + + + + + + + Protected implementation of Dispose pattern. + + + + + Completes the associated deferred event. + + + Complete should only be run once for each deferral taken. + + + + + This class is deprecated; use CoreWebView2PrivateHostObjectHelper instead. + + + + + A shared memory based buffer object that is created by . The object is presented to script as ArrayBuffer when posted to script with . + + + + + + + + Protected implementation of Dispose pattern. + + + + + The file mapping handle of the shared memory of the buffer. + + + Normal app should use to + get a stream object to access the buffer. + For advanced scenarios, you could use native file mapping APIs to obtain + other views or duplicate this handle to another application process and + create a view from the duplicated handle in that process to access the buffer + from that separate process. + + + + + The size of the shared buffer in bytes. + + + + + The raw memory address of the buffer. + + + You can cast it to pointer to real data types like byte* to access the memory from unsafe code region. + Normal app should use to get a stream object to access the buffer. + + + + + Get an stream object that can be used to access the shared buffer. + + + + + Release the backing shared memory. + + + The application should call Close or when no access to the buffer is needed any more, to ensure that the underlying resources are released timely even if the shared buffer object itself is not released due to some leaked reference. + After the shared buffer is closed, the buffer address and file mapping handle previously obtained becomes invalid and cannot be used anymore. + Properties of the object will also be unaccessible. Operations like Read or Write on the stream objects returned from will also fail. + will also fail. The failures will be represented as with error code of RO_E_CLOSED. + + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access the shared buffer any more. + When script tries to access the buffer after calling chrome.webview.releaseBuffer, JavaScript TypeError exception will be raised complaining about accessing a detached ArrayBuffer, the same exception when trying to access a transferred ArrayBuffer. + + Closing the buffer object on native side doesn't impact access from Script and releasing the buffer from script doesn't impact access to the buffer from native side. The underlying shared memory will be released by the OS when both native and script side release the buffer. + + + + + Constructor + + + + + Read at most bufferSize bytes into buffer and return the effective + number of bytes read in bytesReadPtr (unless null). + + + mscorlib disassembly shows the following MarshalAs parameters + void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pv, int cb, IntPtr pcbRead); + This means marshaling code will have found the size of the array buffer in the parameter bufferSize. + + + Critical: calls Marshal.WriteInt32 which LinkDemands, takes pointers as input + + + + + Move the stream pointer to the specified position. + + + System.IO.stream supports searching past the end of the stream, like + OLE streams. + newPositionPtr is not an out parameter because the method is required + to accept NULL pointers. + + + Critical: calls Marshal.WriteInt64 which LinkDemands, takes pointers as input + + + + + Sets stream's size. + + + + + Obtain stream stats. + + + STATSG has to be qualified because it is defined both in System.Runtime.InteropServices and + System.Runtime.InteropServices.ComTypes. + The STATSTG structure is shared by streams, storages and byte arrays. Members irrelevant to streams + or not available from System.IO.Stream are not returned, which leaves only cbSize and grfMode as + meaningful and available pieces of information. + grfStatFlag is used to indicate whether the stream name should be returned and is ignored because + this information is unavailable. + + + + + Write at most bufferSize bytes from buffer. + + + Critical: calls Marshal.WriteInt32 which LinkDemands, takes pointers as input + + + + + Create a clone. + + + Not implemented. + + + + + Read at most bufferSize bytes from the receiver and write them to targetStream. + + + Not implemented. + + + + + Commit changes. + + + Only relevant to transacted streams. + + + + + Lock at most byteCount bytes starting at offset. + + + Not supported by System.IO.Stream. + + + + + Undo writes performed since last Commit. + + + Relevant only to transacted streams. + + + + + Unlock the specified region. + + + Not supported by System.IO.Stream. + + + + + The exception that is thrown when an WebView2 Runtime installation is missing. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a specified error message. + + + The error message that explains the reason for the exception. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a reference to the inner exception that is the cause of this exception. + + + The exception that is the cause of the current exception. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a specified error message and a reference to the inner exception that is the cause of this exception. + + + The error message that explains the reason for the exception. + + + The exception that is the cause of the current exception. + + + + + + + + + + + + + + + + + Specifies the source of . + + + + + + + + Indicates that web resource is requested from main page including dedicated workers, iframes and main script for shared workers. + + + + + Indicates that web resource is requested from shared worker. + + + + + Indicates that web resource is requested from service worker. + + + + + Indicates that web resource is requested from any supported source. + + + + + Specifies the web resource request contexts. + + + + + Specifies all resources. + + + + + Specifies a document resources. + + + + + Specifies a CSS resources. + + + + + Specifies an image resources. + + + + + Specifies another media resource such as a video. + + + + + Specifies a font resource. + + + + + Specifies a script resource. + + + + + Specifies an XML HTTP request, Fetch and EventSource HTTP communication. + + + + + Specifies a Fetch API communication. + + + Note that this isn't working. Fetch API requests are fired as a part + of COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST. + + + + Specifies a TextTrack resource. + + + + + Specifies an EventSource API communication. + + + Note that this isn't working. EventSource API requests are fired as a part + of COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST. + + + + Specifies a WebSocket API communication. + + + + + Specifies a Web App Manifest. + + + + + Specifies a Signed HTTP Exchange. + + + + + Specifies a Ping request. + + + + + Specifies a CSP Violation Report. + + + + + Specifies an other resource. + + + + + Indicates the error status values for web navigations. + + + + + Indicates that an unknown error occurred. + + + + + Indicates that the SSL certificate common name does not match the web address. + + + + + Indicates that the SSL certificate has expired. + + + + + Indicates that the SSL client certificate contains errors. + + + + + Indicates that the SSL certificate has been revoked. + + + + + Indicates that the SSL certificate is not valid. The certificate may not match the public key pins for the host name, the certificate is signed by an untrusted authority or using a weak sign algorithm, the certificate claimed DNS names violate name constraints, the certificate contains a weak key, the validity period of the certificate is too long, lack of revocation information or revocation mechanism, non-unique host name, lack of certificate transparency information, or the certificate is chained to a [legacy Symantec root](https://security.googleblog.com/2018/03/distrust-of-symantec-pki-immediate.html). + + + + + Indicates that the host is unreachable. + + + + + Indicates that the connection has timed out. + + + + + Indicates that the server returned an invalid or unrecognized response. + + + + + Indicates that the connection was stopped. + + + + + Indicates that the connection was reset. + + + + + Indicates that the Internet connection has been lost. + + + + + Indicates that a connection to the destination was not established. + + + + + Indicates that the provided host name was not able to be resolved. + + + + + Indicates that the operation was canceled. This status code is also used when the app cancels a navigation via event, and for original navigation if the app navigates the WebView2 in a rapid succession away after the load for original navigation commenced, but before it completed. + + + + + Indicates that the request redirect failed. + + + + + An unexpected error occurred. + + + + + Indicates that user is prompted with a login, waiting on user action. Initial navigation to a login site will always return this even if app provides credential using . HTTP response status code in this case is 401. See [status code reference](https://developer.mozilla.org/docs/Web/HTTP/Status). + + + + + Indicates that user lacks proper authentication credentials for a proxy server. HTTP response status code in this case is 407. See [status code reference](https://developer.mozilla.org/docs/Web/HTTP/Status). + + + + + Tracking prevention levels. + + + + + Tracking prevention is turned off. + + + + + The least restrictive level of tracking prevention. Set to this level to protect against malicious trackers but allows most other trackers and personalize content and ads. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + The default level of tracking prevention. Set to this level to protect against social media tracking on top of malicious trackers. Content and ads will likely be less personalized. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + The most restrictive level of tracking prevention. Set to this level to protect against malicious trackers and most trackers across sites. Content and ads will likely have minimal personalization. This level blocks the most trackers but could cause some websites to not behave as expected. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + Indicates the text direction of the notification. + + + + + Indicates that the notification text direction adopts the browser's language setting behavior. + + + + + Indicates that the notification text is left-to-right. + + + + + Indicates that the notification text is right-to-left. + + + + + Specifies the desired access from script to . + + + + + Script from web page only has read access to the shared buffer. + + + + + Script from web page has read and write access to the shared buffer. + + + + + Specifies the action type when server certificate error is detected to be used in the . + + + + + Indicates to ignore the warning and continue the request with the TLS certificate. This decision is cached for the RequestUri's host and the server certificate in the session. + + + + + Indicates to reject the certificate and cancel the request. + + + + + Indicates to display the default TLS interstitial error page to user for page navigations. For others TLS certificate is rejected and the request is cancelled. + + + + + The ScrollBar style being set during environment creation. + + + + + Browser default ScrollBar style + + + + + Window style fluent overlay scroll bar. Please see [Fluent UI](https://developer.microsoft.com/fluentui#/) for more details on fluent UI. + + + + + Specifies the JavaScript dialog kind used in . + + + + + Indicates that the dialog uses window.alert JavaScript function. + + + + + Indicates that the dialog uses window.confirm JavaScript function. + + + + + Indicates that the dialog uses window.prompt JavaScript function. + + + + + Indicates that the dialog uses window.beforeunload JavaScript event. + + + + + + Status of a programmatic Save As call. Indicates the result of the method. + + + + + The `ShowSaveAsUIAsync` method call completed successfully. By default, the system Save As dialog opens. If is set to `TRUE`, the system dialog is skipped and the download is started. + + + + + Could not perform Save As because the destination file path is an invalid path. The path is invalid when it is empty, a relative path, or a directory, or when the parent path does not exist. + + + + + Could not perform Save As because the destination file path already exists and replacing files was not allowed by the property. + + + + + Could not perform Save As because the `Kind` property selection is not supported due to content MIME type or system limits. See for MIME type limits. System limits include when the `HtmlOnly` kind is selected for an error page at child mode, or when the `Complete` kind is selected and the WebView is running in an App Container. + + + + + Did not perform Save As because the end user cancelled or the was set to `TRUE`. + + + + + Specifies selection options. + + + For HTML documents, we support 3 Save As kinds: HtmlOnly, SingleFile and Complete. For non-HTML documents, you must use Default. MIME types of `text/html` and `application/xhtml+xml` are considered HTML documents. + + + + + Default kind to save non-HTML content. If this kind is selected for an HTML page, the behavior is the same as the `HtmlOnly` kind. + + + + + Save the page as HTML. Only the top-level document is saved, excluding subresources. + + + + + Save the page as [MHTML](https://en.wikipedia.org/wiki/MHTML). + + + + + Save the page as HTML and download the page-related source files (for example: CSS, JavaScript, images, etc.) in a directory with the same filename prefix. + + + + + + Specifies the WebView2 release channel. + + + Use ReleaseChannels and ChannelSearchKind on CoreWebView2EnvironmentOptions to control which channel the WebView2 loader searches for. + + + + Channel + Primary purpose + How often updated with new features + + + Stable (WebView2 Runtime) + Broad Deployment + Monthly + + + Beta + Flighting with inner rings, automated testing + Monthly + + + Dev + Automated testing, selfhosting to test new APIs and features + Weekly + + + Canary + Automated testing, selfhosting to test new APIs and features + Daily + + + + + + + No release channel. ReleaseChannels will be ignored if only this value is passed. + + + + + The stable WebView2 Runtime that is released every 4 weeks. + + + + + The Beta release channel that is released every 4 weeks, a week before the stable release. + + + + + The Dev release channel that is released weekly. + + + + + The Canary release channel that is released daily. + + + + + Specifies the process kind used in . + + + The values in this enum make reference to the process kinds in the Chromium architecture. For more information about what these processes are and what they do, see [Browser Architecture - Inside look at modern web browser](https://developers.google.com/web/updates/2018/09/inside-browser-part1). + + + + + Indicates that the process is browser process. + + + + + Indicates that the process is render process. + + + + + Indicates that the process is utility process. + + + + + Indicates that the process is sandbox helper process. + + + + + Indicates that the process is Gpu process. + + + + + Indicates that the process is ppapi plugin process. + + + + + Indicates that the process is ppapi broker process. + + + + + Specifies the process failure reason used in . For process failures where a process has exited, it indicates the type of issue that produced the process exit. + + + + + Indicates that an unexpected process failure occurred. + + + + + Indicates that the process became unresponsive. This only applies to the main frame's render process. + + + + + Indicates that the process was terminated. For example, from Task Manager. + + + + + Indicates that the process crashed. Most crashes will generate dumps in the location indicated by . + + + + + Indicates that the process failed to launch. + + + + + Indicates that the process died due to running out of memory. + + + + + Deprecated. This value is unused. + + + + + Specifies the process failure kind used in . The values in this enum make reference to the process kinds in the Chromium architecture. For more information about what these processes are and what they do, see [Browser Architecture - Inside look at modern web browser](https://developers.google.com/web/updates/2018/09/inside-browser-part1). + + + + + Indicates that the browser process ended unexpectedly. The WebView automatically moves to the Closed state. The app has to recreate a new WebView to recover from this failure. + + + + + Indicates that the main frame's render process ended unexpectedly. Any subframes in the WebView will be gone too. A new render process is created automatically and navigated to an error page. You can use the method to try to recover from this failure. Alternatively, you can use and recreate the WebView. + + + + + Indicates that the main frame's render process is unresponsive. + + Renderer process unresponsiveness can happen for the following reasons: + + + + + There is a long-running script being executed. For example, the web content in your WebView might be performing a synchronous XHR, or have entered an infinite loop. + + + + + The system is busy. + + + + + The ProcessFailed event will continue to be raised every few seconds until the renderer procees has become responsive again. The application can consider taking action if the event keeps being raised. For example, the application might show UI for the user to decide to keep waiting or reload the page, or navigate away. + + + + Indicates that a frame-only render process ended unexpectedly. The process exit does not affect the top-level document, only a subset of the subframes within it. The content in these frames is replaced with an error page in the frame. Your application can communicate with the main frame to recover content in the impacted frames, using to get information about the impacted frames. + + + + + Indicates that a utility process ended unexpectedly. The failed process is recreated automatically. Your application does not need to handle recovery for this event, but can use to collect information about the failure, including ProcessDescription. + + + + + Indicates that a sandbox helper process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that the GPU process ended unexpectedly. The failed process is recreated automatically. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that a PPAPI plugin process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure, including ProcessDescription. + + + + + Indicates that a PPAPI plugin broker process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that a process of unspecified kind ended unexpectedly. Your application can use to collect information about the failure. + + + + + Indicates the status for printing. + + + + + Indicates that the print operation is succeeded. + + + + + Indicates that the printer is not available. + + + + + Indicates that the print operation is failed. + + + + + The orientation for printing, used by the property. + + + + + Print the page(s) in portrait orientation. + + + + + Print the page(s) in landscape orientation. + + + + + Specifies the media size for a print. + + + + + The default media size for a printer. + + + + + Indicate custom media size that is specific to the printer. + + + + + Specifies the duplex option for a print. + + + + + The default duplex for a printer. + + + + + Print on only one side of the sheet. + + + + + Print on both sides of the sheet, flipped along the long edge. + + + + + Print on both sides of the sheet, flipped along the short edge. + + + + + Specifies the print dialog kind. + + + + + Opens the browser print preview dialog. + + + + + Opens the system print dialog. + + + + + Specifies the color mode for a print. + + + + + The default color mode for a printer. + + + + + Indicate that the printed output will be in color. + + + + + Indicate that the printed output will be in shades of gray. + + + + + Specifies the collation for a print. + + + + + The default collation for a printer. + + + + + Indicate that the collation has been selected for the printed output. + + + + + Indicate that the collation has not been selected for the printed output. + + + + + Preferred color scheme for WebView2's associated with a profile. + + + + + Auto color scheme. + + + + + Light color scheme. + + + + + Dark color scheme. + + + + + Pointer event kind used by to convey the kind of pointer event being sent to WebView. + + + + + Corresponds to WM_POINTERACTIVATE. + + + + + Corresponds to WM_POINTERDOWN. + + + + + Corresponds to WM_POINTERENTER. + + + + + Corresponds to WM_POINTERLEAVE. + + + + + Corresponds to WM_POINTERUP. + + + + + Corresponds to WM_POINTERUPDATE. + + + + + Specifies the response to a permission request. + + + + + Specifies that the default browser behavior is used, which normally prompts users for decision. + + + + + Specifies that the permission request is granted. + + + + + Specifies that the permission request is denied. + + + + + Indicates the kind of a permission request. + + + + + Indicates an unknown permission. + + + + + Indicates permission to capture audio. + + + + + Indicates permission to capture video. + + + + + Indicates permission to access geolocation. + + + + + Indicates permission to send web notifications. Apps that would like to show notifications should handle and/or events and no browser permission prompt will be shown for notification requests. Note that push notifications are currently unavailable in WebView2. + + + + + Indicates permission to access generic sensor. Generic Sensor covers ambient-light-sensor, accelerometer, gyroscope, and magnetometer. + + + + + Indicates permission to read the system clipboard without a user gesture. + + + + + Indicates permission to automatically download multiple files. Permission is requested when multiple downloads are triggered in quick succession. + + + + + Indicates permission to read and write to files or folders on the device. Permission is requested when developers use the [File System Access API](https://developer.mozilla.org/docs/Web/API/File_System_Access_API) to show the file or folder picker to the end user, and then request "readwrite" permission for the user's selection. + + + + + Indicates permission to play audio and video automatically on sites. This permission affects the autoplay attribute and play method of the audio and video HTML elements, and the start method of the Web Audio API. See the [Autoplay guide for media and Web Audio APIs](https://developer.mozilla.org/docs/Web/Media/Autoplay_guide) for details. + + + + + Indicates permission to use fonts on the device. Permission is requested when developers use the [Local Font Access API](https://wicg.github.io/local-font-access/) to query the system fonts available for styling web content. + + + + + Indicates permission to send and receive system exclusive messages to/from MIDI (Musical Instrument Digital Interface) devices. Permission is requested when developers use the [Web MIDI API](https://developer.mozilla.org/docs/Web/API/Web_MIDI_API) to request access to system exclusive MIDI messages. + + + + + Indicates permission to open and place windows on the screen. Permission is requested when developers use the [Multi-Screen Window Placement API](https://www.w3.org/TR/window-placement/) to get screen details. + + + + + Specifies the PDF toolbar item types used for the . + + + + + No item. By default the equal to this value. + + + + + The save button on PDF toolbar. + + + + + The print button on PDF toolbar. + + + + + The save as button on PDF toolbar. + + + + + The zoom in button on PDF toolbar. + + + + + The zoom out button on PDF toolbar. + + + + + The rotate button on PDF toolbar. + + + + + The fit to width button on PDF toolbar. + + + + + The page view button on PDF toolbar. + + + + + The contents button on PDF toolbar. + + + + + The page number button on PDF toolbar. + + + + + The search button on PDF toolbar. + + + + + The full screen button on PDF toolbar. + + + + + The setting and more button on PDF toolbar. + + + + + Enum which represents the kind of non-client regions. + + + + + Enum value which represents a region entirely outside the WebView2 window. + + + + + Enum value which represents the client area. + + + + + Enum value which represents the caption area. + + + + + Enum value which represents the minimize window control button. + + + + + Enum value which represents the maximize window control button. + + + + + Enum value which represents the close window control button. + + + + + Specifies the navigation kind of each navigation. + + + + + A navigation caused by CoreWebView2.Reload(), location.reload(), the end user using F5 or other UX, or other reload mechanisms to reload the current document without modifying the navigation history. + + + + + A navigation back or forward to a different entry in the session navigation history, like via CoreWebView2.Back(), location.back(), the end user pressing Alt+Left or other UX, or other mechanisms to navigate back or forward in the current session navigation history. + + + + + A navigation to another document, which can be caused by CoreWebView2.Navigate(),window.location.href = ..., or other WebView2 or DOM APIs that navigate to a new URI. + + + + + Specifies the reason for moving focus. + + + + + Specifies that the code is setting focus into WebView. + + + + + Specifies that the focus is moved due to Tab traversal forward. + + + + + Specifies that the focus is moved due to Tab traversal backward. + + + + + Mouse event virtual keys associated with a for . + + + + + No additional keys pressed. + + + + + Left mouse button is down, MK_LBUTTON. + + + + + Right mouse button is down, MK_RBUTTON. + + + + + Shift key is down, MK_SHIFT. + + + + + Ctrl key is down, MK_CONTROL. + + + + + Middle mouse button is down, MK_MBUTTON. + + + + + First X button is down, MK_XBUTTON1. + + + + + Second X button is down, MK_XBUTTON2. + + + + + Mouse event kind used by to convey the kind of mouse event being sent to WebView. + + + + + Mouse horizontal wheel scroll event, WM_MOUSEHWHEEL. + + + + + Left button double click mouse event, WM_LBUTTONDBLCLK. + + + + + Left button down mouse event, WM_LBUTTONDOWN. + + + + + Left button up mouse event, WM_LBUTTONUP. + + + + + Mouse leave event, WM_MOUSELEAVE. + + + + + Middle button double click mouse event, WM_MBUTTONDBLCLK. + + + + + Middle button down mouse event, WM_MBUTTONDOWN. + + + + + Middle button up mouse event, WM_MBUTTONUP. + + + + + Mouse move event, WM_MOUSEMOVE. + + + + + Right button double click mouse event, WM_RBUTTONDBLCLK. + + + + + Right button down mouse event, WM_RBUTTONDOWN. + + + + + Right button up mouse event, WM_RBUTTONUP. + + + + + Mouse wheel scroll event, WM_MOUSEWHEEL. + + + + + First or second X button double click mouse event, WM_XBUTTONDBLCLK. + + + + + First or second X button down mouse event, WM_XBUTTONDOWN. + + + + + First or second X button up mouse event, WM_XBUTTONUP. + + + + + R button down over non client area, WM_NCRBUTTONDOWN. + + + + + R button up over non client area, WM_NCRBUTTONUP. + + + + + Desired memory consumption level of a WebView. + + + + + Normal memory usage target level. + + + + + Low memory usage target level. Used for inactivate WebView for reduced memory consumption. + + + + + Specifies the key event kind that raises an event. + + + + + Specifies that the key event kind corresponds to window message WM_KEYDOWN. + + + + + Specifies that the key event kind corresponds to window message WM_KEYUP. + + + + + Specifies that the key event kind corresponds to window message WM_SYSKEYDOWN. + + + + + Specifies that the key event kind corresponds to window message WM_SYSKEYUP. + + + + + Kind of cross origin resource access allowed for host resources during download. + + + Note that other normal access checks like same origin DOM access check and [Content Security Policy](https://developer.mozilla.org/docs/Web/HTTP/CSP) still apply. + The following table illustrates the host resource cross origin access according to access context and CoreWebView2HostResourceAccessKind. + + + + Cross Origin Access Context + Deny + Allow + DenyCors + + + From DOM like src of img, script or iframe element + Deny + Allow + Allow + + + From Script like Fetch or XMLHttpRequest + Deny + Allow + Deny + + + + + + + All cross origin resource access is denied, including normal sub resource access as src of a script or image element. + + + + + All cross origin resource access is allowed, including accesses that are subject to Cross-Origin Resource Sharing(CORS) check. The behavior is similar to a web site sends back http header Access-Control-Allow-Origin: *. + + + + + Cross origin resource access is allowed for normal sub resource access like as src of a script or image element, while any access that subjects to CORS check will be denied. See [Cross-Origin Resource Sharing](https://developer.mozilla.org/docs/Web/HTTP/CORS) for more information. + + + + + Specifies the frame kind used in . + + + + + Indicates that the frame is an unknown type frame. We may extend this enum type to identify more frame kinds in the future. For example, if portal frame which current in experimental phase gets finalized, we may extend this to include a new frame kind `COREWEBVIEW2_FRAME_KIND_PORTAL`. + + + + + Indicates that the frame is a primary main frame(). + + + + + Indicates that the frame is an iframe. + + + + + Indicates that the frame is an [embed](https://developer.mozilla.org/docs/Web/HTML/Element/embed) element. + + + + + Indicates that the frame is an [object](https://developer.mozilla.org/docs/Web/HTML/Element/object) element. + + + + + Allowed permissions of as described in [FileSystemHandle.requestPermission()](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) + + + + + Read-only permission for FileSystemHandle + + + + + Read and write permissions for FileSystemHandle + + + + + Kind of CoreWebView2FileSystemHandle as described in [FileSystemHandle.kind](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/kind) + + + + + FileSystemHandle is for a file (i.e. [FileSystemFileHandle](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle)) + + + + + FileSystemHandle is for a directory (i.e. [FileSystemDirectoryHandle](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle)) + + + + + The requested format to get the Favicon from . + + + + + Request the Favicon to be retrieved a Png Format. + + + + + Request the Favicon to be retrieved a Jpeg Format. + + + + + The state of the . + + + + + The download is in progress. + + + + + The connection with the file host was broken. The reason why a download was interrupted can accessed from . See for descriptions of the different kinds of interrupt reasons. Host can check whether an interrupted download can be resumed with . Once resumed, the download state is in progress. + + + + + The download completed successfully. + + + + + The reason why the was interrupted. + + + + + No interrupt reason. + + + + + Generic file error. + + + + + Access denied due to security restrictions. + + + + + Disk full. User should free some space or choose a different location to store the file. + + + + + Result file path with file name is too long. + + + + + File is too large for file system. + + + + + Microsoft Defender Smartscreen detected a virus in the file. + + + + + File was in use, too many files opened, or out of memory. + + + + + File blocked by local policy. + + + + + Security check failed unexpectedly. Microsoft Defender SmartScreen could not scan this file. + + + + + Seeking past the end of a file in opening a file, as part of resuming an interrupted download. The file did not exist or was not as large as expected. Partially downloaded file was truncated or deleted, and download will be restarted automatically. + + + + + Partial file did not match the expected hash and was deleted. Download will be restarted automatically. + + + + + Generic network error. User can retry the download manually. + + + + + Network operation timed out. + + + + + Network connection lost. User can retry the download manually. + + + + + Server has gone down. User can retry the download manually. + + + + + Network request invalid because original or redirected URI is invalid, has an unsupported scheme, or is disallowed by network policy. + + + + + Generic server error. User can retry the download manually. + + + + + Server does not support range requests. + + + + + Server does not have the requested data. + + + + + Server did not authorize access to resource. + + + + + Server certificate problem. + + + + + Server access forbidden. + + + + + Unexpected server response. Responding server may not be intended server. User can retry the download manually. + + + + + Server sent fewer bytes than the Content-Length header. Content-Length header may be invalid or connection may have closed. Download is treated as complete unless there are [strong validators](https://tools.ietf.org/html/rfc7232#section-2) present to interrupt the download. + + + + + Unexpected cross-origin redirect. + + + + + User canceled the download. + + + + + User shut down the WebView. Resuming downloads that were interrupted during shutdown is not yet supported. + + + + + User paused the download. + + + + + WebView crashed. + + + + + The default download dialog can be aligned to any of the WebView corners by setting the property. The default position is top-right corner. + + + + + The top-left corner of the WebView. + + + + + The top-right corner of the WebView. + + + + + The bottom-left corner of the WebView. + + + + + The bottom-right corner of the WebView. + + + + + Kind of cookie SameSite status used in the class. + + + These fields match those as specified in https://developer.mozilla.org/docs/Web/HTTP/Cookies#. + Learn more about SameSite cookies here: https://tools.ietf.org/html/draft-west-first-party-cookies-07 + + + + + None SameSite type. No restrictions on cross-site requests. + + + + + Lax SameSite type. The cookie will be sent with "same-site" requests, and with "cross-site" top level navigation. + + + + + Strict SameSite type. The cookie will only be sent along with "same-site" requests. + + + + + Indicates the kind of context for which the context menu was created for the property. This enum will always represent the active element that caused the context menu request. If there is a selection with multiple images, audio and text, for example, the element that the end user right clicks on within this selection will be the option represented by this enum. + + + + + Indicates that the context menu was created for the page without any additional content. + + + + + Indicates that the context menu was created for an image element. + + + + + Indicates that the context menu was created for selected text. + + + + + Indicates that the context menu was created for an audio element. + + + + + Indicates that the context menu was created for a video element. + + + + + Specifies the menu item kind for the property. + + + + + Specifies a command menu item kind. + + + + + Specifies a check box menu item kind. objects of this kind will need the property to determine current state of the check box. + + + + + Specifies a radio button menu item kind. objects of this kind will need the property to determine current state of the radio button. + + + + + Specifies a separator menu item kind. objects of this kind are used to signal a visual separator with no functionality. + + + + + Specifies a submenu menu item kind. objects of this kind will contain a collection of its children objects. + + + + + The kind of the . + + + + + Specifies smart card certificate. + + + + + Specifies PIN certificate. + + + + + Specifies other certificate. + + + + + The order that release channels are searched for during environment creation. + + + The default behavior is to search for and use the most stable channel found on the device. The order from most to least stable is: WebView2 Runtime -> Beta -> Dev -> Canary. Switch the order to prefer the least stable channel in order to perform pre-release testing. See for descriptions of channels. + + + + + Search for a release channel from most to least stable: WebView2 Runtime -> Beta -> Dev -> Canary. This is the default behavior. + + + + + Search for a release channel from least to most stable: Canary -> Dev -> Beta -> WebView2 Runtime. + + + + + Specifies the image format for the method. + + + + + Indicates that the PNG image format is used. + + + + + Indicates that the JPEG image format is used. + + + + + Indicates the kind of browsing data to clear. Or operations can be applied to create a mask representing multiple CoreWebView2BrowsingDataKinds. The resulting mask may be passed to or to clear the corresponding data. + + + + + Specifies file systems data. + + + + + Specifies data stored by the IndexedDB DOM feature. + + + + + Specifies data stored by the localStorage DOM API. + + + + + Specifies data stored by the Web SQL database DOM API. + + + + + Specifies data stored by the CacheStorage DOM API. + + + + + Specifies DOM storage data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.FileSystems, CoreWebView2BrowsingDataKinds.IndexedDb, CoreWebView2BrowsingDataKinds.WebSql, CoreWebView2BrowsingDataKinds.ServiceWorkers, CoreWebView2BrowsingDataKinds.CacheStorage, and some other data kinds not listed yet to keep consistent with [DOM-accessible storage](https://www.w3.org/TR/clear-site-data/#storage). + + + + + Specifies HTTP cookies data. + + + + + Specifies all site data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.AllDomStorage and CoreWebView2BrowsingDataKinds.Cookies. New site data types may be added to this data kind in the future. + + + + + Specifies disk cache. + + + + + Specifies download history data. + + + + + Specifies general autofill form data. This excludes password information and includes information like: names, street and email addresses, phone numbers, and arbitrary input. This also includes payment data. + + + + + Specifies password autosave data. + + + + + Specifies browsing history data. + + + + + Specifies settings data. + + + + + Specifies profile data that should be wiped to make it look like a new profile. This does not delete account-scoped data like passwords but will remove access to account-scoped data by signing the user out. Specifies all profile data, now and future. New profile data types may be added to this data kind in the future. This browsing data kind is inclusive of , , , , , , . + + + + + Specifies service workers registered for an origin, and clear will result in termination and deregistration of them. + + + + + Specifies the browser process exit kind used in . + + + + + Indicates that the browser process ended normally. + + + + + Indicates that the browser process ended unexpectedly. A event will also be raised to listening WebViews from the associated to the failed process. + + + + + Mode for how the property is interpreted in relation to the property. + + + + + property represents raw pixels. Physical size of WebView is not impacted by . + + + + + property represents logical pixels and the property is used to get the physical size of the WebView. + + + + + Contains the information packed into the LPARAM sent to a Win32 key event. + + + For more information about WM_KEYDOWN, navigate to [WM_KEYDOWN message](/windows/win32/inputdev/wm-keydown). + + + + + Specifies the repeat count for the current message. + + + + + Specifies the scan code. + + + + + Indicates that the key is an extended key. + + + + + Indicates that a menu key is held down (context code). + + + + + Indicates that the key was held down. + + + + + Indicates that the key was released. + + + + + A value representing RGBA color (Red, Green, Blue, Alpha) for WebView2. + + + Each component takes a value from 0 to 255, with 0 being no intensity and 255 being the highest intensity. + + + + + Specifies the intensity of the Alpha ie. opacity value. 0 is transparent, 255 is opaque. + + + + + Specifies the intensity of the Red color. + + + + + Specifies the intensity of the Green color. + + + + + Specifies the intensity of the Blue color. + + + + + The window features for a WebView popup window. + + + The fields match the windowFeatures passed to window.open() as specified in [Window features](https://developer.mozilla.org/docs/Web/API/Window/open#Window_features) on MDN. There is no requirement for you to respect the values. If your app does not have corresponding UI features (for example, no toolbar) or if all instance of WebView are opened in tabs and do not have distinct size or positions, then your app does not respect the values. You may want to respect values, but perhaps only some apply to the UI of you app. Accordingly, you may respect all, some, or none of the properties as appropriate for your app. For all numeric properties, if the value that is passed to window.open() is outside the range of an uint, the resulting value is uint.MaxValue. If you are not able to parse the value an integer, it is considered 0. If the value is a floating point value, it is rounded down to an integer. + + + + + Indicates whether the left and top values are specified. + + + + + Indicates whether the height and width values are specified. + + + + + Gets the left position of the window. Ignored if is false. + + + + + Gets the top position of the window. Ignored if is false. + + + + + Gets the height of the window. Ignored if is false. + + + + + Gets the width of the window. Ignored if is false. + + + + + Indicates that the menu bar is displayed. + + + + + Indicates that the status bar is displayed. + + + + + Indicates that the browser toolbar is displayed. + + + + + Indicates that the scroll bars are displayed. + + + + + View of the HTTP representation for a web resource response. + + + The properties of this object are not mutable. This response view is used with the event. + + + + + Gets the HTTP response headers as received. + + + + + Gets the HTTP response status code. + + + + + Gets the HTTP response reason phrase. + + + + + Gets the response content stream asynchronously. + + The content failed to load. + + A null stream means no content was found. Note content (if any) for redirect responses is ignored. + This method returns null if content size is more than 123MB. If msWebView2EnableDownloadContentInWebResourceResponseReceived feature flag is disabled, for navigations that become downloads or if response is downloadable content type (e.g., application/octet-stream), this method also returns null. See event to handle the response or enable the feature flag. The Stream object that is returned will be thread-safe and as reads will be blocking while waiting for data to be available, it is recommended to read from a background thread. + If this method is being called again before a first call has completed, it will complete at the same time all prior calls do. + If this method is being called after a first call has completed, it will return immediately (asynchronously). + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebResourceResponseReceived"::: + + + + + Event args for the event. + + + + + Gets the request object for the web resource, as committed. + + + This includes headers added by the network stack that were not be included during the associated event, such as Authentication headers. Modifications to this object have no effect on how the request is processed as it has already been sent. + + + + + Gets view of the response object received for the web resource. + + + + + An HTTP response used with the event. + + + + + Gets HTTP response content as stream. + + + Stream must have all the content data available by the time the event deferral of this response is completed. Stream should be agile or be created from a background thread to prevent performance impact to the UI thread. null means no content data. + When providing the response data, you should consider relevant HTTP request headers just like an HTTP server would do. For example, if the request was for a video resource in a HTML video element, the request may contain the [Range](https://developer.mozilla.org/docs/Web/HTTP/Headers/Range) header to request only a part of the video that is streaming. In this case, your response stream should be only the portion of the video specified by the range HTTP request headers and you should set the appropriate [Content-Range](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Range) header in the response. + + + + + + Gets the overridden HTTP response headers. + + + + + Gets or sets the HTTP response status code. + + + + + Gets or sets the HTTP response reason phrase. + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the web resource request. + + + The request object may be missing some headers that are added by network stack at a later time. + + + + + Gets or sets the object. + + + If this object is set, the event will be completed with this Response. + An empty object can be created with and then modified to construct the Response. + + + + + Gets the web resource request context. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the event at a later time. + + + + + Gets the source of web resource request. + + + + + An HTTP request used with the event. + + + + + Gets or sets the request URI. + + + + + Gets or sets the HTTP request method. + + + + + Gets or sets the HTTP request message body as stream. + + + POST data should be here. If a stream is set, which overrides the message body, the stream must have all the content data available by the time the event deferral of this request is completed. Stream should be agile or be created from a background STA to prevent performance impact to the UI thread. null means no content data. + + + + + + Gets the mutable HTTP request headers. + + + + + Event args for the event. + + + + + true if the page being navigated to is a new document. + + + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + + + Determines whether running JavaScript is enabled in all future navigations in the WebView. + + + This only affects scripts in the document. Scripts injected with runs even if script is disabled. The default value is true. + + + + + Determines whether communication from the host to the top-level HTML document of the WebView is allowed. + + + This is used when loading a new HTML document. If set to true, communication from the host to the top-level HTML document of the WebView is allowed using , , and message event of window.chrome.webview. Communication from the top-level HTML document of the WebView to the host is allowed using window.chrome.webview.postMessage function and the event. If set to false, then communication is disallowed. and fail and window.chrome.webview.postMessage fails by throwing an instance of an Error object. The default value is true. + + + + + + + + Determines whether WebView renders the default JavaScript dialog box. + + + This is used when loading a new HTML document. If set to false, WebView does not render the default JavaScript dialog box (specifically those displayed by the JavaScript alert, confirm, prompt functions and beforeunload event). Instead, WebView raises event that contains all of the information for the dialog and allow the host app to show a custom UI. The default value is true. + + + + + + Determines whether the status bar is displayed. + + + The status bar is usually displayed in the lower left of the WebView and shows things such as the URI of a link when the user hovers over it and other information. The default value is true. The status bar UI can be altered by web content and should not be considered secure. + + + + + Determines whether the user is able to use the context menu or keyboard shortcuts to open the DevTools window. + + + The default value is true. + + + + + Determines whether the default context menus are shown to the user in WebView. + + + The default value is true. + + + + + Determines whether host objects are accessible from the page in WebView. + + + The default value is true. + + + + + Determines whether the user is able to impact the zoom of the WebView. + + + When disabled, the user is not able to zoom using Ctrl++, Ctr+-, or Ctrl+mouse wheel, but the zoom is set using property. The default value is true. + + + + + Determines whether to disable built in error page for navigation failure and render process failure. + + + When disabled, blank page is displayed when related error happens. The default value is true. + + + + + Determines WebView2's User Agent. + + + The default value is the default User Agent of the Edge browser. This property may be overridden if the User-Agent header is set in a request. If the parameter is empty the User Agent will not be updated and the current User Agent will remain. Setting this property may clear User Agent Client Hints headers Sec-CH-UA-* and script values from navigator.userAgentData. Current implementation behavior is subject to change. + The User Agent set will also be effective on service workers and shared workers associated with the WebView. If there are multiple WebViews associated with the same service worker or shared worker, the last User Agent set will be used. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SetUserAgent"::: + + + + + Determines whether browser-specific accelerator keys are enabled. + + + When this setting is set to false, it disables all accelerator keys that access + features specific to a web browser, including but not limited to: + + + + Ctrl+F and F3 for Find on Page + + + Ctrl+P for Print + + + Ctrl+R and F5 for Reload + + + Ctrl+Plus and Ctrl+Minus for zooming + + + Ctrl+Shift-C and F12 for DevTools + + + Special keys for browser functions, such as Back, Forward, and Search + + + + It does not disable accelerator keys related to movement and text editing, such + as: + + + + Home, End, Page Up, and Page Down + + + Ctrl+X, Ctrl+C, Ctrl+V + + + Ctrl+A for Select All + + + Ctrl+Z for Undo + + + + Those accelerator keys will always be enabled unless they are handled in the event. + + This setting has no effect on the event. The event + will be fired for all accelerator keys, whether they are enabled or not. + + The default value of AreBrowserAcceleratorKeysEnabled is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AllowWebViewShortcutKeys"::: + + + + + Determines whether password information will be autosaved. + + + When disabled, no new password data is saved and no Save/Update Password prompts are displayed. However, if there was password data already saved before disabling this setting, then that password information is auto-populated, suggestions are shown and clicking on one will populate the fields. + When enabled, password information is auto-populated, suggestions are shown and clicking on one will populate the fields, new data is saved, and a Save/Update Password prompt is displayed. The default value is false. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PasswordAutosaveEnabled"::: + + + + + Determines whether general form information will be saved and autofilled. + + + General autofill information includes information like names, street and email addresses, phone numbers, and arbitrary input. This excludes password information. When disabled, no suggestions appear, and no new information is saved. + When enabled, information is saved, suggestions appear, and clicking on one will populate the form fields. The default value is true. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. And all WebView2s that created with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GeneralAutofillEnabled"::: + + + + + + Determines the ability of the end users to use pinching motions on touch input enabled devices to scale the web content in the WebView2. + + + When disabled, the end users cannot use pinching motions on touch input enabled devices to scale the web content in the WebView2. The default value is true. + Pinch-zoom, referred to as "Page Scale" zoom, is performed as a post-rendering step, it changes the page scale factor property and scales the surface the web page is rendered onto when user performs a pinch zooming action. It does not change the layout but rather changes the viewport and clips the web content, the content outside of the viewport isn't visible onscreen and users can't reach this content using mouse. This API only affects the Page Scale zoom and has no effect on the existing browser zoom properties ( and ) or other end user mechanisms for zooming. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="TogglePinchZoomEnabled"::: + + + + + Determines whether the end user to use swiping gesture on touch input enabled devices to navigate in WebView2. + + + Swiping gesture navigation on touch screen includes: + + + Swipe left/right (swipe horizontally) to navigate to previous/next page in navigation history. + + + Pull to refresh (swipe vertically) the current page. (This feature is currently disabled by default in the browser, to enable in WebView2, set property with --pull-to-refresh switch). + + + It defaults to true. When set to false, the end user cannot swipe to navigate or pull to refresh. This API only affects the overscrolling navigation functionality and has no effect on the scrolling interaction used to explore the web content shown in WebView2. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleSwipeNavigationEnabled"::: + + + + + Used to customize the PDF toolbar items. + + + By default, it is and so it displays all of the items. + Changes to this property apply to all CoreWebView2s in the same environment and using the same profile. + Changes to this setting apply only after the next navigation. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleHiddenPdfToolbarItems"::: + + + + + Determines whether SmartScreen is enabled when visiting web pages + + + The default value is true. + IsReputationCheckingRequired is used to control whether SmartScreen is enabled or not. + SmartScreen is enabled or disabled for all CoreWebView2s using the same user data folder. + If CoreWebView2Setting.IsReputationCheckingRequired is true for any CoreWebView2 using the same user data folder, then SmartScreen is enabled. If CoreWebView2Setting.IsReputationCheckingRequired is false for all CoreWebView2 using the same user data folder, then SmartScreen is disabled. + When it is changed, the change will be applied to all WebViews using the same user data folder on the next navigation or download. + If the newly created CoreWebview2 does not set SmartScreen to false, when navigating(Such as Navigate(), LoadDataUrl(), ExecuteScript(), etc.), the default value will be applied to all CoreWebview2 using the same user data folder. + SmartScreen of WebView2 apps can be controlled by Windows system setting "SmartScreen for Microsoft Edge", specially, for WebView2 in Windows Store apps, SmartScreen is controlled by another Windows system setting "SmartScreen for Microsoft Store apps". When the Windows setting is enabled, the SmartScreen operates under the control of the `IsReputationCheckingRequired`. When the Windows setting is disabled, the SmartScreen will be disabled regardless of the `IsReputationCheckingRequired` value set in WebView2 apps. In other words, under this circumstance the value of `IsReputationCheckingRequired` will be saved but overridden by system setting. Upon re-enabling the Windows setting, the CoreWebview2 will reference the `IsReputationCheckingRequired` to determine the SmartScreen status. + + + + + The `IsNonClientRegionSupportEnabled` property enables web pages to use the + + `app-region` CSS style. Disabling/Enabling the `IsNonClientRegionSupportEnabled` + takes effect after the next navigation. Defaults to `false`. + + When this property is `true`, then all the non-client region features + will be enabled: + Draggable Regions will be enabled, they are regions on a webpage that + are marked with the CSS attribute `app-region: drag/no-drag`. When set to + `drag`, these regions will be treated like the window's title bar, supporting + dragging of the entire WebView and its host app window; the system menu shows + upon right click, and a double click will trigger maximizing/restoration of the + window size. + When set to `false`, all non-client region support will be disabled. + The `app-region` CSS style will be ignored on web pages. + + + + Event args for the event. + + + + + The TLS error code for the invalid certificate. + + + + + URI associated with the request for the invalid certificate. + + + + + Returns the . + + + + + The action of the server certificate error detection. + + + The default value is . + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + This interface represents a JavaScript exception. + + + + + The line number of the source where the exception occurred. Note that this position starts at 0. + + + + + The column number of the source where the exception occurred. Note that this position starts at 0. + + + + + The Name is the exception's class name. + + + + + The Message is the exception's message and potentially stack. + + + + + This will return all details of the exception as a JSON string. + + + + + Event args for the event. + + + + + Gets the URI of the page that requested the dialog box. + + + + + Gets the kind of JavaScript dialog box. + + + + + + Gets the message of the dialog box. + + + From JavaScript this is the first parameter passed to alert, confirm, and prompt and is empty for beforeunload. + + + + + Gets the default value to use for the result of the prompt JavaScript function. + + + This is the second parameter passed to the JavaScript prompt dialog. + + + + + Gets or sets the return value from the JavaScript prompt function if is run. + + + This value is ignored for s other than . If is not run, this value is ignored and false is returned from prompt. + + + + + + Responds with **OK** to confirm, prompt, and beforeunload dialogs. Not run this method to indicate cancel. + + + From JavaScript, this means that the confirm function and beforeunload event returns true if Accept is run. And for the prompt function it returns the value of if Accept is run and otherwise returns false. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + The host may set this flag to TRUE to cancel the screen capture. + + + If canceled, the screen capture UI is not displayed regardless of the Handled property. On the script side, it will return with a NotAllowedError as Permission denied. + + + + + The host may set this flag to TRUE to prevent the ScreenCaptureStarting event from firing on the CoreWebView2 as well. + + + By default, both the ScreenCaptureStarting event handlers on the CoreWebView2Frame and the CoreWebView2 will be invoked, with the CoreWebView2Frame event handlers invoked first. The host may set this flag to TRUE within the CoreWebView2Frame event handlers to prevent the remaining CoreWebView2 event handlers from being invoked. If the flag is set to FALSE within the CoreWebView2Frame event handlers, downstream handlers can update the Cancel property. + + + + + The frame info of the frame where the screen capture starting request originated. + + + + + Returns a object. + + + Use this deferral to defer the decision to show the Screen Capture UI. getDisplayMedia() won't call its callbacks until the deferral is completed. + + + + + Event args for the event. + + + + + Set if cancel the upcoming save/download. + + + + + Get the document origin URI of this file save operation. + + + + + Get the extension of file to be saved. + + + + + Get the full path of file to be saved. This includes the file name and extension. + + + + + Set if the default policy checking and security warning will be suppressed. + + + + + Returns a object. + + + It will put the event into a deferred state. The default policy checking and any default UI will be blocked temporarily, saving file to local won't start, until the deferral is completed. + + + + + + Event args for the event. + + + + + Mime type of content to be saved. + + + + + Indicates whether to cancel the save as before download. + + + Set this property to `TRUE` to cancel the Save As action and prevent the download from starting. returns . + + + + + Indicates if the system default dialog will be suppressed. + + + When this property is FALSE, the default Save As dialog is shown and the values assigned through `SaveAsFilePath`, `AllowReplace` and `Kind` are ignored when the event args invoke completed. When it is `TRUE`, the system dialog is skipped and all assigned values are used. + + + + + The absolute full path of save as location. + + + It includes the file name and extension. If it is not valid (for example, the root drive does not exist), Save As is denied, and is returned. If the associated download completes successfully, a target file is saved at this location. If the `Kind` property is , there will be an additional directory with resources files. + + + + + Indicates whether to allow replace old file when it already exists in the target save file path. + + + Setting this property to `TRUE` allows existing files to be replaced. Setting this property to `FALSE` will not replace existing files and will return . + + + + + The option to save content to different document. + + + If it is not allowed for the current document, method returns . + + + + + Gets a object. + + + This will defer showing the default Save As dialog. Use this to the event at a later time to perform a Save As operation. + + + + + + Provides a set of properties for a process list in the . + + + + + Get the process id of the process. + + + + + Get the kind of the process. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the kind of process failure that has occurred. + + + ProcessFailedKind is a combination of process kind (for example, browser, renderer, gpu) and failure (exit, unresponsiveness). Renderer processes are further divided in main frame renderer (RenderProcessExited, RenderProcessUnresponsive) and subframe renderer (FrameRenderProcessExited). To learn about the conditions under which each failure kind occurs, see . + + + + + + Gets the reason for the process failure. + + + Some of the reasons are only applicable to specific values of , and the following values always return the indicated reason value: + + + + ProcessFailedKind + Reason + + + BrowserProcessExited + + Unexpected + + + + RenderProcessUnresponsive + + Unresponsive + + + + + For other values, the reason may be any of the reason values. To learn about what these values mean, see . + + + + + + Gets the exit code of the failing process, for telemetry purposes. + + + The exit code is always 1 when is , and STILL_ACTIVE(259) when is . + + + + + + Gets a description of the failing process, assigned by the WebView2 Runtime. + + + This is a technical English term appropriate for logging or development purposes, and not localized for the end user. It applies to utility processes (for example, "Audio Service", "Video Capture") and plugin processes (for example, "Flash"). The returned string is empty if the WebView2 Runtime did not assign a description to the process. + + + + + Gets the collection of s for frames in the that were being rendered by the failed process. + + + The content in these frames is replaced with an error page. + This is only available when is ; the returned collection is empty for all other process failure kinds, including the case in which the failed process was the renderer for the main frame and subframes within it, for which the failure kind is . + + + + + When ProcessFailed occurred due to a failed Code Integrity check, this property returns the full path of the file that was prevented from loading on the system. + + The webview2 process which tried to load the DLL will fail with exit code STATUS_INVALID_IMAGE_HASH(-1073740760). + + + + Provides a set of properties for a process list with extended information in the . + + + + + Provides the of the current process. + + + + + Provides the collection of associated s which are actively running (showing or hiding UI elements) in this renderer process. + + + AssociatedFrameInfos will only be populated when this corresponds to a renderer process. Non-renderer processes will always have an empty AssociatedFrameInfo. AssociatedFrameInfos may also be empty for renderer processes that have no active frames. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AssociatedFrameInfos"::: + + + + + Settings used by the method. + + + Settings used by the method. + + + + + The orientation can be portrait or landscape. + + + The default orientation is portrait. See . + + + + + The scale factor is a value between 0.1 and 2.0. + + + The default is 1.0. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The page width in inches. + + + The default width is 8.5 inches. If the provided page width is less than or equal to zero, the current value is not changed and an ArgumentException is thrown. + + + + + The page height in inches. + + + The default height is 11 inches. If the provided page height is less than or equal to zero, the current value is not changed and an ArgumentException is thrown. + + + + + The top margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The bottom margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The left margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The right margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + true if background colors and images should be printed. + + + The default value is false. + + + + + true if only the current end user's selection of HTML in the document should be printed. + + + The default value is false. + + + + + true if header and footer should be printed. + + + The default value is false. The header consists of the date and time of printing, and the title of the page. The footer consists of the URI and page number. The height of the header and footer is 0.5 cm, or ~0.2 inches. + + + + + The title in the header if is true. + + + The default value is the title of the current document. If an empty string or null value is provided, no title is shown in the header. + + + + + The URI in the footer if is true. + + + The default value is the current URI. If an empty string or null value is provided, no URI is shown in the footer. + + + + + Page range to print. Defaults to empty string, which means print all pages. + + + The PageRanges property is a list of page ranges specifying one or more pages that should be printed separated by commas. Any whitespace between page ranges is ignored. + A valid page range is either a single integer identifying the page to print, or a range in the form [start page]-[last page] where start page and last page are integers identifying the first and last inclusive pages respectively to print. + Every page identifier is an integer greater than 0 unless wildcards are used (see below examples). + The first page is 1. + + In a page range of the form [start page]-[last page] the start page number must be larger than 0 and less than or equal to the document's total page count. + If the start page is not present, then 1 is used as the start page. + The last page must be larger than the start page. + If the last page is not present, then the document total page count is used as the last page. + + Repeating a page does not print it multiple times. To print multiple times, use the property. + + The pages are always printed in ascending order, even if specified in non-ascending order. + + If page range is not valid or if a page is greater than document total page count, ArgumentException is thrown. + + The following examples assume a document with 20 total pages. + + + + Example + Result + Notes + + + "2" + Page 2 + + + + "1-4, 9, 3-6, 10, 11" + Pages 1-6, 9-11 + + + + "1-4, -6" + Pages 1-6 + The "-6" is interpreted as "1-6". + + + "2-" + Pages 2-20 + The "2-" is interpreted as "pages 2 to the end of the document". + + + "4-2, 11, -6" + Invalid + "4-2" is an invalid range. + + + "-" + Pages 1-20 + The "-" is interpreted as "page 1 to the end of the document". + + + "1-4dsf, 11" + Invalid + + + + "2-2" + Page 2 + + + + + + + + Prints multiple pages of a document on a single piece of paper. Choose from 1, 2, 4, 6, 9 or 16. + + + The default value is 1. + + If an invalid value is provided, ArgumentException is thrown. + + Below examples shows print output for PagesPerSide and Duplex. + + + + PagesPerSide + Total pages + Two-sided printing + Result + + + 1 + 1 + - + 1 page on the front side. + + + 2 + 1 + Yes + 1 page on the front side. + + + 2 + 4 + - + 2 pages on the first paper and 2 pages on the next paper. + + + 2 + 4 + Yes + 2 pages on the front side and 2 pages on back side. + + + 4 + 4 + Yes + 4 pages on the front side. + + + 4 + 8 + Yes + 4 pages on the front side and 4 pages on the back side. + + + + + + + Number of copies to print. Minimum value is 1 and the maximum copies count is 999. + + + The default value is 1. + + + + + Printer collation. + + + See for descriptions of collation. The default value is . + + Printing uses default value of printer's collation if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + Printer color mode. + + + See for descriptions of color modes. The default value is . + + Printing uses default value of printer supported color if an invalid value is provided for the specific printer. + + + + + Printer duplex settings. + + + See for descriptions of duplex. The default value is . + + Printing uses default value of printer's duplex if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + Printer media size. + + + See for descriptions of media size. The default value is . + + If media size is , you should set the and . + + Printing uses default value of printer supported media size if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + The name of the printer to use. + + + Defaults to empty string. If the printer name is empty string or null, then it prints to the default printer on the user OS. + + If provided printer name doesn't match with the name of any installed printers on the user OS, the method returns with . + + Use [PrintCapabilities](/dotnet/api/system.printing.printcapabilities) class to enumerate available printers. + + This value is ignored in method. + + + + + This mostly represents a combined win32 POINTER_INFO, POINTER_TOUCH_INFO, and POINTER_PEN_INFO object. + + + + + Gets or sets the PointerKind of the pointer event. + + + This corresponds to the pointerKind property of the POINTER_INFO struct. The values are defined by the POINTER_INPUT_KIND enum in the Windows SDK (_winuser.h_). Supports PT_PEN and PT_TOUCH. + + + + + Gets or sets the PointerId of the pointer event. + + + This corresponds to the pointerId property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the FrameID of the pointer event. + + + This corresponds to the frameId property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PointerFlags of the pointer event. + + + This corresponds to the pointerFlags property of the POINTER_INFO struct. The values are defined by the POINTER_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PointerDeviceRect of the sourceDevice property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the DisplayRect of the sourceDevice property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PixelLocation of the pointer event. + + + This corresponds to the ptPixelLocation property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HimetricLocation of the pointer event. + + + This corresponds to the ptHimetricLocation property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PixelLocationRaw of the pointer event. + + + This corresponds to the ptPixelLocationRaw property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HimetricLocationRaw of the pointer event. + + + This corresponds to the ptHimetricLocationRaw property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the Time of the pointer event. + + + This corresponds to the dwTime property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HistoryCount of the pointer event. + + + This corresponds to the historyCount property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the InputData of the pointer event. + + + This corresponds to the InputData property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the KeyStates of the pointer event. + + + This corresponds to the dwKeyStates property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PerformanceCount of the pointer event. + + + This corresponds to the PerformanceCount property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the ButtonChangeKind of the pointer event. + + + This corresponds to the ButtonChangeKind property of the POINTER_INFO struct. The values are defined by the POINTER_BUTTON_CHANGE_KIND enum in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenFlags of the pointer event. + + + This corresponds to the penFlags property of the POINTER_PEN_INFO struct. The values are defined by the PEN_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenMask of the pointer event. + + + This corresponds to the penMask property of the POINTER_PEN_INFO struct. The values are defined by the PEN_MASK constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenPressure of the pointer event. + + + This corresponds to the pressure property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenRotation of the pointer event. + + + This corresponds to the rotation property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenTiltX of the pointer event. + + + This corresponds to the tiltX property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenTiltY of the pointer event. + + + This corresponds to the tiltY property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchFlags of the pointer event. + + + This corresponds to the touchFlags property of the POINTER_TOUCH_INFO struct. The values are defined by the TOUCH_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchMask of the pointer event. + + + This corresponds to the touchMask property of the POINTER_TOUCH_INFO struct. The values are defined by the TOUCH_MASK constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchContact of the pointer event. + + + This corresponds to the rcContact property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchContactRaw of the pointer event. + + + This corresponds to the rcContactRaw property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchOrientation of the pointer event. + + + This corresponds to the orientation property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchPressure of the pointer event. + + + This corresponds to the pressure property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Provides a set of properties for a permission setting. + + + + + The kind of the permission setting. + + + + + The origin of the permission setting. + + + + + The state of the permission setting. + + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the origin of the web content that requests the permission. + + + + + Gets the kind of the permission that is requested. + + + + + true when the permission request was initiated through a user gesture such as clicking an anchor tag with target. + + + Being initiated through a user gesture does not mean that user intended to access the associated resource. + + + + + Gets or sets the status of a permission request. For example, whether the request is granted. + + + The default value is . + + + + + Gets a object. + + + Use the deferral object to make the permission decision at a later time. The deferral only applies to the current request, and does not prevent the PermissionRequested event from getting raised for new requests. However, for some permission kinds the WebView will avoid creating a new request if there is a pending request of the same kind. + + + + + The host may set this flag to TRUE to prevent the PermissionRequested event from firing on the CoreWebView2 as well. + + By default, both the PermissionRequested on the CoreWebView2Frame and CoreWebView2 will be fired. + + + + Set the SavesInProfile property to FALSE to not persist the state beyond the current request, and to continue to receive PermissionRequested events for this origin and permission kind. + + + The permission state set from the PermissionRequested event is saved in the profile by default; it is persisted across sessions and becomes the new default behavior for future PermissionRequested events. Browser heuristics can affect whether the event continues to be raised when the state is persisted. + + + + + Event args for the . + + + + + The origin of the web content that sends the notification, such as https://example.com/ or https://www.example.com/. + + + + + The notification that was received. + + + You can access the properties on the Notification object to show your own notification. + + + + + Sets whether the is handled by the host after the event handler completes or if there is a deferral then after the deferral is completed. + + + If is set to true then WebView will not display the notification with the default UI, and the host will be responsible for handling the notification and for letting the web content know that the notification has been displayed, clicked, or closed. You must set to true before you call , and , otherwise they will fail with HRESULT_FROM_WIN32(ERROR_INVALID_STATE). If after the event handler or deferral completes is set to false then WebView will display the default notification UI. Note that you cannot un-handle this event once you have set to be true. The initial value is false. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + Gets the region kind corresponding to the event. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the target uri of the new window request. + + + + + Gets the new window or sets a WebView as a result of the new window requested. + + + Provides a WebView as the target for a window.open() from inside the requesting WebView. If this is set, the top-level window of this WebView is returned as the opened [WindowProxy](https://developer.mozilla.org/docs/glossary/windowproxy) to the opener script. If this is not set, then is checked to determine behavior for the . + The methods which should affect the new web contents like has to be called and completed before setting NewWindow. Other methods which should affect the new web contents like have to be called after setting NewWindow. It is best not to use before setting NewWindow, otherwise it may not work for later added scripts. + WebView provided in the NewWindow property must be on the same as the opener WebView and cannot be navigated. Changes to settings should be made before setting NewWindow to ensure that those settings take effect for the newly setup WebView. The new WebView must have the same profile as the opener WebView. + + + + + Indicates whether the event is handled by host. + + + If this is false and no is set, the WebView opens a popup window and returns the opened WindowProxy to the opener script. Note that in this case, there is no avenue to control the popup window from the app. If set to true and no is set for window.open(), the opened proxy is for a dummy window object, but this window does not load and is immediately closed. The default value is false. + + + + + true when the new window request was initiated through a user gesture such as selecting an anchor tag with target. + + + The Microsoft Edge popup blocker is disabled for WebView so the app is able to use this flag to block non-user initiated popups. + + + + + Gets the window features specified by the window.open() call. These features should be considered for positioning and sizing of new WebView windows. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the window open request at a later time. While this event is deferred the opener window returns a WindowProxy to an un-navigated window, which navigates when the deferral is complete. + + + + + Gets the name of the new window. + + + This window can be created via window.open(url, windowName), where the windowName parameter corresponds to Name property. + If no windowName is passed to window.open, then the Name property will be set to an empty string. Additionally, if window is opened through other means, such as <a target="windowName"> or <iframe name="windowName">, then the Name property will be set accordingly. In the case of target=_blank, the Name property will be an empty string. + Opening a window via Ctrl+clicking a link would result in the Name property being set to an empty string. + + + + + The frame info of the frame where the new window request originated. + + + The OriginalSourceFrameInfo is a snapshot of frame information at the time when the new window was requested. See for details on frame properties. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the uri of the requested navigation. + + + + + true when the new window request was initiated through a user gesture. + + + Examples of user initiated requests are: + - Selecting an anchor tag with target + - Programmatic window open from a script that directly run as a result of user interaction such as via onclick handlers. + Non-user initiated requests are programmatic window opens from a script that are not directly triggered by user interaction, such as those that run while loading a new page or via timers. + The Microsoft Edge popup blocker is disabled for WebView so the app is able to use this flag to block non-user initiated popups. + + + + + true when the navigation is redirected. + + + + + Gets the HTTP request headers for the navigation. + + + Note, you are not able to modify the HTTP request headers in a event. + + + + + + Determines whether to cancel the navigation. + + + If set to true, the navigation is no longer present and the content of the current page is intact. For performance reasons, GET HTTP requests may happen, while the host is responding. You may set cookies and use part of a request for the navigation. Navigations to about schemes are cancellable, unless `msWebView2CancellableAboutNavigations` feature flag is disabled. Cancellation of frame navigation to `srcdoc` is not supported and will be ignored. + + + + + Gets the ID of the navigation. + + + + + Additional allowed frame ancestors set by the host app. + + + The app may set this property to allow a frame to be embedded by additional ancestors besides what is allowed by http header [X-Frame-Options](https://developer.mozilla.org/docs/Web/HTTP/Headers/X-Frame-Options) and [Content-Security-Policy frame-ancestors directive](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors). + If set, a frame ancestor is allowed if it is allowed by the additional allowed frame ancestors or original http header from the site. + Whether an ancestor is allowed by the additional allowed frame ancestors is done the same way as if the site provided it as the source list of the Content-Security-Policy frame-ancestors directive. + For example, if https://example.com and https://www.example.com are the origins of the top page and intermediate iframes that embed a nested site-embedding iframe, and you fully trust those origins, you should set this property to https://example.com https://www.example.com. + + This property gives the app the ability to use iframe to embed sites that otherwise could not be embedded in an iframe in trusted app pages. + This could potentially subject the embedded sites to [Clickjacking](https://wikipedia.org/wiki/Clickjacking) attack from the code running in the embedding web page. Therefore, you should only set this property with origins of fully trusted embedding page and any intermediate iframes. + Whenever possible, you should use the list of specific origins of the top and intermediate frames instead of wildcard characters for this property. + This API is to provide limited support for app scenarios that used to be supported by <webview> element in other solutions like JavaScript UWP apps and Electron. + You should limit the usage of this property to trusted pages, and specific navigation target url, by checking the , and . + + This property is ignored for top level document navigation. + + + + + Gets the navigation kind of the navigation. + + + + + Event args for the event. + + + Event args for the event. + + + + + true when the navigation is successful; false for a navigation that ended up in an error page (failures due to no network, DNS lookup failure, HTTP server responds with 4xx). Note that WebView2 will report the navigation as 'unsuccessful' if the load for the navigation did not reach the expected completion for any reason. Such reasons include potentially catastrophic issues such network and certificate issues, but can also be the result of intended actions such as the app canceling a navigation or navigating away before the original navigation completed. Applications should not just rely on this flag, but also consider the reported WebErrorStatus to determine whether the failure is indeed catastrophic in their context. + + + WebErrorStatuses that may indicate a non-catastrophic failure include: + + + + + + + + + + + + + + This may also be false for additional scenarios such as window.stop() run on navigated page. + + + + + Gets the error code if the navigation failed. + + + + + Gets the ID of the navigation. + + + + + The HTTP status code of the navigation if it involved an HTTP request. For instance, this will usually be 200 if the request was successful, 404 if a page was not found, etc. See https://developer.mozilla.org/docs/Web/HTTP/Status for a list of common status codes. + + + The HttpStatusCode property will be 0 in the following cases: + + + The navigation did not involve an HTTP request. For instance, if it was a navigation to a file:// URL, or if it was a same-document navigation. + + + The navigation failed before a response was received. For instance, if the hostname was not found, or if there was a network error. + + + In those cases, you can get more information from the and properties. + + If the navigation receives a successful HTTP response, but the navigated page calls window.stop() before it finishes loading, then HttpStatusCode may contain a success code like 200, but will be false and will be . + + Since WebView2 handles HTTP continuations and redirects automatically, it is unlikely for HttpStatusCode to ever be in the 1xx or 3xx ranges. + + + + + Event args for the event. + + + + + Gets the reason for WebView to raise the event. + + + + + Indicates whether the event has been handled by the app. + + + If the app has moved the focus to another desired location, it should set Handled property to true. When Handled property is false after the event handler returns, default action is taken. The default action is to try to find the next tab stop child window in the app and try to move focus to that window. If no other window exists to move focus, focus is cycled within the web content of the WebView. + + + + + Event args for the event. + + + + + Gets the URI with the external URI scheme to be launched. + + + + + Gets the origin initiating the external URI scheme launch. If the `InitiatingOrigin` is [opaque](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque), the `InitiatingOrigin` reported in the event args will be its precursor origin. The precursor origin is the origin that created the opaque origin. For example, if a frame on example.com opens a subframe with a different opaque origin, the subframe's precursor origin is example.com. + + + The origin will be an empty string if the request is initiated by calling on the external URI scheme. If a script initiates the navigation, the `InitiatingOrigin` will be the top-level document's `Source`, i.e. if `window.location` is set to `"calculator://", the `InitiatingOrigin` will be set to `calculator://`. If the request is initiated from a child frame, the `InitiatingOrigin` will be the source of that child frame. + + + + + true when the launching external URI scheme request was initiated through a user gesture. + + + + + Determines whether to cancel the navigation. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the launching external URI scheme request at a later time. + + + + + Provides a set of properties for a frame in the . + + + Provides a set of properties for a frame in the . + + + + + Gets the value of frame's window.name property. The default value equals to frame html tag declaring it, as in <iframe name="frame-name" ...>. + + + The returned string is empty when the frame has no name attribute and no assigned value for window.name. + + + + + The URI of the document in the frame. + + + + + This parent frame's . ParentFrameInfo will only be populated when obtained via calling . objects obtained via will always have a null ParentFrameInfo. This property is also null for the top most document in the which has no parent frame. + + + ParentFrameInfo could be out of date as it's a snapshot. + + + + + The unique identifier of the frame associated with the current . It's the same kind of ID as with the and . FrameId will only be populated when obtained calling . objects obtained via will always have an invalid frame Id 0. + + + FrameId could be out of date as it's a snapshot. If there's created or destroyed or event or event after the asynchronous call starts, you may want to call the asynchronous method again to get the updated s. + + + + + Gets the kind of the frame. FrameKind will only be populated when obtained calling . ` objects obtained via will always have the default value . + + + FrameKind could be out of date as it's a snapshot. + + + + + Event args for the event. + + + + + Gets the created frame. + + + + + + Representation of a DOM [FileSystemHandle](https://developer.mozilla.org/docs/Web/API/FileSystemHandle) object. + + + + + The kind of the FileSystemHandle. It can either be a file or a directory. + + + + + The path to the FileSystemHandle. + + + + + The permissions granted to the FileSystemHandle. + + + + + Representation of a DOM[File](https://developer.mozilla.org/docs/Web/API/File) object passed via WebMessage. + + + You can use this object to obtain the path of a File dropped on WebView2. + + + + + The absolute file path. + + + + + The result for . + + + + + This property is true if successfully executed script with no unhandled exceptions and the result is available in the property. + + + + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. + + + + + If Succeeded is false, you can use this property to get the unhandled exception thrown by script execution + + + + + If Succeeded is true and the result of script execution is a string, this method provides the value of the string result, and we will get the false var value when the js result is not string type. + + + + + Event args for the event. + + + + + Returns the for the download that has started. + + + + + Indicates whether to cancel the download. + + + If canceled, the download save dialog is not displayed regardless of the value and the state is changed to with interrupt reason . + + + + + The path to the file. + + + If setting the path, the host should ensure that it is an absolute path, including the file name, and that the path does not point to an existing file. If the path points to an existing file, the file will be overwritten. If the directory does not exist, it is created. + + + + + Indicates whether to hide the default download dialog. + + + If set to true, the default download dialog is hidden for this download. The download progresses normally if it is not canceled, there will just be no default UI shown. By default the value is false and the default download dialog is shown. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + Gets the ID of the navigation. + + + + + A Receiver is created for a particular DevTools Protocol event and allows you to subscribe and unsubscribe from that event. + + + Obtained from the WebView object using . + + + + + + DevToolsProtocolEventReceived is raised when the corresponding DevToolsProtocol event is raised. + + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the parameter object of the corresponding DevToolsProtocol event represented as a JSON string. + + + + + Gets the sessionId of the target where the event originates from. Empty string is returned as sessionId if the event comes from the default session for the top page. + + + + + Represents the information regarding the context menu target. Includes the context selected and the appropriate data used for the actions of a context menu. + + + + + Gets the kind of context that the user selected as . + + + + + Returns true if the context menu is requested on an editable component. + + + + + Returns true if the context menu was requested on the main frame and false if invoked on another frame. + + + + + Gets the uri of the page. + + + + + Gets the uri of the frame. Will match the if is true. + + + + + Returns true if the context menu is requested on HTML containing an anchor tag. + + + + + Gets the uri of the link (if is true, null otherwise). + + + + + Returns true if the context menu is requested on text element that contains an anchor tag. + + + + + Gets the text of the link (if is true, null otherwise). + + + + + Returns true if the context menu is requested on HTML containing a source uri. + + + + + Gets the active source uri of element (if is true, null otherwise). + + + + + Returns true if the context menu is requested on a selection. + + + + + Gets the selected text (if is true, null otherwise). + + + + + Event args for the event. + + + Will contain the selection information and a collection of all of the default context menu items that the WebView would show. Allows the app to draw its own context menu or add/remove from the default context menu. + + + + + Gets the collection of objects. + + + + + Gets the target information associated with the requested context menu. + + + + + + Gets the coordinates where the context menu request occurred in relation to the upper left corner of the WebView bounds. + + + + + Gets or sets the selected 's . + + + When the app handles the event, it can set this to report the selected command from the context menu. The default value is -1 which means that no selection occurred. The app can also set the command ID for a custom context menu item, which will cause the event to be fired, however while command IDs for each custom context menu item is unique during a ContextMenuRequested event, WebView may reassign command ID values of deleted custom ContextMenuItems to new objects and the command ID assigned to the same custom item can be different between each app runtime. The command ID should always be obtained via the property. + + + + + Gets or sets whether the event is handled by host after the event handler completes or after the deferral is completed if there is a taken . + + + If Handled is set to true then WebView2 will not display a context menu and will instead use the property to indicate which, if any, context menu item to invoke. If after the event handler or deferral completes, Handled is set to false then WebView will display a context menu based on the contents of the property. The default value is false. + + + + + Returns a object. + + + Use this operation to complete the event when the custom context menu is closed. + + + + + Represents a context menu item of a context menu displayed by WebView. + + + + + Gets the unlocalized name for the . + + + Use this to distinguish between context menu item types. This will be the English label of the menu item in lower camel case. For example, the "Save as" menu item will be "saveAs". Extension menu items will be "extension", custom menu items will be "custom" and spellcheck items will be "spellCheck". + Some example context menu item names are: + + + + "saveAs" + + + "copyImage" + + + "openLinkInNewWindow" + + + + + + + Gets the localized label for the . Will contain an ampersand for characters to be used as keyboard accelerator. + + + + + Gets the Command ID for the . + + + Use this to report the in event. + + + + + Gets the localized keyboard shortcut for this . + + + It will be the empty string if there is no keyboard shortcut. This is text intended to be displayed to the end user to show the keyboard shortcut. For example this property is Ctrl+Shift+I for the "Inspect" . + + + + + Gets the Icon for the in PNG, Bitmap or SVG formats in the form of an IStream. + + + Stream will be rewound to the start of the image data before being read. + + + + + Gets the kind of as . + + + + + Gets or sets the enabled property of the . Must only be used in the case of a custom context menu item. + + + The default value for this is true. + + + + + Gets or sets the checked property of the . + + + Must only be used for custom context menu items that are of kind or . + + + + + Gets the list of children menu items if the kind is . + + + If the kind is not , will return null. + + + + + CustomItemSelected event is raised when the user selects this . + + + Will only be raised for end developer created context menu items. + + + + + Event args for the event. + + + + + true if the loaded content is an error page. + + + + + Gets the ID of the navigation. + + + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + + + Gets or sets the root visual in the hosting app's visual tree. + + + This visual is where the WebView will connect its visual tree. The app uses this visual to position the WebView within the app. The app still needs to use the property to size the WebView. The RootVisualTarget property can be an IDCompositionVisual or a Windows::UI::Composition::ContainerVisual. WebView will connect its visual tree to the provided visual before returning from the property setter. The app needs to commit on its device setting the RootVisualTarget property. The RootVisualTarget property supports being set to null to disconnect the WebView from the app's visual tree. + + + + + Gets the current cursor that WebView thinks it should be. + + + The cursor should be set in WM_SETCURSOR through Mouse.SetCursor or set on the corresponding parent/ancestor HWND of the WebView through ::SetClassLongPtr. The HCURSOR can be freed so CopyCursor/DestroyCursor is recommended to keep your own copy if you are doing more than immediately setting the cursor. + + + + + Gets the current system cursor ID reported by the underlying rendering engine for WebView. + + + + + The event is raised when WebView thinks the cursor should be changed. + + + For example, when the mouse cursor is currently the default cursor but is then moved over text, it may try to change to the IBeam cursor. + It is expected for the developer to send messages (in addition to messages) through . This is to ensure that the mouse is actually within the WebView that sends out CursorChanged events. + + + + + Sends mouse input to the WebView. + + The mouse event kind. + The virtual keys associated with the eventKind. + The amount of wheel movement. + The absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the eventKind. + + If eventKind is or , then mouseData specifies the amount of wheel movement. + A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120. If eventKind is , , or , then mouseData specifies which X buttons were pressed or released. This value should be 1 if the first X button is pressed/released and 2 if the second X button is pressed/released. If eventKind is , then virtualKeys, mouseData, and point should all be zero. If eventKind is any other value, then mouseData should be zero. point is expected to be in the client coordinate space of the WebView. To track mouse events that start in the WebView and can potentially move outside of the WebView and host application, calling SetCapture and ReleaseCapture is recommended. To dismiss hover popups, it is also recommended to send messages. + + + + + Sends pen or pointer input to the WebView. + + The pointer event kind. + The pointer information. + + Accepts touch or pen pointer input of kinds defined in . + Any pointer input from the system must be converted into a first. + + + + + Call this method to inform the CoreWebView2CompositionController that a drag operation has left the WebView. + + + Corresponds to the [ICoreDropOperationTarget.LeaveAsync](/uwp/api/windows.applicationmodel.datatransfer.dragdrop.core.icoredropoperationtarget.leaveasync) method when performing a drag operation into the WebView. + + + + + This event is raised when elements on the page with "app-region" CSS property values corresponding to non-client regions change. Use the to see the kind of non-client region that changed. + + + + + Call this method to perform hit-testing inside of your message loop when the message is WM_NCHITTEST. + + The point parameter is expected to be in the client coordinate space of the WebView2. + The type of region which contains the point. + + + + This method retrieves the non-client regions on the page which corresponds to a given kind . + + The kind of non-client region. + This method returns a vector of rectangles. + + This method can be used inside the event handler to get the list of rects for the specific region that changed. + + + + + Event args for the event. + + + + + Returns host name of the server that requested client certificate authentication. + + + Normalization rules applied to the hostname are: + + + + Convert to lowercase characters for ascii characters. + + + Punycode is used for representing non ascii characters. + + + Strip square brackets for IPV6 address. + + + + + + + Returns port of the server that requested client certificate authentication. + + + + + Returns true if the server that issued this request is an http proxy. Returns false if the server is the origin server. + + + + + The list contains Base64 encoding of DER encoded distinguished names of certificate authorities allowed by the server. + + + + + Returns the list of when client certificate authentication is requested. The list contains mutually trusted CA certificate. + + + + + Selected certificate to respond to the server. + + + + + Indicates whether to cancel the certificate selection. + + + If canceled, the request is aborted regardless of the property. By default the value is false. + + + + + Indicates whether the event has been handled by host. + + + Set to true to respond to the server with or without a certificate. If this flag is true with a it responds to the server with the selected certificate otherwise respond to the server without a certificate. By default the value of and are false and display default client certificate selection dialog prompt to allow the user to choose a certificate. The is ignored unless is set to true. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + The kind of browser process exit that has occurred. + + + + + The process ID of the browser process that has exited. + + + + + Browser extension installed on current profile. + + + + + This is the browser extension's ID. This is the same browser extension ID returned by the browser extension API [chrome.runtime.id](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/id). Please see that documentation for more details on how the ID is generated. After an extension is removed, calling Id will return the id of the extension that is removed. + + + + + This is the browser extension's name. This value is defined in this browser extension's manifest.json file. If manifest.json define extension's localized name, this value will be the localized version of the name. Please see [Manifest.json name](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/manifest.json/name) for more details. + + + + + If IsEnabled is true then the Extension is enabled and running in WebView instances. If it is false then the Extension is disabled and not running in WebView instances. When a Extension is first installed, IsEnable are default to be true. IsEnabled is persisted per profile. After an extension is removed, calling IsEnabled will return the value at the time it was removed. + + + + + Removes this browser extension from its WebView2 Profile. The browser extension is removed immediately including from all currently running HTML documents associated with this WebView2 Profile. The removal is persisted and future uses of this profile will not have this extension installed. After an extension is removed, calling Remove again will cause an exception. + + + + + Sets whether this browser extension is enabled or disabled. This change applies immediately to the extension in all HTML documents in all WebView2s associated with this profile. After an extension is removed, calling Enable will not change the value of IsEnabled. + + + + + Represents a Basic HTTP authentication response that contains a user name and a password as according to RFC7617 (https://tools.ietf.org/html/rfc7617) + + + + + User name provided for authentication. + + + + + Password provided for authentication. + + + + + Event args for the BasicAuthenticationRequested event. Will contain the request that led to the HTTP authorization challenge, the challenge and allows the host to provide authentication response or cancel the request. + + + + + The URI that led to the authentication challenge. For proxy authentication requests, this will be the URI of the proxy server. + + + + + The authentication challenge string. + + + + + Response to the authentication request with credentials. + + + This object will be populated by the app if the host would like to provide authentication credentials. + + + + + Indicates whether to cancel the authentication request. + + + false by default. If set to true, Response will be ignored. + + + + + Gets a object. + + + Use this Deferral to defer the decision to show the Basic Authentication dialog. + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the key event kind that caused the event to run. + + + + + Gets the Win32 virtual key code of the key that was pressed or released. + + + It is one of the Win32 virtual key constants such as VK_RETURN or an (uppercase) ASCII value such as 'A'. Verify whether Ctrl or Alt are pressed by running GetKeyState(VK_CONTROL) or GetKeyState(VK_MENU). + + + + + Gets the LPARAM value that accompanied the window message. + + + See the documentation for the WM_KEYDOWN and WM_KEYUP messages. + + + + + Gets a representing the information passed in the LPARAM of the window message. + + + + + Indicates whether the event is handled by host. + + + + For browser accelerator keys, when an accelerator key is pressed, the propagation and processing order is: + + 1. A CoreWebView2Controller.AcceleratorKeyPressed event is raised + 1. WebView2 browser feature accelerator key handling + 1. Web Content Handling: If the key combination isn't reserved for browser actions, the key event propagates to the web content, where JavaScript event listeners can capture and respond to it. + + If `Handled` property is set to true anywhere along the path, the event propagation stops, and web content will not receive the key and this prevents the WebView from performing the default action for this accelerator key. Otherwise the WebView will perform the default action for the accelerator key. + + + + + This `IsBrowserAcceleratorKeyEnabled` property allows developers to control whether the browser handles accelerator keys such as Ctrl+P or F3, etc. + + + The `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` API is a convenient setting for developers to disable all the browser accelerator keys together. This setting also sets the default value for the `IsBrowserAcceleratorKeyEnabled` property. + + By default, `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` is `TRUE` and `IsBrowserAcceleratorKeyEnabled` is `TRUE`. When developers change `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting to `FALSE`, this will change default value for `IsBrowserAcceleratorKeyEnabled` to `FALSE`. If developers want specific keys to be handled by the browser after changing the `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting to `FALSE`, they need to enable these keys by setting `IsBrowserAcceleratorKeyEnabled` to `TRUE`. + + The `CoreWebView2Controller.AcceleratorKeyPressed` event is raised any time an accelerator key is pressed, regardless of whether accelerator keys are enabled or not. + + This API will give the event arg higher priority over the `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting when we handle the keys. + + With `IsBrowserAcceleratorKeyEnabled` property, if developers mark `IsBrowserAcceleratorKeyEnabled` as `FALSE`, the browser will skip the WebView2 browser feature accelerator key handling process, but the event propagation continues, and web content will receive the key combination. + + This property does not disable accelerator keys related to movement and text editing, such as: + - Home, End, Page Up, and Page Down + - Ctrl-X, Ctrl-C, Ctrl-V + - Ctrl-A for Select All + - Ctrl-Z for Undo + + +
      +
      diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.dll new file mode 100644 index 0000000..b2d08ad Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.xml b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.xml new file mode 100644 index 0000000..5b005e1 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.xml @@ -0,0 +1,504 @@ + + + + Microsoft.Web.WebView2.WinForms + + + + + This class is a bundle of the most common parameters used to create and instances. + Its main purpose is to be set to in order to customize the environment and/or controller used by a during implicit initialization. + + + This class isn't intended to contain all possible environment or controller customization options. + If you need complete control over the environment and/or controller used by a WebView2 control then you'll need to initialize the control explicitly by + creating your own environment (with ) and/or controller options (with ) and passing them to + *before* you set the property to anything. + See the class documentation for an initialization overview. + + + + + Creates a new instance of with default data for all properties. + + + + + Gets or sets the value to pass as the browserExecutableFolder parameter of when creating an environment with this instance. + + + + + Gets or sets the value to pass as the userDataFolder parameter of when creating an environment with this instance. + + + + + Gets or sets the value to use for the Language property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + Gets or sets the value to use for the ProfileName property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Gets or sets the value to pass as the AdditionalBrowserArguments parameter of which is passed to when creating an environment with this instance. + + + + + Gets or sets the value to use for the IsInPrivateModeEnabled property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Create a using the current values of this instance's properties. + + A task which will provide the created environment on completion, or null if no environment-related options are set. + + As long as no other properties on this instance are changed, repeated calls to this method will return the same task/environment as earlier calls. + If some other property is changed then the next call to this method will return a different task/environment. + + + + + Creates a using the current values of this instance's properties. + + A object or null if no controller-related properties are set. + Thrown if the parameter environment is null. + + + + Control to embed WebView2 in WinForms. + + + + + Create a new WebView2 WinForms control. + After construction the property is null. + Call to initialize the underlying . + + + This control is effectively a wrapper around the WebView2 COM API, which you can find documentation for here: https://aka.ms/webview2 + You can directly access the underlying ICoreWebView2 interface and all of its functionality by accessing the property. + Some of the most common COM functionality is also accessible directly through wrapper methods/properties/events on the control. + + Upon creation, the control's CoreWebView2 property will be null. + This is because creating the CoreWebView2 is an expensive operation which involves things like launching Edge browser processes. + There are two ways to cause the CoreWebView2 to be created: + 1) Call the method. This is referred to as explicit initialization. + 2) Set the property. This is referred to as implicit initialization. + Either option will start initialization in the background and return back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass your own to EnsureCoreWebView2Async or set the control's property prior to initialization. + + When initialization has finished (regardless of how it was triggered) then the following things will occur, in this order: + 1) The control's event will be invoked. If you need to perform one time setup operations on the CoreWebView2 prior to its use then you should do so in a handler for that event. + 2) If a Uri has been set to the property then the control will start navigating to it in the background (i.e. these steps will continue without waiting for the navigation to finish). + 3) The Task returned from will complete. + + For more details about any of the methods/properties/events involved in the initialization process, see its specific documentation. + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + + + + Cleans up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Overrides the base OnPaint event to have custom actions + in designer mode + + The graphics devices which is the source + + + + Overrides the base WndProc events to handle specific window messages. + + The Message object containing the HWND window message and parameters + + + + Gets or sets a bag of options which are used during initialization of the control's . + This property cannot be modified (an exception will be thrown) after initialization of the control's CoreWebView2 has started. + + Thrown if initialization of the control's CoreWebView2 has already started. + + + + Explicitly trigger initialization of the control's . + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass null (the default value) then a default environment will be created and used automatically. + + + A pre-created that should be used to create the . + Creating your own controller options gives you control over several options that affect how the is initialized. + If you pass a controllerOptions to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default controllerOptions will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes + or on exceptions. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + The following summarizes the possible error values and a description of why these errors occur. + + + Error Value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + *\\Edge\\Application* path used in browserExecutableFolder. + + + HRESULT_FROM_WIN32(ERROR_INVALID_STATE) + Specified options do not match the options of the WebViews that are currently running in the shared browser process. + + + HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) + WebView2 Initialization failed due to an invalid host HWND parentWindow. + + + HRESULT_FROM_WIN32(ERROR_DISK_FULL) + WebView2 Initialization failed due to reaching the maximum number of installed runtime versions. + + + HRESULT_FROM_WIN32(ERROR_PRODUCT_UNINSTALLED + If the Webview depends upon an installed WebView2 Runtime version and it is uninstalled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Could not find Edge installation. + + + HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) + User data folder cannot be created because a file with the same name already exists. + + + E_ACCESSDENIED + Unable to create user data folder, Access Denied. + + + E_FAIL + Edge runtime unable to start. + + + + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if this instance of is already disposed, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Explicitly trigger initialization of the control's . + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass null then a default environment will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes + or on exceptions. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if this instance of is already disposed, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + This is the private function which implements the actual background initialization task. + Cannot be called if the control is already initialized or has been disposed. + + + The environment to use to create the . + If that is null then a default environment is created with and its default parameters. + + + The controllerOptions to use to create the . + If that is null then a default controllerOptions is created with its default parameters. + + A task representing the background initialization process. + All the event handlers added here need to be removed in . + + + + Protected CreateParams property. Used to set custom window styles to the forms HWND. + + + + + Protected VisibilityChanged handler. + + + + + Protected SizeChanged handler. + + + + + Protected Select method: override this to capture tab direction when WebView control is activated + + + + + Protected OnGotFocus handler. + + + + + Protected OnParentChanged handler. + + + + + True if initialization finished successfully and the control is not disposed yet. + + + + + Recursive retrieval of the parent control + + The control to get the parent for + The root parent control + + + + The underlying CoreWebView2. Use this property to perform more operations on the WebView2 content than is exposed + on the WebView2. This value is null until it is initialized and the object itself has undefined behaviour once the control is disposed. + You can force the underlying CoreWebView2 to + initialize via the method. + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + + + + The zoom factor for the WebView. + + + + + Enable/disable external drop. + + + + + The Source property is the URI of the top level document of the + WebView2. Setting the Source is equivalent to calling . + Setting the Source will trigger initialization of the , if not already initialized. + The default value of Source is null, indicating that the is not yet initialized. + + Specified value is not an absolute . + Specified value is null and the control is initialized. + + + + + Returns true if the webview can navigate to a next page in the + navigation history via the method. + This is equivalent to the . + If the underlying is not yet initialized, this property is false. + + + + + + Returns true if the webview can navigate to a previous page in the + navigation history via the method. + This is equivalent to the . + If the underlying is not yet initialized, this property is false. + + + + + + The default background color for the WebView. + + + + + Executes the provided script in the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Reloads the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Navigates to the next page in navigation history. + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + Navigates to the previous page in navigation history. + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + Renders the provided HTML as the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + + Stops any in progress navigation in the . + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + This event is triggered either 1) when the control's has finished being initialized (regardless of how it was triggered or whether it succeeded) but before it is used for anything + OR 2) the initialization failed. + You should handle this event if you need to perform one time setup operations on the CoreWebView2 which you want to affect all of its usages + (e.g. adding event handlers, configuring settings, installing document creation scripts, adding host objects). + + + This sender will be the WebView2 control, whose CoreWebView2 property will now be valid (i.e. non-null) for the first time + if is true. + Unlikely this event can fire second time (after reporting initialization success first) + if the initialization is followed by navigation which fails. + + + + + NavigationStarting dispatches before a new navigate starts for the top + level document of the . + This is equivalent to the event. + + + + + + NavigationCompleted dispatches after a navigate of the top level + document completes rendering either successfully or not. + This is equivalent to the event. + + + + + + WebMessageReceived dispatches after web content sends a message to the + app host via chrome.webview.postMessage. + This is equivalent to the event. + + + + + + SourceChanged dispatches after the property changes. This may happen + during a navigation or if otherwise the script in the page changes the + URI of the document. + This is equivalent to the event. + + + + + + ContentLoading dispatches after a navigation begins to a new URI and the + content of that URI begins to render. + This is equivalent to the event. + + + + + + ZoomFactorChanged dispatches when the property changes. + This is equivalent to the event. + + + + + + Required designer variable. + + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.dll new file mode 100644 index 0000000..ed79cd9 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.xml b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.xml new file mode 100644 index 0000000..c6e27b6 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.xml @@ -0,0 +1,1932 @@ + + + + Microsoft.Web.WebView2.Wpf + + + + + This class is a bundle of the most common parameters used to create and instances. + Its main purpose is to be set to in order to customize the environment and/or controller used by a during implicit initialization. + It is also a nice WPF integration utility which allows commonly used environment/controller parameters to be dependency properties and be created and used in markup. + + + This class isn't intended to contain all possible environment or controller customization options. + If you need complete control over the environment and/or controller used by a WebView2 control then you'll need to initialize the control explicitly by + creating your own environment (with ) and/or controller options (with ) and passing them to + *before* you set the property to anything. + See the class documentation for an initialization overview. + + + + + Creates a new instance of with default data for all properties. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to pass as the browserExecutableFolder parameter of when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to pass as the userDataFolder parameter of when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the Language property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the AdditionalBrowserArguments property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the AreBrowserExtensionsEnabled property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the ProfileName property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the IsInPrivateModeEnabled property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the ScriptLocale property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Create a using the current values of this instance's properties. + + A task which will provide the created environment on completion, or null if no environment-related options are set. + + As long as no other properties on this instance are changed, repeated calls to this method will return the same task/environment as earlier calls. + If some other property is changed then the next call to this method will return a different task/environment. + + + + + Create a using the current values of this instance's properties. + + A object or null if no controller-related properties are set. + Thrown if the parameter environment is null. + + + + This class provides helper methods for working with Direct3D in the WebView2 WPF control. + It includes methods for creating Direct3D9 and Direct3D11 devices, creating textures, + copying resources, and getting shared handles, among others. These methods are used in + the GraphicsItemD3DImage class to interact with Direct3D objects and resources. + + + The class includes PInvoke declarations for calling Direct3D functions from unmanaged code. + It also defines several COM interfaces and structures necessary for interacting with + Direct3D objects. + Note: This class is intended for internal use by the WebView2 WPF control and should not + be used directly by application developers. + + + + + This Class is a capturing the content of the provided (the WebView2 visual). + + + + + Tracks the conditions which block implicit initialization and whether it has been requested or not. + The analogy is a set of gates which are either open (implicit init allowed) or closed (will have to wait). + All sub-gates must be open before implicit init can proceed. + If implicit init is requested while the gate is open then it happens immediately. + If it's requested while the gate is closed then it occurs when the gate becomes open. + + + It should be reasonably straight-forward to expand this class in the future to: + * add new sub-gates to further restrict when implicit initialization can occur + * support storing and invoking multiple actions next time the gate is open instead of only one + + + + + Tracks whether a sub-gate regarding / is open or closed. + This sub-gate is only closed after calls to `BeginInit` and before an equal number of calls to `EndInit`. + + + We don't want implicit initialization to occur in between those calls, + because implicit initialization is a side effect of setting the Source property, + and side effects of setting properties during that period are supposed to be delayed until `EndInit`. + + + + + How many times has been called without being called. + + + + + Tracks whether a sub-gate regarding is open or closed. + This sub-gate is closed if `SynchronizationContext.Current == null`. + + + Initialization won't work without a `SynchronizationContext` because otherwise an `await` might resume on a different thread. + As far as I know so far this only occurs before an event loop as started on the running thread. + Once there's an event loop running the `SynchronizationContext` ensures that `await`s resume in the same event loop (i.e. same thread). + Although it's a rare corner case, it's possible to create a `Window` w/ `WebView2` before an app's event loop starts. + This sub-gate handles that corner case. + + + + + An action which will trigger initialization next time the gate is open (and only once). + + + This basically tracks whether or not implicit initialization has been requested while the gate is closed. + If this is non-null then it should be a delegate that calls . + + + + + Closes the gate until is called an equal number of times. + + + + + Opens the gate closed by after being called the same number of times. + + + + + A handler that should be attached to an event which indicates that exists. + The best one I know of right now is . + When the handler is called, the gate will re-evaluate its state and potentially allow any pending initialization action. + + + + + Run a given action when the gate is open. + + + If the gate is currently open then the action runs immediately. + Otherwise the action runs next time the gate is discovered to be open. + The action is only ever run once; it will not run again a second/subsequent time the gate opens. + If the gate is closed and another action is already pending then the new action *overwrites* the current one (i.e. the currently stored action will never run). + To "forget" a currently stored action, pass `null`. + + Action to run when the gate is open, or null to clear a previously specified action. + + + + Examine our overall open/closed state and run any pending action if appropriate. + + + + + The public interfaces of WebView2 WPF control. + + + + + Gets or sets a bag of options which are used during initialization of the control's . + Setting this property will not work after initialization of the control's has started (the old value will be retained). + See the class documentation for an initialization overview. + + + + + + Accesses the complete functionality of the underlying COM API. + Returns null until initialization has completed. + See the class documentation for an initialization overview. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + The event is raised when the property changes. + This event directly exposes . + + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + This event is triggered either + 1) when the control's has finished being initialized (regardless of how initialization was triggered) but before it is used for anything, or + 2) if the initialization failed. + You should handle this event if you need to perform one time setup operations on the which you want to affect all of its usages. + (e.g. adding event handlers, configuring settings, installing document creation scripts, adding host objects). + See the class documentation for an initialization overview. + + + This sender will be the control, whose property will now be valid (i.e. non-null) for the first time + if is true. + Unlikely this event can fire second time (after reporting initialization success first) + if the initialization is followed by navigation which fails. + + + + + + Explicitly triggers initialization of the control's . + See the class documentation for an initialization overview. + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass an environment to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default environment will be created and used automatically. + + + A pre-created that should be used to create the . + Creating your own controller options gives you control over several options that affect how the is initialized. + If you pass a controllerOptions to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default controllerOptions will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress, unless previous initialization has already failed. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + The following summarizes the possible error values and a description of why these errors occur. + + + Error Value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + *\\Edge\\Application* path used in browserExecutableFolder. + + + HRESULT_FROM_WIN32(ERROR_INVALID_STATE) + Specified options do not match the options of the WebViews that are currently running in the shared browser process. + + + HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) + WebView2 Initialization failed due to an invalid host HWND parentWindow. + + + HRESULT_FROM_WIN32(ERROR_DISK_FULL) + WebView2 Initialization failed due to reaching the maximum number of installed runtime versions. + + + HRESULT_FROM_WIN32(ERROR_PRODUCT_UNINSTALLED + If the Webview depends upon an installed WebView2 Runtime version and it is uninstalled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Could not find Edge installation. + + + HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) + User data folder cannot be created because a file with the same name already exists. + + + E_ACCESSDENIED + Unable to create user data folder, Access Denied. + + + E_FAIL + Edge runtime unable to start. + + + + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if is null, which probably indicates that the application's event loop hasn't started yet. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Explicitly triggers initialization of the control's . + See the class documentation for an initialization overview. + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass an environment to this method then it will override any settings specified on the property. + If you pass null and no value has been set to then a default environment will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress, unless previous initialization has already failed. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if is null, which probably indicates that the application's event loop hasn't started yet. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + The top-level which the WebView is currently displaying (or will display once initialization of its is finished). + Generally speaking, getting this property is equivalent to getting the property and setting this property (to a different value) is equivalent to calling the method. + + + Getting this property before the has been initialized will retrieve the last Uri which was set to it, or null (the default) if none has been. + Setting this property before the has been initialized will cause initialization to start in the background (if not already in progress), after which the will navigate to the specified . + This property can never be set back to null or to a relative . + See the class documentation for an initialization overview. + + Thrown if has already been called on the control. + Thrown if the property is set to null. + Thrown if the property is set to a relative (i.e. a whose property is false). + + + + + Returns true if the WebView can navigate to a previous page in the navigation history. + Wrapper around the property of . + If isn't initialized yet then returns false. + + + + + + Returns true if the WebView can navigate to a next page in the navigation history. + Wrapper around the property of . + If isn't initialized yet then returns false. + + + + + + The zoom factor for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was set to it, or 1.0 (the default) if none has been. + The most recent value set to this property before the CoreWebView2 has been initialized will be set on it after initialization. + + + + + + The default background color for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was + set to it, or Color.White (the default) if none has been. + The most recent value set to this property before CoreWebView2Controller has been initialized will be set on it after initialization. + + + + + The foreground color to be used in design mode. + + + + + The AllowExternalDrop property for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was + set to it, or true (the default) if none has been. + The most recent value set to this property before CoreWebView2Controller has been initialized will be set on it after initialization. + + + + + Navigates the WebView to the previous page in the navigation history. + Equivalent to calling + If hasn't been initialized yet then does nothing. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Navigates the WebView to the next page in the navigation history. + Equivalent to calling . + If hasn't been initialized yet then does nothing. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Reloads the current page. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Stops all navigations and pending resource fetches. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Initiates a navigation to htmlContent as source HTML of a new document. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + + + Executes JavaScript code from the javaScript parameter in the current top level document rendered in the WebView. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Attempts to set focus to the WebView2 Control. + Equivalent to calling . + Returns true if keyboard focus and logical focus were set to this element; + false if only logical focus was set to this element, or if the call to this method did not force the focus to change. + + + + + Defines internal operations specific to the WebView2 WPF control, separating the control-specific logic + that cannot be shared across different types of controls. + + + + + Initializes the WebView2 controller with operations specific to the control type. + + + + + Unregister controller's handlers specific to the control type. + + + + + A control to embed web content in a WPF application. + + + This control is effectively a wrapper around the [WebView2 COM API](https://aka.ms/webview2). + You can directly access the underlying + ICoreWebView2 interface and all of its functionality by accessing the + property. Some of the most common COM + functionality is also accessible directly through wrapper + methods/properties/events on the control. + + Upon creation, the control's property will be + null. This is because creating the is an + expensive operation which involves things like launching Edge browser + processes. There are two ways to cause the to + be created: + + + Call the method. This is + referred to as explicit initialization. + + + Set the property (which could be done from + markup, for example). This is referred to as implicit initialization. + Either option will start initialization in the background and return + back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass + your own to or set the control's property prior to initialization. + + + + When initialization has finished (regardless of how it was triggered or + whether it succeeded) then the following things will occur, in this + order: + + + The control's event + will be invoked. If you need to perform one time setup operations on + the prior to its use then you should + do so in a handler for that event. + + + If initialization was successful and a Uri has been set to the property then the control will start navigating to it in + the background (i.e. these steps will continue without waiting for the + navigation to finish). + + + The Task returned from will + complete. + + + + For more details about any of the methods/properties/events involved in + the initialization process, see its specific documentation. + + Because the control's is a very heavyweight + object (potentially responsible for multiple running processes and + megabytes of disk space) the control implements to provide an explicit means to free it. + Calling will release the + and its underlying resources (except any that are also being used by other + WebViews), and reset to null. After has been called the cannot be + re-initialized, and any attempt to use functionality which requires it + will throw an . + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + Note that this control extends in order to embed + windows which live outside of the WPF ecosystem. This has some + implications regarding the control's input and output behavior as well as + the functionality it "inherits" from and . + See the and [WPF/Win32 interop](/dotnet/framework/wpf/advanced/wpf-and-win32-interoperation#hwnds-inside-wpf) + documentation for more information. + + + + + + Creates a new instance of a WebView2 control. + Note that the control's will be null until initialized. + See the class documentation for an initialization overview. + + + + + The WPF which backs the property. + + + + + + + + + This is overridden from and is called to instruct us to create our HWND. + + The HWND that we should use as the parent of the one we create. + The HWND that we created. + + + + + This is overridden from and is called to instruct us to destroy our HWND. + + Our HWND that we need to destroy. + + + + + This is overridden from and is called to provide us with Win32 messages that are sent to our hwnd. + + Window receiving the message (should always match our ). + Indicates the message being received. See Win32 documentation for WM_* constant values. + The "wParam" data being provided with the message. Meaning varies by message. + The "lParam" data being provided with the message. Meaning varies by message. + If true then the message will not be forwarded to any (more) handlers. + Return value varies by message. + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + Override for painting to draw + + The tools to handle the drawing via . + + + + + + + + + + + + + + + + + + + + + + This is called by our base class according to the typical implementation of the pattern. + We implement it by releasing all of our underlying COM resources, including our . + + True if a caller is explicitly calling Dispose, false if we're being finalized. + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + Changes our controller's ParentWindow to the given HWND, along with any other necessary associated work. + + The new HWND to set as the controller's parent. IntPtr.Zero means that the controller will have no parent and the CoreWebView2 will be hidden. + Whether or not to call as required. Defaults to true. If you pass false then you should call it yourself if required. + + Reparenting the controller isn't necessarily as simple as changing its ParentWindow property, + and this method exists to ensure that any other work that needs to be done at the same time gets done. + The reason that SyncControllerWithParentWindow isn't baked directly into this method is because + sometimes we want to call the Sync functionality without necessarily reparenting (e.g. during initialization). + + + + + Syncs visual/windowing information between the controller and its parent HWND. + This should be called any time a new, non-null HWND is set as the controller's parent, + including when the controller is first created. + + + + + This is overridden from and called when our control's location has changed. + The HwndHost takes care of updating the HWND we created. + What we need to do is move our CoreWebView2 to match the new location. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + This is overridden from and is called to inform us that tabbing has caused the focus to move into our control/window. + Since WPF can't manage the transition of focus to a non-WPF HWND, it delegates the transition to us here. + So our job is just to place the focus in our external HWND. + + Information about how the focus is moving. + true to indicate that we handled the navigation, or false to indicate that we didn't. + + + + This is overridden from and called to allow us to handle key press input. + WPF should never actually call this in response to keyboard events because we're hosting a non-WPF window. + When our window has focus Windows will send the input directly to it rather than to WPF's top-level window and input system. + This override should only be called when we're explicitly forwarding accelerator key input from the CoreWebView2 to WPF (in CoreWebView2Controller_AcceleratorKeyPressed). + Even then, this KeyDownEvent is only triggered because our PreviewKeyDownEvent implementation explicitly triggers it, matching WPF's usual system. + So the process is: + + CoreWebView2Controller_AcceleratorKeyPressed + PreviewKeyDownEvent + KeyDownEvent + OnKeyDown + + . + + + + + See . + + + + + This is the "Preview" (i.e. tunneling) version of , so it actually happens first. + Like OnKeyDown, this will only ever be called if we're explicitly forwarding key presses from the CoreWebView2. + In order to mimic WPF's standard input handling, when we receive this we turn around and fire off the standard bubbling KeyDownEvent. + That way others in the WPF tree see the same standard pair of input events that WPF itself would have triggered if it were handling the key press. + + + + + + See . + + + + + The WPF which backs the property. + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True when we're in design mode and shouldn't create an underlying CoreWebView2. + + + + + The WPF which backs the property. + + + + + + + + + Design mode drawing content. + + + + + + + + + + + + + + + + + This is an event handler for our CoreWebView2's ProcessFailedEvent. + + + + + This is a "gate" which controls whether or not implicit initialization can occur. + If implicit initialization is triggered while the gate is closed, + then the initialization should be delayed until the gate opens. + When we want to trigger implicit initialization we route the call through this gate. + If the gate is open then the initialization will proceed. + If the gate is closed then it will remember to trigger the initialization when it opens. + + + + + Implementation of the ISupportInitialize pattern. + + + + + Implementation of the ISupportInitialize pattern. + + + + + Updates one of our dependency properties to match a new value from the . + It both sets the value and remembers (in _propertyChangingFromCore) that it came from the CoreWebView2 rather than the caller, + allowing the property's "on changed" handler to alter its behavior based on where the new value came from. + It's only intended to be called in a CoreWebView2 event handler that's informing us of a new property value. + It's basically just a wrapper around the inherited SetCurrentValue which also maintains _propertyChangingFromCore. + See the comments on for additional background info. + One more thing worth explicitly stating is that it wraps SetCurrentValue rather than SetValue, + in order to avoid overwriting any OneWay bindings that are set on the specified properties. + Check the link https://stackoverflow.com/q/4230698 for more information about the difference between SetValue and SetCurrentValue. + + The property to change due to an equivalent change in the CoreWebView2. + The new value from the CoreWebView2. + + + + Checks if a given property is currently being updated to match an equivalent change in the . + This method should only be called from a property's "on changed" handler; it has no meaning at any other time. + It is used to determine if the property is changing to match the CoreWebView2 or because the caller set it. + Usually this is used in order to decide if the new value needs to be propagated down to the CoreWebView2. + See the comments on for additional background info. + + The property to check. + True if the property is changing to match the CoreWebView2, or false if the property was changed by the caller. + + + + This is a handler for our base UIElement's IsVisibleChanged event. + It's predictably fired whenever IsVisible changes, and IsVisible reflects the actual current visibility status of the control. + We just need to pass this info through to our CoreWebView2Controller so it can save some effort when the control isn't visible. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls to validate a potential new Source value. + + + True if the value is valid, false if it is not. + If we return false then WPF should respond by throwing an . + + + Note that we unfortunately can't treat null as invalid here because null is valid prior to initialization. + + + + + This is a callback that WPF calls when the WPF Source property's value changes. + This might have been triggered by either: + 1) The caller set Source to programmatically trigger a navigation. + 2) The CoreWebView changed its own source and we're just updating the dependency property to match. + We use to distinguish the two cases. + + + + + + + + This is an event handler for our CoreWebView2's SourceChanged event. + Unsurprisingly, it fires when the CoreWebView2's source URI has been changed. + Note that there are two distinct triggers for this: + 1) The CoreWebView2 was told to navigate programmatically (potentially by us, see SourcePropertyChanged). + 2) The user interacted with the CoreWebView2, e.g. clicked a link. + In either of the above cases, this event might trigger several times due to e.g. redirection. + Aside from propagating to our own event, we just need to update our WPF Source property to match the CoreWebView2's. + + + + + + + + This is an event handler for our CoreWebView2's NavigationStarting event. + We just need to propagate the event to WPF. + + + + + + + + This is an event handler for our CoreWebView2's NavigationCompleted event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2's HistoryChanged event. + We're handling it in order to update our WPF CanGoBack and CanGoForward properties. + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + This is an event handler for our CoreWebView2Controller's MoveFocusRequested event. + It fires when the CoreWebView2Controller has focus but wants to move it elsewhere in the app. + E.g. this happens when the user tabs past the last item in the CoreWebView2 and focus needs to return to some other app control. + So our job is just to tell WPF to move the focus on to the next control. + Note that we don't propagate this event outward as a standard WPF routed event because we've implemented its purpose here. + If users of the control want to track focus shifting in/out of the control, they should use standard WPF events. + + + + + This is an event handler for our CoreWebView2Controller's GotFocus event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2Controller's LostFocus event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2Controller's AcceleratorKeyPressed event. + This is called to inform us about key presses that are likely to have special behavior (e.g. esc, return, Function keys, letters with modifier keys). + WPF can't detect this input because Windows sends it directly to the Win32 CoreWebView2Controller control. + We implement this by generating standard WPF key input events, allowing callers to handle the input in the usual WPF way if they want. + If nobody handles the WPF key events then we'll allow the default CoreWebView2Controller logic (if any) to handle it. + Of the possible options, this implementation should provide the most flexibility to callers. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF ZoomFactor property's value changes. + This might have been triggered by either: + 1) The caller set ZoomFactor to change the zoom of the CoreWebView2. + 2) The CoreWebView2 changed its own ZoomFactor and we're just updating the dependency property to match. + We use to distinguish the two cases. + + + + + + + + This is an event handler for our CoreWebView2Controller's ZoomFactorChanged event. + Unsurprisingly, it fires when the CoreWebView2Controller's ZoomFactor has been changed. + Note that there are two distinct triggers for this: + 1) The value was changed programmatically (potentially by us, see ZoomFactorPropertyChanged). + 2) The user interacted with the CoreWebView2, e.g. CTRL + Mouse Wheel. + Aside from propagating to our own event, we just need to update our WPF ZoomFactor property to match the CoreWebView2Controller's. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF DefaultBackgroundColor property's value changes. + Since CoreWebView2Controller does not update this property itself, this is only triggered by the + caller setting DefaultBackgroundColor. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF AllowExternalDrop property's value changes. + Since CoreWebView2Controller does not update this property itself, this is only triggered by the + caller setting AllowExternalDrop. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + + + + + + + + + + This is an event handler for our CoreWebView2's ContentLoading event. + We just need to propagate the event to WPF. + + + + + + + + + + + This is an event handler for our CoreWebView2's WebMessageReceived event. + We just need to propagate the event to WPF. + + + + + Moves focus to the CoreWebView2Controller according to the + + + + + This is an event handler for the event. + It is called to inform us when we receive the keyboard focus. + We handle this by passing the keyboard focus on to the underlying . + We never want to land in a state where our control actually has the keyboard focus. + + The control that received keyboard focus. + Arguments from the underlying GotKeyboardFocus event. + + For WebView2 control, it's actually possible for us to receive keyboard focus without this method being called. + One known case where that happens is when our parent window is deactivated while we have focus, then reactivated. + We handle that case in . + + + + + + Implementation of pattern. + Developers should never reach the WebView2Base class here. + + + + + Implementation of the pattern. + Should on be called during m_element's Dispose(). + When this is called, it means all resources releted to the control are disposed and we can safely remove the control from the dictionary. + + + + + Visual hosting version of the WebView2 control. + + + This control is effectively a wrapper around the [WebView2 COM + API](https://aka.ms/webview2). You can directly access the underlying + ICoreWebView2 interface and all of its functionality by accessing the + property. Some of the most common COM + functionality is also accessible directly through wrapper + methods/properties/events on the control. + + Upon creation, the control's property will be + null. This is because creating the is an + expensive operation which involves things like launching Edge browser + processes. There are two ways to cause the to + be created: + + + Call the method. This is + referred to as explicit initialization. + + + Set the property (which could be done from + markup, for example). This is referred to as implicit initialization. + Either option will start initialization in the background and return + back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass + your own to or set the control's property prior to initialization. + + + + When initialization has finished (regardless of how it was triggered or + whether it succeeded) then the following things will occur, in this + order: + + + The control's event + will be invoked. If you need to perform one time setup operations on + the prior to its use then you should + do so in a handler for that event. + + + If initialization was successful and a Uri has been set to the property then the control will start navigating to it in + the background (i.e. these steps will continue without waiting for the + navigation to finish). + + + The Task returned from will + complete. + + + + For more details about any of the methods/properties/events involved in + the initialization process, see its specific documentation. + + Because the control's is a very heavyweight + object (potentially responsible for multiple running processes and + megabytes of disk space) the control implements to provide an explicit means to free it. + Calling will release the + and its underlying resources (except any that are also being used by other + WebViews), and reset to null. After has been called the cannot be + re-initialized, and any attempt to use functionality which requires it + will throw an . + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + This control extends in order to host the image + displaying WebView's content using template. This has some + implications regarding the control's input and output behavior as well as + the functionality it "inherits" from and . + + The content of is rendered by an . + By default, of WebView2CompositionControl + is set to true. This can prevent the from becoming blurry at certain dimensions, + but it disables anti-aliasing. Set it to false if you want to keep the anti-aliasing. + + Note that the uses a [GraphicsCaptureSession](https://learn.microsoft.com/en-us/uwp/api/windows.graphics.capture.graphicscapturesession) + to capture the screen content from the underlying browser processes. + As such, you may experience lower framerates compared to the standard control, and DRM protected + content will fail to play or display properly. + + + + + + + TemplatePart Name constant for the Image used to represent WebView2. + + + + + Image control uses to display content of WebView2. + + + + + Component used to capture from WebView visual and work as source of Image. + + + + + interface. + + + + + Static constructor for the WebView2CompositionControl class. + + + This static constructor is responsible for overriding the default style key property + for instances of the WebView2CompositionControl class. It sets the metadata to use + the type of the WebView2CompositionControl as the default style key. + See href="https://learn.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.defaultstylekey?view=netframework-4.8.1"/> + + + + + Creates a new instance of a WebView2Composition control. + Note that the control's will be null until initialized. + See the class documentation for an initialization overview. + + + + + This is an event handler for WPF control's SizeChanged event. + We use CoreWebView2Controller.NotifyParentWindowPositionChanged to notify our browser our + size and relative location has changed. + + + + + This is an event handler for WPF control's LocationChange event. + We use CoreWebView2Controller.NotifyParentWindowPositionChanged to notify our browser our + position has changed. + + + + + Initialize the dispatcher queue. + + + + + This is an event handler for our CoreWebView2CompositionController's CursorChanged event. + We use CursorInteropHelper to Obtain a WPF Cursor from the provided Win32 Handle. + + + + + Send the pointer event to the WebView2 Control. + + + + + + This is an event handler for WPF control's OnTouchDown event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + This is an event handler for WPF control's OnTouchMove event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + This is an event handler for WPF control's OnTouchUp event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + Helper function to get the of the mouse event. + + + + + Send the mouse event to the WebView2 Control. + + + + + + This is an event handler for WPF control's OnMouseMove event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseDown event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseUp event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseWheel event. + We use CoreWebView2CompositionController.SendMouseInput to send the input to our browser. + + + + + This is an event handler for WPF control's OnMouseDoubleClick event. + We use CoreWebView2CompositionController.SendMouseInput to send the input to our browser. + + + + + The WPF which backs the property. + + + + + + + + + Override for painting to draw + + The tools to handle the drawing via . + + + + + + + + + + + + + + + + + + + + + + Implementation of the pattern. + This will release all of our underlying COM resources. + + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + WebView2Composition Control only needs IKeyboardInputSink:TabInto to get the direction of tab traversal. + KeyboardInputSite is not implemented by WebView2Composition. + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + This is an event handler for our CoreWebView2Controller's GotFocus event. + Used to record whether the control currently has focus. + + + + + This is an event handler for our CoreWebView2Controller's Lost event. + We just need to propagate the event to WPF. + + + + + IKeyboardInputSink:HasFocusWithin interface. + Whether WebView has focus. + + + + + IKeyboardInputSink:OnMnemonic interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:RegisterKeyboardInputSink interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:TabInto interface. + + + + + IKeyboardInputSink:TranslateAccelerator interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:TranslateChar interface. + Not implemented by WebView2. + + + + + This is overridden from and called to allow us to handle key press input. + WPF should never actually call this in response to keyboard events because the focus is on the controller's HWND. + When Controller's HWND has focus, WPF does not know the Controller's HWND belongs to this control, and the key event will not be fired for this control and WPF main window. + This override should only be called when we're explicitly forwarding accelerator key input from the CoreWebView2 to WPF (in CoreWebView2Controller_AcceleratorKeyPressed). + Even then, this KeyDownEvent is only triggered because our PreviewKeyDownEvent implementation explicitly triggers it, matching WPF's usual system. + So the process is: + + CoreWebView2Controller_AcceleratorKeyPressed + PreviewKeyDownEvent + KeyDownEvent + OnKeyDown + + . + + + + + See . + + + + + This is the "Preview" (i.e. tunneling) version of , so it actually happens first. + Like OnKeyDown, this will only ever be called if we're explicitly forwarding key presses from the CoreWebView2. + In order to mimic WPF's standard input handling, when we receive this we turn around and fire off the standard bubbling KeyDownEvent. + That way others in the WPF tree see the same standard pair of input events that WPF itself would have triggered if it were handling the key press. + + + + + + See . + + + + + The WPF which backs the property. + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + Gets or sets the divider for the rendering frame rate of the WebViewCompositionControl. + + + The FpsDivider property affects how the rendering frame rate is divided. For example, if the default rendering frame rate of the content is 60 frames + per second (fps), setting the FpsDivider to 2 reduces the frame rate to 30 fps. This property is useful for reducing the rendering load and improving + performance for scenarios where high frame rates are unnecessary. + + + + + This is a callback that WPF calls when our WPF FpsDivider property's value changes. + We implement it by setting the FpsDivider of the GraphicsItemD3DImage. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True when we're in design mode and shouldn't create an underlying CoreWebView2. + + + + + GeneratedInternalTypeHelper + + + + + CreateInstance + + + + + GetPropertyValue + + + + + SetPropertyValue + + + + + CreateDelegate + + + + + AddEventHandler + + + + diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/SQLitePCLRaw.batteries_v2.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/SQLitePCLRaw.batteries_v2.dll new file mode 100644 index 0000000..f9eb46b Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/SQLitePCLRaw.batteries_v2.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/SQLitePCLRaw.core.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/SQLitePCLRaw.core.dll new file mode 100644 index 0000000..556d40f Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/SQLitePCLRaw.core.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/SQLitePCLRaw.provider.e_sqlite3.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/SQLitePCLRaw.provider.e_sqlite3.dll new file mode 100644 index 0000000..a6df9a6 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/SQLitePCLRaw.provider.e_sqlite3.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/System.Diagnostics.EventLog.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/System.Diagnostics.EventLog.dll new file mode 100644 index 0000000..6281e73 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/System.Diagnostics.EventLog.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/System.IO.Packaging.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/System.IO.Packaging.dll new file mode 100644 index 0000000..eb95db7 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/System.IO.Packaging.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/System.ServiceProcess.ServiceController.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/System.ServiceProcess.ServiceController.dll new file mode 100644 index 0000000..0d456dc Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/System.ServiceProcess.ServiceController.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Core.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Core.dll new file mode 100644 index 0000000..d623133 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Core.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Fonts.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Fonts.dll new file mode 100644 index 0000000..444918b Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Fonts.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Tokenization.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Tokenization.dll new file mode 100644 index 0000000..a9b3be9 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Tokenization.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Tokens.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Tokens.dll new file mode 100644 index 0000000..7595fb6 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.Tokens.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.dll new file mode 100644 index 0000000..3645736 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/UglyToad.PdfPig.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/WebView2Loader.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/WebView2Loader.dll new file mode 100644 index 0000000..983ee32 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/WebView2Loader.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/e_sqlite3.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/e_sqlite3.dll new file mode 100644 index 0000000..379665c Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/e_sqlite3.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/runtimes/win-x64/native/WebView2Loader.dll b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/runtimes/win-x64/native/WebView2Loader.dll new file mode 100644 index 0000000..983ee32 Binary files /dev/null and b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/runtimes/win-x64/native/WebView2Loader.dll differ diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/adr-writer.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/adr-writer.skill.md new file mode 100644 index 0000000..e746d27 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/adr-writer.skill.md @@ -0,0 +1,95 @@ +--- +name: adr-writer +label: 아키텍처 결정 기록 (ADR) +description: 아키텍처 결정 사항을 표준 ADR 형식으로 문서화합니다. +icon: \uE82D +allowed-tools: + - file_read + - file_write + - folder_map + - grep + - search_codebase +tabs: code +--- + +아키텍처 결정 사항을 ADR(Architecture Decision Record) 형식으로 문서화하세요. + +## ADR이란? +소프트웨어 아키텍처에서 내린 중요한 결정의 배경, 대안, 근거를 기록하는 경량 문서입니다. +미래의 팀원이 "왜 이렇게 결정했는지"를 이해할 수 있게 합니다. + +## 워크플로우 + +1. **결정 사항 확인**: 사용자에게 다음을 파악 + - 어떤 결정을 내렸는가 (또는 내려야 하는가) + - 관련 코드/시스템 영역 + - 고려한 대안들 +2. **코드 분석** (선택): 관련 코드 구조를 읽어 현재 상태 파악 +3. **ADR 작성**: 표준 형식으로 문서 생성 +4. **파일 저장**: `docs/adr/` 폴더에 번호 형식으로 저장 + +## ADR 표준 형식 + +```markdown +# ADR-[번호]: [결정 제목] + +**상태**: 제안됨 | 승인됨 | 폐기됨 | 대체됨 +**날짜**: YYYY-MM-DD +**결정자**: [이름/팀] + +## 맥락 (Context) +어떤 상황에서 이 결정이 필요한가? +- 기술적 배경 +- 비즈니스 요구사항 +- 제약 조건 + +## 결정 (Decision) +무엇을 결정했는가? +- 선택한 방안의 구체적 내용 +- 적용 범위 + +## 대안 (Alternatives) + +### 대안 1: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +### 대안 2: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +## 근거 (Rationale) +왜 이 결정을 선택했는가? +- 대안 대비 장점 +- 트레이드오프 분석 +- 참고 자료/벤치마크 + +## 결과 (Consequences) + +### 긍정적 +- ... + +### 부정적 +- ... + +### 리스크 +- ... + +## 관련 문서 +- ADR-[관련번호]: [제목] +- [외부 참고 링크] +``` + +## 파일 명명 규칙 +- 위치: `docs/adr/` (없으면 생성) +- 파일명: `ADR-NNNN-제목-요약.md` (예: `ADR-0001-데이터베이스-선택.md`) +- 번호: 기존 ADR 파일 조회 후 자동 부여 + +## 규칙 +- 결정의 "왜"를 중심으로 작성 (코드를 읽으면 "무엇"은 알 수 있음) +- 대안은 최소 2개 이상 제시 +- 트레이드오프를 솔직하게 기록 (완벽한 선택은 없음) +- 짧고 명확하게 (1~2페이지 이내) +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/api-docs.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/api-docs.skill.md new file mode 100644 index 0000000..dc8c12e --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/api-docs.skill.md @@ -0,0 +1,53 @@ +--- +name: api-docs +label: API 문서 생성 +description: 코드에서 API 엔드포인트를 분석하여 마크다운/HTML API 문서를 자동 생성합니다. +icon: \uE8A1 +tabs: code +--- + +작업 폴더의 소스 코드를 분석하여 API 문서를 생성하세요. + +## 분석 대상 +- REST API 엔드포인트 (Controller, Route 어노테이션) +- 함수/메서드 시그니처 및 주석 +- 요청/응답 모델 (DTO, Schema) +- 인증/권한 요구사항 + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — API 엔드포인트 패턴 검색 (`[HttpGet]`, `@GetMapping`, `router.get`, `@app.route` 등) +3. `file_read` — 컨트롤러/라우터 파일 분석 +4. `grep_tool` — 요청/응답 모델 클래스 검색 +5. `file_read` — 모델 구조 분석 +6. `file_write` — API 문서 생성 + +## 출력 형식 +마크다운으로 작성하되 다음 구조를 따르세요: + +``` +# API 문서 + +## 개요 +- Base URL, 인증 방식, 공통 헤더 + +## 엔드포인트 + +### [POST] /api/users +- **설명**: 사용자 생성 +- **인증**: Bearer Token 필요 +- **요청 본문**: + | 필드 | 타입 | 필수 | 설명 | + |------|------|------|------| + | name | string | ✓ | 사용자 이름 | +- **응답**: 201 Created + ```json + { "id": 1, "name": "..." } + ``` +- **에러 코드**: 400, 401, 409 +``` + +## 주의사항 +- 코드에서 실제 확인된 내용만 문서화하세요. 추측하지 마세요. +- 주석이나 Swagger/OpenAPI 어노테이션이 있으면 우선 활용하세요. +- 인증, 페이징, 에러 처리 등 공통 패턴은 별도 섹션으로 정리하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/batch-rename.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/batch-rename.skill.md new file mode 100644 index 0000000..0598dbc --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/batch-rename.skill.md @@ -0,0 +1,70 @@ +--- +name: batch-rename +label: 파일 일괄 이름 변경 +description: 패턴 매칭, 번호 붙이기, 날짜 추가 등 파일 이름을 일괄 변경합니다. +icon: \uE8AC +tabs: cowork +allowed-tools: + - folder_map + - file_read + - file_manage + - clipboard_tool +--- + +파일 이름을 규칙에 따라 일괄 변경하세요. 변경 전 반드시 미리보기를 제공합니다. + +## 작업 절차 + +1. **대상 파일 스캔**: folder_map으로 작업 폴더의 파일 목록을 수집 +2. **이름 변경 규칙 확인**: 사용자에게 다음 옵션을 확인 + - 대상 파일 필터 (확장자, 이름 패턴) + - 변경 규칙 (아래 지원 규칙 참조) + - 적용 순서 (이름순, 날짜순, 크기순) +3. **변경 미리보기 생성**: 변경 전/후 이름을 표로 표시 + ``` + | # | 현재 이름 | 변경 후 이름 | + |---|----------------------|----------------------| + | 1 | IMG_20260101_001.jpg | 2026-01-01_001.jpg | + | 2 | IMG_20260101_002.jpg | 2026-01-01_002.jpg | + ``` +4. **사용자 확인**: 미리보기를 보여주고 진행 여부를 확인 +5. **일괄 변경 실행**: file_manage로 파일 이름을 순차 변경 +6. **결과 보고**: 변경 성공/실패 건수와 상세 내역을 안내 + +## 지원 이름 변경 규칙 + +### 패턴 치환 +- **문자열 치환**: "IMG_" → "사진_" +- **정규식 치환**: `(\d{4})(\d{2})(\d{2})` → `$1-$2-$3` +- **대소문자 변환**: 소문자, 대문자, 타이틀 케이스 + +### 번호 붙이기 +- **순번 추가**: `문서_001.pdf`, `문서_002.pdf`, ... +- **시작 번호**: 사용자 지정 (기본: 1) +- **자릿수**: 자동 계산 (파일 수 기준) +- **위치**: 접두사 또는 접미사 + +### 날짜 추가 +- **오늘 날짜**: `보고서_2026-03-30.docx` +- **파일 수정일**: 파일의 실제 수정 날짜 사용 +- **날짜 형식**: YYYY-MM-DD, YYYYMMDD, YY.MM.DD + +### 정리 +- **공백 처리**: 공백 → 언더스코어/하이픈 +- **특수문자 제거**: 파일명에서 특수문자 제거 +- **확장자 변경**: `.jpeg` → `.jpg` +- **접두사/접미사 추가 또는 제거** + +## 충돌 처리 +- 변경 후 이름이 이미 존재하면 자동으로 번호 추가 (`_1`, `_2`) +- 충돌 건은 미리보기에서 ⚠️ 표시로 경고 +- 원본 파일 덮어쓰기 절대 금지 + +## 규칙 +- **미리보기 없이 직접 변경하지 않음** — 반드시 미리보기 후 사용자 확인 +- 하위 폴더 포함 여부는 사용자에게 확인 +- 숨김 파일(.으로 시작)은 기본 제외 +- 변경 실패 시 이미 변경된 파일은 원복하지 않으므로, 중요한 경우 백업 권장 +- 한 번에 1,000개 이상의 파일 변경 시 경고 + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/changelog.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/changelog.skill.md new file mode 100644 index 0000000..a40539b --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/changelog.skill.md @@ -0,0 +1,74 @@ +--- +name: changelog +label: 변경 이력 / 릴리즈 노트 +description: Git 커밋 이력에서 자동으로 변경 이력과 릴리즈 노트를 생성합니다. +icon: \uE81C +allowed-tools: + - git_tool + - file_read + - file_write + - html_create + - text_summarize +tabs: code +--- + +Git 커밋 이력을 분석하여 변경 이력(CHANGELOG) 또는 릴리즈 노트를 생성하세요. + +## 워크플로우 + +1. **이력 조회**: git_tool로 커밋 로그 수집 + - 지정 기간 또는 태그 간 커밋 + - 커밋 메시지 + 변경 파일 목록 +2. **분류**: 커밋을 Conventional Commits 기준으로 분류 +3. **Breaking Change 감지**: 시그니처 변경, API 삭제 등 감지 +4. **문서 생성**: Markdown 또는 HTML로 출력 + +## Conventional Commits 분류 + +| 접두사 | 분류 | 설명 | +|--------|------|------| +| feat | ✨ 신기능 | 새로운 기능 추가 | +| fix | 🐛 버그 수정 | 버그 수정 | +| docs | 📝 문서 | 문서 변경 | +| style | 💄 스타일 | 코드 포맷팅 (동작 변경 없음) | +| refactor | ♻️ 리팩토링 | 코드 리팩토링 | +| perf | ⚡ 성능 | 성능 개선 | +| test | ✅ 테스트 | 테스트 추가/수정 | +| chore | 🔧 기타 | 빌드, 설정 변경 | +| BREAKING | 💥 Breaking | 하위 호환성 깨지는 변경 | + +## 출력 형식 + +### CHANGELOG.md +```markdown +# Changelog + +## [1.6.0] - 2026-03-30 + +### ✨ 신기능 +- 멀티패스 문서 생성 엔진 (#123) +- PPT 네이티브 생성 도구 + +### 🐛 버그 수정 +- 탭 전환 시 대화 유실 문제 해결 + +### 💥 Breaking Changes +- 없음 + +### 📝 문서 +- 개발자 가이드 v1.6.0 업데이트 +``` + +### 릴리즈 노트 (HTML) +사용자 친화적인 형식: +- 주요 변경사항 (스크린샷 포함 가능) +- 개선 사항 +- 알려진 이슈 +- 업그레이드 가이드 + +## 규칙 +- Conventional Commits 형식이 아닌 커밋도 내용 분석으로 분류 +- 중복/사소한 커밋은 병합하여 요약 +- Breaking Change는 반드시 별도 섹션으로 강조 +- 이슈 번호가 있으면 링크 포함 +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/code-scaffold.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/code-scaffold.skill.md new file mode 100644 index 0000000..35e4a74 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/code-scaffold.skill.md @@ -0,0 +1,31 @@ +--- +name: code-scaffold +label: 코드 스캐폴딩 +description: 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 자동 생성합니다. +icon: \uE943 +tabs: code +--- + +작업 폴더의 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 프로젝트 구조 파악 +2. file_read — 기존 코드 패턴 분석 +3. grep_tool — 코딩 컨벤션 확인 +4. file_write — 새 파일 생성 + +작업 순서: +1. 프로젝트 타입 감지 (언어, 프레임워크, 빌드 시스템) +2. 기존 코드 패턴 분석 (네이밍, 폴더 구조, 임포트 스타일) +3. 사용자 요청에 맞는 코드 뼈대 생성 + +생성 항목: +- 클래스/모듈 파일 (프로젝트 컨벤션에 맞춰) +- 인터페이스/타입 정의 +- 단위 테스트 파일 +- 필요한 설정/구성 파일 + +규칙: +- 기존 프로젝트의 코딩 스타일을 따르세요 +- TODO 주석으로 구현이 필요한 부분을 표시하세요 +- 한국어 주석을 추가하세요 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/commit-review.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/commit-review.skill.md new file mode 100644 index 0000000..0f8663b --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/commit-review.skill.md @@ -0,0 +1,67 @@ +--- +name: commit-review +label: 커밋 메시지 리뷰 +description: Git 커밋 메시지를 Conventional Commits 기준으로 검토하고 개선을 제안합니다. +icon: \uE8CB +tabs: code +--- + +작업 폴더의 최근 Git 커밋 메시지를 검토하고 개선안을 제시하세요. + +## 작업 절차 +1. `process_run` — `git log --oneline -20` 으로 최근 커밋 목록 확인 +2. `process_run` — `git log --format="%H%n%s%n%b%n---" -10` 으로 상세 메시지 확인 +3. `process_run` — `git diff HEAD~1` 으로 최신 커밋 변경 내용 확인 (필요 시) +4. 각 커밋을 Conventional Commits 기준으로 분석 +5. 결과를 정리하여 출력 + +## Conventional Commits 규칙 +``` +[optional scope]: + +[optional body] + +[optional footer(s)] +``` + +### type 종류 +- `feat`: 새 기능 +- `fix`: 버그 수정 +- `docs`: 문서 변경 +- `style`: 포맷팅 (코드 동작 변경 없음) +- `refactor`: 리팩토링 +- `perf`: 성능 개선 +- `test`: 테스트 추가/수정 +- `chore`: 빌드/도구 설정 +- `ci`: CI 설정 변경 + +## 검토 항목 +1. **type 적절성**: 변경 내용과 type이 일치하는가 +2. **설명 품질**: 50자 이내, 명령형, 명확한 내용 +3. **본문 유무**: 복잡한 변경에 "왜" 설명이 있는가 +4. **일관성**: 팀 내 커밋 스타일이 통일되어 있는가 +5. **Breaking Change**: BREAKING CHANGE 푸터 또는 ! 표기 + +## 출력 형식 +``` +## 커밋 메시지 리뷰 결과 + +### 전체 요약 +- 검토 커밋: N개 +- 규칙 준수: N개 ✓ / 위반: N개 ✗ + +### 개별 리뷰 + +#### abc1234 "Fix login bug" +- ❌ type 없음 → `fix: resolve login authentication failure` +- ❌ 본문 없음 → 원인과 해결 방법 추가 권장 + +#### def5678 "feat: add user profile page" +- ✅ Conventional Commits 준수 +- 💡 scope 추가 권장: `feat(profile): add user profile page` +``` + +## 주의사항 +- 비판이 아닌 건설적 제안을 하세요. +- 팀의 기존 컨벤션이 있으면 그것을 우선 존중하세요. +- 개선된 메시지 예시를 항상 함께 제시하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/compare.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/compare.skill.md new file mode 100644 index 0000000..6538dd7 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/compare.skill.md @@ -0,0 +1,51 @@ +--- +name: compare +label: 비교 분석표 +description: 2개 이상 항목의 비교 분석 매트릭스를 생성합니다. +icon: \uE9D5 +allowed-tools: + - html_create + - excel_create + - file_read + - document_read + - chart_create +tabs: all +--- + +사용자가 요청한 항목들을 체계적으로 비교 분석하는 매트릭스를 생성하세요. + +## 워크플로우 + +1. **비교 대상 확인**: 어떤 항목들을 비교할지 파악 + - 제품, 기술, 방안, 서비스, 도구, 프레임워크 등 +2. **비교 기준 설정**: 적절한 비교 축을 설계 + - 기능, 가격, 성능, 사용성, 확장성, 지원, 보안 등 +3. **데이터 수집**: 참고 파일이 있으면 읽어서 반영 +4. **분석표 생성**: HTML 또는 Excel로 비교 매트릭스 생성 +5. **종합 평가**: 총평 + 추천 의견 제시 + +## 비교표 구성 + +### 기본 매트릭스 +| 기준 | 항목 A | 항목 B | 항목 C | +|------|--------|--------|--------| +| 기능1 | ✅ 지원 | ⚠ 일부 | ❌ 미지원 | +| 기능2 | ... | ... | ... | + +### 점수 비교 (radar 차트 활용) +- 각 항목을 1~10점으로 정량화 +- chart_create로 레이더 차트 또는 바 차트 시각화 + +### 종합 평가 +- 장점/단점 요약 +- 상황별 추천 (예: "예산이 제한적이면 A, 확장성이 중요하면 B") + +## 출력 형식 +- **HTML** (권장): 색상 배지, 차트 포함 비주얼 보고서 +- **Excel**: 정량 데이터 + 수식 기반 점수표 + +## 규칙 +- 객관적 사실 기반으로 비교 (주관적 판단은 별도 섹션) +- 각 항목의 강점과 약점을 균형 있게 서술 +- 출처/근거가 있으면 명시 +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/csv-to-xlsx.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/csv-to-xlsx.skill.md new file mode 100644 index 0000000..fb819ac --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/csv-to-xlsx.skill.md @@ -0,0 +1,125 @@ +--- +name: csv-to-xlsx +label: CSV → Excel 변환 +description: CSV 파일을 서식이 완성된 Excel(.xlsx)로 변환합니다. 헤더 고정, 필터, 조건부 서식, 자동 열 너비를 적용합니다. +icon: \uE9F9 +tabs: cowork +requires: python +--- + +CSV 파일을 전문적인 서식이 적용된 Excel 파일로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install openpyxl pandas +``` + +## 작업 절차 + +1. **파일 확인**: folder_map으로 작업 폴더에서 CSV 파일을 탐색 +2. **CSV 분석**: file_read로 CSV 파일의 구조(컬럼, 행 수, 인코딩, 구분자) 파악 +3. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 헤더 행 고정 여부 (기본: 활성) + - 자동 필터 적용 여부 (기본: 활성) + - 조건부 서식 대상 컬럼 (숫자 컬럼 자동 감지) + - 시트 이름 (기본: 파일명) +4. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +5. **스크립트 실행**: process_run으로 Python 스크립트 실행 +6. **결과 확인**: 생성된 .xlsx 파일 경로와 요약 정보를 안내 + +## Python 스크립트 템플릿 +```python +import pandas as pd +from openpyxl import load_workbook +from openpyxl.styles import Font, PatternFill, Alignment, Border, Side +from openpyxl.utils import get_column_letter +from openpyxl.formatting.rule import CellIsRule + +# CSV 읽기 (인코딩 자동 감지) +for enc in ['utf-8', 'cp949', 'euc-kr', 'utf-8-sig']: + try: + df = pd.read_csv('input.csv', encoding=enc) + break + except (UnicodeDecodeError, Exception): + continue + +# Excel 저장 +output_path = 'output.xlsx' +df.to_excel(output_path, index=False, sheet_name='Sheet1') + +# 서식 적용 +wb = load_workbook(output_path) +ws = wb.active + +# 헤더 스타일 +header_font = Font(bold=True, color='FFFFFF', size=11) +header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid') +header_align = Alignment(horizontal='center', vertical='center', wrap_text=True) +thin_border = Border( + left=Side(style='thin'), + right=Side(style='thin'), + top=Side(style='thin'), + bottom=Side(style='thin') +) + +for col_idx, cell in enumerate(ws[1], 1): + cell.font = header_font + cell.fill = header_fill + cell.alignment = header_align + cell.border = thin_border + +# 자동 열 너비 +for col_idx in range(1, ws.max_column + 1): + max_length = 0 + col_letter = get_column_letter(col_idx) + for row in ws.iter_rows(min_col=col_idx, max_col=col_idx): + for cell in row: + if cell.value: + max_length = max(max_length, len(str(cell.value))) + ws.column_dimensions[col_letter].width = min(max_length + 4, 50) + +# 헤더 행 고정 (Freeze Panes) +ws.freeze_panes = 'A2' + +# 자동 필터 +ws.auto_filter.ref = ws.dimensions + +# 숫자 컬럼 조건부 서식 (음수 빨강) +for col_idx in range(1, ws.max_column + 1): + col_letter = get_column_letter(col_idx) + sample_values = [ws.cell(row=r, column=col_idx).value for r in range(2, min(ws.max_row + 1, 12))] + if any(isinstance(v, (int, float)) for v in sample_values if v is not None): + cell_range = f'{col_letter}2:{col_letter}{ws.max_row}' + ws.conditional_formatting.add(cell_range, + CellIsRule(operator='lessThan', formula=['0'], + font=Font(color='FF0000'))) + +# 데이터 행 줄무늬 (가독성) +light_fill = PatternFill(start_color='D9E2F3', end_color='D9E2F3', fill_type='solid') +for row_idx in range(2, ws.max_row + 1): + for col_idx in range(1, ws.max_column + 1): + cell = ws.cell(row=row_idx, column=col_idx) + cell.border = thin_border + if row_idx % 2 == 0: + cell.fill = light_fill + +wb.save(output_path) +print(f'변환 완료: {output_path} ({ws.max_row - 1}행 × {ws.max_column}열)') +``` + +## 서식 옵션 +- **헤더 스타일**: 파란 배경 + 흰색 굵은 글씨 + 가운데 정렬 +- **줄무늬**: 짝수 행 연한 파랑 배경 (가독성 향상) +- **열 너비**: 내용 기준 자동 조정 (최대 50) +- **조건부 서식**: 숫자 컬럼 음수 빨강 표시 +- **Freeze Panes**: 헤더 행 고정 +- **Auto Filter**: 전체 컬럼 필터 활성화 + +## 규칙 +- 원본 CSV 파일은 수정하지 않음 +- 인코딩 자동 감지 (UTF-8 → CP949 → EUC-KR 순) +- 대용량 파일 (100,000행 이상) 경고 후 진행 +- 출력 파일명: 원본 파일명 기준 (.csv → .xlsx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/data-convert.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/data-convert.skill.md new file mode 100644 index 0000000..edd84f6 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/data-convert.skill.md @@ -0,0 +1,56 @@ +--- +name: data-convert +label: 데이터 변환기 +description: 데이터 포맷 간 변환, 정제, 필터링, 통계 요약을 수행합니다. +icon: \uE8AB +allowed-tools: + - file_read + - file_write + - json_tool + - csv_create + - data_pivot + - excel_create +tabs: cowork +--- + +데이터 파일의 포맷 변환, 정제, 필터링, 통계 요약을 수행하세요. + +## 지원 변환 + +| 입력 → | JSON | CSV | Excel | Markdown | +|--------|------|-----|-------|----------| +| JSON | — | ✅ | ✅ | ✅ | +| CSV | ✅ | — | ✅ | ✅ | +| Excel | ✅ | ✅ | — | ✅ | +| TSV | ✅ | ✅ | ✅ | ✅ | + +## 워크플로우 + +1. **파일 분석**: 입력 파일의 포맷, 인코딩, 구조 파악 +2. **데이터 정제** (선택): + - 빈 행/열 제거 + - 중복 제거 + - 데이터 타입 정리 (숫자 문자열 → 숫자) + - 결측치 처리 (제거 또는 기본값) +3. **필터링** (선택): + - 조건 기반 행 필터링 + - 필요 컬럼만 추출 +4. **변환**: 대상 포맷으로 변환 +5. **통계 요약**: 기본 통계 제공 + +## 정제 옵션 +- `remove_empty`: 빈 행 제거 +- `remove_duplicates`: 중복 행 제거 +- `trim`: 공백 제거 +- `fill_na`: 결측치 채우기 (값 지정) + +## 출력 +- 변환된 파일 저장 +- 변환 통계 (원본 행 수, 변환 후 행 수, 제거 행 수) +- 컬럼별 기본 통계 (수치 컬럼: 합계, 평균, 최소, 최대) + +## 규칙 +- 원본 파일은 수정하지 않음 (새 파일로 저장) +- 인코딩: UTF-8 기본 (EUC-KR 옵션) +- 대용량 파일 (10MB 이상) 경고 +- 한국어로 안내 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/data-visualize-adv.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/data-visualize-adv.skill.md new file mode 100644 index 0000000..53817d4 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/data-visualize-adv.skill.md @@ -0,0 +1,125 @@ +--- +name: data-visualize-adv +label: 고급 데이터 시각화 +description: Python matplotlib/seaborn을 사용하여 히트맵, 산점도, 상관관계 등 고급 시각화를 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +데이터를 고급 시각화 차트로 변환하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib seaborn pandas numpy +``` + +## 작업 절차 +1. **데이터 확인**: 사용자가 제공한 CSV/JSON/Excel 데이터 파일 확인 +2. **데이터 로드**: pandas로 데이터 읽기 +3. **Python 스크립트 작성**: file_write로 시각화 스크립트 생성 +4. **스크립트 실행**: process_run으로 실행 +5. **결과 확인**: 생성된 차트 이미지 경로를 사용자에게 안내 + +## 시각화 유형별 템플릿 + +### 공통 설정 +```python +import matplotlib.pyplot as plt +import seaborn as sns +import pandas as pd +import numpy as np + +# 한글 폰트 설정 +plt.rcParams['font.family'] = 'Malgun Gothic' +plt.rcParams['axes.unicode_minus'] = False +sns.set_theme(style='whitegrid', font='Malgun Gothic') +``` + +### 히트맵 (상관관계 행렬) +```python +df = pd.read_csv('data.csv') +corr = df.select_dtypes(include=[np.number]).corr() + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r', + center=0, square=True, linewidths=0.5, ax=ax) +ax.set_title('상관관계 히트맵') +plt.tight_layout() +plt.savefig('heatmap.png', dpi=150) +``` + +### 산점도 (Scatter Plot) +```python +df = pd.read_csv('data.csv') + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.scatterplot(data=df, x='col_x', y='col_y', hue='category', + size='value', sizes=(20, 200), alpha=0.7, ax=ax) +ax.set_title('산점도') +plt.tight_layout() +plt.savefig('scatter.png', dpi=150) +``` + +### 시계열 분석 +```python +df = pd.read_csv('data.csv', parse_dates=['date']) + +fig, ax = plt.subplots(figsize=(12, 6)) +sns.lineplot(data=df, x='date', y='value', hue='category', ax=ax) +ax.set_title('시계열 트렌드') +plt.xticks(rotation=45) +plt.tight_layout() +plt.savefig('timeseries.png', dpi=150) +``` + +### 분포 비교 (박스플롯 + 바이올린) +```python +fig, axes = plt.subplots(1, 2, figsize=(14, 6)) + +sns.boxplot(data=df, x='group', y='value', ax=axes[0]) +axes[0].set_title('박스플롯') + +sns.violinplot(data=df, x='group', y='value', ax=axes[1]) +axes[1].set_title('바이올린 플롯') + +plt.tight_layout() +plt.savefig('distribution.png', dpi=150) +``` + +### 다중 차트 대시보드 +```python +fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + +# 좌상: 히트맵 +sns.heatmap(corr, annot=True, fmt='.1f', ax=axes[0,0]) + +# 우상: 산점도 +sns.scatterplot(data=df, x='x', y='y', ax=axes[0,1]) + +# 좌하: 히스토그램 +sns.histplot(data=df, x='value', kde=True, ax=axes[1,0]) + +# 우하: 박스플롯 +sns.boxplot(data=df, x='group', y='value', ax=axes[1,1]) + +fig.suptitle('데이터 분석 대시보드', fontsize=16, fontweight='bold') +plt.tight_layout() +plt.savefig('dashboard.png', dpi=150) +``` + +### 페어플롯 (변수 간 관계 전체) +```python +g = sns.pairplot(df, hue='category', diag_kind='kde') +g.fig.suptitle('변수 간 관계', y=1.02) +plt.savefig('pairplot.png', dpi=150) +``` + +## 스타일 옵션 +- seaborn 테마: `whitegrid`, `darkgrid`, `white`, `dark`, `ticks` +- 컬러 팔레트: `Set2`, `husl`, `coolwarm`, `RdBu_r`, `viridis` +- 출력 형식: png, svg, pdf +- 해상도: `dpi=150` (기본), `dpi=300` (인쇄용) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/data-visualize.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/data-visualize.skill.md new file mode 100644 index 0000000..965bf8b --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/data-visualize.skill.md @@ -0,0 +1,38 @@ +--- +name: data-visualize +label: 데이터 시각화 +description: CSV/Excel 데이터를 분석하여 차트가 포함된 HTML 보고서를 생성합니다. +icon: \uE9D9 +tabs: cowork +--- + +작업 폴더의 데이터 파일을 분석하고 시각화 보고서를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — HTML 시각화 보고서 생성 + +���각화 전략: +1. **데이터 파악**: 컬럼 타입, 결측치, 기본 통계량 확인 +2. **적절한 차트 선택**: + - 시계열 → 라인 차트 + - 비교 → 바 차트 + - 비율 → 파이/도넛 차트 + - 분포 → 히스토그램 + - 상관관계 → 산점도 +3. **HTML 보고서 생성**: 인라인 SVG 또는 CSS 기반 차트 (외부 라이브러리 없이) + +보고서 구성: +## 데이터 요약 +- 기본 통계 테이블 + +## 시각화 +- 데이터 특성에 맞는 2~4개 차트 +- 각 차트에 대한 해석 + +## 인사이트 +- 데이터에서 발견한 주요 패턴 +- 이상치 또는 주목할 포인트 + +한국어로 작성하세요. 차트는 CSS/SVG 기반으로 외부 의존성 없이 생성하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/db-schema.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/db-schema.skill.md new file mode 100644 index 0000000..446d5e1 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/db-schema.skill.md @@ -0,0 +1,60 @@ +--- +name: db-schema +label: DB 스키마 분석 +description: 데이터베이스 스키마를 분석하여 ERD 다이어그램과 테이블 문서를 생성합니다. +icon: \uE968 +tabs: code +--- + +작업 폴더의 코드에서 데이터베이스 스키마를 분석하고 문서화하세요. + +## 분석 대상 +- ORM 모델/엔티티 클래스 (Entity Framework, SQLAlchemy, Sequelize, JPA 등) +- 마이그레이션 파일 +- SQL DDL 스크립트 (CREATE TABLE) +- 관계 정의 (FK, Navigation Property) + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — 엔티티/모델 클래스 검색 (`DbSet`, `@Entity`, `Model.define`, `CREATE TABLE` 등) +3. `file_read` — 모델 파일 분석 (컬럼, 타입, 관계) +4. `grep_tool` — 인덱스, 제약 조건 검색 +5. `file_write` — 스키마 문서 + Mermaid ERD 생성 + +## 출력 형식 + +### 테이블 문서 +각 테이블에 대해: +``` +## Users 테이블 +| 컬럼 | 타입 | Null | 기본값 | 설명 | +|------|------|------|--------|------| +| Id | int | NO | AUTO_INCREMENT | PK | +| Name | nvarchar(100) | NO | - | 사용자 이름 | +| CreatedAt | datetime | NO | GETDATE() | 생성일 | + +- **인덱스**: IX_Users_Name (Name) +- **관계**: Orders (1:N), Profile (1:1) +``` + +### Mermaid ERD +```mermaid +erDiagram + Users ||--o{ Orders : "has" + Users ||--|| Profile : "has" + Users { + int Id PK + string Name + datetime CreatedAt + } + Orders { + int Id PK + int UserId FK + decimal Amount + } +``` + +## 주의사항 +- 코드에서 실제 확인된 스키마만 문서화하세요. +- 관계(1:1, 1:N, N:M)를 정확히 파악하세요. +- 마이그레이션이 있으면 최종 상태를 기준으로 작성하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/dependency-audit.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/dependency-audit.skill.md new file mode 100644 index 0000000..73dbb2e --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/dependency-audit.skill.md @@ -0,0 +1,85 @@ +--- +name: dependency-audit +label: 의존성 분석 +description: 프로젝트 의존성 그래프를 분석하고 보안 취약점, 라이선스, 업데이트 현황을 보고합니다. +icon: \uE964 +allowed-tools: + - file_read + - grep + - folder_map + - glob + - html_create + - process +tabs: code +--- + +프로젝트의 패키지 의존성을 분석하여 보안, 라이선스, 업데이트 보고서를 생성하세요. + +## 워크플로우 + +1. **패키지 파일 탐지**: glob으로 의존성 파일 검색 + - .NET: `*.csproj`, `packages.config`, `Directory.Build.props` + - Node: `package.json`, `package-lock.json`, `yarn.lock` + - Python: `requirements.txt`, `Pipfile`, `pyproject.toml` + - Java: `pom.xml`, `build.gradle` +2. **의존성 목록 추출**: file_read로 파일 파싱 +3. **분석 수행**: 각 의존성에 대해 검사 +4. **보고서 생성**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 1. 직접 의존성 목록 +| 패키지 | 현재 버전 | 최신 버전 | 업데이트 필요 | +|--------|----------|----------|-------------| +| ... | ... | ... | ✅/⚠/❌ | + +### 2. 보안 취약점 (알려진 패턴) +- 알려진 취약 버전 패턴 탐지 +- 폐기된(deprecated) 패키지 식별 +- 유지보수 중단된 패키지 경고 + +### 3. 라이선스 검사 +| 라이선스 | 호환성 | 패키지 | +|---------|--------|--------| +| MIT | ✅ 허용 | lib-a, lib-b | +| GPL-3.0 | ⚠ 주의 | lib-c | +| 상용 | ❌ 검토 필요 | lib-d | + +### 4. 의존성 크기 분석 +- 패키지별 예상 크기 +- 전체 node_modules / NuGet 캐시 크기 +- 불필요하게 큰 패키지 식별 + +### 5. 중복/충돌 검사 +- 동일 기능 중복 패키지 (예: lodash + underscore) +- 버전 충돌 가능성 + +## 프레임워크별 검사 명령 + +### .NET +``` +dotnet list package --outdated +dotnet list package --vulnerable +``` + +### Node.js +``` +npm audit +npm outdated +``` + +### Python +``` +pip list --outdated +pip-audit +``` + +## 출력 +- HTML 보고서: 위험도별 색상 구분, 차트 포함 +- 요약: 총 패키지 수, 업데이트 필요 수, 보안 이슈 수, 라이선스 경고 수 + +## 규칙 +- 외부 서버 접속 없이 로컬 파일 분석만 수행 +- process 도구 사용 시 `dotnet list` / `npm audit` 등 읽기 전용 명령만 +- 패키지를 직접 업데이트하지 않음 (보고서만) +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/diagram-generator.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/diagram-generator.skill.md new file mode 100644 index 0000000..9d887e0 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/diagram-generator.skill.md @@ -0,0 +1,99 @@ +--- +name: diagram-generator +label: 다이어그램 생성 +description: Python matplotlib/graphviz를 사용하여 플로차트, 시퀀스, ER 다이어그램 등을 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 다이어그램을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib graphviz +``` +시스템에 Graphviz가 설치되어 있어야 합니다 (https://graphviz.org/download/). + +## 작업 절차 +1. **요구사항 파악**: 다이어그램 유형, 노드/관계, 스타일 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립트 실행 +4. **결과 확인**: 생성된 이미지 파일 경로를 사용자에게 안내 + +## 다이어그램 유형별 템플릿 + +### 플로차트 (Graphviz) +```python +from graphviz import Digraph + +dot = Digraph(comment='Flowchart', format='png') +dot.attr(rankdir='TB', fontname='Malgun Gothic') +dot.attr('node', shape='box', style='rounded,filled', fillcolor='#E8F0FE') + +dot.node('start', '시작', shape='ellipse', fillcolor='#34A853', fontcolor='white') +dot.node('process1', '데이터 수집') +dot.node('decision', '조건 확인?', shape='diamond', fillcolor='#FBBC04') +dot.node('process2', '처리') +dot.node('end', '종료', shape='ellipse', fillcolor='#EA4335', fontcolor='white') + +dot.edge('start', 'process1') +dot.edge('process1', 'decision') +dot.edge('decision', 'process2', label='예') +dot.edge('decision', 'end', label='아니오') +dot.edge('process2', 'end') + +dot.render('flowchart', cleanup=True) +``` + +### 시퀀스 다이어그램 (matplotlib) +```python +import matplotlib.pyplot as plt +import matplotlib.patches as patches + +fig, ax = plt.subplots(1, 1, figsize=(10, 8)) +# 액터 라이프라인, 메시지 화살표 등을 matplotlib으로 직접 그리기 +ax.set_xlim(0, 10) +ax.set_ylim(0, 10) +ax.invert_yaxis() +ax.axis('off') +plt.savefig('sequence.png', dpi=150, bbox_inches='tight') +``` + +### ER 다이어그램 (Graphviz) +```python +from graphviz import Graph + +er = Graph('ER', format='png', engine='neato') +er.attr('node', shape='box', style='filled', fillcolor='#E8F0FE') + +er.node('user', 'User\n─────\nid (PK)\nname\nemail') +er.node('order', 'Order\n─────\nid (PK)\nuser_id (FK)\ntotal') + +er.edge('user', 'order', label='1:N') +er.render('er_diagram', cleanup=True) +``` + +### 조직도 (Graphviz) +```python +from graphviz import Digraph + +org = Digraph(format='png') +org.attr(rankdir='TB') +org.attr('node', shape='box', style='rounded,filled', fillcolor='#E3F2FD') + +org.node('ceo', 'CEO') +org.node('cto', 'CTO') +org.node('cfo', 'CFO') +org.edges([('ceo', 'cto'), ('ceo', 'cfo')]) +org.render('org_chart', cleanup=True) +``` + +## 스타일 옵션 +- 폰트: `fontname='Malgun Gothic'` (한글 지원) +- 색상: HTML 컬러 코드 지원 +- 출력 형식: png, svg, pdf +- 레이아웃 엔진: dot(계층), neato(스프링), circo(원형), fdp(포스) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/docx-creator.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/docx-creator.skill.md new file mode 100644 index 0000000..74a62ce --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/docx-creator.skill.md @@ -0,0 +1,97 @@ +--- +name: docx-creator +label: Word 문서 생성 +description: Python을 사용하여 전문적인 Word 문서(.docx)를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE8A5 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 전문적인 Word 문서를 Python으로 생성하세요. + +## 사전 준비 +먼저 python-docx 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx +``` + +## 양식 활용 (템플릿 모드) +작업 폴더에 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.docx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .docx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식 파일의 구조(스타일, 헤더, 섹션)를 먼저 확인 +4. **양식 기반 생성**: + ```python + doc = Document('양식_보고서.docx') # ← 빈 Document() 대신 양식 로드 + # 양식의 스타일, 머리글/바닥글, 로고, 페이지 설정이 자동 상속됨 + # 기존 본문 내용을 지우고 새 내용만 추가 + for paragraph in doc.paragraphs: + paragraph.clear() # 기존 내용 제거 + # 또는 필요에 따라 특정 섹션만 교체 + ``` +5. **양식이 없으면**: 아래 기본 템플릿으로 새 문서 생성 + +## 작업 절차 +1. **요구사항 파악**: 사용자가 원하는 문서의 종류, 구조, 내용을 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .docx 파일이 있는지 확인 +3. **Python 스크립트 작성**: file_write로 .py 파일 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 .docx 파일 경로를 사용자에게 안내 + +## Python 스크립트 템플릿 +```python +from docx import Document +from docx.shared import Inches, Pt, Cm +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.style import WD_STYLE_TYPE +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.docx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 문서 +if template_file: + doc = Document(template_file) + print(f'양식 활용: {template_file}') +else: + doc = Document() + # 스타일 설정 (양식이 없을 때만) + style = doc.styles['Normal'] + font = style.font + font.name = '맑은 고딕' + font.size = Pt(11) + +# 제목 +doc.add_heading('문서 제목', level=0) + +# 본문 +doc.add_paragraph('내용을 여기에 작성합니다.') + +# 표 +table = doc.add_table(rows=2, cols=3) +table.style = 'Light Grid Accent 1' + +# 저장 +doc.save('output.docx') +``` + +## 지원 기능 +- 제목/소제목 계층 구조 +- 표 (스타일, 병합, 서식) +- 이미지 삽입 +- 머리글/바닥글 +- 페이지 번호 +- 목차 +- 글머리 기호/번호 목록 +- **양식 파일 기반 스타일 상속** (로고, 헤더, 페이지 설정 자동 유지) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/email-draft.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/email-draft.skill.md new file mode 100644 index 0000000..62f4e5f --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/email-draft.skill.md @@ -0,0 +1,55 @@ +--- +name: email-draft +label: 비즈니스 이메일 작성 +description: 상황과 톤에 맞는 전문적인 비즈니스 이메일 초안을 생성합니다. +icon: \uE715 +allowed-tools: + - clipboard_tool + - file_write +tabs: all +--- + +사용자의 요청에 맞는 전문적인 비즈니스 이메일을 작성하세요. + +## 워크플로우 + +1. 사용자에게 다음 정보를 확인하세요: + - **수신자**: 이름, 직급, 부서 (알고 있다면) + - **목적**: 요청 / 보고 / 안내 / 감사 / 사과 / 협조 / 초대 / 회신 + - **핵심 내용**: 전달할 주요 메시지 (1~3가지) + - **톤**: 공식(格式) / 반공식 / 친근 + - **언어**: 한국어 / 영어 / 일본어 + +2. 이메일 초안을 작성합니다: + - 적절한 인사말로 시작 + - 핵심 내용은 **굵게** 강조 + - 요청 사항은 명확하고 구체적으로 + - 마무리 인사와 서명 포함 + +3. 사용자에게 초안을 보여주고 수정 요청을 받습니다. + +4. 최종본을 clipboard_tool로 클립보드에 복사합니다. + +## 이메일 구조 + +``` +제목: [간결하고 명확한 제목] + +[수신자] 님께, + +[인사말] + +[본문 - 목적과 핵심 내용] + +[요청 사항 또는 다음 단계] + +[마무리 인사] + +[서명] +``` + +## 규칙 +- 한 문단은 3~4문장을 넘지 않도록 간결하게 +- 수동적 표현보다 능동적 표현 선호 +- 약어는 처음 사용 시 풀어 쓰기 +- 긴급도에 따라 제목에 [긴급], [참고] 등 태그 사용 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/env-setup.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/env-setup.skill.md new file mode 100644 index 0000000..f1b397e --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/env-setup.skill.md @@ -0,0 +1,152 @@ +--- +name: env-setup +label: 프로젝트 환경 설정 +description: .gitignore, requirements.txt, .editorconfig 등 프로젝트 환경 설정 파일을 자동 생성합니다. +icon: \uE835 +tabs: code +allowed-tools: + - folder_map + - file_read + - file_write + - process_run +--- + +프로젝트 유형에 맞는 환경 설정 파일을 자동으로 생성하세요. + +## 작업 절차 + +1. **프로젝트 분석**: folder_map으로 프로젝트 구조를 파악하고 유형 판별 + - `.py` 파일 → Python 프로젝트 + - `package.json` 또는 `.js/.ts` 파일 → Node.js 프로젝트 + - `.csproj` 또는 `.sln` 파일 → .NET 프로젝트 + - `pom.xml` 또는 `.java` 파일 → Java 프로젝트 + - 복합 프로젝트인 경우 모든 유형을 병합 +2. **기존 설정 확인**: 이미 존재하는 설정 파일이 있는지 확인 + - 있으면: 내용을 분석하여 누락된 항목만 추가 제안 + - 없으면: 새로 생성 +3. **생성할 파일 목록 제안**: 사용자에게 생성할 파일 목록을 보여주고 확인 +4. **파일 생성**: file_write로 각 설정 파일 생성 +5. **결과 안내**: 생성된 파일 목록과 주요 설정 내용 요약 + +## 프로젝트별 템플릿 + +### Python 프로젝트 +생성 파일: `.gitignore`, `requirements.txt`, `.editorconfig`, `setup.cfg`, `.flake8` + +**.gitignore (Python)**: +``` +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +venv/ +.venv/ +*.egg-info/ +dist/ +build/ +.eggs/ +*.egg +.mypy_cache/ +.pytest_cache/ +.coverage +htmlcov/ +.env +.idea/ +.vscode/ +*.log +``` + +**requirements.txt**: 프로젝트에서 import 문을 스캔하여 자동 생성 + +### Node.js 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `.nvmrc`, `.prettierrc` + +**.gitignore (Node)**: +``` +node_modules/ +dist/ +build/ +.env +.env.local +*.log +npm-debug.log* +.DS_Store +coverage/ +.nyc_output/ +.idea/ +.vscode/ +*.tgz +``` + +### .NET 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `Directory.Build.props` + +**.gitignore (.NET)**: +``` +bin/ +obj/ +.vs/ +*.user +*.suo +*.cache +packages/ +*.nupkg +TestResults/ +.idea/ +*.DotSettings.user +``` + +### Java 프로젝트 +생성 파일: `.gitignore`, `.editorconfig` + +**.gitignore (Java)**: +``` +*.class +*.jar +*.war +*.ear +target/ +.gradle/ +build/ +.idea/ +*.iml +.settings/ +.classpath +.project +out/ +``` + +## 공통 .editorconfig +```ini +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[*.{json,js,ts,jsx,tsx}] +indent_size = 2 + +[Makefile] +indent_style = tab +``` + +## 규칙 +- 기존 설정 파일이 있으면 덮어쓰지 않고, 누락 항목만 제안 +- .env 파일은 생성하지 않음 (보안 — 사용자가 직접 생성) +- 생성 전 파일 목록을 반드시 사용자에게 확인 +- 프로젝트 루트에 생성 (하위 폴더에 생성하지 않음) + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/gen-test.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/gen-test.skill.md new file mode 100644 index 0000000..ede8c8d --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/gen-test.skill.md @@ -0,0 +1,63 @@ +--- +name: gen-test +label: 테스트 생성기 +description: 지정 파일의 단위 테스트를 자동 생성하고 실행하여 커버리지를 분석합니다. +icon: \uE9D5 +allowed-tools: + - file_read + - file_write + - test_loop + - grep + - folder_map + - dev_env_detect + - build_run +tabs: code +--- + +지정된 소스 파일의 단위 테스트를 자동 생성하고 실행하세요. + +## 워크플로우 + +1. **환경 감지**: dev_env_detect로 프로젝트 타입, 테스트 프레임워크 확인 +2. **대상 분석**: file_read로 테스트 대상 파일 분석 + - 공개 메서드/함수 목록 추출 + - 메서드별 입출력 타입 파악 + - 의존성 확인 (Mock 필요 여부) +3. **테스트 생성**: 각 메서드에 대해 테스트 케이스 작성 + - 정상 케이스 (Happy Path) + - 경계값 (Boundary) + - 예외/에러 케이스 + - null/empty 입력 +4. **실행 및 검증**: test_loop으로 테스트 실행 +5. **결과 보고**: 성공/실패 요약, 커버리지 추정 + +## 테스트 작성 원칙 + +### 명명 규칙 +- C#: `[메서드명]_[시나리오]_[기대결과]` +- Python: `test_[메서드명]_[시나리오]` +- JavaScript: `should [기대 동작] when [조건]` + +### 테스트 구조 (AAA 패턴) +``` +Arrange — 테스트 데이터 준비 +Act — 대상 메서드 실행 +Assert — 결과 검증 +``` + +### 프레임워크별 지원 +- C#: xUnit, NUnit, MSTest +- Python: pytest, unittest +- JavaScript: Jest, Mocha, Vitest +- Java: JUnit 5 + +## 출력 +- 테스트 파일 생성 (프로젝트 컨벤션에 맞는 위치) +- 테스트 실행 결과 요약 +- 커버리지 추정 (메서드별 테스트 유무) + +## 규칙 +- 기존 테스트가 있으면 스타일을 따르기 +- 외부 의존성은 Mock/Stub 사용 +- 테스트 간 독립성 보장 (상태 공유 금지) +- 한국어 주석으로 테스트 의도 설명 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/image-processor.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/image-processor.skill.md new file mode 100644 index 0000000..86c6c31 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/image-processor.skill.md @@ -0,0 +1,75 @@ +--- +name: image-processor +label: 이미지 처리 +description: Python Pillow를 사용하여 이미지 리사이즈, 크롭, 워터마크, 포맷 변환을 수행합니다. +icon: \uEB9F +requires: python +tabs: cowork +--- + +사용자의 요구에 맞게 이미지를 처리하세요. + +## 사전 준비 +먼저 Pillow 패키지가 설치되어 있��지 확인하고, 없으면 설���하세요: +``` +process_run: pip install Pillow +``` + +## 작업 절�� +1. **요구사항 파악**: 처리할 이미지 파일과 원하는 작업 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립�� 실행 +4. **결과 확인**: 처리된 이미지 파일 경로를 사용자에게 안내 + +## 지원 기능 + +### 리사이즈 +```python +from PIL import Image +img = Image.open('input.png') +img_resized = img.resize((800, 600)) # 고정 크기 +# 또는 비율 유지 +img.thumbnail((800, 800)) +img.save('output.png') +``` + +### 크롭 +```python +img = Image.open('input.png') +cropped = img.crop((left, top, right, bottom)) +cropped.save('output.png') +``` + +### 워터마크 +```python +from PIL import Image, ImageDraw, ImageFont +img = Image.open('input.png') +draw = ImageDraw.Draw(img) +draw.text((10, 10), "Watermark", fill=(255, 255, 255, 128)) +img.save('output.png') +``` + +### 포맷 변환 +```python +img = Image.open('input.png') +img.save('output.jpg', 'JPEG', quality=85) +img.save('output.webp', 'WEBP', quality=80) +``` + +### 배치 처리 +```python +import glob +for path in glob.glob('*.png'): + img = Image.open(path) + img.thumbnail((800, 800)) + img.save(f'resized_{path}') +``` + +## 추가 기능 +- 회전/뒤집기 (rotate, transpose) +- 밝기/대비/선명도 조절 (ImageEnhance) +- 필터 적용 (ImageFilter: BLUR, SHARPEN, CONTOUR) +- 이미지 합성 (Image.paste, Image.alpha_composite) +- EXIF 정보 읽기 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/impact.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/impact.skill.md new file mode 100644 index 0000000..1b0d56b --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/impact.skill.md @@ -0,0 +1,67 @@ +--- +name: impact +label: 변경 영향 분석 +description: 코드 변경 시 영향받는 파일, 함수, 테스트를 식별합니다. +icon: \uE946 +allowed-tools: + - lsp_code_intel + - grep + - search_codebase + - git_tool + - file_read + - folder_map +tabs: code +--- + +코드 변경이 미치는 영향 범위를 분석하여 안전한 수정을 도와주세요. + +## 워크플로우 + +1. **변경 대상 확인**: 어떤 파일/함수/클래스를 변경할 예정인지 파악 +2. **직접 참조 분석**: lsp_code_intel의 find_references로 직접 호출처 확인 +3. **간접 영향 분석**: + - grep으로 문자열 기반 참조 검색 + - search_codebase로 의미적 유사 코드 탐색 + - 상속/인터페이스 체인 추적 +4. **테스트 영향**: 관련 테스트 파일 식별 +5. **위험도 평가**: 변경 영향 범위와 위험도 매트릭스 생성 +6. **보고서 작성**: 영향 분석 보고서 생성 + +## 분석 항목 + +### 직접 영향 +- 해당 함수/클래스를 직접 호출하는 코드 +- import/using 하는 파일 +- 상속받는 클래스 + +### 간접 영향 +- 인터페이스 구현체를 통한 호출 +- 리플렉션/동적 호출 +- 설정 파일 참조 +- UI 바인딩 + +### 테스트 영향 +- 직접 테스트하는 테스트 파일 +- 관련 통합 테스트 +- 테스트 더블(Mock) 대상 여부 + +## 출력 형식 + +### 영향 분석 보고서 + +| 영향 수준 | 파일 | 관련 함수 | 위험도 | 비고 | +|----------|------|----------|--------|------| +| 🔴 직접 | A.cs | MethodX() | 높음 | 시그니처 변경 시 컴파일 오류 | +| 🟡 간접 | B.cs | MethodY() | 중간 | 동적 호출, 런타임 오류 가능 | +| 🟢 테스트 | A.Tests.cs | Test1() | 낮음 | 테스트 수정 필요 | + +### 변경 체크리스트 +- [ ] 직접 참조 N개 확인 및 수정 +- [ ] 테스트 M개 업데이트 +- [ ] 관련 문서 갱신 + +## 규칙 +- 코드를 직접 수정하지 않음 (분석만 수행) +- 가능하면 LSP 기반 정확한 참조 분석 우선 +- LSP 불가 시 grep 기반 텍스트 검색으로 대체 +- 위험도는 보수적으로 평가 (의심스러우면 높음) diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/json-schema.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/json-schema.skill.md new file mode 100644 index 0000000..821dbf4 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/json-schema.skill.md @@ -0,0 +1,107 @@ +--- +name: json-schema +label: JSON/YAML 스키마 도구 +description: JSON 또는 YAML 데이터에서 스키마를 생성하고, 데이터의 유효성을 검증합니다. +icon: \uE943 +tabs: code +allowed-tools: + - json_tool + - file_read + - file_write + - clipboard_tool +--- + +JSON/YAML 샘플 데이터에서 스키마를 추출하거나, 기존 스키마로 데이터를 검증하세요. + +## 작업 절차 + +1. **요청 유형 판별**: + - **스키마 생성**: 샘플 JSON/YAML → JSON Schema 추출 + - **스키마 검증**: 데이터 + 스키마 → 유효성 검사 + - **스키마 문서화**: 기존 스키마 → 사람이 읽을 수 있는 설명 생성 +2. **입력 데이터 확인**: file_read 또는 사용자 입력으로 데이터 로드 +3. **스키마 생성 또는 검증 수행**: json_tool로 처리 +4. **결과 출력**: 생성된 스키마 또는 검증 결과를 표시 +5. **파일 저장**: file_write로 결과를 저장하거나 clipboard_tool로 복사 + +## 스키마 생성 규칙 + +### 타입 추론 +| JSON 값 | JSON Schema 타입 | 추가 속성 | +|---------|-----------------|----------| +| `"text"` | `string` | — | +| `123` | `integer` | — | +| `1.5` | `number` | — | +| `true` | `boolean` | — | +| `null` | `null` | nullable 처리 | +| `[]` | `array` | items 스키마 | +| `{}` | `object` | properties 스키마 | + +### 추론 강화 +- **패턴 감지**: 이메일, URL, 날짜, UUID 등은 `format` 속성 추가 +- **열거형 감지**: 값의 종류가 적으면 `enum` 으로 제안 +- **필수 필드**: 모든 샘플에 존재하는 필드는 `required`로 표시 +- **배열 항목**: 배열 내 모든 항목을 분석하여 통합 스키마 생성 + +### 출력 형식 (JSON Schema Draft 7) +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "사용자 정보", + "description": "사용자 프로필 데이터 스키마", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "사용자 이름" + }, + "email": { + "type": "string", + "format": "email", + "description": "이메일 주소" + }, + "age": { + "type": "integer", + "minimum": 0, + "maximum": 150, + "description": "나이" + } + }, + "required": ["name", "email"], + "additionalProperties": false +} +``` + +## 검증 결과 형식 +검증 결과는 다음과 같이 표시하세요: +``` +검증 결과: ❌ 실패 (3건의 오류) + +| # | 경로 | 오류 | 기대값 | +|---|------|------|--------| +| 1 | $.email | 필수 필드 누락 | string (required) | +| 2 | $.age | 타입 불일치 | integer (실제: string) | +| 3 | $.tags[2] | 열거형 불일치 | "A", "B", "C" 중 하나 | +``` + +## 스키마 문서화 형식 +기존 스키마를 분석하여 사람이 읽기 쉬운 문서를 생성: +``` +## 사용자 정보 스키마 + +| 필드 | 타입 | 필수 | 설명 | 제약 조건 | +|------|------|------|------|----------| +| name | string | ✅ | 사용자 이름 | — | +| email | string | ✅ | 이메일 주소 | format: email | +| age | integer | — | 나이 | 0~150 | +| tags | array | — | 태그 목록 | items: string | +``` + +## 규칙 +- JSON Schema Draft 7 형식 사용 +- 스키마 생성 시 description 필드를 한국어로 작성 +- 복수 샘플이 제공되면 모든 샘플을 분석하여 통합 스키마 생성 +- 중첩 객체는 재귀적으로 스키마 추출 +- 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/log-analyze.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/log-analyze.skill.md new file mode 100644 index 0000000..0ac33d9 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/log-analyze.skill.md @@ -0,0 +1,69 @@ +--- +name: log-analyze +label: 로그 분석기 +description: 로그 파일의 패턴을 분석하고 에러를 요약하며 타임라인을 시각화합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - chart_create + - html_create + - data_pivot + - text_summarize +tabs: cowork +--- + +로그 파일을 분석하여 패턴, 에러, 추세를 파악하고 보고서를 생성하세요. + +## 워크플로우 + +1. **로그 파일 로드**: file_read로 로그 파일 읽기 +2. **패턴 분석**: + - grep으로 에러/경고/예외 패턴 검색 + - 시간대별 이벤트 빈도 파악 + - 반복되는 에러 패턴 식별 +3. **통계 생성**: data_pivot으로 집계 +4. **시각화**: chart_create로 타임라인 차트 생성 +5. **보고서**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 에러 분석 +- ERROR, WARN, FATAL, Exception 키워드 추출 +- 에러 유형별 발생 빈도 +- 최초 발생 시점 및 최근 발생 시점 +- 에러 메시지 클러스터링 (유사 에러 그룹화) + +### 시간대 분석 +- 시간대별 로그 발생 빈도 +- 피크 시간대 식별 +- 에러 집중 시간대 + +### 패턴 분석 +- 반복 패턴 (주기적 에러) +- 연쇄 에러 (A 에러 후 B 에러 발생 패턴) +- 비정상 패턴 (평소와 다른 로그량) + +## 출력 형식 + +``` +## 로그 분석 보고서 +- 분석 기간: [시작] ~ [끝] +- 총 로그: N줄 + +### 에러 요약 (상위 10건) +| 순위 | 에러 유형 | 발생 횟수 | 최근 발생 | +|------|----------|----------|----------| + +### 타임라인 차트 +[시간대별 이벤트 빈도 차트] + +### 상세 분석 +[에러별 상세 내용 및 권장 조치] +``` + +## 지원 로그 형식 +- 일반 텍스트 로그 (타임스탬프 자동 감지) +- JSON 로그 (각 줄이 JSON 객체) +- CSV 로그 (헤더 포함) +- syslog 형식 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/markdown-to-doc.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/markdown-to-doc.skill.md new file mode 100644 index 0000000..7a852d8 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/markdown-to-doc.skill.md @@ -0,0 +1,164 @@ +--- +name: markdown-to-doc +label: Markdown → 문서 변환 +description: Markdown 파일을 서식이 적용된 Word(.docx) 또는 PDF 문서로 변환합니다. +icon: \uE8A5 +tabs: cowork +requires: python +--- + +Markdown 파일을 전문적인 Word 또는 PDF 문서로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx markdown +``` + +## 작업 절차 + +1. **Markdown 파일 확인**: file_read로 변환할 Markdown 파일의 내용과 구조를 파악 +2. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 출력 형식: Word(.docx) 또는 PDF + - 폰트: 맑은 고딕 (기본) / 사용자 지정 + - 여백, 페이지 크기 설정 + - 머리글/바닥글 포함 여부 +3. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 문서 파일 경로와 페이지 수를 안내 + +## 스타일 매핑 + +| Markdown | Word 스타일 | 설명 | +|----------|------------|------| +| `# 제목` | Heading 1 | 16pt, 굵게 | +| `## 소제목` | Heading 2 | 14pt, 굵게 | +| `### 항목` | Heading 3 | 12pt, 굵게 | +| 본문 텍스트 | Normal | 11pt | +| `**굵게**` | Bold run | 굵게 | +| `*기울임*` | Italic run | 기울임 | +| `` `코드` `` | 코드 스타일 | Consolas, 배경색 | +| `> 인용` | Quote | 들여쓰기 + 왼쪽 테두리 | +| `- 목록` | List Bullet | 글머리 기호 | +| `1. 번호` | List Number | 번호 목록 | +| 표 | Table Grid | 테두리 표 | +| `---` | 페이지 구분 | 가로선 → 페이지 나누기 | +| 코드 블록 | 코드 단락 | Consolas, 회색 배경 | + +## Python 스크립트 템플릿 +```python +import re +from docx import Document +from docx.shared import Inches, Pt, Cm, RGBColor +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.oxml.ns import qn +import markdown + +# Markdown 파일 읽기 +with open('input.md', 'r', encoding='utf-8') as f: + md_content = f.read() + +doc = Document() + +# 기본 스타일 설정 +style = doc.styles['Normal'] +font = style.font +font.name = '맑은 고딕' +font.size = Pt(11) +style.element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕') + +# 여백 설정 +for section in doc.sections: + section.top_margin = Cm(2.54) + section.bottom_margin = Cm(2.54) + section.left_margin = Cm(3.17) + section.right_margin = Cm(3.17) + +# Markdown 파싱 및 변환 +lines = md_content.split('\n') +i = 0 +while i < len(lines): + line = lines[i] + + # 제목 (Heading) + if line.startswith('#'): + level = len(line) - len(line.lstrip('#')) + text = line.lstrip('#').strip() + doc.add_heading(text, level=min(level, 4)) + + # 코드 블록 + elif line.startswith('```'): + code_lines = [] + i += 1 + while i < len(lines) and not lines[i].startswith('```'): + code_lines.append(lines[i]) + i += 1 + p = doc.add_paragraph() + run = p.add_run('\n'.join(code_lines)) + run.font.name = 'Consolas' + run.font.size = Pt(9) + + # 인용 + elif line.startswith('>'): + text = line.lstrip('>').strip() + p = doc.add_paragraph(text) + p.paragraph_format.left_indent = Cm(1.27) + + # 글머리 기호 + elif line.startswith('- ') or line.startswith('* '): + text = line[2:].strip() + doc.add_paragraph(text, style='List Bullet') + + # 번호 목록 + elif re.match(r'^\d+\.\s', line): + text = re.sub(r'^\d+\.\s', '', line).strip() + doc.add_paragraph(text, style='List Number') + + # 가로선 → 페이지 나누기 + elif line.strip() in ('---', '***', '___'): + doc.add_page_break() + + # 빈 줄 + elif line.strip() == '': + pass + + # 일반 텍스트 + else: + p = doc.add_paragraph() + # 굵게, 기울임 처리 + parts = re.split(r'(\*\*.*?\*\*|\*.*?\*|`.*?`)', line) + for part in parts: + if part.startswith('**') and part.endswith('**'): + run = p.add_run(part[2:-2]) + run.bold = True + elif part.startswith('*') and part.endswith('*'): + run = p.add_run(part[1:-1]) + run.italic = True + elif part.startswith('`') and part.endswith('`'): + run = p.add_run(part[1:-1]) + run.font.name = 'Consolas' + run.font.size = Pt(10) + else: + p.add_run(part) + + i += 1 + +# 저장 +doc.save('output.docx') +print(f'변환 완료: output.docx ({len(doc.paragraphs)}개 단락)') +``` + +## 표 변환 +Markdown 표가 있으면 Word 표로 변환합니다: +- 헤더 행: 굵게, 배경색 적용 +- 셀 정렬: Markdown의 `:---`, `:---:`, `---:` 구문 반영 +- 테두리: 전체 셀에 얇은 테두리 + +## 규칙 +- 원본 Markdown 파일은 수정하지 않음 +- 인코딩: UTF-8 기본 +- 이미지 링크(`![](path)`)는 로컬 파일이면 삽입, URL이면 경로만 표시 +- 복잡한 Markdown(수식, 다이어그램)은 지원 범위와 한계를 안내 +- 출력 파일명: 원본 파일명 기준 (.md → .docx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/meeting-minutes.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/meeting-minutes.skill.md new file mode 100644 index 0000000..e3ec988 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/meeting-minutes.skill.md @@ -0,0 +1,40 @@ +--- +name: meeting-minutes +label: 회의록 정리 +description: 회의 내용을 체계적으로 정리하여 회의록을 생성합니다. +icon: \uE771 +tabs: cowork +--- + +사용자가 제공한 회의 내용(텍스트, 메모, 파일)을 정리하여 체계적인 회의록을 작성하세요. + +다음 도구를 사용하세요: +1. file_read — 회의 관련 파일 읽기 (필요 시) +2. file_write — 회의록 파일 생성 + +회의록 형식: +## 회의 정보 +- 일시: +- 참석자: +- 장소/방법: +- 주제: + +## 안건 및 논의 내용 +각 안건별로: +- **안건**: 주제 +- **논의 내용**: 주요 발언 및 의견 정리 +- **결정 사항**: 합의된 내용 + +## 액션 아이템 +| 번호 | 담당자 | 내용 | 기한 | 비고 | +|------|--------|------|------|------| +| 1 | - | - | - | - | + +## 다음 회의 +- 예정일: +- 주요 안건: + +규칙: +- 핵심 내용 위주로 간결하게 정리 +- 결정 사항과 액션 아이템은 명확하게 기술 +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/ocr-extract.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/ocr-extract.skill.md new file mode 100644 index 0000000..8c7e71d --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/ocr-extract.skill.md @@ -0,0 +1,108 @@ +--- +name: ocr-extract +label: OCR 텍스트 추출 +description: Python pytesseract를 사용하여 이미지/스캔 문서에서 텍스트를 추출합니다. +icon: \uE8D4 +requires: python +tabs: cowork +--- + +이미지 또는 스캔된 문서에서 텍스트를 추출하세요. + +## 사전 준비 +1. Tesseract OCR 엔진이 시스템에 설치되어 있어야 합니다. + - Windows: https://github.com/UB-Mannheim/tesseract/wiki 에서 설치 + - 한국어 지원: 설치 시 "Korean" 언어 데이터 선택 +2. Python 패키지 설치: +``` +process_run: pip install pytesseract Pillow +``` + +## 작업 절차 +1. **이미지 확인**: 사용자가 제공한 이미지 파일 확인 +2. **전처리 (선택)**: 이미지 품질이 낮으면 전처리 스크립트 적용 +3. **OCR 실행**: pytesseract로 텍스트 추출 +4. **결과 저장**: 추출된 텍스트를 파일로 저장하고 사용자에게 안내 + +## OCR 스크립트 템플릿 + +### 기본 텍스트 추출 +```python +import pytesseract +from PIL import Image + +# Windows에서 Tesseract 경로 지정 (필요 시) +# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' + +img = Image.open('scan.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +print(text) + +with open('extracted.txt', 'w', encoding='utf-8') as f: + f.write(text) +``` + +### 이미지 전처리 (품질 개선) +```python +from PIL import Image, ImageFilter, ImageEnhance + +img = Image.open('scan.png') + +# 그레이스케일 변환 +img = img.convert('L') + +# 대비 향상 +enhancer = ImageEnhance.Contrast(img) +img = enhancer.enhance(2.0) + +# 선명도 향상 +img = img.filter(ImageFilter.SHARPEN) + +# 이진화 (흑백) +threshold = 128 +img = img.point(lambda x: 255 if x > threshold else 0) + +img.save('preprocessed.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +``` + +### 배치 OCR (여러 이미지) +```python +import glob +import pytesseract +from PIL import Image + +results = [] +for path in sorted(glob.glob('*.png')): + img = Image.open(path) + text = pytesseract.image_to_string(img, lang='kor+eng') + results.append(f'--- {path} ---\n{text}\n') + +with open('all_extracted.txt', 'w', encoding='utf-8') as f: + f.write('\n'.join(results)) +``` + +### 표 영역 추출 +```python +import pytesseract +from PIL import Image + +img = Image.open('table.png') +# TSV 형식으로 추출 (표 구조 보존) +tsv_data = pytesseract.image_to_data(img, lang='kor+eng', output_type=pytesseract.Output.DATAFRAME) +print(tsv_data) +``` + +## 지원 언어 +- `kor` — 한국어 +- `eng` — 영어 +- `kor+eng` — 한국어+영어 혼합 (권장) +- `jpn` — 일본어 +- `chi_sim` — 중국어 간체 + +## 팁 +- 스캔 해상도 300dpi 이상이면 인식률이 높습니다 +- 기울어진 이미지는 `img.rotate()` 로 보정 후 추출하세요 +- 손글씨는 인식률이 낮을 수 있습니다 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/paper-review.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/paper-review.skill.md new file mode 100644 index 0000000..72b558c --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/paper-review.skill.md @@ -0,0 +1,54 @@ +--- +name: paper-review +label: 논문 분석 +description: 논문 또는 기술 문서를 체계적으로 분석하고 핵심 내용을 정리합니다. +icon: \uE736 +tabs: cowork +--- + +사용자가 제공한 논문 또는 기술 문서를 체계적으로 분석하세요. + +## 파일 읽기 전략 +- **PDF 파일**: 반드시 `document_read` 도구를 사용하세요. 페이지 범위 지정이 가능합니다. + - 먼저 전체 페이지 수를 확인한 후, 초록(1-2페이지)→본문→참고문헌 순으로 읽으세요. + - `file_read`로 PDF를 읽으면 텍스트가 깨질 수 있으므로 사용하지 마세요. +- **텍스트 파일** (.txt, .md, .html 등): `file_read` 도구를 사용하세요. + +## 사용 도구 +1. document_read — PDF 논문 파일 읽기 (페이지 범위 지정, 초록/참고문헌 추출) +2. file_read — 텍스트 기반 문서 파일 읽기 +3. file_write — 분석 보고서 생성 + +## 분석 항목 +## 논문 개요 +- 제목, 저자, 발표 연도/학회 +- 연구 분야 및 키워드 + +## 연구 목적 및 배경 +- 연구 문제 정의 +- 기존 연구의 한계점 + +## 방법론 +- 제안 방법의 핵심 아이디어 +- 실험 설계 및 데이터셋 + +## 주요 결과 +- 핵심 실험 결과 (표/수치 인용) +- 기존 방법 대비 개선점 + +## 한계점 및 향후 연구 +- 저자가 인정한 한계 +- 발전 가능성 + +## 실무 적용 가능성 +- 우리 업무에 적용할 수 있는 포인트 +- 기술 도입 시 고려사항 + +## 작업 절차 +1. 사용자가 파일명을 언급하면 작업 폴더에서 해당 파일을 찾아 읽기 +2. PDF인 경우 `document_read`로 초록(1-2p) 먼저 읽어 전체 구조 파악 +3. 본문을 페이지 범위별로 나누어 순차 읽기 +4. 위 분석 항목에 따라 체계적으로 정리 +5. `file_write`로 분석 보고서를 마크다운 파일로 저장 + +한국어로 작성하고, 전문 용어는 원문과 함께 표기하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/pdf-processor.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/pdf-processor.skill.md new file mode 100644 index 0000000..4076e47 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/pdf-processor.skill.md @@ -0,0 +1,63 @@ +--- +name: pdf-processor +label: PDF 처리 +description: Python을 사용하여 PDF에서 텍스트/표를 추출하거나 PDF를 생성합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +PDF 파일을 읽거나 새 PDF를 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pypdf pdfplumber reportlab +``` + +## 작업 절차 + +### PDF 텍스트 추출 +1. **파일 확인**: folder_map으로 PDF 파일 위치 확인 +2. **추출 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행**: process_run으로 실행 +4. **결과 전달**: 추출된 텍스트를 사용자에게 전달 + +### PDF 생성 +1. **내용 파악**: 사용자가 원하는 문서 내용 확인 +2. **생성 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행 및 확인**: process_run으로 실행 + +## 텍스트 추출 템플릿 +```python +import pdfplumber +import json + +results = [] +with pdfplumber.open('input.pdf') as pdf: + for i, page in enumerate(pdf.pages): + text = page.extract_text() or '' + tables = page.extract_tables() or [] + results.append({ + 'page': i + 1, + 'text': text, + 'tables': tables, + }) + +with open('pdf_extracted.json', 'w', encoding='utf-8') as f: + json.dump(results, f, ensure_ascii=False, indent=2) + +for r in results: + print(f"--- 페이지 {r['page']} ---") + print(r['text'][:500]) +``` + +## 지원 기능 +- 텍스트 추출 (페이지별) +- 표 추출 (구조 보존) +- PDF 병합 / 분할 +- PDF 생성 (reportlab) +- 페이지 회전 +- 메타데이터 읽기 + +한국어로 안내하세요. 원본 PDF는 수정하지 마세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/perf-audit.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/perf-audit.skill.md new file mode 100644 index 0000000..9db18d8 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/perf-audit.skill.md @@ -0,0 +1,94 @@ +--- +name: perf-audit +label: 성능 감사 +description: 코드 복잡도, 성능 병목, 메모리 이슈를 분석하고 최적화 방안을 제시합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - glob + - html_create +tabs: code +--- + +코드베이스의 성능 관련 이슈를 분석하고 최적화 보고서를 생성하세요. + +## 워크플로우 + +1. **프로젝트 분석**: folder_map으로 구조 파악, 언어/프레임워크 식별 +2. **복잡도 분석**: 파일별 줄 수, 메서드 크기, 중첩 깊이 측정 +3. **성능 안티패턴 탐지**: grep으로 알려진 성능 이슈 패턴 검색 +4. **메모리 이슈 탐지**: 리소스 해제 누락, 대용량 할당 패턴 +5. **보고서 생성**: html_create로 성능 감사 보고서 + +## 분석 항목 + +### 코드 복잡도 지표 +- **파일 크기**: 500줄 이상 파일 식별 +- **메서드 크기**: 50줄 이상 메서드 식별 +- **중첩 깊이**: 4단계 이상 들여쓰기 +- **매개변수 수**: 5개 이상 파라미터 메서드 + +### 성능 안티패턴 + +#### 데이터베이스 +- N+1 쿼리 패턴 (루프 내 DB 호출) +- SELECT * 사용 (불필요한 컬럼 로드) +- 인덱스 미사용 쿼리 힌트 + +#### 메모리 +- IDisposable 미해제 (using 미사용) +- 대용량 문자열 결합 (StringBuilder 미사용) +- 정적 컬렉션 무한 증가 +- 이벤트 핸들러 미해제 (메모리 누수) + +#### I/O +- 동기 파일 I/O (async 미사용) +- 동기 네트워크 호출 +- 불필요한 직렬화/역직렬화 + +#### 알고리즘 +- O(n²) 이상 루프 (중첩 foreach/for) +- 반복 계산 (캐싱 미적용) +- LINQ 체인의 불필요한 ToList() + +#### 프론트엔드 +- 불필요한 리렌더링 패턴 +- 대용량 번들 임포트 +- 이미지 최적화 미적용 + +### .NET 전용 패턴 +``` +탐지 대상: +- Task.Result / .Wait() (데드락 위험) +- lock 내부 async 호출 +- GC.Collect() 직접 호출 +- Reflection 반복 사용 +- string + string 반복 (루프 내) +``` + +## 출력 형식 + +### 성능 감사 보고서 + +**요약 대시보드** +| 지표 | 값 | 상태 | +|------|-----|------| +| 총 파일 수 | ... | — | +| 대형 파일 (500줄+) | ... | ⚠ | +| 대형 메서드 (50줄+) | ... | ⚠ | +| 성능 안티패턴 | ... | 🔴 | +| 메모리 이슈 | ... | 🟡 | + +**상세 이슈 목록** +| 우선순위 | 파일 | 라인 | 이슈 | 영향 | 권장 조치 | +|---------|------|------|------|------|----------| +| 🔴 높음 | ... | ... | N+1 쿼리 | 응답 지연 | 일괄 로드 | + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 성능 이슈는 영향도와 수정 난이도를 함께 평가 +- 추측보다 패턴 기반 탐지 우선 +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/pptx-creator.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/pptx-creator.skill.md new file mode 100644 index 0000000..eeea93c --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/pptx-creator.skill.md @@ -0,0 +1,111 @@ +--- +name: pptx-creator +label: PPT 프레젠테이션 생성 +description: Python을 사용하여 전문적인 PowerPoint 프레젠테이션을 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE7BE +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 PowerPoint 프레젠테이션을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install python-pptx +``` + +## 양식 활용 (마스터 슬라이드 템플릿) +작업 폴더에 PPT 양식이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.pptx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .pptx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식의 슬라이드 레이아웃 목록 확인 +4. **양식 기반 생성**: + ```python + prs = Presentation('양식_발표.pptx') + # 마스터 슬라이드의 배경, 로고, 색 테마, 폰트가 자동 상속 + # 기존 슬라이드 제거 후 새 내용 추가 + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + ``` +5. **레이아웃 확인** (양식마다 다를 수 있음): + ```python + for i, layout in enumerate(prs.slide_layouts): + print(f'{i}: {layout.name}') + ``` +6. **양식이 없으면**: 아래 기본 템플릿으로 새 프레젠테이션 생성 + +## 작업 절차 +1. **요구사항 파악**: 발표 주제, 슬라이드 수, 스타일 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .pptx 파일이 있는지 확인 +3. **스크립트 작성**: file_write로 Python 스크립트 생성 +4. **실행**: process_run으로 스크립트 실행 +5. **결과 안내**: 생성된 .pptx 파일 경로를 사용자에게 전달 + +## 스크립트 템플릿 +```python +from pptx import Presentation +from pptx.util import Inches, Pt, Emu +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.pptx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 프레젠테이션 +if template_file: + prs = Presentation(template_file) + # 기존 슬라이드 제거 (마스터/레이아웃은 유지) + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + print(f'양식 활용: {template_file}') + print(f'사용 가능한 레이아웃: {[l.name for l in prs.slide_layouts]}') +else: + prs = Presentation() + prs.slide_width = Inches(13.333) + prs.slide_height = Inches(7.5) + +# 제목 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[0]) +slide.shapes.title.text = '프레젠테이션 제목' +if len(slide.placeholders) > 1: + slide.placeholders[1].text = '부제목' + +# 내용 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[1]) +slide.shapes.title.text = '섹션 제목' +body = slide.placeholders[1] +body.text = '첫 번째 포인트' +p = body.text_frame.add_paragraph() +p.text = '두 번째 포인트' + +prs.save('presentation.pptx') +print('프레젠테이션 생성 완료: presentation.pptx') +``` + +## 지원 기능 +- 제목/내용/빈 슬라이드 레이아웃 +- 텍스트 서식 (글꼴, 크기, 색상, 정렬) +- 표 삽입 +- 이미지 삽입 +- 도형 (사각형, 원, 화살표) +- 차트 (막대, 선, 원형) +- 슬라이드 번호 +- 마스터 슬라이드 커스터마이징 +- **양식 파일 기반 마스터/레이아웃 상속** (배경, 로고, 색 테마, 폰트 자동 유지) + +한국어로 안내하세요. 작업 폴더에 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/prd-generator.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/prd-generator.skill.md new file mode 100644 index 0000000..8236401 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/prd-generator.skill.md @@ -0,0 +1,100 @@ +--- +name: prd-generator +label: 요구사항 정의서 (PRD) +description: 제품 요구사항 정의서, 유저 스토리, 수용 기준을 체계적으로 생성합니다. +icon: \uE8A5 +allowed-tools: + - file_read + - file_write + - html_create + - docx_create + - document_plan + - document_assemble +tabs: cowork +--- + +제품/기능의 요구사항 정의서(PRD)를 체계적으로 작성하세요. + +## 워크플로우 + +1. **요구사항 수집**: 사용자에게 다음을 확인 + - 제품/기능 이름 + - 목적과 배경 + - 대상 사용자 + - 핵심 기능 목록 + - 제약 조건 (기술, 일정, 예산) + +2. **구조화**: document_plan으로 PRD 개요 설계 + +3. **상세 작성**: 섹션별 상세 내용 작성 + - 유저 스토리 (As a... I want... So that...) + - 수용 기준 (Given... When... Then...) + - 기능 우선순위 (MoSCoW) + +4. **문서 생성**: document_assemble 또는 html_create로 최종 문서 + +## PRD 구조 + +### 1. 개요 +- 제품/기능 이름 +- 버전 / 작성일 / 작성자 +- 문서 목적 + +### 2. 배경 및 목적 +- 비즈니스 배경 +- 해결하려는 문제 +- 기대 효과 (정량적 KPI) + +### 3. 대상 사용자 +- 사용자 페르소나 +- 사용 시나리오 +- 사용자 여정 맵 + +### 4. 기능 요구사항 + +#### 유저 스토리 형식 +``` +US-001: [기능명] +As a [역할], +I want [기능], +So that [가치]. + +수용 기준: +- Given [사전 조건], When [행동], Then [기대 결과] +- Given ..., When ..., Then ... + +우선순위: Must Have / Should Have / Could Have / Won't Have +``` + +### 5. 비기능 요구사항 +- 성능 (응답 시간, 처리량) +- 보안 (인증, 권한, 암호화) +- 접근성 (WCAG 수준) +- 호환성 (브라우저, OS, 디바이스) + +### 6. 기술 제약 +- 기술 스택 제한 +- 연동 시스템 +- 데이터 마이그레이션 + +### 7. 일정 및 마일스톤 +| 마일스톤 | 예정일 | 산출물 | +|---------|--------|--------| +| 설계 완료 | ... | 상세 설계서 | +| 개발 완료 | ... | 릴리즈 빌드 | +| QA 완료 | ... | 테스트 보고서 | + +### 8. 성공 지표 +- 핵심 KPI 및 측정 방법 +- 목표 수치 + +### 9. 리스크 및 대안 +| 리스크 | 영향 | 대안 | +|--------|------|------| +| ... | 높음 | ... | + +## 규칙 +- 사용자 관점에서 작성 (기술 용어 최소화) +- 유저 스토리는 INVEST 원칙 준수 (Independent, Negotiable, Valuable, Estimable, Small, Testable) +- 수용 기준은 테스트 가능하도록 구체적으로 +- 한국어로 작성 (영어 용어 병기 가능) diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/refactor.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/refactor.skill.md new file mode 100644 index 0000000..a58d54e --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/refactor.skill.md @@ -0,0 +1,65 @@ +--- +name: refactor +label: 리팩토링 가이드 +description: 코드베이스를 분석하여 리팩토링 포인트를 식별하고 실행 계획을 생성합니다. +icon: \uE90F +allowed-tools: + - search_codebase + - grep + - file_read + - code_review + - folder_map + - lsp_code_intel +tabs: code +--- + +코드베이스를 분석하여 리팩토링이 필요한 부분을 식별하고 개선 계획을 수립하세요. + +## 워크플로우 + +1. **구조 파악**: folder_map + grep으로 프로젝트 전체 구조 분석 +2. **코드 스멜 탐지**: + - 중복 코드 (grep으로 유사 패턴 검색) + - 긴 메서드/클래스 (file_read로 크기 확인) + - 복잡한 조건문 (중첩 if/switch) + - 미사용 코드 (lsp_code_intel로 참조 확인) +3. **의존성 분석**: lsp_code_intel로 참조 관계 파악 +4. **우선순위 결정**: 영향도 × 난이도 매트릭스 +5. **리팩토링 계획 생성**: 단계별 실행 계획 + +## 분석 항목 + +### 코드 스멜 (Code Smells) +- **중복 코드**: 3곳 이상 반복되는 유사 코드 +- **거대 클래스**: 500줄 이상의 클래스 +- **긴 메서드**: 50줄 이상의 메서드 +- **매개변수 과다**: 5개 이상 파라미터 +- **의존성 순환**: 상호 참조 관계 +- **매직 넘버**: 하드코딩된 숫자/문자열 +- **깊은 중첩**: 4단계 이상 들여쓰기 + +### 리팩토링 기법 (제안) +- Extract Method / Extract Class +- Rename (변수, 메서드, 클래스) +- Move Method / Move Field +- Replace Conditional with Polymorphism +- Introduce Parameter Object +- Remove Dead Code + +## 출력 형식 + +### 리팩토링 보고서 +| 우선순위 | 파일 | 이슈 | 제안 | 영향도 | 난이도 | +|---------|------|------|------|--------|--------| +| 🔴 높음 | ... | ... | ... | ★★★ | ★☆☆ | +| 🟡 중간 | ... | ... | ... | ★★☆ | ★★☆ | + +### 실행 계획 +1. [안전한 변경부터] ... +2. [테스트 추가 후] ... +3. [구조 변경] ... + +## 규칙 +- 코드를 직접 수정하지 않음 (분석 + 계획만) +- 기존 테스트가 있으면 테스트 커버리지 확인 +- 팀 컨벤션/스타일 가이드 존중 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/regex-helper.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/regex-helper.skill.md new file mode 100644 index 0000000..91e10dd --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/regex-helper.skill.md @@ -0,0 +1,86 @@ +--- +name: regex-helper +label: 정규식 도우미 +description: 정규식 패턴을 생성하고, 기존 패턴을 해석하며, 테스트 케이스로 검증합니다. +icon: \uE8FD +tabs: code +allowed-tools: + - regex_tool + - clipboard_tool + - file_read +--- + +사용자의 요구에 맞는 정규식 패턴을 작성하거나, 기존 패턴을 해석하고 테스트하세요. + +## 작업 절차 + +1. **요구사항 파악**: 사용자의 요청 유형을 판별 + - **패턴 생성**: "이메일 주소를 찾는 정규식 만들어줘" + - **패턴 해석**: "이 정규식이 무슨 뜻이야? `^[\w.-]+@[\w.-]+\.\w+$`" + - **패턴 테스트**: "이 패턴이 이 문자열에 매칭되는지 확인해줘" +2. **패턴 작성 또는 분석**: + - 생성: 요구사항을 분석하여 정규식 패턴 작성 + - 해석: 패턴을 구성 요소별로 분해하여 설명 +3. **테스트 수행**: regex_tool로 패턴을 테스트 케이스에 적용 + - 매칭되어야 할 문자열 (positive cases) + - 매칭되지 않아야 할 문자열 (negative cases) +4. **결과 설명**: 매칭 결과와 캡처 그룹을 상세히 설명 +5. **최적화 제안**: 성능 또는 가독성 개선이 가능하면 대안 제시 + +## 패턴 생성 가이드 + +### 자주 사용되는 패턴 +| 용도 | 패턴 | 설명 | +|------|------|------| +| 이메일 | `[\w.-]+@[\w.-]+\.\w{2,}` | 기본 이메일 형식 | +| 전화번호 (한국) | `0\d{1,2}-\d{3,4}-\d{4}` | 010-1234-5678 형식 | +| 날짜 (YYYY-MM-DD) | `\d{4}-(?:0[1-9]\|1[0-2])-(?:0[1-9]\|[12]\d\|3[01])` | ISO 날짜 형식 | +| IP 주소 | `(?:\d{1,3}\.){3}\d{1,3}` | IPv4 기본 | +| URL | `https?://[\w.-]+(?:/[\w./?#&=-]*)?` | HTTP/HTTPS URL | +| 한글만 | `[가-힣]+` | 한글 문자 | +| 사업자등록번호 | `\d{3}-\d{2}-\d{5}` | 123-45-67890 형식 | + +### 패턴 해석 형식 +패턴을 해석할 때는 다음 구조로 설명하세요: +``` +패턴: ^(\d{3})-(\d{2})-(\d{5})$ +해석: + ^ → 문자열 시작 + (\d{3}) → 캡처 그룹 1: 숫자 3자리 + - → 하이픈 (리터럴) + (\d{2}) → 캡처 그룹 2: 숫자 2자리 + - → 하이픈 (리터럴) + (\d{5}) → 캡처 그룹 3: 숫자 5자리 + $ → 문자열 끝 +``` + +## 테스트 형식 +테스트 결과는 다음 형식으로 표시하세요: +``` +패턴: \d{3}-\d{2}-\d{5} + +✅ 매칭 성공: + "123-45-67890" → 전체 매칭: "123-45-67890" + "사업자번호: 123-45-67890입니다" → 부분 매칭: "123-45-67890" + +❌ 매칭 실패: + "12-345-67890" → 형식 불일치 + "abc-de-fghij" → 숫자가 아닌 문자 +``` + +## 플래그 안내 +| 플래그 | 설명 | +|--------|------| +| `i` | 대소문자 무시 | +| `m` | 멀티라인 (^$가 각 줄에 적용) | +| `s` | 점(.)이 줄바꿈도 매칭 | +| `g` | 전역 검색 (모든 매칭) | + +## 규칙 +- 패턴 생성 시 positive/negative 테스트 케이스를 반드시 포함 +- 복잡한 패턴은 주석이 포함된 확장 모드(`x`)로 설명 +- 캡처 그룹이 있으면 각 그룹의 의미를 설명 +- 성능에 민감한 경우 탐욕적/게으른 수량자 선택 이유를 설명 +- 최종 패턴은 clipboard_tool로 클립보드에 복사 + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/release-note.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/release-note.skill.md new file mode 100644 index 0000000..2dc122a --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/release-note.skill.md @@ -0,0 +1,96 @@ +--- +name: release-note +label: 릴리즈 노트 생성 +description: 비개발자 대상의 사용자 친화적인 릴리즈 노트를 자동 생성합니다. +icon: \uE70B +tabs: code +allowed-tools: + - file_read + - file_write + - clipboard_tool + - html_create +--- + +사용자(비개발자) 대상의 읽기 쉬운 릴리즈 노트를 작성하세요. + +## 작업 절차 + +1. **변경 정보 수집**: 사용자에게 다음 정보를 확인 + - 버전 번호 (예: v1.6.0) + - 릴리즈 날짜 + - 주요 변경 내용 (기능 추가, 개선, 버그 수정) + - 참고 자료: CHANGELOG, 커밋 이력, 개발 문서 등 +2. **내용 분류**: 수집된 변경 사항을 사용자 관점으로 분류 + - 기술 용어 → 사용자 언어로 변환 + - 내부 리팩토링 등 사용자에게 무관한 항목은 제외 +3. **릴리즈 노트 초안 작성**: 아래 템플릿 기반으로 작성 +4. **사용자 검토**: 초안을 보여주고 수정 요청 반영 +5. **최종 출력**: Markdown, HTML, 또는 텍스트 형식으로 저장 + +## 릴리즈 노트 템플릿 + +```markdown +# [제품명] v[버전] 업데이트 안내 + +안녕하세요. [제품명] v[버전] 업데이트 소식을 안내드립니다. + +## 🎉 새로운 기능 + +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] + +## ✨ 개선 사항 + +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] + +## 🐛 문제 해결 + +- [사용자가 겪었던 문제]를 해결했습니다. +- [사용자가 겪었던 문제]를 해결했습니다. + +## ⚠️ 알려진 이슈 + +- [현재 알려진 제한 사항이나 이슈] +- [해결 예정 시기 또는 임시 해결 방법] + +--- + +문의 사항이 있으시면 [연락처/채널]로 알려주세요. +감사합니다. +``` + +## 작성 원칙 + +### 사용자 언어로 변환 +| 개발 용어 (사용 금지) | 사용자 표현 (사용) | +|---------------------|-------------------| +| API 엔드포인트 추가 | 새로운 연동 기능 추가 | +| 메모리 누수 수정 | 장시간 사용 시 느려지는 문제 해결 | +| UI 리팩토링 | 화면 디자인 개선 | +| 캐시 최적화 | 실행 속도 개선 | +| null 참조 오류 수정 | 예기치 않은 오류로 종료되는 문제 해결 | +| 인코딩 이슈 수정 | 한글이 깨져 보이는 문제 해결 | +| 동시성 버그 수정 | 여러 작업 동시 실행 시 오류 발생 문제 해결 | + +### 작성 규칙 +- **혜택 중심**: "무엇을 했다"가 아닌 "사용자에게 어떤 도움이 되는지" 설명 +- **간결**: 한 항목당 1~2문장 이내 +- **구체적**: "성능 개선" → "파일 열기 속도가 약 2배 빨라졌습니다" +- **긍정적 톤**: 문제를 "해결했습니다", 기능을 "추가했습니다" +- **이모지 활용**: 섹션별 시각적 구분 (새 기능: 🎉, 개선: ✨, 수정: 🐛, 주의: ⚠️) + +## 출력 형식 +- **Markdown**: 기본 출력 형식 (.md) +- **HTML**: html_create로 스타일이 적용된 웹 페이지 생성 +- **텍스트**: 이메일 본문용 서식 없는 텍스트 +- 사용자가 원하는 형식으로 제공 + +## 규칙 +- 내부 기술 구현 세부사항은 노출하지 않음 +- 사용자에게 무관한 변경(코드 리팩토링, 테스트 추가 등)은 제외 +- Breaking Change가 있으면 "이전 버전과 달라진 점" 섹션 추가 +- 업데이트 방법 안내를 포함 (인스톨러 경로, 주의사항) +- 최종 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/report-writer.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/report-writer.skill.md new file mode 100644 index 0000000..f5e9181 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/report-writer.skill.md @@ -0,0 +1,33 @@ +--- +name: report-writer +label: 보고서 작성 +description: 작업 폴더의 데이터를 분석하여 체계적인 업무 보고서를 생성합��다. +icon: \uE9F9 +tabs: cowork +--- + +작업 폴더의 파일과 데이터를 분석하여 업무 보고서를 작성하세요. + +다음 도구를 사용하세요: +1. folder_map — 작업 폴더의 파일 구조 파악 +2. file_read — 관련 데이터 파일 읽기 (CSV, Excel, 텍스트) +3. file_write — 보고서 파일 생성 (HTML 또는 Markdown) + +보고서 구성: +## 제목 +- 작성 일시, 작성자 (요청 시) + +## 요약 (Executive Summary) +- 핵심 내용을 3줄 이내로 요약 + +## 본문 +- 데이터 기반 분석 결과 +- 표/차트를 활용한 시각적 정리 +- 주요 발견 사항 + +## 결론 및 제안 +- 결론 요약 +- 향후 조치 사항 + +HTML 보고서 생성 시 현재 적용된 디자인 무드를 반영하세요. +한국어로 작성하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/security-audit.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/security-audit.skill.md new file mode 100644 index 0000000..d32ed32 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/security-audit.skill.md @@ -0,0 +1,93 @@ +--- +name: security-audit +label: 보안 코드 감사 +description: 코드베이스의 보안 취약점을 점검하고 OWASP 기반 보안 보고서를 생성합니다. +icon: \uE72E +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - html_create + - glob +tabs: code +--- + +코드베이스의 보안 취약점을 체계적으로 점검하고 보고서를 생성하세요. + +## 워크플로우 + +1. **스캔 범위 확인**: folder_map으로 프로젝트 구조 파악, 언어/프레임워크 식별 +2. **취약점 패턴 탐지**: grep으로 위험 패턴 검색 +3. **의존성 분석**: 패키지 파일(package.json, *.csproj, requirements.txt) 읽기 +4. **비밀 정보 노출 검사**: API 키, 토큰, 비밀번호 하드코딩 탐지 +5. **보고서 생성**: html_create로 보안 감사 보고서 생성 + +## OWASP Top 10 점검 항목 + +### A01 — 접근 제어 취약 +- 인증 없는 API 엔드포인트 +- 하드코딩된 권한 체크 +- 관리자 경로 노출 + +### A02 — 암호화 실패 +- 평문 비밀번호 저장 +- 약한 해시 알고리즘 (MD5, SHA1) +- HTTP (비HTTPS) 통신 + +### A03 — 인젝션 +- SQL 인젝션 (문자열 결합 쿼리) +- XSS (innerHTML, dangerouslySetInnerHTML) +- 명령 인젝션 (Process.Start, exec, system) +- 경로 순회 (../ 미검증) + +### A04 — 불안전한 설계 +- 비즈니스 로직 검증 누락 +- 레이트 리밋 미적용 + +### A05 — 보안 설정 오류 +- 디버그 모드 활성화 상태 +- 기본 자격증명 사용 +- 불필요한 포트/서비스 노출 + +### A07 — 인증 실패 +- 약한 비밀번호 정책 +- 세션 만료 미설정 +- 브루트포스 방어 부재 + +### A09 — 로깅/모니터링 부족 +- 보안 이벤트 미기록 +- 민감 정보 로그 출력 + +## 비밀 정보 탐지 패턴 + +``` +grep 대상 패턴: +- password\s*=\s*["'][^"']+["'] +- api[_-]?key\s*=\s*["'][^"']+["'] +- secret\s*=\s*["'][^"']+["'] +- token\s*=\s*["'][A-Za-z0-9+/=]{20,}["'] +- -----BEGIN (RSA |EC )?PRIVATE KEY----- +- AWS_ACCESS_KEY_ID +- AKIA[0-9A-Z]{16} +``` + +## 출력 형식 + +### 보안 감사 보고서 +| 위험도 | 카테고리 | 파일 | 라인 | 내용 | 권장 조치 | +|--------|---------|------|------|------|----------| +| 🔴 심각 | A03 인젝션 | ... | ... | SQL 문자열 결합 | 파라미터 바인딩 사용 | +| 🟡 경고 | A02 암호화 | ... | ... | MD5 해시 사용 | SHA-256 이상 전환 | +| 🟢 참고 | A09 로깅 | ... | ... | 에러 로깅 미흡 | 보안 이벤트 로깅 추가 | + +### 요약 통계 +- 심각/경고/참고 건수 +- OWASP 카테고리별 분포 +- 우선 조치 항목 Top 5 + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 발견된 비밀 정보는 마스킹하여 보고 (앞 4자만 표시) +- 위험도는 보수적으로 평가 +- 한국어로 보고서 작성 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/sql-report.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/sql-report.skill.md new file mode 100644 index 0000000..76efeca --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/sql-report.skill.md @@ -0,0 +1,52 @@ +--- +name: sql-report +label: SQL 리포트 +description: DB 쿼리를 실행하고 결과를 차트화하여 HTML/Excel 보고서로 생성합니다. +icon: \uE968 +allowed-tools: + - sql_tool + - chart_create + - excel_create + - html_create + - data_pivot +tabs: cowork +--- + +데이터베이스에서 쿼리를 실행하고 결과를 시각화된 보고서로 생성하세요. + +## 워크플로우 + +1. **DB 확인**: sql_tool로 테이블 목록 및 스키마 확인 +2. **쿼리 작성**: 사용자 요청에 맞는 SQL 쿼리 작성 +3. **데이터 조회**: sql_tool로 쿼리 실행 +4. **데이터 가공**: data_pivot으로 집계/피벗 (필요 시) +5. **시각화**: chart_create로 차트 생성 +6. **보고서**: html_create 또는 excel_create로 최종 보고서 생성 + +## 쿼리 작성 원칙 +- SELECT 쿼리만 실행 (데이터 변경 금지) +- 결과 행 수 제한: LIMIT 1000 (대량 데이터 방지) +- 인덱스 활용 쿼리 작성 +- 한글 컬럼명은 alias로 변환 + +## 보고서 구성 + +### 1. 데이터 요약 +- 조회 조건, 기간, 데이터 건수 +- 기본 통계 (합계, 평균, 최대/최소) + +### 2. 시각화 +- 적절한 차트 유형 자동 선택 +- 비교 → 바 차트 +- 추세 → 라인 차트 +- 비율 → 파이/도넛 차트 + +### 3. 상세 데이터 +- Excel: 원본 데이터 + 서식 + 수식 +- HTML: 테이블 + 정렬/필터 + +## 규칙 +- DB 경로는 사용자에게 확인 +- 민감 데이터(개인정보) 마스킹 권고 +- 쿼리 실행 전 사용자 승인 +- 한국어로 보고서 작성 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/translate.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/translate.skill.md new file mode 100644 index 0000000..bc793de --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/translate.skill.md @@ -0,0 +1,60 @@ +--- +name: translate +label: 번역 + 교정 +description: 문서나 텍스트를 번역하고 전문 용어를 보존하며 교정합니다. +icon: \uE8C1 +allowed-tools: + - file_read + - file_write + - document_read + - clipboard_tool +tabs: all +--- + +사용자가 제공한 텍스트 또는 문서를 번역하고 교정하세요. + +## 워크플로우 + +1. **입력 확인**: 텍스트 직접 입력 또는 파일 경로 확인 +2. **언어 감지**: 원문 언어를 자동 감지 +3. **번역 실행**: + - 원문의 뉘앙스와 문맥을 살려 번역 + - 전문 용어는 원어를 괄호 안에 병기: "수율(Yield)" + - 문화적 차이를 고려한 자연스러운 표현 사용 +4. **교정**: 번역 결과의 문법, 맞춤법, 어색한 표현 수정 +5. **결과 제공**: 번역문 + 주요 용어 대조표 + +## 번역 원칙 + +### 정확성 +- 원문의 의미를 정확하게 전달 +- 숫자, 날짜, 고유명사는 원문 그대로 유지 +- 약어는 처음 등장 시 풀어 번역 + +### 가독성 +- 목표 언어의 자연스러운 문체 사용 +- 긴 문장은 적절히 분리 +- 수동태 → 능동태 변환 (한국어의 경우) + +### 전문성 +- 분야별 전문 용어 일관 사용 +- 동일 용어는 문서 전체에서 통일 +- 번역 불가능한 용어는 원어 유지 + +## 출력 형식 + +``` +## 번역 결과 + +[번역된 텍스트] + +--- + +## 용어 대조표 +| 원문 | 번역 | 비고 | +|------|------|------| +| Yield | 수율 | 반도체 공정 용어 | +``` + +## 지원 언어 +한국어 ↔ 영어 / 일본어 / 중국어 (간/번체) / 독일어 / 프랑스어 / 스페인어 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/weekly-report.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/weekly-report.skill.md new file mode 100644 index 0000000..342449e --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/weekly-report.skill.md @@ -0,0 +1,65 @@ +--- +name: weekly-report +label: 주간 보고서 +description: 작업 폴더의 변경 이력을 기반으로 자동 주간보고 초안을 생성합니다. +icon: \uE787 +allowed-tools: + - git_tool + - folder_map + - file_read + - file_watch + - html_create + - docx_create + - text_summarize +tabs: cowork +--- + +작업 폴더의 최근 활동을 분석하여 주간 보고서 초안을 자동 생성하세요. + +## 워크플로우 + +1. **활동 수집**: + - git_tool로 최근 7일간 커밋 이력 조회 + - file_watch로 최근 변경/생성된 파일 목록 확인 + - folder_map으로 프로젝트 구조 파악 + +2. **내용 분석**: + - 커밋 메시지 분류 (기능 추가, 버그 수정, 리팩토링 등) + - 변경 파일 유형별 분류 + - 주요 변경사항 요약 + +3. **보고서 작성**: + - HTML 또는 Word 형식으로 보고서 생성 + - 차트/표로 활동 통계 시각화 + +## 보고서 구성 + +### 1. 주간 요약 +- 보고 기간: yyyy-MM-dd ~ yyyy-MM-dd +- 주요 성과 (3줄 이내) + +### 2. 완료 항목 +| 번호 | 구분 | 내용 | 비고 | +|------|------|------|------| +| 1 | 기능 | ... | 커밋 참조 | + +### 3. 진행 중 항목 +- 현재 작업 중인 사항 +- 진척률 (가능하면) + +### 4. 이슈 및 리스크 +- 지연 사항 +- 블로킹 이슈 + +### 5. 다음 주 계획 +- 예정 작업 항목 + +### 6. 활동 통계 (차트) +- 일별 커밋 수 +- 파일 유형별 변경 비율 + +## 규칙 +- 사실 기반으로 작성 (추측 금지) +- Git 이력이 없으면 파일 변경 이력만으로 작성 +- 한국어로 작성 +- 보고서 톤: 간결하고 전문적 diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/xlsx-analyzer.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/xlsx-analyzer.skill.md new file mode 100644 index 0000000..267a312 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/xlsx-analyzer.skill.md @@ -0,0 +1,97 @@ +--- +name: xlsx-analyzer +label: Excel 데이터 분석 +description: Python을 사용하여 Excel/CSV 데이터를 분석하고 보고서를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +작업 폴더의 Excel 또는 CSV 데이터를 Python으로 분석하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pandas openpyxl +``` + +## 양식 활용 (Excel 보고서 템플릿) +작업 폴더에 Excel 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더에서 `.xlsx` 파일 목록 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본", "보고서양식" 포함 + - 또는 사용자가 "XX 양식에 맞춰서 작성해줘" 요청 + - 또는 사용자가 특정 .xlsx 파일명을 양식으로 지정 +3. **양식 구조 파악**: `document_read`로 양식의 시트 구조, 셀 레이아웃 확인 +4. **양식 기반 데이터 삽입**: + ```python + from openpyxl import load_workbook + wb = load_workbook('양식_보고서.xlsx') + ws = wb.active + # 양식의 서식(셀 병합, 테두리, 글꼴, 색상, 열 너비)이 그대로 유지됨 + # 데이터 영역에만 새 값 삽입 + ws['B3'] = '분석 결과값' + wb.save('결과_보고서.xlsx') + ``` +5. **양식이 없으면**: 아래 기본 방식으로 분석 결과 생성 + +## 작업 절차 +1. **데이터 파일 탐색**: folder_map으로 작업 폴더에서 .xlsx, .csv 파일 확인 +2. **양식 확인**: 양식 .xlsx 파일이 있는지 확인 (데이터 파일과 양식 파일 구분) +3. **데이터 읽기**: file_read 또는 document_read로 파일 구조 파악 +4. **분석 스크립트 작성**: file_write로 Python 분석 스크립트 생성 +5. **실행**: process_run으로 스크립트 실행 +6. **결과 보고**: 분석 결과를 사용자에게 정리하여 전달 + +## 분석 스크립트 템플릿 +```python +import pandas as pd +import json +import os + +df = pd.read_excel('data.xlsx') # 또는 pd.read_csv('data.csv') + +report = { + 'shape': list(df.shape), + 'columns': list(df.columns), + 'dtypes': {col: str(dtype) for col, dtype in df.dtypes.items()}, + 'missing': df.isnull().sum().to_dict(), + 'describe': df.describe().to_dict(), +} + +# 양식 파일로 결과 내보내기 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.xlsx') and f != 'data.xlsx' and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +if template_file: + from openpyxl import load_workbook + wb = load_workbook(template_file) + ws = wb.active + # 양식 서식 유지하면서 데이터 삽입 + print(f'양식 활용: {template_file}') + # TODO: 양식 구조에 맞게 데이터 삽입 로직 작성 + wb.save('결과_보고서.xlsx') +else: + # 양식 없으면 JSON으로 저장 + with open('analysis_result.json', 'w', encoding='utf-8') as f: + json.dump(report, f, ensure_ascii=False, indent=2, default=str) + +print(json.dumps(report, ensure_ascii=False, indent=2, default=str)) +``` + +## 지원 분석 +- 기본 통계 (평균, 중앙값, 표준편차, 분위수) +- 결측치 분석 +- 컬럼별 고유값 분포 +- 피벗 테이블 / 그룹별 집계 +- 시트 간 비교 분석 +- 필터링 및 조건부 추출 +- 분석 결과를 새 Excel로 내보내기 +- **양식 파일 기반 보고서 생성** (셀 서식, 병합, 테두리, 차트 영역 유지) + +한국어로 안내하세요. 원본 파일은 수정하지 마세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/yield-analysis.skill.md b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/yield-analysis.skill.md new file mode 100644 index 0000000..408ba31 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/skills/yield-analysis.skill.md @@ -0,0 +1,40 @@ +--- +name: yield-analysis +label: 수율 분석 +description: 제조/연구 데이터의 수율을 분석하고 개선 포인트를 도출합니다. +icon: \uE9D2 +tabs: cowork +--- + +작업 폴더의 데이터를 활���하여 수율 분석을 수행하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — 분석 보고서 생성 + +분석 프로세스: +## 데이터 개요 +- 분석 대상 데이터셋 설명 +- 데이터 기간, 샘플 수, 주요 변수 + +## 수율 현황 +- 전체 수율 통계 (평균, 중앙값, 표준편차) +- 기간별/로트별/공정별 수율 추이 +- 목표 수율 대비 달성률 + +## 불량 분석 +- 불량 유형별 분류 및 비율 +- 파레토 분석 (상위 불량 원인) +- 시간대/조건별 불량 패턴 + +## 상관관계 분석 +- 주요 공정 변수와 수율의 관계 +- 이상치 탐지 및 원인 추정 + +## 개선 제안 +- 수율 향상을 위한 구체적 조치 사항 +- 우선순위별 개선 로드맵 +- 예상 개선 효과 + +표와 수치를 적극 활용하세요. 한국어로 작성하세요. diff --git a/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/system_prompt.txt b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/system_prompt.txt new file mode 100644 index 0000000..5a999d3 --- /dev/null +++ b/src/AxCopilot/bin/Debug/net8.0-windows/win-x64/system_prompt.txt @@ -0,0 +1 @@ +[역할] 당신은 회사 업무의 도움을 주는 매우 유능한 비서입니다. 말투는 정중하게 하며, 욕을 해서는 안됩니다. \ No newline at end of file diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/duckduckgo.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/duckduckgo.png new file mode 100644 index 0000000..64ee943 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/duckduckgo.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/github.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/github.png new file mode 100644 index 0000000..52126e0 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/github.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/google.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/google.png new file mode 100644 index 0000000..8642fc1 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/google.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/namuwiki.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/namuwiki.png new file mode 100644 index 0000000..5423adf Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/namuwiki.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/naver.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/naver.png new file mode 100644 index 0000000..020e16d Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/naver.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/navermap.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/navermap.png new file mode 100644 index 0000000..9e0bfaf Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/navermap.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/wikipedia.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/wikipedia.png new file mode 100644 index 0000000..4405b8d Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/wikipedia.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/youtube.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/youtube.png new file mode 100644 index 0000000..c20e1d3 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/SearchEngines/youtube.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/guide_dev.enc b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/guide_dev.enc new file mode 100644 index 0000000..e798fe5 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/guide_dev.enc differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/guide_user.enc b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/guide_user.enc new file mode 100644 index 0000000..d1264f8 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/guide_user.enc differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/icon.ico b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/icon.ico new file mode 100644 index 0000000..273db74 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Assets/icon.ico differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.SDK.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.SDK.dll new file mode 100644 index 0000000..c1fcb64 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.SDK.pdb b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.SDK.pdb new file mode 100644 index 0000000..4b2dc07 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.SDK.pdb differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.deps.json b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.deps.json new file mode 100644 index 0000000..aa4b430 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.deps.json @@ -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": "" + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.dll new file mode 100644 index 0000000..ad22375 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.exe b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.exe new file mode 100644 index 0000000..6262bd4 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.exe differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.runtimeconfig.json b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.runtimeconfig.json new file mode 100644 index 0000000..b65a073 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/AxCopilot.runtimeconfig.json @@ -0,0 +1,19 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "8.0.0" + } + ], + "configProperties": { + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/DocumentFormat.OpenXml.Framework.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/DocumentFormat.OpenXml.Framework.dll new file mode 100644 index 0000000..f9f3da9 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/DocumentFormat.OpenXml.Framework.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/DocumentFormat.OpenXml.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/DocumentFormat.OpenXml.dll new file mode 100644 index 0000000..fc7bada Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/DocumentFormat.OpenXml.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Markdig.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Markdig.dll new file mode 100644 index 0000000..4931e93 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Markdig.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Data.Sqlite.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Data.Sqlite.dll new file mode 100644 index 0000000..c5fef6d Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Data.Sqlite.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.dll new file mode 100644 index 0000000..4a27877 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.xml b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.xml new file mode 100644 index 0000000..d9d574c --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Core.xml @@ -0,0 +1,8879 @@ + + + + Microsoft.Web.WebView2.Core + + + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + + + Creates a CoreWebView2 object that wraps an existing COM ICoreWebView2 object. + This allows interacting with the CoreWebView2 using .NET, even if it was originally created using COM. + + Pointer to a COM object that implements the ICoreWebView2 COM interface. + Returns a .NET CoreWebView2 object that wraps the COM object. + Thrown when the provided COM pointer is null. + Thrown when the value is not an ICoreWebView2 COM object and cannot be wrapped. + + + + Returns the existing COM ICoreWebView2 object underlying this .NET CoreWebView2 object. + This allows interacting with the WebView2 control using COM APIs, + even if the control was originally created using .NET. + + Pointer to a COM object that implements the ICoreWebView2 COM interface. + + + + Print the current page to PDF asynchronously with the provided settings. + + + See for description of settings. Passing null for printSettings results in default print settings used. + + Use resultFilePath to specify the path to the PDF file. The host should provide an absolute path, including file name. If the path points to an existing file, the file will be overwritten. If the path is not valid, the method fails. + + The async PrintToPdf operation completes when the data has been written to the PDF file. If the application exits before printing is complete, the file is not saved. Only one `Printing` operation can be in progress at a time. + If PrintToPdf is called while a `PrintToPdf` or `PrintToPdfStream` or `Print` operation is in progress, the operation completes and returns false. + + + + + Adds a URI and resource context filter for corresponding request sources for the event. + + A URI to be added to the event. + A resource context filter to be added to the event. + A request source filter to be added to the event. + + + + Removes a matching WebResource filter that was previously added for the event. + + An URI to be added to the event. + A resource context filter to be added to the event. + A request source filter to be added to the event. + + + + Same as , but also has support for posting DOM + objects to page content. + + The web message to be posted to the top level document in + this WebView. + Additional DOM objects posted to the content. + + The event args is an instance of MessageEvent. The setting must be true or the message + will not be sent. The event arg's data property of the event arg is the + webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. + The event arg's source property of the event arg is a reference to the + window.chrome.webview object. For information about sending messages from the HTML + document in the WebView to the host, navigate to . The message is sent asynchronously. If a + navigation occurs before the message is posted to the page, the message is not be sent. + This additionalObjects is retrieved in web content via the DOM MessageEvent additionalObjects + property as an array-like list of DOM objects. Currently these type of objects can be + posted: + + + .NET / WinRT + DOM type + + + + [FileSystemHandle](https://developer.mozilla.org/docs/Web/API/FileSystemHandle) + + + null + null + + + The objects are posted to web content, following the + [structured-clone](https://developer.mozilla.org/docs/Web/API/Web_Workers_API/Structured_clone_algorithm) + semantics, meaning only objects that can be cloned can be posted. They will also behave as + if they had been created by the web content they are posted to. For example, if a + FileSystemFileHandle is posted to a web content it can only be re-transferred via + postMessage to other web content [with the same + origin](https://fs.spec.whatwg.org/#filesystemhandle). + Warning: An app needs to be mindful when using this API to post DOM objects as this API + provides the web content with unusual access to sensitive Web Platform features such as + filesystem access! Similar to PostWebMessageAsJson, the app should check the property right before posting the message to ensure the message + and objects will only be sent to the target web content that it expects to receive the DOM + objects. Additionally, the order of messages that are posted between PostWebMessageAsJson + and PostWebMessageAsJsonWithAdditionalObjects may not be preserved. + + + + + + + Opens the browser print preview dialog to print the current web page + + + + + Gets the object contains various modifiable settings for the running WebView. + + + + + Gets the URI of the current top level document. + + + This value potentially changes as a part of the event raised for some cases such as navigating to a different site or fragment navigations. It remains the same for other types of navigations such as page refreshes or history.pushState with the same URL as the current page. + + + + + + Gets the process ID of the browser process that hosts the WebView. + + + + + true if the WebView is able to navigate to a previous page in the navigation history. + + + If CanGoBack changes value, the event is raised. + + + + + + true if the WebView is able to navigate to a next page in the navigation history. + + + If CanGoForward changes value, the event is raised. + + + + + + Gets the title for the current top-level document. + + + If the document has no explicit title or is otherwise empty, a default that may or may not match the URI of the document is used. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DocumentTitle"::: + + + + + Indicates if the WebView contains a fullscreen HTML element. + + + + + NavigationStarting is raised when the WebView main frame is requesting permission to navigate to a different URI. + + + Redirects raise this event as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigationStarting"::: + + + + + ContentLoading is raised before any content is loaded, including scripts added with . ContentLoading is not raised if a same page navigation occurs (such as through fragment navigations or history.pushState navigations). + + + This operation follows the and events and precedes the and events. + + + + + + + + + SourceChanged is raised when the property changes. + + + SourceChanged is raised when navigating to a different site or fragment navigations. It is not raised for other types of navigations such as page refreshes or history.pushState with the same URL as the current page. This event is raised before for navigation to a new document. + + + + + + + HistoryChanged is raised for changes to joint session history, which consists of top-level and manual frame navigations. + + + Use HistoryChanged to verify that the or value has changed. HistoryChanged is also raised for using or . HistoryChanged is raised after and . CanGoBack is false for navigations initiated through CoreWebView2Frame APIs if there has not yet been a user gesture. + + + + + + + + + NavigationCompleted is raised when the WebView has completely loaded (body.onload has been raised) or loading stopped with error. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigationCompleted"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DOMContentLoaded"::: + + + + + FrameNavigationStarting is raised when a child frame in the WebView requests permission to navigate to a different URI. + + + Redirects raise this operation as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + + + FrameNavigationCompleted is raised when a child frame has completely loaded (body.onload has been raised) or loading stopped with error. + + + + + ScriptDialogOpening is raised when a JavaScript dialog (alert, confirm, prompt, or beforeunload) displays for the WebView. + + + This event only is raised if the property is set to false. This event suppresses dialogs or replaces default dialogs with custom dialogs. + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + + PermissionRequested is raised when content in a WebView requests permission to access some privileged resources. + + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + ProcessFailed is raised when a WebView process ends unexpectedly or becomes unresponsive. + + + ProcessFailed is raised when any of the processes in the WebView2 Process Group encounters one of the following conditions: + + + + Condition + Details + + + Unexpected exit + + The process indicated by the event args has exited unexpectedly (usually due to a crash). The failure might or might not be recoverable, and some failures are auto-recoverable. + + + + Unresponsiveness + + The process indicated by the event args has become unresponsive to user input. This is only reported for renderer processes, and will run every few seconds until the process becomes responsive again. + + + + + Note: When the failing process is the browser process, a event will run too. + + Your application can use to identify which condition and process the event is for, and to collect diagnostics and handle recovery if necessary. For more details about which cases need to be handled by your application, see . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ProcessFailed"::: + + + + + WebMessageReceived is raised when the setting is set and the top-level document of the WebView runs window.chrome.webview.postMessage or window.chrome.webview.postMessageWithAdditionalObjects. + + + The postMessage function is void postMessage(object) where object is any object supported by JSON conversion. + When postMessage is called, the handler's Invoke method will be called with the object parameter postMessage converted to a JSON string. + If the same page calls postMessage multiple times, the corresponding WebMessageReceived events are guaranteed to be fired in the same order. However, if multiple frames call postMessage, there is no guaranteed order. In addition, WebMessageReceived events caused by calls to postMessage are not guaranteed to be sequenced with events caused by DOM APIs. For example, if the page runs + + chrome.webview.postMessage("message"); + window.open(); + + then the event might be fired before the WebMessageReceived event. If you need the WebMessageReceived event to happen before anything else, then in the WebMessageReceived handler you can post a message back to the page and have the page wait until it receives that message before continuing. + + + + + NewWindowRequested is raised when content inside the WebView requests to open a new window, such as through window.open(). + + + The app can pass a target WebView that is considered the opened window or mark the event as , in which case WebView2 does not open a window. + If either Handled or properties are not set, the target content will be opened on a popup window. + If a deferral is not taken on the event args, scripts that resulted in the new window that are requested are blocked until the event handler returns. If a deferral is taken, then scripts are blocked until the deferral is completed. + + On Hololens 2, if the property is not set and the property is not set to true, the WebView2 will navigate to the . + If either of these properties are set, the WebView2 will not navigate to the and the the event will continue as normal. + + + + + DocumentTitleChanged is raised when the property changes and may be raised before or after the event. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DocumentTitleChanged"::: + + + + + + ContainsFullScreenElementChanged is raised when the property changes. + + + An HTML element inside the WebView may enter fullscreen to the size of the WebView or leave fullscreen. This event is useful when, for example, a video element requests to go fullscreen. The listener of this event may resize the WebView in response. + + + + + + WebResourceRequested is raised when the WebView is performing a URL request to a matching URL and resource context filter that was added with . + + + At least one filter must be added for the event to be raised. + The web resource requested may be blocked until the event handler returns if a deferral is not taken on the event args. If a deferral is taken, then the web resource requested is blocked until the deferral is completed. + + If this event is subscribed in the handler it should be called after the new window is set. For more details see . + + This event is by default raised for file, http, and https URI schemes. This is also raised for registered custome URI schemes. See for more details. + + + + + + WindowCloseRequested is raised when content inside the WebView requested to close the window, such as after window.close() is run. + + + The app should close the WebView and related app window if that makes sense to the app. + After the first window.close() call, this event may not fire for any immediate back to back window.close() calls. + + + + + Causes a navigation of the top level document to the specified URI. + + The URI to navigate to. + + For more information, navigate to [Navigation event](/microsoft-edge/webview2/concepts/navigation-events). Note that this operation starts a navigation and the corresponding event is raised sometime after Navigate runs. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Navigate"::: + + + + + + + Initiates a navigation to htmlContent as source HTML of a new document. + + A source HTML of a new document. + + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + string htmlContent = + @" + + + +

      Click me

      + + "; + webview.NavigateToString(htmlContent); +
      +
      + + + +
      + + + Adds the provided JavaScript to a list of scripts that should be run after the global object has been created, but before the HTML document has been parsed and before any other script included by the HTML document is run. + + The JavaScript code to be run. + A script ID that may be passed when calling . + + The injected script will apply to all future top level document and child frame navigations until removed with . + This is applied asynchronously and you must wait for the returned to complete before you can be sure that the script is ready to execute on future navigations. + If the method is run in handler, it should be called before the new window is set. For more details see . + + Note that if an HTML document has sandboxing of some kind via [sandbox](https://developer.mozilla.org/docs/Web/HTML/Element/iframe#attr-sandbox) properties or the [Content-Security-Policy HTTP header](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy) this will affect the script run here. So, for example, if the allow-modals keyword is not set then calls to the alert function will be ignored. + + + + + + Removes the corresponding JavaScript added via with the specified script ID. + + The ID corresponds to the JavaScript code to be removed from the list of scripts. + Both use and this method in handler at the same time sometimes causes trouble. Since invalid scripts will be ignored, the script IDs you got may not be valid anymore. + + + + Runs JavaScript code from the javaScript parameter in the current top-level document rendered in the WebView. + + The JavaScript code to be run in the current top-level document rendered in the WebView. + A JSON encoded string that represents the result of running the provided JavaScript. + + If the result is undefined, contains a reference cycle, or otherwise is not able to be encoded into JSON, the JSON null value is returned as the "null" string. + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. This method is applied asynchronously. If the method is run after the event during a navigation, the script runs in the new document when loading it, around the time is run. This operation works even if is set to false. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScript"::: + + + + + + Captures an image of what WebView is displaying. + + The format of the image to be captured. + The stream to which the resulting image binary data is written. + + When CapturePreviewAsync finishes writing to the stream, the Invoke method on the provided handler parameter is called. This method fails if called before the first event. For example if this is called in the event for the first navigation it will fail. For subsequent navigations, the method may not fail, but will not capture an image of a given webpage until the event has been fired for it. Any call to this method prior to that will result in a capture of the page being navigated away from. + + + + + + Reloads the current page. + + + This is similar to navigating to the URI of current top level document including all navigation events firing and respecting any entries in the HTTP cache. But, the back or forward history will not be modified. + + + + + Posts the specified webMessageAsJson to the top level document in this WebView. + + The web message to be posted to the top level document in this WebView. + + The event args is an instance of MessageEvent. The setting must be true or the message will not be sent. The event arg's data property of the event arg is the webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. The event arg's source property of the event arg is a reference to the window.chrome.webview object. For information about sending messages from the HTML document in the WebView to the host, navigate to . The message is sent asynchronously. If a navigation occurs before the message is posted to the page, the message is not be sent. + + + Runs the message event of the window.chrome.webview of the top-level document. JavaScript in that document may subscribe and unsubscribe to the event using the following code: + + window.chrome.webview.addEventListener('message', handler) + window.chrome.webview.removeEventListener('message', handler) + + + + + + + + + Posts a message that is a simple string rather than a JSON string representation of a JavaScript object. + + The web message to be posted to the top level document in this WebView. + + This behaves in exactly the same manner as , but the data property of the event arg of the window.chrome.webview message is a string with the same value as webMessageAsString. Use this instead of if you want to communicate using simple strings rather than JSON objects. + + + + + + + Runs an asynchronous DevToolsProtocol method. + + The full name of the method in the format {domain}.{method}. + A JSON formatted string containing the parameters for the corresponding method. + A JSON string that represents the method's return object. + + For more information about available methods, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). The returned task is completed when the method asynchronously completes and will return the method's return object as a JSON string. Note even though WebView2 dispatches the CDP messages in the order called, CDP method calls may be processed out of order. If you require CDP methods to run in a particular order, you should await for the previous method call. + + If the method is to run in handler it should be called + before the new window is set if the cdp messages should affect the initial navigation. If + called after setting the NewWindow property, the cdp messages + may or may not apply to the initial navigation and may only apply to the subsequent navigation. + For more details . + + + + + Navigates the WebView to the previous page in the navigation history. + + + + + Navigates the WebView to the next page in the navigation history. + + + + + Gets a DevTools Protocol event receiver that allows you to subscribe to a DevToolsProtocol event. + + The full name of the event in the format {domain}.{event}. + A Devtools Protocol event receiver. + + For more information about DevToolsProtocol events description and event args, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). + + + + + Stops all navigations and pending resource fetches. + + + Does not stop scripts. + + + + + Adds the provided host object to script running in the WebView with the specified name. + + The name of the host object. + The host object to be added to script. + + Host objects are exposed as host object proxies via window.chrome.webview.hostObjects.{name}. Host object proxies are promises and will resolve to an object representing the host object. Only the COM visible objects/properties/methods can be accessed from script. + The app can control which part of .NET objects are exposed using . + + JavaScript code in the WebView will be able to access appObject as following and then access attributes and methods of appObject. + + Note that while simple types, IDispatch and array are supported, and IUnknown objects that also implement IDispatch are treated as IDispatch, generic IUnknown, VT_DECIMAL, or VT_RECORD variant is not supported. Remote JavaScript objects like callback functions are represented as an VT_DISPATCH VARIANT with the object implementing IDispatch. The JavaScript callback method may be invoked using DISPID_VALUE for the DISPID. Such callback method invocations will return immediately and will not wait for the JavaScript function to run and so will not provide the return value of the JavaScript function. Nested arrays are supported up to a depth of 3. Arrays of by reference types are not supported. VT_EMPTY and VT_NULL are mapped into JavaScript as null. In JavaScript null and undefined are mapped to VT_EMPTY. + + Additionally, all host objects are exposed as window.chrome.webview.hostObjects.sync.{name}. Here the host objects are exposed as synchronous host object proxies. These are not promises and calls to functions or property access synchronously block running script waiting to communicate cross process for the host code to run. Accordingly this can result in reliability issues and it is recommended that you use the promise based asynchronous window.chrome.webview.hostObjects.{name} API described above. + + Synchronous host object proxies and asynchronous host object proxies can both proxy the same host object. Remote changes made by one proxy will be reflected in any other proxy of that same host object whether the other proxies and synchronous or asynchronous. + + While JavaScript is blocked on a synchronous call to native code, that native code is unable to call back to JavaScript. Attempts to do so will fail with HRESULT_FROM_WIN32(ERROR_POSSIBLE_DEADLOCK). + + Host object proxies are JavaScript Proxy objects that intercept all property get, property set, and method invocations. Properties or methods that are a part of the Function or Object prototype are run locally. Additionally any property or method in the array chrome.webview.hostObjects.options.forceLocalProperties will also be run locally. This defaults to including optional methods that have meaning in JavaScript like toJSON and Symbol.toPrimitive. You can add more to this array as required. + + There's a method chrome.webview.hostObjects.cleanupSome that will best effort garbage collect host object proxies. + + The chrome.webview.hostObjects.options object provides the ability to change some functionality of host objects. + + + + Options property + Details + + + forceLocalProperties + + This is an array of host object property names that will be run locally, instead of being called on the native host object. This defaults to then, toJSON, Symbol.toString, and Symbol.toPrimitive. You can add other properties to specify that they should be run locally on the JavaScript host object proxy. + + + + log + + This is a callback that will be called with debug information. For example, you can set this to console.log.bind(console) to have it print debug information to the console to help when troubleshooting host object usage. By default this is null. + + + + shouldSerializeDates + + By default this is false, and JavaScript Date objects will be sent to host objects as a string using JSON.stringify. You can set this property to true to have Date objects properly serialize as a System.DateTime when sending to the .NET host object, and have System.DateTime properties and return values create a JavaScript Date object. + + + + defaultSyncProxy + + When calling a method on a synchronous proxy, the result should also be a synchronous proxy. But in some cases, the sync/async context is lost (for example, when providing to native code a reference to a function, and then calling that function in native code). In these cases, the proxy will be asynchronous, unless this property is set. + + + + forceAsyncMethodMatches + + This is an array of regular expressions. When calling a method on a synchronous proxy, the method call will be performed asynchronously if the method name matches a string or regular expression in this array. Setting this value to Async will make any method that ends with Async be an asynchronous method call. If an async method doesn't match here and isn't forced to be asynchronous, the method will be invoked synchronously, blocking execution of the calling JavaScript and then returning the resolution of the promise, rather than returning a promise. + + + + ignoreMemberNotFoundError + + By default, an exception is thrown when attempting to get the value of a proxy property that doesn't exist on the corresponding native class. Setting this property to true switches the behavior to match Chakra WinRT projection (and general JavaScript) behavior of returning undefined with no error. + + + + shouldPassTypedArraysAsArrays + + By default, typed arrays are passed to the host as IDispatch. To instead pass typed arrays to the host as array, set this to true. + + + + + Host object proxies additionally have the following methods: + + + + Method name + Details + + + applyHostFunction, getHostProperty, setHostProperty + + Perform a method invocation, property get, or property set on the host object. You can use these to explicitly force a method or property to run remotely if there is a conflicting local method or property. For instance, proxy.toString() will run the local toString method on the proxy object. But proxy.applyHostFunction('toString') runs toString on the host proxied object instead. + + + + getLocalProperty, setLocalProperty + + Perform property get, or property set locally. You can use these methods to force getting or setting a property on the host object proxy itself rather than on the host object it represents. For instance, proxy.unknownProperty will get the property named unknownProperty from the host proxied object. But proxy.getLocalProperty('unknownProperty') will get the value of the property unknownProperty on the proxy object itself. + + + + addEventListener + + This method only exists on proxies for .NET objects. Bind the JavaScript handler to the C# event, so that the JavaScript handler can be called through the C# event. For example, chrome.webview.hostObjects.sample.addEventListener('TestEvent', () => { alert('Invoked from remote');}); bind an anonymous JavaScript function to a C# event called 'TestEvent'. When calling TestEvent?.Invoke() on C# side, the JavaScript function that was just bound will be called asynchronously. It allows adding more than one handler for an event, but if the handler is already in the list of event handler, it will not be added a second time. If the host object cannot find the event with the name passed in by the addEventListener function or it is no public or its return type is not void, an exception will be thrown. If the count and type of C# event's parameters do not match the count and type of JavaScript handler, invoke addEventListener will be successful but an exception will be passed to JavaScript when invoke the event on C# side. If the host object has defined addEventListener function, use the defined function rather than the additionally addEventListener function. + + + + removeEventListener + + This method only exists on proxies for .NET objects. Removes a handler previously bound with addEventListener(). If the handler does not exist in the list of event handler, nothing will happen. If the host object cannot find the event with the name passed in by the removeEventListener function or it is no public, an exception will be thrown. If the host object has defined removeEventListener function, use the defined function rather than the additionally removeEventListener function. + + + + sync + + Asynchronous host object proxies expose a sync method which returns a promise for a synchronous host object proxy for the same host object. For example, chrome.webview.hostObjects.sample.methodCall() returns an asynchronous host object proxy. You can use the sync method to obtain a synchronous host object proxy instead: + const syncProxy = await chrome.webview.hostObjects.sample.methodCall().sync() + + + + async + + Synchronous host object proxies expose an async method which blocks and returns an asynchronous host object proxy for the same host object. For example, chrome.webview.hostObjects.sync.sample.methodCall() returns a synchronous host object proxy. Calling the async method on this blocks and then returns an asynchronous host object proxy for the same host object: const asyncProxy = chrome.webview.hostObjects.sync.sample.methodCall().async() + + + + then + + Asynchronous host object proxies have a then method. This allows them to be awaitable. then will return a promise that resolves with a representation of the host object. If the proxy represents a JavaScript literal then a copy of that is returned locally. If the proxy represents a function then a non-awaitable proxy is returned. If the proxy represents a JavaScript object with a mix of literal properties and function properties, then the a copy of the object is returned with some properties as host object proxies. + + + + cancelPromise + + This method attempts to cancel the fulfillment of a promised value. If the promise hasn't already been fulfilled and cancelation is supported, the promise will get rejected. cancelPromise supports cancelation of IAsyncOperation and IAsyncAction methods. If the promise is successfully canceled, then calling await on the promise will throw. For example, chrome.webview.hostObjects.cancelPromise(promise); await promise; will throw with "Promise Canceled". Once a promise has been canceled, a subsequent cancel on the same promise will throw an exception as well. + + + + + All other property and method invocations (other than the above Remote object proxy methods, forceLocalProperties list, and properties on Function and Object prototypes) are run remotely. Asynchronous host object proxies return a promise representing asynchronous completion of remotely invoking the method, or getting the property. The promise resolves after the remote operations complete and the promises resolve to the resulting value of the operation. Synchronous host object proxies work similarly but block JavaScript execution and wait for the remote operation to complete. + + Setting a property on an asynchronous host object proxy works slightly differently. The set returns immediately and the return value is the value that will be set. This is a requirement of the JavaScript Proxy object. If you need to asynchronously wait for the property set to complete, use the setHostProperty method which returns a promise as described above. Synchronous object property set property synchronously blocks until the property is set. + + Exposing host objects to script has security risk. Please follow [best practices](/microsoft-edge/webview2/concepts/security). + + + To create a [IDispatch](/windows/win32/api/oaidl/nn-oaidl-idispatch) implementing class in C# use the following attributes on each class you intend to expose. + + // Bridge and BridgeAnotherClass are C# classes that implement IDispatch and works with AddHostObjectToScript. + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class BridgeAnotherClass + { + // Sample property. + public string Prop { get; set; } = "Example"; + } + + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class Bridge + { + public string Func(string param) + { + return "Example: " + param; + } + + public BridgeAnotherClass AnotherObject { get; set; } = new BridgeAnotherClass(); + + // Sample indexed property. + [System.Runtime.CompilerServices.IndexerName("Items")] + public string this[int index] + { + get { return m_dictionary[index]; } + set { m_dictionary[index] = value; } + } + private Dictionary<int, string> m_dictionary = new Dictionary<int, string>(); + } + + Then add instances of those classes via : + + webView.CoreWebView2.AddHostObjectToScript("bridge", new Bridge()); + + And then in script you can call the methods, and access those properties of the objects added via . + Note that `CoreWebView2.AddHostObjectToScript` only applies to the top-level document and not to frames. To add host objects to frames use `CoreWebView2Frame.AddHostObjectToScript`. + + // Find added objects on the hostObjects property + const bridge = chrome.webview.hostObjects.bridge; + + // Call a method and pass in a parameter. + // The result is another proxy promise so you must await to get the result. + console.log(await bridge.Func("testing...")); + + // A property may be another object as long as its class also implements + // IDispatch. + // Getting a property also gets a proxy promise you must await. + const propValue = await bridge.AnotherObject.Prop; + console.log(propValue); + + // Indexed properties + let index = 123; + bridge[index] = "test"; + let result = await bridge[index]; + console.log(result); + + + + + + + Removes the host object specified by the name so that it is no longer accessible from JavaScript code in the WebView. + + The name of the host object to be removed. + + While new access attempts are denied, if the object is already obtained by JavaScript code in the WebView, the JavaScript code continues to have access to that object. Running this method for a name that is already removed or never added fails. + + + + + Opens the DevTools window for the current document in the WebView. + + + Does nothing if run when the DevTools window is already open. + + + + + + + + Warning: This method and are deprecated. + + Removes a matching WebResource filter that was previously added for the event. + An URI to at which a web resource filter was added. + A previously added resource context filter to be removed. + A filter that was never added. + + If the same filter was added multiple times, then it must need to be removed as many times as it was added for the removal to be effective. + + + + + + Gets the object associated with this . + + + + + + Exposes the used to create this . + + + + + WebResourceResponseReceived is raised when the WebView receives the response for a request for a web resource (any URI resolution performed by the WebView; such as HTTP/HTTPS, file and data requests from redirects, navigations, declarations in HTML, implicit Favicon lookups, and fetch API usage in the document). + + + The host app can use this event to view the actual request and response for a web resource. There is no guarantee about the order in which the WebView processes the response and the host app's handler runs. The app's handler will not block the WebView from processing the response. + The event args include the as sent by the wire and received, including any additional headers added by the network stack that were not be included as part of the associated event, such as Authentication headers. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebResourceResponseReceived"::: + + + + + DOMContentLoaded is raised when the initial HTML document has been parsed. + + + This aligns with the the document's DOMContentLoaded event in HTML. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DOMContentLoaded"::: + + + + + Navigates using a constructed object. + + The constructed web resource object to provide post data or additional request headers during navigation. + + The headers in the override headers added by WebView2 runtime except for Cookie headers. Method can only be either GET or POST. Provided post data will only be sent only if the method is POST and the uri scheme is HTTP(S). + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigateWithWebResourceRequest"::: + + + + + Whether WebView is suspended. + + + True when WebView is suspended, from the time when has completed successfully until WebView is resumed. + + + + + An app may call this API to have the WebView2 consume less memory. + + + This is useful when a Win32 app becomes invisible, or when a Universal Windows Platform app is being suspended, during the suspended event handler before completing the suspended event. + + The property must be false when the API is called. Otherwise, the API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE). + + Suspending is similar to putting a tab to sleep in the Edge browser. Suspending pauses WebView script timers and animations, minimizes CPU usage for the associated browser renderer process and allows the operating system to reuse the memory that was used by the renderer process for other processes. + + Note that Suspend is best effort and considered completed successfully once the request is sent to browser renderer process. If there is a running script, the script will continue to run and the renderer process will be suspended after that script is done. + + See [Sleeping Tabs FAQ](https://techcommunity.microsoft.com/t5/articles/sleeping-tabs-faq/m-p/1705434) for conditions that might prevent WebView from being suspended. In those situations, the result of the async task is false. + + The WebView will be automatically resumed when it becomes visible. Therefore, the app normally does not have to call explicitly. + + The app can call and then periodically for an invisible WebView so that the invisible WebView can sync up with latest data and the page ready to show fresh content when it becomes visible. + + All WebView APIs can still be accessed when a WebView is suspended. Some APIs like Navigate will auto resume the WebView. To avoid unexpected auto resume, check property before calling APIs that might change WebView state. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="TrySuspend"::: + + + + + Resumes the WebView so that it resumes activities on the web page. + + + This API can be called while the WebView2 controller is invisible. + + The app can interact with the WebView immediately after . + + WebView will be automatically resumed when it becomes visible. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Resume"::: + + + + + Sets a mapping between a virtual host name and a folder path to make available to web sites via that host name. + + A virtual host name. + A folder path name to be mapped to the virtual host name. The length must not exceed the Windows MAX_PATH limit. + The level of access to resources under the virtual host from other sites. + + + After setting the mapping, documents loaded in the WebView can use HTTP or HTTPS URLs at the specified host name specified by hostName to access files in the local folder specified by folderPath. + This mapping applies to both top-level document and iframe navigations as well as subresource references from a document. This also applies to dedicated and shared worker scripts but does not apply to service worker scripts. + + Due to a current implementation limitation, media files accessed using virtual host name can be very slow to load. + + As the resource loaders for the current page might have already been created and running, changes to the mapping might not be applied to the current page and a reload of the page is needed to apply the new mapping. + + Both absolute and relative paths are supported for folderPath. Relative paths are interpreted as relative to the folder where the exe of the app is in. + + + For example, after calling SetVirtualHostNameToFolderMapping("appassets.example", "assets", CoreWebView2HostResourceAccessKind.Deny);, navigating to https://appassets.example/my-local-file.html will show content from my-local-file.html in the assets subfolder located on disk under the same path as the app's executable file. + + DOM elements that want to reference local files will have their host reference virtual host in the source. If there are multiple folders being used, define one unique virtual host per folder. + + + You should typically choose virtual host names that are never used by real sites. + If you own a domain such as example.com, another option is to use a subdomain reserved for the app (like my-app.example.com). + + + [RFC 6761](https://tools.ietf.org/html/rfc6761) has reserved several special-use domain names that are guaranteed to not be used by real sites (for example, .example, .test, and .invalid). + + + Note that using .local as the top-level domain name will work but can cause a delay during navigations. You should avoid using .local if you can. + + + Apps should use distinct domain names when mapping folder from different sources that should be isolated from each other. For instance, the app might use app-file.example for files that ship as part of the app, and book1.example might be used for files containing books from a less trusted source that were previously downloaded and saved to the disk by the app. + + + The host name used in the APIs is canonicalized using Chromium's host name parsing logic before being used internally. + For more information see [HTML5 2.6 URLs](https://dev.w3.org/html5/spec-LC/urls.html). + + + All host names that are canonicalized to the same string are considered identical. + For example, EXAMPLE.COM and example.com are treated as the same host name. + An international host name and its Punycode-encoded host name are considered the same host name. There is no DNS resolution for host name and the trailing '.' is not normalized as part of canonicalization. + + + Therefore example.com and example.com. are treated as different host names. Similarly, virtual-host-name and virtual-host-name.example.com are treated as different host names even if the machine has a DNS suffix of example.com. + + + Specify the minimal cross-origin access necessary to run the app. If there is not a need to access local resources from other origins, use . + + + + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + webView.Source = new Uri("https://appassets.example/index.html"); + + + This in an example on how to embed a local image. For more information see . + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + string c_navString = ""; + webview.NavigateToString(c_navString); + + + + + + + Clears a host name mapping for local folder that was added by . + + The host name to be removed from the mapping. + + + + + FrameCreated is raised when a new iframe is created. Handle this event to get access to objects. + + + + Use the to listen for when this iframe goes away. + + + + + DownloadStarting is raised when a download has begun, blocking the default download dialog, but not blocking the progress of the download. + + + The host can choose to cancel a download, change the result file path, and hide the default download dialog. If download is not handled or canceled, the download is saved to the default path after the event completes with default download dialog shown. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DownloadStarting"::: + + + + + ClientCertificateRequested is raised when WebView2 is making a request to an HTTP server that needs a client certificate for HTTP authentication. Read more about HTTP client certificates at [RFC 8446 The Transport Layer Security (TLS) Protocol Version 1.3](https://tools.ietf.org/html/rfc8446). + + + The host have several options for responding to client certificate requests: + + + + Scenario + Handled + Cancel + SelectedCertificate + + + Respond to server with a certificate + True + False + MutuallyTrustedCertificate value + + + Respond to server without certificate + True + False + null + + + Display default client certificate selection dialog prompt + False + False + n/a + + + Cancel the request + n/a + True + n/a + + + + If the host don't handle the event, WebView2 will show the default client certificate selection dialog prompt to the user. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClientCertificateRequested1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClientCertificateRequested2"::: + + + + + Opens the Browser Task Manager view as a new window in the foreground. + + + If the Browser Task Manager is already open, this will bring it into the foreground. WebView2 currently blocks the Shift+Esc shortcut for opening the task manager. An end user can open the browser task manager manually via the Browser task manager entry of the DevTools window's title bar's context menu. + + + + + Indicates whether all audio output from this CoreWebView2 is muted or not. Set to true will mute this CoreWebView2, and set to false will unmute this CoreWebView2. true if audio is muted. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleIsMuted"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="UpdateTitleWithMuteState"::: + + + + + Indicates whether any audio output from this CoreWebView2 is playing. true if audio is playing even if is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="UpdateTitleWithMuteState"::: + + + + + IsMutedChanged is raised when the mute state changes. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="IsMutedChanged"::: + + + + + IsDocumentPlayingAudioChanged is raised when document starts or stops playing audio. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="IsDocumentPlayingAudioChanged"::: + + + + + True if the default download dialog is currently open. + + + The value of this property changes only when the default download dialog is explicitly opened or closed. Hiding the WebView implicitly hides the dialog, but does not change the value of this property. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleDefaultDownloadDialog"::: + + + + + The default download dialog corner alignment. + + + The dialog can be aligned to any of the WebView corners (see ). When the WebView or dialog changes size, the dialog keeps it position relative to the corner. The dialog may become partially or completely outside of the WebView bounds if the WebView is small enough. Set the margin from the corner with the property. The corner alignment and margin should be set during initialization to ensure that they are correctly applied when the layout is first computed, otherwise they will not take effect until the next time the WebView position or size is updated. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SetDefaultDownloadDialogPosition"::: + + + + + The default download dialog margin relative to the WebView corner specified by . + + + The margin is a point that describes the vertical and horizontal distances between the chosen WebView corner and the default download dialog corner nearest to it. Positive values move the dialog towards the center of the WebView from the chosen WebView corner, and negative values move the dialog away from it. Use (0, 0) to align the dialog to the WebView corner with no margin. The corner alignment and margin should be set during initialization to ensure that they are correctly applied when the layout is first computed, otherwise they will not take effect until the next time the WebView position or size is updated. + + + + + Raised when the property changes. + + + This event comes after the event. Setting the property disables the default download dialog and ensures that this event is never raised. + + + + + Open the default download dialog. + + + If the dialog is opened before there are recent downloads, the dialog shows all past downloads for the current profile. Otherwise, the dialog shows only the recent downloads with a "See more" button for past downloads. Calling this method raises the event if the dialog was closed. No effect if the dialog is already open. + + + + + Close the default download dialog. + + + Calling this method raises the event if the dialog was open. No effect if the dialog is already closed. + + + + + BasicAuthenticationRequested event is raised when WebView encounters a Basic HTTP Authentication request as described in https://developer.mozilla.org/docs/Web/HTTP/Authentication, a Digest HTTP Authentication request as described in https://developer.mozilla.org/docs/Web/HTTP/Headers/Authorization#digest, an NTLM authentication or a Proxy Authentication request. + + + The host can provide a response with credentials for the authentication or cancel the request. If the host sets the Cancel property to false but does not provide either UserName or Password properties on the Response property, then WebView2 will show the default authentication challenge dialog prompt to the user. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BasicAuthenticationRequested"::: + + + + + ContextMenuRequested is raised when a context menu is requested by the user and the content inside WebView hasn't disabled context menus. + + + The host has the option to create their own context menu with the information provided in the event or can add items to or remove items from WebView context menu. If the host doesn't handle the event, WebView will display the default context menu. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="CustomContextMenu"::: + + + + + Runs an asynchronous DevToolsProtocol method for a specific session of an attached target. + + The sessionId for an attached target. null or empty string is treated as the session for the default target for the top page. + The full name of the method in the format {domain}.{method}. + A JSON formatted string containing the parameters for the corresponding method. + A JSON string that represents the method's return object. + + There could be multiple DevToolsProtocol targets in a WebView. + Besides the top level page, iframes from different origin and web workers are also separate targets. + Attaching to these targets allows interaction with them. + When the DevToolsProtocol is attached to a target, the connection is identified by a sessionId. + + To use this API, you must set the flatten parameter to true when calling Target.attachToTarget or Target.setAutoAttach DevToolsProtocol method. + Using Target.setAutoAttach is recommended as that would allow you to attach to dedicated worker targets, which are not discoverable via other APIs like Target.getTargets. + For more information about targets and sessions, navigate to [Chrome DevTools Protocol - Target domain]( https://chromedevtools.github.io/devtools-protocol/tot/Target). + + For more information about available methods, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). The handler's Invoke method will be called when the method asynchronously completes. Invoke will be called with the method's return object as a JSON string. + + + + + The current text of the statusbar as defined by [Window.statusbar](https://developer.mozilla.org/docs/Web/API/Window/statusbar). + + + + + StatusBarTextChanged event is raised when the text in the [Window.statusbar](https://developer.mozilla.org/docs/Web/API/Window/statusbar) changes. When the event is fired use the property to get the current statusbar text. + + + Events which cause causes can be anything from hover, url events, and others. There is not a finite list on how to cause the statusbar to change. + The developer must create the status bar and set the text. + + + + + The associated object of . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Profile"::: + + + + + The ServerCertificateErrorDetected event is raised when the WebView2 cannot verify server's digital certificate while loading a web page. + + + This event will raise for all web resources and follows the event. + + If you don't handle the event, WebView2 will show the default TLS interstitial error page to the user for navigations, and for non-navigations the web request is cancelled. + + Note that WebView2 before raising `ServerCertificateErrorDetected` raises a event with as FALSE and any of the below WebErrorStatuses that indicate a certificate failure. + + + + + + + + + + + + + + + + + + + + For more details see and handle ServerCertificateErrorDetected event or show the default TLS interstitial error page to the user according to the app needs. + + WebView2 caches the response when action is for the RequestUri's host and the server certificate in the session and the event won't be raised again. + + To raise the event again you must clear the cache using . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ServerCertificateErrorDetected"::: + + + + + Clears all cached decisions to proceed with TLS certificate errors from the event for all WebView2's sharing the same session. + + + + + Get the Uri as a string of the current Favicon. This will be an empty string if the page does not have a Favicon. + + + + + Raised when the Favicon has changed. This can include when a new page is loaded and thus by default no icon is set or the icon is set for the page by DOM or JavaScript. + + + The first argument is the Webview2 which saw the changed Favicon and the second is null. + + + + + Get the downloaded Favicon image for the current page and copy it to the image stream. + + The format to retrieve the Favicon in. + + An IStream populated with the downloaded Favicon. + + + + + Print the current web page asynchronously to the specified printer with the provided settings. + + + See for description of settings. Passing null for printSettings results in default print settings used. + + The method will return as if printerName doesn't match with the name of any installed printers on the user OS. + The method will throw ArgumentException if the caller provides invalid settings for a given printer. + + The async Print operation completes when it finishes printing to the printer. Only one Printing operation can be in progress at a time. If Print is called while a or or job is in progress, throws exception. This is only for printing operation on one webview. + + + + Error + PrintStatus + Notes + + + No + + Print operation succeeded. + + + No + + If specified printer is not found or printer status is not available, offline or error state. + + + No + + Print operation is failed. + + + ArgumentException + + If the caller provides invalid settings for the specified printer. + + + Exception + + Print operation is failed as printing job already in progress. + + + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PrintToPrinter"::: + + + + + Opens the print dialog to print the current web page. + + + See for descriptions of print dialog kinds. + + Invoking browser or system print dialog doesn't open new print dialog if it is already open. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ShowPrintUI"::: + + + + + Provides the Pdf data of current web page asynchronously for the provided settings. + + + Stream will be rewound to the start of the pdf data. + + See for description of settings. Passing null for printSettings results in default print settings used. + + The async PrintToPdfStream operation completes when it finishes writing to the stream. Only one Printing operation can be in progress at a time. If is called while a or or job is in progress, the throws an exception. This is only for printing operation on one webview. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PrintToPdfStream"::: + + + + + Share a shared buffer object with script of the main frame in the WebView. + + The object to be shared with script. + The desired given to script. + Additional data to be send to script. If it is not null or empty string, and it is not a valid JSON string, will be thrown. + + The script will receive a sharedbufferreceived event from chrome.webview. + The event arg for that event will have the following methods and properties. + + + + Property + Description + + + getBuffer() + A method that returns an ArrayBuffer object with the backing content from the shared buffer. + + + additionalData + An object as the result of parsing additionalDataAsJson as JSON string. This property will be undefined if additionalDataAsJson is nullptr or empty string. + + + source + With a value set as chrome.webview object. + + + + If access is , the script will only have read access to the buffer. + If the script tries to modify the content in a read only buffer, it will cause an access violation in WebView renderer process and crash the renderer process. + + If the shared buffer is already closed, the API throws with error code of RO_E_CLOSED. + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access to the shared buffer any more. + + The application can post the same shared buffer object to multiple web pages or iframes, or post to the same web page or iframe multiple times. + Each PostSharedBufferToScript will create a separate ArrayBuffer object with its own view of the memory and is separately released. + The underlying shared memory will be released when all the views are released. + + Sharing a buffer to script has security risk. You should only share buffer with trusted site. + If a buffer is shared to a untrusted site, possible sensitive information could be leaked. + If a buffer is shared as modifiable by the script and the script modifies it in an unexpected way, it could result in corrupted data that might even crash the application. + + The example code shows how to send data to script for one time read only consumption. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="OneTimeShareBuffer"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_2"::: + + + + + LaunchingExternalUriScheme is raised when a navigation request is made to a URI scheme that is registered with the OS. + + + The event handler may suppress the default dialog or replace the default dialog with a custom dialog. + If a is not taken on the event args, the external URI scheme launch is blocked until the event handler returns. + If a deferral is taken, the external URI scheme launch is blocked until the is completed. + The host also has the option to cancel the URI scheme launch. + + The and events will be raised, regardless of whether the property is set to true or false. + The event will be raised with the property set to false and the property set to regardless of whether the host sets the property. + The , and events will not be raised for this navigation to the external URI scheme regardless of the property. + The event will be raised after the event and before the event. + + The default will also be updated upon navigation to an external URI scheme. + If a setting on the interface has been changed, navigating to an external URI scheme will trigger the to update. + + The WebView2 may not display the default dialog based on user settings, browser settings, and whether the origin is determined as a [trustworthy origin](https://w3c.github.io/webappsec-secure-contexts#potentially-trustworthy-origin); however, the event will still be raised. + If the request is initiated by a cross-origin frame without a user gesture, the request will be blocked and the `LaunchingExternalUriScheme` event will not be raised. A URI scheme may be blocked for safety reasons. In this case the `LaunchingExternalUriScheme` event will not be raised. The default dialog may show an "always allow" checkbox which allows the user to opt-in to relaxed security (i.e. skipping future default dialogs) for the combination of the URI scheme and the origin of the page initiating this external URI scheme launch. The checkbox is offered so long as the group policy to show the checkbox is not explicitly disabled and there is a trustworthy initiating origin. If the user has checked this box, future attempts to launch this URI scheme will still raise the event. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="LaunchingExternalUriScheme"::: + + + + + Desired of a WebView. + + + An app may set to indicate desired memory consumption level of WebView. + Scripts will not be impacted and continue to run. + This is useful for inactive apps that still want to run scripts and/or keep network connections alive and therefore could not call and to reduce memory consumption. + These apps can set memory usage target level to when the app becomes inactive, and set back to when the app becomes active. + + It is not necessary to set CoreWebView2Controller's IsVisible property to false when setting the property. + + It is a best effort operation to change memory usage level, and the API will return before the operation completes. + + Setting the level to could potentially cause memory for some WebView browser processes to be swapped out to disk in some circumstances. It is a best effort to reduce memory usage as much as possible. + If a script runs after its related memory has been swapped out, the memory will be swapped back in to ensure the script can still run, but performance might be impacted. + Therefore, the app should set the level back to when the app becomes active again. Setting memory usage target level back to normal will not happen automatically. + + An app should choose to use either the combination of and or the combination of setting MemoryUsageTargetLevel to and . It is not advisable to mix them. + Trying to set while suspended will be ignored. + The and methods will change the . + will automatically set to while on suspended WebView will automatically set to . + Calling when the WebView is not suspended would not change . + + + + + The unique identifier of the main frame. It's the same kind of ID as with the and . + + + FrameId may not be valid if has not done any navigation. It's safe to get this value during or after the first event. Otherwise, it could return the invalid frame Id 0. + + + + + Runs JavaScript code from the javaScript parameter in the current top-level document rendered in the WebView, The result of the execution is returned asynchronously in the object which has methods and properties to obtain the successful result of script execution as well as any unhandled JavaScript exceptions. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScriptWithResult"::: + + + + + NotificationReceived is raised when a non-persistent notification is received. + + + + + SaveAsUIShowing is raised when browser trys to open a save as dialog. It includes opening dialog manually from context menu or programmatically from . + + + + + + Async method to programmatically trigger a Save As action for the currently loaded document. + + It opens a system modal dialog by default. If the property is `TRUE`, the system dialog is not opened. This method can return . + + + + + + This event will be raised during system FileTypePolicy checking the dangerous file extension list. + + + Developers can specify their own logic for determining whether to allow a particular type of file to be saved from the document origin URI. Developers can also determine the save decision based on other criteria. Here are two properties in to manage the decision, and . + Table of Properties' value and result: + + + + CancelSave + SuppressDefaultPolicy + Result + + + False + False + Perform the default policy check. It may show the security warning UI if the file extension is dangerous. + + + False + True + Skip the default policy check and the possible security warning. Start saving or downloading. + + + True + Any + Skip the default policy check and the possible security warning. Abort save or download. + + + + + + + ScreenCaptureStarting event is raised when the [Screen Capture API](https://www.w3.org/TR/screen-capture/) is requested by the user using getDisplayMedia(). + + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + Represents a certificate. Gives access to a certificate's metadata. + + + + + Converts this to a X509Certificate2. + + + An object created using PEM encoded data from + this object. + + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + Subject of the certificate. + + + + + Name of the certificate authority that issued the certificate. + + + + + Base64 encoding of DER encoded serial number of the certificate. Read more about DER at [RFC 7468 DER](https://tools.ietf.org/html/rfc7468#appendix-B). + + + + + Display name for a certificate. + + + + + Returns list of PEM encoded certificate issuer chain. In this list first element is the current certificate followed by intermediate1, intermediate2...intermediateN-1. Root certificate is the last element in the list. + + + + + PEM encoded data for the certificate. Returns Base64 encoding of DER encoded certificate. Read more about PEM at [RFC 1421 Privacy Enhanced Mail](https://tools.ietf.org/html/rfc1421). + + + + + Represents a client certificate. Gives access to a certificate's metadata. + + + + + Converts this to a X509Certificate2. + + + An object created using PEM encoded data from + this object. + + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + Subject of the certificate. + + + + + Name of the certificate authority that issued the certificate. + + + + + Base64 encoding of DER encoded serial number of the certificate. Read more about DER at [RFC 7468 DER](https://tools.ietf.org/html/rfc7468#appendix-B). + + + + + Display name for a certificate. + + + + + Returns list of PEM encoded client certificate issuer chain. In this list first element is the current certificate followed by intermediate1, intermediate2...intermediateN-1. Root certificate is the last element in the list. + + + + + Kind of a certificate. See for descriptions. + + + + + PEM encoded data for the certificate. Returns Base64 encoding of DER encoded certificate. Read more about PEM at [RFC 1421 Privacy Enhanced Mail](https://tools.ietf.org/html/rfc1421). + + + + + This class is the owner of the object, and + provides support for resizing, showing and hiding, focusing, and other + functionality related to windowing and composition. + + + The owns the , and if all references to the go away, the WebView will be closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + + + Gets the associated with this . + + + + + + Moves focus into WebView. + + The reason for moving focus. + + WebView will get focus and focus will be set to correspondent element in the page hosted in the WebView. For reason, focus is set to previously focused element or the default element if no previously focused element exists. For reason, focus is set to the first element. For reason, focus is set to the last element. WebView changes focus through user interaction including selecting into a WebView or Tab into it. For tabbing, the app runs MoveFocus with or to align with Tab and Shift+Tab respectively when it decides the WebView is the next tabbable element. + + + + + Determines whether to show or hide the WebView. + + + If IsVisible is set to false, the WebView is transparent and is not rendered. However, this does not affect the window containing the WebView (the ParentWindow parameter that was passed to or ). + If you want that window to disappear too, run the corresponding Hide method from the UI framework on it directly in addition to modifying this. + WebView as a child window does not get window messages when the top window is minimized or restored. For performance reasons, developers should set the IsVisible property of the WebView to false when the app window is minimized and back to true when the app window is restored. The app window does this by handling SIZE_MINIMIZED and SIZE_RESTORED command upon receiving WM_SIZE message. There are CPU and memory benefits when the page is hidden. For instance Chromium has code that throttles activities on the page like animations and some tasks are run less frequently. Similarly, WebView2 will purge some caches to reduce memory usage. + + + + + + Gets or sets the WebView bounds. + + + Bounds are relative to the . The app has two ways to position a WebView: + + + Create a child HWND that is the WebView parent HWND. Position the window where the WebView should be. Use (0, 0) for the top-left corner (the offset) of the Bounds of the WebView. + + + Use the top-most window of the app as the WebView parent HWND. For example, to position ebView correctly in the app, set the top-left corner of the Bounds of the WebView. + + + + The values of Bounds are limited by the coordinate space of the host. + + + + + Gets or sets the zoom factor for the WebView. + + + Note that changing zoom factor may cause window.innerWidth or window.innerHeight and page layout to change. A zoom factor that is applied by the host by setting this ZoomFactor property becomes the new default zoom for the WebView. This zoom factor applies across navigations and is the zoom factor WebView is returned to when the user presses Ctrl+0. When the zoom factor is changed by the user (resulting in the app receiving ), that zoom applies only for the current page. Any user applied zoom is only for the current page and is reset on a navigation. Specifying a ZoomFactor less than or equal to 0 is not allowed. WebView also has an internal supported zoom factor range. When a specified zoom factor is out of that range, it is normalized to be within the range, and a event is raised for the real applied zoom factor. When this range normalization happens, this reports the zoom factor specified during the previous modification of the ZoomFactor property until the event is received after WebView applies the normalized zoom factor. + + + + + Gets the parent window provided by the app or sets the parent window that this WebView is using to render content. + + + It initially returns the ParentWindow passed into or . Setting the property causes the WebView to re-parent the main WebView window to the newly provided window. + + + + + ZoomFactorChanged is raised when the property changes. + + + The event may be raised because the property was modified, or due to the user manually modifying the zoom. When it is modified using the property, the internal zoom factor is updated immediately and no ZoomFactorChanged event is raised. WebView associates the last used zoom factor for each site. It is possible for the zoom factor to change when navigating to a different page. When the zoom factor changes due to a navigation change, the ZoomFactorChanged event is raised right after the event. + + + + + + MoveFocusRequested is raised when user tries to tab out of the WebView. + + + The focus of the WebView has not changed when this event is raised. + + + + + GotFocus is raised when WebView gets focus. + + + + + LostFocus is raised when WebView loses focus. + + + In the case where event is raised, the focus is still on WebView when event is raised. LostFocus is only raised afterwards when code of the app or default action of event sets focus away from WebView. + + + + + AcceleratorKeyPressed is raised when an accelerator key or key combo is pressed or released while the WebView is focused. + + + A key is considered an accelerator if either of the following conditions are true: + + + + Ctrl or Alt is currently being held. + + + The pressed key does not map to a character. + + + + A few specific keys are never considered accelerators, such as Shift. The Escape key is always considered an accelerator. + + Autorepeated key events caused by holding the key down will also raise this event. Filter out the auto-repeated key events by verifying or . + + In windowed mode, this event is synchronous. Until you set to true or the event handler returns, the browser process is blocked and outgoing cross-process COM calls will fail with RPC_E_CANTCALLOUT_ININPUTSYNCCALL. All methods work, however. + + In windowless mode, the event is asynchronous. Further input do not reach the browser until the event handler returns or is set to true, but the browser process is not blocked, and outgoing COM calls work normally. + + It is recommended to set to true as early as you are able to know that you want to handle the accelerator key. + + + + + Updates and properties at the same time. + + The bounds to be updated. + The zoom factor to be updated. + + This operation is atomic from the perspective of the host. After returning from this function, the and properties are both updated if the function is successful, or neither is updated if the function fails. If and are both updated by the same scale (for example, and are both doubled), then the page does not display a change in window.innerWidth or window.innerHeight and the WebView renders the content at the new size and zoom without intermediate renderings. This function also updates just one of or by passing in the new value for one and the current value for the other. + + + + + Tells WebView that the main WebView parent (or any ancestor) HWND moved. + + + This is a notification separate from . This is needed for accessibility and certain dialogs in WebView to work correctly. + + + + + Closes the WebView and cleans up the underlying browser instance. + + + Cleaning up the browser instance releases the resources powering the WebView. The browser instance is shut down if no other WebViews are using it. + + After running Close, all methods fail and event handlers stop running. Specifically, the WebView releases the associated references to any associated event handlers when Close is run. + + Close is implicitly run when the loses the final reference and is destructed. But it is best practice to explicitly run Close to avoid any accidental cycle of references between the WebView and the app code. Specifically, if you capture a reference to the WebView in an event handler you create a reference cycle between the WebView and the event handler. Run Close to break the cycle by releasing all event handlers. But to avoid the situation, it is best to both explicitly run Close on the WebView and to not capture a reference to the WebView to ensure the WebView is cleaned up correctly. Close is synchronous and won't trigger the beforeunload event. + + + + + Gets or sets the WebView default background color. + + + The `DefaultBackgroundColor` is the color that renders underneath all web content. This means WebView renders this color when there is no web content loaded such as before the initial navigation or between navigations. This also means web pages with undefined css background properties or background properties containing transparent pixels will render their contents over this color. Web pages with defined and opaque background properties that span the page will obscure the `DefaultBackgroundColor` and display normally. The default value for this property is white to resemble the native browser experience. Currently this API only supports opaque colors and transparency. It will fail for colors with alpha values that don't equal 0 or 255 ie. translucent colors are not supported. It also does not support transparency on Windows 7. On Windows 7, setting DefaultBackgroundColor to a Color with an Alpha value other than 255 will result in failure. On any OS above Win7, choosing a transparent color will result in showing hosting app content. This means webpages without explicit background properties defined will render web content over hosting app content. + This property may also be set via the `WEBVIEW2_DEFAULT_BACKGROUND_COLOR` environment variable. There is a known issue with background color where just setting the color by property can still leave the app with a white flicker before the `DefaultBackgroundColor` property takes effect. Setting the color via environment variable solves this issue. The value must be a hex value that can optionally prepend a 0x. The value must account for the alpha value which is represented by the first 2 digits. So any hex value fewer than 8 digits will assume a prepended 00 to the hex value and result in a transparent color. `DefaultBackgroundColor` will return the result of this environment variable even if it has not been set directly. This environment variable can only set the `DefaultBackgroundColor` once. Subsequent updates to background color must be done by setting the property. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DefaultBackgroundColor"::: + + + + + Gets or sets the WebView rasterization scale. + + + The rasterization scale is the combination of the monitor DPI scale and text scaling set by the user. This value should be updated when the DPI scale of the app's top level window changes (i.e. monitor DPI scale changes or the window changes monitor) or when the text scale factor of the system changes. + Rasterization scale applies to the WebView content, as well as popups, context menus, scroll bars, and so on. Normal app scaling scenarios should use the property or method. + + + + + Determines whether the WebView will detect monitor scale changes. + + + ShouldDetectMonitorScaleChanges property determines whether the WebView attempts to track monitor DPI scale changes. When true, the WebView will track monitor DPI scale changes, update the property, and fire event. When false, the WebView will not track monitor DPI scale changes, and the app must update the property itself. event will never raise when ShouldDetectMonitorScaleChanges is false. Apps that want to set their own rasterization scale should set this property to false to avoid the WebView2 updating the property to match the monitor DPI scale. + + + + + Gets or sets the WebView bounds mode. + + + BoundsMode affects how setting the and properties work. Bounds mode can either be in mode or mode. + + + + + RasterizationScaleChanged is raised when the property changes. + + + The event is raised when the Webview detects that the monitor DPI scale has changed, is true, and the Webview has changed the property. + + + + + + Gets or sets the WebView allow external drop property. + + + The AllowExternalDrop is to configure the capability that dropping files into webview2 is allowed or permitted. The default value is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleAllowExternalDrop"::: + + + + + Used to manage profile options that created by . + + + Used to manage profile options that created by . + + + + + Manages the value of the controller's script locale. + + + The ScriptLocale property is to specify the default script + locale. It sets the default locale for all Intl JavaScript APIs and + other JavaScript APIs that depend on it, namely + Intl.DateTimeFormat() which affects string formatting like in + the time/date formats.The intended locale value is in the format of + BCP 47 Language Tags. More information can be found from [IETF + BCP47](https://www.ietf.org/rfc/bcp/bcp47.html ). The default value + for ScriptLocale will be depend on the WebView2 language and OS + region. If the language portions of the WebView2 language and OS + region match, then it will use the OS region. Otherwise, it will use + the WebView2 language. + + + OS Region + WebView2 Language + Default WebView2 ScriptLocale + + + en-GB + en-US + en-GB + + + es-MX + en-US + en-US + + + en-US + en-GB + en-US + + + You can set the ScriptLocale to the empty string to get the default ScriptLocale value. + Use OS specific APIs to determine the OS region to use with this property if you always want to match with the OS + region. For example: + + CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture; + return cultureInfo.Name + + + + + + Manage the name of the controller's profile. + + + The ProfileName property is to specify a profile name, which is only allowed to contain the following ASCII characters. It has a maximum length of 64 characters excluding the null-terminator. It is ASCII case insensitive. + + * alphabet characters: a-z and A-Z + * digit characters: 0-9 + * and '#', '@', '$', '(', ')', '+', '-', '_', '~', '.', ' ' (space). + + Note: the text must not end with a period '.' or ' ' (space). And, although upper-case letters are allowed, they're treated just as lower-case counterparts because the profile name will be mapped to the real profile directory path on disk and Windows file system handles path names in a case-insensitive way. + + + + + Manage the controller's InPrivate mode. + + + + + Provides a set of properties that are used to manage a . + + + + + Converts this to a System.Net.Cookie. + + + An object whose , , , , , , and , matches + those , , , + , , , and of this object. + + + The values of the properties other than those + specified above remain their default values. + + + + + + The expiration date and time for the cookie since the UNIX epoch. + + + Setting the Expires property to + makes this a session cookie, which is its default value. + + + + + Get or sets the cookie name. + + + + + Gets or sets the cookie value. + + + + + Gets the domain for which the cookie is valid. + + + The default value is the host that this cookie has been received from. Note that, for instance, .bing.com, bing.com, and www.bing.com are considered different domains. + + + + + Gets the path for which the cookie is valid. + + + The default value is "/", which means this cookie will be sent to all pages on the . + + + + + Determines whether this cookie is http-only. + + + + + Determines the SameSite status of the cookie which represents the enforcement mode of the cookie. + + + The default value is . + + + + + Gets or sets the security level of this cookie. + + + + + Determines whether this is a session cookie. The default value is false. + + + + + Creates, adds or updates, gets, or or view the cookies. + + + The changes would apply to the context of the user profile. That is, other WebViews under the same user profile could be affected. + + + + + Creates a CoreWebView2Cookie object whose params matches those of the given System.Net.Cookie. + + + A System.Net.Cookie whose params to be used to create a CoreWebView2Cookie. + + + An object whose , , , , , , and , matches those , , , , , , and of the given object. + + + The default value for the + property of the returned object is + . + + + + + + Creates a cookie object with a specified name, value, domain, and path. + + + One can set other optional properties after cookie creation. This only creates a cookie object and it is not added to the cookie manager until you call . name that starts with whitespace(s) is not allowed. + + The name for the to be created. It cannot start with whitespace(s). + + + + + + + Creates a cookie whose params matches those of the specified cookie. + + + + + Gets a list of cookies matching the specific URI. + + + You can modify the cookie objects by calling , and the changes will be applied to the webview. + + If uri is empty string or null, all cookies under the same profile are returned. + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetCookies"::: + + + + + Adds or updates a cookie with the given cookie data; may overwrite cookies with matching name, domain, and path if they exist. + + The to be added or updated. + + This method will fail if the domain of the given cookie is not specified. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AddOrUpdateCookie"::: + + + + + Deletes a cookie whose name and domain/path pair match those of the specified cookie. + + + + + Deletes cookies with matching name and uri. + + The name for the cookies to be deleted is required. + If uri is specified, deletes all cookies with the given name where domain and path match provided URI. + + + + Deletes cookies with matching name and domain/path pair. + + The name for the cookies to be deleted is required. + If domain is specified, deletes only cookies with the exact domain. + If path is specified, deletes only cookies with the exact path. + + + + Deletes all cookies under the same profile. + + + This could affect other WebViews under the same user profile. + + + + + Represents the registration of a custom scheme with the . + + + This allows the WebView2 app to be able to handle event for requests with the + specified scheme and be able to navigate the WebView2 to the custom + scheme. Once the environment is created, the registrations are valid and + immutable throughout the lifetime of the associated WebView2s' browser + process and any WebView2 environments sharing the browser process must be + created with identical custom scheme registrations, otherwise the + environment creation will fail. Any further attempts to register the same + scheme will fail during environment creation. The URIs of registered + custom schemes will be treated similar to http URIs for their origins. + They will have tuple origins for URIs with host and opaque origins for + URIs without host as specified in [7.5 Origin - HTML Living Standard](https://html.spec.whatwg.org/multipage/origin.html) For event, the cases of request + URIs and filter URIs with custom schemes will be normalized according to + generic URI syntax rules. Any non-ASCII characters will be preserved. The + registered custom schemes also participate in [CORS](https://developer.mozilla.org/docs/Web/HTTP/CORS) and adheres to + [CSP](https://developer.mozilla.org/docs/Web/HTTP/CSP). The app needs to + set the appropriate access headers in its event handler to allow CORS + requests. + + + custom-scheme-with-host://hostname/path/to/resource has origin of + custom-scheme-with-host://hostname. + custom-scheme-without-host:path/to/resource has origin of + custom-scheme-without-host:path/to/resource. + + + + + The name of the custom scheme to register. + + + + + Whether the sites with this scheme will be treated as a [Secure + Context](https://developer.mozilla.org/docs/Web/Security/Secure_Contexts) + like an HTTPS site. + + + + + Set this property to true if the URIs with this custom scheme + will have an authority component (a host for custom schemes). + Specifically, if you have a URI of the following form you should set the + HasAuthorityComponent value as listed. + + + + URI + Recommended HasAuthorityComponent value + + + custom-scheme-with-authority://host/path + true + + + custom-scheme-without-authority:path + false + + + + + When this property is set to true, the URIs with this scheme will + be interpreted as having a [scheme and + host](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-tuple) + origin similar to an http URI. Note that the port and user information + are never included in the computation of origins for custom schemes. If + this property is set to false, URIs with this scheme will have an + [opaque + origin](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque) + similar to a data URI. This property is false by default. Note: + For custom schemes registered as having authority component, navigations + to URIs without authority of such custom schemes will fail. However, if + the content inside WebView2 references a subresource with a URI that + does not have an authority component, but of a custom scheme that is + registered as having authority component, the URI will be interpreted as + a relative path as specified in + [RFC3986](https://www.rfc-editor.org/rfc/rfc3986). For example, + custom-scheme-with-authority:path will be interpreted as + custom-scheme-with-authority://host/path. However, this behavior + cannot be guaranteed to remain in future releases so it is recommended + not to rely on this behavior. + + + + + List of origins that are allowed to issue requests with the custom + scheme, such as XHRs and subresource requests that have an Origin + header. + + + The origin of any request (requests that have the [Origin + header](https://developer.mozilla.org/docs/Web/HTTP/Headers/Origin)) to + the custom scheme URI needs to be in this list. No-origin requests are + requests that do not have an Origin header, such as link navigations, + embedded images and are always allowed. Note that cross-origin + restrictions still apply. From any opaque origin (Origin header is + null), no cross-origin requests are allowed. If the list is empty, no + cross-origin request to this scheme is allowed. Origins are specified as + a string in the format of scheme://host:port. The origins are + string pattern matched with * (matches 0 or more characters) and + ? (matches 0 or 1 character) wildcards just like the URI matching + in the + API. For example, http://*.example.com:80. + + Here's a set of examples of what is allowed or not: + + + + Request URI + Originating URL + AllowedOrigins + Allowed + + + custom-scheme:request + https://www.example.com + {"https://www.example.com"} + Yes + + + custom-scheme:request + https://www.example.com + {"https://*.example.com"} + Yes + + + custom-scheme:request + https://www.example.com + {"https://www.example2.com"} + No + + + custom-scheme-with-authority://host/path + custom-scheme-with-authority://host2 + {""} + No + + + custom-scheme-with-authority://host/path + custom-scheme-with-authority2://host + {"custom-scheme-with-authority2://*"} + Yes + + + custom-scheme-without-authority:path + custom-scheme-without-authority:path2 + {"custom-scheme-without-authority:*"} + No + + + custom-scheme-without-authority:path + custom-scheme-without-authority:path2 + {"*"} + Yes + + + + + + + Initializes a new instance of the CoreWebView2CustomSchemeRegistration + class. + + + The name of the custom scheme to register. + + + + + Represents a download operation. Gives access to a download's metadata and supports a user canceling, pausing, or resuming a download. + + + + + The estimated end time of the download. + + + + + The total bytes to receive count. + + + + + The URI of the download. + + + + + The Content-Disposition header value from the download's HTTP response. If none, the value is an empty string. + + + + + MIME type of the downloaded content. + + + + + The number of bytes that have been written to the download file. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BytesReceivedChanged"::: + + + + + The absolute path to the download file, including file name. + + + Host can change this from . + + + + + The state of the download. A download can be in progress, interrupted, or completed. + + + See for descriptions of states. + + + + + The reason why connection with file host was broken. + + + See for descriptions of reasons. + + + + + Returns true if an interrupted download can be resumed. + + + Downloads with the following interrupt reasons may automatically resume without you calling any methods: , , . In these cases progress may be restarted with set to 0. + + + + + Event raised when the bytes received count is updated. + + + + + Event raised when the estimated end time changes. + + + + + Event raised when the state of the download changes. + + + Use to get the current state, and to get the reason if the download is interrupted. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="StateChanged"::: + + + + + Cancels the download. + + + If canceled, the default download dialog shows that the download was canceled. Host should use if download should be canceled without displaying the default download dialog. + + + + + Pauses the download. + + + If paused, the default download dialog shows that the download is paused. No effect if download is already paused. Pausing a download changes the state from in progress to interrupted, with interrupt reason set to . + + + + + Resumes a paused download. May also resume a download that was interrupted for another reason if returns true. + + + Resuming a download changes the state from interrupted to in progress. + + + + + This represents the WebView2 Environment. + + + WebViews created from an environment run on the Browser process specified with environment parameters and objects created from an environment should be used in the same environment. Using it in different environments are not guaranteed to be compatible and may fail. + + + + + + + + + + + + + + + + + + + Creates a WebView2 Environment using the installed or a custom WebView2 Runtime version. + + + The relative path to the folder that contains a custom version of WebView2 Runtime. + + To use a fixed version of the WebView2 Runtime, pass the + folder path that contains the fixed version of the WebView2 Runtime + to browserExecutableFolder. BrowserExecutableFolder supports both relative + (to the application's executable) and absolute file paths. To create WebView2 controls + that use the installed version of the WebView2 Runtime that exists on + user machines, pass a null or empty string to + browserExecutableFolder. In this scenario, the API tries to + find a compatible version of the WebView2 Runtime that is installed + on the user machine (first at the machine level, and then per user) + using the selected channel preference. The path of fixed version of + the WebView2 Runtime should not contain \Edge\Application\. When + such a path is used, the API fails with ERROR_NOT_SUPPORTED. + + + + The user data folder location for WebView2. + + The path is either an absolute file path or a relative file path + that is interpreted as relative to the compiled code for the + current process. The default user data folder {Executable File + Name}.WebView2 is created in the same directory next to the + compiled code for the app. WebView2 creation fails if the compiled + code is running in a directory in which the process does not have + permission to create a new directory. The app is responsible to + clean up the associated user data folder when it is done. + + + + Options used to create WebView2 Environment. + + As a browser process may be shared among WebViews, WebView creation + fails if the specified options does not match the options of + the WebViews that are currently running in the shared browser + process. + + + + + The default channel search order is the WebView2 Runtime, Beta, Dev, and + Canary. When an override WEBVIEW2_RELEASE_CHANNEL_PREFERENCE environment + variable or applicable releaseChannelPreference registry value is set to + 1, the channel search order is reversed. + + + To use a fixed version of the WebView2 Runtime, pass the relative + folder path that contains the fixed version of the WebView2 Runtime + to browserExecutableFolder. To create WebView2 controls that + use the installed version of the WebView2 Runtime that exists on + user machines, pass a null or empty string to + browserExecutableFolder. In this scenario, the API tries to + find a compatible version of the WebView2 Runtime that is installed + on the user machine (first at the machine level, and then per user) + using the selected channel preference. The path of fixed version of + the WebView2 Runtime should not contain \Edge\Application\. When + such a path is used, the API fails with the following error. + + + The , , and may be + overridden by values either specified in environment variables or in + the registry. + + + When creating a the following environment variables are verified. + + + + WEBVIEW2_BROWSER_EXECUTABLE_FOLDER + + + WEBVIEW2_USER_DATA_FOLDER + + + WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS + + + WEBVIEW2_RELEASE_CHANNEL_PREFERENCE + + + + If browser executable folder or user data folder is specified in an + environment variable or in the registry, the specified or values are overridden. If additional browser + arguments are specified in an environment variable or in the + registry, it is appended to the corresponding value in the specified + . + + + While not strictly overrides, additional environment variables may be set. + + + + Value + Description + + + WEBVIEW2_WAIT_FOR_SCRIPT_DEBUGGER + + When found with a non-empty value, this indicates that the WebView + is being launched under a script debugger. In this case, the WebView + issues a Page.waitForDebugger CDP command that runs the + script inside the WebView to pause on launch, until a debugger + issues a corresponding Runtime.runIfWaitingForDebugger CDP + command to resume the runtime. + Note that this environment variable does not have a registry key equivalent. + + + + WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER + + When found with a non-empty value, it indicates that the WebView is + being launched under a script debugger that also supports host apps + that use multiple WebViews. The value is used as the identifier for + a named pipe that is opened and written to when a new WebView is + created by the host app. The payload should match the payload of the + remote-debugging-port JSON target and an external debugger + may use it to attach to a specific WebView instance. The format of + the pipe created by the debugger should be + \\.\pipe\WebView2\Debugger\{app_name}\{pipe_name}, where the + following are true. + + + {app_name} is the host app exe file name, for example, WebView2Example.exe + {pipe_name} is the value set for WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER + + + To enable debugging of the targets identified by the JSON, you must + set the WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS environment + variable to send --remote-debugging-port={port_num}, where + the following is true. + + + {port_num} is the port on which the CDP server binds. + + + If both WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER and + WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS environment variables, + the WebViews hosted in your app and associated contents may exposed + to 3rd party apps such as debuggers. Note that this environment + variable does not have a registry key equivalent. + + + + + If none of those environment variables exist, then the registry is examined + next. + + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\BrowserExecutableFolder "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\ReleaseChannelPreference "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\AdditionalBrowserArguments "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\UserDataFolder "{AppId}"="" + + + + Use a group policy under Administrative Templates > + Microsoft Edge WebView2 to configure browser executable folder + and release channel preference. + + + + Value + Description + + + ERROR_DISK_FULL + + In the unlikely scenario where some instances of WebView are open during a + browser update, the deletion of the previous WebView2 Runtime may be + blocked. To avoid running out of disk space, a new WebView creation fails + with this error if it detects that too many previous WebView2 + Runtime versions exist. + + + + COREWEBVIEW2_MAX_INSTANCES + + The default maximum number of WebView2 Runtime versions allowed is 20. + To override the maximum number of the previous WebView2 Runtime versions + allowed, set the value of the following environment variable. + + + + ERROR_PRODUCT_UNINSTALLED + + If the Webview depends upon an installed WebView2 Runtime version and it is + uninstalled, any subsequent creation fails with this error. + + + + + First verify with Root as HKLM and then HKCU. AppId is first set to + the Application User Model ID of the process, then if no corresponding + registry key, the AppId is set to the compiled code name of the process, + or if that is not a registry key then *. If an override registry key is + found, use the browserExecutableFolder and userDataFolder registry + values as replacements and append additionalBrowserArguments registry + values for the corresponding values in the provided . + + + + + + Gets the browser version info including channel name if it is not the stable channel or WebView2 Runtime. + + + The relative path to the folder that contains the WebView2 Runtime. + + + WebView2 Runtime installation is missing. + + + + + Gets the browser version info including channel name if it is not the stable channel or WebView2 Runtime. + + + The relative path to the folder that contains the WebView2 Runtime. + + + The environment options used to create the environment. + + + WebView2 Runtime installation is missing. + + + Browser version info includes channel name if it is not the WebView2 Runtime. + Channel names are Beta, Dev, and Canary. The format of the return string + matches the format of . + If an override exists for BrowserExecutableFolder, ReleaseChannels, + or ChannelSearchKind, the override is used. The presence of an override + can result in a different channel used than the one expected based on the environment + options object. BrowserExecutableFolder takes precedence over the + other options. See + for more details on overrides. If an override is not specified, then the + parameters passed to GetAvailableBrowserVersionString are used. + The method fails if the loader is unable to find an installed WebView2 + Runtime or non-stable Microsoft Edge installation. + + + + + Compares two instances of browser versions correctly and returns an integer that indicates whether the first instance is older, the same as, or newer than the second instance. + + + One of the version strings to compare. + + + The other version string to compare. + + + An integer that indicates whether the first instance is older, the same as, or newer than the second instance. + + + Value Type + Condition + + + Less than zero + version1 is older than version2. + + + Zero + version1 is the same as version2. + + + Greater than zero + version1 is newer than version2. + + + + + + + Creates a new object. + + The request URI. + The HTTP request method. + + The raw request header string delimited by CRLF (optional in last header). + + uri parameter must be absolute URI. It's also possible to create this object with null headers string and then use the to construct the headers line by line. + + + + + + Creates a new object, + which can be passed as a parameter in and function for multiple profiles + support. + + + A that can be + passed when calling and . + + + The options is a settable property while the default for profile + name is an empty string and the default value for is + false. The profile will be created on disk or opened when calling + CreateCoreWebView2ControllerWithOptions no matter InPrivate mode is + enabled or not, and it will be released in memory when the + corresponding is closed but + still remain on disk. As WebView2 is built on top of Edge browser, + it follows Edge's behavior pattern. To create an InPrivate WebView, + we get an off-the-record profile (an InPrivate profile) from a + regular profile, then create the WebView with the off-the-record + profile. Also the profile name can be reused. + + + + + Asynchronously creates a new object. + + The HWND in which the WebView should be displayed and from which receive input. + + The options contains profileName and inPrivate parameters that could be used to create CoreWebView2Profile, and it can be used to create multiple WebViews with multiple profiles under a single user data directory. + + + Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + + Asynchronously creates a new object. + + The HWND in which the WebView should be displayed and from which receive input. + + The options contains profileName and inPrivate parameters that could be used to create CoreWebView2Profile, and it can be used to create multiple WebViews with multiple profiles under a single user data directory. + + + Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + + Set the path of the folder containing the `WebView2Loader.dll`. + + The path of the folder containing the `WebView2Loader.dll`. + + Thrown when `WebView2Loader.dll` has been successfully loaded. + + + This function allows you to set the path of the folder containing the `WebView2Loader.dll`. This should be the path of a folder containing `WebView2Loader.dll` and not a path to the `WebView2Loader.dll` file itself. + Note that the WebView2 SDK contains multiple `WebView2Loader.dll` files for different CPU architectures. When specifying folder path, you must specify one containing a `WebView2Loader.dll` module with a CPU architecture matching the current process CPU architecture. + This function is used to load the `WebView2Loader.dll` module during calls to any other static methods on `CoreWebView2Environment`. So, the path should be specified before any other API is called in `CoreWebView2Environment` class. Once `WebView2Loader.dll` is successfully loaded this function will throw an InvalidOperationException exception. + The path can be relative or absolute. Relative paths are relative to the path of the `Microsoft.Web.WebView2.Core.dll` module. + If the `WebView2Loader.dll` file does not exist in that path or LoadLibrary cannot load the file, or LoadLibrary fails for any other reason, an exception corresponding to the LoadLibrary failure is thrown when any other API is called in `CoreWebView2Environment` class. For instance, if the file cannot be found a `DllNotFoundException` exception will be thrown. + + + + + Gets the browser version info of the current , including channel name if it is not the stable channel. + + + It matches the format of the method. Channel names are beta, dev, and canary. + + + + + NewBrowserVersionAvailable is raised when a newer version of the WebView2 Runtime is installed and available using WebView2. + + + To use the newer version of the browser you must create a new environment and WebView. The event is only raised for new version from the same WebView2 Runtime from which the code is running. When not running with installed WebView2 Runtime, no event is raised. + + Because a user data folder is only able to be used by one browser process at a time, if you want to use the same user data folder in the WebViews using the new version of the browser, you must close the environment and instance of WebView that are using the older version of the browser first. Or simply prompt the user to restart the app. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SubscribeToNewBrowserVersionAvailable"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NewBrowserVersionAvailable"::: + + + + + Asynchronously creates a new WebView. + + The HWND in which the WebView should be displayed and from which receive input. + + The WebView adds a child window to the provided window during WebView creation. Z-order and other things impacted by sibling window order are affected accordingly. + + + HWND_MESSAGE is a valid parameter for ParentWindow for an invisible WebView for Windows 8 and above. In this case the window will never become visible. You are not able to reparent the window after you have created the WebView. This is not supported in Windows 7 or below. Passing this parameter in Windows 7 or below will return ERROR_INVALID_WINDOW_HANDLE in the controller callback. + + + + It can also accept a which is created by as the second parameter for multiple profiles support. As WebView2 is built on top of Edge browser, it follows Edge's behavior pattern. To create an InPrivate WebView, we gets an off-the-record profile (an InPrivate profile) from a regular profile, then create the WebView with the off-the-record profile. Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + It is recommended that the application set Application User Model ID for the process or the application window. If none is set, during WebView creation a generated Application User Model ID is set to root window of ParentWindow. + + + + It is recommended that the app handles restart manager messages, to gracefully restart it in the case when the app is using the WebView2 Runtime from a certain installation and that installation is being uninstalled. For example, if a user installs a version of the WebView2 Runtime and opts to use another version of the WebView2 Runtime for testing the app, and then uninstalls the 1st version of the WebView2 Runtime without closing the app, the app restarts to allow un-installation to succeed. + + + + When the app retries CreateCoreWebView2ControllerAsync upon failure, it is recommended that the app restarts from creating a new WebView2 Environment. If a WebView2 Runtime update happens, the version associated with a WebView2 Environment may have been removed and causing the object to no longer work. Creating a new WebView2 Environment works since it uses the latest version. + + + + WebView creation fails if a running instance using the same user data folder exists, and the Environment objects have different . For example, if a WebView was created with one , an attempt to create a WebView with a different using the same user data folder fails. + + + + WebView creation can fail with `E_UNEXPECTED` if runtime does not have permissions to the user data folder. + + + + + + Creates a new object. + + HTTP response content as stream. + The HTTP response status code. + The HTTP response reason phrase. + The raw response header string delimited by newline. + + It is also possible to create this object with empty headers string and then use the to construct the headers line by line. + + + + + + Asynchronously creates a new WebView for use with visual hosting. + + The HWND in which the app will connect the visual tree of the WebView. + + ParentWindow will be the HWND that the app will receive pointer/mouse input meant for the WebView (and will need to use or to forward). If the app moves the WebView visual tree to underneath a different window, then it needs to set to update the new parent HWND of the visual tree. + + Set property on the created to provide a visual to host the browser's visual tree. + + It is recommended that the application set Application User Model ID for the process or the application window. If none is set, during WebView creation a generated Application User Model ID is set to root window of ParentWindow. + + It can also accept a which is created by as the second parameter for multiple profiles support. + + CreateCoreWebView2CompositionController is supported in the following versions of Windows: + + + Windows 11 + + + Windows 10 + + + Windows Server 2019 + + + Windows Server 2016 + + + + + + + Creates an empty . + + + The returned needs to be populated with all of the relevant info before calling . + + + + + BrowserProcessExited is raised when the collection of WebView2 Runtime processes for the browser process of this terminate due to browser process failure or normal shutdown (for example, when all associated WebViews are closed), after all resources have been released (including the user data folder). + + + Multiple app processes can share a browser process by creating their webviews from a with the same user data folder. When the entire collection of WebView2Runtime processes for the browser process exit, all associated objects receive the BrowserProcessExited event. Multiple processes sharing the same browser process need to coordinate their use of the shared user data folder to avoid race conditions and unnecessary waits. For example, one process should not clear the user data folder at the same time that another process recovers from a crash by recreating its WebView controls; one process should not block waiting for the event if other app processes are using the same browser process (the browser process will not exit until those other processes have closed their webviews too). + + Note this is an event from , not . The difference between BrowserProcessExited and is that BrowserProcessExited is raised for any browser process exit (expected or unexpected, after all associated processes have exited too), while is raised for unexpected process exits of any kind (browser, render, GPU, and all other types), or for main frame render process unresponsiveness. To learn more about the WebView2 Process Model, go to [Process model](/microsoft-edge/webview2/concepts/process-model). + + In the case the browser process crashes, both BrowserProcessExited and events are raised, but the order is not guaranteed. These events are intended for different scenarios. It is up to the app to coordinate the handlers so they do not try to perform reliability recovery while also trying to move to a new WebView2 Runtime version or remove the user data folder. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SubscribeToBrowserProcessExited"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BrowserProcessExited"::: + + + + + Creates the used by the method. + + + + + Gets the user data folder that all CoreWebView2s created from this environment are using. + + + This could be either the value passed in by the developer when creating the environment object or the calculated one for default handling. And will always be an absolute path. + + + + + ProcessInfosChanged is raised when a collection of WebView2 Runtime processes changed due to new process being detected or when a existing process gone away. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ProcessInfosChanged"::: + + + + + Returns the list of all using same user data folder except for crashpad process. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetProcessInfos"::: + + + + + Create a custom object to insert into the WebView context menu. + + + CoreWebView2 will rewind the icon stream before decoding. + There is a limit of 1000 active custom context menu items at a given time per . Attempting to create more before deleting existing ones will fail with ERROR_NOT_ENOUGH_QUOTA. It is recommended to reuse custom ContextMenuItems across CoreWebView2ContextMenuRequested events for performance. The created object's property will default to true and property will default to false. A will be assigned that's unique across active custom context menu items, but command ID values of deleted custom ContextMenuItems can be reassigned. + + + + + Gets the failure report folder that all CoreWebView2s created from this environment are using. + + + + + Create a shared memory based buffer with the specified size in bytes. + + + The buffer can be shared with web contents in WebView by calling or . + Once shared, the same content of the buffer will be accessible from both the app process and script in WebView. + Modification to the content will be visible to all parties that have access to the buffer. + The shared buffer is presented to the script as ArrayBuffer. All JavaScript APIs that work for ArrayBuffer including Atomics APIs can be used on it. + There is currently a limitation that only size less than 2GB is supported. + + + + + Returns a snapshot collection of corresponding to all currently running processes associated with this excludes crashpad process. This provides the same list of as what's provided in , but additionally provides a list of associated which are actively running (showing or hiding UI elements) in the renderer process. See for more information. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetProcessExtendedInfos"::: + + + + + Creates a object from a path that represents a Web [FileSystemFileHandle](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle). + + The path pointed by the file. + This must be a syntactically correct fully qualified path, but it is not checked here whether it currently points to a file. If an invalid path is passed, an `InvalidArgumentException` will be thrown. Any other state validation will be done when this handle is accessed from web content and will cause the DOM exceptions described in [FileSystemFileHandle methods](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle#instance_methods) if access operations fail + + + This is used to specify whether the Handle should be created with a Read-only or Read-and-write web permission. + For the `permission` value specified here, the DOM [PermissionStatus](https://developer.mozilla.org/docs/Web/API/PermissionStatus) property will be `[granted](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)` and the unspecified permission will be `[prompt](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)`. Therefore, the web content then does not need to call [requestPermission](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) for the permission that was specified before attempting the permitted operation, but if it does, the promise will immediately be resolved with 'granted' PermissionStatus without firing the event or prompting the user for permission. Otherwise, `requestPermission` will behave as the status of permission is currently `prompt`, which means the `PermissionRequested` event will fire or the user will be prompted. + Note: An exception to this is, if there is a parent directory handle that has broader permissions in the same page context than specified in here, the handle will automatically inherit the most permissive permission of the parent handle when posted to that page context. i.e. If there is already a `FileSystemDirectoryHandle` to `C:\foo` that has write permission on a page, even though a to file `C:\example\file.txt` may be created with permission, when posted to that page, write permission will be automatically granted to the created handle. + Additionally, the app must have the same OS permissions that have propagated to the [WebView2 browser process](/microsoft-edge/webview2/concepts/process-model) for the path it wishes to give the web content to read/write the file. Specifically, the WebView2 browser process will run in same user, package identity, and app container of the app, but other means such as security context impersonations do not get propagated, so such permissions that the app has, will not be effective in WebView2. + + + + An app needs to be mindful that this object, when posted to the web content, provides it with unusual access to OS file system via the Web FileSystem API! The app should therefore only post objects for paths that it wants to allow access to the web content and it is not recommended that the web content "asks" for this path. The app should also check the source property of the target to ensure that it is sending to the web content of intended origin. Once the object is passed to web content, if the content is attempting a read, the file must be existing and available to read similar to a file chosen by [open file picker](https://developer.mozilla.org/docs/Web/API/Window/showOpenFilePicker), otherwise the read operation will [throw a DOM exception](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle/getFile#exceptions). For write operations, the file does not need to exist as `FileSystemFileHandle` will behave as a file path chosen by [save file picker](https://developer.mozilla.org/docs/Web/API/Window/showSaveFilePicker) and will create or overwrite the file, but the parent directory structure pointed by the file must exist and an existing file must be available to write and delete or the write operation will [throw a DOM exception](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle/createWritable#exceptions). + + + + + Creates a object from a path that represents a Web [FileSystemDirectoryHandle](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle). + + The path pointed by the directory. + + This must be a syntactically correct fully qualified path, but it is not checked here whether it currently points to a directory. Any other state validation will be done when this handle is accessed from web content and will cause DOM exceptions if access operations fail. If an invalid path is passed, an `InvalidArgumentException` will be thrown. + + + This is used to specify whether the Handle should be created with a Read-only or Read-and-write web permission. + For the permission value specified here, the Web [PermissionStatus](https://developer.mozilla.org/docs/Web/API/PermissionStatus) will be `[granted](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)` and the unspecified permission will be `[prompt](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)`. Therefore, the web content then does not need to call [requestPermission](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) for the permission that was specified before attempting the permitted operation, but if it does, the promise will immediately be resolved with 'granted' PermissionStatus without firing the WebView2 event or prompting the user for permission. Otherwise, `requestPermission` will behave as the status of permission is currently `Prompt`, which means the `PermissionRequested` event will fire or the user will be prompted. + Note: An exception to this is, if there is a parent directory handle that has broader permissions in the same page context than specified in here, the handle will automatically inherit the most permissive permission of the parent handle when posted to that page context. i.e. If there is already a `FileSystemDirectoryHandle` to `C:\foo` that has write permission on a page, even though a to directory `C:\example\directory` may be created with permission, when posted to that page, write permission will be automatically granted to the created handle. + Additionally, the app must have the same OS permissions that have propagated to the [WebView2 browser process](/microsoft-edge/webview2/concepts/process-model) for the path it wishes to give the web content to make any operations on the directory. Specifically, the WebView2 browser process will run in same user, package identity, and app container of the app, but other means such as security context impersonations do not get propagated, so such permissions that the app has, will not be effective in WebView2. + + + + An app needs to be mindful that this object, when posted to the web content, provides it with unusual access to OS file system via the Web FileSystem API! The app should therefore only post objects for paths that it wants to allow access to the web content and it is not recommended that the web content "asks" for this path. The app should also check the source property of the target to ensure that it is sending to the web content of intended origin. Once the object is passed to web content, the path must point to a directory as if it was chosen via [directory picker](https://developer.mozilla.org/docs/Web/API/Window/showDirectoryPicker) otherwise any IO operation done on the `FileSystemDirectoryHandle` will throw a DOM exception. + + + + + Options used to create WebView2 Environment. + + + Default values will use your defaulted Edge WebView2 Runtime binaries and + user data folder. + + + + + + + + + + + + + Initializes a new instance of the CoreWebView2EnvironmentOptions class. + + + AdditionalBrowserArguments can be specified to change the behavior of + the WebView. + + + The default language that WebView will run with. + + + The version of the Edge WebView2 Runtime binaries required to be + compatible with the calling application. + + + Set to true if single sign on be enabled using the end user's OS primary + account. Defaults to false. + + + List of custom scheme registrations to be applied to the . + + + + + Initializes a new instance of the CoreWebView2EnvironmentOptions class. + + + AdditionalBrowserArguments can be specified to change the behavior of + the WebView. + + + The default language that WebView will run with. + + + The version of the Edge WebView2 Runtime binaries required to be + compatible with the calling application. + + + Set to true if single sign on be enabled using the end user's OS primary + account. Defaults to false. + + + List of custom scheme registrations to be applied to the . + + + Set to CoreWebView2ChannelSearchKind.LeastStable so that environment + creation searches for binaries from least to most stable: + Canary -> Dev -> Beta -> WebView2 Runtime. + Defaults to CoreWebView2RuntimeChannel.MostStable. + + + The release channels that are searched for during environment creation. + + + + + List of custom scheme registrations to be applied to the + + + + + Gets or sets the additional browser arguments to change the behavior of the WebView. + + + + The arguments are passed to the browser process as part of the command. For more information about using command-line switches with Chromium browser processes, navigate to [Run Chromium with Flags](https://aka.ms/RunChromiumWithFlags). The value appended to a switch is appended to the browser process, for example, in --edge-webview-switches=xxx the value is xxx. If you specify a switch that is important to WebView functionality, it is ignored, for example, --user-data-dir. Specific features are disabled internally and blocked from being enabled. If a switch is specified multiple times, only the last instance is used. + + + + A merge of the different values of the same switch is not attempted, except for disabled and enabled features. The features specified by --enable-features and --disable-features will be merged with simple logic: + + + + The features are the union of the specified features and built-in features. If a feature is disabled, it is removed from the enabled features list. + + + + + If you specify command-line switches and sets this property, the --edge-webview-switches value takes precedence and is processed last. If a switch fails to parse, the switch is ignored. The default state for the operation is to run the browser process with no extra flags. + + + Please note that calling this API twice will replace the previous value rather than appending to it. If there are multiple switches, there should be a space in between them. The one exception is if multiple features are being enabled/disabled for a single switch, in which case the features should be comma-separated. Ex. "--disable-features=feature1,feature2 --some-other-switch --do-something" + + + + + + Gets or sets the default display language for WebView. + + + It applies to browser UIs such as context menu and dialogs. It also applies to the accept-languages HTTP header that WebView sends to websites. The intended locale value is in the format of BCP 47 Language Tags. More information can be found from [IETF BCP47](https://www.ietf.org/rfc/bcp/bcp47.html). + + + + + Gets or sets the version of the WebView2 Runtime binaries required to be compatible with your app. + + + This defaults to the WebView2 Runtime version that corresponds with the version of the SDK the app is using. The format of this value is the same as the format of the property and other BrowserVersion values. Only the version part of the BrowserVersion value is respected. The channel suffix, if it exists, is ignored. The version of the WebView2 Runtime binaries actually used may be different from the specified TargetCompatibleBrowserVersion. The binaries are only guaranteed to be compatible. Verify the actual version on the property. + + + + + Determines whether to enable single sign on with Azure Active Directory (AAD) resources inside WebView using the logged in Windows account and single sign on (SSO) with web sites using Microsoft account associated with the login in Windows account. + + + The default value is false. Universal Windows Platform apps must also declare enterpriseCloudSSO [restricted capability](/windows/uwp/packaging/app-capability-declarations#restricted-capabilities) for the single sign on (SSO) to work. + + + + + Determines whether other processes can create from created with the same user data folder and therefore sharing the same WebView browser process instance. + + + The default value is false. + + + + + When IsCustomCrashReportingEnabled is set to true, Windows won't send crash data to Microsoft endpoint. + + + The default value is false. In this case, WebView will respect OS consent. + + + + + The EnableTrackingPrevention property is used to enable/disable tracking prevention feature in WebView2. This property enable/disable tracking prevention for all the WebView2's created in the same environment. By default this feature is enabled to block potentially harmful trackers and trackers from sites that aren't visited before and set to or whatever value was last changed/persisted on the profile. + + + You can set this property to false to disable the tracking prevention feature if the app only renders content in the WebView2 that is known to be safe. Disabling this feature when creating environment also improves runtime performance by skipping related code. + + You shouldn't disable this property if WebView2 is being used as a "full browser" with arbitrary navigation and should protect end user privacy. + + There is property to control levels of tracking prevention of the WebView2's associated with a same profile. However, you can also disable tracking prevention later using property and value but that doesn't improves runtime performance. + + See for more details. + + Tracking prevention protects users from online tracking by restricting the ability of trackers to access browser-based storage as well as the network. See [Tracking prevention](/microsoft-edge/web-platform/tracking-prevention). + + + + + Enable/disable browser extensions. + + + When AreBrowserExtensionsEnabled is set to true, new extensions can be added to user profile and used. AreBrowserExtensionsEnabled is default to be false, in this case, new extensions can't be installed, and already installed extension won't be available to use in user profile. If connecting to an already running environment with a different value for AreBrowserExtensionsEnabled property, it will fail with HRESULT_FROM_WIN32(ERROR_INVALID_STATE). See for Extensions API details. + + + + + Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable so that the WebView2 loader searches for binaries from least to most stable: Canary -> Dev -> Beta -> WebView2 Runtime. + + + The ChannelSearchKind property is CoreWebView2ChannelSearchKind.MostStable by default and environment creation searches for a release channel on the machine from most to least stable using the first channel found. The default search order is: WebView2 Release -> Beta -> Dev -> Canary. Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable to reverse the search order so that environment creation searches for a channel from least to most stable. If a ReleaseChannels has been provided, environment creation will only search for channels in the set. See for more details on channels. This property can be overridden by the corresponding registry key ChannelSearchKind or the environment variable WEBVIEW2_CHANNEL_SEARCH_KIND. Set the value to 1 to reverse the search order. See for more details on overrides. + + + + + Sets the ReleaseChannels, which is a mask of one or more CoreWebView2ReleaseChannels indicating which channels environment creation should search for. + + + OR operation(s) can be applied to multiple CoreWebView2ReleaseChannels to create a mask. The default value is a mask of all the channels. By default, environment creation searches for channels from most to least stable, using the first channel found on the device. When ReleaseChannels is provided, environment creation will only search for the channels specified in the set. Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable to reverse the search order so that environment creation searches for the least stable build first. See for descriptions of each channel. Environment creation fails if it is unable to find any channel from the ReleaseChannels installed on the device. Use to verify which channel is used. If both a BrowserExecutableFolder and ReleaseChannels are provided, the BrowserExecutableFolder takes precedence. The ReleaseChannels can be overridden by the corresponding registry override ReleaseChannels or the environment variable WEBVIEW2_RELEASE_CHANNELS. Set the value to a comma-separated string of integers, which map to the following release channel values: Stable (0), Beta (1), Dev (2), and Canary (3). For example, the values "0,2" and "2,0" indicate that environment creation should only search for Dev channel and the WebView2 Runtime, using the order indicated by . Environment creation attempts to interpret each integer and treats any invalid entry as Stable channel. + + + + ReleaseChannels + Channel Search Kind: Most Stable (default) + Channel Search Kind: Least Stable + + + CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta + Beta -> WebView2 Runtime + + + CoreWebView2ReleaseChannels.Canary | CoreWebView2ReleaseChannels.Dev | CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta -> Dev -> Canary + Canary -> Dev -> Beta -> WebView2 Runtime + + + CoreWebView2ReleaseChannels.Canary + Canary + Canary + + + CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Canary | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta -> Canary + Canary -> Beta -> WebView2 Runtime + + + + + + + Set ScrollBar style to be used. + + + The default is CoreWebView2ScrollbarStyle.Default which specifies the default browser ScrollBar style. CSS styles that modify the ScrollBar applied on top of native ScrollBar styling that is selected with CoreWebView2ScrollbarStyle. + + + + + CoreWebView2Frame provides direct access to the iframes information and handling. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + + + Adds the provided host object to script running in the WebViewFrame with the specified name for the list of the specified origins. + The host object will be accessible for this iframe only if the iframe's origin during + access matches one of the origins which are passed. The provided origins + will be normalized before comparing to the origin of the document. + So the scheme name is made lower case, the host will be punycode decoded + as appropriate, default port values will be removed, and so on. + This means the origin's host may be punycode encoded or not and will match + regardless. If list contains malformed origin the call will fail. + The method can be called multiple times in a row without calling + RemoveHostObjectFromScript for the same object name. It will replace + the previous object with the new object and new list of origins. + List of origins will be treated as following: + 1. empty list - call will succeed and object will be added for the iframe + but it will not be exposed to any origin; + 2. list with origins - during access to host object from iframe the + origin will be checked that it belongs to this list; + 3. list with "*" element - host object will be available for iframe for + all origins. We suggest not to use this feature without understanding + security implications of giving access to host object from from iframes + with unknown origins. + 4. list with "file://" element - host object will be available for iframes + loaded via file protocol. + + + The name of the host object. + + + The host object to be added to script. + + + The list of the iframe origins for which host object will be accessible. + + + + + + The value of iframe's window.name property. The default value equals to iframe html tag declaring it. + + + + + NameChanged is raised when the iframe changes its window.name property. + + + + + + Destroyed event is raised when the iframe corresponding to this object is removed or the document containing that iframe is destroyed. + + + + + + Remove the host object specified by the name so that it is no longer accessible from JavaScript code in the iframe. + + + While new access attempts are denied, if the object is already obtained by JavaScript code in the iframe, the JavaScript code continues to have access to that object. Calling this method for a name that is already removed or was never added fails. If the iframe is destroyed this method will return fail also. + + + + + Check whether a frame is destroyed. Returns true during the event. + + + + + NavigationStarting is raised when the current frame is requesting permission to navigate to a different URI. + + + A frame navigation will raise a event and a event. All of the event handlers will be run before the event handlers. All of the event handlers share a common object. Whichever event handler is last to change the property will decide if the frame navigation will be cancelled. + Redirects raise this event as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + + + ContentLoading is raised before any content is loaded, including scripts added with . ContentLoading is not raised if a same page navigation occurs. + + + This operation follows the event and precedes the and events. + + + + + NavigationCompleted is raised when the current frame has completely loaded (body.onload has been raised) or loading stopped with error. + + + + + DOMContentLoaded is raised when the initial HTML document has been parsed. + + + This aligns with the the document's DOMContentLoaded event in HTML. + + + + + WebMessageReceived is raised when the setting is set and the iframe runs window.chrome.webview.postMessage. + + + The postMessage function is void postMessage(object) where object is any object supported by JSON conversion. + When postMessage is called, the handler's Invoke method will be called with the object parameter postMessage converted to a JSON string. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebMessageReceivedIFrame"::: + + + + + Runs JavaScript code from the javaScript parameter in the current frame. + + The JavaScript code to be run in the current frame. + A JSON encoded string that represents the result of running the provided JavaScript. + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. This method is applied asynchronously. + If the method is run before , the script will not be executed and the JSON null will be returned. + This operation works even if is set to false. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScriptFrame"::: + + + + + Posts the specified webMessageAsJson to the current frame. + + The web message to be posted to the iframe. + + The event args is an instance of MessageEvent. The setting must be true or the message will not be sent. The event arg's data property of the event arg is the webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. The event arg's source property of the event arg is a reference to the window.chrome.webview object. For information about sending messages from the iframe to the host, navigate to . The message is sent asynchronously. If a navigation occurs before the message is posted to the iframe, the message is not be sent. + + + Runs the message event of the window.chrome.webview of the iframe. JavaScript in that document may subscribe and unsubscribe to the event using the following code: + + window.chrome.webview.addEventListener('message', handler) + window.chrome.webview.removeEventListener('message', handler) + + + + + + + + + Posts a message that is a simple string rather than a JSON string representation of a JavaScript object. + + The web message to be posted to the iframe. + + This behaves in exactly the same manner as , but the data property of the event arg of the window.chrome.webview message is a string with the same value as webMessageAsString. Use this instead of if you want to communicate using simple strings rather than JSON objects. + + + + + + + PermissionRequested is raised when content in an iframe or any of its descendant iframes requests permission to access some privileged resources. + + + This relates to the PermissionRequested event on the CoreWebView2. + Both these events will be raised in the case of an iframe requesting permission. The CoreWebView2Frame's event handlers will be invoked before the event handlers on the CoreWebView2. If the Handled property of the PermissionRequestedEventArgs is set to TRUE within the CoreWebView2Frame event handler, then the event will not be raised on the CoreWebView2, and it's event handlers will not be invoked. + In the case of nested iframes, the PermissionRequested event will be raised from the top level iframe. + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + Share a shared buffer object with script of the iframe in the WebView. + + The object to be shared with script. + The desired given to script. + Additional data to be send to script. If it is not null or empty string, and it is not a valid JSON string, will be thrown. + + The script will receive a sharedbufferreceived event from chrome.webview. + The event arg for that event will have the following methods and properties. + + + + Property + Description + + + getBuffer() + A method that returns an ArrayBuffer object with the backing content from the shared buffer. + + + additionalData + An object as the result of parsing additionalDataAsJson as JSON string. This property will be undefined if additionalDataAsJson is nullptr or empty string. + + + source + With a value set as chrome.webview object. + + + + If access is , the script will only have read access to the buffer. + If the script tries to modify the content in a read only buffer, it will cause an access violation in WebView renderer process and crash the renderer process. + + If the shared buffer is already closed, the API throws with error code of RO_E_CLOSED. + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access to the shared buffer any more. + + The application can post the same shared buffer object to multiple web pages or iframes, or post to the same web page or iframe multiple times. + Each PostSharedBufferToScript will create a separate ArrayBuffer object with its own view of the memory and is separately released. + The underlying shared memory will be released when all the views are released. + + Sharing a buffer to script has security risk. You should only share buffer with trusted site. + If a buffer is shared to a untrusted site, possible sensitive information could be leaked. + If a buffer is shared as modifiable by the script and the script modifies it in an unexpected way, it could result in corrupted data that might even crash the application. + + The example code shows how to send data to script for one time read only consumption. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="OneTimeShareBuffer"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_2"::: + + + + + The unique identifier of the current frame. It's the same kind of ID as with the and . + + + + + ScreenCaptureStarting event is raised when the [Screen Capture API](https://www.w3.org/TR/screen-capture/) is requested by the user using getDisplayMedia(). + + + This relates to the ScreenCaptureStarting event on the CoreWebView2. + Both these events will be raised in the case of an iframe requesting screen capture. The CoreWebView2Frame's event handlers will be invoked before the event handlers on the CoreWebView2. If the Handled property of the ScreenCaptureStartingEventArgs is set to TRUE within the CoreWebView2Frame event handler, then the event will not be raised on the CoreWebView2, and it's event handlers will not be invoked. + In the case of nested iframes, the ScreenCaptureStarting event will be raised from the top level iframe. + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + + Iterator for a collection of HTTP headers. + + + + + + + + + + No COM support; throws instead. + + + No COM support. + + + + + + + + Gets the header in the + or collection at the + current position of the enumerator. + + + + + + true when the iterator has not run out of headers. + + + If the collection over which the iterator is iterating is empty or if the iterator has gone past the end of the collection then this is false. + + + + + HTTP request headers. + + + Used to inspect the HTTP request on event and event. It is possible to modify the HTTP request headers from a event, but not from a event. + + + + + + + + + + + + + Returns an enumerator that iterates through the or collection. + + + + + Gets the header value matching the name. + + The header value matching the name. + + + + Gets the header value matching the name using a . + + The header value matching the name. + + + + Checks whether the headers contain an entry that matches the header name. + + Whether the headers contain an entry that matches the header name. + + + + Adds or updates header that matches the name. + + + + + Removes header that matches the name. + + + + + Gets a over the collection of request headers. + + + + + HTTP response headers. + + + Used to construct a for the event. + + + + + + + + + + + Returns an enumerator that iterates through the or collection. + + + + + Appends header line with name and value. + + The header name to be appended. + The header value to be appended. + + + + Checks whether this CoreWebView2HttpResponseHeaders contain entries matching the header name. + + The name of the header to seek. + + + + Gets the first header value in the collection matching the name. + + The header name. + The first header value in the collection matching the name. + + + + Gets the header values matching the name. + + The header name. + + + + Gets a over the collection of entire . + + + + + Event args for the CoreWebView2InitializationCompleted event. + + + + + Initializes a new instance of the CoreWebView2InitializationCompletedEventArgs class. + + + Exception that occurred during initialization, or null if initialization was successful. + + + + + True if the init task completed successfully. + + + + + The exception thrown from the init task. If the task completed successfully, this property is null. + + + + + An object that represents a [HTML Notification object](https://developer.mozilla.org/docs/Web/API/Notification). + + + + + Specifies the time at which a notification is created or applicable + (past, present, or future). + + + + + Gets the vibration pattern for devices with vibration hardware to emit. + + + The vibration pattern can be represented by an array of 64-bit + unsigned integers describing a pattern of vibrations and pauses. See + [Vibration API](https://developer.mozilla.org/docs/Web/API/Vibration_API) for + more information. This corresponds to + [Notification.vibrate](https://developer.mozilla.org/docs/Web/API/Notification/vibrate) + DOM API. An empty list is returned if no vibration patterns are + specified. + + + + + A string representing the body text of the notification. + + + The default value is an empty string. + + + + + The text direction in which to display the notification. + + + This corresponds to [Notification.dir](https://developer.mozilla.org/docs/Web/API/Notification/dir) DOM API. The default value is . + + + + + The notification's language, as intended to be specified using a string representing a language tag (such as en-US) according to [BCP47](https://datatracker.ietf.org/doc/html/rfc5646). + + + Note that no validation is performed on this property and it can be any string the notification sender specifies. This corresponds to [Notification.lang](https://developer.mozilla.org/docs/Web/API/Notification/lang) DOM API. The default value is an empty string. + + + + + A string representing an identifying tag for the notification. + + + This corresponds to [Notification.tag](https://developer.mozilla.org/docs/Web/API/Notification/tag) DOM API. The default value is an empty string. + + + + + A string containing the URI of an icon to be displayed in the notification. + + + The default value is an empty string. + + + + + The title of the notification. + + + + + A string containing the URI of the image used to represent the notification when there isn't enough space to display the notification itself. + + + The default value is an empty string. + + + + + A string containing the URI of an image to be displayed in the notification. + + + The default value is an empty string. + + + + + Indicates whether the user should be notified after a new notification replaces an old one. + + + This corresponds to [Notification.renotify](https://developer.mozilla.org/docs/Web/API/Notification/renotify) DOM API. The default value is false. + + + + + A boolean value indicating that a notification should remain active until the user clicks or dismisses it, rather than closing automatically. + + + This corresponds to [Notification.requireInteraction](https://developer.mozilla.org/docs/Web/API/Notification/requireInteraction) DOM API. Note that you may not be able to necessarily implement this due to native API limitations. The default value is false. + + + + + Indicates whether the notification should be silent -- i.e., no sounds or vibrations should be issued, regardless of the device settings. + + + This corresponds to [Notification.silent](https://developer.mozilla.org/docs/Web/API/Notification/silent) DOM API. The default value is false. + + + + + This event is raised when the notification is closed by the web code, such as through notification.close(). + + + You don't need to call since this is coming from the web code. + + + + + The host may run this to report the notification has been displayed and it will cause the [show](https://developer.mozilla.org/docs/Web/API/Notification/show_event) event to be raised for non-persistent notifications. + + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false when this is called. + + + + + The host may run this to report the notification has been clicked, and it will cause the [click](https://developer.mozilla.org/docs/Web/API/Notification/click_event) event to be raised for non-persistent notifications. + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false or has not been run when this is called. + + + + The host may run this to report the notification was dismissed, and it will cause the [close](https://developer.mozilla.org/docs/Web/API/Notification/close_event) event to be raised for non-persistent notifications. + + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false or has not been run when this is called. + + + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + + + Clear the browsing data for the specified dataKinds between the + startTime and endTime. Overload the ClearBrowsingDataAsync method to + allow for additional time parameters. + + + + + Clear the entirety of the browsing data associated with the profile + it is called on. It clears the data regardless of timestamp. + + + + + The name of the profile. + + + + + InPrivate mode is enabled or not. + + + + + Full path of the profile directory. + + + + + The default download folder path. + + + The default value is the system default download folder path for the user. The default download folder path is persisted in the user data folder across sessions. The value should be an absolute path to a folder that the user and application can write to. Throws an exception if the value is invalid, and the default download path is not changed. Otherwise the path is changed immediately. If the directory does not yet exist, it is created at the time of the next download. If the host application does not have permission to create the directory, then the user is prompted to provide a new path through the Save As dialog. The user can override the default download folder path for a given download by choosing a different path in the Save As dialog. + + + + + The PreferredColorScheme property sets the overall color scheme of the WebView2s associated with this profile. + + + This sets the color scheme for WebView2 UI like dialogs, prompts, and menus by setting the media feature prefers-color-scheme. + The default value for this is , which will follow whatever color scheme the OS is currently set to. + + + + + Clear the browsing data of the associated profile. + + + Clears browsing data on the profile the method is called on. Additional optional parameters include the start time and end time to clear the browsing data between as well as the data specific data kinds to clear on the profile. The method may be overloaded to take: + + + No parameters - in which the entirety of the data on the profile will be cleared. + + + The data kind(s) - in which the data kind(s) will be cleared for their entirety. + + + The data kind(s), start time, and end time - in which the data kind(s) will be cleared between the start and end time. The start time will be offset by -1.0 and the end time will be offset by +1.0 to include the last fractional second on each respective end. The start time is inclusive in the time period while the end time is exclusive. + + + + The exposed methods are as follows: + + ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds dataKinds); + ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds dataKinds, DateTime startTime, DateTime endTime); + ClearBrowsingDataAsync(); + + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClearBrowsingData"::: + + + + + The PreferredTrackingPreventionLevel property allows you to control levels of tracking prevention for WebView2 which are associated with a profile. This level would apply to the context of the profile. That is, all WebView2s sharing the same profile will be affected and also the value is persisted in the user data folder. + + + See for descriptions of levels. + + If tracking prevention feature is enabled when creating the WebView2 environment, you can also disable tracking prevention later using this property and value but that doesn't improves runtime performance. + + There is property to enable/disable tracking prevention feature for all the WebView2's created in the same environment. If enabled, PreferredTrackingPreventionLevel is set to by default for all the WebView2's and profiles created in the same environment or is set to the level whatever value was last changed/persisted to the profile. If disabled PreferredTrackingPreventionLevel is not respected by WebView2. If PreferredTrackingPreventionLevel is set when the feature is disabled, the property value get changed and persisted but it will takes effect only if is true. + + See for more details. + + + + + Sets permission state for the given permission kind and origin asynchronously. + + + The state change persists across sessions until it is changed by another call to SetPermissionState, or by setting the State property in PermissionRequestedEventArgs. Setting the state to will erase any state saved in the profile and restore the default behavior. The origin should have a valid scheme and host (e.g. "https://www.example.com"), otherwise the method fails. Additional URI parts like path and fragment are ignored. For example, "https://wwww.example.com/app1/index.html/" is treated the same as "https://wwww.example.com". See the [MDN origin definition](https://developer.mozilla.org/docs/Glossary/Origin) for more details. + + + + + Invokes the handler with a collection of all nondefault permission settings. + + + Use this method to get the permission state set in the current and previous sessions. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetNonDefaultPermissionSettings"::: + + + + + Get the which Creates, adds or updates, gets, or or view the cookies for the current profile. + + + All CoreWebView2s associated with this profile share the same cookie values. Changes to cookies in this cookie manager apply to all CoreWebView2s associated with this profile. + + + + + + Determines whether password information will be autosaved. + + + When disabled, no new password data is saved and no Save/Update Password prompts are displayed. However, if there was password data already saved before disabling this setting, then that password information is auto-populated, suggestions are shown and clicking on one will populate the fields. + When enabled, password information is auto-populated, suggestions are shown and clicking on one will populate the fields, new data is saved, and a Save/Update Password prompt is displayed. The default value is false. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + + + Determines whether general form information will be saved and autofilled. + + + General autofill information includes information like names, street and email addresses, phone numbers, and arbitrary input. This excludes password information. When disabled, no suggestions appear, and no new information is saved. + When enabled, information is saved, suggestions appear, and clicking on one will populate the form fields. The default value is true. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + + + Add a browser extension to the current user profile from extensionFolderPath. + + The manifest.json folder path. + + See for descriptions of browser extensions. + + Adds the [browser extension](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions) using the extension path for unpacked extensions from the local device. Extension is running right after installation. + The extension folder path is the topmost folder of an unpacked browser extension and contains the browser extension manifest file. + If the extensionFolderPath is an invalid path or doesn't contain the extension manifest.json file, this function will return ERROR_FILE_NOT_FOUND to callers. + Installed extension will default to true. When is false, AddBrowserExtension will fail and return HRESULT ERROR_NOT_SUPPORTED. + During installation, the content of the extension is not copied to the user data folder. Once the extension is installed, changing the content of the extension will cause the extension to be removed from the installed profile. + When an extension is added the extension is persisted in the corresponding profile. The extension will still be installed the next time you use this profile. + When an extension is installed from a folder path, adding the same extension from the same folder path means reinstalleing this extension. When two extensions with the same Id are installed, only the later installed extension will be kept. + The following summarizes the possible error values that can be returned from AddBrowserExtension and a description of why these errors occur. + + + + Error value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + Extensions are disabled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Cannot find manifest.json file or it is not a valid extension manifest. + + + E_ACCESSDENIED + Cannot load extension with file or directory name starting with _, reserved for use by the system. + + + E_FAIL + Extension failed to install with other unknown reasons. + + + + + + + + Gets a snapshot of the set of extensions on current user profile. + + + See for descriptions of browser extensions. + + Gets a snapshot of the set of extensions installed at the time GetBrowserExtensions is called. If an extension is installed or uninstalled after GetBrowserExtensions completes, the list returned by GetBrowserExtensions remains the same. When AreBrowserExtensionsEnabled is false, GetBrowserExtensions won't return any extensions on current user profile. + + + + + Raised when profile is marked for deletion. + + + When this event is raised, the CoreWebView2Profile and its corresponding CoreWebView2s have been closed, and cannot be used anymore. + + + + + Delete this profile and close the corresponding s. + + + After the API is called, the profile will be marked for deletion. The local profile's directory will be deleted at browser process exit. If it fails to delete, because something else is holding the files open, WebView2 will try to delete the profile at all future browser process starts until successful. The corresponding CoreWebView2s will be closed and the event will be raised. See for more information. If you try to create a new profile with the same name as an existing profile that has been marked as deleted but hasn't yet been deleted, profile creation will fail with HRESULT_FROM_WIN32(ERROR_DELETE_PENDING). + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the URI of the document that sent this web message. + + + + + Gets the message posted from the WebView content to the host converted to a JSON string. + + + Run this operation to communicate using JavaScript objects. + + + For example, the following postMessage runs result in the following WebMessageAsJson values: + + + postMessage({'a': 'b'}) "{\"a\": \"b\"}" + postMessage(1.2) "1.2" + postMessage('example') "\"example\"" + + + + + + Gets the message posted from the WebView content to the host as a string. + + The message posted from the WebView content to the host. + The message posted is some other kind of JavaScript type. + + Run this operation to communicate using simple strings. + + + For example the following postMessage runs result in the following values returned by TryWebMessageAsString: + + + postMessage({'a': 'b'}) ArgumentException + postMessage(1.2) ArgumentException + postMessage('example') "example" + + + + + + Additional received WebMessage objects. + + + To pass AdditionalObjects via WebMessage to the app, use the chrome.webview.postMessageWithAdditionalObjects content API. Any DOM object type that can be natively representable that has been passed in to additionalObjects parameter will be accessible here. Currently a WebMessage object can be the type. + Entries in the collection can be nullptr if null or undefined was passed. Cast the object to the native type to access its specific properties. + + object additionalObject = eventArgs.AdditionalObjects[0]; + if (additionalObject is CoreWebView2File) + { + CoreWebView2File file = additionalObject as CoreWebView2File; + } else if ... + + + + + + This is used to complete deferrals on event args that support getting deferrals using the GetDeferral method. This class implements . + + + + + + + + + Protected implementation of Dispose pattern. + + + + + Completes the associated deferred event. + + + Complete should only be run once for each deferral taken. + + + + + This class is deprecated; use CoreWebView2PrivateHostObjectHelper instead. + + + + + A shared memory based buffer object that is created by . The object is presented to script as ArrayBuffer when posted to script with . + + + + + + + + Protected implementation of Dispose pattern. + + + + + The file mapping handle of the shared memory of the buffer. + + + Normal app should use to + get a stream object to access the buffer. + For advanced scenarios, you could use native file mapping APIs to obtain + other views or duplicate this handle to another application process and + create a view from the duplicated handle in that process to access the buffer + from that separate process. + + + + + The size of the shared buffer in bytes. + + + + + The raw memory address of the buffer. + + + You can cast it to pointer to real data types like byte* to access the memory from unsafe code region. + Normal app should use to get a stream object to access the buffer. + + + + + Get an stream object that can be used to access the shared buffer. + + + + + Release the backing shared memory. + + + The application should call Close or when no access to the buffer is needed any more, to ensure that the underlying resources are released timely even if the shared buffer object itself is not released due to some leaked reference. + After the shared buffer is closed, the buffer address and file mapping handle previously obtained becomes invalid and cannot be used anymore. + Properties of the object will also be unaccessible. Operations like Read or Write on the stream objects returned from will also fail. + will also fail. The failures will be represented as with error code of RO_E_CLOSED. + + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access the shared buffer any more. + When script tries to access the buffer after calling chrome.webview.releaseBuffer, JavaScript TypeError exception will be raised complaining about accessing a detached ArrayBuffer, the same exception when trying to access a transferred ArrayBuffer. + + Closing the buffer object on native side doesn't impact access from Script and releasing the buffer from script doesn't impact access to the buffer from native side. The underlying shared memory will be released by the OS when both native and script side release the buffer. + + + + + Constructor + + + + + Read at most bufferSize bytes into buffer and return the effective + number of bytes read in bytesReadPtr (unless null). + + + mscorlib disassembly shows the following MarshalAs parameters + void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pv, int cb, IntPtr pcbRead); + This means marshaling code will have found the size of the array buffer in the parameter bufferSize. + + + Critical: calls Marshal.WriteInt32 which LinkDemands, takes pointers as input + + + + + Move the stream pointer to the specified position. + + + System.IO.stream supports searching past the end of the stream, like + OLE streams. + newPositionPtr is not an out parameter because the method is required + to accept NULL pointers. + + + Critical: calls Marshal.WriteInt64 which LinkDemands, takes pointers as input + + + + + Sets stream's size. + + + + + Obtain stream stats. + + + STATSG has to be qualified because it is defined both in System.Runtime.InteropServices and + System.Runtime.InteropServices.ComTypes. + The STATSTG structure is shared by streams, storages and byte arrays. Members irrelevant to streams + or not available from System.IO.Stream are not returned, which leaves only cbSize and grfMode as + meaningful and available pieces of information. + grfStatFlag is used to indicate whether the stream name should be returned and is ignored because + this information is unavailable. + + + + + Write at most bufferSize bytes from buffer. + + + Critical: calls Marshal.WriteInt32 which LinkDemands, takes pointers as input + + + + + Create a clone. + + + Not implemented. + + + + + Read at most bufferSize bytes from the receiver and write them to targetStream. + + + Not implemented. + + + + + Commit changes. + + + Only relevant to transacted streams. + + + + + Lock at most byteCount bytes starting at offset. + + + Not supported by System.IO.Stream. + + + + + Undo writes performed since last Commit. + + + Relevant only to transacted streams. + + + + + Unlock the specified region. + + + Not supported by System.IO.Stream. + + + + + The exception that is thrown when an WebView2 Runtime installation is missing. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a specified error message. + + + The error message that explains the reason for the exception. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a reference to the inner exception that is the cause of this exception. + + + The exception that is the cause of the current exception. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a specified error message and a reference to the inner exception that is the cause of this exception. + + + The error message that explains the reason for the exception. + + + The exception that is the cause of the current exception. + + + + + + + + + + + + + + + + + Specifies the source of . + + + + + + + + Indicates that web resource is requested from main page including dedicated workers, iframes and main script for shared workers. + + + + + Indicates that web resource is requested from shared worker. + + + + + Indicates that web resource is requested from service worker. + + + + + Indicates that web resource is requested from any supported source. + + + + + Specifies the web resource request contexts. + + + + + Specifies all resources. + + + + + Specifies a document resources. + + + + + Specifies a CSS resources. + + + + + Specifies an image resources. + + + + + Specifies another media resource such as a video. + + + + + Specifies a font resource. + + + + + Specifies a script resource. + + + + + Specifies an XML HTTP request, Fetch and EventSource HTTP communication. + + + + + Specifies a Fetch API communication. + + + Note that this isn't working. Fetch API requests are fired as a part + of COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST. + + + + Specifies a TextTrack resource. + + + + + Specifies an EventSource API communication. + + + Note that this isn't working. EventSource API requests are fired as a part + of COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST. + + + + Specifies a WebSocket API communication. + + + + + Specifies a Web App Manifest. + + + + + Specifies a Signed HTTP Exchange. + + + + + Specifies a Ping request. + + + + + Specifies a CSP Violation Report. + + + + + Specifies an other resource. + + + + + Indicates the error status values for web navigations. + + + + + Indicates that an unknown error occurred. + + + + + Indicates that the SSL certificate common name does not match the web address. + + + + + Indicates that the SSL certificate has expired. + + + + + Indicates that the SSL client certificate contains errors. + + + + + Indicates that the SSL certificate has been revoked. + + + + + Indicates that the SSL certificate is not valid. The certificate may not match the public key pins for the host name, the certificate is signed by an untrusted authority or using a weak sign algorithm, the certificate claimed DNS names violate name constraints, the certificate contains a weak key, the validity period of the certificate is too long, lack of revocation information or revocation mechanism, non-unique host name, lack of certificate transparency information, or the certificate is chained to a [legacy Symantec root](https://security.googleblog.com/2018/03/distrust-of-symantec-pki-immediate.html). + + + + + Indicates that the host is unreachable. + + + + + Indicates that the connection has timed out. + + + + + Indicates that the server returned an invalid or unrecognized response. + + + + + Indicates that the connection was stopped. + + + + + Indicates that the connection was reset. + + + + + Indicates that the Internet connection has been lost. + + + + + Indicates that a connection to the destination was not established. + + + + + Indicates that the provided host name was not able to be resolved. + + + + + Indicates that the operation was canceled. This status code is also used when the app cancels a navigation via event, and for original navigation if the app navigates the WebView2 in a rapid succession away after the load for original navigation commenced, but before it completed. + + + + + Indicates that the request redirect failed. + + + + + An unexpected error occurred. + + + + + Indicates that user is prompted with a login, waiting on user action. Initial navigation to a login site will always return this even if app provides credential using . HTTP response status code in this case is 401. See [status code reference](https://developer.mozilla.org/docs/Web/HTTP/Status). + + + + + Indicates that user lacks proper authentication credentials for a proxy server. HTTP response status code in this case is 407. See [status code reference](https://developer.mozilla.org/docs/Web/HTTP/Status). + + + + + Tracking prevention levels. + + + + + Tracking prevention is turned off. + + + + + The least restrictive level of tracking prevention. Set to this level to protect against malicious trackers but allows most other trackers and personalize content and ads. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + The default level of tracking prevention. Set to this level to protect against social media tracking on top of malicious trackers. Content and ads will likely be less personalized. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + The most restrictive level of tracking prevention. Set to this level to protect against malicious trackers and most trackers across sites. Content and ads will likely have minimal personalization. This level blocks the most trackers but could cause some websites to not behave as expected. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + Indicates the text direction of the notification. + + + + + Indicates that the notification text direction adopts the browser's language setting behavior. + + + + + Indicates that the notification text is left-to-right. + + + + + Indicates that the notification text is right-to-left. + + + + + Specifies the desired access from script to . + + + + + Script from web page only has read access to the shared buffer. + + + + + Script from web page has read and write access to the shared buffer. + + + + + Specifies the action type when server certificate error is detected to be used in the . + + + + + Indicates to ignore the warning and continue the request with the TLS certificate. This decision is cached for the RequestUri's host and the server certificate in the session. + + + + + Indicates to reject the certificate and cancel the request. + + + + + Indicates to display the default TLS interstitial error page to user for page navigations. For others TLS certificate is rejected and the request is cancelled. + + + + + The ScrollBar style being set during environment creation. + + + + + Browser default ScrollBar style + + + + + Window style fluent overlay scroll bar. Please see [Fluent UI](https://developer.microsoft.com/fluentui#/) for more details on fluent UI. + + + + + Specifies the JavaScript dialog kind used in . + + + + + Indicates that the dialog uses window.alert JavaScript function. + + + + + Indicates that the dialog uses window.confirm JavaScript function. + + + + + Indicates that the dialog uses window.prompt JavaScript function. + + + + + Indicates that the dialog uses window.beforeunload JavaScript event. + + + + + + Status of a programmatic Save As call. Indicates the result of the method. + + + + + The `ShowSaveAsUIAsync` method call completed successfully. By default, the system Save As dialog opens. If is set to `TRUE`, the system dialog is skipped and the download is started. + + + + + Could not perform Save As because the destination file path is an invalid path. The path is invalid when it is empty, a relative path, or a directory, or when the parent path does not exist. + + + + + Could not perform Save As because the destination file path already exists and replacing files was not allowed by the property. + + + + + Could not perform Save As because the `Kind` property selection is not supported due to content MIME type or system limits. See for MIME type limits. System limits include when the `HtmlOnly` kind is selected for an error page at child mode, or when the `Complete` kind is selected and the WebView is running in an App Container. + + + + + Did not perform Save As because the end user cancelled or the was set to `TRUE`. + + + + + Specifies selection options. + + + For HTML documents, we support 3 Save As kinds: HtmlOnly, SingleFile and Complete. For non-HTML documents, you must use Default. MIME types of `text/html` and `application/xhtml+xml` are considered HTML documents. + + + + + Default kind to save non-HTML content. If this kind is selected for an HTML page, the behavior is the same as the `HtmlOnly` kind. + + + + + Save the page as HTML. Only the top-level document is saved, excluding subresources. + + + + + Save the page as [MHTML](https://en.wikipedia.org/wiki/MHTML). + + + + + Save the page as HTML and download the page-related source files (for example: CSS, JavaScript, images, etc.) in a directory with the same filename prefix. + + + + + + Specifies the WebView2 release channel. + + + Use ReleaseChannels and ChannelSearchKind on CoreWebView2EnvironmentOptions to control which channel the WebView2 loader searches for. + + + + Channel + Primary purpose + How often updated with new features + + + Stable (WebView2 Runtime) + Broad Deployment + Monthly + + + Beta + Flighting with inner rings, automated testing + Monthly + + + Dev + Automated testing, selfhosting to test new APIs and features + Weekly + + + Canary + Automated testing, selfhosting to test new APIs and features + Daily + + + + + + + No release channel. ReleaseChannels will be ignored if only this value is passed. + + + + + The stable WebView2 Runtime that is released every 4 weeks. + + + + + The Beta release channel that is released every 4 weeks, a week before the stable release. + + + + + The Dev release channel that is released weekly. + + + + + The Canary release channel that is released daily. + + + + + Specifies the process kind used in . + + + The values in this enum make reference to the process kinds in the Chromium architecture. For more information about what these processes are and what they do, see [Browser Architecture - Inside look at modern web browser](https://developers.google.com/web/updates/2018/09/inside-browser-part1). + + + + + Indicates that the process is browser process. + + + + + Indicates that the process is render process. + + + + + Indicates that the process is utility process. + + + + + Indicates that the process is sandbox helper process. + + + + + Indicates that the process is Gpu process. + + + + + Indicates that the process is ppapi plugin process. + + + + + Indicates that the process is ppapi broker process. + + + + + Specifies the process failure reason used in . For process failures where a process has exited, it indicates the type of issue that produced the process exit. + + + + + Indicates that an unexpected process failure occurred. + + + + + Indicates that the process became unresponsive. This only applies to the main frame's render process. + + + + + Indicates that the process was terminated. For example, from Task Manager. + + + + + Indicates that the process crashed. Most crashes will generate dumps in the location indicated by . + + + + + Indicates that the process failed to launch. + + + + + Indicates that the process died due to running out of memory. + + + + + Deprecated. This value is unused. + + + + + Specifies the process failure kind used in . The values in this enum make reference to the process kinds in the Chromium architecture. For more information about what these processes are and what they do, see [Browser Architecture - Inside look at modern web browser](https://developers.google.com/web/updates/2018/09/inside-browser-part1). + + + + + Indicates that the browser process ended unexpectedly. The WebView automatically moves to the Closed state. The app has to recreate a new WebView to recover from this failure. + + + + + Indicates that the main frame's render process ended unexpectedly. Any subframes in the WebView will be gone too. A new render process is created automatically and navigated to an error page. You can use the method to try to recover from this failure. Alternatively, you can use and recreate the WebView. + + + + + Indicates that the main frame's render process is unresponsive. + + Renderer process unresponsiveness can happen for the following reasons: + + + + + There is a long-running script being executed. For example, the web content in your WebView might be performing a synchronous XHR, or have entered an infinite loop. + + + + + The system is busy. + + + + + The ProcessFailed event will continue to be raised every few seconds until the renderer procees has become responsive again. The application can consider taking action if the event keeps being raised. For example, the application might show UI for the user to decide to keep waiting or reload the page, or navigate away. + + + + Indicates that a frame-only render process ended unexpectedly. The process exit does not affect the top-level document, only a subset of the subframes within it. The content in these frames is replaced with an error page in the frame. Your application can communicate with the main frame to recover content in the impacted frames, using to get information about the impacted frames. + + + + + Indicates that a utility process ended unexpectedly. The failed process is recreated automatically. Your application does not need to handle recovery for this event, but can use to collect information about the failure, including ProcessDescription. + + + + + Indicates that a sandbox helper process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that the GPU process ended unexpectedly. The failed process is recreated automatically. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that a PPAPI plugin process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure, including ProcessDescription. + + + + + Indicates that a PPAPI plugin broker process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that a process of unspecified kind ended unexpectedly. Your application can use to collect information about the failure. + + + + + Indicates the status for printing. + + + + + Indicates that the print operation is succeeded. + + + + + Indicates that the printer is not available. + + + + + Indicates that the print operation is failed. + + + + + The orientation for printing, used by the property. + + + + + Print the page(s) in portrait orientation. + + + + + Print the page(s) in landscape orientation. + + + + + Specifies the media size for a print. + + + + + The default media size for a printer. + + + + + Indicate custom media size that is specific to the printer. + + + + + Specifies the duplex option for a print. + + + + + The default duplex for a printer. + + + + + Print on only one side of the sheet. + + + + + Print on both sides of the sheet, flipped along the long edge. + + + + + Print on both sides of the sheet, flipped along the short edge. + + + + + Specifies the print dialog kind. + + + + + Opens the browser print preview dialog. + + + + + Opens the system print dialog. + + + + + Specifies the color mode for a print. + + + + + The default color mode for a printer. + + + + + Indicate that the printed output will be in color. + + + + + Indicate that the printed output will be in shades of gray. + + + + + Specifies the collation for a print. + + + + + The default collation for a printer. + + + + + Indicate that the collation has been selected for the printed output. + + + + + Indicate that the collation has not been selected for the printed output. + + + + + Preferred color scheme for WebView2's associated with a profile. + + + + + Auto color scheme. + + + + + Light color scheme. + + + + + Dark color scheme. + + + + + Pointer event kind used by to convey the kind of pointer event being sent to WebView. + + + + + Corresponds to WM_POINTERACTIVATE. + + + + + Corresponds to WM_POINTERDOWN. + + + + + Corresponds to WM_POINTERENTER. + + + + + Corresponds to WM_POINTERLEAVE. + + + + + Corresponds to WM_POINTERUP. + + + + + Corresponds to WM_POINTERUPDATE. + + + + + Specifies the response to a permission request. + + + + + Specifies that the default browser behavior is used, which normally prompts users for decision. + + + + + Specifies that the permission request is granted. + + + + + Specifies that the permission request is denied. + + + + + Indicates the kind of a permission request. + + + + + Indicates an unknown permission. + + + + + Indicates permission to capture audio. + + + + + Indicates permission to capture video. + + + + + Indicates permission to access geolocation. + + + + + Indicates permission to send web notifications. Apps that would like to show notifications should handle and/or events and no browser permission prompt will be shown for notification requests. Note that push notifications are currently unavailable in WebView2. + + + + + Indicates permission to access generic sensor. Generic Sensor covers ambient-light-sensor, accelerometer, gyroscope, and magnetometer. + + + + + Indicates permission to read the system clipboard without a user gesture. + + + + + Indicates permission to automatically download multiple files. Permission is requested when multiple downloads are triggered in quick succession. + + + + + Indicates permission to read and write to files or folders on the device. Permission is requested when developers use the [File System Access API](https://developer.mozilla.org/docs/Web/API/File_System_Access_API) to show the file or folder picker to the end user, and then request "readwrite" permission for the user's selection. + + + + + Indicates permission to play audio and video automatically on sites. This permission affects the autoplay attribute and play method of the audio and video HTML elements, and the start method of the Web Audio API. See the [Autoplay guide for media and Web Audio APIs](https://developer.mozilla.org/docs/Web/Media/Autoplay_guide) for details. + + + + + Indicates permission to use fonts on the device. Permission is requested when developers use the [Local Font Access API](https://wicg.github.io/local-font-access/) to query the system fonts available for styling web content. + + + + + Indicates permission to send and receive system exclusive messages to/from MIDI (Musical Instrument Digital Interface) devices. Permission is requested when developers use the [Web MIDI API](https://developer.mozilla.org/docs/Web/API/Web_MIDI_API) to request access to system exclusive MIDI messages. + + + + + Indicates permission to open and place windows on the screen. Permission is requested when developers use the [Multi-Screen Window Placement API](https://www.w3.org/TR/window-placement/) to get screen details. + + + + + Specifies the PDF toolbar item types used for the . + + + + + No item. By default the equal to this value. + + + + + The save button on PDF toolbar. + + + + + The print button on PDF toolbar. + + + + + The save as button on PDF toolbar. + + + + + The zoom in button on PDF toolbar. + + + + + The zoom out button on PDF toolbar. + + + + + The rotate button on PDF toolbar. + + + + + The fit to width button on PDF toolbar. + + + + + The page view button on PDF toolbar. + + + + + The contents button on PDF toolbar. + + + + + The page number button on PDF toolbar. + + + + + The search button on PDF toolbar. + + + + + The full screen button on PDF toolbar. + + + + + The setting and more button on PDF toolbar. + + + + + Enum which represents the kind of non-client regions. + + + + + Enum value which represents a region entirely outside the WebView2 window. + + + + + Enum value which represents the client area. + + + + + Enum value which represents the caption area. + + + + + Enum value which represents the minimize window control button. + + + + + Enum value which represents the maximize window control button. + + + + + Enum value which represents the close window control button. + + + + + Specifies the navigation kind of each navigation. + + + + + A navigation caused by CoreWebView2.Reload(), location.reload(), the end user using F5 or other UX, or other reload mechanisms to reload the current document without modifying the navigation history. + + + + + A navigation back or forward to a different entry in the session navigation history, like via CoreWebView2.Back(), location.back(), the end user pressing Alt+Left or other UX, or other mechanisms to navigate back or forward in the current session navigation history. + + + + + A navigation to another document, which can be caused by CoreWebView2.Navigate(),window.location.href = ..., or other WebView2 or DOM APIs that navigate to a new URI. + + + + + Specifies the reason for moving focus. + + + + + Specifies that the code is setting focus into WebView. + + + + + Specifies that the focus is moved due to Tab traversal forward. + + + + + Specifies that the focus is moved due to Tab traversal backward. + + + + + Mouse event virtual keys associated with a for . + + + + + No additional keys pressed. + + + + + Left mouse button is down, MK_LBUTTON. + + + + + Right mouse button is down, MK_RBUTTON. + + + + + Shift key is down, MK_SHIFT. + + + + + Ctrl key is down, MK_CONTROL. + + + + + Middle mouse button is down, MK_MBUTTON. + + + + + First X button is down, MK_XBUTTON1. + + + + + Second X button is down, MK_XBUTTON2. + + + + + Mouse event kind used by to convey the kind of mouse event being sent to WebView. + + + + + Mouse horizontal wheel scroll event, WM_MOUSEHWHEEL. + + + + + Left button double click mouse event, WM_LBUTTONDBLCLK. + + + + + Left button down mouse event, WM_LBUTTONDOWN. + + + + + Left button up mouse event, WM_LBUTTONUP. + + + + + Mouse leave event, WM_MOUSELEAVE. + + + + + Middle button double click mouse event, WM_MBUTTONDBLCLK. + + + + + Middle button down mouse event, WM_MBUTTONDOWN. + + + + + Middle button up mouse event, WM_MBUTTONUP. + + + + + Mouse move event, WM_MOUSEMOVE. + + + + + Right button double click mouse event, WM_RBUTTONDBLCLK. + + + + + Right button down mouse event, WM_RBUTTONDOWN. + + + + + Right button up mouse event, WM_RBUTTONUP. + + + + + Mouse wheel scroll event, WM_MOUSEWHEEL. + + + + + First or second X button double click mouse event, WM_XBUTTONDBLCLK. + + + + + First or second X button down mouse event, WM_XBUTTONDOWN. + + + + + First or second X button up mouse event, WM_XBUTTONUP. + + + + + R button down over non client area, WM_NCRBUTTONDOWN. + + + + + R button up over non client area, WM_NCRBUTTONUP. + + + + + Desired memory consumption level of a WebView. + + + + + Normal memory usage target level. + + + + + Low memory usage target level. Used for inactivate WebView for reduced memory consumption. + + + + + Specifies the key event kind that raises an event. + + + + + Specifies that the key event kind corresponds to window message WM_KEYDOWN. + + + + + Specifies that the key event kind corresponds to window message WM_KEYUP. + + + + + Specifies that the key event kind corresponds to window message WM_SYSKEYDOWN. + + + + + Specifies that the key event kind corresponds to window message WM_SYSKEYUP. + + + + + Kind of cross origin resource access allowed for host resources during download. + + + Note that other normal access checks like same origin DOM access check and [Content Security Policy](https://developer.mozilla.org/docs/Web/HTTP/CSP) still apply. + The following table illustrates the host resource cross origin access according to access context and CoreWebView2HostResourceAccessKind. + + + + Cross Origin Access Context + Deny + Allow + DenyCors + + + From DOM like src of img, script or iframe element + Deny + Allow + Allow + + + From Script like Fetch or XMLHttpRequest + Deny + Allow + Deny + + + + + + + All cross origin resource access is denied, including normal sub resource access as src of a script or image element. + + + + + All cross origin resource access is allowed, including accesses that are subject to Cross-Origin Resource Sharing(CORS) check. The behavior is similar to a web site sends back http header Access-Control-Allow-Origin: *. + + + + + Cross origin resource access is allowed for normal sub resource access like as src of a script or image element, while any access that subjects to CORS check will be denied. See [Cross-Origin Resource Sharing](https://developer.mozilla.org/docs/Web/HTTP/CORS) for more information. + + + + + Specifies the frame kind used in . + + + + + Indicates that the frame is an unknown type frame. We may extend this enum type to identify more frame kinds in the future. For example, if portal frame which current in experimental phase gets finalized, we may extend this to include a new frame kind `COREWEBVIEW2_FRAME_KIND_PORTAL`. + + + + + Indicates that the frame is a primary main frame(). + + + + + Indicates that the frame is an iframe. + + + + + Indicates that the frame is an [embed](https://developer.mozilla.org/docs/Web/HTML/Element/embed) element. + + + + + Indicates that the frame is an [object](https://developer.mozilla.org/docs/Web/HTML/Element/object) element. + + + + + Allowed permissions of as described in [FileSystemHandle.requestPermission()](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) + + + + + Read-only permission for FileSystemHandle + + + + + Read and write permissions for FileSystemHandle + + + + + Kind of CoreWebView2FileSystemHandle as described in [FileSystemHandle.kind](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/kind) + + + + + FileSystemHandle is for a file (i.e. [FileSystemFileHandle](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle)) + + + + + FileSystemHandle is for a directory (i.e. [FileSystemDirectoryHandle](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle)) + + + + + The requested format to get the Favicon from . + + + + + Request the Favicon to be retrieved a Png Format. + + + + + Request the Favicon to be retrieved a Jpeg Format. + + + + + The state of the . + + + + + The download is in progress. + + + + + The connection with the file host was broken. The reason why a download was interrupted can accessed from . See for descriptions of the different kinds of interrupt reasons. Host can check whether an interrupted download can be resumed with . Once resumed, the download state is in progress. + + + + + The download completed successfully. + + + + + The reason why the was interrupted. + + + + + No interrupt reason. + + + + + Generic file error. + + + + + Access denied due to security restrictions. + + + + + Disk full. User should free some space or choose a different location to store the file. + + + + + Result file path with file name is too long. + + + + + File is too large for file system. + + + + + Microsoft Defender Smartscreen detected a virus in the file. + + + + + File was in use, too many files opened, or out of memory. + + + + + File blocked by local policy. + + + + + Security check failed unexpectedly. Microsoft Defender SmartScreen could not scan this file. + + + + + Seeking past the end of a file in opening a file, as part of resuming an interrupted download. The file did not exist or was not as large as expected. Partially downloaded file was truncated or deleted, and download will be restarted automatically. + + + + + Partial file did not match the expected hash and was deleted. Download will be restarted automatically. + + + + + Generic network error. User can retry the download manually. + + + + + Network operation timed out. + + + + + Network connection lost. User can retry the download manually. + + + + + Server has gone down. User can retry the download manually. + + + + + Network request invalid because original or redirected URI is invalid, has an unsupported scheme, or is disallowed by network policy. + + + + + Generic server error. User can retry the download manually. + + + + + Server does not support range requests. + + + + + Server does not have the requested data. + + + + + Server did not authorize access to resource. + + + + + Server certificate problem. + + + + + Server access forbidden. + + + + + Unexpected server response. Responding server may not be intended server. User can retry the download manually. + + + + + Server sent fewer bytes than the Content-Length header. Content-Length header may be invalid or connection may have closed. Download is treated as complete unless there are [strong validators](https://tools.ietf.org/html/rfc7232#section-2) present to interrupt the download. + + + + + Unexpected cross-origin redirect. + + + + + User canceled the download. + + + + + User shut down the WebView. Resuming downloads that were interrupted during shutdown is not yet supported. + + + + + User paused the download. + + + + + WebView crashed. + + + + + The default download dialog can be aligned to any of the WebView corners by setting the property. The default position is top-right corner. + + + + + The top-left corner of the WebView. + + + + + The top-right corner of the WebView. + + + + + The bottom-left corner of the WebView. + + + + + The bottom-right corner of the WebView. + + + + + Kind of cookie SameSite status used in the class. + + + These fields match those as specified in https://developer.mozilla.org/docs/Web/HTTP/Cookies#. + Learn more about SameSite cookies here: https://tools.ietf.org/html/draft-west-first-party-cookies-07 + + + + + None SameSite type. No restrictions on cross-site requests. + + + + + Lax SameSite type. The cookie will be sent with "same-site" requests, and with "cross-site" top level navigation. + + + + + Strict SameSite type. The cookie will only be sent along with "same-site" requests. + + + + + Indicates the kind of context for which the context menu was created for the property. This enum will always represent the active element that caused the context menu request. If there is a selection with multiple images, audio and text, for example, the element that the end user right clicks on within this selection will be the option represented by this enum. + + + + + Indicates that the context menu was created for the page without any additional content. + + + + + Indicates that the context menu was created for an image element. + + + + + Indicates that the context menu was created for selected text. + + + + + Indicates that the context menu was created for an audio element. + + + + + Indicates that the context menu was created for a video element. + + + + + Specifies the menu item kind for the property. + + + + + Specifies a command menu item kind. + + + + + Specifies a check box menu item kind. objects of this kind will need the property to determine current state of the check box. + + + + + Specifies a radio button menu item kind. objects of this kind will need the property to determine current state of the radio button. + + + + + Specifies a separator menu item kind. objects of this kind are used to signal a visual separator with no functionality. + + + + + Specifies a submenu menu item kind. objects of this kind will contain a collection of its children objects. + + + + + The kind of the . + + + + + Specifies smart card certificate. + + + + + Specifies PIN certificate. + + + + + Specifies other certificate. + + + + + The order that release channels are searched for during environment creation. + + + The default behavior is to search for and use the most stable channel found on the device. The order from most to least stable is: WebView2 Runtime -> Beta -> Dev -> Canary. Switch the order to prefer the least stable channel in order to perform pre-release testing. See for descriptions of channels. + + + + + Search for a release channel from most to least stable: WebView2 Runtime -> Beta -> Dev -> Canary. This is the default behavior. + + + + + Search for a release channel from least to most stable: Canary -> Dev -> Beta -> WebView2 Runtime. + + + + + Specifies the image format for the method. + + + + + Indicates that the PNG image format is used. + + + + + Indicates that the JPEG image format is used. + + + + + Indicates the kind of browsing data to clear. Or operations can be applied to create a mask representing multiple CoreWebView2BrowsingDataKinds. The resulting mask may be passed to or to clear the corresponding data. + + + + + Specifies file systems data. + + + + + Specifies data stored by the IndexedDB DOM feature. + + + + + Specifies data stored by the localStorage DOM API. + + + + + Specifies data stored by the Web SQL database DOM API. + + + + + Specifies data stored by the CacheStorage DOM API. + + + + + Specifies DOM storage data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.FileSystems, CoreWebView2BrowsingDataKinds.IndexedDb, CoreWebView2BrowsingDataKinds.WebSql, CoreWebView2BrowsingDataKinds.ServiceWorkers, CoreWebView2BrowsingDataKinds.CacheStorage, and some other data kinds not listed yet to keep consistent with [DOM-accessible storage](https://www.w3.org/TR/clear-site-data/#storage). + + + + + Specifies HTTP cookies data. + + + + + Specifies all site data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.AllDomStorage and CoreWebView2BrowsingDataKinds.Cookies. New site data types may be added to this data kind in the future. + + + + + Specifies disk cache. + + + + + Specifies download history data. + + + + + Specifies general autofill form data. This excludes password information and includes information like: names, street and email addresses, phone numbers, and arbitrary input. This also includes payment data. + + + + + Specifies password autosave data. + + + + + Specifies browsing history data. + + + + + Specifies settings data. + + + + + Specifies profile data that should be wiped to make it look like a new profile. This does not delete account-scoped data like passwords but will remove access to account-scoped data by signing the user out. Specifies all profile data, now and future. New profile data types may be added to this data kind in the future. This browsing data kind is inclusive of , , , , , , . + + + + + Specifies service workers registered for an origin, and clear will result in termination and deregistration of them. + + + + + Specifies the browser process exit kind used in . + + + + + Indicates that the browser process ended normally. + + + + + Indicates that the browser process ended unexpectedly. A event will also be raised to listening WebViews from the associated to the failed process. + + + + + Mode for how the property is interpreted in relation to the property. + + + + + property represents raw pixels. Physical size of WebView is not impacted by . + + + + + property represents logical pixels and the property is used to get the physical size of the WebView. + + + + + Contains the information packed into the LPARAM sent to a Win32 key event. + + + For more information about WM_KEYDOWN, navigate to [WM_KEYDOWN message](/windows/win32/inputdev/wm-keydown). + + + + + Specifies the repeat count for the current message. + + + + + Specifies the scan code. + + + + + Indicates that the key is an extended key. + + + + + Indicates that a menu key is held down (context code). + + + + + Indicates that the key was held down. + + + + + Indicates that the key was released. + + + + + A value representing RGBA color (Red, Green, Blue, Alpha) for WebView2. + + + Each component takes a value from 0 to 255, with 0 being no intensity and 255 being the highest intensity. + + + + + Specifies the intensity of the Alpha ie. opacity value. 0 is transparent, 255 is opaque. + + + + + Specifies the intensity of the Red color. + + + + + Specifies the intensity of the Green color. + + + + + Specifies the intensity of the Blue color. + + + + + The window features for a WebView popup window. + + + The fields match the windowFeatures passed to window.open() as specified in [Window features](https://developer.mozilla.org/docs/Web/API/Window/open#Window_features) on MDN. There is no requirement for you to respect the values. If your app does not have corresponding UI features (for example, no toolbar) or if all instance of WebView are opened in tabs and do not have distinct size or positions, then your app does not respect the values. You may want to respect values, but perhaps only some apply to the UI of you app. Accordingly, you may respect all, some, or none of the properties as appropriate for your app. For all numeric properties, if the value that is passed to window.open() is outside the range of an uint, the resulting value is uint.MaxValue. If you are not able to parse the value an integer, it is considered 0. If the value is a floating point value, it is rounded down to an integer. + + + + + Indicates whether the left and top values are specified. + + + + + Indicates whether the height and width values are specified. + + + + + Gets the left position of the window. Ignored if is false. + + + + + Gets the top position of the window. Ignored if is false. + + + + + Gets the height of the window. Ignored if is false. + + + + + Gets the width of the window. Ignored if is false. + + + + + Indicates that the menu bar is displayed. + + + + + Indicates that the status bar is displayed. + + + + + Indicates that the browser toolbar is displayed. + + + + + Indicates that the scroll bars are displayed. + + + + + View of the HTTP representation for a web resource response. + + + The properties of this object are not mutable. This response view is used with the event. + + + + + Gets the HTTP response headers as received. + + + + + Gets the HTTP response status code. + + + + + Gets the HTTP response reason phrase. + + + + + Gets the response content stream asynchronously. + + The content failed to load. + + A null stream means no content was found. Note content (if any) for redirect responses is ignored. + This method returns null if content size is more than 123MB. If msWebView2EnableDownloadContentInWebResourceResponseReceived feature flag is disabled, for navigations that become downloads or if response is downloadable content type (e.g., application/octet-stream), this method also returns null. See event to handle the response or enable the feature flag. The Stream object that is returned will be thread-safe and as reads will be blocking while waiting for data to be available, it is recommended to read from a background thread. + If this method is being called again before a first call has completed, it will complete at the same time all prior calls do. + If this method is being called after a first call has completed, it will return immediately (asynchronously). + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebResourceResponseReceived"::: + + + + + Event args for the event. + + + + + Gets the request object for the web resource, as committed. + + + This includes headers added by the network stack that were not be included during the associated event, such as Authentication headers. Modifications to this object have no effect on how the request is processed as it has already been sent. + + + + + Gets view of the response object received for the web resource. + + + + + An HTTP response used with the event. + + + + + Gets HTTP response content as stream. + + + Stream must have all the content data available by the time the event deferral of this response is completed. Stream should be agile or be created from a background thread to prevent performance impact to the UI thread. null means no content data. + When providing the response data, you should consider relevant HTTP request headers just like an HTTP server would do. For example, if the request was for a video resource in a HTML video element, the request may contain the [Range](https://developer.mozilla.org/docs/Web/HTTP/Headers/Range) header to request only a part of the video that is streaming. In this case, your response stream should be only the portion of the video specified by the range HTTP request headers and you should set the appropriate [Content-Range](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Range) header in the response. + + + + + + Gets the overridden HTTP response headers. + + + + + Gets or sets the HTTP response status code. + + + + + Gets or sets the HTTP response reason phrase. + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the web resource request. + + + The request object may be missing some headers that are added by network stack at a later time. + + + + + Gets or sets the object. + + + If this object is set, the event will be completed with this Response. + An empty object can be created with and then modified to construct the Response. + + + + + Gets the web resource request context. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the event at a later time. + + + + + Gets the source of web resource request. + + + + + An HTTP request used with the event. + + + + + Gets or sets the request URI. + + + + + Gets or sets the HTTP request method. + + + + + Gets or sets the HTTP request message body as stream. + + + POST data should be here. If a stream is set, which overrides the message body, the stream must have all the content data available by the time the event deferral of this request is completed. Stream should be agile or be created from a background STA to prevent performance impact to the UI thread. null means no content data. + + + + + + Gets the mutable HTTP request headers. + + + + + Event args for the event. + + + + + true if the page being navigated to is a new document. + + + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + + + Determines whether running JavaScript is enabled in all future navigations in the WebView. + + + This only affects scripts in the document. Scripts injected with runs even if script is disabled. The default value is true. + + + + + Determines whether communication from the host to the top-level HTML document of the WebView is allowed. + + + This is used when loading a new HTML document. If set to true, communication from the host to the top-level HTML document of the WebView is allowed using , , and message event of window.chrome.webview. Communication from the top-level HTML document of the WebView to the host is allowed using window.chrome.webview.postMessage function and the event. If set to false, then communication is disallowed. and fail and window.chrome.webview.postMessage fails by throwing an instance of an Error object. The default value is true. + + + + + + + + Determines whether WebView renders the default JavaScript dialog box. + + + This is used when loading a new HTML document. If set to false, WebView does not render the default JavaScript dialog box (specifically those displayed by the JavaScript alert, confirm, prompt functions and beforeunload event). Instead, WebView raises event that contains all of the information for the dialog and allow the host app to show a custom UI. The default value is true. + + + + + + Determines whether the status bar is displayed. + + + The status bar is usually displayed in the lower left of the WebView and shows things such as the URI of a link when the user hovers over it and other information. The default value is true. The status bar UI can be altered by web content and should not be considered secure. + + + + + Determines whether the user is able to use the context menu or keyboard shortcuts to open the DevTools window. + + + The default value is true. + + + + + Determines whether the default context menus are shown to the user in WebView. + + + The default value is true. + + + + + Determines whether host objects are accessible from the page in WebView. + + + The default value is true. + + + + + Determines whether the user is able to impact the zoom of the WebView. + + + When disabled, the user is not able to zoom using Ctrl++, Ctr+-, or Ctrl+mouse wheel, but the zoom is set using property. The default value is true. + + + + + Determines whether to disable built in error page for navigation failure and render process failure. + + + When disabled, blank page is displayed when related error happens. The default value is true. + + + + + Determines WebView2's User Agent. + + + The default value is the default User Agent of the Edge browser. This property may be overridden if the User-Agent header is set in a request. If the parameter is empty the User Agent will not be updated and the current User Agent will remain. Setting this property may clear User Agent Client Hints headers Sec-CH-UA-* and script values from navigator.userAgentData. Current implementation behavior is subject to change. + The User Agent set will also be effective on service workers and shared workers associated with the WebView. If there are multiple WebViews associated with the same service worker or shared worker, the last User Agent set will be used. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SetUserAgent"::: + + + + + Determines whether browser-specific accelerator keys are enabled. + + + When this setting is set to false, it disables all accelerator keys that access + features specific to a web browser, including but not limited to: + + + + Ctrl+F and F3 for Find on Page + + + Ctrl+P for Print + + + Ctrl+R and F5 for Reload + + + Ctrl+Plus and Ctrl+Minus for zooming + + + Ctrl+Shift-C and F12 for DevTools + + + Special keys for browser functions, such as Back, Forward, and Search + + + + It does not disable accelerator keys related to movement and text editing, such + as: + + + + Home, End, Page Up, and Page Down + + + Ctrl+X, Ctrl+C, Ctrl+V + + + Ctrl+A for Select All + + + Ctrl+Z for Undo + + + + Those accelerator keys will always be enabled unless they are handled in the event. + + This setting has no effect on the event. The event + will be fired for all accelerator keys, whether they are enabled or not. + + The default value of AreBrowserAcceleratorKeysEnabled is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AllowWebViewShortcutKeys"::: + + + + + Determines whether password information will be autosaved. + + + When disabled, no new password data is saved and no Save/Update Password prompts are displayed. However, if there was password data already saved before disabling this setting, then that password information is auto-populated, suggestions are shown and clicking on one will populate the fields. + When enabled, password information is auto-populated, suggestions are shown and clicking on one will populate the fields, new data is saved, and a Save/Update Password prompt is displayed. The default value is false. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PasswordAutosaveEnabled"::: + + + + + Determines whether general form information will be saved and autofilled. + + + General autofill information includes information like names, street and email addresses, phone numbers, and arbitrary input. This excludes password information. When disabled, no suggestions appear, and no new information is saved. + When enabled, information is saved, suggestions appear, and clicking on one will populate the form fields. The default value is true. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. And all WebView2s that created with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GeneralAutofillEnabled"::: + + + + + + Determines the ability of the end users to use pinching motions on touch input enabled devices to scale the web content in the WebView2. + + + When disabled, the end users cannot use pinching motions on touch input enabled devices to scale the web content in the WebView2. The default value is true. + Pinch-zoom, referred to as "Page Scale" zoom, is performed as a post-rendering step, it changes the page scale factor property and scales the surface the web page is rendered onto when user performs a pinch zooming action. It does not change the layout but rather changes the viewport and clips the web content, the content outside of the viewport isn't visible onscreen and users can't reach this content using mouse. This API only affects the Page Scale zoom and has no effect on the existing browser zoom properties ( and ) or other end user mechanisms for zooming. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="TogglePinchZoomEnabled"::: + + + + + Determines whether the end user to use swiping gesture on touch input enabled devices to navigate in WebView2. + + + Swiping gesture navigation on touch screen includes: + + + Swipe left/right (swipe horizontally) to navigate to previous/next page in navigation history. + + + Pull to refresh (swipe vertically) the current page. (This feature is currently disabled by default in the browser, to enable in WebView2, set property with --pull-to-refresh switch). + + + It defaults to true. When set to false, the end user cannot swipe to navigate or pull to refresh. This API only affects the overscrolling navigation functionality and has no effect on the scrolling interaction used to explore the web content shown in WebView2. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleSwipeNavigationEnabled"::: + + + + + Used to customize the PDF toolbar items. + + + By default, it is and so it displays all of the items. + Changes to this property apply to all CoreWebView2s in the same environment and using the same profile. + Changes to this setting apply only after the next navigation. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleHiddenPdfToolbarItems"::: + + + + + Determines whether SmartScreen is enabled when visiting web pages + + + The default value is true. + IsReputationCheckingRequired is used to control whether SmartScreen is enabled or not. + SmartScreen is enabled or disabled for all CoreWebView2s using the same user data folder. + If CoreWebView2Setting.IsReputationCheckingRequired is true for any CoreWebView2 using the same user data folder, then SmartScreen is enabled. If CoreWebView2Setting.IsReputationCheckingRequired is false for all CoreWebView2 using the same user data folder, then SmartScreen is disabled. + When it is changed, the change will be applied to all WebViews using the same user data folder on the next navigation or download. + If the newly created CoreWebview2 does not set SmartScreen to false, when navigating(Such as Navigate(), LoadDataUrl(), ExecuteScript(), etc.), the default value will be applied to all CoreWebview2 using the same user data folder. + SmartScreen of WebView2 apps can be controlled by Windows system setting "SmartScreen for Microsoft Edge", specially, for WebView2 in Windows Store apps, SmartScreen is controlled by another Windows system setting "SmartScreen for Microsoft Store apps". When the Windows setting is enabled, the SmartScreen operates under the control of the `IsReputationCheckingRequired`. When the Windows setting is disabled, the SmartScreen will be disabled regardless of the `IsReputationCheckingRequired` value set in WebView2 apps. In other words, under this circumstance the value of `IsReputationCheckingRequired` will be saved but overridden by system setting. Upon re-enabling the Windows setting, the CoreWebview2 will reference the `IsReputationCheckingRequired` to determine the SmartScreen status. + + + + + The `IsNonClientRegionSupportEnabled` property enables web pages to use the + + `app-region` CSS style. Disabling/Enabling the `IsNonClientRegionSupportEnabled` + takes effect after the next navigation. Defaults to `false`. + + When this property is `true`, then all the non-client region features + will be enabled: + Draggable Regions will be enabled, they are regions on a webpage that + are marked with the CSS attribute `app-region: drag/no-drag`. When set to + `drag`, these regions will be treated like the window's title bar, supporting + dragging of the entire WebView and its host app window; the system menu shows + upon right click, and a double click will trigger maximizing/restoration of the + window size. + When set to `false`, all non-client region support will be disabled. + The `app-region` CSS style will be ignored on web pages. + + + + Event args for the event. + + + + + The TLS error code for the invalid certificate. + + + + + URI associated with the request for the invalid certificate. + + + + + Returns the . + + + + + The action of the server certificate error detection. + + + The default value is . + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + This interface represents a JavaScript exception. + + + + + The line number of the source where the exception occurred. Note that this position starts at 0. + + + + + The column number of the source where the exception occurred. Note that this position starts at 0. + + + + + The Name is the exception's class name. + + + + + The Message is the exception's message and potentially stack. + + + + + This will return all details of the exception as a JSON string. + + + + + Event args for the event. + + + + + Gets the URI of the page that requested the dialog box. + + + + + Gets the kind of JavaScript dialog box. + + + + + + Gets the message of the dialog box. + + + From JavaScript this is the first parameter passed to alert, confirm, and prompt and is empty for beforeunload. + + + + + Gets the default value to use for the result of the prompt JavaScript function. + + + This is the second parameter passed to the JavaScript prompt dialog. + + + + + Gets or sets the return value from the JavaScript prompt function if is run. + + + This value is ignored for s other than . If is not run, this value is ignored and false is returned from prompt. + + + + + + Responds with **OK** to confirm, prompt, and beforeunload dialogs. Not run this method to indicate cancel. + + + From JavaScript, this means that the confirm function and beforeunload event returns true if Accept is run. And for the prompt function it returns the value of if Accept is run and otherwise returns false. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + The host may set this flag to TRUE to cancel the screen capture. + + + If canceled, the screen capture UI is not displayed regardless of the Handled property. On the script side, it will return with a NotAllowedError as Permission denied. + + + + + The host may set this flag to TRUE to prevent the ScreenCaptureStarting event from firing on the CoreWebView2 as well. + + + By default, both the ScreenCaptureStarting event handlers on the CoreWebView2Frame and the CoreWebView2 will be invoked, with the CoreWebView2Frame event handlers invoked first. The host may set this flag to TRUE within the CoreWebView2Frame event handlers to prevent the remaining CoreWebView2 event handlers from being invoked. If the flag is set to FALSE within the CoreWebView2Frame event handlers, downstream handlers can update the Cancel property. + + + + + The frame info of the frame where the screen capture starting request originated. + + + + + Returns a object. + + + Use this deferral to defer the decision to show the Screen Capture UI. getDisplayMedia() won't call its callbacks until the deferral is completed. + + + + + Event args for the event. + + + + + Set if cancel the upcoming save/download. + + + + + Get the document origin URI of this file save operation. + + + + + Get the extension of file to be saved. + + + + + Get the full path of file to be saved. This includes the file name and extension. + + + + + Set if the default policy checking and security warning will be suppressed. + + + + + Returns a object. + + + It will put the event into a deferred state. The default policy checking and any default UI will be blocked temporarily, saving file to local won't start, until the deferral is completed. + + + + + + Event args for the event. + + + + + Mime type of content to be saved. + + + + + Indicates whether to cancel the save as before download. + + + Set this property to `TRUE` to cancel the Save As action and prevent the download from starting. returns . + + + + + Indicates if the system default dialog will be suppressed. + + + When this property is FALSE, the default Save As dialog is shown and the values assigned through `SaveAsFilePath`, `AllowReplace` and `Kind` are ignored when the event args invoke completed. When it is `TRUE`, the system dialog is skipped and all assigned values are used. + + + + + The absolute full path of save as location. + + + It includes the file name and extension. If it is not valid (for example, the root drive does not exist), Save As is denied, and is returned. If the associated download completes successfully, a target file is saved at this location. If the `Kind` property is , there will be an additional directory with resources files. + + + + + Indicates whether to allow replace old file when it already exists in the target save file path. + + + Setting this property to `TRUE` allows existing files to be replaced. Setting this property to `FALSE` will not replace existing files and will return . + + + + + The option to save content to different document. + + + If it is not allowed for the current document, method returns . + + + + + Gets a object. + + + This will defer showing the default Save As dialog. Use this to the event at a later time to perform a Save As operation. + + + + + + Provides a set of properties for a process list in the . + + + + + Get the process id of the process. + + + + + Get the kind of the process. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the kind of process failure that has occurred. + + + ProcessFailedKind is a combination of process kind (for example, browser, renderer, gpu) and failure (exit, unresponsiveness). Renderer processes are further divided in main frame renderer (RenderProcessExited, RenderProcessUnresponsive) and subframe renderer (FrameRenderProcessExited). To learn about the conditions under which each failure kind occurs, see . + + + + + + Gets the reason for the process failure. + + + Some of the reasons are only applicable to specific values of , and the following values always return the indicated reason value: + + + + ProcessFailedKind + Reason + + + BrowserProcessExited + + Unexpected + + + + RenderProcessUnresponsive + + Unresponsive + + + + + For other values, the reason may be any of the reason values. To learn about what these values mean, see . + + + + + + Gets the exit code of the failing process, for telemetry purposes. + + + The exit code is always 1 when is , and STILL_ACTIVE(259) when is . + + + + + + Gets a description of the failing process, assigned by the WebView2 Runtime. + + + This is a technical English term appropriate for logging or development purposes, and not localized for the end user. It applies to utility processes (for example, "Audio Service", "Video Capture") and plugin processes (for example, "Flash"). The returned string is empty if the WebView2 Runtime did not assign a description to the process. + + + + + Gets the collection of s for frames in the that were being rendered by the failed process. + + + The content in these frames is replaced with an error page. + This is only available when is ; the returned collection is empty for all other process failure kinds, including the case in which the failed process was the renderer for the main frame and subframes within it, for which the failure kind is . + + + + + When ProcessFailed occurred due to a failed Code Integrity check, this property returns the full path of the file that was prevented from loading on the system. + + The webview2 process which tried to load the DLL will fail with exit code STATUS_INVALID_IMAGE_HASH(-1073740760). + + + + Provides a set of properties for a process list with extended information in the . + + + + + Provides the of the current process. + + + + + Provides the collection of associated s which are actively running (showing or hiding UI elements) in this renderer process. + + + AssociatedFrameInfos will only be populated when this corresponds to a renderer process. Non-renderer processes will always have an empty AssociatedFrameInfo. AssociatedFrameInfos may also be empty for renderer processes that have no active frames. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AssociatedFrameInfos"::: + + + + + Settings used by the method. + + + Settings used by the method. + + + + + The orientation can be portrait or landscape. + + + The default orientation is portrait. See . + + + + + The scale factor is a value between 0.1 and 2.0. + + + The default is 1.0. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The page width in inches. + + + The default width is 8.5 inches. If the provided page width is less than or equal to zero, the current value is not changed and an ArgumentException is thrown. + + + + + The page height in inches. + + + The default height is 11 inches. If the provided page height is less than or equal to zero, the current value is not changed and an ArgumentException is thrown. + + + + + The top margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The bottom margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The left margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The right margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + true if background colors and images should be printed. + + + The default value is false. + + + + + true if only the current end user's selection of HTML in the document should be printed. + + + The default value is false. + + + + + true if header and footer should be printed. + + + The default value is false. The header consists of the date and time of printing, and the title of the page. The footer consists of the URI and page number. The height of the header and footer is 0.5 cm, or ~0.2 inches. + + + + + The title in the header if is true. + + + The default value is the title of the current document. If an empty string or null value is provided, no title is shown in the header. + + + + + The URI in the footer if is true. + + + The default value is the current URI. If an empty string or null value is provided, no URI is shown in the footer. + + + + + Page range to print. Defaults to empty string, which means print all pages. + + + The PageRanges property is a list of page ranges specifying one or more pages that should be printed separated by commas. Any whitespace between page ranges is ignored. + A valid page range is either a single integer identifying the page to print, or a range in the form [start page]-[last page] where start page and last page are integers identifying the first and last inclusive pages respectively to print. + Every page identifier is an integer greater than 0 unless wildcards are used (see below examples). + The first page is 1. + + In a page range of the form [start page]-[last page] the start page number must be larger than 0 and less than or equal to the document's total page count. + If the start page is not present, then 1 is used as the start page. + The last page must be larger than the start page. + If the last page is not present, then the document total page count is used as the last page. + + Repeating a page does not print it multiple times. To print multiple times, use the property. + + The pages are always printed in ascending order, even if specified in non-ascending order. + + If page range is not valid or if a page is greater than document total page count, ArgumentException is thrown. + + The following examples assume a document with 20 total pages. + + + + Example + Result + Notes + + + "2" + Page 2 + + + + "1-4, 9, 3-6, 10, 11" + Pages 1-6, 9-11 + + + + "1-4, -6" + Pages 1-6 + The "-6" is interpreted as "1-6". + + + "2-" + Pages 2-20 + The "2-" is interpreted as "pages 2 to the end of the document". + + + "4-2, 11, -6" + Invalid + "4-2" is an invalid range. + + + "-" + Pages 1-20 + The "-" is interpreted as "page 1 to the end of the document". + + + "1-4dsf, 11" + Invalid + + + + "2-2" + Page 2 + + + + + + + + Prints multiple pages of a document on a single piece of paper. Choose from 1, 2, 4, 6, 9 or 16. + + + The default value is 1. + + If an invalid value is provided, ArgumentException is thrown. + + Below examples shows print output for PagesPerSide and Duplex. + + + + PagesPerSide + Total pages + Two-sided printing + Result + + + 1 + 1 + - + 1 page on the front side. + + + 2 + 1 + Yes + 1 page on the front side. + + + 2 + 4 + - + 2 pages on the first paper and 2 pages on the next paper. + + + 2 + 4 + Yes + 2 pages on the front side and 2 pages on back side. + + + 4 + 4 + Yes + 4 pages on the front side. + + + 4 + 8 + Yes + 4 pages on the front side and 4 pages on the back side. + + + + + + + Number of copies to print. Minimum value is 1 and the maximum copies count is 999. + + + The default value is 1. + + + + + Printer collation. + + + See for descriptions of collation. The default value is . + + Printing uses default value of printer's collation if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + Printer color mode. + + + See for descriptions of color modes. The default value is . + + Printing uses default value of printer supported color if an invalid value is provided for the specific printer. + + + + + Printer duplex settings. + + + See for descriptions of duplex. The default value is . + + Printing uses default value of printer's duplex if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + Printer media size. + + + See for descriptions of media size. The default value is . + + If media size is , you should set the and . + + Printing uses default value of printer supported media size if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + The name of the printer to use. + + + Defaults to empty string. If the printer name is empty string or null, then it prints to the default printer on the user OS. + + If provided printer name doesn't match with the name of any installed printers on the user OS, the method returns with . + + Use [PrintCapabilities](/dotnet/api/system.printing.printcapabilities) class to enumerate available printers. + + This value is ignored in method. + + + + + This mostly represents a combined win32 POINTER_INFO, POINTER_TOUCH_INFO, and POINTER_PEN_INFO object. + + + + + Gets or sets the PointerKind of the pointer event. + + + This corresponds to the pointerKind property of the POINTER_INFO struct. The values are defined by the POINTER_INPUT_KIND enum in the Windows SDK (_winuser.h_). Supports PT_PEN and PT_TOUCH. + + + + + Gets or sets the PointerId of the pointer event. + + + This corresponds to the pointerId property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the FrameID of the pointer event. + + + This corresponds to the frameId property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PointerFlags of the pointer event. + + + This corresponds to the pointerFlags property of the POINTER_INFO struct. The values are defined by the POINTER_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PointerDeviceRect of the sourceDevice property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the DisplayRect of the sourceDevice property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PixelLocation of the pointer event. + + + This corresponds to the ptPixelLocation property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HimetricLocation of the pointer event. + + + This corresponds to the ptHimetricLocation property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PixelLocationRaw of the pointer event. + + + This corresponds to the ptPixelLocationRaw property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HimetricLocationRaw of the pointer event. + + + This corresponds to the ptHimetricLocationRaw property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the Time of the pointer event. + + + This corresponds to the dwTime property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HistoryCount of the pointer event. + + + This corresponds to the historyCount property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the InputData of the pointer event. + + + This corresponds to the InputData property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the KeyStates of the pointer event. + + + This corresponds to the dwKeyStates property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PerformanceCount of the pointer event. + + + This corresponds to the PerformanceCount property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the ButtonChangeKind of the pointer event. + + + This corresponds to the ButtonChangeKind property of the POINTER_INFO struct. The values are defined by the POINTER_BUTTON_CHANGE_KIND enum in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenFlags of the pointer event. + + + This corresponds to the penFlags property of the POINTER_PEN_INFO struct. The values are defined by the PEN_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenMask of the pointer event. + + + This corresponds to the penMask property of the POINTER_PEN_INFO struct. The values are defined by the PEN_MASK constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenPressure of the pointer event. + + + This corresponds to the pressure property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenRotation of the pointer event. + + + This corresponds to the rotation property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenTiltX of the pointer event. + + + This corresponds to the tiltX property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenTiltY of the pointer event. + + + This corresponds to the tiltY property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchFlags of the pointer event. + + + This corresponds to the touchFlags property of the POINTER_TOUCH_INFO struct. The values are defined by the TOUCH_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchMask of the pointer event. + + + This corresponds to the touchMask property of the POINTER_TOUCH_INFO struct. The values are defined by the TOUCH_MASK constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchContact of the pointer event. + + + This corresponds to the rcContact property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchContactRaw of the pointer event. + + + This corresponds to the rcContactRaw property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchOrientation of the pointer event. + + + This corresponds to the orientation property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchPressure of the pointer event. + + + This corresponds to the pressure property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Provides a set of properties for a permission setting. + + + + + The kind of the permission setting. + + + + + The origin of the permission setting. + + + + + The state of the permission setting. + + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the origin of the web content that requests the permission. + + + + + Gets the kind of the permission that is requested. + + + + + true when the permission request was initiated through a user gesture such as clicking an anchor tag with target. + + + Being initiated through a user gesture does not mean that user intended to access the associated resource. + + + + + Gets or sets the status of a permission request. For example, whether the request is granted. + + + The default value is . + + + + + Gets a object. + + + Use the deferral object to make the permission decision at a later time. The deferral only applies to the current request, and does not prevent the PermissionRequested event from getting raised for new requests. However, for some permission kinds the WebView will avoid creating a new request if there is a pending request of the same kind. + + + + + The host may set this flag to TRUE to prevent the PermissionRequested event from firing on the CoreWebView2 as well. + + By default, both the PermissionRequested on the CoreWebView2Frame and CoreWebView2 will be fired. + + + + Set the SavesInProfile property to FALSE to not persist the state beyond the current request, and to continue to receive PermissionRequested events for this origin and permission kind. + + + The permission state set from the PermissionRequested event is saved in the profile by default; it is persisted across sessions and becomes the new default behavior for future PermissionRequested events. Browser heuristics can affect whether the event continues to be raised when the state is persisted. + + + + + Event args for the . + + + + + The origin of the web content that sends the notification, such as https://example.com/ or https://www.example.com/. + + + + + The notification that was received. + + + You can access the properties on the Notification object to show your own notification. + + + + + Sets whether the is handled by the host after the event handler completes or if there is a deferral then after the deferral is completed. + + + If is set to true then WebView will not display the notification with the default UI, and the host will be responsible for handling the notification and for letting the web content know that the notification has been displayed, clicked, or closed. You must set to true before you call , and , otherwise they will fail with HRESULT_FROM_WIN32(ERROR_INVALID_STATE). If after the event handler or deferral completes is set to false then WebView will display the default notification UI. Note that you cannot un-handle this event once you have set to be true. The initial value is false. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + Gets the region kind corresponding to the event. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the target uri of the new window request. + + + + + Gets the new window or sets a WebView as a result of the new window requested. + + + Provides a WebView as the target for a window.open() from inside the requesting WebView. If this is set, the top-level window of this WebView is returned as the opened [WindowProxy](https://developer.mozilla.org/docs/glossary/windowproxy) to the opener script. If this is not set, then is checked to determine behavior for the . + The methods which should affect the new web contents like has to be called and completed before setting NewWindow. Other methods which should affect the new web contents like have to be called after setting NewWindow. It is best not to use before setting NewWindow, otherwise it may not work for later added scripts. + WebView provided in the NewWindow property must be on the same as the opener WebView and cannot be navigated. Changes to settings should be made before setting NewWindow to ensure that those settings take effect for the newly setup WebView. The new WebView must have the same profile as the opener WebView. + + + + + Indicates whether the event is handled by host. + + + If this is false and no is set, the WebView opens a popup window and returns the opened WindowProxy to the opener script. Note that in this case, there is no avenue to control the popup window from the app. If set to true and no is set for window.open(), the opened proxy is for a dummy window object, but this window does not load and is immediately closed. The default value is false. + + + + + true when the new window request was initiated through a user gesture such as selecting an anchor tag with target. + + + The Microsoft Edge popup blocker is disabled for WebView so the app is able to use this flag to block non-user initiated popups. + + + + + Gets the window features specified by the window.open() call. These features should be considered for positioning and sizing of new WebView windows. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the window open request at a later time. While this event is deferred the opener window returns a WindowProxy to an un-navigated window, which navigates when the deferral is complete. + + + + + Gets the name of the new window. + + + This window can be created via window.open(url, windowName), where the windowName parameter corresponds to Name property. + If no windowName is passed to window.open, then the Name property will be set to an empty string. Additionally, if window is opened through other means, such as <a target="windowName"> or <iframe name="windowName">, then the Name property will be set accordingly. In the case of target=_blank, the Name property will be an empty string. + Opening a window via Ctrl+clicking a link would result in the Name property being set to an empty string. + + + + + The frame info of the frame where the new window request originated. + + + The OriginalSourceFrameInfo is a snapshot of frame information at the time when the new window was requested. See for details on frame properties. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the uri of the requested navigation. + + + + + true when the new window request was initiated through a user gesture. + + + Examples of user initiated requests are: + - Selecting an anchor tag with target + - Programmatic window open from a script that directly run as a result of user interaction such as via onclick handlers. + Non-user initiated requests are programmatic window opens from a script that are not directly triggered by user interaction, such as those that run while loading a new page or via timers. + The Microsoft Edge popup blocker is disabled for WebView so the app is able to use this flag to block non-user initiated popups. + + + + + true when the navigation is redirected. + + + + + Gets the HTTP request headers for the navigation. + + + Note, you are not able to modify the HTTP request headers in a event. + + + + + + Determines whether to cancel the navigation. + + + If set to true, the navigation is no longer present and the content of the current page is intact. For performance reasons, GET HTTP requests may happen, while the host is responding. You may set cookies and use part of a request for the navigation. Navigations to about schemes are cancellable, unless `msWebView2CancellableAboutNavigations` feature flag is disabled. Cancellation of frame navigation to `srcdoc` is not supported and will be ignored. + + + + + Gets the ID of the navigation. + + + + + Additional allowed frame ancestors set by the host app. + + + The app may set this property to allow a frame to be embedded by additional ancestors besides what is allowed by http header [X-Frame-Options](https://developer.mozilla.org/docs/Web/HTTP/Headers/X-Frame-Options) and [Content-Security-Policy frame-ancestors directive](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors). + If set, a frame ancestor is allowed if it is allowed by the additional allowed frame ancestors or original http header from the site. + Whether an ancestor is allowed by the additional allowed frame ancestors is done the same way as if the site provided it as the source list of the Content-Security-Policy frame-ancestors directive. + For example, if https://example.com and https://www.example.com are the origins of the top page and intermediate iframes that embed a nested site-embedding iframe, and you fully trust those origins, you should set this property to https://example.com https://www.example.com. + + This property gives the app the ability to use iframe to embed sites that otherwise could not be embedded in an iframe in trusted app pages. + This could potentially subject the embedded sites to [Clickjacking](https://wikipedia.org/wiki/Clickjacking) attack from the code running in the embedding web page. Therefore, you should only set this property with origins of fully trusted embedding page and any intermediate iframes. + Whenever possible, you should use the list of specific origins of the top and intermediate frames instead of wildcard characters for this property. + This API is to provide limited support for app scenarios that used to be supported by <webview> element in other solutions like JavaScript UWP apps and Electron. + You should limit the usage of this property to trusted pages, and specific navigation target url, by checking the , and . + + This property is ignored for top level document navigation. + + + + + Gets the navigation kind of the navigation. + + + + + Event args for the event. + + + Event args for the event. + + + + + true when the navigation is successful; false for a navigation that ended up in an error page (failures due to no network, DNS lookup failure, HTTP server responds with 4xx). Note that WebView2 will report the navigation as 'unsuccessful' if the load for the navigation did not reach the expected completion for any reason. Such reasons include potentially catastrophic issues such network and certificate issues, but can also be the result of intended actions such as the app canceling a navigation or navigating away before the original navigation completed. Applications should not just rely on this flag, but also consider the reported WebErrorStatus to determine whether the failure is indeed catastrophic in their context. + + + WebErrorStatuses that may indicate a non-catastrophic failure include: + + + + + + + + + + + + + + This may also be false for additional scenarios such as window.stop() run on navigated page. + + + + + Gets the error code if the navigation failed. + + + + + Gets the ID of the navigation. + + + + + The HTTP status code of the navigation if it involved an HTTP request. For instance, this will usually be 200 if the request was successful, 404 if a page was not found, etc. See https://developer.mozilla.org/docs/Web/HTTP/Status for a list of common status codes. + + + The HttpStatusCode property will be 0 in the following cases: + + + The navigation did not involve an HTTP request. For instance, if it was a navigation to a file:// URL, or if it was a same-document navigation. + + + The navigation failed before a response was received. For instance, if the hostname was not found, or if there was a network error. + + + In those cases, you can get more information from the and properties. + + If the navigation receives a successful HTTP response, but the navigated page calls window.stop() before it finishes loading, then HttpStatusCode may contain a success code like 200, but will be false and will be . + + Since WebView2 handles HTTP continuations and redirects automatically, it is unlikely for HttpStatusCode to ever be in the 1xx or 3xx ranges. + + + + + Event args for the event. + + + + + Gets the reason for WebView to raise the event. + + + + + Indicates whether the event has been handled by the app. + + + If the app has moved the focus to another desired location, it should set Handled property to true. When Handled property is false after the event handler returns, default action is taken. The default action is to try to find the next tab stop child window in the app and try to move focus to that window. If no other window exists to move focus, focus is cycled within the web content of the WebView. + + + + + Event args for the event. + + + + + Gets the URI with the external URI scheme to be launched. + + + + + Gets the origin initiating the external URI scheme launch. If the `InitiatingOrigin` is [opaque](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque), the `InitiatingOrigin` reported in the event args will be its precursor origin. The precursor origin is the origin that created the opaque origin. For example, if a frame on example.com opens a subframe with a different opaque origin, the subframe's precursor origin is example.com. + + + The origin will be an empty string if the request is initiated by calling on the external URI scheme. If a script initiates the navigation, the `InitiatingOrigin` will be the top-level document's `Source`, i.e. if `window.location` is set to `"calculator://", the `InitiatingOrigin` will be set to `calculator://`. If the request is initiated from a child frame, the `InitiatingOrigin` will be the source of that child frame. + + + + + true when the launching external URI scheme request was initiated through a user gesture. + + + + + Determines whether to cancel the navigation. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the launching external URI scheme request at a later time. + + + + + Provides a set of properties for a frame in the . + + + Provides a set of properties for a frame in the . + + + + + Gets the value of frame's window.name property. The default value equals to frame html tag declaring it, as in <iframe name="frame-name" ...>. + + + The returned string is empty when the frame has no name attribute and no assigned value for window.name. + + + + + The URI of the document in the frame. + + + + + This parent frame's . ParentFrameInfo will only be populated when obtained via calling . objects obtained via will always have a null ParentFrameInfo. This property is also null for the top most document in the which has no parent frame. + + + ParentFrameInfo could be out of date as it's a snapshot. + + + + + The unique identifier of the frame associated with the current . It's the same kind of ID as with the and . FrameId will only be populated when obtained calling . objects obtained via will always have an invalid frame Id 0. + + + FrameId could be out of date as it's a snapshot. If there's created or destroyed or event or event after the asynchronous call starts, you may want to call the asynchronous method again to get the updated s. + + + + + Gets the kind of the frame. FrameKind will only be populated when obtained calling . ` objects obtained via will always have the default value . + + + FrameKind could be out of date as it's a snapshot. + + + + + Event args for the event. + + + + + Gets the created frame. + + + + + + Representation of a DOM [FileSystemHandle](https://developer.mozilla.org/docs/Web/API/FileSystemHandle) object. + + + + + The kind of the FileSystemHandle. It can either be a file or a directory. + + + + + The path to the FileSystemHandle. + + + + + The permissions granted to the FileSystemHandle. + + + + + Representation of a DOM[File](https://developer.mozilla.org/docs/Web/API/File) object passed via WebMessage. + + + You can use this object to obtain the path of a File dropped on WebView2. + + + + + The absolute file path. + + + + + The result for . + + + + + This property is true if successfully executed script with no unhandled exceptions and the result is available in the property. + + + + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. + + + + + If Succeeded is false, you can use this property to get the unhandled exception thrown by script execution + + + + + If Succeeded is true and the result of script execution is a string, this method provides the value of the string result, and we will get the false var value when the js result is not string type. + + + + + Event args for the event. + + + + + Returns the for the download that has started. + + + + + Indicates whether to cancel the download. + + + If canceled, the download save dialog is not displayed regardless of the value and the state is changed to with interrupt reason . + + + + + The path to the file. + + + If setting the path, the host should ensure that it is an absolute path, including the file name, and that the path does not point to an existing file. If the path points to an existing file, the file will be overwritten. If the directory does not exist, it is created. + + + + + Indicates whether to hide the default download dialog. + + + If set to true, the default download dialog is hidden for this download. The download progresses normally if it is not canceled, there will just be no default UI shown. By default the value is false and the default download dialog is shown. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + Gets the ID of the navigation. + + + + + A Receiver is created for a particular DevTools Protocol event and allows you to subscribe and unsubscribe from that event. + + + Obtained from the WebView object using . + + + + + + DevToolsProtocolEventReceived is raised when the corresponding DevToolsProtocol event is raised. + + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the parameter object of the corresponding DevToolsProtocol event represented as a JSON string. + + + + + Gets the sessionId of the target where the event originates from. Empty string is returned as sessionId if the event comes from the default session for the top page. + + + + + Represents the information regarding the context menu target. Includes the context selected and the appropriate data used for the actions of a context menu. + + + + + Gets the kind of context that the user selected as . + + + + + Returns true if the context menu is requested on an editable component. + + + + + Returns true if the context menu was requested on the main frame and false if invoked on another frame. + + + + + Gets the uri of the page. + + + + + Gets the uri of the frame. Will match the if is true. + + + + + Returns true if the context menu is requested on HTML containing an anchor tag. + + + + + Gets the uri of the link (if is true, null otherwise). + + + + + Returns true if the context menu is requested on text element that contains an anchor tag. + + + + + Gets the text of the link (if is true, null otherwise). + + + + + Returns true if the context menu is requested on HTML containing a source uri. + + + + + Gets the active source uri of element (if is true, null otherwise). + + + + + Returns true if the context menu is requested on a selection. + + + + + Gets the selected text (if is true, null otherwise). + + + + + Event args for the event. + + + Will contain the selection information and a collection of all of the default context menu items that the WebView would show. Allows the app to draw its own context menu or add/remove from the default context menu. + + + + + Gets the collection of objects. + + + + + Gets the target information associated with the requested context menu. + + + + + + Gets the coordinates where the context menu request occurred in relation to the upper left corner of the WebView bounds. + + + + + Gets or sets the selected 's . + + + When the app handles the event, it can set this to report the selected command from the context menu. The default value is -1 which means that no selection occurred. The app can also set the command ID for a custom context menu item, which will cause the event to be fired, however while command IDs for each custom context menu item is unique during a ContextMenuRequested event, WebView may reassign command ID values of deleted custom ContextMenuItems to new objects and the command ID assigned to the same custom item can be different between each app runtime. The command ID should always be obtained via the property. + + + + + Gets or sets whether the event is handled by host after the event handler completes or after the deferral is completed if there is a taken . + + + If Handled is set to true then WebView2 will not display a context menu and will instead use the property to indicate which, if any, context menu item to invoke. If after the event handler or deferral completes, Handled is set to false then WebView will display a context menu based on the contents of the property. The default value is false. + + + + + Returns a object. + + + Use this operation to complete the event when the custom context menu is closed. + + + + + Represents a context menu item of a context menu displayed by WebView. + + + + + Gets the unlocalized name for the . + + + Use this to distinguish between context menu item types. This will be the English label of the menu item in lower camel case. For example, the "Save as" menu item will be "saveAs". Extension menu items will be "extension", custom menu items will be "custom" and spellcheck items will be "spellCheck". + Some example context menu item names are: + + + + "saveAs" + + + "copyImage" + + + "openLinkInNewWindow" + + + + + + + Gets the localized label for the . Will contain an ampersand for characters to be used as keyboard accelerator. + + + + + Gets the Command ID for the . + + + Use this to report the in event. + + + + + Gets the localized keyboard shortcut for this . + + + It will be the empty string if there is no keyboard shortcut. This is text intended to be displayed to the end user to show the keyboard shortcut. For example this property is Ctrl+Shift+I for the "Inspect" . + + + + + Gets the Icon for the in PNG, Bitmap or SVG formats in the form of an IStream. + + + Stream will be rewound to the start of the image data before being read. + + + + + Gets the kind of as . + + + + + Gets or sets the enabled property of the . Must only be used in the case of a custom context menu item. + + + The default value for this is true. + + + + + Gets or sets the checked property of the . + + + Must only be used for custom context menu items that are of kind or . + + + + + Gets the list of children menu items if the kind is . + + + If the kind is not , will return null. + + + + + CustomItemSelected event is raised when the user selects this . + + + Will only be raised for end developer created context menu items. + + + + + Event args for the event. + + + + + true if the loaded content is an error page. + + + + + Gets the ID of the navigation. + + + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + + + Gets or sets the root visual in the hosting app's visual tree. + + + This visual is where the WebView will connect its visual tree. The app uses this visual to position the WebView within the app. The app still needs to use the property to size the WebView. The RootVisualTarget property can be an IDCompositionVisual or a Windows::UI::Composition::ContainerVisual. WebView will connect its visual tree to the provided visual before returning from the property setter. The app needs to commit on its device setting the RootVisualTarget property. The RootVisualTarget property supports being set to null to disconnect the WebView from the app's visual tree. + + + + + Gets the current cursor that WebView thinks it should be. + + + The cursor should be set in WM_SETCURSOR through Mouse.SetCursor or set on the corresponding parent/ancestor HWND of the WebView through ::SetClassLongPtr. The HCURSOR can be freed so CopyCursor/DestroyCursor is recommended to keep your own copy if you are doing more than immediately setting the cursor. + + + + + Gets the current system cursor ID reported by the underlying rendering engine for WebView. + + + + + The event is raised when WebView thinks the cursor should be changed. + + + For example, when the mouse cursor is currently the default cursor but is then moved over text, it may try to change to the IBeam cursor. + It is expected for the developer to send messages (in addition to messages) through . This is to ensure that the mouse is actually within the WebView that sends out CursorChanged events. + + + + + Sends mouse input to the WebView. + + The mouse event kind. + The virtual keys associated with the eventKind. + The amount of wheel movement. + The absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the eventKind. + + If eventKind is or , then mouseData specifies the amount of wheel movement. + A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120. If eventKind is , , or , then mouseData specifies which X buttons were pressed or released. This value should be 1 if the first X button is pressed/released and 2 if the second X button is pressed/released. If eventKind is , then virtualKeys, mouseData, and point should all be zero. If eventKind is any other value, then mouseData should be zero. point is expected to be in the client coordinate space of the WebView. To track mouse events that start in the WebView and can potentially move outside of the WebView and host application, calling SetCapture and ReleaseCapture is recommended. To dismiss hover popups, it is also recommended to send messages. + + + + + Sends pen or pointer input to the WebView. + + The pointer event kind. + The pointer information. + + Accepts touch or pen pointer input of kinds defined in . + Any pointer input from the system must be converted into a first. + + + + + Call this method to inform the CoreWebView2CompositionController that a drag operation has left the WebView. + + + Corresponds to the [ICoreDropOperationTarget.LeaveAsync](/uwp/api/windows.applicationmodel.datatransfer.dragdrop.core.icoredropoperationtarget.leaveasync) method when performing a drag operation into the WebView. + + + + + This event is raised when elements on the page with "app-region" CSS property values corresponding to non-client regions change. Use the to see the kind of non-client region that changed. + + + + + Call this method to perform hit-testing inside of your message loop when the message is WM_NCHITTEST. + + The point parameter is expected to be in the client coordinate space of the WebView2. + The type of region which contains the point. + + + + This method retrieves the non-client regions on the page which corresponds to a given kind . + + The kind of non-client region. + This method returns a vector of rectangles. + + This method can be used inside the event handler to get the list of rects for the specific region that changed. + + + + + Event args for the event. + + + + + Returns host name of the server that requested client certificate authentication. + + + Normalization rules applied to the hostname are: + + + + Convert to lowercase characters for ascii characters. + + + Punycode is used for representing non ascii characters. + + + Strip square brackets for IPV6 address. + + + + + + + Returns port of the server that requested client certificate authentication. + + + + + Returns true if the server that issued this request is an http proxy. Returns false if the server is the origin server. + + + + + The list contains Base64 encoding of DER encoded distinguished names of certificate authorities allowed by the server. + + + + + Returns the list of when client certificate authentication is requested. The list contains mutually trusted CA certificate. + + + + + Selected certificate to respond to the server. + + + + + Indicates whether to cancel the certificate selection. + + + If canceled, the request is aborted regardless of the property. By default the value is false. + + + + + Indicates whether the event has been handled by host. + + + Set to true to respond to the server with or without a certificate. If this flag is true with a it responds to the server with the selected certificate otherwise respond to the server without a certificate. By default the value of and are false and display default client certificate selection dialog prompt to allow the user to choose a certificate. The is ignored unless is set to true. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + The kind of browser process exit that has occurred. + + + + + The process ID of the browser process that has exited. + + + + + Browser extension installed on current profile. + + + + + This is the browser extension's ID. This is the same browser extension ID returned by the browser extension API [chrome.runtime.id](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/id). Please see that documentation for more details on how the ID is generated. After an extension is removed, calling Id will return the id of the extension that is removed. + + + + + This is the browser extension's name. This value is defined in this browser extension's manifest.json file. If manifest.json define extension's localized name, this value will be the localized version of the name. Please see [Manifest.json name](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/manifest.json/name) for more details. + + + + + If IsEnabled is true then the Extension is enabled and running in WebView instances. If it is false then the Extension is disabled and not running in WebView instances. When a Extension is first installed, IsEnable are default to be true. IsEnabled is persisted per profile. After an extension is removed, calling IsEnabled will return the value at the time it was removed. + + + + + Removes this browser extension from its WebView2 Profile. The browser extension is removed immediately including from all currently running HTML documents associated with this WebView2 Profile. The removal is persisted and future uses of this profile will not have this extension installed. After an extension is removed, calling Remove again will cause an exception. + + + + + Sets whether this browser extension is enabled or disabled. This change applies immediately to the extension in all HTML documents in all WebView2s associated with this profile. After an extension is removed, calling Enable will not change the value of IsEnabled. + + + + + Represents a Basic HTTP authentication response that contains a user name and a password as according to RFC7617 (https://tools.ietf.org/html/rfc7617) + + + + + User name provided for authentication. + + + + + Password provided for authentication. + + + + + Event args for the BasicAuthenticationRequested event. Will contain the request that led to the HTTP authorization challenge, the challenge and allows the host to provide authentication response or cancel the request. + + + + + The URI that led to the authentication challenge. For proxy authentication requests, this will be the URI of the proxy server. + + + + + The authentication challenge string. + + + + + Response to the authentication request with credentials. + + + This object will be populated by the app if the host would like to provide authentication credentials. + + + + + Indicates whether to cancel the authentication request. + + + false by default. If set to true, Response will be ignored. + + + + + Gets a object. + + + Use this Deferral to defer the decision to show the Basic Authentication dialog. + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the key event kind that caused the event to run. + + + + + Gets the Win32 virtual key code of the key that was pressed or released. + + + It is one of the Win32 virtual key constants such as VK_RETURN or an (uppercase) ASCII value such as 'A'. Verify whether Ctrl or Alt are pressed by running GetKeyState(VK_CONTROL) or GetKeyState(VK_MENU). + + + + + Gets the LPARAM value that accompanied the window message. + + + See the documentation for the WM_KEYDOWN and WM_KEYUP messages. + + + + + Gets a representing the information passed in the LPARAM of the window message. + + + + + Indicates whether the event is handled by host. + + + + For browser accelerator keys, when an accelerator key is pressed, the propagation and processing order is: + + 1. A CoreWebView2Controller.AcceleratorKeyPressed event is raised + 1. WebView2 browser feature accelerator key handling + 1. Web Content Handling: If the key combination isn't reserved for browser actions, the key event propagates to the web content, where JavaScript event listeners can capture and respond to it. + + If `Handled` property is set to true anywhere along the path, the event propagation stops, and web content will not receive the key and this prevents the WebView from performing the default action for this accelerator key. Otherwise the WebView will perform the default action for the accelerator key. + + + + + This `IsBrowserAcceleratorKeyEnabled` property allows developers to control whether the browser handles accelerator keys such as Ctrl+P or F3, etc. + + + The `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` API is a convenient setting for developers to disable all the browser accelerator keys together. This setting also sets the default value for the `IsBrowserAcceleratorKeyEnabled` property. + + By default, `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` is `TRUE` and `IsBrowserAcceleratorKeyEnabled` is `TRUE`. When developers change `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting to `FALSE`, this will change default value for `IsBrowserAcceleratorKeyEnabled` to `FALSE`. If developers want specific keys to be handled by the browser after changing the `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting to `FALSE`, they need to enable these keys by setting `IsBrowserAcceleratorKeyEnabled` to `TRUE`. + + The `CoreWebView2Controller.AcceleratorKeyPressed` event is raised any time an accelerator key is pressed, regardless of whether accelerator keys are enabled or not. + + This API will give the event arg higher priority over the `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting when we handle the keys. + + With `IsBrowserAcceleratorKeyEnabled` property, if developers mark `IsBrowserAcceleratorKeyEnabled` as `FALSE`, the browser will skip the WebView2 browser feature accelerator key handling process, but the event propagation continues, and web content will receive the key combination. + + This property does not disable accelerator keys related to movement and text editing, such as: + - Home, End, Page Up, and Page Down + - Ctrl-X, Ctrl-C, Ctrl-V + - Ctrl-A for Select All + - Ctrl-Z for Undo + + +
      +
      diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.dll new file mode 100644 index 0000000..b2d08ad Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.xml b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.xml new file mode 100644 index 0000000..5b005e1 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.WinForms.xml @@ -0,0 +1,504 @@ + + + + Microsoft.Web.WebView2.WinForms + + + + + This class is a bundle of the most common parameters used to create and instances. + Its main purpose is to be set to in order to customize the environment and/or controller used by a during implicit initialization. + + + This class isn't intended to contain all possible environment or controller customization options. + If you need complete control over the environment and/or controller used by a WebView2 control then you'll need to initialize the control explicitly by + creating your own environment (with ) and/or controller options (with ) and passing them to + *before* you set the property to anything. + See the class documentation for an initialization overview. + + + + + Creates a new instance of with default data for all properties. + + + + + Gets or sets the value to pass as the browserExecutableFolder parameter of when creating an environment with this instance. + + + + + Gets or sets the value to pass as the userDataFolder parameter of when creating an environment with this instance. + + + + + Gets or sets the value to use for the Language property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + Gets or sets the value to use for the ProfileName property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Gets or sets the value to pass as the AdditionalBrowserArguments parameter of which is passed to when creating an environment with this instance. + + + + + Gets or sets the value to use for the IsInPrivateModeEnabled property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Create a using the current values of this instance's properties. + + A task which will provide the created environment on completion, or null if no environment-related options are set. + + As long as no other properties on this instance are changed, repeated calls to this method will return the same task/environment as earlier calls. + If some other property is changed then the next call to this method will return a different task/environment. + + + + + Creates a using the current values of this instance's properties. + + A object or null if no controller-related properties are set. + Thrown if the parameter environment is null. + + + + Control to embed WebView2 in WinForms. + + + + + Create a new WebView2 WinForms control. + After construction the property is null. + Call to initialize the underlying . + + + This control is effectively a wrapper around the WebView2 COM API, which you can find documentation for here: https://aka.ms/webview2 + You can directly access the underlying ICoreWebView2 interface and all of its functionality by accessing the property. + Some of the most common COM functionality is also accessible directly through wrapper methods/properties/events on the control. + + Upon creation, the control's CoreWebView2 property will be null. + This is because creating the CoreWebView2 is an expensive operation which involves things like launching Edge browser processes. + There are two ways to cause the CoreWebView2 to be created: + 1) Call the method. This is referred to as explicit initialization. + 2) Set the property. This is referred to as implicit initialization. + Either option will start initialization in the background and return back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass your own to EnsureCoreWebView2Async or set the control's property prior to initialization. + + When initialization has finished (regardless of how it was triggered) then the following things will occur, in this order: + 1) The control's event will be invoked. If you need to perform one time setup operations on the CoreWebView2 prior to its use then you should do so in a handler for that event. + 2) If a Uri has been set to the property then the control will start navigating to it in the background (i.e. these steps will continue without waiting for the navigation to finish). + 3) The Task returned from will complete. + + For more details about any of the methods/properties/events involved in the initialization process, see its specific documentation. + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + + + + Cleans up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Overrides the base OnPaint event to have custom actions + in designer mode + + The graphics devices which is the source + + + + Overrides the base WndProc events to handle specific window messages. + + The Message object containing the HWND window message and parameters + + + + Gets or sets a bag of options which are used during initialization of the control's . + This property cannot be modified (an exception will be thrown) after initialization of the control's CoreWebView2 has started. + + Thrown if initialization of the control's CoreWebView2 has already started. + + + + Explicitly trigger initialization of the control's . + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass null (the default value) then a default environment will be created and used automatically. + + + A pre-created that should be used to create the . + Creating your own controller options gives you control over several options that affect how the is initialized. + If you pass a controllerOptions to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default controllerOptions will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes + or on exceptions. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + The following summarizes the possible error values and a description of why these errors occur. + + + Error Value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + *\\Edge\\Application* path used in browserExecutableFolder. + + + HRESULT_FROM_WIN32(ERROR_INVALID_STATE) + Specified options do not match the options of the WebViews that are currently running in the shared browser process. + + + HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) + WebView2 Initialization failed due to an invalid host HWND parentWindow. + + + HRESULT_FROM_WIN32(ERROR_DISK_FULL) + WebView2 Initialization failed due to reaching the maximum number of installed runtime versions. + + + HRESULT_FROM_WIN32(ERROR_PRODUCT_UNINSTALLED + If the Webview depends upon an installed WebView2 Runtime version and it is uninstalled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Could not find Edge installation. + + + HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) + User data folder cannot be created because a file with the same name already exists. + + + E_ACCESSDENIED + Unable to create user data folder, Access Denied. + + + E_FAIL + Edge runtime unable to start. + + + + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if this instance of is already disposed, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Explicitly trigger initialization of the control's . + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass null then a default environment will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes + or on exceptions. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if this instance of is already disposed, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + This is the private function which implements the actual background initialization task. + Cannot be called if the control is already initialized or has been disposed. + + + The environment to use to create the . + If that is null then a default environment is created with and its default parameters. + + + The controllerOptions to use to create the . + If that is null then a default controllerOptions is created with its default parameters. + + A task representing the background initialization process. + All the event handlers added here need to be removed in . + + + + Protected CreateParams property. Used to set custom window styles to the forms HWND. + + + + + Protected VisibilityChanged handler. + + + + + Protected SizeChanged handler. + + + + + Protected Select method: override this to capture tab direction when WebView control is activated + + + + + Protected OnGotFocus handler. + + + + + Protected OnParentChanged handler. + + + + + True if initialization finished successfully and the control is not disposed yet. + + + + + Recursive retrieval of the parent control + + The control to get the parent for + The root parent control + + + + The underlying CoreWebView2. Use this property to perform more operations on the WebView2 content than is exposed + on the WebView2. This value is null until it is initialized and the object itself has undefined behaviour once the control is disposed. + You can force the underlying CoreWebView2 to + initialize via the method. + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + + + + The zoom factor for the WebView. + + + + + Enable/disable external drop. + + + + + The Source property is the URI of the top level document of the + WebView2. Setting the Source is equivalent to calling . + Setting the Source will trigger initialization of the , if not already initialized. + The default value of Source is null, indicating that the is not yet initialized. + + Specified value is not an absolute . + Specified value is null and the control is initialized. + + + + + Returns true if the webview can navigate to a next page in the + navigation history via the method. + This is equivalent to the . + If the underlying is not yet initialized, this property is false. + + + + + + Returns true if the webview can navigate to a previous page in the + navigation history via the method. + This is equivalent to the . + If the underlying is not yet initialized, this property is false. + + + + + + The default background color for the WebView. + + + + + Executes the provided script in the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Reloads the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Navigates to the next page in navigation history. + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + Navigates to the previous page in navigation history. + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + Renders the provided HTML as the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + + Stops any in progress navigation in the . + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + This event is triggered either 1) when the control's has finished being initialized (regardless of how it was triggered or whether it succeeded) but before it is used for anything + OR 2) the initialization failed. + You should handle this event if you need to perform one time setup operations on the CoreWebView2 which you want to affect all of its usages + (e.g. adding event handlers, configuring settings, installing document creation scripts, adding host objects). + + + This sender will be the WebView2 control, whose CoreWebView2 property will now be valid (i.e. non-null) for the first time + if is true. + Unlikely this event can fire second time (after reporting initialization success first) + if the initialization is followed by navigation which fails. + + + + + NavigationStarting dispatches before a new navigate starts for the top + level document of the . + This is equivalent to the event. + + + + + + NavigationCompleted dispatches after a navigate of the top level + document completes rendering either successfully or not. + This is equivalent to the event. + + + + + + WebMessageReceived dispatches after web content sends a message to the + app host via chrome.webview.postMessage. + This is equivalent to the event. + + + + + + SourceChanged dispatches after the property changes. This may happen + during a navigation or if otherwise the script in the page changes the + URI of the document. + This is equivalent to the event. + + + + + + ContentLoading dispatches after a navigation begins to a new URI and the + content of that URI begins to render. + This is equivalent to the event. + + + + + + ZoomFactorChanged dispatches when the property changes. + This is equivalent to the event. + + + + + + Required designer variable. + + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.dll new file mode 100644 index 0000000..ed79cd9 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.xml b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.xml new file mode 100644 index 0000000..c6e27b6 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/Microsoft.Web.WebView2.Wpf.xml @@ -0,0 +1,1932 @@ + + + + Microsoft.Web.WebView2.Wpf + + + + + This class is a bundle of the most common parameters used to create and instances. + Its main purpose is to be set to in order to customize the environment and/or controller used by a during implicit initialization. + It is also a nice WPF integration utility which allows commonly used environment/controller parameters to be dependency properties and be created and used in markup. + + + This class isn't intended to contain all possible environment or controller customization options. + If you need complete control over the environment and/or controller used by a WebView2 control then you'll need to initialize the control explicitly by + creating your own environment (with ) and/or controller options (with ) and passing them to + *before* you set the property to anything. + See the class documentation for an initialization overview. + + + + + Creates a new instance of with default data for all properties. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to pass as the browserExecutableFolder parameter of when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to pass as the userDataFolder parameter of when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the Language property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the AdditionalBrowserArguments property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the AreBrowserExtensionsEnabled property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the ProfileName property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the IsInPrivateModeEnabled property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the ScriptLocale property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Create a using the current values of this instance's properties. + + A task which will provide the created environment on completion, or null if no environment-related options are set. + + As long as no other properties on this instance are changed, repeated calls to this method will return the same task/environment as earlier calls. + If some other property is changed then the next call to this method will return a different task/environment. + + + + + Create a using the current values of this instance's properties. + + A object or null if no controller-related properties are set. + Thrown if the parameter environment is null. + + + + This class provides helper methods for working with Direct3D in the WebView2 WPF control. + It includes methods for creating Direct3D9 and Direct3D11 devices, creating textures, + copying resources, and getting shared handles, among others. These methods are used in + the GraphicsItemD3DImage class to interact with Direct3D objects and resources. + + + The class includes PInvoke declarations for calling Direct3D functions from unmanaged code. + It also defines several COM interfaces and structures necessary for interacting with + Direct3D objects. + Note: This class is intended for internal use by the WebView2 WPF control and should not + be used directly by application developers. + + + + + This Class is a capturing the content of the provided (the WebView2 visual). + + + + + Tracks the conditions which block implicit initialization and whether it has been requested or not. + The analogy is a set of gates which are either open (implicit init allowed) or closed (will have to wait). + All sub-gates must be open before implicit init can proceed. + If implicit init is requested while the gate is open then it happens immediately. + If it's requested while the gate is closed then it occurs when the gate becomes open. + + + It should be reasonably straight-forward to expand this class in the future to: + * add new sub-gates to further restrict when implicit initialization can occur + * support storing and invoking multiple actions next time the gate is open instead of only one + + + + + Tracks whether a sub-gate regarding / is open or closed. + This sub-gate is only closed after calls to `BeginInit` and before an equal number of calls to `EndInit`. + + + We don't want implicit initialization to occur in between those calls, + because implicit initialization is a side effect of setting the Source property, + and side effects of setting properties during that period are supposed to be delayed until `EndInit`. + + + + + How many times has been called without being called. + + + + + Tracks whether a sub-gate regarding is open or closed. + This sub-gate is closed if `SynchronizationContext.Current == null`. + + + Initialization won't work without a `SynchronizationContext` because otherwise an `await` might resume on a different thread. + As far as I know so far this only occurs before an event loop as started on the running thread. + Once there's an event loop running the `SynchronizationContext` ensures that `await`s resume in the same event loop (i.e. same thread). + Although it's a rare corner case, it's possible to create a `Window` w/ `WebView2` before an app's event loop starts. + This sub-gate handles that corner case. + + + + + An action which will trigger initialization next time the gate is open (and only once). + + + This basically tracks whether or not implicit initialization has been requested while the gate is closed. + If this is non-null then it should be a delegate that calls . + + + + + Closes the gate until is called an equal number of times. + + + + + Opens the gate closed by after being called the same number of times. + + + + + A handler that should be attached to an event which indicates that exists. + The best one I know of right now is . + When the handler is called, the gate will re-evaluate its state and potentially allow any pending initialization action. + + + + + Run a given action when the gate is open. + + + If the gate is currently open then the action runs immediately. + Otherwise the action runs next time the gate is discovered to be open. + The action is only ever run once; it will not run again a second/subsequent time the gate opens. + If the gate is closed and another action is already pending then the new action *overwrites* the current one (i.e. the currently stored action will never run). + To "forget" a currently stored action, pass `null`. + + Action to run when the gate is open, or null to clear a previously specified action. + + + + Examine our overall open/closed state and run any pending action if appropriate. + + + + + The public interfaces of WebView2 WPF control. + + + + + Gets or sets a bag of options which are used during initialization of the control's . + Setting this property will not work after initialization of the control's has started (the old value will be retained). + See the class documentation for an initialization overview. + + + + + + Accesses the complete functionality of the underlying COM API. + Returns null until initialization has completed. + See the class documentation for an initialization overview. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + The event is raised when the property changes. + This event directly exposes . + + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + This event is triggered either + 1) when the control's has finished being initialized (regardless of how initialization was triggered) but before it is used for anything, or + 2) if the initialization failed. + You should handle this event if you need to perform one time setup operations on the which you want to affect all of its usages. + (e.g. adding event handlers, configuring settings, installing document creation scripts, adding host objects). + See the class documentation for an initialization overview. + + + This sender will be the control, whose property will now be valid (i.e. non-null) for the first time + if is true. + Unlikely this event can fire second time (after reporting initialization success first) + if the initialization is followed by navigation which fails. + + + + + + Explicitly triggers initialization of the control's . + See the class documentation for an initialization overview. + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass an environment to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default environment will be created and used automatically. + + + A pre-created that should be used to create the . + Creating your own controller options gives you control over several options that affect how the is initialized. + If you pass a controllerOptions to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default controllerOptions will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress, unless previous initialization has already failed. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + The following summarizes the possible error values and a description of why these errors occur. + + + Error Value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + *\\Edge\\Application* path used in browserExecutableFolder. + + + HRESULT_FROM_WIN32(ERROR_INVALID_STATE) + Specified options do not match the options of the WebViews that are currently running in the shared browser process. + + + HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) + WebView2 Initialization failed due to an invalid host HWND parentWindow. + + + HRESULT_FROM_WIN32(ERROR_DISK_FULL) + WebView2 Initialization failed due to reaching the maximum number of installed runtime versions. + + + HRESULT_FROM_WIN32(ERROR_PRODUCT_UNINSTALLED + If the Webview depends upon an installed WebView2 Runtime version and it is uninstalled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Could not find Edge installation. + + + HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) + User data folder cannot be created because a file with the same name already exists. + + + E_ACCESSDENIED + Unable to create user data folder, Access Denied. + + + E_FAIL + Edge runtime unable to start. + + + + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if is null, which probably indicates that the application's event loop hasn't started yet. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Explicitly triggers initialization of the control's . + See the class documentation for an initialization overview. + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass an environment to this method then it will override any settings specified on the property. + If you pass null and no value has been set to then a default environment will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress, unless previous initialization has already failed. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if is null, which probably indicates that the application's event loop hasn't started yet. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + The top-level which the WebView is currently displaying (or will display once initialization of its is finished). + Generally speaking, getting this property is equivalent to getting the property and setting this property (to a different value) is equivalent to calling the method. + + + Getting this property before the has been initialized will retrieve the last Uri which was set to it, or null (the default) if none has been. + Setting this property before the has been initialized will cause initialization to start in the background (if not already in progress), after which the will navigate to the specified . + This property can never be set back to null or to a relative . + See the class documentation for an initialization overview. + + Thrown if has already been called on the control. + Thrown if the property is set to null. + Thrown if the property is set to a relative (i.e. a whose property is false). + + + + + Returns true if the WebView can navigate to a previous page in the navigation history. + Wrapper around the property of . + If isn't initialized yet then returns false. + + + + + + Returns true if the WebView can navigate to a next page in the navigation history. + Wrapper around the property of . + If isn't initialized yet then returns false. + + + + + + The zoom factor for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was set to it, or 1.0 (the default) if none has been. + The most recent value set to this property before the CoreWebView2 has been initialized will be set on it after initialization. + + + + + + The default background color for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was + set to it, or Color.White (the default) if none has been. + The most recent value set to this property before CoreWebView2Controller has been initialized will be set on it after initialization. + + + + + The foreground color to be used in design mode. + + + + + The AllowExternalDrop property for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was + set to it, or true (the default) if none has been. + The most recent value set to this property before CoreWebView2Controller has been initialized will be set on it after initialization. + + + + + Navigates the WebView to the previous page in the navigation history. + Equivalent to calling + If hasn't been initialized yet then does nothing. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Navigates the WebView to the next page in the navigation history. + Equivalent to calling . + If hasn't been initialized yet then does nothing. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Reloads the current page. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Stops all navigations and pending resource fetches. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Initiates a navigation to htmlContent as source HTML of a new document. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + + + Executes JavaScript code from the javaScript parameter in the current top level document rendered in the WebView. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Attempts to set focus to the WebView2 Control. + Equivalent to calling . + Returns true if keyboard focus and logical focus were set to this element; + false if only logical focus was set to this element, or if the call to this method did not force the focus to change. + + + + + Defines internal operations specific to the WebView2 WPF control, separating the control-specific logic + that cannot be shared across different types of controls. + + + + + Initializes the WebView2 controller with operations specific to the control type. + + + + + Unregister controller's handlers specific to the control type. + + + + + A control to embed web content in a WPF application. + + + This control is effectively a wrapper around the [WebView2 COM API](https://aka.ms/webview2). + You can directly access the underlying + ICoreWebView2 interface and all of its functionality by accessing the + property. Some of the most common COM + functionality is also accessible directly through wrapper + methods/properties/events on the control. + + Upon creation, the control's property will be + null. This is because creating the is an + expensive operation which involves things like launching Edge browser + processes. There are two ways to cause the to + be created: + + + Call the method. This is + referred to as explicit initialization. + + + Set the property (which could be done from + markup, for example). This is referred to as implicit initialization. + Either option will start initialization in the background and return + back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass + your own to or set the control's property prior to initialization. + + + + When initialization has finished (regardless of how it was triggered or + whether it succeeded) then the following things will occur, in this + order: + + + The control's event + will be invoked. If you need to perform one time setup operations on + the prior to its use then you should + do so in a handler for that event. + + + If initialization was successful and a Uri has been set to the property then the control will start navigating to it in + the background (i.e. these steps will continue without waiting for the + navigation to finish). + + + The Task returned from will + complete. + + + + For more details about any of the methods/properties/events involved in + the initialization process, see its specific documentation. + + Because the control's is a very heavyweight + object (potentially responsible for multiple running processes and + megabytes of disk space) the control implements to provide an explicit means to free it. + Calling will release the + and its underlying resources (except any that are also being used by other + WebViews), and reset to null. After has been called the cannot be + re-initialized, and any attempt to use functionality which requires it + will throw an . + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + Note that this control extends in order to embed + windows which live outside of the WPF ecosystem. This has some + implications regarding the control's input and output behavior as well as + the functionality it "inherits" from and . + See the and [WPF/Win32 interop](/dotnet/framework/wpf/advanced/wpf-and-win32-interoperation#hwnds-inside-wpf) + documentation for more information. + + + + + + Creates a new instance of a WebView2 control. + Note that the control's will be null until initialized. + See the class documentation for an initialization overview. + + + + + The WPF which backs the property. + + + + + + + + + This is overridden from and is called to instruct us to create our HWND. + + The HWND that we should use as the parent of the one we create. + The HWND that we created. + + + + + This is overridden from and is called to instruct us to destroy our HWND. + + Our HWND that we need to destroy. + + + + + This is overridden from and is called to provide us with Win32 messages that are sent to our hwnd. + + Window receiving the message (should always match our ). + Indicates the message being received. See Win32 documentation for WM_* constant values. + The "wParam" data being provided with the message. Meaning varies by message. + The "lParam" data being provided with the message. Meaning varies by message. + If true then the message will not be forwarded to any (more) handlers. + Return value varies by message. + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + Override for painting to draw + + The tools to handle the drawing via . + + + + + + + + + + + + + + + + + + + + + + This is called by our base class according to the typical implementation of the pattern. + We implement it by releasing all of our underlying COM resources, including our . + + True if a caller is explicitly calling Dispose, false if we're being finalized. + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + Changes our controller's ParentWindow to the given HWND, along with any other necessary associated work. + + The new HWND to set as the controller's parent. IntPtr.Zero means that the controller will have no parent and the CoreWebView2 will be hidden. + Whether or not to call as required. Defaults to true. If you pass false then you should call it yourself if required. + + Reparenting the controller isn't necessarily as simple as changing its ParentWindow property, + and this method exists to ensure that any other work that needs to be done at the same time gets done. + The reason that SyncControllerWithParentWindow isn't baked directly into this method is because + sometimes we want to call the Sync functionality without necessarily reparenting (e.g. during initialization). + + + + + Syncs visual/windowing information between the controller and its parent HWND. + This should be called any time a new, non-null HWND is set as the controller's parent, + including when the controller is first created. + + + + + This is overridden from and called when our control's location has changed. + The HwndHost takes care of updating the HWND we created. + What we need to do is move our CoreWebView2 to match the new location. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + This is overridden from and is called to inform us that tabbing has caused the focus to move into our control/window. + Since WPF can't manage the transition of focus to a non-WPF HWND, it delegates the transition to us here. + So our job is just to place the focus in our external HWND. + + Information about how the focus is moving. + true to indicate that we handled the navigation, or false to indicate that we didn't. + + + + This is overridden from and called to allow us to handle key press input. + WPF should never actually call this in response to keyboard events because we're hosting a non-WPF window. + When our window has focus Windows will send the input directly to it rather than to WPF's top-level window and input system. + This override should only be called when we're explicitly forwarding accelerator key input from the CoreWebView2 to WPF (in CoreWebView2Controller_AcceleratorKeyPressed). + Even then, this KeyDownEvent is only triggered because our PreviewKeyDownEvent implementation explicitly triggers it, matching WPF's usual system. + So the process is: + + CoreWebView2Controller_AcceleratorKeyPressed + PreviewKeyDownEvent + KeyDownEvent + OnKeyDown + + . + + + + + See . + + + + + This is the "Preview" (i.e. tunneling) version of , so it actually happens first. + Like OnKeyDown, this will only ever be called if we're explicitly forwarding key presses from the CoreWebView2. + In order to mimic WPF's standard input handling, when we receive this we turn around and fire off the standard bubbling KeyDownEvent. + That way others in the WPF tree see the same standard pair of input events that WPF itself would have triggered if it were handling the key press. + + + + + + See . + + + + + The WPF which backs the property. + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True when we're in design mode and shouldn't create an underlying CoreWebView2. + + + + + The WPF which backs the property. + + + + + + + + + Design mode drawing content. + + + + + + + + + + + + + + + + + This is an event handler for our CoreWebView2's ProcessFailedEvent. + + + + + This is a "gate" which controls whether or not implicit initialization can occur. + If implicit initialization is triggered while the gate is closed, + then the initialization should be delayed until the gate opens. + When we want to trigger implicit initialization we route the call through this gate. + If the gate is open then the initialization will proceed. + If the gate is closed then it will remember to trigger the initialization when it opens. + + + + + Implementation of the ISupportInitialize pattern. + + + + + Implementation of the ISupportInitialize pattern. + + + + + Updates one of our dependency properties to match a new value from the . + It both sets the value and remembers (in _propertyChangingFromCore) that it came from the CoreWebView2 rather than the caller, + allowing the property's "on changed" handler to alter its behavior based on where the new value came from. + It's only intended to be called in a CoreWebView2 event handler that's informing us of a new property value. + It's basically just a wrapper around the inherited SetCurrentValue which also maintains _propertyChangingFromCore. + See the comments on for additional background info. + One more thing worth explicitly stating is that it wraps SetCurrentValue rather than SetValue, + in order to avoid overwriting any OneWay bindings that are set on the specified properties. + Check the link https://stackoverflow.com/q/4230698 for more information about the difference between SetValue and SetCurrentValue. + + The property to change due to an equivalent change in the CoreWebView2. + The new value from the CoreWebView2. + + + + Checks if a given property is currently being updated to match an equivalent change in the . + This method should only be called from a property's "on changed" handler; it has no meaning at any other time. + It is used to determine if the property is changing to match the CoreWebView2 or because the caller set it. + Usually this is used in order to decide if the new value needs to be propagated down to the CoreWebView2. + See the comments on for additional background info. + + The property to check. + True if the property is changing to match the CoreWebView2, or false if the property was changed by the caller. + + + + This is a handler for our base UIElement's IsVisibleChanged event. + It's predictably fired whenever IsVisible changes, and IsVisible reflects the actual current visibility status of the control. + We just need to pass this info through to our CoreWebView2Controller so it can save some effort when the control isn't visible. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls to validate a potential new Source value. + + + True if the value is valid, false if it is not. + If we return false then WPF should respond by throwing an . + + + Note that we unfortunately can't treat null as invalid here because null is valid prior to initialization. + + + + + This is a callback that WPF calls when the WPF Source property's value changes. + This might have been triggered by either: + 1) The caller set Source to programmatically trigger a navigation. + 2) The CoreWebView changed its own source and we're just updating the dependency property to match. + We use to distinguish the two cases. + + + + + + + + This is an event handler for our CoreWebView2's SourceChanged event. + Unsurprisingly, it fires when the CoreWebView2's source URI has been changed. + Note that there are two distinct triggers for this: + 1) The CoreWebView2 was told to navigate programmatically (potentially by us, see SourcePropertyChanged). + 2) The user interacted with the CoreWebView2, e.g. clicked a link. + In either of the above cases, this event might trigger several times due to e.g. redirection. + Aside from propagating to our own event, we just need to update our WPF Source property to match the CoreWebView2's. + + + + + + + + This is an event handler for our CoreWebView2's NavigationStarting event. + We just need to propagate the event to WPF. + + + + + + + + This is an event handler for our CoreWebView2's NavigationCompleted event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2's HistoryChanged event. + We're handling it in order to update our WPF CanGoBack and CanGoForward properties. + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + This is an event handler for our CoreWebView2Controller's MoveFocusRequested event. + It fires when the CoreWebView2Controller has focus but wants to move it elsewhere in the app. + E.g. this happens when the user tabs past the last item in the CoreWebView2 and focus needs to return to some other app control. + So our job is just to tell WPF to move the focus on to the next control. + Note that we don't propagate this event outward as a standard WPF routed event because we've implemented its purpose here. + If users of the control want to track focus shifting in/out of the control, they should use standard WPF events. + + + + + This is an event handler for our CoreWebView2Controller's GotFocus event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2Controller's LostFocus event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2Controller's AcceleratorKeyPressed event. + This is called to inform us about key presses that are likely to have special behavior (e.g. esc, return, Function keys, letters with modifier keys). + WPF can't detect this input because Windows sends it directly to the Win32 CoreWebView2Controller control. + We implement this by generating standard WPF key input events, allowing callers to handle the input in the usual WPF way if they want. + If nobody handles the WPF key events then we'll allow the default CoreWebView2Controller logic (if any) to handle it. + Of the possible options, this implementation should provide the most flexibility to callers. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF ZoomFactor property's value changes. + This might have been triggered by either: + 1) The caller set ZoomFactor to change the zoom of the CoreWebView2. + 2) The CoreWebView2 changed its own ZoomFactor and we're just updating the dependency property to match. + We use to distinguish the two cases. + + + + + + + + This is an event handler for our CoreWebView2Controller's ZoomFactorChanged event. + Unsurprisingly, it fires when the CoreWebView2Controller's ZoomFactor has been changed. + Note that there are two distinct triggers for this: + 1) The value was changed programmatically (potentially by us, see ZoomFactorPropertyChanged). + 2) The user interacted with the CoreWebView2, e.g. CTRL + Mouse Wheel. + Aside from propagating to our own event, we just need to update our WPF ZoomFactor property to match the CoreWebView2Controller's. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF DefaultBackgroundColor property's value changes. + Since CoreWebView2Controller does not update this property itself, this is only triggered by the + caller setting DefaultBackgroundColor. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF AllowExternalDrop property's value changes. + Since CoreWebView2Controller does not update this property itself, this is only triggered by the + caller setting AllowExternalDrop. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + + + + + + + + + + This is an event handler for our CoreWebView2's ContentLoading event. + We just need to propagate the event to WPF. + + + + + + + + + + + This is an event handler for our CoreWebView2's WebMessageReceived event. + We just need to propagate the event to WPF. + + + + + Moves focus to the CoreWebView2Controller according to the + + + + + This is an event handler for the event. + It is called to inform us when we receive the keyboard focus. + We handle this by passing the keyboard focus on to the underlying . + We never want to land in a state where our control actually has the keyboard focus. + + The control that received keyboard focus. + Arguments from the underlying GotKeyboardFocus event. + + For WebView2 control, it's actually possible for us to receive keyboard focus without this method being called. + One known case where that happens is when our parent window is deactivated while we have focus, then reactivated. + We handle that case in . + + + + + + Implementation of pattern. + Developers should never reach the WebView2Base class here. + + + + + Implementation of the pattern. + Should on be called during m_element's Dispose(). + When this is called, it means all resources releted to the control are disposed and we can safely remove the control from the dictionary. + + + + + Visual hosting version of the WebView2 control. + + + This control is effectively a wrapper around the [WebView2 COM + API](https://aka.ms/webview2). You can directly access the underlying + ICoreWebView2 interface and all of its functionality by accessing the + property. Some of the most common COM + functionality is also accessible directly through wrapper + methods/properties/events on the control. + + Upon creation, the control's property will be + null. This is because creating the is an + expensive operation which involves things like launching Edge browser + processes. There are two ways to cause the to + be created: + + + Call the method. This is + referred to as explicit initialization. + + + Set the property (which could be done from + markup, for example). This is referred to as implicit initialization. + Either option will start initialization in the background and return + back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass + your own to or set the control's property prior to initialization. + + + + When initialization has finished (regardless of how it was triggered or + whether it succeeded) then the following things will occur, in this + order: + + + The control's event + will be invoked. If you need to perform one time setup operations on + the prior to its use then you should + do so in a handler for that event. + + + If initialization was successful and a Uri has been set to the property then the control will start navigating to it in + the background (i.e. these steps will continue without waiting for the + navigation to finish). + + + The Task returned from will + complete. + + + + For more details about any of the methods/properties/events involved in + the initialization process, see its specific documentation. + + Because the control's is a very heavyweight + object (potentially responsible for multiple running processes and + megabytes of disk space) the control implements to provide an explicit means to free it. + Calling will release the + and its underlying resources (except any that are also being used by other + WebViews), and reset to null. After has been called the cannot be + re-initialized, and any attempt to use functionality which requires it + will throw an . + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + This control extends in order to host the image + displaying WebView's content using template. This has some + implications regarding the control's input and output behavior as well as + the functionality it "inherits" from and . + + The content of is rendered by an . + By default, of WebView2CompositionControl + is set to true. This can prevent the from becoming blurry at certain dimensions, + but it disables anti-aliasing. Set it to false if you want to keep the anti-aliasing. + + Note that the uses a [GraphicsCaptureSession](https://learn.microsoft.com/en-us/uwp/api/windows.graphics.capture.graphicscapturesession) + to capture the screen content from the underlying browser processes. + As such, you may experience lower framerates compared to the standard control, and DRM protected + content will fail to play or display properly. + + + + + + + TemplatePart Name constant for the Image used to represent WebView2. + + + + + Image control uses to display content of WebView2. + + + + + Component used to capture from WebView visual and work as source of Image. + + + + + interface. + + + + + Static constructor for the WebView2CompositionControl class. + + + This static constructor is responsible for overriding the default style key property + for instances of the WebView2CompositionControl class. It sets the metadata to use + the type of the WebView2CompositionControl as the default style key. + See href="https://learn.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.defaultstylekey?view=netframework-4.8.1"/> + + + + + Creates a new instance of a WebView2Composition control. + Note that the control's will be null until initialized. + See the class documentation for an initialization overview. + + + + + This is an event handler for WPF control's SizeChanged event. + We use CoreWebView2Controller.NotifyParentWindowPositionChanged to notify our browser our + size and relative location has changed. + + + + + This is an event handler for WPF control's LocationChange event. + We use CoreWebView2Controller.NotifyParentWindowPositionChanged to notify our browser our + position has changed. + + + + + Initialize the dispatcher queue. + + + + + This is an event handler for our CoreWebView2CompositionController's CursorChanged event. + We use CursorInteropHelper to Obtain a WPF Cursor from the provided Win32 Handle. + + + + + Send the pointer event to the WebView2 Control. + + + + + + This is an event handler for WPF control's OnTouchDown event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + This is an event handler for WPF control's OnTouchMove event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + This is an event handler for WPF control's OnTouchUp event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + Helper function to get the of the mouse event. + + + + + Send the mouse event to the WebView2 Control. + + + + + + This is an event handler for WPF control's OnMouseMove event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseDown event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseUp event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseWheel event. + We use CoreWebView2CompositionController.SendMouseInput to send the input to our browser. + + + + + This is an event handler for WPF control's OnMouseDoubleClick event. + We use CoreWebView2CompositionController.SendMouseInput to send the input to our browser. + + + + + The WPF which backs the property. + + + + + + + + + Override for painting to draw + + The tools to handle the drawing via . + + + + + + + + + + + + + + + + + + + + + + Implementation of the pattern. + This will release all of our underlying COM resources. + + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + WebView2Composition Control only needs IKeyboardInputSink:TabInto to get the direction of tab traversal. + KeyboardInputSite is not implemented by WebView2Composition. + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + This is an event handler for our CoreWebView2Controller's GotFocus event. + Used to record whether the control currently has focus. + + + + + This is an event handler for our CoreWebView2Controller's Lost event. + We just need to propagate the event to WPF. + + + + + IKeyboardInputSink:HasFocusWithin interface. + Whether WebView has focus. + + + + + IKeyboardInputSink:OnMnemonic interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:RegisterKeyboardInputSink interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:TabInto interface. + + + + + IKeyboardInputSink:TranslateAccelerator interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:TranslateChar interface. + Not implemented by WebView2. + + + + + This is overridden from and called to allow us to handle key press input. + WPF should never actually call this in response to keyboard events because the focus is on the controller's HWND. + When Controller's HWND has focus, WPF does not know the Controller's HWND belongs to this control, and the key event will not be fired for this control and WPF main window. + This override should only be called when we're explicitly forwarding accelerator key input from the CoreWebView2 to WPF (in CoreWebView2Controller_AcceleratorKeyPressed). + Even then, this KeyDownEvent is only triggered because our PreviewKeyDownEvent implementation explicitly triggers it, matching WPF's usual system. + So the process is: + + CoreWebView2Controller_AcceleratorKeyPressed + PreviewKeyDownEvent + KeyDownEvent + OnKeyDown + + . + + + + + See . + + + + + This is the "Preview" (i.e. tunneling) version of , so it actually happens first. + Like OnKeyDown, this will only ever be called if we're explicitly forwarding key presses from the CoreWebView2. + In order to mimic WPF's standard input handling, when we receive this we turn around and fire off the standard bubbling KeyDownEvent. + That way others in the WPF tree see the same standard pair of input events that WPF itself would have triggered if it were handling the key press. + + + + + + See . + + + + + The WPF which backs the property. + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + Gets or sets the divider for the rendering frame rate of the WebViewCompositionControl. + + + The FpsDivider property affects how the rendering frame rate is divided. For example, if the default rendering frame rate of the content is 60 frames + per second (fps), setting the FpsDivider to 2 reduces the frame rate to 30 fps. This property is useful for reducing the rendering load and improving + performance for scenarios where high frame rates are unnecessary. + + + + + This is a callback that WPF calls when our WPF FpsDivider property's value changes. + We implement it by setting the FpsDivider of the GraphicsItemD3DImage. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True when we're in design mode and shouldn't create an underlying CoreWebView2. + + + + + GeneratedInternalTypeHelper + + + + + CreateInstance + + + + + GetPropertyValue + + + + + SetPropertyValue + + + + + CreateDelegate + + + + + AddEventHandler + + + + diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/SQLitePCLRaw.batteries_v2.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/SQLitePCLRaw.batteries_v2.dll new file mode 100644 index 0000000..f9eb46b Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/SQLitePCLRaw.batteries_v2.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/SQLitePCLRaw.core.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/SQLitePCLRaw.core.dll new file mode 100644 index 0000000..556d40f Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/SQLitePCLRaw.core.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/SQLitePCLRaw.provider.e_sqlite3.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/SQLitePCLRaw.provider.e_sqlite3.dll new file mode 100644 index 0000000..a6df9a6 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/SQLitePCLRaw.provider.e_sqlite3.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/System.Diagnostics.EventLog.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/System.Diagnostics.EventLog.dll new file mode 100644 index 0000000..6281e73 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/System.Diagnostics.EventLog.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/System.IO.Packaging.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/System.IO.Packaging.dll new file mode 100644 index 0000000..eb95db7 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/System.IO.Packaging.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/System.ServiceProcess.ServiceController.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/System.ServiceProcess.ServiceController.dll new file mode 100644 index 0000000..0d456dc Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/System.ServiceProcess.ServiceController.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Core.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Core.dll new file mode 100644 index 0000000..d623133 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Core.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Fonts.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Fonts.dll new file mode 100644 index 0000000..444918b Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Fonts.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Tokenization.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Tokenization.dll new file mode 100644 index 0000000..a9b3be9 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Tokenization.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Tokens.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Tokens.dll new file mode 100644 index 0000000..7595fb6 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.Tokens.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.dll new file mode 100644 index 0000000..3645736 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/UglyToad.PdfPig.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/WebView2Loader.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/WebView2Loader.dll new file mode 100644 index 0000000..983ee32 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/WebView2Loader.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/e_sqlite3.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/e_sqlite3.dll new file mode 100644 index 0000000..379665c Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/e_sqlite3.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/AX Copilot 사용가이드.htm b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/AX Copilot 사용가이드.htm new file mode 100644 index 0000000..0f1b8a3 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/AX Copilot 사용가이드.htm @@ -0,0 +1,1101 @@ + + + + + +AX Copilot 사용 가이드 — 단축키 & 예약어 완전 정복 + + + +
      + + + + +
      +
      🚀 AX Copilot 사용 가이드
      +

      단축키 & 예약어 완전 정복
      — 키보드 하나로 모든 업무를

      +

      + Windows 전용 시맨틱 런처 AX Copilot의 모든 단축키와 명령 예약어를 한 페이지에 정리했습니다.
      + Alt+Space 한 번으로 앱 실행·파일 검색·계산·클립보드·화면 캡처·창 전환·시스템 제어 등 40개 이상의 기능을 즉시 호출합니다. +

      +
      v1.5.0
      +
      + + + + + + + + + +

      ⚡ 가장 많이 쓰는 단축키 한눈에

      +
      +
      +
      🤖
      +
      ! (AX Copilot)
      AI 어시스턴트와 대화 시작
      +
      +
      +
      ⌨️
      +
      Alt + Space
      런처 열기 / 닫기
      +
      +
      +
      +
      Enter
      선택 항목 실행
      +
      +
      +
      +
      → (오른쪽)
      파일 액션 모드 진입
      +
      +
      +
      +
      Escape
      닫기 / 이전 단계로
      +
      +
      +
      📋
      +
      Ctrl + H
      클립보드 히스토리
      +
      +
      +
      +
      Ctrl + B
      즐겨찾기 보기 토글
      +
      +
      +
      📌
      +
      Ctrl + P
      즐겨찾기 추가 / 제거
      +
      +
      +
      ?
      +
      Ctrl + K
      단축키 참조창 열기
      +
      +
      +
      🖥
      +
      Ctrl + T
      터미널에서 열기
      +
      +
      +
      📂
      +
      Ctrl + D
      다운로드 폴더
      +
      +
      +
      🔢
      +
      Ctrl + 1~9
      N번째 항목 즉시 실행
      +
      +
      +
      F5
      +
      F5
      인덱스 새로고침
      +
      +
      + +
      +💡 Tip. 입력창이 비어 있을 때 Home/End 키를 누르면 결과 목록의 첫/마지막 항목으로 바로 이동합니다. +설정에서 글로벌 단축키를 원하는 키 조합으로 자유롭게 변경할 수 있습니다. +
      + + + + +

      🌐 1. 전역 단축키 (시스템 전체)

      +
      + + + + + + + + + + +
      단축키동작비고
      Alt + Space런처 창 열기 / 닫기 (토글)기본값 · 설정에서 변경 가능
      PrintScreen화면 캡처 즉시 실행설정 › 캡처에서 활성화 필요
      +
      + + + + +

      🪟 2. 런처 창 단축키

      + +
      📍 탐색 & 선택
      +
      + + + + + + + + + + + + + + +
      단축키동작상세
      / 결과 목록 위/아래 이동끝에서 누르면 반대쪽으로 순환
      PageUp / PageDown5칸씩 빠른 이동
      Home / End첫 항목 / 마지막 항목으로 점프입력창 커서 위치 기반
      Tab선택 항목 제목을 입력창에 자동완성
      파일 액션 모드 진입복사·터미널·속성·삭제 등
      Escape액션 모드 종료 / 런처 닫기
      +
      + +
      ▶ 실행
      +
      + + + + + + + + + + + + + +
      단축키동작상세
      Enter선택 항목 실행파일·앱·URL·명령 모두 지원
      Ctrl + Enter관리자 권한으로 실행UAC 권한 상승 후 실행
      Alt + Enter파일 속성 대화상자 열기
      Shift + Enter대형 텍스트 표시 / 클립보드 병합Large Type 또는 다중 선택 병합
      Ctrl + 1 ~ 9N번째 결과 항목 즉시 실행번호 배지와 연동
      +
      + +
      🔧 기능 단축키
      +
      + + + + + + + + + + + + + + + + + +
      단축키동작상세
      F1도움말 창 열기help 입력과 동일
      F2선택 파일 이름 변경 모드
      F5파일 인덱스 즉시 재구축새 파일 추가 후 사용
      Delete최근 실행 목록에서 항목 제거확인 다이얼로그 후 실행
      Ctrl + ,설정 창 열기
      Ctrl + L입력창 전체 초기화
      Ctrl + W런처 즉시 닫기
      Ctrl + K단축키 참조 모달창 열기Esc로 닫기
      Ctrl + F파일 검색 모드로 전환입력 초기화 후 포커스 이동
      +
      + +
      📋 파일 & 클립보드
      +
      + + + + + + + + + + + + + + + + + +
      단축키동작상세
      Ctrl + C선택 항목 파일 이름 복사확장자 제외 이름만
      Ctrl + Shift + C전체 경로 복사절대 경로를 클립보드에
      Ctrl + Shift + E파일 탐색기에서 열기해당 파일이 하이라이트됨
      Ctrl + T선택 항목 위치에서 터미널 열기wt.exe → cmd.exe 폴백
      Ctrl + P즐겨찾기 추가 / 제거 (핀)토스트로 결과 알림
      Ctrl + B즐겨찾기 목록 보기 토글fav 입력 / 초기화
      Ctrl + R최근 실행 목록 보기 토글recent 입력 / 초기화
      Ctrl + H클립보드 히스토리 열기# 입력과 동일
      Ctrl + D다운로드 폴더 바로가기Downloads 경로를 입력창에
      +
      + + + + +

      ⚡ 3. 특수 기호 예약어

      +

      +입력창 맨 앞에 특수 기호를 입력하면 해당 기능 모드로 즉시 전환됩니다. +예약어 없이 입력하면 앱·파일·폴더 퍼지 검색이 실행됩니다. +

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      예약어기능사용 예시
      =계산기 · 단위 변환 · 수식 계산= 1920*1080 → 결과 2073600
      결과를 Enter하면 클립보드에 복사
      $클립보드 텍스트 변환$ upper → 대문자 변환
      $ trim → 공백 제거
      @URL 열기 (등록된 별칭)@blog → 등록된 블로그 URL 열기
      ~워크스페이스 저장 · 복원 · 목록~save 개발 저장
      ~개발 창 배치 복원
      >터미널 명령 즉시 실행> ipconfig
      > ping google.com
      ^앱·파일 직접 실행 (Run)^ notepad
      ^ calc
      ?웹 검색 (기본 브라우저)? WPF DataBinding
      설정에서 검색 엔진 변경 가능
      #클립보드 히스토리 검색·붙여넣기# → 전체 목록
      # 회의 → 필터 검색
      ;스니펫 (텍스트 템플릿) 즉시 확장; email → 이메일 서명 붙여넣기
      실시간으로 커서 위치에 자동 삽입
      /시스템 명령 실행/ lock, / sleep
      / shutdown, / restart
      !AX Copilot (AI 어시스턴트)! 오늘 회의 요약해줘
      v1.0.7 · Ollama/vLLM/Gemini/Claude 4종 지원 · Chat/Cowork/Code 3탭
      *시스템 정보 빠른 조회* ip, * cpu
      * disk → 드라이브 용량
      +
      + +
      + 🤖 AX Agent — 3탭 구조 + + + + + + + + + + + + + +
      Chat연속적인 질의 답변 — 일반 대화, 번역, 요약, 아이디어 브레인스토밍 등 자유로운 AI 대화
      Cowork분석 및 보고서 등의 자료 작성 업무 보조 — 에이전트가 파일 읽기/쓰기, 문서 생성, 데이터 분석을 수행하는 작업 모드
      Code소프트웨어 개발 또는 유지보수를 위한 코딩 도우미 — 코드 개발, 리팩터링, 코드 리뷰, 보안 취약점 점검, 테스트 작성. IDE/런타임 자동 감지
      +
      + +
      +ℹ️ 스니펫 자동 확장 (;) — 런처 없이 어느 앱에서든 미리 등록해 둔 키워드를 입력하면 즉시 텍스트가 확장됩니다. +설정 › 스니펫에서 키워드·내용을 자유롭게 관리할 수 있습니다. +
      + + + + +

      📝 4. 영문 키워드 예약어

      +

      +영문 키워드를 입력창에 입력하면 해당 기능 핸들러가 활성화됩니다. +cd(폴더), fav(즐겨찾기), recent(최근 실행) 등이 대표적입니다. +

      + +
      📁 파일 & 폴더
      +
      + + + + + + + + + + + + +
      예약어기능사용 예시
      cd폴더 열기 (등록된 별칭)cd desktop, cd work, cd C:\projects
      fav즐겨찾기 목록 검색 & 열기fav 전체, fav add 보고서 C:\work\r.xlsx
      recent최근 실행 항목 목록recent, recent chrome
      rename파일 이름 일괄 변경rename *.jpg → photo_*.jpg
      +
      + +
      🖥 시스템 & 정보
      +
      + + + + + + + + + + + + + + + + + + +
      예약어기능사용 예시
      info시스템 정보 (CPU·RAM·드라이브·IP 등)info cpu → 리소스 모니터, info disk → 탐색기
      env환경변수 조회 & 복사env PATH, env APPDATA
      kill프로세스 종료kill chrome, kill notepad
      port포트 사용 프로세스 확인port 8080
      svcWindows 서비스 관리svc list, svc stop wuauserv
      win창 전환 (Window Switcher)win chrome, win code
      snap창 스냅 & 정렬snap left, snap grid
      media미디어 재생 제어media play, media next, media vol 80
      monitor모니터 관리monitor list
      uninstall프로그램 제거uninstall slack
      +
      + +
      📋 텍스트 & 클립보드
      +
      + + + + + + + + + + + + + + + + +
      예약어기능사용 예시
      note메모 저장 & 검색note 회의 메모 내용
      journal업무 일지 작성journal 오늘 배포 완료
      pipe클립보드 텍스트 파이프라인 처리pipe upper | trim | wrap 80
      batch일괄 텍스트 변환batch number, batch sort
      diff두 텍스트 비교 (Diff)diff → 클립보드의 두 텍스트 비교
      encode인코딩 / 디코딩encode base64 hello, encode url
      jsonJSON 파싱 & 미리보기json {"key":"value"}
      stats클립보드 텍스트 통계stats → 글자수·단어수·줄수
      +
      + +
      🛠 유틸리티
      +
      + + + + + + + + + + + + + + + + +
      예약어기능사용 예시
      date날짜 계산date +30 → 30일 후, date -7
      color색상 코드 변환 (HEX·RGB·HSL)color #FF5733
      pick화면 색상 추출 (Eyedropper)pick → 마우스 커서 색상 추출
      emoji이모지 검색 & 복사emoji 웃음, emoji fire
      scaffold프로젝트 폴더 구조 생성scaffold react
      routine반복 작업 루틴 관리routine start 출근
      cap화면 캡처cap screen, cap window, cap region
      help도움말 & 명령어 목록help → 전체 도움말 창 (F1 동일)
      +
      + + + + +

      💡 5. 알아두면 유용한 팁

      + +
      +📌 즐겨찾기 관리
      +파일·폴더를 선택하고 Ctrl + P를 누르면 즐겨찾기에 추가됩니다. 이미 등록된 항목이면 자동으로 제거됩니다. +Ctrl + B로 즐겨찾기 목록을 토글하거나 fav를 입력해 직접 열 수 있습니다. +
      + +
      +📋 클립보드 히스토리 병합
      +#을 입력해 클립보드 히스토리를 열고, Shift + ↑/↓로 여러 항목을 선택한 뒤 +Shift + Enter를 누르면 줄바꿈으로 합쳐서 한 번에 붙여넣을 수 있습니다. +
      + +
      +→ 파일 액션 모드
      +파일·앱 항목이 선택된 상태에서 를 누르면 경로 복사, 탐색기 열기, 관리자 실행, 터미널, 속성 보기, 이름 변경, 휴지통으로 삭제 메뉴가 나타납니다. +
      + +
      +ℹ️ 리소스 모니터info cpu 또는 info ram 항목을 Enter하면 CPU·RAM·드라이브를 실시간으로 표시하는 리소스 모니터 위젯이 별도 창으로 열립니다. (1초 주기 자동 갱신)
      +info disk에서 드라이브 항목을 Enter하면 탐색기로 바로 열립니다. +
      + + + + +

      ⚙️ 6. 설정 › 기능 탭 (토글 목록)

      +

      +설정 창에서 각 기능을 ON/OFF할 수 있으며, 저장 즉시 런처에 반영됩니다. +

      +
      + + + + + + + + + + + + + + +
      항목설명기본값
      번호 배지 (1~9)결과 항목 왼쪽에 번호를 표시해 Ctrl+N 즉시 실행 가능ON
      예약어 배지입력창 왼쪽에 활성 예약어 이름 표시 (예: 📂 폴더)ON
      포커스 잃으면 닫기런처 창 외부 클릭 시 자동으로 숨김ON
      액션 모드→ 키로 파일 액션 서브메뉴 진입 허용ON
      최근 기록 (recent)recent 예약어로 최근 실행 목록 조회 허용ON
      즐겨찾기 (fav)fav 예약어로 즐겨찾기 목록 조회 허용ON
      +
      + + + + +

      🤖 AX Agent 상세 안내

      + +
      +

      ⚠ 당부의 말씀 드립니다.

      +

      + AX Agent의 Cowork / Code 기능은 충분한 검증이 되지 않았습니다.
      + 데이터가 있는 폴더를 워크스페이스로 지정하는 경우 + 반드시 백업본을 만들고 진행 부탁드립니다. +

      +
      + +
      +

      💬 Chat 탭 — 연속적인 질의 답변

      +
        +
      • 일반 대화, 번역, 요약, 아이디어 브레인스토밍 등 자유로운 AI 대화
      • +
      • 9개 대화 주제(경영, 인사, 재무, 연구개발 등) 선택 시 전문가 프리셋 자동 적용
      • +
      • 대화 이력은 AES-256-GCM 암호화되어 로컬에 안전하게 저장
      • +
      + +

      📊 Cowork 탭 — 업무 보조 에이전트

      + + + + + +
      작업 유형보고서 작성, 데이터 분석, 논문 분석, 파일 관리, 자동화 스크립트
      생성 문서Excel, Word, HTML 보고서, Markdown, CSV, 차트
      디자인 무드10종 CSS 템플릿 + 커스텀 무드
      에이전트계획 제시 → 사용자 승인 → 자동 실행 (실패 시 3회 재시도)
      + +

      💻 Code 탭 — 코딩 에이전트

      + + + + + + + +
      작업 유형코드 개발, 코드 리뷰, 리팩터링, 테스트 작성, 보안 점검
      지원 언어Python, Java, C#, C/C++, JavaScript/TypeScript (Vue3)
      빌드/테스트프로젝트 타입 자동 감지 → dotnet/maven/npm/pytest 실행
      Git 연동status, diff, log, add, commit (push는 사용자 직접)
      린트/포맷ESLint, Prettier, Black, Ruff, dotnet format 감지 및 실행
      패키지 저장소사내 Nexus 연동 (NuGet, PyPI/Conda, Maven, npm)
      +
      + +
      +

      ℹ️ 공통 기능

      +
        +
      • Ctrl+1/2/3: Chat / Cowork / Code 탭 전환
      • +
      • Ctrl+F: 대화 내 메시지 검색
      • +
      • 메시지 우클릭: 복사, 인용 답장, 재생성, 삭제
      • +
      • 에이전트 작업 완료 시 시스템 트레이 알림
      • +
      • 코드 블록: 라인 번호, 전체화면, 파일 저장, 구문 하이라이팅
      • +
      • 모든 대화 내역 AES-256-GCM 암호화 저장
      • +
      +
      + + + + +
      +

      📋 버전 이력

      + + +
      +
      +
      v1.5.0
      +
      +
      +
        +
      • AI 코드 분석 강화 — 정의 이동, 참조 검색, 심볼 목록으로 코드를 더 정확하게 이해
      • +
      • 자동 테스트 — 코드 수정 후 테스트 자동 생성·실행·결과 분석
      • +
      • 이벤트 자동화 — 파일 변경/스케줄에 따라 AI 작업 자동 실행
      • +
      • 탐색기 우클릭 연동 — 파일/폴더에서 바로 AI 분석 실행
      • +
      • 저장 공간 관리 — 앱 사용량 확인 + 오래된 데이터 정리
      • +
      • 설정 도움말 — AI 설정 항목에 ? 아이콘으로 상세 설명 제공
      • +
      • PDF 내보내기 — 대화를 PDF 인쇄용으로 내보내기
      • +
      • 폴백 모델 개선 — 서비스별 그룹화, Gemini/Claude 전체 모델 표시
      • +
      +
      +
      + + +
      +
      +
      v1.4.0
      +
      +
      +
        +
      • 선택 텍스트 AI 명령 — 텍스트를 선택한 상태에서 핫키를 누르면 번역/요약/교정/설명 등 AI 명령을 바로 실행
      • +
      • 독 바 — 화면 하단에 고정되는 미니 바. CPU/RAM, 시계, 빠른 실행 버튼. 설정에서 표시 항목·투명도·글로우 효과 조정 가능
      • +
      • 클립보드 핀 고정 — 자주 쓰는 클립보드 항목을 핀 고정(Ctrl+P). URL/코드/경로 자동 분류 + 필터링
      • +
      • 파일 대화상자 연동 — 열기/저장 대화상자가 나타나면 런처가 자동으로 열려 빠른 경로 검색 지원
      • +
      • 다이아몬드 픽셀 아이콘 — 앱/인스톨러/바로가기 아이콘 전면 교체
      • +
      • 독 바 설정 — 설정창에 독 바 전용 탭 추가 (표시 항목, 투명도, 글로우, 위치 초기화)
      • +
      +
      +
      + + +
      +
      +
      v1.3.1
      +
      +
      +
        +
      • 창 배치 확장 — snap 레이아웃 22개로 확장 (3등분, 2/3분할, 3분할 조합 추가)
      • +
      • Everything 파일 검색es 명령으로 디스크 전체 초고속 파일 검색 (Everything 설치 시 활성)
      • +
      • 이미지 클립보드 — 클립보드 히스토리에 이미지 저장·복원 지원 (앱 재시작 후에도 유지)
      • +
      • 플러그인 간편 설치 — zip 파일 선택으로 플러그인 자동 설치
      • +
      • 다크 테마 가독성 — 6종 다크 테마 글자 대비 개선
      • +
      • 대화별 설정 저장 — 대화마다 권한/데이터활용/무드를 독립 저장
      • +
      • 알림 설정 오류 수정 — 팁 알림·완료 알림 설정이 정상 반영되지 않던 문제 해결
      • +
      +
      +
      + + +
      +
      +
      v1.3.0
      +
      +
      +
        +
      • 외부 도구 서버 연결 — DB, Jira, Slack 등 외부 도구를 AI 대화에 연동 (설정에서 서버 추가)
      • +
      • AI 모델 자동 전환 — AI 응답 실패 시 대체 모델로 자동 재시도
      • +
      • 대화 분기 — 메시지 우클릭 → '여기서 분기'로 다른 방향 탐색
      • +
      • 커맨드 팔레트 — Ctrl+Shift+P로 모든 기능에 즉시 접근
      • +
      • AI 비용 표시 — 상태바에서 AI 사용량과 예상 비용 확인
      • +
      • AI 작업 이력 — AI 도구 사용 기록 조회 (설정에서 폴더 열기)
      • +
      • 파일 변경 미리보기 — Code 탭에서 파일 수정 시 변경 내용 자동 표시
      • +
      +
      +
      + + +
      +
      +
      v1.2.2
      +
      +
      +
        +
      • 프로젝트 문맥 자동 연결 — 작업 폴더에 AX.md 파일을 만들면 AI가 프로젝트 규칙을 자동 참고
      • +
      • 사용법 팁 알림 — 탭 전환 시 유용한 사용 팁을 랜덤으로 표시
      • +
      • 개발자 모드 — AI 작업 과정을 상세히 확인하고 단계별로 승인 가능
      • +
      • 사용 통계 — 대화 빈도·사용량 차트 제공
      • +
      • 입력창 무지개 효과 — 메시지 전송 시 입력창 테두리 무지개 애니메이션
      • +
      +
      +
      + +
      +이전 이력 (v1.2.1 이하) + + +
      +
      +
      v1.2.1
      +
      +
      +
        +
      • Code 탭 AI 코딩 강화 — AI가 더 정확하게 코드를 분석하고 수정
      • +
      • Git 연동 — AI가 Git 상태 확인, 변경 내역 조회, 커밋 수행
      • +
      • 코드 품질 검사 — 코드 스타일 검사 및 자동 정리 지원
      • +
      +
      +
      + + +
      +
      +
      v1.2.0
      +
      +
      +
        +
      • Code 탭 활성화 — 코딩 에이전트 5개 프리셋 (개발, 리뷰, 리팩터링, 테스트, 보안)
      • +
      • 개발 환경 자동 감지 — IDE/런타임/빌드도구를 자동으로 인식
      • +
      • 빌드·테스트 실행 — 프로젝트 타입에 맞는 빌드/테스트를 AI가 자동 실행
      • +
      • 마크다운 표시 완성 — 테이블, 인용, 취소선, 링크 지원
      • +
      +
      +
      + + +
      +
      +
      v1.1.1
      +
      +
      +
        +
      • 문서 미리보기 — HTML/Markdown 파일을 앱 내에서 바로 확인
      • +
      • 코드 블록 강화 — 라인 번호, 전체화면, 파일 저장, 구문 하이라이팅
      • +
      • AI 작업 진행률 — 단계/퍼센트/경과시간 표시
      • +
      • 대화 내 검색 — Ctrl+F로 메시지 검색
      • +
      • 파일 탐색기 — 작업 폴더 트리뷰, 우클릭 메뉴
      • +
      +
      +
      + + +
      +
      +
      v1.1.0
      +
      +
      +
        +
      • Cowork AI 에이전트 — AI가 스스로 계획하고 파일을 읽고 쓰며 작업 수행
      • +
      • 문서 생성 — Excel, Word, CSV, HTML 등 6종 문서 자동 생성
      • +
      • 10종 디자인 템플릿 — 문서 스타일 선택 가능
      • +
      • 문서 읽기 — PDF, DOCX, XLSX, CSV 파일 내용 자동 추출
      • +
      +
      +
      + + +
      +
      +
      v1.0.7
      +
      +
      +
        +
      • Chat/Cowork/Code 3탭 UI, 파일 첨부, 대화 주제 9종 프리셋
      • +
      • 권한 시스템 — Ask/Auto/Deny 3단계, 대화 내보내기 4종
      • +
      +
      +
      + +
      +
      +
      v1.0.6
      +
      +
      +
        +
      • 마크다운 렌더링, 응답 재생성·중지, 대화 내보내기, 키보드 단축키
      • +
      +
      +
      + +
      +이전 이력 모음 (v1.0.0 ~ v1.0.4) + +
      +
      +
      v1.0.4
      +
      +
      +
        +
      • 설정 알림 바로보기 — 알림 탭에 미리보기 버튼 추가, 시간 도달 전에도 팝업 확인 가능
      • +
      • 런처 안내 문구 랜덤화 — 입력창 플레이스홀더가 매번 다른 정중한 안내·기능 홍보 문구로 표시
      • +
      • 다이아몬드 픽셀 아이콘 애니메이션 — 런처 아이콘의 4개 픽셀이 순차적으로 깜빡이는 점멸 효과
      • +
      • 글로벌 단축키 콤보박스 — 녹화 방식 대신 검증된 키 조합 12종에서 선택 (Alt+Space, Ctrl+Space 등)
      • +
      • 트레이 메뉴 개편 — "사용 가이드 문서보기" 추가, "정보" → "개발자 정보"로 변경 + 종료 바로 위 배치
      • +
      • 사용 통계 화면 개선 — FHD 최적화 (높이 900px), 자주 쓴 명령어 최대 10개 표시
      • +
      • 사용 가이드 문서 배포 포함 — 빌드 시 Assets 폴더에 자동 복사, 버전 이력 기록
      • +
      +
      +
      + +
      +
      +
      v1.0.3
      +
      +
      +
        +
      • 사용 가이드 문서 추가 — 트레이 우클릭 메뉴에서 바로 열기
      • +
      • 사용 통계 화면 FHD 최적화 (높이 640→900px, 자주 쓴 명령어 최대 10개)
      • +
      • 리소스 모니터 위젯 신규 — CPU·RAM·드라이브·상위 프로세스 실시간 표시
      • +
      • info 예약어 개선 — CPU/RAM 항목 Enter 시 리소스 모니터 위젯 열기
      • +
      • info 예약어 개선 — 드라이브 항목 Enter 시 탐색기 바로 열기
      • +
      • 헬프창 동기화 — 설정에서 글로벌 단축키 변경 시 F1 헬프에 자동 반영
      • +
      • 커서 위치 개선 — F1/Ctrl+B 등 자동 입력 시 커서가 텍스트 끝으로 이동
      • +
      • 설정 기능 탭 → 런처 실동작 연결 (번호 배지·포커스 닫기·액션 모드 등)
      • +
      • ShortcutHelpWindow 테마 연동 (다크/라이트 테마 실시간 반영)
      • +
      +
      +
      + +
      +
      +
      v1.0.2
      +
      +
      +
        +
      • 빠른 실행 Placeholder — 입력 필드에 키워드·경로 힌트 워터마크 추가
      • +
      • 기본 앱 별칭 19종 — 메모장, 계산기, 엑셀, 워드, 파워포인트, 탐색기, VS Code 등 한글+영문 이름 즉시 실행
      • +
      +
      +
      + +
      +
      +
      v1.0.1
      +
      +
      +
        +
      • 인스톨러 통합 — 온라인/오프라인 2종 → 오프라인 1종 통합
      • +
      • 검색 확장자 설정 — 태그형 확장자 UI, 기본 30+종, 사용자 추가/삭제 가능
      • +
      • 폴더 인덱싱 — 인덱스 경로의 1단계 하위 폴더 검색·열기 지원
      • +
      • 인덱싱 현황 표시 — 런처 하단에 "✓ N개 항목 색인됨" 자동 표시
      • +
      • Help 인기 탭 — ⭐ 인기 탭 추가 (파일검색·웹검색·클립보드 핵심 기능)
      • +
      • 다이아몬드 픽셀 아이콘 — 런처·정보 창·트레이·인스톨러에 벡터 아이콘 적용
      • +
      +
      +
      + +
      +
      +
      v1.0.0
      +
      +
      +
        +
      • 정식 릴리즈 — 40개+ 명령어, 9종 테마, 11개 설정 탭
      • +
      • 런처 기본 기능 — 앱·파일·폴더 퍼지 검색, 즐겨찾기, 최근 실행
      • +
      • 계산기 (= 예약어), 웹 검색 (? 예약어)
      • +
      • 시스템 명령 (/ 예약어) — 잠금·절전·종료·재시작
      • +
      • 클립보드 히스토리 (# 예약어) DPAPI 암호화
      • +
      • 잠금 해제 알림, 화면 캡처, 모던 트레이 메뉴
      • +
      • 플러그인 시스템 — SDK를 통한 외부 핸들러 확장
      • +
      +
      +
      + +
      + +
      + + + + + + +
      + + diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/duckduckgo.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/duckduckgo.png new file mode 100644 index 0000000..64ee943 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/duckduckgo.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/github.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/github.png new file mode 100644 index 0000000..52126e0 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/github.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/google.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/google.png new file mode 100644 index 0000000..8642fc1 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/google.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/namuwiki.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/namuwiki.png new file mode 100644 index 0000000..5423adf Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/namuwiki.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/naver.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/naver.png new file mode 100644 index 0000000..020e16d Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/naver.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/navermap.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/navermap.png new file mode 100644 index 0000000..9e0bfaf Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/navermap.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/wikipedia.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/wikipedia.png new file mode 100644 index 0000000..4405b8d Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/wikipedia.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/youtube.png b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/youtube.png new file mode 100644 index 0000000..c20e1d3 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/SearchEngines/youtube.png differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/icon.ico b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/icon.ico new file mode 100644 index 0000000..273db74 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Assets/icon.ico differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.SDK.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.SDK.dll new file mode 100644 index 0000000..c1fcb64 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.SDK.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.SDK.pdb b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.SDK.pdb new file mode 100644 index 0000000..4b2dc07 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.SDK.pdb differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.deps.json b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.deps.json new file mode 100644 index 0000000..f2d6453 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.deps.json @@ -0,0 +1,1221 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0/win-x64", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": {}, + ".NETCoreApp,Version=v8.0/win-x64": { + "AxCopilot/1.5.0": { + "dependencies": { + "AxCopilot.SDK": "1.0.0", + "DocumentFormat.OpenXml": "3.2.0", + "Markdig": "0.37.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", + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64": "8.0.25", + "runtimepack.Microsoft.WindowsDesktop.App.Runtime.win-x64": "8.0.25" + }, + "runtime": { + "AxCopilot.dll": {} + } + }, + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/8.0.25": { + "runtime": { + "Microsoft.CSharp.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "Microsoft.VisualBasic.Core.dll": { + "assemblyVersion": "13.0.0.0", + "fileVersion": "13.0.2526.11203" + }, + "Microsoft.Win32.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "Microsoft.Win32.Registry.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.AppContext.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Buffers.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.Concurrent.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.Immutable.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.NonGeneric.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.Specialized.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Collections.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.Annotations.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.DataAnnotations.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.EventBasedAsync.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.TypeConverter.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ComponentModel.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Configuration.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Console.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Core.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Data.Common.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Data.DataSetExtensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Data.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Contracts.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Debug.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.DiagnosticSource.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.FileVersionInfo.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Process.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.StackTrace.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.TextWriterTraceListener.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Tools.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.TraceSource.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.Tracing.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Drawing.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Dynamic.Runtime.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Formats.Asn1.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Formats.Tar.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Globalization.Calendars.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Globalization.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Globalization.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Compression.Brotli.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Compression.FileSystem.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Compression.ZipFile.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Compression.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.DriveInfo.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.Watcher.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.FileSystem.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.IsolatedStorage.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.MemoryMappedFiles.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Pipes.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.Pipes.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.UnmanagedMemoryStream.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.IO.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Linq.Expressions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Linq.Parallel.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Linq.Queryable.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Linq.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Memory.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Http.Json.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Http.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.HttpListener.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Mail.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.NameResolution.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.NetworkInformation.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Ping.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Quic.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Requests.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Security.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.ServicePoint.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.Sockets.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebClient.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebHeaderCollection.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebProxy.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebSockets.Client.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.WebSockets.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Net.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Numerics.Vectors.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Numerics.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ObjectModel.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.CoreLib.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.DataContractSerialization.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.Uri.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.Xml.Linq.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Private.Xml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.DispatchProxy.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Emit.ILGeneration.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Emit.Lightweight.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Emit.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Metadata.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.TypeExtensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Reflection.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Resources.Reader.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Resources.ResourceManager.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Resources.Writer.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.CompilerServices.VisualC.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Handles.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.InteropServices.JavaScript.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.InteropServices.RuntimeInformation.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.InteropServices.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Intrinsics.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Loader.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Numerics.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.Formatters.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.Json.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.Xml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Runtime.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Claims.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Algorithms.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Cng.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Csp.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Encoding.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.OpenSsl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.X509Certificates.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Principal.Windows.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Principal.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.SecureString.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ServiceModel.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ServiceProcess.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Encoding.CodePages.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Encoding.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Encoding.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Encodings.Web.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.Json.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Text.RegularExpressions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Channels.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Overlapped.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Tasks.Dataflow.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Tasks.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Tasks.Parallel.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Tasks.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Thread.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.ThreadPool.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.Timer.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Transactions.Local.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Transactions.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.ValueTuple.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Web.HttpUtility.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Windows.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.Linq.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.ReaderWriter.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XDocument.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XPath.XDocument.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XPath.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XmlDocument.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.XmlSerializer.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Xml.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "mscorlib.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "netstandard.dll": { + "assemblyVersion": "2.1.0.0", + "fileVersion": "8.0.2526.11203" + } + }, + "native": { + "Microsoft.DiaSymReader.Native.amd64.dll": { + "fileVersion": "14.42.34436.0" + }, + "System.IO.Compression.Native.dll": { + "fileVersion": "8.0.2526.11203" + }, + "clretwrc.dll": { + "fileVersion": "8.0.2526.11203" + }, + "clrgc.dll": { + "fileVersion": "8.0.2526.11203" + }, + "clrjit.dll": { + "fileVersion": "8.0.2526.11203" + }, + "coreclr.dll": { + "fileVersion": "8.0.2526.11203" + }, + "createdump.exe": { + "fileVersion": "8.0.2526.11203" + }, + "hostfxr.dll": { + "fileVersion": "8.0.2526.11203" + }, + "hostpolicy.dll": { + "fileVersion": "8.0.2526.11203" + }, + "mscordaccore.dll": { + "fileVersion": "8.0.2526.11203" + }, + "mscordaccore_amd64_amd64_8.0.2526.11203.dll": { + "fileVersion": "8.0.2526.11203" + }, + "mscordbi.dll": { + "fileVersion": "8.0.2526.11203" + }, + "mscorrc.dll": { + "fileVersion": "8.0.2526.11203" + }, + "msquic.dll": { + "fileVersion": "2.4.16.0" + } + } + }, + "runtimepack.Microsoft.WindowsDesktop.App.Runtime.win-x64/8.0.25": { + "runtime": { + "Accessibility.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "DirectWriteForwarder.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "Microsoft.VisualBasic.Forms.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "Microsoft.VisualBasic.dll": { + "assemblyVersion": "10.1.0.0", + "fileVersion": "8.0.2526.11204" + }, + "Microsoft.Win32.Registry.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "Microsoft.Win32.SystemEvents.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "PresentationCore.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemCore.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemData.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemDrawing.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemXml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework-SystemXmlLinq.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Aero.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Aero2.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.AeroLite.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Classic.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Luna.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.Royale.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationFramework.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "PresentationUI.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "ReachFramework.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.CodeDom.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Configuration.ConfigurationManager.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Design.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Diagnostics.EventLog.Messages.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "0.0.0.0" + }, + "System.Diagnostics.EventLog.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Diagnostics.PerformanceCounter.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.DirectoryServices.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Drawing.Common.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Drawing.Design.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Drawing.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.IO.Packaging.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Printing.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Resources.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Pkcs.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.ProtectedData.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Cryptography.Xml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Security.Permissions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Threading.AccessControl.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Windows.Controls.Ribbon.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Extensions.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11203" + }, + "System.Windows.Forms.Design.Editors.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Forms.Design.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Forms.Primitives.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Forms.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Input.Manipulations.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Windows.Presentation.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "System.Xaml.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "UIAutomationClient.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "UIAutomationClientSideProviders.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "UIAutomationProvider.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "UIAutomationTypes.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "WindowsBase.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + }, + "WindowsFormsIntegration.dll": { + "assemblyVersion": "8.0.0.0", + "fileVersion": "8.0.2526.11204" + } + }, + "native": { + "D3DCompiler_47_cor3.dll": { + "fileVersion": "10.0.26100.6901" + }, + "PenImc_cor3.dll": { + "fileVersion": "8.0.2526.11204" + }, + "PresentationNative_cor3.dll": { + "fileVersion": "8.0.25.61506" + }, + "vcruntime140_cor3.dll": { + "fileVersion": "14.44.35211.0" + }, + "wpfgfx_cor3.dll": { + "fileVersion": "8.0.2526.11204" + } + } + }, + "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": { + "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.Web.WebView2/1.0.2903.40": { + "native": { + "runtimes/win-x64/native/WebView2Loader.dll": { + "fileVersion": "1.0.2903.40" + } + } + }, + "System.ServiceProcess.ServiceController/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.5.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "runtimepack.Microsoft.NETCore.App.Runtime.win-x64/8.0.25": { + "type": "runtimepack", + "serviceable": false, + "sha512": "" + }, + "runtimepack.Microsoft.WindowsDesktop.App.Runtime.win-x64/8.0.25": { + "type": "runtimepack", + "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.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" + }, + "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": "" + } + }, + "runtimes": { + "win-x64": [ + "win", + "any", + "base" + ] + } +} \ No newline at end of file diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.dll new file mode 100644 index 0000000..efa3c4b Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.exe b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.exe new file mode 100644 index 0000000..0302abe Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.exe differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.runtimeconfig.json b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.runtimeconfig.json new file mode 100644 index 0000000..524daea --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/AxCopilot.runtimeconfig.json @@ -0,0 +1,19 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "includedFrameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "8.0.25" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "8.0.25" + } + ], + "configProperties": { + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/DocumentFormat.OpenXml.Framework.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/DocumentFormat.OpenXml.Framework.dll new file mode 100644 index 0000000..f9f3da9 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/DocumentFormat.OpenXml.Framework.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/DocumentFormat.OpenXml.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/DocumentFormat.OpenXml.dll new file mode 100644 index 0000000..fc7bada Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/DocumentFormat.OpenXml.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Markdig.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Markdig.dll new file mode 100644 index 0000000..4931e93 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Markdig.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Core.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Core.dll new file mode 100644 index 0000000..4a27877 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Core.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Core.xml b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Core.xml new file mode 100644 index 0000000..d9d574c --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Core.xml @@ -0,0 +1,8879 @@ + + + + Microsoft.Web.WebView2.Core + + + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + WebView2 enables you to host web content using the latest Microsoft Edge browser and web technology. + + + + + Creates a CoreWebView2 object that wraps an existing COM ICoreWebView2 object. + This allows interacting with the CoreWebView2 using .NET, even if it was originally created using COM. + + Pointer to a COM object that implements the ICoreWebView2 COM interface. + Returns a .NET CoreWebView2 object that wraps the COM object. + Thrown when the provided COM pointer is null. + Thrown when the value is not an ICoreWebView2 COM object and cannot be wrapped. + + + + Returns the existing COM ICoreWebView2 object underlying this .NET CoreWebView2 object. + This allows interacting with the WebView2 control using COM APIs, + even if the control was originally created using .NET. + + Pointer to a COM object that implements the ICoreWebView2 COM interface. + + + + Print the current page to PDF asynchronously with the provided settings. + + + See for description of settings. Passing null for printSettings results in default print settings used. + + Use resultFilePath to specify the path to the PDF file. The host should provide an absolute path, including file name. If the path points to an existing file, the file will be overwritten. If the path is not valid, the method fails. + + The async PrintToPdf operation completes when the data has been written to the PDF file. If the application exits before printing is complete, the file is not saved. Only one `Printing` operation can be in progress at a time. + If PrintToPdf is called while a `PrintToPdf` or `PrintToPdfStream` or `Print` operation is in progress, the operation completes and returns false. + + + + + Adds a URI and resource context filter for corresponding request sources for the event. + + A URI to be added to the event. + A resource context filter to be added to the event. + A request source filter to be added to the event. + + + + Removes a matching WebResource filter that was previously added for the event. + + An URI to be added to the event. + A resource context filter to be added to the event. + A request source filter to be added to the event. + + + + Same as , but also has support for posting DOM + objects to page content. + + The web message to be posted to the top level document in + this WebView. + Additional DOM objects posted to the content. + + The event args is an instance of MessageEvent. The setting must be true or the message + will not be sent. The event arg's data property of the event arg is the + webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. + The event arg's source property of the event arg is a reference to the + window.chrome.webview object. For information about sending messages from the HTML + document in the WebView to the host, navigate to . The message is sent asynchronously. If a + navigation occurs before the message is posted to the page, the message is not be sent. + This additionalObjects is retrieved in web content via the DOM MessageEvent additionalObjects + property as an array-like list of DOM objects. Currently these type of objects can be + posted: + + + .NET / WinRT + DOM type + + + + [FileSystemHandle](https://developer.mozilla.org/docs/Web/API/FileSystemHandle) + + + null + null + + + The objects are posted to web content, following the + [structured-clone](https://developer.mozilla.org/docs/Web/API/Web_Workers_API/Structured_clone_algorithm) + semantics, meaning only objects that can be cloned can be posted. They will also behave as + if they had been created by the web content they are posted to. For example, if a + FileSystemFileHandle is posted to a web content it can only be re-transferred via + postMessage to other web content [with the same + origin](https://fs.spec.whatwg.org/#filesystemhandle). + Warning: An app needs to be mindful when using this API to post DOM objects as this API + provides the web content with unusual access to sensitive Web Platform features such as + filesystem access! Similar to PostWebMessageAsJson, the app should check the property right before posting the message to ensure the message + and objects will only be sent to the target web content that it expects to receive the DOM + objects. Additionally, the order of messages that are posted between PostWebMessageAsJson + and PostWebMessageAsJsonWithAdditionalObjects may not be preserved. + + + + + + + Opens the browser print preview dialog to print the current web page + + + + + Gets the object contains various modifiable settings for the running WebView. + + + + + Gets the URI of the current top level document. + + + This value potentially changes as a part of the event raised for some cases such as navigating to a different site or fragment navigations. It remains the same for other types of navigations such as page refreshes or history.pushState with the same URL as the current page. + + + + + + Gets the process ID of the browser process that hosts the WebView. + + + + + true if the WebView is able to navigate to a previous page in the navigation history. + + + If CanGoBack changes value, the event is raised. + + + + + + true if the WebView is able to navigate to a next page in the navigation history. + + + If CanGoForward changes value, the event is raised. + + + + + + Gets the title for the current top-level document. + + + If the document has no explicit title or is otherwise empty, a default that may or may not match the URI of the document is used. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DocumentTitle"::: + + + + + Indicates if the WebView contains a fullscreen HTML element. + + + + + NavigationStarting is raised when the WebView main frame is requesting permission to navigate to a different URI. + + + Redirects raise this event as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigationStarting"::: + + + + + ContentLoading is raised before any content is loaded, including scripts added with . ContentLoading is not raised if a same page navigation occurs (such as through fragment navigations or history.pushState navigations). + + + This operation follows the and events and precedes the and events. + + + + + + + + + SourceChanged is raised when the property changes. + + + SourceChanged is raised when navigating to a different site or fragment navigations. It is not raised for other types of navigations such as page refreshes or history.pushState with the same URL as the current page. This event is raised before for navigation to a new document. + + + + + + + HistoryChanged is raised for changes to joint session history, which consists of top-level and manual frame navigations. + + + Use HistoryChanged to verify that the or value has changed. HistoryChanged is also raised for using or . HistoryChanged is raised after and . CanGoBack is false for navigations initiated through CoreWebView2Frame APIs if there has not yet been a user gesture. + + + + + + + + + NavigationCompleted is raised when the WebView has completely loaded (body.onload has been raised) or loading stopped with error. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigationCompleted"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DOMContentLoaded"::: + + + + + FrameNavigationStarting is raised when a child frame in the WebView requests permission to navigate to a different URI. + + + Redirects raise this operation as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + + + FrameNavigationCompleted is raised when a child frame has completely loaded (body.onload has been raised) or loading stopped with error. + + + + + ScriptDialogOpening is raised when a JavaScript dialog (alert, confirm, prompt, or beforeunload) displays for the WebView. + + + This event only is raised if the property is set to false. This event suppresses dialogs or replaces default dialogs with custom dialogs. + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + + PermissionRequested is raised when content in a WebView requests permission to access some privileged resources. + + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + ProcessFailed is raised when a WebView process ends unexpectedly or becomes unresponsive. + + + ProcessFailed is raised when any of the processes in the WebView2 Process Group encounters one of the following conditions: + + + + Condition + Details + + + Unexpected exit + + The process indicated by the event args has exited unexpectedly (usually due to a crash). The failure might or might not be recoverable, and some failures are auto-recoverable. + + + + Unresponsiveness + + The process indicated by the event args has become unresponsive to user input. This is only reported for renderer processes, and will run every few seconds until the process becomes responsive again. + + + + + Note: When the failing process is the browser process, a event will run too. + + Your application can use to identify which condition and process the event is for, and to collect diagnostics and handle recovery if necessary. For more details about which cases need to be handled by your application, see . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ProcessFailed"::: + + + + + WebMessageReceived is raised when the setting is set and the top-level document of the WebView runs window.chrome.webview.postMessage or window.chrome.webview.postMessageWithAdditionalObjects. + + + The postMessage function is void postMessage(object) where object is any object supported by JSON conversion. + When postMessage is called, the handler's Invoke method will be called with the object parameter postMessage converted to a JSON string. + If the same page calls postMessage multiple times, the corresponding WebMessageReceived events are guaranteed to be fired in the same order. However, if multiple frames call postMessage, there is no guaranteed order. In addition, WebMessageReceived events caused by calls to postMessage are not guaranteed to be sequenced with events caused by DOM APIs. For example, if the page runs + + chrome.webview.postMessage("message"); + window.open(); + + then the event might be fired before the WebMessageReceived event. If you need the WebMessageReceived event to happen before anything else, then in the WebMessageReceived handler you can post a message back to the page and have the page wait until it receives that message before continuing. + + + + + NewWindowRequested is raised when content inside the WebView requests to open a new window, such as through window.open(). + + + The app can pass a target WebView that is considered the opened window or mark the event as , in which case WebView2 does not open a window. + If either Handled or properties are not set, the target content will be opened on a popup window. + If a deferral is not taken on the event args, scripts that resulted in the new window that are requested are blocked until the event handler returns. If a deferral is taken, then scripts are blocked until the deferral is completed. + + On Hololens 2, if the property is not set and the property is not set to true, the WebView2 will navigate to the . + If either of these properties are set, the WebView2 will not navigate to the and the the event will continue as normal. + + + + + DocumentTitleChanged is raised when the property changes and may be raised before or after the event. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DocumentTitleChanged"::: + + + + + + ContainsFullScreenElementChanged is raised when the property changes. + + + An HTML element inside the WebView may enter fullscreen to the size of the WebView or leave fullscreen. This event is useful when, for example, a video element requests to go fullscreen. The listener of this event may resize the WebView in response. + + + + + + WebResourceRequested is raised when the WebView is performing a URL request to a matching URL and resource context filter that was added with . + + + At least one filter must be added for the event to be raised. + The web resource requested may be blocked until the event handler returns if a deferral is not taken on the event args. If a deferral is taken, then the web resource requested is blocked until the deferral is completed. + + If this event is subscribed in the handler it should be called after the new window is set. For more details see . + + This event is by default raised for file, http, and https URI schemes. This is also raised for registered custome URI schemes. See for more details. + + + + + + WindowCloseRequested is raised when content inside the WebView requested to close the window, such as after window.close() is run. + + + The app should close the WebView and related app window if that makes sense to the app. + After the first window.close() call, this event may not fire for any immediate back to back window.close() calls. + + + + + Causes a navigation of the top level document to the specified URI. + + The URI to navigate to. + + For more information, navigate to [Navigation event](/microsoft-edge/webview2/concepts/navigation-events). Note that this operation starts a navigation and the corresponding event is raised sometime after Navigate runs. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Navigate"::: + + + + + + + Initiates a navigation to htmlContent as source HTML of a new document. + + A source HTML of a new document. + + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + string htmlContent = + @" + + + +

      Click me

      + + "; + webview.NavigateToString(htmlContent); +
      +
      + + + +
      + + + Adds the provided JavaScript to a list of scripts that should be run after the global object has been created, but before the HTML document has been parsed and before any other script included by the HTML document is run. + + The JavaScript code to be run. + A script ID that may be passed when calling . + + The injected script will apply to all future top level document and child frame navigations until removed with . + This is applied asynchronously and you must wait for the returned to complete before you can be sure that the script is ready to execute on future navigations. + If the method is run in handler, it should be called before the new window is set. For more details see . + + Note that if an HTML document has sandboxing of some kind via [sandbox](https://developer.mozilla.org/docs/Web/HTML/Element/iframe#attr-sandbox) properties or the [Content-Security-Policy HTTP header](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy) this will affect the script run here. So, for example, if the allow-modals keyword is not set then calls to the alert function will be ignored. + + + + + + Removes the corresponding JavaScript added via with the specified script ID. + + The ID corresponds to the JavaScript code to be removed from the list of scripts. + Both use and this method in handler at the same time sometimes causes trouble. Since invalid scripts will be ignored, the script IDs you got may not be valid anymore. + + + + Runs JavaScript code from the javaScript parameter in the current top-level document rendered in the WebView. + + The JavaScript code to be run in the current top-level document rendered in the WebView. + A JSON encoded string that represents the result of running the provided JavaScript. + + If the result is undefined, contains a reference cycle, or otherwise is not able to be encoded into JSON, the JSON null value is returned as the "null" string. + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. This method is applied asynchronously. If the method is run after the event during a navigation, the script runs in the new document when loading it, around the time is run. This operation works even if is set to false. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScript"::: + + + + + + Captures an image of what WebView is displaying. + + The format of the image to be captured. + The stream to which the resulting image binary data is written. + + When CapturePreviewAsync finishes writing to the stream, the Invoke method on the provided handler parameter is called. This method fails if called before the first event. For example if this is called in the event for the first navigation it will fail. For subsequent navigations, the method may not fail, but will not capture an image of a given webpage until the event has been fired for it. Any call to this method prior to that will result in a capture of the page being navigated away from. + + + + + + Reloads the current page. + + + This is similar to navigating to the URI of current top level document including all navigation events firing and respecting any entries in the HTTP cache. But, the back or forward history will not be modified. + + + + + Posts the specified webMessageAsJson to the top level document in this WebView. + + The web message to be posted to the top level document in this WebView. + + The event args is an instance of MessageEvent. The setting must be true or the message will not be sent. The event arg's data property of the event arg is the webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. The event arg's source property of the event arg is a reference to the window.chrome.webview object. For information about sending messages from the HTML document in the WebView to the host, navigate to . The message is sent asynchronously. If a navigation occurs before the message is posted to the page, the message is not be sent. + + + Runs the message event of the window.chrome.webview of the top-level document. JavaScript in that document may subscribe and unsubscribe to the event using the following code: + + window.chrome.webview.addEventListener('message', handler) + window.chrome.webview.removeEventListener('message', handler) + + + + + + + + + Posts a message that is a simple string rather than a JSON string representation of a JavaScript object. + + The web message to be posted to the top level document in this WebView. + + This behaves in exactly the same manner as , but the data property of the event arg of the window.chrome.webview message is a string with the same value as webMessageAsString. Use this instead of if you want to communicate using simple strings rather than JSON objects. + + + + + + + Runs an asynchronous DevToolsProtocol method. + + The full name of the method in the format {domain}.{method}. + A JSON formatted string containing the parameters for the corresponding method. + A JSON string that represents the method's return object. + + For more information about available methods, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). The returned task is completed when the method asynchronously completes and will return the method's return object as a JSON string. Note even though WebView2 dispatches the CDP messages in the order called, CDP method calls may be processed out of order. If you require CDP methods to run in a particular order, you should await for the previous method call. + + If the method is to run in handler it should be called + before the new window is set if the cdp messages should affect the initial navigation. If + called after setting the NewWindow property, the cdp messages + may or may not apply to the initial navigation and may only apply to the subsequent navigation. + For more details . + + + + + Navigates the WebView to the previous page in the navigation history. + + + + + Navigates the WebView to the next page in the navigation history. + + + + + Gets a DevTools Protocol event receiver that allows you to subscribe to a DevToolsProtocol event. + + The full name of the event in the format {domain}.{event}. + A Devtools Protocol event receiver. + + For more information about DevToolsProtocol events description and event args, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). + + + + + Stops all navigations and pending resource fetches. + + + Does not stop scripts. + + + + + Adds the provided host object to script running in the WebView with the specified name. + + The name of the host object. + The host object to be added to script. + + Host objects are exposed as host object proxies via window.chrome.webview.hostObjects.{name}. Host object proxies are promises and will resolve to an object representing the host object. Only the COM visible objects/properties/methods can be accessed from script. + The app can control which part of .NET objects are exposed using . + + JavaScript code in the WebView will be able to access appObject as following and then access attributes and methods of appObject. + + Note that while simple types, IDispatch and array are supported, and IUnknown objects that also implement IDispatch are treated as IDispatch, generic IUnknown, VT_DECIMAL, or VT_RECORD variant is not supported. Remote JavaScript objects like callback functions are represented as an VT_DISPATCH VARIANT with the object implementing IDispatch. The JavaScript callback method may be invoked using DISPID_VALUE for the DISPID. Such callback method invocations will return immediately and will not wait for the JavaScript function to run and so will not provide the return value of the JavaScript function. Nested arrays are supported up to a depth of 3. Arrays of by reference types are not supported. VT_EMPTY and VT_NULL are mapped into JavaScript as null. In JavaScript null and undefined are mapped to VT_EMPTY. + + Additionally, all host objects are exposed as window.chrome.webview.hostObjects.sync.{name}. Here the host objects are exposed as synchronous host object proxies. These are not promises and calls to functions or property access synchronously block running script waiting to communicate cross process for the host code to run. Accordingly this can result in reliability issues and it is recommended that you use the promise based asynchronous window.chrome.webview.hostObjects.{name} API described above. + + Synchronous host object proxies and asynchronous host object proxies can both proxy the same host object. Remote changes made by one proxy will be reflected in any other proxy of that same host object whether the other proxies and synchronous or asynchronous. + + While JavaScript is blocked on a synchronous call to native code, that native code is unable to call back to JavaScript. Attempts to do so will fail with HRESULT_FROM_WIN32(ERROR_POSSIBLE_DEADLOCK). + + Host object proxies are JavaScript Proxy objects that intercept all property get, property set, and method invocations. Properties or methods that are a part of the Function or Object prototype are run locally. Additionally any property or method in the array chrome.webview.hostObjects.options.forceLocalProperties will also be run locally. This defaults to including optional methods that have meaning in JavaScript like toJSON and Symbol.toPrimitive. You can add more to this array as required. + + There's a method chrome.webview.hostObjects.cleanupSome that will best effort garbage collect host object proxies. + + The chrome.webview.hostObjects.options object provides the ability to change some functionality of host objects. + + + + Options property + Details + + + forceLocalProperties + + This is an array of host object property names that will be run locally, instead of being called on the native host object. This defaults to then, toJSON, Symbol.toString, and Symbol.toPrimitive. You can add other properties to specify that they should be run locally on the JavaScript host object proxy. + + + + log + + This is a callback that will be called with debug information. For example, you can set this to console.log.bind(console) to have it print debug information to the console to help when troubleshooting host object usage. By default this is null. + + + + shouldSerializeDates + + By default this is false, and JavaScript Date objects will be sent to host objects as a string using JSON.stringify. You can set this property to true to have Date objects properly serialize as a System.DateTime when sending to the .NET host object, and have System.DateTime properties and return values create a JavaScript Date object. + + + + defaultSyncProxy + + When calling a method on a synchronous proxy, the result should also be a synchronous proxy. But in some cases, the sync/async context is lost (for example, when providing to native code a reference to a function, and then calling that function in native code). In these cases, the proxy will be asynchronous, unless this property is set. + + + + forceAsyncMethodMatches + + This is an array of regular expressions. When calling a method on a synchronous proxy, the method call will be performed asynchronously if the method name matches a string or regular expression in this array. Setting this value to Async will make any method that ends with Async be an asynchronous method call. If an async method doesn't match here and isn't forced to be asynchronous, the method will be invoked synchronously, blocking execution of the calling JavaScript and then returning the resolution of the promise, rather than returning a promise. + + + + ignoreMemberNotFoundError + + By default, an exception is thrown when attempting to get the value of a proxy property that doesn't exist on the corresponding native class. Setting this property to true switches the behavior to match Chakra WinRT projection (and general JavaScript) behavior of returning undefined with no error. + + + + shouldPassTypedArraysAsArrays + + By default, typed arrays are passed to the host as IDispatch. To instead pass typed arrays to the host as array, set this to true. + + + + + Host object proxies additionally have the following methods: + + + + Method name + Details + + + applyHostFunction, getHostProperty, setHostProperty + + Perform a method invocation, property get, or property set on the host object. You can use these to explicitly force a method or property to run remotely if there is a conflicting local method or property. For instance, proxy.toString() will run the local toString method on the proxy object. But proxy.applyHostFunction('toString') runs toString on the host proxied object instead. + + + + getLocalProperty, setLocalProperty + + Perform property get, or property set locally. You can use these methods to force getting or setting a property on the host object proxy itself rather than on the host object it represents. For instance, proxy.unknownProperty will get the property named unknownProperty from the host proxied object. But proxy.getLocalProperty('unknownProperty') will get the value of the property unknownProperty on the proxy object itself. + + + + addEventListener + + This method only exists on proxies for .NET objects. Bind the JavaScript handler to the C# event, so that the JavaScript handler can be called through the C# event. For example, chrome.webview.hostObjects.sample.addEventListener('TestEvent', () => { alert('Invoked from remote');}); bind an anonymous JavaScript function to a C# event called 'TestEvent'. When calling TestEvent?.Invoke() on C# side, the JavaScript function that was just bound will be called asynchronously. It allows adding more than one handler for an event, but if the handler is already in the list of event handler, it will not be added a second time. If the host object cannot find the event with the name passed in by the addEventListener function or it is no public or its return type is not void, an exception will be thrown. If the count and type of C# event's parameters do not match the count and type of JavaScript handler, invoke addEventListener will be successful but an exception will be passed to JavaScript when invoke the event on C# side. If the host object has defined addEventListener function, use the defined function rather than the additionally addEventListener function. + + + + removeEventListener + + This method only exists on proxies for .NET objects. Removes a handler previously bound with addEventListener(). If the handler does not exist in the list of event handler, nothing will happen. If the host object cannot find the event with the name passed in by the removeEventListener function or it is no public, an exception will be thrown. If the host object has defined removeEventListener function, use the defined function rather than the additionally removeEventListener function. + + + + sync + + Asynchronous host object proxies expose a sync method which returns a promise for a synchronous host object proxy for the same host object. For example, chrome.webview.hostObjects.sample.methodCall() returns an asynchronous host object proxy. You can use the sync method to obtain a synchronous host object proxy instead: + const syncProxy = await chrome.webview.hostObjects.sample.methodCall().sync() + + + + async + + Synchronous host object proxies expose an async method which blocks and returns an asynchronous host object proxy for the same host object. For example, chrome.webview.hostObjects.sync.sample.methodCall() returns a synchronous host object proxy. Calling the async method on this blocks and then returns an asynchronous host object proxy for the same host object: const asyncProxy = chrome.webview.hostObjects.sync.sample.methodCall().async() + + + + then + + Asynchronous host object proxies have a then method. This allows them to be awaitable. then will return a promise that resolves with a representation of the host object. If the proxy represents a JavaScript literal then a copy of that is returned locally. If the proxy represents a function then a non-awaitable proxy is returned. If the proxy represents a JavaScript object with a mix of literal properties and function properties, then the a copy of the object is returned with some properties as host object proxies. + + + + cancelPromise + + This method attempts to cancel the fulfillment of a promised value. If the promise hasn't already been fulfilled and cancelation is supported, the promise will get rejected. cancelPromise supports cancelation of IAsyncOperation and IAsyncAction methods. If the promise is successfully canceled, then calling await on the promise will throw. For example, chrome.webview.hostObjects.cancelPromise(promise); await promise; will throw with "Promise Canceled". Once a promise has been canceled, a subsequent cancel on the same promise will throw an exception as well. + + + + + All other property and method invocations (other than the above Remote object proxy methods, forceLocalProperties list, and properties on Function and Object prototypes) are run remotely. Asynchronous host object proxies return a promise representing asynchronous completion of remotely invoking the method, or getting the property. The promise resolves after the remote operations complete and the promises resolve to the resulting value of the operation. Synchronous host object proxies work similarly but block JavaScript execution and wait for the remote operation to complete. + + Setting a property on an asynchronous host object proxy works slightly differently. The set returns immediately and the return value is the value that will be set. This is a requirement of the JavaScript Proxy object. If you need to asynchronously wait for the property set to complete, use the setHostProperty method which returns a promise as described above. Synchronous object property set property synchronously blocks until the property is set. + + Exposing host objects to script has security risk. Please follow [best practices](/microsoft-edge/webview2/concepts/security). + + + To create a [IDispatch](/windows/win32/api/oaidl/nn-oaidl-idispatch) implementing class in C# use the following attributes on each class you intend to expose. + + // Bridge and BridgeAnotherClass are C# classes that implement IDispatch and works with AddHostObjectToScript. + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class BridgeAnotherClass + { + // Sample property. + public string Prop { get; set; } = "Example"; + } + + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class Bridge + { + public string Func(string param) + { + return "Example: " + param; + } + + public BridgeAnotherClass AnotherObject { get; set; } = new BridgeAnotherClass(); + + // Sample indexed property. + [System.Runtime.CompilerServices.IndexerName("Items")] + public string this[int index] + { + get { return m_dictionary[index]; } + set { m_dictionary[index] = value; } + } + private Dictionary<int, string> m_dictionary = new Dictionary<int, string>(); + } + + Then add instances of those classes via : + + webView.CoreWebView2.AddHostObjectToScript("bridge", new Bridge()); + + And then in script you can call the methods, and access those properties of the objects added via . + Note that `CoreWebView2.AddHostObjectToScript` only applies to the top-level document and not to frames. To add host objects to frames use `CoreWebView2Frame.AddHostObjectToScript`. + + // Find added objects on the hostObjects property + const bridge = chrome.webview.hostObjects.bridge; + + // Call a method and pass in a parameter. + // The result is another proxy promise so you must await to get the result. + console.log(await bridge.Func("testing...")); + + // A property may be another object as long as its class also implements + // IDispatch. + // Getting a property also gets a proxy promise you must await. + const propValue = await bridge.AnotherObject.Prop; + console.log(propValue); + + // Indexed properties + let index = 123; + bridge[index] = "test"; + let result = await bridge[index]; + console.log(result); + + + + + + + Removes the host object specified by the name so that it is no longer accessible from JavaScript code in the WebView. + + The name of the host object to be removed. + + While new access attempts are denied, if the object is already obtained by JavaScript code in the WebView, the JavaScript code continues to have access to that object. Running this method for a name that is already removed or never added fails. + + + + + Opens the DevTools window for the current document in the WebView. + + + Does nothing if run when the DevTools window is already open. + + + + + + + + Warning: This method and are deprecated. + + Removes a matching WebResource filter that was previously added for the event. + An URI to at which a web resource filter was added. + A previously added resource context filter to be removed. + A filter that was never added. + + If the same filter was added multiple times, then it must need to be removed as many times as it was added for the removal to be effective. + + + + + + Gets the object associated with this . + + + + + + Exposes the used to create this . + + + + + WebResourceResponseReceived is raised when the WebView receives the response for a request for a web resource (any URI resolution performed by the WebView; such as HTTP/HTTPS, file and data requests from redirects, navigations, declarations in HTML, implicit Favicon lookups, and fetch API usage in the document). + + + The host app can use this event to view the actual request and response for a web resource. There is no guarantee about the order in which the WebView processes the response and the host app's handler runs. The app's handler will not block the WebView from processing the response. + The event args include the as sent by the wire and received, including any additional headers added by the network stack that were not be included as part of the associated event, such as Authentication headers. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebResourceResponseReceived"::: + + + + + DOMContentLoaded is raised when the initial HTML document has been parsed. + + + This aligns with the the document's DOMContentLoaded event in HTML. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DOMContentLoaded"::: + + + + + Navigates using a constructed object. + + The constructed web resource object to provide post data or additional request headers during navigation. + + The headers in the override headers added by WebView2 runtime except for Cookie headers. Method can only be either GET or POST. Provided post data will only be sent only if the method is POST and the uri scheme is HTTP(S). + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NavigateWithWebResourceRequest"::: + + + + + Whether WebView is suspended. + + + True when WebView is suspended, from the time when has completed successfully until WebView is resumed. + + + + + An app may call this API to have the WebView2 consume less memory. + + + This is useful when a Win32 app becomes invisible, or when a Universal Windows Platform app is being suspended, during the suspended event handler before completing the suspended event. + + The property must be false when the API is called. Otherwise, the API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE). + + Suspending is similar to putting a tab to sleep in the Edge browser. Suspending pauses WebView script timers and animations, minimizes CPU usage for the associated browser renderer process and allows the operating system to reuse the memory that was used by the renderer process for other processes. + + Note that Suspend is best effort and considered completed successfully once the request is sent to browser renderer process. If there is a running script, the script will continue to run and the renderer process will be suspended after that script is done. + + See [Sleeping Tabs FAQ](https://techcommunity.microsoft.com/t5/articles/sleeping-tabs-faq/m-p/1705434) for conditions that might prevent WebView from being suspended. In those situations, the result of the async task is false. + + The WebView will be automatically resumed when it becomes visible. Therefore, the app normally does not have to call explicitly. + + The app can call and then periodically for an invisible WebView so that the invisible WebView can sync up with latest data and the page ready to show fresh content when it becomes visible. + + All WebView APIs can still be accessed when a WebView is suspended. Some APIs like Navigate will auto resume the WebView. To avoid unexpected auto resume, check property before calling APIs that might change WebView state. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="TrySuspend"::: + + + + + Resumes the WebView so that it resumes activities on the web page. + + + This API can be called while the WebView2 controller is invisible. + + The app can interact with the WebView immediately after . + + WebView will be automatically resumed when it becomes visible. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Resume"::: + + + + + Sets a mapping between a virtual host name and a folder path to make available to web sites via that host name. + + A virtual host name. + A folder path name to be mapped to the virtual host name. The length must not exceed the Windows MAX_PATH limit. + The level of access to resources under the virtual host from other sites. + + + After setting the mapping, documents loaded in the WebView can use HTTP or HTTPS URLs at the specified host name specified by hostName to access files in the local folder specified by folderPath. + This mapping applies to both top-level document and iframe navigations as well as subresource references from a document. This also applies to dedicated and shared worker scripts but does not apply to service worker scripts. + + Due to a current implementation limitation, media files accessed using virtual host name can be very slow to load. + + As the resource loaders for the current page might have already been created and running, changes to the mapping might not be applied to the current page and a reload of the page is needed to apply the new mapping. + + Both absolute and relative paths are supported for folderPath. Relative paths are interpreted as relative to the folder where the exe of the app is in. + + + For example, after calling SetVirtualHostNameToFolderMapping("appassets.example", "assets", CoreWebView2HostResourceAccessKind.Deny);, navigating to https://appassets.example/my-local-file.html will show content from my-local-file.html in the assets subfolder located on disk under the same path as the app's executable file. + + DOM elements that want to reference local files will have their host reference virtual host in the source. If there are multiple folders being used, define one unique virtual host per folder. + + + You should typically choose virtual host names that are never used by real sites. + If you own a domain such as example.com, another option is to use a subdomain reserved for the app (like my-app.example.com). + + + [RFC 6761](https://tools.ietf.org/html/rfc6761) has reserved several special-use domain names that are guaranteed to not be used by real sites (for example, .example, .test, and .invalid). + + + Note that using .local as the top-level domain name will work but can cause a delay during navigations. You should avoid using .local if you can. + + + Apps should use distinct domain names when mapping folder from different sources that should be isolated from each other. For instance, the app might use app-file.example for files that ship as part of the app, and book1.example might be used for files containing books from a less trusted source that were previously downloaded and saved to the disk by the app. + + + The host name used in the APIs is canonicalized using Chromium's host name parsing logic before being used internally. + For more information see [HTML5 2.6 URLs](https://dev.w3.org/html5/spec-LC/urls.html). + + + All host names that are canonicalized to the same string are considered identical. + For example, EXAMPLE.COM and example.com are treated as the same host name. + An international host name and its Punycode-encoded host name are considered the same host name. There is no DNS resolution for host name and the trailing '.' is not normalized as part of canonicalization. + + + Therefore example.com and example.com. are treated as different host names. Similarly, virtual-host-name and virtual-host-name.example.com are treated as different host names even if the machine has a DNS suffix of example.com. + + + Specify the minimal cross-origin access necessary to run the app. If there is not a need to access local resources from other origins, use . + + + + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + webView.Source = new Uri("https://appassets.example/index.html"); + + + This in an example on how to embed a local image. For more information see . + + webView.CoreWebView2.SetVirtualHostNameToFolderMapping( + "appassets.example", "assets", CoreWebView2HostResourceAccessKind.DenyCors); + string c_navString = ""; + webview.NavigateToString(c_navString); + + + + + + + Clears a host name mapping for local folder that was added by . + + The host name to be removed from the mapping. + + + + + FrameCreated is raised when a new iframe is created. Handle this event to get access to objects. + + + + Use the to listen for when this iframe goes away. + + + + + DownloadStarting is raised when a download has begun, blocking the default download dialog, but not blocking the progress of the download. + + + The host can choose to cancel a download, change the result file path, and hide the default download dialog. If download is not handled or canceled, the download is saved to the default path after the event completes with default download dialog shown. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DownloadStarting"::: + + + + + ClientCertificateRequested is raised when WebView2 is making a request to an HTTP server that needs a client certificate for HTTP authentication. Read more about HTTP client certificates at [RFC 8446 The Transport Layer Security (TLS) Protocol Version 1.3](https://tools.ietf.org/html/rfc8446). + + + The host have several options for responding to client certificate requests: + + + + Scenario + Handled + Cancel + SelectedCertificate + + + Respond to server with a certificate + True + False + MutuallyTrustedCertificate value + + + Respond to server without certificate + True + False + null + + + Display default client certificate selection dialog prompt + False + False + n/a + + + Cancel the request + n/a + True + n/a + + + + If the host don't handle the event, WebView2 will show the default client certificate selection dialog prompt to the user. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClientCertificateRequested1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClientCertificateRequested2"::: + + + + + Opens the Browser Task Manager view as a new window in the foreground. + + + If the Browser Task Manager is already open, this will bring it into the foreground. WebView2 currently blocks the Shift+Esc shortcut for opening the task manager. An end user can open the browser task manager manually via the Browser task manager entry of the DevTools window's title bar's context menu. + + + + + Indicates whether all audio output from this CoreWebView2 is muted or not. Set to true will mute this CoreWebView2, and set to false will unmute this CoreWebView2. true if audio is muted. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleIsMuted"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="UpdateTitleWithMuteState"::: + + + + + Indicates whether any audio output from this CoreWebView2 is playing. true if audio is playing even if is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="UpdateTitleWithMuteState"::: + + + + + IsMutedChanged is raised when the mute state changes. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="IsMutedChanged"::: + + + + + IsDocumentPlayingAudioChanged is raised when document starts or stops playing audio. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="IsDocumentPlayingAudioChanged"::: + + + + + True if the default download dialog is currently open. + + + The value of this property changes only when the default download dialog is explicitly opened or closed. Hiding the WebView implicitly hides the dialog, but does not change the value of this property. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleDefaultDownloadDialog"::: + + + + + The default download dialog corner alignment. + + + The dialog can be aligned to any of the WebView corners (see ). When the WebView or dialog changes size, the dialog keeps it position relative to the corner. The dialog may become partially or completely outside of the WebView bounds if the WebView is small enough. Set the margin from the corner with the property. The corner alignment and margin should be set during initialization to ensure that they are correctly applied when the layout is first computed, otherwise they will not take effect until the next time the WebView position or size is updated. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SetDefaultDownloadDialogPosition"::: + + + + + The default download dialog margin relative to the WebView corner specified by . + + + The margin is a point that describes the vertical and horizontal distances between the chosen WebView corner and the default download dialog corner nearest to it. Positive values move the dialog towards the center of the WebView from the chosen WebView corner, and negative values move the dialog away from it. Use (0, 0) to align the dialog to the WebView corner with no margin. The corner alignment and margin should be set during initialization to ensure that they are correctly applied when the layout is first computed, otherwise they will not take effect until the next time the WebView position or size is updated. + + + + + Raised when the property changes. + + + This event comes after the event. Setting the property disables the default download dialog and ensures that this event is never raised. + + + + + Open the default download dialog. + + + If the dialog is opened before there are recent downloads, the dialog shows all past downloads for the current profile. Otherwise, the dialog shows only the recent downloads with a "See more" button for past downloads. Calling this method raises the event if the dialog was closed. No effect if the dialog is already open. + + + + + Close the default download dialog. + + + Calling this method raises the event if the dialog was open. No effect if the dialog is already closed. + + + + + BasicAuthenticationRequested event is raised when WebView encounters a Basic HTTP Authentication request as described in https://developer.mozilla.org/docs/Web/HTTP/Authentication, a Digest HTTP Authentication request as described in https://developer.mozilla.org/docs/Web/HTTP/Headers/Authorization#digest, an NTLM authentication or a Proxy Authentication request. + + + The host can provide a response with credentials for the authentication or cancel the request. If the host sets the Cancel property to false but does not provide either UserName or Password properties on the Response property, then WebView2 will show the default authentication challenge dialog prompt to the user. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BasicAuthenticationRequested"::: + + + + + ContextMenuRequested is raised when a context menu is requested by the user and the content inside WebView hasn't disabled context menus. + + + The host has the option to create their own context menu with the information provided in the event or can add items to or remove items from WebView context menu. If the host doesn't handle the event, WebView will display the default context menu. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="CustomContextMenu"::: + + + + + Runs an asynchronous DevToolsProtocol method for a specific session of an attached target. + + The sessionId for an attached target. null or empty string is treated as the session for the default target for the top page. + The full name of the method in the format {domain}.{method}. + A JSON formatted string containing the parameters for the corresponding method. + A JSON string that represents the method's return object. + + There could be multiple DevToolsProtocol targets in a WebView. + Besides the top level page, iframes from different origin and web workers are also separate targets. + Attaching to these targets allows interaction with them. + When the DevToolsProtocol is attached to a target, the connection is identified by a sessionId. + + To use this API, you must set the flatten parameter to true when calling Target.attachToTarget or Target.setAutoAttach DevToolsProtocol method. + Using Target.setAutoAttach is recommended as that would allow you to attach to dedicated worker targets, which are not discoverable via other APIs like Target.getTargets. + For more information about targets and sessions, navigate to [Chrome DevTools Protocol - Target domain]( https://chromedevtools.github.io/devtools-protocol/tot/Target). + + For more information about available methods, navigate to [DevTools Protocol Viewer](https://aka.ms/DevToolsProtocolDocs). The handler's Invoke method will be called when the method asynchronously completes. Invoke will be called with the method's return object as a JSON string. + + + + + The current text of the statusbar as defined by [Window.statusbar](https://developer.mozilla.org/docs/Web/API/Window/statusbar). + + + + + StatusBarTextChanged event is raised when the text in the [Window.statusbar](https://developer.mozilla.org/docs/Web/API/Window/statusbar) changes. When the event is fired use the property to get the current statusbar text. + + + Events which cause causes can be anything from hover, url events, and others. There is not a finite list on how to cause the statusbar to change. + The developer must create the status bar and set the text. + + + + + The associated object of . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="Profile"::: + + + + + The ServerCertificateErrorDetected event is raised when the WebView2 cannot verify server's digital certificate while loading a web page. + + + This event will raise for all web resources and follows the event. + + If you don't handle the event, WebView2 will show the default TLS interstitial error page to the user for navigations, and for non-navigations the web request is cancelled. + + Note that WebView2 before raising `ServerCertificateErrorDetected` raises a event with as FALSE and any of the below WebErrorStatuses that indicate a certificate failure. + + + + + + + + + + + + + + + + + + + + For more details see and handle ServerCertificateErrorDetected event or show the default TLS interstitial error page to the user according to the app needs. + + WebView2 caches the response when action is for the RequestUri's host and the server certificate in the session and the event won't be raised again. + + To raise the event again you must clear the cache using . + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ServerCertificateErrorDetected"::: + + + + + Clears all cached decisions to proceed with TLS certificate errors from the event for all WebView2's sharing the same session. + + + + + Get the Uri as a string of the current Favicon. This will be an empty string if the page does not have a Favicon. + + + + + Raised when the Favicon has changed. This can include when a new page is loaded and thus by default no icon is set or the icon is set for the page by DOM or JavaScript. + + + The first argument is the Webview2 which saw the changed Favicon and the second is null. + + + + + Get the downloaded Favicon image for the current page and copy it to the image stream. + + The format to retrieve the Favicon in. + + An IStream populated with the downloaded Favicon. + + + + + Print the current web page asynchronously to the specified printer with the provided settings. + + + See for description of settings. Passing null for printSettings results in default print settings used. + + The method will return as if printerName doesn't match with the name of any installed printers on the user OS. + The method will throw ArgumentException if the caller provides invalid settings for a given printer. + + The async Print operation completes when it finishes printing to the printer. Only one Printing operation can be in progress at a time. If Print is called while a or or job is in progress, throws exception. This is only for printing operation on one webview. + + + + Error + PrintStatus + Notes + + + No + + Print operation succeeded. + + + No + + If specified printer is not found or printer status is not available, offline or error state. + + + No + + Print operation is failed. + + + ArgumentException + + If the caller provides invalid settings for the specified printer. + + + Exception + + Print operation is failed as printing job already in progress. + + + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PrintToPrinter"::: + + + + + Opens the print dialog to print the current web page. + + + See for descriptions of print dialog kinds. + + Invoking browser or system print dialog doesn't open new print dialog if it is already open. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ShowPrintUI"::: + + + + + Provides the Pdf data of current web page asynchronously for the provided settings. + + + Stream will be rewound to the start of the pdf data. + + See for description of settings. Passing null for printSettings results in default print settings used. + + The async PrintToPdfStream operation completes when it finishes writing to the stream. Only one Printing operation can be in progress at a time. If is called while a or or job is in progress, the throws an exception. This is only for printing operation on one webview. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PrintToPdfStream"::: + + + + + Share a shared buffer object with script of the main frame in the WebView. + + The object to be shared with script. + The desired given to script. + Additional data to be send to script. If it is not null or empty string, and it is not a valid JSON string, will be thrown. + + The script will receive a sharedbufferreceived event from chrome.webview. + The event arg for that event will have the following methods and properties. + + + + Property + Description + + + getBuffer() + A method that returns an ArrayBuffer object with the backing content from the shared buffer. + + + additionalData + An object as the result of parsing additionalDataAsJson as JSON string. This property will be undefined if additionalDataAsJson is nullptr or empty string. + + + source + With a value set as chrome.webview object. + + + + If access is , the script will only have read access to the buffer. + If the script tries to modify the content in a read only buffer, it will cause an access violation in WebView renderer process and crash the renderer process. + + If the shared buffer is already closed, the API throws with error code of RO_E_CLOSED. + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access to the shared buffer any more. + + The application can post the same shared buffer object to multiple web pages or iframes, or post to the same web page or iframe multiple times. + Each PostSharedBufferToScript will create a separate ArrayBuffer object with its own view of the memory and is separately released. + The underlying shared memory will be released when all the views are released. + + Sharing a buffer to script has security risk. You should only share buffer with trusted site. + If a buffer is shared to a untrusted site, possible sensitive information could be leaked. + If a buffer is shared as modifiable by the script and the script modifies it in an unexpected way, it could result in corrupted data that might even crash the application. + + The example code shows how to send data to script for one time read only consumption. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="OneTimeShareBuffer"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_2"::: + + + + + LaunchingExternalUriScheme is raised when a navigation request is made to a URI scheme that is registered with the OS. + + + The event handler may suppress the default dialog or replace the default dialog with a custom dialog. + If a is not taken on the event args, the external URI scheme launch is blocked until the event handler returns. + If a deferral is taken, the external URI scheme launch is blocked until the is completed. + The host also has the option to cancel the URI scheme launch. + + The and events will be raised, regardless of whether the property is set to true or false. + The event will be raised with the property set to false and the property set to regardless of whether the host sets the property. + The , and events will not be raised for this navigation to the external URI scheme regardless of the property. + The event will be raised after the event and before the event. + + The default will also be updated upon navigation to an external URI scheme. + If a setting on the interface has been changed, navigating to an external URI scheme will trigger the to update. + + The WebView2 may not display the default dialog based on user settings, browser settings, and whether the origin is determined as a [trustworthy origin](https://w3c.github.io/webappsec-secure-contexts#potentially-trustworthy-origin); however, the event will still be raised. + If the request is initiated by a cross-origin frame without a user gesture, the request will be blocked and the `LaunchingExternalUriScheme` event will not be raised. A URI scheme may be blocked for safety reasons. In this case the `LaunchingExternalUriScheme` event will not be raised. The default dialog may show an "always allow" checkbox which allows the user to opt-in to relaxed security (i.e. skipping future default dialogs) for the combination of the URI scheme and the origin of the page initiating this external URI scheme launch. The checkbox is offered so long as the group policy to show the checkbox is not explicitly disabled and there is a trustworthy initiating origin. If the user has checked this box, future attempts to launch this URI scheme will still raise the event. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="LaunchingExternalUriScheme"::: + + + + + Desired of a WebView. + + + An app may set to indicate desired memory consumption level of WebView. + Scripts will not be impacted and continue to run. + This is useful for inactive apps that still want to run scripts and/or keep network connections alive and therefore could not call and to reduce memory consumption. + These apps can set memory usage target level to when the app becomes inactive, and set back to when the app becomes active. + + It is not necessary to set CoreWebView2Controller's IsVisible property to false when setting the property. + + It is a best effort operation to change memory usage level, and the API will return before the operation completes. + + Setting the level to could potentially cause memory for some WebView browser processes to be swapped out to disk in some circumstances. It is a best effort to reduce memory usage as much as possible. + If a script runs after its related memory has been swapped out, the memory will be swapped back in to ensure the script can still run, but performance might be impacted. + Therefore, the app should set the level back to when the app becomes active again. Setting memory usage target level back to normal will not happen automatically. + + An app should choose to use either the combination of and or the combination of setting MemoryUsageTargetLevel to and . It is not advisable to mix them. + Trying to set while suspended will be ignored. + The and methods will change the . + will automatically set to while on suspended WebView will automatically set to . + Calling when the WebView is not suspended would not change . + + + + + The unique identifier of the main frame. It's the same kind of ID as with the and . + + + FrameId may not be valid if has not done any navigation. It's safe to get this value during or after the first event. Otherwise, it could return the invalid frame Id 0. + + + + + Runs JavaScript code from the javaScript parameter in the current top-level document rendered in the WebView, The result of the execution is returned asynchronously in the object which has methods and properties to obtain the successful result of script execution as well as any unhandled JavaScript exceptions. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScriptWithResult"::: + + + + + NotificationReceived is raised when a non-persistent notification is received. + + + + + SaveAsUIShowing is raised when browser trys to open a save as dialog. It includes opening dialog manually from context menu or programmatically from . + + + + + + Async method to programmatically trigger a Save As action for the currently loaded document. + + It opens a system modal dialog by default. If the property is `TRUE`, the system dialog is not opened. This method can return . + + + + + + This event will be raised during system FileTypePolicy checking the dangerous file extension list. + + + Developers can specify their own logic for determining whether to allow a particular type of file to be saved from the document origin URI. Developers can also determine the save decision based on other criteria. Here are two properties in to manage the decision, and . + Table of Properties' value and result: + + + + CancelSave + SuppressDefaultPolicy + Result + + + False + False + Perform the default policy check. It may show the security warning UI if the file extension is dangerous. + + + False + True + Skip the default policy check and the possible security warning. Start saving or downloading. + + + True + Any + Skip the default policy check and the possible security warning. Abort save or download. + + + + + + + ScreenCaptureStarting event is raised when the [Screen Capture API](https://www.w3.org/TR/screen-capture/) is requested by the user using getDisplayMedia(). + + + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + Represents a certificate. Gives access to a certificate's metadata. + + + + + Converts this to a X509Certificate2. + + + An object created using PEM encoded data from + this object. + + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + Subject of the certificate. + + + + + Name of the certificate authority that issued the certificate. + + + + + Base64 encoding of DER encoded serial number of the certificate. Read more about DER at [RFC 7468 DER](https://tools.ietf.org/html/rfc7468#appendix-B). + + + + + Display name for a certificate. + + + + + Returns list of PEM encoded certificate issuer chain. In this list first element is the current certificate followed by intermediate1, intermediate2...intermediateN-1. Root certificate is the last element in the list. + + + + + PEM encoded data for the certificate. Returns Base64 encoding of DER encoded certificate. Read more about PEM at [RFC 1421 Privacy Enhanced Mail](https://tools.ietf.org/html/rfc1421). + + + + + Represents a client certificate. Gives access to a certificate's metadata. + + + + + Converts this to a X509Certificate2. + + + An object created using PEM encoded data from + this object. + + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + The valid date and time for the certificate since the UNIX epoc. + + + + + Subject of the certificate. + + + + + Name of the certificate authority that issued the certificate. + + + + + Base64 encoding of DER encoded serial number of the certificate. Read more about DER at [RFC 7468 DER](https://tools.ietf.org/html/rfc7468#appendix-B). + + + + + Display name for a certificate. + + + + + Returns list of PEM encoded client certificate issuer chain. In this list first element is the current certificate followed by intermediate1, intermediate2...intermediateN-1. Root certificate is the last element in the list. + + + + + Kind of a certificate. See for descriptions. + + + + + PEM encoded data for the certificate. Returns Base64 encoding of DER encoded certificate. Read more about PEM at [RFC 1421 Privacy Enhanced Mail](https://tools.ietf.org/html/rfc1421). + + + + + This class is the owner of the object, and + provides support for resizing, showing and hiding, focusing, and other + functionality related to windowing and composition. + + + The owns the , and if all references to the go away, the WebView will be closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + The owner of the object that provides support for resizing, showing and hiding, focusing, and other functionality related to windowing and composition. + + + The CoreWebView2Controller owns the , and if all references to the go away, the WebView is closed. + + + + + Gets the associated with this . + + + + + + Moves focus into WebView. + + The reason for moving focus. + + WebView will get focus and focus will be set to correspondent element in the page hosted in the WebView. For reason, focus is set to previously focused element or the default element if no previously focused element exists. For reason, focus is set to the first element. For reason, focus is set to the last element. WebView changes focus through user interaction including selecting into a WebView or Tab into it. For tabbing, the app runs MoveFocus with or to align with Tab and Shift+Tab respectively when it decides the WebView is the next tabbable element. + + + + + Determines whether to show or hide the WebView. + + + If IsVisible is set to false, the WebView is transparent and is not rendered. However, this does not affect the window containing the WebView (the ParentWindow parameter that was passed to or ). + If you want that window to disappear too, run the corresponding Hide method from the UI framework on it directly in addition to modifying this. + WebView as a child window does not get window messages when the top window is minimized or restored. For performance reasons, developers should set the IsVisible property of the WebView to false when the app window is minimized and back to true when the app window is restored. The app window does this by handling SIZE_MINIMIZED and SIZE_RESTORED command upon receiving WM_SIZE message. There are CPU and memory benefits when the page is hidden. For instance Chromium has code that throttles activities on the page like animations and some tasks are run less frequently. Similarly, WebView2 will purge some caches to reduce memory usage. + + + + + + Gets or sets the WebView bounds. + + + Bounds are relative to the . The app has two ways to position a WebView: + + + Create a child HWND that is the WebView parent HWND. Position the window where the WebView should be. Use (0, 0) for the top-left corner (the offset) of the Bounds of the WebView. + + + Use the top-most window of the app as the WebView parent HWND. For example, to position ebView correctly in the app, set the top-left corner of the Bounds of the WebView. + + + + The values of Bounds are limited by the coordinate space of the host. + + + + + Gets or sets the zoom factor for the WebView. + + + Note that changing zoom factor may cause window.innerWidth or window.innerHeight and page layout to change. A zoom factor that is applied by the host by setting this ZoomFactor property becomes the new default zoom for the WebView. This zoom factor applies across navigations and is the zoom factor WebView is returned to when the user presses Ctrl+0. When the zoom factor is changed by the user (resulting in the app receiving ), that zoom applies only for the current page. Any user applied zoom is only for the current page and is reset on a navigation. Specifying a ZoomFactor less than or equal to 0 is not allowed. WebView also has an internal supported zoom factor range. When a specified zoom factor is out of that range, it is normalized to be within the range, and a event is raised for the real applied zoom factor. When this range normalization happens, this reports the zoom factor specified during the previous modification of the ZoomFactor property until the event is received after WebView applies the normalized zoom factor. + + + + + Gets the parent window provided by the app or sets the parent window that this WebView is using to render content. + + + It initially returns the ParentWindow passed into or . Setting the property causes the WebView to re-parent the main WebView window to the newly provided window. + + + + + ZoomFactorChanged is raised when the property changes. + + + The event may be raised because the property was modified, or due to the user manually modifying the zoom. When it is modified using the property, the internal zoom factor is updated immediately and no ZoomFactorChanged event is raised. WebView associates the last used zoom factor for each site. It is possible for the zoom factor to change when navigating to a different page. When the zoom factor changes due to a navigation change, the ZoomFactorChanged event is raised right after the event. + + + + + + MoveFocusRequested is raised when user tries to tab out of the WebView. + + + The focus of the WebView has not changed when this event is raised. + + + + + GotFocus is raised when WebView gets focus. + + + + + LostFocus is raised when WebView loses focus. + + + In the case where event is raised, the focus is still on WebView when event is raised. LostFocus is only raised afterwards when code of the app or default action of event sets focus away from WebView. + + + + + AcceleratorKeyPressed is raised when an accelerator key or key combo is pressed or released while the WebView is focused. + + + A key is considered an accelerator if either of the following conditions are true: + + + + Ctrl or Alt is currently being held. + + + The pressed key does not map to a character. + + + + A few specific keys are never considered accelerators, such as Shift. The Escape key is always considered an accelerator. + + Autorepeated key events caused by holding the key down will also raise this event. Filter out the auto-repeated key events by verifying or . + + In windowed mode, this event is synchronous. Until you set to true or the event handler returns, the browser process is blocked and outgoing cross-process COM calls will fail with RPC_E_CANTCALLOUT_ININPUTSYNCCALL. All methods work, however. + + In windowless mode, the event is asynchronous. Further input do not reach the browser until the event handler returns or is set to true, but the browser process is not blocked, and outgoing COM calls work normally. + + It is recommended to set to true as early as you are able to know that you want to handle the accelerator key. + + + + + Updates and properties at the same time. + + The bounds to be updated. + The zoom factor to be updated. + + This operation is atomic from the perspective of the host. After returning from this function, the and properties are both updated if the function is successful, or neither is updated if the function fails. If and are both updated by the same scale (for example, and are both doubled), then the page does not display a change in window.innerWidth or window.innerHeight and the WebView renders the content at the new size and zoom without intermediate renderings. This function also updates just one of or by passing in the new value for one and the current value for the other. + + + + + Tells WebView that the main WebView parent (or any ancestor) HWND moved. + + + This is a notification separate from . This is needed for accessibility and certain dialogs in WebView to work correctly. + + + + + Closes the WebView and cleans up the underlying browser instance. + + + Cleaning up the browser instance releases the resources powering the WebView. The browser instance is shut down if no other WebViews are using it. + + After running Close, all methods fail and event handlers stop running. Specifically, the WebView releases the associated references to any associated event handlers when Close is run. + + Close is implicitly run when the loses the final reference and is destructed. But it is best practice to explicitly run Close to avoid any accidental cycle of references between the WebView and the app code. Specifically, if you capture a reference to the WebView in an event handler you create a reference cycle between the WebView and the event handler. Run Close to break the cycle by releasing all event handlers. But to avoid the situation, it is best to both explicitly run Close on the WebView and to not capture a reference to the WebView to ensure the WebView is cleaned up correctly. Close is synchronous and won't trigger the beforeunload event. + + + + + Gets or sets the WebView default background color. + + + The `DefaultBackgroundColor` is the color that renders underneath all web content. This means WebView renders this color when there is no web content loaded such as before the initial navigation or between navigations. This also means web pages with undefined css background properties or background properties containing transparent pixels will render their contents over this color. Web pages with defined and opaque background properties that span the page will obscure the `DefaultBackgroundColor` and display normally. The default value for this property is white to resemble the native browser experience. Currently this API only supports opaque colors and transparency. It will fail for colors with alpha values that don't equal 0 or 255 ie. translucent colors are not supported. It also does not support transparency on Windows 7. On Windows 7, setting DefaultBackgroundColor to a Color with an Alpha value other than 255 will result in failure. On any OS above Win7, choosing a transparent color will result in showing hosting app content. This means webpages without explicit background properties defined will render web content over hosting app content. + This property may also be set via the `WEBVIEW2_DEFAULT_BACKGROUND_COLOR` environment variable. There is a known issue with background color where just setting the color by property can still leave the app with a white flicker before the `DefaultBackgroundColor` property takes effect. Setting the color via environment variable solves this issue. The value must be a hex value that can optionally prepend a 0x. The value must account for the alpha value which is represented by the first 2 digits. So any hex value fewer than 8 digits will assume a prepended 00 to the hex value and result in a transparent color. `DefaultBackgroundColor` will return the result of this environment variable even if it has not been set directly. This environment variable can only set the `DefaultBackgroundColor` once. Subsequent updates to background color must be done by setting the property. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="DefaultBackgroundColor"::: + + + + + Gets or sets the WebView rasterization scale. + + + The rasterization scale is the combination of the monitor DPI scale and text scaling set by the user. This value should be updated when the DPI scale of the app's top level window changes (i.e. monitor DPI scale changes or the window changes monitor) or when the text scale factor of the system changes. + Rasterization scale applies to the WebView content, as well as popups, context menus, scroll bars, and so on. Normal app scaling scenarios should use the property or method. + + + + + Determines whether the WebView will detect monitor scale changes. + + + ShouldDetectMonitorScaleChanges property determines whether the WebView attempts to track monitor DPI scale changes. When true, the WebView will track monitor DPI scale changes, update the property, and fire event. When false, the WebView will not track monitor DPI scale changes, and the app must update the property itself. event will never raise when ShouldDetectMonitorScaleChanges is false. Apps that want to set their own rasterization scale should set this property to false to avoid the WebView2 updating the property to match the monitor DPI scale. + + + + + Gets or sets the WebView bounds mode. + + + BoundsMode affects how setting the and properties work. Bounds mode can either be in mode or mode. + + + + + RasterizationScaleChanged is raised when the property changes. + + + The event is raised when the Webview detects that the monitor DPI scale has changed, is true, and the Webview has changed the property. + + + + + + Gets or sets the WebView allow external drop property. + + + The AllowExternalDrop is to configure the capability that dropping files into webview2 is allowed or permitted. The default value is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleAllowExternalDrop"::: + + + + + Used to manage profile options that created by . + + + Used to manage profile options that created by . + + + + + Manages the value of the controller's script locale. + + + The ScriptLocale property is to specify the default script + locale. It sets the default locale for all Intl JavaScript APIs and + other JavaScript APIs that depend on it, namely + Intl.DateTimeFormat() which affects string formatting like in + the time/date formats.The intended locale value is in the format of + BCP 47 Language Tags. More information can be found from [IETF + BCP47](https://www.ietf.org/rfc/bcp/bcp47.html ). The default value + for ScriptLocale will be depend on the WebView2 language and OS + region. If the language portions of the WebView2 language and OS + region match, then it will use the OS region. Otherwise, it will use + the WebView2 language. + + + OS Region + WebView2 Language + Default WebView2 ScriptLocale + + + en-GB + en-US + en-GB + + + es-MX + en-US + en-US + + + en-US + en-GB + en-US + + + You can set the ScriptLocale to the empty string to get the default ScriptLocale value. + Use OS specific APIs to determine the OS region to use with this property if you always want to match with the OS + region. For example: + + CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture; + return cultureInfo.Name + + + + + + Manage the name of the controller's profile. + + + The ProfileName property is to specify a profile name, which is only allowed to contain the following ASCII characters. It has a maximum length of 64 characters excluding the null-terminator. It is ASCII case insensitive. + + * alphabet characters: a-z and A-Z + * digit characters: 0-9 + * and '#', '@', '$', '(', ')', '+', '-', '_', '~', '.', ' ' (space). + + Note: the text must not end with a period '.' or ' ' (space). And, although upper-case letters are allowed, they're treated just as lower-case counterparts because the profile name will be mapped to the real profile directory path on disk and Windows file system handles path names in a case-insensitive way. + + + + + Manage the controller's InPrivate mode. + + + + + Provides a set of properties that are used to manage a . + + + + + Converts this to a System.Net.Cookie. + + + An object whose , , , , , , and , matches + those , , , + , , , and of this object. + + + The values of the properties other than those + specified above remain their default values. + + + + + + The expiration date and time for the cookie since the UNIX epoch. + + + Setting the Expires property to + makes this a session cookie, which is its default value. + + + + + Get or sets the cookie name. + + + + + Gets or sets the cookie value. + + + + + Gets the domain for which the cookie is valid. + + + The default value is the host that this cookie has been received from. Note that, for instance, .bing.com, bing.com, and www.bing.com are considered different domains. + + + + + Gets the path for which the cookie is valid. + + + The default value is "/", which means this cookie will be sent to all pages on the . + + + + + Determines whether this cookie is http-only. + + + + + Determines the SameSite status of the cookie which represents the enforcement mode of the cookie. + + + The default value is . + + + + + Gets or sets the security level of this cookie. + + + + + Determines whether this is a session cookie. The default value is false. + + + + + Creates, adds or updates, gets, or or view the cookies. + + + The changes would apply to the context of the user profile. That is, other WebViews under the same user profile could be affected. + + + + + Creates a CoreWebView2Cookie object whose params matches those of the given System.Net.Cookie. + + + A System.Net.Cookie whose params to be used to create a CoreWebView2Cookie. + + + An object whose , , , , , , and , matches those , , , , , , and of the given object. + + + The default value for the + property of the returned object is + . + + + + + + Creates a cookie object with a specified name, value, domain, and path. + + + One can set other optional properties after cookie creation. This only creates a cookie object and it is not added to the cookie manager until you call . name that starts with whitespace(s) is not allowed. + + The name for the to be created. It cannot start with whitespace(s). + + + + + + + Creates a cookie whose params matches those of the specified cookie. + + + + + Gets a list of cookies matching the specific URI. + + + You can modify the cookie objects by calling , and the changes will be applied to the webview. + + If uri is empty string or null, all cookies under the same profile are returned. + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetCookies"::: + + + + + Adds or updates a cookie with the given cookie data; may overwrite cookies with matching name, domain, and path if they exist. + + The to be added or updated. + + This method will fail if the domain of the given cookie is not specified. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AddOrUpdateCookie"::: + + + + + Deletes a cookie whose name and domain/path pair match those of the specified cookie. + + + + + Deletes cookies with matching name and uri. + + The name for the cookies to be deleted is required. + If uri is specified, deletes all cookies with the given name where domain and path match provided URI. + + + + Deletes cookies with matching name and domain/path pair. + + The name for the cookies to be deleted is required. + If domain is specified, deletes only cookies with the exact domain. + If path is specified, deletes only cookies with the exact path. + + + + Deletes all cookies under the same profile. + + + This could affect other WebViews under the same user profile. + + + + + Represents the registration of a custom scheme with the . + + + This allows the WebView2 app to be able to handle event for requests with the + specified scheme and be able to navigate the WebView2 to the custom + scheme. Once the environment is created, the registrations are valid and + immutable throughout the lifetime of the associated WebView2s' browser + process and any WebView2 environments sharing the browser process must be + created with identical custom scheme registrations, otherwise the + environment creation will fail. Any further attempts to register the same + scheme will fail during environment creation. The URIs of registered + custom schemes will be treated similar to http URIs for their origins. + They will have tuple origins for URIs with host and opaque origins for + URIs without host as specified in [7.5 Origin - HTML Living Standard](https://html.spec.whatwg.org/multipage/origin.html) For event, the cases of request + URIs and filter URIs with custom schemes will be normalized according to + generic URI syntax rules. Any non-ASCII characters will be preserved. The + registered custom schemes also participate in [CORS](https://developer.mozilla.org/docs/Web/HTTP/CORS) and adheres to + [CSP](https://developer.mozilla.org/docs/Web/HTTP/CSP). The app needs to + set the appropriate access headers in its event handler to allow CORS + requests. + + + custom-scheme-with-host://hostname/path/to/resource has origin of + custom-scheme-with-host://hostname. + custom-scheme-without-host:path/to/resource has origin of + custom-scheme-without-host:path/to/resource. + + + + + The name of the custom scheme to register. + + + + + Whether the sites with this scheme will be treated as a [Secure + Context](https://developer.mozilla.org/docs/Web/Security/Secure_Contexts) + like an HTTPS site. + + + + + Set this property to true if the URIs with this custom scheme + will have an authority component (a host for custom schemes). + Specifically, if you have a URI of the following form you should set the + HasAuthorityComponent value as listed. + + + + URI + Recommended HasAuthorityComponent value + + + custom-scheme-with-authority://host/path + true + + + custom-scheme-without-authority:path + false + + + + + When this property is set to true, the URIs with this scheme will + be interpreted as having a [scheme and + host](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-tuple) + origin similar to an http URI. Note that the port and user information + are never included in the computation of origins for custom schemes. If + this property is set to false, URIs with this scheme will have an + [opaque + origin](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque) + similar to a data URI. This property is false by default. Note: + For custom schemes registered as having authority component, navigations + to URIs without authority of such custom schemes will fail. However, if + the content inside WebView2 references a subresource with a URI that + does not have an authority component, but of a custom scheme that is + registered as having authority component, the URI will be interpreted as + a relative path as specified in + [RFC3986](https://www.rfc-editor.org/rfc/rfc3986). For example, + custom-scheme-with-authority:path will be interpreted as + custom-scheme-with-authority://host/path. However, this behavior + cannot be guaranteed to remain in future releases so it is recommended + not to rely on this behavior. + + + + + List of origins that are allowed to issue requests with the custom + scheme, such as XHRs and subresource requests that have an Origin + header. + + + The origin of any request (requests that have the [Origin + header](https://developer.mozilla.org/docs/Web/HTTP/Headers/Origin)) to + the custom scheme URI needs to be in this list. No-origin requests are + requests that do not have an Origin header, such as link navigations, + embedded images and are always allowed. Note that cross-origin + restrictions still apply. From any opaque origin (Origin header is + null), no cross-origin requests are allowed. If the list is empty, no + cross-origin request to this scheme is allowed. Origins are specified as + a string in the format of scheme://host:port. The origins are + string pattern matched with * (matches 0 or more characters) and + ? (matches 0 or 1 character) wildcards just like the URI matching + in the + API. For example, http://*.example.com:80. + + Here's a set of examples of what is allowed or not: + + + + Request URI + Originating URL + AllowedOrigins + Allowed + + + custom-scheme:request + https://www.example.com + {"https://www.example.com"} + Yes + + + custom-scheme:request + https://www.example.com + {"https://*.example.com"} + Yes + + + custom-scheme:request + https://www.example.com + {"https://www.example2.com"} + No + + + custom-scheme-with-authority://host/path + custom-scheme-with-authority://host2 + {""} + No + + + custom-scheme-with-authority://host/path + custom-scheme-with-authority2://host + {"custom-scheme-with-authority2://*"} + Yes + + + custom-scheme-without-authority:path + custom-scheme-without-authority:path2 + {"custom-scheme-without-authority:*"} + No + + + custom-scheme-without-authority:path + custom-scheme-without-authority:path2 + {"*"} + Yes + + + + + + + Initializes a new instance of the CoreWebView2CustomSchemeRegistration + class. + + + The name of the custom scheme to register. + + + + + Represents a download operation. Gives access to a download's metadata and supports a user canceling, pausing, or resuming a download. + + + + + The estimated end time of the download. + + + + + The total bytes to receive count. + + + + + The URI of the download. + + + + + The Content-Disposition header value from the download's HTTP response. If none, the value is an empty string. + + + + + MIME type of the downloaded content. + + + + + The number of bytes that have been written to the download file. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BytesReceivedChanged"::: + + + + + The absolute path to the download file, including file name. + + + Host can change this from . + + + + + The state of the download. A download can be in progress, interrupted, or completed. + + + See for descriptions of states. + + + + + The reason why connection with file host was broken. + + + See for descriptions of reasons. + + + + + Returns true if an interrupted download can be resumed. + + + Downloads with the following interrupt reasons may automatically resume without you calling any methods: , , . In these cases progress may be restarted with set to 0. + + + + + Event raised when the bytes received count is updated. + + + + + Event raised when the estimated end time changes. + + + + + Event raised when the state of the download changes. + + + Use to get the current state, and to get the reason if the download is interrupted. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="StateChanged"::: + + + + + Cancels the download. + + + If canceled, the default download dialog shows that the download was canceled. Host should use if download should be canceled without displaying the default download dialog. + + + + + Pauses the download. + + + If paused, the default download dialog shows that the download is paused. No effect if download is already paused. Pausing a download changes the state from in progress to interrupted, with interrupt reason set to . + + + + + Resumes a paused download. May also resume a download that was interrupted for another reason if returns true. + + + Resuming a download changes the state from interrupted to in progress. + + + + + This represents the WebView2 Environment. + + + WebViews created from an environment run on the Browser process specified with environment parameters and objects created from an environment should be used in the same environment. Using it in different environments are not guaranteed to be compatible and may fail. + + + + + + + + + + + + + + + + + + + Creates a WebView2 Environment using the installed or a custom WebView2 Runtime version. + + + The relative path to the folder that contains a custom version of WebView2 Runtime. + + To use a fixed version of the WebView2 Runtime, pass the + folder path that contains the fixed version of the WebView2 Runtime + to browserExecutableFolder. BrowserExecutableFolder supports both relative + (to the application's executable) and absolute file paths. To create WebView2 controls + that use the installed version of the WebView2 Runtime that exists on + user machines, pass a null or empty string to + browserExecutableFolder. In this scenario, the API tries to + find a compatible version of the WebView2 Runtime that is installed + on the user machine (first at the machine level, and then per user) + using the selected channel preference. The path of fixed version of + the WebView2 Runtime should not contain \Edge\Application\. When + such a path is used, the API fails with ERROR_NOT_SUPPORTED. + + + + The user data folder location for WebView2. + + The path is either an absolute file path or a relative file path + that is interpreted as relative to the compiled code for the + current process. The default user data folder {Executable File + Name}.WebView2 is created in the same directory next to the + compiled code for the app. WebView2 creation fails if the compiled + code is running in a directory in which the process does not have + permission to create a new directory. The app is responsible to + clean up the associated user data folder when it is done. + + + + Options used to create WebView2 Environment. + + As a browser process may be shared among WebViews, WebView creation + fails if the specified options does not match the options of + the WebViews that are currently running in the shared browser + process. + + + + + The default channel search order is the WebView2 Runtime, Beta, Dev, and + Canary. When an override WEBVIEW2_RELEASE_CHANNEL_PREFERENCE environment + variable or applicable releaseChannelPreference registry value is set to + 1, the channel search order is reversed. + + + To use a fixed version of the WebView2 Runtime, pass the relative + folder path that contains the fixed version of the WebView2 Runtime + to browserExecutableFolder. To create WebView2 controls that + use the installed version of the WebView2 Runtime that exists on + user machines, pass a null or empty string to + browserExecutableFolder. In this scenario, the API tries to + find a compatible version of the WebView2 Runtime that is installed + on the user machine (first at the machine level, and then per user) + using the selected channel preference. The path of fixed version of + the WebView2 Runtime should not contain \Edge\Application\. When + such a path is used, the API fails with the following error. + + + The , , and may be + overridden by values either specified in environment variables or in + the registry. + + + When creating a the following environment variables are verified. + + + + WEBVIEW2_BROWSER_EXECUTABLE_FOLDER + + + WEBVIEW2_USER_DATA_FOLDER + + + WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS + + + WEBVIEW2_RELEASE_CHANNEL_PREFERENCE + + + + If browser executable folder or user data folder is specified in an + environment variable or in the registry, the specified or values are overridden. If additional browser + arguments are specified in an environment variable or in the + registry, it is appended to the corresponding value in the specified + . + + + While not strictly overrides, additional environment variables may be set. + + + + Value + Description + + + WEBVIEW2_WAIT_FOR_SCRIPT_DEBUGGER + + When found with a non-empty value, this indicates that the WebView + is being launched under a script debugger. In this case, the WebView + issues a Page.waitForDebugger CDP command that runs the + script inside the WebView to pause on launch, until a debugger + issues a corresponding Runtime.runIfWaitingForDebugger CDP + command to resume the runtime. + Note that this environment variable does not have a registry key equivalent. + + + + WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER + + When found with a non-empty value, it indicates that the WebView is + being launched under a script debugger that also supports host apps + that use multiple WebViews. The value is used as the identifier for + a named pipe that is opened and written to when a new WebView is + created by the host app. The payload should match the payload of the + remote-debugging-port JSON target and an external debugger + may use it to attach to a specific WebView instance. The format of + the pipe created by the debugger should be + \\.\pipe\WebView2\Debugger\{app_name}\{pipe_name}, where the + following are true. + + + {app_name} is the host app exe file name, for example, WebView2Example.exe + {pipe_name} is the value set for WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER + + + To enable debugging of the targets identified by the JSON, you must + set the WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS environment + variable to send --remote-debugging-port={port_num}, where + the following is true. + + + {port_num} is the port on which the CDP server binds. + + + If both WEBVIEW2_PIPE_FOR_SCRIPT_DEBUGGER and + WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS environment variables, + the WebViews hosted in your app and associated contents may exposed + to 3rd party apps such as debuggers. Note that this environment + variable does not have a registry key equivalent. + + + + + If none of those environment variables exist, then the registry is examined + next. + + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\BrowserExecutableFolder "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\ReleaseChannelPreference "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\AdditionalBrowserArguments "{AppId}"="" + + + [{Root}]\Software\Policies\Microsoft\Edge\WebView2\UserDataFolder "{AppId}"="" + + + + Use a group policy under Administrative Templates > + Microsoft Edge WebView2 to configure browser executable folder + and release channel preference. + + + + Value + Description + + + ERROR_DISK_FULL + + In the unlikely scenario where some instances of WebView are open during a + browser update, the deletion of the previous WebView2 Runtime may be + blocked. To avoid running out of disk space, a new WebView creation fails + with this error if it detects that too many previous WebView2 + Runtime versions exist. + + + + COREWEBVIEW2_MAX_INSTANCES + + The default maximum number of WebView2 Runtime versions allowed is 20. + To override the maximum number of the previous WebView2 Runtime versions + allowed, set the value of the following environment variable. + + + + ERROR_PRODUCT_UNINSTALLED + + If the Webview depends upon an installed WebView2 Runtime version and it is + uninstalled, any subsequent creation fails with this error. + + + + + First verify with Root as HKLM and then HKCU. AppId is first set to + the Application User Model ID of the process, then if no corresponding + registry key, the AppId is set to the compiled code name of the process, + or if that is not a registry key then *. If an override registry key is + found, use the browserExecutableFolder and userDataFolder registry + values as replacements and append additionalBrowserArguments registry + values for the corresponding values in the provided . + + + + + + Gets the browser version info including channel name if it is not the stable channel or WebView2 Runtime. + + + The relative path to the folder that contains the WebView2 Runtime. + + + WebView2 Runtime installation is missing. + + + + + Gets the browser version info including channel name if it is not the stable channel or WebView2 Runtime. + + + The relative path to the folder that contains the WebView2 Runtime. + + + The environment options used to create the environment. + + + WebView2 Runtime installation is missing. + + + Browser version info includes channel name if it is not the WebView2 Runtime. + Channel names are Beta, Dev, and Canary. The format of the return string + matches the format of . + If an override exists for BrowserExecutableFolder, ReleaseChannels, + or ChannelSearchKind, the override is used. The presence of an override + can result in a different channel used than the one expected based on the environment + options object. BrowserExecutableFolder takes precedence over the + other options. See + for more details on overrides. If an override is not specified, then the + parameters passed to GetAvailableBrowserVersionString are used. + The method fails if the loader is unable to find an installed WebView2 + Runtime or non-stable Microsoft Edge installation. + + + + + Compares two instances of browser versions correctly and returns an integer that indicates whether the first instance is older, the same as, or newer than the second instance. + + + One of the version strings to compare. + + + The other version string to compare. + + + An integer that indicates whether the first instance is older, the same as, or newer than the second instance. + + + Value Type + Condition + + + Less than zero + version1 is older than version2. + + + Zero + version1 is the same as version2. + + + Greater than zero + version1 is newer than version2. + + + + + + + Creates a new object. + + The request URI. + The HTTP request method. + + The raw request header string delimited by CRLF (optional in last header). + + uri parameter must be absolute URI. It's also possible to create this object with null headers string and then use the to construct the headers line by line. + + + + + + Creates a new object, + which can be passed as a parameter in and function for multiple profiles + support. + + + A that can be + passed when calling and . + + + The options is a settable property while the default for profile + name is an empty string and the default value for is + false. The profile will be created on disk or opened when calling + CreateCoreWebView2ControllerWithOptions no matter InPrivate mode is + enabled or not, and it will be released in memory when the + corresponding is closed but + still remain on disk. As WebView2 is built on top of Edge browser, + it follows Edge's behavior pattern. To create an InPrivate WebView, + we get an off-the-record profile (an InPrivate profile) from a + regular profile, then create the WebView with the off-the-record + profile. Also the profile name can be reused. + + + + + Asynchronously creates a new object. + + The HWND in which the WebView should be displayed and from which receive input. + + The options contains profileName and inPrivate parameters that could be used to create CoreWebView2Profile, and it can be used to create multiple WebViews with multiple profiles under a single user data directory. + + + Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + + Asynchronously creates a new object. + + The HWND in which the WebView should be displayed and from which receive input. + + The options contains profileName and inPrivate parameters that could be used to create CoreWebView2Profile, and it can be used to create multiple WebViews with multiple profiles under a single user data directory. + + + Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + + Set the path of the folder containing the `WebView2Loader.dll`. + + The path of the folder containing the `WebView2Loader.dll`. + + Thrown when `WebView2Loader.dll` has been successfully loaded. + + + This function allows you to set the path of the folder containing the `WebView2Loader.dll`. This should be the path of a folder containing `WebView2Loader.dll` and not a path to the `WebView2Loader.dll` file itself. + Note that the WebView2 SDK contains multiple `WebView2Loader.dll` files for different CPU architectures. When specifying folder path, you must specify one containing a `WebView2Loader.dll` module with a CPU architecture matching the current process CPU architecture. + This function is used to load the `WebView2Loader.dll` module during calls to any other static methods on `CoreWebView2Environment`. So, the path should be specified before any other API is called in `CoreWebView2Environment` class. Once `WebView2Loader.dll` is successfully loaded this function will throw an InvalidOperationException exception. + The path can be relative or absolute. Relative paths are relative to the path of the `Microsoft.Web.WebView2.Core.dll` module. + If the `WebView2Loader.dll` file does not exist in that path or LoadLibrary cannot load the file, or LoadLibrary fails for any other reason, an exception corresponding to the LoadLibrary failure is thrown when any other API is called in `CoreWebView2Environment` class. For instance, if the file cannot be found a `DllNotFoundException` exception will be thrown. + + + + + Gets the browser version info of the current , including channel name if it is not the stable channel. + + + It matches the format of the method. Channel names are beta, dev, and canary. + + + + + NewBrowserVersionAvailable is raised when a newer version of the WebView2 Runtime is installed and available using WebView2. + + + To use the newer version of the browser you must create a new environment and WebView. The event is only raised for new version from the same WebView2 Runtime from which the code is running. When not running with installed WebView2 Runtime, no event is raised. + + Because a user data folder is only able to be used by one browser process at a time, if you want to use the same user data folder in the WebViews using the new version of the browser, you must close the environment and instance of WebView that are using the older version of the browser first. Or simply prompt the user to restart the app. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SubscribeToNewBrowserVersionAvailable"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="NewBrowserVersionAvailable"::: + + + + + Asynchronously creates a new WebView. + + The HWND in which the WebView should be displayed and from which receive input. + + The WebView adds a child window to the provided window during WebView creation. Z-order and other things impacted by sibling window order are affected accordingly. + + + HWND_MESSAGE is a valid parameter for ParentWindow for an invisible WebView for Windows 8 and above. In this case the window will never become visible. You are not able to reparent the window after you have created the WebView. This is not supported in Windows 7 or below. Passing this parameter in Windows 7 or below will return ERROR_INVALID_WINDOW_HANDLE in the controller callback. + + + + It can also accept a which is created by as the second parameter for multiple profiles support. As WebView2 is built on top of Edge browser, it follows Edge's behavior pattern. To create an InPrivate WebView, we gets an off-the-record profile (an InPrivate profile) from a regular profile, then create the WebView with the off-the-record profile. Multiple profiles under single user data directory can share some system resources including memory, CPU footprint, disk space (such as compiled shaders and safebrowsing data) etc. + + + + It is recommended that the application set Application User Model ID for the process or the application window. If none is set, during WebView creation a generated Application User Model ID is set to root window of ParentWindow. + + + + It is recommended that the app handles restart manager messages, to gracefully restart it in the case when the app is using the WebView2 Runtime from a certain installation and that installation is being uninstalled. For example, if a user installs a version of the WebView2 Runtime and opts to use another version of the WebView2 Runtime for testing the app, and then uninstalls the 1st version of the WebView2 Runtime without closing the app, the app restarts to allow un-installation to succeed. + + + + When the app retries CreateCoreWebView2ControllerAsync upon failure, it is recommended that the app restarts from creating a new WebView2 Environment. If a WebView2 Runtime update happens, the version associated with a WebView2 Environment may have been removed and causing the object to no longer work. Creating a new WebView2 Environment works since it uses the latest version. + + + + WebView creation fails if a running instance using the same user data folder exists, and the Environment objects have different . For example, if a WebView was created with one , an attempt to create a WebView with a different using the same user data folder fails. + + + + WebView creation can fail with `E_UNEXPECTED` if runtime does not have permissions to the user data folder. + + + + + + Creates a new object. + + HTTP response content as stream. + The HTTP response status code. + The HTTP response reason phrase. + The raw response header string delimited by newline. + + It is also possible to create this object with empty headers string and then use the to construct the headers line by line. + + + + + + Asynchronously creates a new WebView for use with visual hosting. + + The HWND in which the app will connect the visual tree of the WebView. + + ParentWindow will be the HWND that the app will receive pointer/mouse input meant for the WebView (and will need to use or to forward). If the app moves the WebView visual tree to underneath a different window, then it needs to set to update the new parent HWND of the visual tree. + + Set property on the created to provide a visual to host the browser's visual tree. + + It is recommended that the application set Application User Model ID for the process or the application window. If none is set, during WebView creation a generated Application User Model ID is set to root window of ParentWindow. + + It can also accept a which is created by as the second parameter for multiple profiles support. + + CreateCoreWebView2CompositionController is supported in the following versions of Windows: + + + Windows 11 + + + Windows 10 + + + Windows Server 2019 + + + Windows Server 2016 + + + + + + + Creates an empty . + + + The returned needs to be populated with all of the relevant info before calling . + + + + + BrowserProcessExited is raised when the collection of WebView2 Runtime processes for the browser process of this terminate due to browser process failure or normal shutdown (for example, when all associated WebViews are closed), after all resources have been released (including the user data folder). + + + Multiple app processes can share a browser process by creating their webviews from a with the same user data folder. When the entire collection of WebView2Runtime processes for the browser process exit, all associated objects receive the BrowserProcessExited event. Multiple processes sharing the same browser process need to coordinate their use of the shared user data folder to avoid race conditions and unnecessary waits. For example, one process should not clear the user data folder at the same time that another process recovers from a crash by recreating its WebView controls; one process should not block waiting for the event if other app processes are using the same browser process (the browser process will not exit until those other processes have closed their webviews too). + + Note this is an event from , not . The difference between BrowserProcessExited and is that BrowserProcessExited is raised for any browser process exit (expected or unexpected, after all associated processes have exited too), while is raised for unexpected process exits of any kind (browser, render, GPU, and all other types), or for main frame render process unresponsiveness. To learn more about the WebView2 Process Model, go to [Process model](/microsoft-edge/webview2/concepts/process-model). + + In the case the browser process crashes, both BrowserProcessExited and events are raised, but the order is not guaranteed. These events are intended for different scenarios. It is up to the app to coordinate the handlers so they do not try to perform reliability recovery while also trying to move to a new WebView2 Runtime version or remove the user data folder. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SubscribeToBrowserProcessExited"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="BrowserProcessExited"::: + + + + + Creates the used by the method. + + + + + Gets the user data folder that all CoreWebView2s created from this environment are using. + + + This could be either the value passed in by the developer when creating the environment object or the calculated one for default handling. And will always be an absolute path. + + + + + ProcessInfosChanged is raised when a collection of WebView2 Runtime processes changed due to new process being detected or when a existing process gone away. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ProcessInfosChanged"::: + + + + + Returns the list of all using same user data folder except for crashpad process. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetProcessInfos"::: + + + + + Create a custom object to insert into the WebView context menu. + + + CoreWebView2 will rewind the icon stream before decoding. + There is a limit of 1000 active custom context menu items at a given time per . Attempting to create more before deleting existing ones will fail with ERROR_NOT_ENOUGH_QUOTA. It is recommended to reuse custom ContextMenuItems across CoreWebView2ContextMenuRequested events for performance. The created object's property will default to true and property will default to false. A will be assigned that's unique across active custom context menu items, but command ID values of deleted custom ContextMenuItems can be reassigned. + + + + + Gets the failure report folder that all CoreWebView2s created from this environment are using. + + + + + Create a shared memory based buffer with the specified size in bytes. + + + The buffer can be shared with web contents in WebView by calling or . + Once shared, the same content of the buffer will be accessible from both the app process and script in WebView. + Modification to the content will be visible to all parties that have access to the buffer. + The shared buffer is presented to the script as ArrayBuffer. All JavaScript APIs that work for ArrayBuffer including Atomics APIs can be used on it. + There is currently a limitation that only size less than 2GB is supported. + + + + + Returns a snapshot collection of corresponding to all currently running processes associated with this excludes crashpad process. This provides the same list of as what's provided in , but additionally provides a list of associated which are actively running (showing or hiding UI elements) in the renderer process. See for more information. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetProcessExtendedInfos"::: + + + + + Creates a object from a path that represents a Web [FileSystemFileHandle](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle). + + The path pointed by the file. + This must be a syntactically correct fully qualified path, but it is not checked here whether it currently points to a file. If an invalid path is passed, an `InvalidArgumentException` will be thrown. Any other state validation will be done when this handle is accessed from web content and will cause the DOM exceptions described in [FileSystemFileHandle methods](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle#instance_methods) if access operations fail + + + This is used to specify whether the Handle should be created with a Read-only or Read-and-write web permission. + For the `permission` value specified here, the DOM [PermissionStatus](https://developer.mozilla.org/docs/Web/API/PermissionStatus) property will be `[granted](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)` and the unspecified permission will be `[prompt](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)`. Therefore, the web content then does not need to call [requestPermission](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) for the permission that was specified before attempting the permitted operation, but if it does, the promise will immediately be resolved with 'granted' PermissionStatus without firing the event or prompting the user for permission. Otherwise, `requestPermission` will behave as the status of permission is currently `prompt`, which means the `PermissionRequested` event will fire or the user will be prompted. + Note: An exception to this is, if there is a parent directory handle that has broader permissions in the same page context than specified in here, the handle will automatically inherit the most permissive permission of the parent handle when posted to that page context. i.e. If there is already a `FileSystemDirectoryHandle` to `C:\foo` that has write permission on a page, even though a to file `C:\example\file.txt` may be created with permission, when posted to that page, write permission will be automatically granted to the created handle. + Additionally, the app must have the same OS permissions that have propagated to the [WebView2 browser process](/microsoft-edge/webview2/concepts/process-model) for the path it wishes to give the web content to read/write the file. Specifically, the WebView2 browser process will run in same user, package identity, and app container of the app, but other means such as security context impersonations do not get propagated, so such permissions that the app has, will not be effective in WebView2. + + + + An app needs to be mindful that this object, when posted to the web content, provides it with unusual access to OS file system via the Web FileSystem API! The app should therefore only post objects for paths that it wants to allow access to the web content and it is not recommended that the web content "asks" for this path. The app should also check the source property of the target to ensure that it is sending to the web content of intended origin. Once the object is passed to web content, if the content is attempting a read, the file must be existing and available to read similar to a file chosen by [open file picker](https://developer.mozilla.org/docs/Web/API/Window/showOpenFilePicker), otherwise the read operation will [throw a DOM exception](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle/getFile#exceptions). For write operations, the file does not need to exist as `FileSystemFileHandle` will behave as a file path chosen by [save file picker](https://developer.mozilla.org/docs/Web/API/Window/showSaveFilePicker) and will create or overwrite the file, but the parent directory structure pointed by the file must exist and an existing file must be available to write and delete or the write operation will [throw a DOM exception](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle/createWritable#exceptions). + + + + + Creates a object from a path that represents a Web [FileSystemDirectoryHandle](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle). + + The path pointed by the directory. + + This must be a syntactically correct fully qualified path, but it is not checked here whether it currently points to a directory. Any other state validation will be done when this handle is accessed from web content and will cause DOM exceptions if access operations fail. If an invalid path is passed, an `InvalidArgumentException` will be thrown. + + + This is used to specify whether the Handle should be created with a Read-only or Read-and-write web permission. + For the permission value specified here, the Web [PermissionStatus](https://developer.mozilla.org/docs/Web/API/PermissionStatus) will be `[granted](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)` and the unspecified permission will be `[prompt](https://developer.mozilla.org/docs/Web/API/PermissionStatus/state)`. Therefore, the web content then does not need to call [requestPermission](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) for the permission that was specified before attempting the permitted operation, but if it does, the promise will immediately be resolved with 'granted' PermissionStatus without firing the WebView2 event or prompting the user for permission. Otherwise, `requestPermission` will behave as the status of permission is currently `Prompt`, which means the `PermissionRequested` event will fire or the user will be prompted. + Note: An exception to this is, if there is a parent directory handle that has broader permissions in the same page context than specified in here, the handle will automatically inherit the most permissive permission of the parent handle when posted to that page context. i.e. If there is already a `FileSystemDirectoryHandle` to `C:\foo` that has write permission on a page, even though a to directory `C:\example\directory` may be created with permission, when posted to that page, write permission will be automatically granted to the created handle. + Additionally, the app must have the same OS permissions that have propagated to the [WebView2 browser process](/microsoft-edge/webview2/concepts/process-model) for the path it wishes to give the web content to make any operations on the directory. Specifically, the WebView2 browser process will run in same user, package identity, and app container of the app, but other means such as security context impersonations do not get propagated, so such permissions that the app has, will not be effective in WebView2. + + + + An app needs to be mindful that this object, when posted to the web content, provides it with unusual access to OS file system via the Web FileSystem API! The app should therefore only post objects for paths that it wants to allow access to the web content and it is not recommended that the web content "asks" for this path. The app should also check the source property of the target to ensure that it is sending to the web content of intended origin. Once the object is passed to web content, the path must point to a directory as if it was chosen via [directory picker](https://developer.mozilla.org/docs/Web/API/Window/showDirectoryPicker) otherwise any IO operation done on the `FileSystemDirectoryHandle` will throw a DOM exception. + + + + + Options used to create WebView2 Environment. + + + Default values will use your defaulted Edge WebView2 Runtime binaries and + user data folder. + + + + + + + + + + + + + Initializes a new instance of the CoreWebView2EnvironmentOptions class. + + + AdditionalBrowserArguments can be specified to change the behavior of + the WebView. + + + The default language that WebView will run with. + + + The version of the Edge WebView2 Runtime binaries required to be + compatible with the calling application. + + + Set to true if single sign on be enabled using the end user's OS primary + account. Defaults to false. + + + List of custom scheme registrations to be applied to the . + + + + + Initializes a new instance of the CoreWebView2EnvironmentOptions class. + + + AdditionalBrowserArguments can be specified to change the behavior of + the WebView. + + + The default language that WebView will run with. + + + The version of the Edge WebView2 Runtime binaries required to be + compatible with the calling application. + + + Set to true if single sign on be enabled using the end user's OS primary + account. Defaults to false. + + + List of custom scheme registrations to be applied to the . + + + Set to CoreWebView2ChannelSearchKind.LeastStable so that environment + creation searches for binaries from least to most stable: + Canary -> Dev -> Beta -> WebView2 Runtime. + Defaults to CoreWebView2RuntimeChannel.MostStable. + + + The release channels that are searched for during environment creation. + + + + + List of custom scheme registrations to be applied to the + + + + + Gets or sets the additional browser arguments to change the behavior of the WebView. + + + + The arguments are passed to the browser process as part of the command. For more information about using command-line switches with Chromium browser processes, navigate to [Run Chromium with Flags](https://aka.ms/RunChromiumWithFlags). The value appended to a switch is appended to the browser process, for example, in --edge-webview-switches=xxx the value is xxx. If you specify a switch that is important to WebView functionality, it is ignored, for example, --user-data-dir. Specific features are disabled internally and blocked from being enabled. If a switch is specified multiple times, only the last instance is used. + + + + A merge of the different values of the same switch is not attempted, except for disabled and enabled features. The features specified by --enable-features and --disable-features will be merged with simple logic: + + + + The features are the union of the specified features and built-in features. If a feature is disabled, it is removed from the enabled features list. + + + + + If you specify command-line switches and sets this property, the --edge-webview-switches value takes precedence and is processed last. If a switch fails to parse, the switch is ignored. The default state for the operation is to run the browser process with no extra flags. + + + Please note that calling this API twice will replace the previous value rather than appending to it. If there are multiple switches, there should be a space in between them. The one exception is if multiple features are being enabled/disabled for a single switch, in which case the features should be comma-separated. Ex. "--disable-features=feature1,feature2 --some-other-switch --do-something" + + + + + + Gets or sets the default display language for WebView. + + + It applies to browser UIs such as context menu and dialogs. It also applies to the accept-languages HTTP header that WebView sends to websites. The intended locale value is in the format of BCP 47 Language Tags. More information can be found from [IETF BCP47](https://www.ietf.org/rfc/bcp/bcp47.html). + + + + + Gets or sets the version of the WebView2 Runtime binaries required to be compatible with your app. + + + This defaults to the WebView2 Runtime version that corresponds with the version of the SDK the app is using. The format of this value is the same as the format of the property and other BrowserVersion values. Only the version part of the BrowserVersion value is respected. The channel suffix, if it exists, is ignored. The version of the WebView2 Runtime binaries actually used may be different from the specified TargetCompatibleBrowserVersion. The binaries are only guaranteed to be compatible. Verify the actual version on the property. + + + + + Determines whether to enable single sign on with Azure Active Directory (AAD) resources inside WebView using the logged in Windows account and single sign on (SSO) with web sites using Microsoft account associated with the login in Windows account. + + + The default value is false. Universal Windows Platform apps must also declare enterpriseCloudSSO [restricted capability](/windows/uwp/packaging/app-capability-declarations#restricted-capabilities) for the single sign on (SSO) to work. + + + + + Determines whether other processes can create from created with the same user data folder and therefore sharing the same WebView browser process instance. + + + The default value is false. + + + + + When IsCustomCrashReportingEnabled is set to true, Windows won't send crash data to Microsoft endpoint. + + + The default value is false. In this case, WebView will respect OS consent. + + + + + The EnableTrackingPrevention property is used to enable/disable tracking prevention feature in WebView2. This property enable/disable tracking prevention for all the WebView2's created in the same environment. By default this feature is enabled to block potentially harmful trackers and trackers from sites that aren't visited before and set to or whatever value was last changed/persisted on the profile. + + + You can set this property to false to disable the tracking prevention feature if the app only renders content in the WebView2 that is known to be safe. Disabling this feature when creating environment also improves runtime performance by skipping related code. + + You shouldn't disable this property if WebView2 is being used as a "full browser" with arbitrary navigation and should protect end user privacy. + + There is property to control levels of tracking prevention of the WebView2's associated with a same profile. However, you can also disable tracking prevention later using property and value but that doesn't improves runtime performance. + + See for more details. + + Tracking prevention protects users from online tracking by restricting the ability of trackers to access browser-based storage as well as the network. See [Tracking prevention](/microsoft-edge/web-platform/tracking-prevention). + + + + + Enable/disable browser extensions. + + + When AreBrowserExtensionsEnabled is set to true, new extensions can be added to user profile and used. AreBrowserExtensionsEnabled is default to be false, in this case, new extensions can't be installed, and already installed extension won't be available to use in user profile. If connecting to an already running environment with a different value for AreBrowserExtensionsEnabled property, it will fail with HRESULT_FROM_WIN32(ERROR_INVALID_STATE). See for Extensions API details. + + + + + Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable so that the WebView2 loader searches for binaries from least to most stable: Canary -> Dev -> Beta -> WebView2 Runtime. + + + The ChannelSearchKind property is CoreWebView2ChannelSearchKind.MostStable by default and environment creation searches for a release channel on the machine from most to least stable using the first channel found. The default search order is: WebView2 Release -> Beta -> Dev -> Canary. Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable to reverse the search order so that environment creation searches for a channel from least to most stable. If a ReleaseChannels has been provided, environment creation will only search for channels in the set. See for more details on channels. This property can be overridden by the corresponding registry key ChannelSearchKind or the environment variable WEBVIEW2_CHANNEL_SEARCH_KIND. Set the value to 1 to reverse the search order. See for more details on overrides. + + + + + Sets the ReleaseChannels, which is a mask of one or more CoreWebView2ReleaseChannels indicating which channels environment creation should search for. + + + OR operation(s) can be applied to multiple CoreWebView2ReleaseChannels to create a mask. The default value is a mask of all the channels. By default, environment creation searches for channels from most to least stable, using the first channel found on the device. When ReleaseChannels is provided, environment creation will only search for the channels specified in the set. Set ChannelSearchKind to CoreWebView2ChannelSearchKind.LeastStable to reverse the search order so that environment creation searches for the least stable build first. See for descriptions of each channel. Environment creation fails if it is unable to find any channel from the ReleaseChannels installed on the device. Use to verify which channel is used. If both a BrowserExecutableFolder and ReleaseChannels are provided, the BrowserExecutableFolder takes precedence. The ReleaseChannels can be overridden by the corresponding registry override ReleaseChannels or the environment variable WEBVIEW2_RELEASE_CHANNELS. Set the value to a comma-separated string of integers, which map to the following release channel values: Stable (0), Beta (1), Dev (2), and Canary (3). For example, the values "0,2" and "2,0" indicate that environment creation should only search for Dev channel and the WebView2 Runtime, using the order indicated by . Environment creation attempts to interpret each integer and treats any invalid entry as Stable channel. + + + + ReleaseChannels + Channel Search Kind: Most Stable (default) + Channel Search Kind: Least Stable + + + CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta + Beta -> WebView2 Runtime + + + CoreWebView2ReleaseChannels.Canary | CoreWebView2ReleaseChannels.Dev | CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta -> Dev -> Canary + Canary -> Dev -> Beta -> WebView2 Runtime + + + CoreWebView2ReleaseChannels.Canary + Canary + Canary + + + CoreWebView2ReleaseChannels.Beta | CoreWebView2ReleaseChannels.Canary | CoreWebView2ReleaseChannels.Stable + WebView2 Runtime -> Beta -> Canary + Canary -> Beta -> WebView2 Runtime + + + + + + + Set ScrollBar style to be used. + + + The default is CoreWebView2ScrollbarStyle.Default which specifies the default browser ScrollBar style. CSS styles that modify the ScrollBar applied on top of native ScrollBar styling that is selected with CoreWebView2ScrollbarStyle. + + + + + CoreWebView2Frame provides direct access to the iframes information and handling. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + CoreWebView2Frame provides direct access to the iframes information and handling. You can get a CoreWebView2Frame by handling the event. + + + + + Adds the provided host object to script running in the WebViewFrame with the specified name for the list of the specified origins. + The host object will be accessible for this iframe only if the iframe's origin during + access matches one of the origins which are passed. The provided origins + will be normalized before comparing to the origin of the document. + So the scheme name is made lower case, the host will be punycode decoded + as appropriate, default port values will be removed, and so on. + This means the origin's host may be punycode encoded or not and will match + regardless. If list contains malformed origin the call will fail. + The method can be called multiple times in a row without calling + RemoveHostObjectFromScript for the same object name. It will replace + the previous object with the new object and new list of origins. + List of origins will be treated as following: + 1. empty list - call will succeed and object will be added for the iframe + but it will not be exposed to any origin; + 2. list with origins - during access to host object from iframe the + origin will be checked that it belongs to this list; + 3. list with "*" element - host object will be available for iframe for + all origins. We suggest not to use this feature without understanding + security implications of giving access to host object from from iframes + with unknown origins. + 4. list with "file://" element - host object will be available for iframes + loaded via file protocol. + + + The name of the host object. + + + The host object to be added to script. + + + The list of the iframe origins for which host object will be accessible. + + + + + + The value of iframe's window.name property. The default value equals to iframe html tag declaring it. + + + + + NameChanged is raised when the iframe changes its window.name property. + + + + + + Destroyed event is raised when the iframe corresponding to this object is removed or the document containing that iframe is destroyed. + + + + + + Remove the host object specified by the name so that it is no longer accessible from JavaScript code in the iframe. + + + While new access attempts are denied, if the object is already obtained by JavaScript code in the iframe, the JavaScript code continues to have access to that object. Calling this method for a name that is already removed or was never added fails. If the iframe is destroyed this method will return fail also. + + + + + Check whether a frame is destroyed. Returns true during the event. + + + + + NavigationStarting is raised when the current frame is requesting permission to navigate to a different URI. + + + A frame navigation will raise a event and a event. All of the event handlers will be run before the event handlers. All of the event handlers share a common object. Whichever event handler is last to change the property will decide if the frame navigation will be cancelled. + Redirects raise this event as well, and the navigation id is the same as the original one. You may block corresponding navigations until the event handler returns. + + + + + ContentLoading is raised before any content is loaded, including scripts added with . ContentLoading is not raised if a same page navigation occurs. + + + This operation follows the event and precedes the and events. + + + + + NavigationCompleted is raised when the current frame has completely loaded (body.onload has been raised) or loading stopped with error. + + + + + DOMContentLoaded is raised when the initial HTML document has been parsed. + + + This aligns with the the document's DOMContentLoaded event in HTML. + + + + + WebMessageReceived is raised when the setting is set and the iframe runs window.chrome.webview.postMessage. + + + The postMessage function is void postMessage(object) where object is any object supported by JSON conversion. + When postMessage is called, the handler's Invoke method will be called with the object parameter postMessage converted to a JSON string. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebMessageReceivedIFrame"::: + + + + + Runs JavaScript code from the javaScript parameter in the current frame. + + The JavaScript code to be run in the current frame. + A JSON encoded string that represents the result of running the provided JavaScript. + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. This method is applied asynchronously. + If the method is run before , the script will not be executed and the JSON null will be returned. + This operation works even if is set to false. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ExecuteScriptFrame"::: + + + + + Posts the specified webMessageAsJson to the current frame. + + The web message to be posted to the iframe. + + The event args is an instance of MessageEvent. The setting must be true or the message will not be sent. The event arg's data property of the event arg is the webMessageAsJson string parameter parsed as a JSON string into a JavaScript object. The event arg's source property of the event arg is a reference to the window.chrome.webview object. For information about sending messages from the iframe to the host, navigate to . The message is sent asynchronously. If a navigation occurs before the message is posted to the iframe, the message is not be sent. + + + Runs the message event of the window.chrome.webview of the iframe. JavaScript in that document may subscribe and unsubscribe to the event using the following code: + + window.chrome.webview.addEventListener('message', handler) + window.chrome.webview.removeEventListener('message', handler) + + + + + + + + + Posts a message that is a simple string rather than a JSON string representation of a JavaScript object. + + The web message to be posted to the iframe. + + This behaves in exactly the same manner as , but the data property of the event arg of the window.chrome.webview message is a string with the same value as webMessageAsString. Use this instead of if you want to communicate using simple strings rather than JSON objects. + + + + + + + PermissionRequested is raised when content in an iframe or any of its descendant iframes requests permission to access some privileged resources. + + + This relates to the PermissionRequested event on the CoreWebView2. + Both these events will be raised in the case of an iframe requesting permission. The CoreWebView2Frame's event handlers will be invoked before the event handlers on the CoreWebView2. If the Handled property of the PermissionRequestedEventArgs is set to TRUE within the CoreWebView2Frame event handler, then the event will not be raised on the CoreWebView2, and it's event handlers will not be invoked. + In the case of nested iframes, the PermissionRequested event will be raised from the top level iframe. + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + Share a shared buffer object with script of the iframe in the WebView. + + The object to be shared with script. + The desired given to script. + Additional data to be send to script. If it is not null or empty string, and it is not a valid JSON string, will be thrown. + + The script will receive a sharedbufferreceived event from chrome.webview. + The event arg for that event will have the following methods and properties. + + + + Property + Description + + + getBuffer() + A method that returns an ArrayBuffer object with the backing content from the shared buffer. + + + additionalData + An object as the result of parsing additionalDataAsJson as JSON string. This property will be undefined if additionalDataAsJson is nullptr or empty string. + + + source + With a value set as chrome.webview object. + + + + If access is , the script will only have read access to the buffer. + If the script tries to modify the content in a read only buffer, it will cause an access violation in WebView renderer process and crash the renderer process. + + If the shared buffer is already closed, the API throws with error code of RO_E_CLOSED. + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access to the shared buffer any more. + + The application can post the same shared buffer object to multiple web pages or iframes, or post to the same web page or iframe multiple times. + Each PostSharedBufferToScript will create a separate ArrayBuffer object with its own view of the memory and is separately released. + The underlying shared memory will be released when all the views are released. + + Sharing a buffer to script has security risk. You should only share buffer with trusted site. + If a buffer is shared to a untrusted site, possible sensitive information could be leaked. + If a buffer is shared as modifiable by the script and the script modifies it in an unexpected way, it could result in corrupted data that might even crash the application. + + The example code shows how to send data to script for one time read only consumption. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="OneTimeShareBuffer"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_1"::: + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/assets/sharedBuffer.html" id="ShareBufferScriptCode_2"::: + + + + + The unique identifier of the current frame. It's the same kind of ID as with the and . + + + + + ScreenCaptureStarting event is raised when the [Screen Capture API](https://www.w3.org/TR/screen-capture/) is requested by the user using getDisplayMedia(). + + + This relates to the ScreenCaptureStarting event on the CoreWebView2. + Both these events will be raised in the case of an iframe requesting screen capture. The CoreWebView2Frame's event handlers will be invoked before the event handlers on the CoreWebView2. If the Handled property of the ScreenCaptureStartingEventArgs is set to TRUE within the CoreWebView2Frame event handler, then the event will not be raised on the CoreWebView2, and it's event handlers will not be invoked. + In the case of nested iframes, the ScreenCaptureStarting event will be raised from the top level iframe. + If a deferral is not taken on the event args, the subsequent scripts are blocked until the event handler returns. If a deferral is taken, the scripts are blocked until the deferral is completed. + + + + + + Iterator for a collection of HTTP headers. + + + + + + + + + + No COM support; throws instead. + + + No COM support. + + + + + + + + Gets the header in the + or collection at the + current position of the enumerator. + + + + + + true when the iterator has not run out of headers. + + + If the collection over which the iterator is iterating is empty or if the iterator has gone past the end of the collection then this is false. + + + + + HTTP request headers. + + + Used to inspect the HTTP request on event and event. It is possible to modify the HTTP request headers from a event, but not from a event. + + + + + + + + + + + + + Returns an enumerator that iterates through the or collection. + + + + + Gets the header value matching the name. + + The header value matching the name. + + + + Gets the header value matching the name using a . + + The header value matching the name. + + + + Checks whether the headers contain an entry that matches the header name. + + Whether the headers contain an entry that matches the header name. + + + + Adds or updates header that matches the name. + + + + + Removes header that matches the name. + + + + + Gets a over the collection of request headers. + + + + + HTTP response headers. + + + Used to construct a for the event. + + + + + + + + + + + Returns an enumerator that iterates through the or collection. + + + + + Appends header line with name and value. + + The header name to be appended. + The header value to be appended. + + + + Checks whether this CoreWebView2HttpResponseHeaders contain entries matching the header name. + + The name of the header to seek. + + + + Gets the first header value in the collection matching the name. + + The header name. + The first header value in the collection matching the name. + + + + Gets the header values matching the name. + + The header name. + + + + Gets a over the collection of entire . + + + + + Event args for the CoreWebView2InitializationCompleted event. + + + + + Initializes a new instance of the CoreWebView2InitializationCompletedEventArgs class. + + + Exception that occurred during initialization, or null if initialization was successful. + + + + + True if the init task completed successfully. + + + + + The exception thrown from the init task. If the task completed successfully, this property is null. + + + + + An object that represents a [HTML Notification object](https://developer.mozilla.org/docs/Web/API/Notification). + + + + + Specifies the time at which a notification is created or applicable + (past, present, or future). + + + + + Gets the vibration pattern for devices with vibration hardware to emit. + + + The vibration pattern can be represented by an array of 64-bit + unsigned integers describing a pattern of vibrations and pauses. See + [Vibration API](https://developer.mozilla.org/docs/Web/API/Vibration_API) for + more information. This corresponds to + [Notification.vibrate](https://developer.mozilla.org/docs/Web/API/Notification/vibrate) + DOM API. An empty list is returned if no vibration patterns are + specified. + + + + + A string representing the body text of the notification. + + + The default value is an empty string. + + + + + The text direction in which to display the notification. + + + This corresponds to [Notification.dir](https://developer.mozilla.org/docs/Web/API/Notification/dir) DOM API. The default value is . + + + + + The notification's language, as intended to be specified using a string representing a language tag (such as en-US) according to [BCP47](https://datatracker.ietf.org/doc/html/rfc5646). + + + Note that no validation is performed on this property and it can be any string the notification sender specifies. This corresponds to [Notification.lang](https://developer.mozilla.org/docs/Web/API/Notification/lang) DOM API. The default value is an empty string. + + + + + A string representing an identifying tag for the notification. + + + This corresponds to [Notification.tag](https://developer.mozilla.org/docs/Web/API/Notification/tag) DOM API. The default value is an empty string. + + + + + A string containing the URI of an icon to be displayed in the notification. + + + The default value is an empty string. + + + + + The title of the notification. + + + + + A string containing the URI of the image used to represent the notification when there isn't enough space to display the notification itself. + + + The default value is an empty string. + + + + + A string containing the URI of an image to be displayed in the notification. + + + The default value is an empty string. + + + + + Indicates whether the user should be notified after a new notification replaces an old one. + + + This corresponds to [Notification.renotify](https://developer.mozilla.org/docs/Web/API/Notification/renotify) DOM API. The default value is false. + + + + + A boolean value indicating that a notification should remain active until the user clicks or dismisses it, rather than closing automatically. + + + This corresponds to [Notification.requireInteraction](https://developer.mozilla.org/docs/Web/API/Notification/requireInteraction) DOM API. Note that you may not be able to necessarily implement this due to native API limitations. The default value is false. + + + + + Indicates whether the notification should be silent -- i.e., no sounds or vibrations should be issued, regardless of the device settings. + + + This corresponds to [Notification.silent](https://developer.mozilla.org/docs/Web/API/Notification/silent) DOM API. The default value is false. + + + + + This event is raised when the notification is closed by the web code, such as through notification.close(). + + + You don't need to call since this is coming from the web code. + + + + + The host may run this to report the notification has been displayed and it will cause the [show](https://developer.mozilla.org/docs/Web/API/Notification/show_event) event to be raised for non-persistent notifications. + + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false when this is called. + + + + + The host may run this to report the notification has been clicked, and it will cause the [click](https://developer.mozilla.org/docs/Web/API/Notification/click_event) event to be raised for non-persistent notifications. + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false or has not been run when this is called. + + + + The host may run this to report the notification was dismissed, and it will cause the [close](https://developer.mozilla.org/docs/Web/API/Notification/close_event) event to be raised for non-persistent notifications. + + + You must not run this unless you are handling the . API throws COMException with error code of HRESULT_FROM_WIN32(ERROR_INVALID_STATE) if is false or has not been run when this is called. + + + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + Multiple profiles can be created under a single user data directory but with separated cookies, user preference settings, and various data storage etc.. If the CoreWebView2 was created with a , the CoreWebView2Profile will match those specified options. Otherwise if this CoreWebView2 was created without a , then this will be the default CoreWebView2Profile for the corresponding CoreWebView2Environment. + + + + + Clear the browsing data for the specified dataKinds between the + startTime and endTime. Overload the ClearBrowsingDataAsync method to + allow for additional time parameters. + + + + + Clear the entirety of the browsing data associated with the profile + it is called on. It clears the data regardless of timestamp. + + + + + The name of the profile. + + + + + InPrivate mode is enabled or not. + + + + + Full path of the profile directory. + + + + + The default download folder path. + + + The default value is the system default download folder path for the user. The default download folder path is persisted in the user data folder across sessions. The value should be an absolute path to a folder that the user and application can write to. Throws an exception if the value is invalid, and the default download path is not changed. Otherwise the path is changed immediately. If the directory does not yet exist, it is created at the time of the next download. If the host application does not have permission to create the directory, then the user is prompted to provide a new path through the Save As dialog. The user can override the default download folder path for a given download by choosing a different path in the Save As dialog. + + + + + The PreferredColorScheme property sets the overall color scheme of the WebView2s associated with this profile. + + + This sets the color scheme for WebView2 UI like dialogs, prompts, and menus by setting the media feature prefers-color-scheme. + The default value for this is , which will follow whatever color scheme the OS is currently set to. + + + + + Clear the browsing data of the associated profile. + + + Clears browsing data on the profile the method is called on. Additional optional parameters include the start time and end time to clear the browsing data between as well as the data specific data kinds to clear on the profile. The method may be overloaded to take: + + + No parameters - in which the entirety of the data on the profile will be cleared. + + + The data kind(s) - in which the data kind(s) will be cleared for their entirety. + + + The data kind(s), start time, and end time - in which the data kind(s) will be cleared between the start and end time. The start time will be offset by -1.0 and the end time will be offset by +1.0 to include the last fractional second on each respective end. The start time is inclusive in the time period while the end time is exclusive. + + + + The exposed methods are as follows: + + ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds dataKinds); + ClearBrowsingDataAsync(CoreWebView2BrowsingDataKinds dataKinds, DateTime startTime, DateTime endTime); + ClearBrowsingDataAsync(); + + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ClearBrowsingData"::: + + + + + The PreferredTrackingPreventionLevel property allows you to control levels of tracking prevention for WebView2 which are associated with a profile. This level would apply to the context of the profile. That is, all WebView2s sharing the same profile will be affected and also the value is persisted in the user data folder. + + + See for descriptions of levels. + + If tracking prevention feature is enabled when creating the WebView2 environment, you can also disable tracking prevention later using this property and value but that doesn't improves runtime performance. + + There is property to enable/disable tracking prevention feature for all the WebView2's created in the same environment. If enabled, PreferredTrackingPreventionLevel is set to by default for all the WebView2's and profiles created in the same environment or is set to the level whatever value was last changed/persisted to the profile. If disabled PreferredTrackingPreventionLevel is not respected by WebView2. If PreferredTrackingPreventionLevel is set when the feature is disabled, the property value get changed and persisted but it will takes effect only if is true. + + See for more details. + + + + + Sets permission state for the given permission kind and origin asynchronously. + + + The state change persists across sessions until it is changed by another call to SetPermissionState, or by setting the State property in PermissionRequestedEventArgs. Setting the state to will erase any state saved in the profile and restore the default behavior. The origin should have a valid scheme and host (e.g. "https://www.example.com"), otherwise the method fails. Additional URI parts like path and fragment are ignored. For example, "https://wwww.example.com/app1/index.html/" is treated the same as "https://wwww.example.com". See the [MDN origin definition](https://developer.mozilla.org/docs/Glossary/Origin) for more details. + + + + + Invokes the handler with a collection of all nondefault permission settings. + + + Use this method to get the permission state set in the current and previous sessions. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GetNonDefaultPermissionSettings"::: + + + + + Get the which Creates, adds or updates, gets, or or view the cookies for the current profile. + + + All CoreWebView2s associated with this profile share the same cookie values. Changes to cookies in this cookie manager apply to all CoreWebView2s associated with this profile. + + + + + + Determines whether password information will be autosaved. + + + When disabled, no new password data is saved and no Save/Update Password prompts are displayed. However, if there was password data already saved before disabling this setting, then that password information is auto-populated, suggestions are shown and clicking on one will populate the fields. + When enabled, password information is auto-populated, suggestions are shown and clicking on one will populate the fields, new data is saved, and a Save/Update Password prompt is displayed. The default value is false. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + + + Determines whether general form information will be saved and autofilled. + + + General autofill information includes information like names, street and email addresses, phone numbers, and arbitrary input. This excludes password information. When disabled, no suggestions appear, and no new information is saved. + When enabled, information is saved, suggestions appear, and clicking on one will populate the form fields. The default value is true. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + + + Add a browser extension to the current user profile from extensionFolderPath. + + The manifest.json folder path. + + See for descriptions of browser extensions. + + Adds the [browser extension](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions) using the extension path for unpacked extensions from the local device. Extension is running right after installation. + The extension folder path is the topmost folder of an unpacked browser extension and contains the browser extension manifest file. + If the extensionFolderPath is an invalid path or doesn't contain the extension manifest.json file, this function will return ERROR_FILE_NOT_FOUND to callers. + Installed extension will default to true. When is false, AddBrowserExtension will fail and return HRESULT ERROR_NOT_SUPPORTED. + During installation, the content of the extension is not copied to the user data folder. Once the extension is installed, changing the content of the extension will cause the extension to be removed from the installed profile. + When an extension is added the extension is persisted in the corresponding profile. The extension will still be installed the next time you use this profile. + When an extension is installed from a folder path, adding the same extension from the same folder path means reinstalleing this extension. When two extensions with the same Id are installed, only the later installed extension will be kept. + The following summarizes the possible error values that can be returned from AddBrowserExtension and a description of why these errors occur. + + + + Error value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + Extensions are disabled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Cannot find manifest.json file or it is not a valid extension manifest. + + + E_ACCESSDENIED + Cannot load extension with file or directory name starting with _, reserved for use by the system. + + + E_FAIL + Extension failed to install with other unknown reasons. + + + + + + + + Gets a snapshot of the set of extensions on current user profile. + + + See for descriptions of browser extensions. + + Gets a snapshot of the set of extensions installed at the time GetBrowserExtensions is called. If an extension is installed or uninstalled after GetBrowserExtensions completes, the list returned by GetBrowserExtensions remains the same. When AreBrowserExtensionsEnabled is false, GetBrowserExtensions won't return any extensions on current user profile. + + + + + Raised when profile is marked for deletion. + + + When this event is raised, the CoreWebView2Profile and its corresponding CoreWebView2s have been closed, and cannot be used anymore. + + + + + Delete this profile and close the corresponding s. + + + After the API is called, the profile will be marked for deletion. The local profile's directory will be deleted at browser process exit. If it fails to delete, because something else is holding the files open, WebView2 will try to delete the profile at all future browser process starts until successful. The corresponding CoreWebView2s will be closed and the event will be raised. See for more information. If you try to create a new profile with the same name as an existing profile that has been marked as deleted but hasn't yet been deleted, profile creation will fail with HRESULT_FROM_WIN32(ERROR_DELETE_PENDING). + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the URI of the document that sent this web message. + + + + + Gets the message posted from the WebView content to the host converted to a JSON string. + + + Run this operation to communicate using JavaScript objects. + + + For example, the following postMessage runs result in the following WebMessageAsJson values: + + + postMessage({'a': 'b'}) "{\"a\": \"b\"}" + postMessage(1.2) "1.2" + postMessage('example') "\"example\"" + + + + + + Gets the message posted from the WebView content to the host as a string. + + The message posted from the WebView content to the host. + The message posted is some other kind of JavaScript type. + + Run this operation to communicate using simple strings. + + + For example the following postMessage runs result in the following values returned by TryWebMessageAsString: + + + postMessage({'a': 'b'}) ArgumentException + postMessage(1.2) ArgumentException + postMessage('example') "example" + + + + + + Additional received WebMessage objects. + + + To pass AdditionalObjects via WebMessage to the app, use the chrome.webview.postMessageWithAdditionalObjects content API. Any DOM object type that can be natively representable that has been passed in to additionalObjects parameter will be accessible here. Currently a WebMessage object can be the type. + Entries in the collection can be nullptr if null or undefined was passed. Cast the object to the native type to access its specific properties. + + object additionalObject = eventArgs.AdditionalObjects[0]; + if (additionalObject is CoreWebView2File) + { + CoreWebView2File file = additionalObject as CoreWebView2File; + } else if ... + + + + + + This is used to complete deferrals on event args that support getting deferrals using the GetDeferral method. This class implements . + + + + + + + + + Protected implementation of Dispose pattern. + + + + + Completes the associated deferred event. + + + Complete should only be run once for each deferral taken. + + + + + This class is deprecated; use CoreWebView2PrivateHostObjectHelper instead. + + + + + A shared memory based buffer object that is created by . The object is presented to script as ArrayBuffer when posted to script with . + + + + + + + + Protected implementation of Dispose pattern. + + + + + The file mapping handle of the shared memory of the buffer. + + + Normal app should use to + get a stream object to access the buffer. + For advanced scenarios, you could use native file mapping APIs to obtain + other views or duplicate this handle to another application process and + create a view from the duplicated handle in that process to access the buffer + from that separate process. + + + + + The size of the shared buffer in bytes. + + + + + The raw memory address of the buffer. + + + You can cast it to pointer to real data types like byte* to access the memory from unsafe code region. + Normal app should use to get a stream object to access the buffer. + + + + + Get an stream object that can be used to access the shared buffer. + + + + + Release the backing shared memory. + + + The application should call Close or when no access to the buffer is needed any more, to ensure that the underlying resources are released timely even if the shared buffer object itself is not released due to some leaked reference. + After the shared buffer is closed, the buffer address and file mapping handle previously obtained becomes invalid and cannot be used anymore. + Properties of the object will also be unaccessible. Operations like Read or Write on the stream objects returned from will also fail. + will also fail. The failures will be represented as with error code of RO_E_CLOSED. + + The script code should call chrome.webview.releaseBuffer with the shared buffer as the parameter to release underlying resources as soon as it does not need access the shared buffer any more. + When script tries to access the buffer after calling chrome.webview.releaseBuffer, JavaScript TypeError exception will be raised complaining about accessing a detached ArrayBuffer, the same exception when trying to access a transferred ArrayBuffer. + + Closing the buffer object on native side doesn't impact access from Script and releasing the buffer from script doesn't impact access to the buffer from native side. The underlying shared memory will be released by the OS when both native and script side release the buffer. + + + + + Constructor + + + + + Read at most bufferSize bytes into buffer and return the effective + number of bytes read in bytesReadPtr (unless null). + + + mscorlib disassembly shows the following MarshalAs parameters + void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] byte[] pv, int cb, IntPtr pcbRead); + This means marshaling code will have found the size of the array buffer in the parameter bufferSize. + + + Critical: calls Marshal.WriteInt32 which LinkDemands, takes pointers as input + + + + + Move the stream pointer to the specified position. + + + System.IO.stream supports searching past the end of the stream, like + OLE streams. + newPositionPtr is not an out parameter because the method is required + to accept NULL pointers. + + + Critical: calls Marshal.WriteInt64 which LinkDemands, takes pointers as input + + + + + Sets stream's size. + + + + + Obtain stream stats. + + + STATSG has to be qualified because it is defined both in System.Runtime.InteropServices and + System.Runtime.InteropServices.ComTypes. + The STATSTG structure is shared by streams, storages and byte arrays. Members irrelevant to streams + or not available from System.IO.Stream are not returned, which leaves only cbSize and grfMode as + meaningful and available pieces of information. + grfStatFlag is used to indicate whether the stream name should be returned and is ignored because + this information is unavailable. + + + + + Write at most bufferSize bytes from buffer. + + + Critical: calls Marshal.WriteInt32 which LinkDemands, takes pointers as input + + + + + Create a clone. + + + Not implemented. + + + + + Read at most bufferSize bytes from the receiver and write them to targetStream. + + + Not implemented. + + + + + Commit changes. + + + Only relevant to transacted streams. + + + + + Lock at most byteCount bytes starting at offset. + + + Not supported by System.IO.Stream. + + + + + Undo writes performed since last Commit. + + + Relevant only to transacted streams. + + + + + Unlock the specified region. + + + Not supported by System.IO.Stream. + + + + + The exception that is thrown when an WebView2 Runtime installation is missing. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a specified error message. + + + The error message that explains the reason for the exception. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a reference to the inner exception that is the cause of this exception. + + + The exception that is the cause of the current exception. + + + + + Initializes a new instance of the WebView2RuntimeNotFoundException class with a specified error message and a reference to the inner exception that is the cause of this exception. + + + The error message that explains the reason for the exception. + + + The exception that is the cause of the current exception. + + + + + + + + + + + + + + + + + Specifies the source of . + + + + + + + + Indicates that web resource is requested from main page including dedicated workers, iframes and main script for shared workers. + + + + + Indicates that web resource is requested from shared worker. + + + + + Indicates that web resource is requested from service worker. + + + + + Indicates that web resource is requested from any supported source. + + + + + Specifies the web resource request contexts. + + + + + Specifies all resources. + + + + + Specifies a document resources. + + + + + Specifies a CSS resources. + + + + + Specifies an image resources. + + + + + Specifies another media resource such as a video. + + + + + Specifies a font resource. + + + + + Specifies a script resource. + + + + + Specifies an XML HTTP request, Fetch and EventSource HTTP communication. + + + + + Specifies a Fetch API communication. + + + Note that this isn't working. Fetch API requests are fired as a part + of COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST. + + + + Specifies a TextTrack resource. + + + + + Specifies an EventSource API communication. + + + Note that this isn't working. EventSource API requests are fired as a part + of COREWEBVIEW2_WEB_RESOURCE_CONTEXT_XML_HTTP_REQUEST. + + + + Specifies a WebSocket API communication. + + + + + Specifies a Web App Manifest. + + + + + Specifies a Signed HTTP Exchange. + + + + + Specifies a Ping request. + + + + + Specifies a CSP Violation Report. + + + + + Specifies an other resource. + + + + + Indicates the error status values for web navigations. + + + + + Indicates that an unknown error occurred. + + + + + Indicates that the SSL certificate common name does not match the web address. + + + + + Indicates that the SSL certificate has expired. + + + + + Indicates that the SSL client certificate contains errors. + + + + + Indicates that the SSL certificate has been revoked. + + + + + Indicates that the SSL certificate is not valid. The certificate may not match the public key pins for the host name, the certificate is signed by an untrusted authority or using a weak sign algorithm, the certificate claimed DNS names violate name constraints, the certificate contains a weak key, the validity period of the certificate is too long, lack of revocation information or revocation mechanism, non-unique host name, lack of certificate transparency information, or the certificate is chained to a [legacy Symantec root](https://security.googleblog.com/2018/03/distrust-of-symantec-pki-immediate.html). + + + + + Indicates that the host is unreachable. + + + + + Indicates that the connection has timed out. + + + + + Indicates that the server returned an invalid or unrecognized response. + + + + + Indicates that the connection was stopped. + + + + + Indicates that the connection was reset. + + + + + Indicates that the Internet connection has been lost. + + + + + Indicates that a connection to the destination was not established. + + + + + Indicates that the provided host name was not able to be resolved. + + + + + Indicates that the operation was canceled. This status code is also used when the app cancels a navigation via event, and for original navigation if the app navigates the WebView2 in a rapid succession away after the load for original navigation commenced, but before it completed. + + + + + Indicates that the request redirect failed. + + + + + An unexpected error occurred. + + + + + Indicates that user is prompted with a login, waiting on user action. Initial navigation to a login site will always return this even if app provides credential using . HTTP response status code in this case is 401. See [status code reference](https://developer.mozilla.org/docs/Web/HTTP/Status). + + + + + Indicates that user lacks proper authentication credentials for a proxy server. HTTP response status code in this case is 407. See [status code reference](https://developer.mozilla.org/docs/Web/HTTP/Status). + + + + + Tracking prevention levels. + + + + + Tracking prevention is turned off. + + + + + The least restrictive level of tracking prevention. Set to this level to protect against malicious trackers but allows most other trackers and personalize content and ads. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + The default level of tracking prevention. Set to this level to protect against social media tracking on top of malicious trackers. Content and ads will likely be less personalized. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + The most restrictive level of tracking prevention. Set to this level to protect against malicious trackers and most trackers across sites. Content and ads will likely have minimal personalization. This level blocks the most trackers but could cause some websites to not behave as expected. See [Current tracking prevention behavior](/microsoft-edge/web-platform/tracking-prevention#current-tracking-prevention-behavior) for fine-grained information on what is being blocked with this level and can change with different Edge versions. + + + + + Indicates the text direction of the notification. + + + + + Indicates that the notification text direction adopts the browser's language setting behavior. + + + + + Indicates that the notification text is left-to-right. + + + + + Indicates that the notification text is right-to-left. + + + + + Specifies the desired access from script to . + + + + + Script from web page only has read access to the shared buffer. + + + + + Script from web page has read and write access to the shared buffer. + + + + + Specifies the action type when server certificate error is detected to be used in the . + + + + + Indicates to ignore the warning and continue the request with the TLS certificate. This decision is cached for the RequestUri's host and the server certificate in the session. + + + + + Indicates to reject the certificate and cancel the request. + + + + + Indicates to display the default TLS interstitial error page to user for page navigations. For others TLS certificate is rejected and the request is cancelled. + + + + + The ScrollBar style being set during environment creation. + + + + + Browser default ScrollBar style + + + + + Window style fluent overlay scroll bar. Please see [Fluent UI](https://developer.microsoft.com/fluentui#/) for more details on fluent UI. + + + + + Specifies the JavaScript dialog kind used in . + + + + + Indicates that the dialog uses window.alert JavaScript function. + + + + + Indicates that the dialog uses window.confirm JavaScript function. + + + + + Indicates that the dialog uses window.prompt JavaScript function. + + + + + Indicates that the dialog uses window.beforeunload JavaScript event. + + + + + + Status of a programmatic Save As call. Indicates the result of the method. + + + + + The `ShowSaveAsUIAsync` method call completed successfully. By default, the system Save As dialog opens. If is set to `TRUE`, the system dialog is skipped and the download is started. + + + + + Could not perform Save As because the destination file path is an invalid path. The path is invalid when it is empty, a relative path, or a directory, or when the parent path does not exist. + + + + + Could not perform Save As because the destination file path already exists and replacing files was not allowed by the property. + + + + + Could not perform Save As because the `Kind` property selection is not supported due to content MIME type or system limits. See for MIME type limits. System limits include when the `HtmlOnly` kind is selected for an error page at child mode, or when the `Complete` kind is selected and the WebView is running in an App Container. + + + + + Did not perform Save As because the end user cancelled or the was set to `TRUE`. + + + + + Specifies selection options. + + + For HTML documents, we support 3 Save As kinds: HtmlOnly, SingleFile and Complete. For non-HTML documents, you must use Default. MIME types of `text/html` and `application/xhtml+xml` are considered HTML documents. + + + + + Default kind to save non-HTML content. If this kind is selected for an HTML page, the behavior is the same as the `HtmlOnly` kind. + + + + + Save the page as HTML. Only the top-level document is saved, excluding subresources. + + + + + Save the page as [MHTML](https://en.wikipedia.org/wiki/MHTML). + + + + + Save the page as HTML and download the page-related source files (for example: CSS, JavaScript, images, etc.) in a directory with the same filename prefix. + + + + + + Specifies the WebView2 release channel. + + + Use ReleaseChannels and ChannelSearchKind on CoreWebView2EnvironmentOptions to control which channel the WebView2 loader searches for. + + + + Channel + Primary purpose + How often updated with new features + + + Stable (WebView2 Runtime) + Broad Deployment + Monthly + + + Beta + Flighting with inner rings, automated testing + Monthly + + + Dev + Automated testing, selfhosting to test new APIs and features + Weekly + + + Canary + Automated testing, selfhosting to test new APIs and features + Daily + + + + + + + No release channel. ReleaseChannels will be ignored if only this value is passed. + + + + + The stable WebView2 Runtime that is released every 4 weeks. + + + + + The Beta release channel that is released every 4 weeks, a week before the stable release. + + + + + The Dev release channel that is released weekly. + + + + + The Canary release channel that is released daily. + + + + + Specifies the process kind used in . + + + The values in this enum make reference to the process kinds in the Chromium architecture. For more information about what these processes are and what they do, see [Browser Architecture - Inside look at modern web browser](https://developers.google.com/web/updates/2018/09/inside-browser-part1). + + + + + Indicates that the process is browser process. + + + + + Indicates that the process is render process. + + + + + Indicates that the process is utility process. + + + + + Indicates that the process is sandbox helper process. + + + + + Indicates that the process is Gpu process. + + + + + Indicates that the process is ppapi plugin process. + + + + + Indicates that the process is ppapi broker process. + + + + + Specifies the process failure reason used in . For process failures where a process has exited, it indicates the type of issue that produced the process exit. + + + + + Indicates that an unexpected process failure occurred. + + + + + Indicates that the process became unresponsive. This only applies to the main frame's render process. + + + + + Indicates that the process was terminated. For example, from Task Manager. + + + + + Indicates that the process crashed. Most crashes will generate dumps in the location indicated by . + + + + + Indicates that the process failed to launch. + + + + + Indicates that the process died due to running out of memory. + + + + + Deprecated. This value is unused. + + + + + Specifies the process failure kind used in . The values in this enum make reference to the process kinds in the Chromium architecture. For more information about what these processes are and what they do, see [Browser Architecture - Inside look at modern web browser](https://developers.google.com/web/updates/2018/09/inside-browser-part1). + + + + + Indicates that the browser process ended unexpectedly. The WebView automatically moves to the Closed state. The app has to recreate a new WebView to recover from this failure. + + + + + Indicates that the main frame's render process ended unexpectedly. Any subframes in the WebView will be gone too. A new render process is created automatically and navigated to an error page. You can use the method to try to recover from this failure. Alternatively, you can use and recreate the WebView. + + + + + Indicates that the main frame's render process is unresponsive. + + Renderer process unresponsiveness can happen for the following reasons: + + + + + There is a long-running script being executed. For example, the web content in your WebView might be performing a synchronous XHR, or have entered an infinite loop. + + + + + The system is busy. + + + + + The ProcessFailed event will continue to be raised every few seconds until the renderer procees has become responsive again. The application can consider taking action if the event keeps being raised. For example, the application might show UI for the user to decide to keep waiting or reload the page, or navigate away. + + + + Indicates that a frame-only render process ended unexpectedly. The process exit does not affect the top-level document, only a subset of the subframes within it. The content in these frames is replaced with an error page in the frame. Your application can communicate with the main frame to recover content in the impacted frames, using to get information about the impacted frames. + + + + + Indicates that a utility process ended unexpectedly. The failed process is recreated automatically. Your application does not need to handle recovery for this event, but can use to collect information about the failure, including ProcessDescription. + + + + + Indicates that a sandbox helper process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that the GPU process ended unexpectedly. The failed process is recreated automatically. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that a PPAPI plugin process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure, including ProcessDescription. + + + + + Indicates that a PPAPI plugin broker process ended unexpectedly. This failure is not fatal. Your application does not need to handle recovery for this event, but can use to collect information about the failure. + + + + + Indicates that a process of unspecified kind ended unexpectedly. Your application can use to collect information about the failure. + + + + + Indicates the status for printing. + + + + + Indicates that the print operation is succeeded. + + + + + Indicates that the printer is not available. + + + + + Indicates that the print operation is failed. + + + + + The orientation for printing, used by the property. + + + + + Print the page(s) in portrait orientation. + + + + + Print the page(s) in landscape orientation. + + + + + Specifies the media size for a print. + + + + + The default media size for a printer. + + + + + Indicate custom media size that is specific to the printer. + + + + + Specifies the duplex option for a print. + + + + + The default duplex for a printer. + + + + + Print on only one side of the sheet. + + + + + Print on both sides of the sheet, flipped along the long edge. + + + + + Print on both sides of the sheet, flipped along the short edge. + + + + + Specifies the print dialog kind. + + + + + Opens the browser print preview dialog. + + + + + Opens the system print dialog. + + + + + Specifies the color mode for a print. + + + + + The default color mode for a printer. + + + + + Indicate that the printed output will be in color. + + + + + Indicate that the printed output will be in shades of gray. + + + + + Specifies the collation for a print. + + + + + The default collation for a printer. + + + + + Indicate that the collation has been selected for the printed output. + + + + + Indicate that the collation has not been selected for the printed output. + + + + + Preferred color scheme for WebView2's associated with a profile. + + + + + Auto color scheme. + + + + + Light color scheme. + + + + + Dark color scheme. + + + + + Pointer event kind used by to convey the kind of pointer event being sent to WebView. + + + + + Corresponds to WM_POINTERACTIVATE. + + + + + Corresponds to WM_POINTERDOWN. + + + + + Corresponds to WM_POINTERENTER. + + + + + Corresponds to WM_POINTERLEAVE. + + + + + Corresponds to WM_POINTERUP. + + + + + Corresponds to WM_POINTERUPDATE. + + + + + Specifies the response to a permission request. + + + + + Specifies that the default browser behavior is used, which normally prompts users for decision. + + + + + Specifies that the permission request is granted. + + + + + Specifies that the permission request is denied. + + + + + Indicates the kind of a permission request. + + + + + Indicates an unknown permission. + + + + + Indicates permission to capture audio. + + + + + Indicates permission to capture video. + + + + + Indicates permission to access geolocation. + + + + + Indicates permission to send web notifications. Apps that would like to show notifications should handle and/or events and no browser permission prompt will be shown for notification requests. Note that push notifications are currently unavailable in WebView2. + + + + + Indicates permission to access generic sensor. Generic Sensor covers ambient-light-sensor, accelerometer, gyroscope, and magnetometer. + + + + + Indicates permission to read the system clipboard without a user gesture. + + + + + Indicates permission to automatically download multiple files. Permission is requested when multiple downloads are triggered in quick succession. + + + + + Indicates permission to read and write to files or folders on the device. Permission is requested when developers use the [File System Access API](https://developer.mozilla.org/docs/Web/API/File_System_Access_API) to show the file or folder picker to the end user, and then request "readwrite" permission for the user's selection. + + + + + Indicates permission to play audio and video automatically on sites. This permission affects the autoplay attribute and play method of the audio and video HTML elements, and the start method of the Web Audio API. See the [Autoplay guide for media and Web Audio APIs](https://developer.mozilla.org/docs/Web/Media/Autoplay_guide) for details. + + + + + Indicates permission to use fonts on the device. Permission is requested when developers use the [Local Font Access API](https://wicg.github.io/local-font-access/) to query the system fonts available for styling web content. + + + + + Indicates permission to send and receive system exclusive messages to/from MIDI (Musical Instrument Digital Interface) devices. Permission is requested when developers use the [Web MIDI API](https://developer.mozilla.org/docs/Web/API/Web_MIDI_API) to request access to system exclusive MIDI messages. + + + + + Indicates permission to open and place windows on the screen. Permission is requested when developers use the [Multi-Screen Window Placement API](https://www.w3.org/TR/window-placement/) to get screen details. + + + + + Specifies the PDF toolbar item types used for the . + + + + + No item. By default the equal to this value. + + + + + The save button on PDF toolbar. + + + + + The print button on PDF toolbar. + + + + + The save as button on PDF toolbar. + + + + + The zoom in button on PDF toolbar. + + + + + The zoom out button on PDF toolbar. + + + + + The rotate button on PDF toolbar. + + + + + The fit to width button on PDF toolbar. + + + + + The page view button on PDF toolbar. + + + + + The contents button on PDF toolbar. + + + + + The page number button on PDF toolbar. + + + + + The search button on PDF toolbar. + + + + + The full screen button on PDF toolbar. + + + + + The setting and more button on PDF toolbar. + + + + + Enum which represents the kind of non-client regions. + + + + + Enum value which represents a region entirely outside the WebView2 window. + + + + + Enum value which represents the client area. + + + + + Enum value which represents the caption area. + + + + + Enum value which represents the minimize window control button. + + + + + Enum value which represents the maximize window control button. + + + + + Enum value which represents the close window control button. + + + + + Specifies the navigation kind of each navigation. + + + + + A navigation caused by CoreWebView2.Reload(), location.reload(), the end user using F5 or other UX, or other reload mechanisms to reload the current document without modifying the navigation history. + + + + + A navigation back or forward to a different entry in the session navigation history, like via CoreWebView2.Back(), location.back(), the end user pressing Alt+Left or other UX, or other mechanisms to navigate back or forward in the current session navigation history. + + + + + A navigation to another document, which can be caused by CoreWebView2.Navigate(),window.location.href = ..., or other WebView2 or DOM APIs that navigate to a new URI. + + + + + Specifies the reason for moving focus. + + + + + Specifies that the code is setting focus into WebView. + + + + + Specifies that the focus is moved due to Tab traversal forward. + + + + + Specifies that the focus is moved due to Tab traversal backward. + + + + + Mouse event virtual keys associated with a for . + + + + + No additional keys pressed. + + + + + Left mouse button is down, MK_LBUTTON. + + + + + Right mouse button is down, MK_RBUTTON. + + + + + Shift key is down, MK_SHIFT. + + + + + Ctrl key is down, MK_CONTROL. + + + + + Middle mouse button is down, MK_MBUTTON. + + + + + First X button is down, MK_XBUTTON1. + + + + + Second X button is down, MK_XBUTTON2. + + + + + Mouse event kind used by to convey the kind of mouse event being sent to WebView. + + + + + Mouse horizontal wheel scroll event, WM_MOUSEHWHEEL. + + + + + Left button double click mouse event, WM_LBUTTONDBLCLK. + + + + + Left button down mouse event, WM_LBUTTONDOWN. + + + + + Left button up mouse event, WM_LBUTTONUP. + + + + + Mouse leave event, WM_MOUSELEAVE. + + + + + Middle button double click mouse event, WM_MBUTTONDBLCLK. + + + + + Middle button down mouse event, WM_MBUTTONDOWN. + + + + + Middle button up mouse event, WM_MBUTTONUP. + + + + + Mouse move event, WM_MOUSEMOVE. + + + + + Right button double click mouse event, WM_RBUTTONDBLCLK. + + + + + Right button down mouse event, WM_RBUTTONDOWN. + + + + + Right button up mouse event, WM_RBUTTONUP. + + + + + Mouse wheel scroll event, WM_MOUSEWHEEL. + + + + + First or second X button double click mouse event, WM_XBUTTONDBLCLK. + + + + + First or second X button down mouse event, WM_XBUTTONDOWN. + + + + + First or second X button up mouse event, WM_XBUTTONUP. + + + + + R button down over non client area, WM_NCRBUTTONDOWN. + + + + + R button up over non client area, WM_NCRBUTTONUP. + + + + + Desired memory consumption level of a WebView. + + + + + Normal memory usage target level. + + + + + Low memory usage target level. Used for inactivate WebView for reduced memory consumption. + + + + + Specifies the key event kind that raises an event. + + + + + Specifies that the key event kind corresponds to window message WM_KEYDOWN. + + + + + Specifies that the key event kind corresponds to window message WM_KEYUP. + + + + + Specifies that the key event kind corresponds to window message WM_SYSKEYDOWN. + + + + + Specifies that the key event kind corresponds to window message WM_SYSKEYUP. + + + + + Kind of cross origin resource access allowed for host resources during download. + + + Note that other normal access checks like same origin DOM access check and [Content Security Policy](https://developer.mozilla.org/docs/Web/HTTP/CSP) still apply. + The following table illustrates the host resource cross origin access according to access context and CoreWebView2HostResourceAccessKind. + + + + Cross Origin Access Context + Deny + Allow + DenyCors + + + From DOM like src of img, script or iframe element + Deny + Allow + Allow + + + From Script like Fetch or XMLHttpRequest + Deny + Allow + Deny + + + + + + + All cross origin resource access is denied, including normal sub resource access as src of a script or image element. + + + + + All cross origin resource access is allowed, including accesses that are subject to Cross-Origin Resource Sharing(CORS) check. The behavior is similar to a web site sends back http header Access-Control-Allow-Origin: *. + + + + + Cross origin resource access is allowed for normal sub resource access like as src of a script or image element, while any access that subjects to CORS check will be denied. See [Cross-Origin Resource Sharing](https://developer.mozilla.org/docs/Web/HTTP/CORS) for more information. + + + + + Specifies the frame kind used in . + + + + + Indicates that the frame is an unknown type frame. We may extend this enum type to identify more frame kinds in the future. For example, if portal frame which current in experimental phase gets finalized, we may extend this to include a new frame kind `COREWEBVIEW2_FRAME_KIND_PORTAL`. + + + + + Indicates that the frame is a primary main frame(). + + + + + Indicates that the frame is an iframe. + + + + + Indicates that the frame is an [embed](https://developer.mozilla.org/docs/Web/HTML/Element/embed) element. + + + + + Indicates that the frame is an [object](https://developer.mozilla.org/docs/Web/HTML/Element/object) element. + + + + + Allowed permissions of as described in [FileSystemHandle.requestPermission()](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/requestPermission) + + + + + Read-only permission for FileSystemHandle + + + + + Read and write permissions for FileSystemHandle + + + + + Kind of CoreWebView2FileSystemHandle as described in [FileSystemHandle.kind](https://developer.mozilla.org/docs/Web/API/FileSystemHandle/kind) + + + + + FileSystemHandle is for a file (i.e. [FileSystemFileHandle](https://developer.mozilla.org/docs/Web/API/FileSystemFileHandle)) + + + + + FileSystemHandle is for a directory (i.e. [FileSystemDirectoryHandle](https://developer.mozilla.org/docs/Web/API/FileSystemDirectoryHandle)) + + + + + The requested format to get the Favicon from . + + + + + Request the Favicon to be retrieved a Png Format. + + + + + Request the Favicon to be retrieved a Jpeg Format. + + + + + The state of the . + + + + + The download is in progress. + + + + + The connection with the file host was broken. The reason why a download was interrupted can accessed from . See for descriptions of the different kinds of interrupt reasons. Host can check whether an interrupted download can be resumed with . Once resumed, the download state is in progress. + + + + + The download completed successfully. + + + + + The reason why the was interrupted. + + + + + No interrupt reason. + + + + + Generic file error. + + + + + Access denied due to security restrictions. + + + + + Disk full. User should free some space or choose a different location to store the file. + + + + + Result file path with file name is too long. + + + + + File is too large for file system. + + + + + Microsoft Defender Smartscreen detected a virus in the file. + + + + + File was in use, too many files opened, or out of memory. + + + + + File blocked by local policy. + + + + + Security check failed unexpectedly. Microsoft Defender SmartScreen could not scan this file. + + + + + Seeking past the end of a file in opening a file, as part of resuming an interrupted download. The file did not exist or was not as large as expected. Partially downloaded file was truncated or deleted, and download will be restarted automatically. + + + + + Partial file did not match the expected hash and was deleted. Download will be restarted automatically. + + + + + Generic network error. User can retry the download manually. + + + + + Network operation timed out. + + + + + Network connection lost. User can retry the download manually. + + + + + Server has gone down. User can retry the download manually. + + + + + Network request invalid because original or redirected URI is invalid, has an unsupported scheme, or is disallowed by network policy. + + + + + Generic server error. User can retry the download manually. + + + + + Server does not support range requests. + + + + + Server does not have the requested data. + + + + + Server did not authorize access to resource. + + + + + Server certificate problem. + + + + + Server access forbidden. + + + + + Unexpected server response. Responding server may not be intended server. User can retry the download manually. + + + + + Server sent fewer bytes than the Content-Length header. Content-Length header may be invalid or connection may have closed. Download is treated as complete unless there are [strong validators](https://tools.ietf.org/html/rfc7232#section-2) present to interrupt the download. + + + + + Unexpected cross-origin redirect. + + + + + User canceled the download. + + + + + User shut down the WebView. Resuming downloads that were interrupted during shutdown is not yet supported. + + + + + User paused the download. + + + + + WebView crashed. + + + + + The default download dialog can be aligned to any of the WebView corners by setting the property. The default position is top-right corner. + + + + + The top-left corner of the WebView. + + + + + The top-right corner of the WebView. + + + + + The bottom-left corner of the WebView. + + + + + The bottom-right corner of the WebView. + + + + + Kind of cookie SameSite status used in the class. + + + These fields match those as specified in https://developer.mozilla.org/docs/Web/HTTP/Cookies#. + Learn more about SameSite cookies here: https://tools.ietf.org/html/draft-west-first-party-cookies-07 + + + + + None SameSite type. No restrictions on cross-site requests. + + + + + Lax SameSite type. The cookie will be sent with "same-site" requests, and with "cross-site" top level navigation. + + + + + Strict SameSite type. The cookie will only be sent along with "same-site" requests. + + + + + Indicates the kind of context for which the context menu was created for the property. This enum will always represent the active element that caused the context menu request. If there is a selection with multiple images, audio and text, for example, the element that the end user right clicks on within this selection will be the option represented by this enum. + + + + + Indicates that the context menu was created for the page without any additional content. + + + + + Indicates that the context menu was created for an image element. + + + + + Indicates that the context menu was created for selected text. + + + + + Indicates that the context menu was created for an audio element. + + + + + Indicates that the context menu was created for a video element. + + + + + Specifies the menu item kind for the property. + + + + + Specifies a command menu item kind. + + + + + Specifies a check box menu item kind. objects of this kind will need the property to determine current state of the check box. + + + + + Specifies a radio button menu item kind. objects of this kind will need the property to determine current state of the radio button. + + + + + Specifies a separator menu item kind. objects of this kind are used to signal a visual separator with no functionality. + + + + + Specifies a submenu menu item kind. objects of this kind will contain a collection of its children objects. + + + + + The kind of the . + + + + + Specifies smart card certificate. + + + + + Specifies PIN certificate. + + + + + Specifies other certificate. + + + + + The order that release channels are searched for during environment creation. + + + The default behavior is to search for and use the most stable channel found on the device. The order from most to least stable is: WebView2 Runtime -> Beta -> Dev -> Canary. Switch the order to prefer the least stable channel in order to perform pre-release testing. See for descriptions of channels. + + + + + Search for a release channel from most to least stable: WebView2 Runtime -> Beta -> Dev -> Canary. This is the default behavior. + + + + + Search for a release channel from least to most stable: Canary -> Dev -> Beta -> WebView2 Runtime. + + + + + Specifies the image format for the method. + + + + + Indicates that the PNG image format is used. + + + + + Indicates that the JPEG image format is used. + + + + + Indicates the kind of browsing data to clear. Or operations can be applied to create a mask representing multiple CoreWebView2BrowsingDataKinds. The resulting mask may be passed to or to clear the corresponding data. + + + + + Specifies file systems data. + + + + + Specifies data stored by the IndexedDB DOM feature. + + + + + Specifies data stored by the localStorage DOM API. + + + + + Specifies data stored by the Web SQL database DOM API. + + + + + Specifies data stored by the CacheStorage DOM API. + + + + + Specifies DOM storage data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.FileSystems, CoreWebView2BrowsingDataKinds.IndexedDb, CoreWebView2BrowsingDataKinds.WebSql, CoreWebView2BrowsingDataKinds.ServiceWorkers, CoreWebView2BrowsingDataKinds.CacheStorage, and some other data kinds not listed yet to keep consistent with [DOM-accessible storage](https://www.w3.org/TR/clear-site-data/#storage). + + + + + Specifies HTTP cookies data. + + + + + Specifies all site data, now and future. This browsing data kind is inclusive of CoreWebView2BrowsingDataKinds.AllDomStorage and CoreWebView2BrowsingDataKinds.Cookies. New site data types may be added to this data kind in the future. + + + + + Specifies disk cache. + + + + + Specifies download history data. + + + + + Specifies general autofill form data. This excludes password information and includes information like: names, street and email addresses, phone numbers, and arbitrary input. This also includes payment data. + + + + + Specifies password autosave data. + + + + + Specifies browsing history data. + + + + + Specifies settings data. + + + + + Specifies profile data that should be wiped to make it look like a new profile. This does not delete account-scoped data like passwords but will remove access to account-scoped data by signing the user out. Specifies all profile data, now and future. New profile data types may be added to this data kind in the future. This browsing data kind is inclusive of , , , , , , . + + + + + Specifies service workers registered for an origin, and clear will result in termination and deregistration of them. + + + + + Specifies the browser process exit kind used in . + + + + + Indicates that the browser process ended normally. + + + + + Indicates that the browser process ended unexpectedly. A event will also be raised to listening WebViews from the associated to the failed process. + + + + + Mode for how the property is interpreted in relation to the property. + + + + + property represents raw pixels. Physical size of WebView is not impacted by . + + + + + property represents logical pixels and the property is used to get the physical size of the WebView. + + + + + Contains the information packed into the LPARAM sent to a Win32 key event. + + + For more information about WM_KEYDOWN, navigate to [WM_KEYDOWN message](/windows/win32/inputdev/wm-keydown). + + + + + Specifies the repeat count for the current message. + + + + + Specifies the scan code. + + + + + Indicates that the key is an extended key. + + + + + Indicates that a menu key is held down (context code). + + + + + Indicates that the key was held down. + + + + + Indicates that the key was released. + + + + + A value representing RGBA color (Red, Green, Blue, Alpha) for WebView2. + + + Each component takes a value from 0 to 255, with 0 being no intensity and 255 being the highest intensity. + + + + + Specifies the intensity of the Alpha ie. opacity value. 0 is transparent, 255 is opaque. + + + + + Specifies the intensity of the Red color. + + + + + Specifies the intensity of the Green color. + + + + + Specifies the intensity of the Blue color. + + + + + The window features for a WebView popup window. + + + The fields match the windowFeatures passed to window.open() as specified in [Window features](https://developer.mozilla.org/docs/Web/API/Window/open#Window_features) on MDN. There is no requirement for you to respect the values. If your app does not have corresponding UI features (for example, no toolbar) or if all instance of WebView are opened in tabs and do not have distinct size or positions, then your app does not respect the values. You may want to respect values, but perhaps only some apply to the UI of you app. Accordingly, you may respect all, some, or none of the properties as appropriate for your app. For all numeric properties, if the value that is passed to window.open() is outside the range of an uint, the resulting value is uint.MaxValue. If you are not able to parse the value an integer, it is considered 0. If the value is a floating point value, it is rounded down to an integer. + + + + + Indicates whether the left and top values are specified. + + + + + Indicates whether the height and width values are specified. + + + + + Gets the left position of the window. Ignored if is false. + + + + + Gets the top position of the window. Ignored if is false. + + + + + Gets the height of the window. Ignored if is false. + + + + + Gets the width of the window. Ignored if is false. + + + + + Indicates that the menu bar is displayed. + + + + + Indicates that the status bar is displayed. + + + + + Indicates that the browser toolbar is displayed. + + + + + Indicates that the scroll bars are displayed. + + + + + View of the HTTP representation for a web resource response. + + + The properties of this object are not mutable. This response view is used with the event. + + + + + Gets the HTTP response headers as received. + + + + + Gets the HTTP response status code. + + + + + Gets the HTTP response reason phrase. + + + + + Gets the response content stream asynchronously. + + The content failed to load. + + A null stream means no content was found. Note content (if any) for redirect responses is ignored. + This method returns null if content size is more than 123MB. If msWebView2EnableDownloadContentInWebResourceResponseReceived feature flag is disabled, for navigations that become downloads or if response is downloadable content type (e.g., application/octet-stream), this method also returns null. See event to handle the response or enable the feature flag. The Stream object that is returned will be thread-safe and as reads will be blocking while waiting for data to be available, it is recommended to read from a background thread. + If this method is being called again before a first call has completed, it will complete at the same time all prior calls do. + If this method is being called after a first call has completed, it will return immediately (asynchronously). + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="WebResourceResponseReceived"::: + + + + + Event args for the event. + + + + + Gets the request object for the web resource, as committed. + + + This includes headers added by the network stack that were not be included during the associated event, such as Authentication headers. Modifications to this object have no effect on how the request is processed as it has already been sent. + + + + + Gets view of the response object received for the web resource. + + + + + An HTTP response used with the event. + + + + + Gets HTTP response content as stream. + + + Stream must have all the content data available by the time the event deferral of this response is completed. Stream should be agile or be created from a background thread to prevent performance impact to the UI thread. null means no content data. + When providing the response data, you should consider relevant HTTP request headers just like an HTTP server would do. For example, if the request was for a video resource in a HTML video element, the request may contain the [Range](https://developer.mozilla.org/docs/Web/HTTP/Headers/Range) header to request only a part of the video that is streaming. In this case, your response stream should be only the portion of the video specified by the range HTTP request headers and you should set the appropriate [Content-Range](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Range) header in the response. + + + + + + Gets the overridden HTTP response headers. + + + + + Gets or sets the HTTP response status code. + + + + + Gets or sets the HTTP response reason phrase. + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the web resource request. + + + The request object may be missing some headers that are added by network stack at a later time. + + + + + Gets or sets the object. + + + If this object is set, the event will be completed with this Response. + An empty object can be created with and then modified to construct the Response. + + + + + Gets the web resource request context. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the event at a later time. + + + + + Gets the source of web resource request. + + + + + An HTTP request used with the event. + + + + + Gets or sets the request URI. + + + + + Gets or sets the HTTP request method. + + + + + Gets or sets the HTTP request message body as stream. + + + POST data should be here. If a stream is set, which overrides the message body, the stream must have all the content data available by the time the event deferral of this request is completed. Stream should be agile or be created from a background STA to prevent performance impact to the UI thread. null means no content data. + + + + + + Gets the mutable HTTP request headers. + + + + + Event args for the event. + + + + + true if the page being navigated to is a new document. + + + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + Defines properties that enable, disable, or modify WebView features. + + + Changes to and will take effect immediately, while other setting changes made after event do not apply until the next top-level navigation. + + + + + Determines whether running JavaScript is enabled in all future navigations in the WebView. + + + This only affects scripts in the document. Scripts injected with runs even if script is disabled. The default value is true. + + + + + Determines whether communication from the host to the top-level HTML document of the WebView is allowed. + + + This is used when loading a new HTML document. If set to true, communication from the host to the top-level HTML document of the WebView is allowed using , , and message event of window.chrome.webview. Communication from the top-level HTML document of the WebView to the host is allowed using window.chrome.webview.postMessage function and the event. If set to false, then communication is disallowed. and fail and window.chrome.webview.postMessage fails by throwing an instance of an Error object. The default value is true. + + + + + + + + Determines whether WebView renders the default JavaScript dialog box. + + + This is used when loading a new HTML document. If set to false, WebView does not render the default JavaScript dialog box (specifically those displayed by the JavaScript alert, confirm, prompt functions and beforeunload event). Instead, WebView raises event that contains all of the information for the dialog and allow the host app to show a custom UI. The default value is true. + + + + + + Determines whether the status bar is displayed. + + + The status bar is usually displayed in the lower left of the WebView and shows things such as the URI of a link when the user hovers over it and other information. The default value is true. The status bar UI can be altered by web content and should not be considered secure. + + + + + Determines whether the user is able to use the context menu or keyboard shortcuts to open the DevTools window. + + + The default value is true. + + + + + Determines whether the default context menus are shown to the user in WebView. + + + The default value is true. + + + + + Determines whether host objects are accessible from the page in WebView. + + + The default value is true. + + + + + Determines whether the user is able to impact the zoom of the WebView. + + + When disabled, the user is not able to zoom using Ctrl++, Ctr+-, or Ctrl+mouse wheel, but the zoom is set using property. The default value is true. + + + + + Determines whether to disable built in error page for navigation failure and render process failure. + + + When disabled, blank page is displayed when related error happens. The default value is true. + + + + + Determines WebView2's User Agent. + + + The default value is the default User Agent of the Edge browser. This property may be overridden if the User-Agent header is set in a request. If the parameter is empty the User Agent will not be updated and the current User Agent will remain. Setting this property may clear User Agent Client Hints headers Sec-CH-UA-* and script values from navigator.userAgentData. Current implementation behavior is subject to change. + The User Agent set will also be effective on service workers and shared workers associated with the WebView. If there are multiple WebViews associated with the same service worker or shared worker, the last User Agent set will be used. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="SetUserAgent"::: + + + + + Determines whether browser-specific accelerator keys are enabled. + + + When this setting is set to false, it disables all accelerator keys that access + features specific to a web browser, including but not limited to: + + + + Ctrl+F and F3 for Find on Page + + + Ctrl+P for Print + + + Ctrl+R and F5 for Reload + + + Ctrl+Plus and Ctrl+Minus for zooming + + + Ctrl+Shift-C and F12 for DevTools + + + Special keys for browser functions, such as Back, Forward, and Search + + + + It does not disable accelerator keys related to movement and text editing, such + as: + + + + Home, End, Page Up, and Page Down + + + Ctrl+X, Ctrl+C, Ctrl+V + + + Ctrl+A for Select All + + + Ctrl+Z for Undo + + + + Those accelerator keys will always be enabled unless they are handled in the event. + + This setting has no effect on the event. The event + will be fired for all accelerator keys, whether they are enabled or not. + + The default value of AreBrowserAcceleratorKeysEnabled is true. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AllowWebViewShortcutKeys"::: + + + + + Determines whether password information will be autosaved. + + + When disabled, no new password data is saved and no Save/Update Password prompts are displayed. However, if there was password data already saved before disabling this setting, then that password information is auto-populated, suggestions are shown and clicking on one will populate the fields. + When enabled, password information is auto-populated, suggestions are shown and clicking on one will populate the fields, new data is saved, and a Save/Update Password prompt is displayed. The default value is false. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. All WebView2s with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="PasswordAutosaveEnabled"::: + + + + + Determines whether general form information will be saved and autofilled. + + + General autofill information includes information like names, street and email addresses, phone numbers, and arbitrary input. This excludes password information. When disabled, no suggestions appear, and no new information is saved. + When enabled, information is saved, suggestions appear, and clicking on one will populate the form fields. The default value is true. It will apply immediately after setting. + This property has the same value as , and changing one will change the other. And all WebView2s that created with the same will share the same value for this property, so for the WebView2s with the same profile, their and will always have the same value. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="GeneralAutofillEnabled"::: + + + + + + Determines the ability of the end users to use pinching motions on touch input enabled devices to scale the web content in the WebView2. + + + When disabled, the end users cannot use pinching motions on touch input enabled devices to scale the web content in the WebView2. The default value is true. + Pinch-zoom, referred to as "Page Scale" zoom, is performed as a post-rendering step, it changes the page scale factor property and scales the surface the web page is rendered onto when user performs a pinch zooming action. It does not change the layout but rather changes the viewport and clips the web content, the content outside of the viewport isn't visible onscreen and users can't reach this content using mouse. This API only affects the Page Scale zoom and has no effect on the existing browser zoom properties ( and ) or other end user mechanisms for zooming. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="TogglePinchZoomEnabled"::: + + + + + Determines whether the end user to use swiping gesture on touch input enabled devices to navigate in WebView2. + + + Swiping gesture navigation on touch screen includes: + + + Swipe left/right (swipe horizontally) to navigate to previous/next page in navigation history. + + + Pull to refresh (swipe vertically) the current page. (This feature is currently disabled by default in the browser, to enable in WebView2, set property with --pull-to-refresh switch). + + + It defaults to true. When set to false, the end user cannot swipe to navigate or pull to refresh. This API only affects the overscrolling navigation functionality and has no effect on the scrolling interaction used to explore the web content shown in WebView2. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleSwipeNavigationEnabled"::: + + + + + Used to customize the PDF toolbar items. + + + By default, it is and so it displays all of the items. + Changes to this property apply to all CoreWebView2s in the same environment and using the same profile. + Changes to this setting apply only after the next navigation. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="ToggleHiddenPdfToolbarItems"::: + + + + + Determines whether SmartScreen is enabled when visiting web pages + + + The default value is true. + IsReputationCheckingRequired is used to control whether SmartScreen is enabled or not. + SmartScreen is enabled or disabled for all CoreWebView2s using the same user data folder. + If CoreWebView2Setting.IsReputationCheckingRequired is true for any CoreWebView2 using the same user data folder, then SmartScreen is enabled. If CoreWebView2Setting.IsReputationCheckingRequired is false for all CoreWebView2 using the same user data folder, then SmartScreen is disabled. + When it is changed, the change will be applied to all WebViews using the same user data folder on the next navigation or download. + If the newly created CoreWebview2 does not set SmartScreen to false, when navigating(Such as Navigate(), LoadDataUrl(), ExecuteScript(), etc.), the default value will be applied to all CoreWebview2 using the same user data folder. + SmartScreen of WebView2 apps can be controlled by Windows system setting "SmartScreen for Microsoft Edge", specially, for WebView2 in Windows Store apps, SmartScreen is controlled by another Windows system setting "SmartScreen for Microsoft Store apps". When the Windows setting is enabled, the SmartScreen operates under the control of the `IsReputationCheckingRequired`. When the Windows setting is disabled, the SmartScreen will be disabled regardless of the `IsReputationCheckingRequired` value set in WebView2 apps. In other words, under this circumstance the value of `IsReputationCheckingRequired` will be saved but overridden by system setting. Upon re-enabling the Windows setting, the CoreWebview2 will reference the `IsReputationCheckingRequired` to determine the SmartScreen status. + + + + + The `IsNonClientRegionSupportEnabled` property enables web pages to use the + + `app-region` CSS style. Disabling/Enabling the `IsNonClientRegionSupportEnabled` + takes effect after the next navigation. Defaults to `false`. + + When this property is `true`, then all the non-client region features + will be enabled: + Draggable Regions will be enabled, they are regions on a webpage that + are marked with the CSS attribute `app-region: drag/no-drag`. When set to + `drag`, these regions will be treated like the window's title bar, supporting + dragging of the entire WebView and its host app window; the system menu shows + upon right click, and a double click will trigger maximizing/restoration of the + window size. + When set to `false`, all non-client region support will be disabled. + The `app-region` CSS style will be ignored on web pages. + + + + Event args for the event. + + + + + The TLS error code for the invalid certificate. + + + + + URI associated with the request for the invalid certificate. + + + + + Returns the . + + + + + The action of the server certificate error detection. + + + The default value is . + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + This interface represents a JavaScript exception. + + + + + The line number of the source where the exception occurred. Note that this position starts at 0. + + + + + The column number of the source where the exception occurred. Note that this position starts at 0. + + + + + The Name is the exception's class name. + + + + + The Message is the exception's message and potentially stack. + + + + + This will return all details of the exception as a JSON string. + + + + + Event args for the event. + + + + + Gets the URI of the page that requested the dialog box. + + + + + Gets the kind of JavaScript dialog box. + + + + + + Gets the message of the dialog box. + + + From JavaScript this is the first parameter passed to alert, confirm, and prompt and is empty for beforeunload. + + + + + Gets the default value to use for the result of the prompt JavaScript function. + + + This is the second parameter passed to the JavaScript prompt dialog. + + + + + Gets or sets the return value from the JavaScript prompt function if is run. + + + This value is ignored for s other than . If is not run, this value is ignored and false is returned from prompt. + + + + + + Responds with **OK** to confirm, prompt, and beforeunload dialogs. Not run this method to indicate cancel. + + + From JavaScript, this means that the confirm function and beforeunload event returns true if Accept is run. And for the prompt function it returns the value of if Accept is run and otherwise returns false. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + The host may set this flag to TRUE to cancel the screen capture. + + + If canceled, the screen capture UI is not displayed regardless of the Handled property. On the script side, it will return with a NotAllowedError as Permission denied. + + + + + The host may set this flag to TRUE to prevent the ScreenCaptureStarting event from firing on the CoreWebView2 as well. + + + By default, both the ScreenCaptureStarting event handlers on the CoreWebView2Frame and the CoreWebView2 will be invoked, with the CoreWebView2Frame event handlers invoked first. The host may set this flag to TRUE within the CoreWebView2Frame event handlers to prevent the remaining CoreWebView2 event handlers from being invoked. If the flag is set to FALSE within the CoreWebView2Frame event handlers, downstream handlers can update the Cancel property. + + + + + The frame info of the frame where the screen capture starting request originated. + + + + + Returns a object. + + + Use this deferral to defer the decision to show the Screen Capture UI. getDisplayMedia() won't call its callbacks until the deferral is completed. + + + + + Event args for the event. + + + + + Set if cancel the upcoming save/download. + + + + + Get the document origin URI of this file save operation. + + + + + Get the extension of file to be saved. + + + + + Get the full path of file to be saved. This includes the file name and extension. + + + + + Set if the default policy checking and security warning will be suppressed. + + + + + Returns a object. + + + It will put the event into a deferred state. The default policy checking and any default UI will be blocked temporarily, saving file to local won't start, until the deferral is completed. + + + + + + Event args for the event. + + + + + Mime type of content to be saved. + + + + + Indicates whether to cancel the save as before download. + + + Set this property to `TRUE` to cancel the Save As action and prevent the download from starting. returns . + + + + + Indicates if the system default dialog will be suppressed. + + + When this property is FALSE, the default Save As dialog is shown and the values assigned through `SaveAsFilePath`, `AllowReplace` and `Kind` are ignored when the event args invoke completed. When it is `TRUE`, the system dialog is skipped and all assigned values are used. + + + + + The absolute full path of save as location. + + + It includes the file name and extension. If it is not valid (for example, the root drive does not exist), Save As is denied, and is returned. If the associated download completes successfully, a target file is saved at this location. If the `Kind` property is , there will be an additional directory with resources files. + + + + + Indicates whether to allow replace old file when it already exists in the target save file path. + + + Setting this property to `TRUE` allows existing files to be replaced. Setting this property to `FALSE` will not replace existing files and will return . + + + + + The option to save content to different document. + + + If it is not allowed for the current document, method returns . + + + + + Gets a object. + + + This will defer showing the default Save As dialog. Use this to the event at a later time to perform a Save As operation. + + + + + + Provides a set of properties for a process list in the . + + + + + Get the process id of the process. + + + + + Get the kind of the process. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the kind of process failure that has occurred. + + + ProcessFailedKind is a combination of process kind (for example, browser, renderer, gpu) and failure (exit, unresponsiveness). Renderer processes are further divided in main frame renderer (RenderProcessExited, RenderProcessUnresponsive) and subframe renderer (FrameRenderProcessExited). To learn about the conditions under which each failure kind occurs, see . + + + + + + Gets the reason for the process failure. + + + Some of the reasons are only applicable to specific values of , and the following values always return the indicated reason value: + + + + ProcessFailedKind + Reason + + + BrowserProcessExited + + Unexpected + + + + RenderProcessUnresponsive + + Unresponsive + + + + + For other values, the reason may be any of the reason values. To learn about what these values mean, see . + + + + + + Gets the exit code of the failing process, for telemetry purposes. + + + The exit code is always 1 when is , and STILL_ACTIVE(259) when is . + + + + + + Gets a description of the failing process, assigned by the WebView2 Runtime. + + + This is a technical English term appropriate for logging or development purposes, and not localized for the end user. It applies to utility processes (for example, "Audio Service", "Video Capture") and plugin processes (for example, "Flash"). The returned string is empty if the WebView2 Runtime did not assign a description to the process. + + + + + Gets the collection of s for frames in the that were being rendered by the failed process. + + + The content in these frames is replaced with an error page. + This is only available when is ; the returned collection is empty for all other process failure kinds, including the case in which the failed process was the renderer for the main frame and subframes within it, for which the failure kind is . + + + + + When ProcessFailed occurred due to a failed Code Integrity check, this property returns the full path of the file that was prevented from loading on the system. + + The webview2 process which tried to load the DLL will fail with exit code STATUS_INVALID_IMAGE_HASH(-1073740760). + + + + Provides a set of properties for a process list with extended information in the . + + + + + Provides the of the current process. + + + + + Provides the collection of associated s which are actively running (showing or hiding UI elements) in this renderer process. + + + AssociatedFrameInfos will only be populated when this corresponds to a renderer process. Non-renderer processes will always have an empty AssociatedFrameInfo. AssociatedFrameInfos may also be empty for renderer processes that have no active frames. + + + :::code language="csharp" source="../code/sample/SampleApps/WebView2WpfBrowser/MainWindow.xaml.cs" id="AssociatedFrameInfos"::: + + + + + Settings used by the method. + + + Settings used by the method. + + + + + The orientation can be portrait or landscape. + + + The default orientation is portrait. See . + + + + + The scale factor is a value between 0.1 and 2.0. + + + The default is 1.0. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The page width in inches. + + + The default width is 8.5 inches. If the provided page width is less than or equal to zero, the current value is not changed and an ArgumentException is thrown. + + + + + The page height in inches. + + + The default height is 11 inches. If the provided page height is less than or equal to zero, the current value is not changed and an ArgumentException is thrown. + + + + + The top margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The bottom margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The left margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + The right margin in inches. + + + The default is 1 cm, or ~0.4 inches. A margin cannot be less than zero. If an invalid value is provided, the current value is not changed and an ArgumentException is thrown. + + + + + true if background colors and images should be printed. + + + The default value is false. + + + + + true if only the current end user's selection of HTML in the document should be printed. + + + The default value is false. + + + + + true if header and footer should be printed. + + + The default value is false. The header consists of the date and time of printing, and the title of the page. The footer consists of the URI and page number. The height of the header and footer is 0.5 cm, or ~0.2 inches. + + + + + The title in the header if is true. + + + The default value is the title of the current document. If an empty string or null value is provided, no title is shown in the header. + + + + + The URI in the footer if is true. + + + The default value is the current URI. If an empty string or null value is provided, no URI is shown in the footer. + + + + + Page range to print. Defaults to empty string, which means print all pages. + + + The PageRanges property is a list of page ranges specifying one or more pages that should be printed separated by commas. Any whitespace between page ranges is ignored. + A valid page range is either a single integer identifying the page to print, or a range in the form [start page]-[last page] where start page and last page are integers identifying the first and last inclusive pages respectively to print. + Every page identifier is an integer greater than 0 unless wildcards are used (see below examples). + The first page is 1. + + In a page range of the form [start page]-[last page] the start page number must be larger than 0 and less than or equal to the document's total page count. + If the start page is not present, then 1 is used as the start page. + The last page must be larger than the start page. + If the last page is not present, then the document total page count is used as the last page. + + Repeating a page does not print it multiple times. To print multiple times, use the property. + + The pages are always printed in ascending order, even if specified in non-ascending order. + + If page range is not valid or if a page is greater than document total page count, ArgumentException is thrown. + + The following examples assume a document with 20 total pages. + + + + Example + Result + Notes + + + "2" + Page 2 + + + + "1-4, 9, 3-6, 10, 11" + Pages 1-6, 9-11 + + + + "1-4, -6" + Pages 1-6 + The "-6" is interpreted as "1-6". + + + "2-" + Pages 2-20 + The "2-" is interpreted as "pages 2 to the end of the document". + + + "4-2, 11, -6" + Invalid + "4-2" is an invalid range. + + + "-" + Pages 1-20 + The "-" is interpreted as "page 1 to the end of the document". + + + "1-4dsf, 11" + Invalid + + + + "2-2" + Page 2 + + + + + + + + Prints multiple pages of a document on a single piece of paper. Choose from 1, 2, 4, 6, 9 or 16. + + + The default value is 1. + + If an invalid value is provided, ArgumentException is thrown. + + Below examples shows print output for PagesPerSide and Duplex. + + + + PagesPerSide + Total pages + Two-sided printing + Result + + + 1 + 1 + - + 1 page on the front side. + + + 2 + 1 + Yes + 1 page on the front side. + + + 2 + 4 + - + 2 pages on the first paper and 2 pages on the next paper. + + + 2 + 4 + Yes + 2 pages on the front side and 2 pages on back side. + + + 4 + 4 + Yes + 4 pages on the front side. + + + 4 + 8 + Yes + 4 pages on the front side and 4 pages on the back side. + + + + + + + Number of copies to print. Minimum value is 1 and the maximum copies count is 999. + + + The default value is 1. + + + + + Printer collation. + + + See for descriptions of collation. The default value is . + + Printing uses default value of printer's collation if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + Printer color mode. + + + See for descriptions of color modes. The default value is . + + Printing uses default value of printer supported color if an invalid value is provided for the specific printer. + + + + + Printer duplex settings. + + + See for descriptions of duplex. The default value is . + + Printing uses default value of printer's duplex if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + Printer media size. + + + See for descriptions of media size. The default value is . + + If media size is , you should set the and . + + Printing uses default value of printer supported media size if an invalid value is provided for the specific printer. + + This value is ignored in method. + + + + + The name of the printer to use. + + + Defaults to empty string. If the printer name is empty string or null, then it prints to the default printer on the user OS. + + If provided printer name doesn't match with the name of any installed printers on the user OS, the method returns with . + + Use [PrintCapabilities](/dotnet/api/system.printing.printcapabilities) class to enumerate available printers. + + This value is ignored in method. + + + + + This mostly represents a combined win32 POINTER_INFO, POINTER_TOUCH_INFO, and POINTER_PEN_INFO object. + + + + + Gets or sets the PointerKind of the pointer event. + + + This corresponds to the pointerKind property of the POINTER_INFO struct. The values are defined by the POINTER_INPUT_KIND enum in the Windows SDK (_winuser.h_). Supports PT_PEN and PT_TOUCH. + + + + + Gets or sets the PointerId of the pointer event. + + + This corresponds to the pointerId property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the FrameID of the pointer event. + + + This corresponds to the frameId property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PointerFlags of the pointer event. + + + This corresponds to the pointerFlags property of the POINTER_INFO struct. The values are defined by the POINTER_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PointerDeviceRect of the sourceDevice property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the DisplayRect of the sourceDevice property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PixelLocation of the pointer event. + + + This corresponds to the ptPixelLocation property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HimetricLocation of the pointer event. + + + This corresponds to the ptHimetricLocation property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PixelLocationRaw of the pointer event. + + + This corresponds to the ptPixelLocationRaw property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HimetricLocationRaw of the pointer event. + + + This corresponds to the ptHimetricLocationRaw property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the Time of the pointer event. + + + This corresponds to the dwTime property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the HistoryCount of the pointer event. + + + This corresponds to the historyCount property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the InputData of the pointer event. + + + This corresponds to the InputData property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the KeyStates of the pointer event. + + + This corresponds to the dwKeyStates property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PerformanceCount of the pointer event. + + + This corresponds to the PerformanceCount property of the POINTER_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the ButtonChangeKind of the pointer event. + + + This corresponds to the ButtonChangeKind property of the POINTER_INFO struct. The values are defined by the POINTER_BUTTON_CHANGE_KIND enum in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenFlags of the pointer event. + + + This corresponds to the penFlags property of the POINTER_PEN_INFO struct. The values are defined by the PEN_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenMask of the pointer event. + + + This corresponds to the penMask property of the POINTER_PEN_INFO struct. The values are defined by the PEN_MASK constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenPressure of the pointer event. + + + This corresponds to the pressure property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenRotation of the pointer event. + + + This corresponds to the rotation property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenTiltX of the pointer event. + + + This corresponds to the tiltX property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the PenTiltY of the pointer event. + + + This corresponds to the tiltY property of the POINTER_PEN_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchFlags of the pointer event. + + + This corresponds to the touchFlags property of the POINTER_TOUCH_INFO struct. The values are defined by the TOUCH_FLAGS constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchMask of the pointer event. + + + This corresponds to the touchMask property of the POINTER_TOUCH_INFO struct. The values are defined by the TOUCH_MASK constants in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchContact of the pointer event. + + + This corresponds to the rcContact property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchContactRaw of the pointer event. + + + This corresponds to the rcContactRaw property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchOrientation of the pointer event. + + + This corresponds to the orientation property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Gets or sets the TouchPressure of the pointer event. + + + This corresponds to the pressure property of the POINTER_TOUCH_INFO struct as defined in the Windows SDK (_winuser.h_). + + + + + Provides a set of properties for a permission setting. + + + + + The kind of the permission setting. + + + + + The origin of the permission setting. + + + + + The state of the permission setting. + + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the origin of the web content that requests the permission. + + + + + Gets the kind of the permission that is requested. + + + + + true when the permission request was initiated through a user gesture such as clicking an anchor tag with target. + + + Being initiated through a user gesture does not mean that user intended to access the associated resource. + + + + + Gets or sets the status of a permission request. For example, whether the request is granted. + + + The default value is . + + + + + Gets a object. + + + Use the deferral object to make the permission decision at a later time. The deferral only applies to the current request, and does not prevent the PermissionRequested event from getting raised for new requests. However, for some permission kinds the WebView will avoid creating a new request if there is a pending request of the same kind. + + + + + The host may set this flag to TRUE to prevent the PermissionRequested event from firing on the CoreWebView2 as well. + + By default, both the PermissionRequested on the CoreWebView2Frame and CoreWebView2 will be fired. + + + + Set the SavesInProfile property to FALSE to not persist the state beyond the current request, and to continue to receive PermissionRequested events for this origin and permission kind. + + + The permission state set from the PermissionRequested event is saved in the profile by default; it is persisted across sessions and becomes the new default behavior for future PermissionRequested events. Browser heuristics can affect whether the event continues to be raised when the state is persisted. + + + + + Event args for the . + + + + + The origin of the web content that sends the notification, such as https://example.com/ or https://www.example.com/. + + + + + The notification that was received. + + + You can access the properties on the Notification object to show your own notification. + + + + + Sets whether the is handled by the host after the event handler completes or if there is a deferral then after the deferral is completed. + + + If is set to true then WebView will not display the notification with the default UI, and the host will be responsible for handling the notification and for letting the web content know that the notification has been displayed, clicked, or closed. You must set to true before you call , and , otherwise they will fail with HRESULT_FROM_WIN32(ERROR_INVALID_STATE). If after the event handler or deferral completes is set to false then WebView will display the default notification UI. Note that you cannot un-handle this event once you have set to be true. The initial value is false. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + Gets the region kind corresponding to the event. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the target uri of the new window request. + + + + + Gets the new window or sets a WebView as a result of the new window requested. + + + Provides a WebView as the target for a window.open() from inside the requesting WebView. If this is set, the top-level window of this WebView is returned as the opened [WindowProxy](https://developer.mozilla.org/docs/glossary/windowproxy) to the opener script. If this is not set, then is checked to determine behavior for the . + The methods which should affect the new web contents like has to be called and completed before setting NewWindow. Other methods which should affect the new web contents like have to be called after setting NewWindow. It is best not to use before setting NewWindow, otherwise it may not work for later added scripts. + WebView provided in the NewWindow property must be on the same as the opener WebView and cannot be navigated. Changes to settings should be made before setting NewWindow to ensure that those settings take effect for the newly setup WebView. The new WebView must have the same profile as the opener WebView. + + + + + Indicates whether the event is handled by host. + + + If this is false and no is set, the WebView opens a popup window and returns the opened WindowProxy to the opener script. Note that in this case, there is no avenue to control the popup window from the app. If set to true and no is set for window.open(), the opened proxy is for a dummy window object, but this window does not load and is immediately closed. The default value is false. + + + + + true when the new window request was initiated through a user gesture such as selecting an anchor tag with target. + + + The Microsoft Edge popup blocker is disabled for WebView so the app is able to use this flag to block non-user initiated popups. + + + + + Gets the window features specified by the window.open() call. These features should be considered for positioning and sizing of new WebView windows. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the window open request at a later time. While this event is deferred the opener window returns a WindowProxy to an un-navigated window, which navigates when the deferral is complete. + + + + + Gets the name of the new window. + + + This window can be created via window.open(url, windowName), where the windowName parameter corresponds to Name property. + If no windowName is passed to window.open, then the Name property will be set to an empty string. Additionally, if window is opened through other means, such as <a target="windowName"> or <iframe name="windowName">, then the Name property will be set accordingly. In the case of target=_blank, the Name property will be an empty string. + Opening a window via Ctrl+clicking a link would result in the Name property being set to an empty string. + + + + + The frame info of the frame where the new window request originated. + + + The OriginalSourceFrameInfo is a snapshot of frame information at the time when the new window was requested. See for details on frame properties. + + + + + Event args for the event. + + + Event args for the event. + + + Event args for the event. + + + + + Gets the uri of the requested navigation. + + + + + true when the new window request was initiated through a user gesture. + + + Examples of user initiated requests are: + - Selecting an anchor tag with target + - Programmatic window open from a script that directly run as a result of user interaction such as via onclick handlers. + Non-user initiated requests are programmatic window opens from a script that are not directly triggered by user interaction, such as those that run while loading a new page or via timers. + The Microsoft Edge popup blocker is disabled for WebView so the app is able to use this flag to block non-user initiated popups. + + + + + true when the navigation is redirected. + + + + + Gets the HTTP request headers for the navigation. + + + Note, you are not able to modify the HTTP request headers in a event. + + + + + + Determines whether to cancel the navigation. + + + If set to true, the navigation is no longer present and the content of the current page is intact. For performance reasons, GET HTTP requests may happen, while the host is responding. You may set cookies and use part of a request for the navigation. Navigations to about schemes are cancellable, unless `msWebView2CancellableAboutNavigations` feature flag is disabled. Cancellation of frame navigation to `srcdoc` is not supported and will be ignored. + + + + + Gets the ID of the navigation. + + + + + Additional allowed frame ancestors set by the host app. + + + The app may set this property to allow a frame to be embedded by additional ancestors besides what is allowed by http header [X-Frame-Options](https://developer.mozilla.org/docs/Web/HTTP/Headers/X-Frame-Options) and [Content-Security-Policy frame-ancestors directive](https://developer.mozilla.org/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors). + If set, a frame ancestor is allowed if it is allowed by the additional allowed frame ancestors or original http header from the site. + Whether an ancestor is allowed by the additional allowed frame ancestors is done the same way as if the site provided it as the source list of the Content-Security-Policy frame-ancestors directive. + For example, if https://example.com and https://www.example.com are the origins of the top page and intermediate iframes that embed a nested site-embedding iframe, and you fully trust those origins, you should set this property to https://example.com https://www.example.com. + + This property gives the app the ability to use iframe to embed sites that otherwise could not be embedded in an iframe in trusted app pages. + This could potentially subject the embedded sites to [Clickjacking](https://wikipedia.org/wiki/Clickjacking) attack from the code running in the embedding web page. Therefore, you should only set this property with origins of fully trusted embedding page and any intermediate iframes. + Whenever possible, you should use the list of specific origins of the top and intermediate frames instead of wildcard characters for this property. + This API is to provide limited support for app scenarios that used to be supported by <webview> element in other solutions like JavaScript UWP apps and Electron. + You should limit the usage of this property to trusted pages, and specific navigation target url, by checking the , and . + + This property is ignored for top level document navigation. + + + + + Gets the navigation kind of the navigation. + + + + + Event args for the event. + + + Event args for the event. + + + + + true when the navigation is successful; false for a navigation that ended up in an error page (failures due to no network, DNS lookup failure, HTTP server responds with 4xx). Note that WebView2 will report the navigation as 'unsuccessful' if the load for the navigation did not reach the expected completion for any reason. Such reasons include potentially catastrophic issues such network and certificate issues, but can also be the result of intended actions such as the app canceling a navigation or navigating away before the original navigation completed. Applications should not just rely on this flag, but also consider the reported WebErrorStatus to determine whether the failure is indeed catastrophic in their context. + + + WebErrorStatuses that may indicate a non-catastrophic failure include: + + + + + + + + + + + + + + This may also be false for additional scenarios such as window.stop() run on navigated page. + + + + + Gets the error code if the navigation failed. + + + + + Gets the ID of the navigation. + + + + + The HTTP status code of the navigation if it involved an HTTP request. For instance, this will usually be 200 if the request was successful, 404 if a page was not found, etc. See https://developer.mozilla.org/docs/Web/HTTP/Status for a list of common status codes. + + + The HttpStatusCode property will be 0 in the following cases: + + + The navigation did not involve an HTTP request. For instance, if it was a navigation to a file:// URL, or if it was a same-document navigation. + + + The navigation failed before a response was received. For instance, if the hostname was not found, or if there was a network error. + + + In those cases, you can get more information from the and properties. + + If the navigation receives a successful HTTP response, but the navigated page calls window.stop() before it finishes loading, then HttpStatusCode may contain a success code like 200, but will be false and will be . + + Since WebView2 handles HTTP continuations and redirects automatically, it is unlikely for HttpStatusCode to ever be in the 1xx or 3xx ranges. + + + + + Event args for the event. + + + + + Gets the reason for WebView to raise the event. + + + + + Indicates whether the event has been handled by the app. + + + If the app has moved the focus to another desired location, it should set Handled property to true. When Handled property is false after the event handler returns, default action is taken. The default action is to try to find the next tab stop child window in the app and try to move focus to that window. If no other window exists to move focus, focus is cycled within the web content of the WebView. + + + + + Event args for the event. + + + + + Gets the URI with the external URI scheme to be launched. + + + + + Gets the origin initiating the external URI scheme launch. If the `InitiatingOrigin` is [opaque](https://html.spec.whatwg.org/multipage/origin.html#concept-origin-opaque), the `InitiatingOrigin` reported in the event args will be its precursor origin. The precursor origin is the origin that created the opaque origin. For example, if a frame on example.com opens a subframe with a different opaque origin, the subframe's precursor origin is example.com. + + + The origin will be an empty string if the request is initiated by calling on the external URI scheme. If a script initiates the navigation, the `InitiatingOrigin` will be the top-level document's `Source`, i.e. if `window.location` is set to `"calculator://", the `InitiatingOrigin` will be set to `calculator://`. If the request is initiated from a child frame, the `InitiatingOrigin` will be the source of that child frame. + + + + + true when the launching external URI scheme request was initiated through a user gesture. + + + + + Determines whether to cancel the navigation. + + + + + Gets a object and put the event into a deferred state. + + + Use this to the launching external URI scheme request at a later time. + + + + + Provides a set of properties for a frame in the . + + + Provides a set of properties for a frame in the . + + + + + Gets the value of frame's window.name property. The default value equals to frame html tag declaring it, as in <iframe name="frame-name" ...>. + + + The returned string is empty when the frame has no name attribute and no assigned value for window.name. + + + + + The URI of the document in the frame. + + + + + This parent frame's . ParentFrameInfo will only be populated when obtained via calling . objects obtained via will always have a null ParentFrameInfo. This property is also null for the top most document in the which has no parent frame. + + + ParentFrameInfo could be out of date as it's a snapshot. + + + + + The unique identifier of the frame associated with the current . It's the same kind of ID as with the and . FrameId will only be populated when obtained calling . objects obtained via will always have an invalid frame Id 0. + + + FrameId could be out of date as it's a snapshot. If there's created or destroyed or event or event after the asynchronous call starts, you may want to call the asynchronous method again to get the updated s. + + + + + Gets the kind of the frame. FrameKind will only be populated when obtained calling . ` objects obtained via will always have the default value . + + + FrameKind could be out of date as it's a snapshot. + + + + + Event args for the event. + + + + + Gets the created frame. + + + + + + Representation of a DOM [FileSystemHandle](https://developer.mozilla.org/docs/Web/API/FileSystemHandle) object. + + + + + The kind of the FileSystemHandle. It can either be a file or a directory. + + + + + The path to the FileSystemHandle. + + + + + The permissions granted to the FileSystemHandle. + + + + + Representation of a DOM[File](https://developer.mozilla.org/docs/Web/API/File) object passed via WebMessage. + + + You can use this object to obtain the path of a File dropped on WebView2. + + + + + The absolute file path. + + + + + The result for . + + + + + This property is true if successfully executed script with no unhandled exceptions and the result is available in the property. + + + + + A function that has no explicit return value returns undefined. If the script that was run throws an unhandled exception, then the result is also null. + + + + + If Succeeded is false, you can use this property to get the unhandled exception thrown by script execution + + + + + If Succeeded is true and the result of script execution is a string, this method provides the value of the string result, and we will get the false var value when the js result is not string type. + + + + + Event args for the event. + + + + + Returns the for the download that has started. + + + + + Indicates whether to cancel the download. + + + If canceled, the download save dialog is not displayed regardless of the value and the state is changed to with interrupt reason . + + + + + The path to the file. + + + If setting the path, the host should ensure that it is an absolute path, including the file name, and that the path does not point to an existing file. If the path points to an existing file, the file will be overwritten. If the directory does not exist, it is created. + + + + + Indicates whether to hide the default download dialog. + + + If set to true, the default download dialog is hidden for this download. The download progresses normally if it is not canceled, there will just be no default UI shown. By default the value is false and the default download dialog is shown. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + Gets the ID of the navigation. + + + + + A Receiver is created for a particular DevTools Protocol event and allows you to subscribe and unsubscribe from that event. + + + Obtained from the WebView object using . + + + + + + DevToolsProtocolEventReceived is raised when the corresponding DevToolsProtocol event is raised. + + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the parameter object of the corresponding DevToolsProtocol event represented as a JSON string. + + + + + Gets the sessionId of the target where the event originates from. Empty string is returned as sessionId if the event comes from the default session for the top page. + + + + + Represents the information regarding the context menu target. Includes the context selected and the appropriate data used for the actions of a context menu. + + + + + Gets the kind of context that the user selected as . + + + + + Returns true if the context menu is requested on an editable component. + + + + + Returns true if the context menu was requested on the main frame and false if invoked on another frame. + + + + + Gets the uri of the page. + + + + + Gets the uri of the frame. Will match the if is true. + + + + + Returns true if the context menu is requested on HTML containing an anchor tag. + + + + + Gets the uri of the link (if is true, null otherwise). + + + + + Returns true if the context menu is requested on text element that contains an anchor tag. + + + + + Gets the text of the link (if is true, null otherwise). + + + + + Returns true if the context menu is requested on HTML containing a source uri. + + + + + Gets the active source uri of element (if is true, null otherwise). + + + + + Returns true if the context menu is requested on a selection. + + + + + Gets the selected text (if is true, null otherwise). + + + + + Event args for the event. + + + Will contain the selection information and a collection of all of the default context menu items that the WebView would show. Allows the app to draw its own context menu or add/remove from the default context menu. + + + + + Gets the collection of objects. + + + + + Gets the target information associated with the requested context menu. + + + + + + Gets the coordinates where the context menu request occurred in relation to the upper left corner of the WebView bounds. + + + + + Gets or sets the selected 's . + + + When the app handles the event, it can set this to report the selected command from the context menu. The default value is -1 which means that no selection occurred. The app can also set the command ID for a custom context menu item, which will cause the event to be fired, however while command IDs for each custom context menu item is unique during a ContextMenuRequested event, WebView may reassign command ID values of deleted custom ContextMenuItems to new objects and the command ID assigned to the same custom item can be different between each app runtime. The command ID should always be obtained via the property. + + + + + Gets or sets whether the event is handled by host after the event handler completes or after the deferral is completed if there is a taken . + + + If Handled is set to true then WebView2 will not display a context menu and will instead use the property to indicate which, if any, context menu item to invoke. If after the event handler or deferral completes, Handled is set to false then WebView will display a context menu based on the contents of the property. The default value is false. + + + + + Returns a object. + + + Use this operation to complete the event when the custom context menu is closed. + + + + + Represents a context menu item of a context menu displayed by WebView. + + + + + Gets the unlocalized name for the . + + + Use this to distinguish between context menu item types. This will be the English label of the menu item in lower camel case. For example, the "Save as" menu item will be "saveAs". Extension menu items will be "extension", custom menu items will be "custom" and spellcheck items will be "spellCheck". + Some example context menu item names are: + + + + "saveAs" + + + "copyImage" + + + "openLinkInNewWindow" + + + + + + + Gets the localized label for the . Will contain an ampersand for characters to be used as keyboard accelerator. + + + + + Gets the Command ID for the . + + + Use this to report the in event. + + + + + Gets the localized keyboard shortcut for this . + + + It will be the empty string if there is no keyboard shortcut. This is text intended to be displayed to the end user to show the keyboard shortcut. For example this property is Ctrl+Shift+I for the "Inspect" . + + + + + Gets the Icon for the in PNG, Bitmap or SVG formats in the form of an IStream. + + + Stream will be rewound to the start of the image data before being read. + + + + + Gets the kind of as . + + + + + Gets or sets the enabled property of the . Must only be used in the case of a custom context menu item. + + + The default value for this is true. + + + + + Gets or sets the checked property of the . + + + Must only be used for custom context menu items that are of kind or . + + + + + Gets the list of children menu items if the kind is . + + + If the kind is not , will return null. + + + + + CustomItemSelected event is raised when the user selects this . + + + Will only be raised for end developer created context menu items. + + + + + Event args for the event. + + + + + true if the loaded content is an error page. + + + + + Gets the ID of the navigation. + + + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + This class is an extension of the class to support visual hosting. + + + + + Gets or sets the root visual in the hosting app's visual tree. + + + This visual is where the WebView will connect its visual tree. The app uses this visual to position the WebView within the app. The app still needs to use the property to size the WebView. The RootVisualTarget property can be an IDCompositionVisual or a Windows::UI::Composition::ContainerVisual. WebView will connect its visual tree to the provided visual before returning from the property setter. The app needs to commit on its device setting the RootVisualTarget property. The RootVisualTarget property supports being set to null to disconnect the WebView from the app's visual tree. + + + + + Gets the current cursor that WebView thinks it should be. + + + The cursor should be set in WM_SETCURSOR through Mouse.SetCursor or set on the corresponding parent/ancestor HWND of the WebView through ::SetClassLongPtr. The HCURSOR can be freed so CopyCursor/DestroyCursor is recommended to keep your own copy if you are doing more than immediately setting the cursor. + + + + + Gets the current system cursor ID reported by the underlying rendering engine for WebView. + + + + + The event is raised when WebView thinks the cursor should be changed. + + + For example, when the mouse cursor is currently the default cursor but is then moved over text, it may try to change to the IBeam cursor. + It is expected for the developer to send messages (in addition to messages) through . This is to ensure that the mouse is actually within the WebView that sends out CursorChanged events. + + + + + Sends mouse input to the WebView. + + The mouse event kind. + The virtual keys associated with the eventKind. + The amount of wheel movement. + The absolute position of the mouse, or the amount of motion since the last mouse event was generated, depending on the eventKind. + + If eventKind is or , then mouseData specifies the amount of wheel movement. + A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120. If eventKind is , , or , then mouseData specifies which X buttons were pressed or released. This value should be 1 if the first X button is pressed/released and 2 if the second X button is pressed/released. If eventKind is , then virtualKeys, mouseData, and point should all be zero. If eventKind is any other value, then mouseData should be zero. point is expected to be in the client coordinate space of the WebView. To track mouse events that start in the WebView and can potentially move outside of the WebView and host application, calling SetCapture and ReleaseCapture is recommended. To dismiss hover popups, it is also recommended to send messages. + + + + + Sends pen or pointer input to the WebView. + + The pointer event kind. + The pointer information. + + Accepts touch or pen pointer input of kinds defined in . + Any pointer input from the system must be converted into a first. + + + + + Call this method to inform the CoreWebView2CompositionController that a drag operation has left the WebView. + + + Corresponds to the [ICoreDropOperationTarget.LeaveAsync](/uwp/api/windows.applicationmodel.datatransfer.dragdrop.core.icoredropoperationtarget.leaveasync) method when performing a drag operation into the WebView. + + + + + This event is raised when elements on the page with "app-region" CSS property values corresponding to non-client regions change. Use the to see the kind of non-client region that changed. + + + + + Call this method to perform hit-testing inside of your message loop when the message is WM_NCHITTEST. + + The point parameter is expected to be in the client coordinate space of the WebView2. + The type of region which contains the point. + + + + This method retrieves the non-client regions on the page which corresponds to a given kind . + + The kind of non-client region. + This method returns a vector of rectangles. + + This method can be used inside the event handler to get the list of rects for the specific region that changed. + + + + + Event args for the event. + + + + + Returns host name of the server that requested client certificate authentication. + + + Normalization rules applied to the hostname are: + + + + Convert to lowercase characters for ascii characters. + + + Punycode is used for representing non ascii characters. + + + Strip square brackets for IPV6 address. + + + + + + + Returns port of the server that requested client certificate authentication. + + + + + Returns true if the server that issued this request is an http proxy. Returns false if the server is the origin server. + + + + + The list contains Base64 encoding of DER encoded distinguished names of certificate authorities allowed by the server. + + + + + Returns the list of when client certificate authentication is requested. The list contains mutually trusted CA certificate. + + + + + Selected certificate to respond to the server. + + + + + Indicates whether to cancel the certificate selection. + + + If canceled, the request is aborted regardless of the property. By default the value is false. + + + + + Indicates whether the event has been handled by host. + + + Set to true to respond to the server with or without a certificate. If this flag is true with a it responds to the server with the selected certificate otherwise respond to the server without a certificate. By default the value of and are false and display default client certificate selection dialog prompt to allow the user to choose a certificate. The is ignored unless is set to true. + + + + + Gets a object. + + + Use this to the event at a later time. + + + + + Event args for the event. + + + + + The kind of browser process exit that has occurred. + + + + + The process ID of the browser process that has exited. + + + + + Browser extension installed on current profile. + + + + + This is the browser extension's ID. This is the same browser extension ID returned by the browser extension API [chrome.runtime.id](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/id). Please see that documentation for more details on how the ID is generated. After an extension is removed, calling Id will return the id of the extension that is removed. + + + + + This is the browser extension's name. This value is defined in this browser extension's manifest.json file. If manifest.json define extension's localized name, this value will be the localized version of the name. Please see [Manifest.json name](https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/manifest.json/name) for more details. + + + + + If IsEnabled is true then the Extension is enabled and running in WebView instances. If it is false then the Extension is disabled and not running in WebView instances. When a Extension is first installed, IsEnable are default to be true. IsEnabled is persisted per profile. After an extension is removed, calling IsEnabled will return the value at the time it was removed. + + + + + Removes this browser extension from its WebView2 Profile. The browser extension is removed immediately including from all currently running HTML documents associated with this WebView2 Profile. The removal is persisted and future uses of this profile will not have this extension installed. After an extension is removed, calling Remove again will cause an exception. + + + + + Sets whether this browser extension is enabled or disabled. This change applies immediately to the extension in all HTML documents in all WebView2s associated with this profile. After an extension is removed, calling Enable will not change the value of IsEnabled. + + + + + Represents a Basic HTTP authentication response that contains a user name and a password as according to RFC7617 (https://tools.ietf.org/html/rfc7617) + + + + + User name provided for authentication. + + + + + Password provided for authentication. + + + + + Event args for the BasicAuthenticationRequested event. Will contain the request that led to the HTTP authorization challenge, the challenge and allows the host to provide authentication response or cancel the request. + + + + + The URI that led to the authentication challenge. For proxy authentication requests, this will be the URI of the proxy server. + + + + + The authentication challenge string. + + + + + Response to the authentication request with credentials. + + + This object will be populated by the app if the host would like to provide authentication credentials. + + + + + Indicates whether to cancel the authentication request. + + + false by default. If set to true, Response will be ignored. + + + + + Gets a object. + + + Use this Deferral to defer the decision to show the Basic Authentication dialog. + + + + + Event args for the event. + + + Event args for the event. + + + + + Gets the key event kind that caused the event to run. + + + + + Gets the Win32 virtual key code of the key that was pressed or released. + + + It is one of the Win32 virtual key constants such as VK_RETURN or an (uppercase) ASCII value such as 'A'. Verify whether Ctrl or Alt are pressed by running GetKeyState(VK_CONTROL) or GetKeyState(VK_MENU). + + + + + Gets the LPARAM value that accompanied the window message. + + + See the documentation for the WM_KEYDOWN and WM_KEYUP messages. + + + + + Gets a representing the information passed in the LPARAM of the window message. + + + + + Indicates whether the event is handled by host. + + + + For browser accelerator keys, when an accelerator key is pressed, the propagation and processing order is: + + 1. A CoreWebView2Controller.AcceleratorKeyPressed event is raised + 1. WebView2 browser feature accelerator key handling + 1. Web Content Handling: If the key combination isn't reserved for browser actions, the key event propagates to the web content, where JavaScript event listeners can capture and respond to it. + + If `Handled` property is set to true anywhere along the path, the event propagation stops, and web content will not receive the key and this prevents the WebView from performing the default action for this accelerator key. Otherwise the WebView will perform the default action for the accelerator key. + + + + + This `IsBrowserAcceleratorKeyEnabled` property allows developers to control whether the browser handles accelerator keys such as Ctrl+P or F3, etc. + + + The `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` API is a convenient setting for developers to disable all the browser accelerator keys together. This setting also sets the default value for the `IsBrowserAcceleratorKeyEnabled` property. + + By default, `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` is `TRUE` and `IsBrowserAcceleratorKeyEnabled` is `TRUE`. When developers change `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting to `FALSE`, this will change default value for `IsBrowserAcceleratorKeyEnabled` to `FALSE`. If developers want specific keys to be handled by the browser after changing the `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting to `FALSE`, they need to enable these keys by setting `IsBrowserAcceleratorKeyEnabled` to `TRUE`. + + The `CoreWebView2Controller.AcceleratorKeyPressed` event is raised any time an accelerator key is pressed, regardless of whether accelerator keys are enabled or not. + + This API will give the event arg higher priority over the `CoreWebView2Settings.AreBrowserAcceleratorKeysEnabled` setting when we handle the keys. + + With `IsBrowserAcceleratorKeyEnabled` property, if developers mark `IsBrowserAcceleratorKeyEnabled` as `FALSE`, the browser will skip the WebView2 browser feature accelerator key handling process, but the event propagation continues, and web content will receive the key combination. + + This property does not disable accelerator keys related to movement and text editing, such as: + - Home, End, Page Up, and Page Down + - Ctrl-X, Ctrl-C, Ctrl-V + - Ctrl-A for Select All + - Ctrl-Z for Undo + + +
      +
      diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.WinForms.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.WinForms.dll new file mode 100644 index 0000000..b2d08ad Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.WinForms.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.WinForms.xml b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.WinForms.xml new file mode 100644 index 0000000..5b005e1 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.WinForms.xml @@ -0,0 +1,504 @@ + + + + Microsoft.Web.WebView2.WinForms + + + + + This class is a bundle of the most common parameters used to create and instances. + Its main purpose is to be set to in order to customize the environment and/or controller used by a during implicit initialization. + + + This class isn't intended to contain all possible environment or controller customization options. + If you need complete control over the environment and/or controller used by a WebView2 control then you'll need to initialize the control explicitly by + creating your own environment (with ) and/or controller options (with ) and passing them to + *before* you set the property to anything. + See the class documentation for an initialization overview. + + + + + Creates a new instance of with default data for all properties. + + + + + Gets or sets the value to pass as the browserExecutableFolder parameter of when creating an environment with this instance. + + + + + Gets or sets the value to pass as the userDataFolder parameter of when creating an environment with this instance. + + + + + Gets or sets the value to use for the Language property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + Gets or sets the value to use for the ProfileName property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Gets or sets the value to pass as the AdditionalBrowserArguments parameter of which is passed to when creating an environment with this instance. + + + + + Gets or sets the value to use for the IsInPrivateModeEnabled property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Create a using the current values of this instance's properties. + + A task which will provide the created environment on completion, or null if no environment-related options are set. + + As long as no other properties on this instance are changed, repeated calls to this method will return the same task/environment as earlier calls. + If some other property is changed then the next call to this method will return a different task/environment. + + + + + Creates a using the current values of this instance's properties. + + A object or null if no controller-related properties are set. + Thrown if the parameter environment is null. + + + + Control to embed WebView2 in WinForms. + + + + + Create a new WebView2 WinForms control. + After construction the property is null. + Call to initialize the underlying . + + + This control is effectively a wrapper around the WebView2 COM API, which you can find documentation for here: https://aka.ms/webview2 + You can directly access the underlying ICoreWebView2 interface and all of its functionality by accessing the property. + Some of the most common COM functionality is also accessible directly through wrapper methods/properties/events on the control. + + Upon creation, the control's CoreWebView2 property will be null. + This is because creating the CoreWebView2 is an expensive operation which involves things like launching Edge browser processes. + There are two ways to cause the CoreWebView2 to be created: + 1) Call the method. This is referred to as explicit initialization. + 2) Set the property. This is referred to as implicit initialization. + Either option will start initialization in the background and return back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass your own to EnsureCoreWebView2Async or set the control's property prior to initialization. + + When initialization has finished (regardless of how it was triggered) then the following things will occur, in this order: + 1) The control's event will be invoked. If you need to perform one time setup operations on the CoreWebView2 prior to its use then you should do so in a handler for that event. + 2) If a Uri has been set to the property then the control will start navigating to it in the background (i.e. these steps will continue without waiting for the navigation to finish). + 3) The Task returned from will complete. + + For more details about any of the methods/properties/events involved in the initialization process, see its specific documentation. + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + + + + Cleans up any resources being used. + + true if managed resources should be disposed; otherwise, false. + + + + Overrides the base OnPaint event to have custom actions + in designer mode + + The graphics devices which is the source + + + + Overrides the base WndProc events to handle specific window messages. + + The Message object containing the HWND window message and parameters + + + + Gets or sets a bag of options which are used during initialization of the control's . + This property cannot be modified (an exception will be thrown) after initialization of the control's CoreWebView2 has started. + + Thrown if initialization of the control's CoreWebView2 has already started. + + + + Explicitly trigger initialization of the control's . + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass null (the default value) then a default environment will be created and used automatically. + + + A pre-created that should be used to create the . + Creating your own controller options gives you control over several options that affect how the is initialized. + If you pass a controllerOptions to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default controllerOptions will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes + or on exceptions. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + The following summarizes the possible error values and a description of why these errors occur. + + + Error Value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + *\\Edge\\Application* path used in browserExecutableFolder. + + + HRESULT_FROM_WIN32(ERROR_INVALID_STATE) + Specified options do not match the options of the WebViews that are currently running in the shared browser process. + + + HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) + WebView2 Initialization failed due to an invalid host HWND parentWindow. + + + HRESULT_FROM_WIN32(ERROR_DISK_FULL) + WebView2 Initialization failed due to reaching the maximum number of installed runtime versions. + + + HRESULT_FROM_WIN32(ERROR_PRODUCT_UNINSTALLED + If the Webview depends upon an installed WebView2 Runtime version and it is uninstalled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Could not find Edge installation. + + + HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) + User data folder cannot be created because a file with the same name already exists. + + + E_ACCESSDENIED + Unable to create user data folder, Access Denied. + + + E_FAIL + Edge runtime unable to start. + + + + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if this instance of is already disposed, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Explicitly trigger initialization of the control's . + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass null then a default environment will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes + or on exceptions. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if this instance of is already disposed, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + This is the private function which implements the actual background initialization task. + Cannot be called if the control is already initialized or has been disposed. + + + The environment to use to create the . + If that is null then a default environment is created with and its default parameters. + + + The controllerOptions to use to create the . + If that is null then a default controllerOptions is created with its default parameters. + + A task representing the background initialization process. + All the event handlers added here need to be removed in . + + + + Protected CreateParams property. Used to set custom window styles to the forms HWND. + + + + + Protected VisibilityChanged handler. + + + + + Protected SizeChanged handler. + + + + + Protected Select method: override this to capture tab direction when WebView control is activated + + + + + Protected OnGotFocus handler. + + + + + Protected OnParentChanged handler. + + + + + True if initialization finished successfully and the control is not disposed yet. + + + + + Recursive retrieval of the parent control + + The control to get the parent for + The root parent control + + + + The underlying CoreWebView2. Use this property to perform more operations on the WebView2 content than is exposed + on the WebView2. This value is null until it is initialized and the object itself has undefined behaviour once the control is disposed. + You can force the underlying CoreWebView2 to + initialize via the method. + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + + + + The zoom factor for the WebView. + + + + + Enable/disable external drop. + + + + + The Source property is the URI of the top level document of the + WebView2. Setting the Source is equivalent to calling . + Setting the Source will trigger initialization of the , if not already initialized. + The default value of Source is null, indicating that the is not yet initialized. + + Specified value is not an absolute . + Specified value is null and the control is initialized. + + + + + Returns true if the webview can navigate to a next page in the + navigation history via the method. + This is equivalent to the . + If the underlying is not yet initialized, this property is false. + + + + + + Returns true if the webview can navigate to a previous page in the + navigation history via the method. + This is equivalent to the . + If the underlying is not yet initialized, this property is false. + + + + + + The default background color for the WebView. + + + + + Executes the provided script in the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Reloads the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + + + + Navigates to the next page in navigation history. + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + Navigates to the previous page in navigation history. + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + Renders the provided HTML as the top level document of the . + This is equivalent to . + + The underlying is not yet initialized. + Thrown when browser process has unexpectedly and left this control in an invalid state. We are considering throwing a different type of exception for this case in the future. + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + + Stops any in progress navigation in the . + This is equivalent to . + If the underlying is not yet initialized, this method does nothing. + + + + + + This event is triggered either 1) when the control's has finished being initialized (regardless of how it was triggered or whether it succeeded) but before it is used for anything + OR 2) the initialization failed. + You should handle this event if you need to perform one time setup operations on the CoreWebView2 which you want to affect all of its usages + (e.g. adding event handlers, configuring settings, installing document creation scripts, adding host objects). + + + This sender will be the WebView2 control, whose CoreWebView2 property will now be valid (i.e. non-null) for the first time + if is true. + Unlikely this event can fire second time (after reporting initialization success first) + if the initialization is followed by navigation which fails. + + + + + NavigationStarting dispatches before a new navigate starts for the top + level document of the . + This is equivalent to the event. + + + + + + NavigationCompleted dispatches after a navigate of the top level + document completes rendering either successfully or not. + This is equivalent to the event. + + + + + + WebMessageReceived dispatches after web content sends a message to the + app host via chrome.webview.postMessage. + This is equivalent to the event. + + + + + + SourceChanged dispatches after the property changes. This may happen + during a navigation or if otherwise the script in the page changes the + URI of the document. + This is equivalent to the event. + + + + + + ContentLoading dispatches after a navigation begins to a new URI and the + content of that URI begins to render. + This is equivalent to the event. + + + + + + ZoomFactorChanged dispatches when the property changes. + This is equivalent to the event. + + + + + + Required designer variable. + + + + + Required method for Designer support - do not modify + the contents of this method with the code editor. + + + + diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Wpf.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Wpf.dll new file mode 100644 index 0000000..ed79cd9 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Wpf.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Wpf.xml b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Wpf.xml new file mode 100644 index 0000000..c6e27b6 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/Microsoft.Web.WebView2.Wpf.xml @@ -0,0 +1,1932 @@ + + + + Microsoft.Web.WebView2.Wpf + + + + + This class is a bundle of the most common parameters used to create and instances. + Its main purpose is to be set to in order to customize the environment and/or controller used by a during implicit initialization. + It is also a nice WPF integration utility which allows commonly used environment/controller parameters to be dependency properties and be created and used in markup. + + + This class isn't intended to contain all possible environment or controller customization options. + If you need complete control over the environment and/or controller used by a WebView2 control then you'll need to initialize the control explicitly by + creating your own environment (with ) and/or controller options (with ) and passing them to + *before* you set the property to anything. + See the class documentation for an initialization overview. + + + + + Creates a new instance of with default data for all properties. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to pass as the browserExecutableFolder parameter of when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to pass as the userDataFolder parameter of when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the Language property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the AdditionalBrowserArguments property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the AreBrowserExtensionsEnabled property of the CoreWebView2EnvironmentOptions parameter passed to when creating an environment with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the ProfileName property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the IsInPrivateModeEnabled property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + The WPF DependencyProperty which backs the property. + + + + + Gets or sets the value to use for the ScriptLocale property of the CoreWebView2ControllerOptions parameter passed to CreateCoreWebView2ControllerWithOptionsAsync when creating an controller with this instance. + + + + + Create a using the current values of this instance's properties. + + A task which will provide the created environment on completion, or null if no environment-related options are set. + + As long as no other properties on this instance are changed, repeated calls to this method will return the same task/environment as earlier calls. + If some other property is changed then the next call to this method will return a different task/environment. + + + + + Create a using the current values of this instance's properties. + + A object or null if no controller-related properties are set. + Thrown if the parameter environment is null. + + + + This class provides helper methods for working with Direct3D in the WebView2 WPF control. + It includes methods for creating Direct3D9 and Direct3D11 devices, creating textures, + copying resources, and getting shared handles, among others. These methods are used in + the GraphicsItemD3DImage class to interact with Direct3D objects and resources. + + + The class includes PInvoke declarations for calling Direct3D functions from unmanaged code. + It also defines several COM interfaces and structures necessary for interacting with + Direct3D objects. + Note: This class is intended for internal use by the WebView2 WPF control and should not + be used directly by application developers. + + + + + This Class is a capturing the content of the provided (the WebView2 visual). + + + + + Tracks the conditions which block implicit initialization and whether it has been requested or not. + The analogy is a set of gates which are either open (implicit init allowed) or closed (will have to wait). + All sub-gates must be open before implicit init can proceed. + If implicit init is requested while the gate is open then it happens immediately. + If it's requested while the gate is closed then it occurs when the gate becomes open. + + + It should be reasonably straight-forward to expand this class in the future to: + * add new sub-gates to further restrict when implicit initialization can occur + * support storing and invoking multiple actions next time the gate is open instead of only one + + + + + Tracks whether a sub-gate regarding / is open or closed. + This sub-gate is only closed after calls to `BeginInit` and before an equal number of calls to `EndInit`. + + + We don't want implicit initialization to occur in between those calls, + because implicit initialization is a side effect of setting the Source property, + and side effects of setting properties during that period are supposed to be delayed until `EndInit`. + + + + + How many times has been called without being called. + + + + + Tracks whether a sub-gate regarding is open or closed. + This sub-gate is closed if `SynchronizationContext.Current == null`. + + + Initialization won't work without a `SynchronizationContext` because otherwise an `await` might resume on a different thread. + As far as I know so far this only occurs before an event loop as started on the running thread. + Once there's an event loop running the `SynchronizationContext` ensures that `await`s resume in the same event loop (i.e. same thread). + Although it's a rare corner case, it's possible to create a `Window` w/ `WebView2` before an app's event loop starts. + This sub-gate handles that corner case. + + + + + An action which will trigger initialization next time the gate is open (and only once). + + + This basically tracks whether or not implicit initialization has been requested while the gate is closed. + If this is non-null then it should be a delegate that calls . + + + + + Closes the gate until is called an equal number of times. + + + + + Opens the gate closed by after being called the same number of times. + + + + + A handler that should be attached to an event which indicates that exists. + The best one I know of right now is . + When the handler is called, the gate will re-evaluate its state and potentially allow any pending initialization action. + + + + + Run a given action when the gate is open. + + + If the gate is currently open then the action runs immediately. + Otherwise the action runs next time the gate is discovered to be open. + The action is only ever run once; it will not run again a second/subsequent time the gate opens. + If the gate is closed and another action is already pending then the new action *overwrites* the current one (i.e. the currently stored action will never run). + To "forget" a currently stored action, pass `null`. + + Action to run when the gate is open, or null to clear a previously specified action. + + + + Examine our overall open/closed state and run any pending action if appropriate. + + + + + The public interfaces of WebView2 WPF control. + + + + + Gets or sets a bag of options which are used during initialization of the control's . + Setting this property will not work after initialization of the control's has started (the old value will be retained). + See the class documentation for an initialization overview. + + + + + + Accesses the complete functionality of the underlying COM API. + Returns null until initialization has completed. + See the class documentation for an initialization overview. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + The event is raised when the property changes. + This event directly exposes . + + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + A wrapper around the . + The only difference between this event and is the first parameter that's passed to handlers. + Handlers of this event will receive the control, whereas handlers of will receive the instance. + + + + + + This event is triggered either + 1) when the control's has finished being initialized (regardless of how initialization was triggered) but before it is used for anything, or + 2) if the initialization failed. + You should handle this event if you need to perform one time setup operations on the which you want to affect all of its usages. + (e.g. adding event handlers, configuring settings, installing document creation scripts, adding host objects). + See the class documentation for an initialization overview. + + + This sender will be the control, whose property will now be valid (i.e. non-null) for the first time + if is true. + Unlikely this event can fire second time (after reporting initialization success first) + if the initialization is followed by navigation which fails. + + + + + + Explicitly triggers initialization of the control's . + See the class documentation for an initialization overview. + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass an environment to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default environment will be created and used automatically. + + + A pre-created that should be used to create the . + Creating your own controller options gives you control over several options that affect how the is initialized. + If you pass a controllerOptions to this method then it will override any settings specified on the property. + If you pass null (the default value) and no value has been set to then a default controllerOptions will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress, unless previous initialization has already failed. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + The following summarizes the possible error values and a description of why these errors occur. + + + Error Value + Description + + + HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) + *\\Edge\\Application* path used in browserExecutableFolder. + + + HRESULT_FROM_WIN32(ERROR_INVALID_STATE) + Specified options do not match the options of the WebViews that are currently running in the shared browser process. + + + HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE) + WebView2 Initialization failed due to an invalid host HWND parentWindow. + + + HRESULT_FROM_WIN32(ERROR_DISK_FULL) + WebView2 Initialization failed due to reaching the maximum number of installed runtime versions. + + + HRESULT_FROM_WIN32(ERROR_PRODUCT_UNINSTALLED + If the Webview depends upon an installed WebView2 Runtime version and it is uninstalled. + + + HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) + Could not find Edge installation. + + + HRESULT_FROM_WIN32(ERROR_FILE_EXISTS) + User data folder cannot be created because a file with the same name already exists. + + + E_ACCESSDENIED + Unable to create user data folder, Access Denied. + + + E_FAIL + Edge runtime unable to start. + + + + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if is null, which probably indicates that the application's event loop hasn't started yet. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Explicitly triggers initialization of the control's . + See the class documentation for an initialization overview. + + + A pre-created that should be used to create the . + Creating your own environment gives you control over several options that affect how the is initialized. + If you pass an environment to this method then it will override any settings specified on the property. + If you pass null and no value has been set to then a default environment will be created and used automatically. + + + A Task that represents the background initialization process. + When the task completes then the property will be available for use (i.e. non-null). + Note that the control's event will be invoked before the task completes. + + + Unless previous initialization has already failed, calling this method additional times with the same parameter will have no effect (any specified environment is ignored) and return the same Task as the first call. + Unless previous initialization has already failed, calling this method after initialization has been implicitly triggered by setting the property will have no effect if no environment is given + and simply return a Task representing that initialization already in progress, unless previous initialization has already failed. + Unless previous initialization has already failed, calling this method with a different environment after initialization has begun will result in an . For example, this can happen if you begin initialization + by setting the property and then call this method with a new environment, if you begin initialization with and then call this method with a new + environment, or if you begin initialization with one environment and then call this method with no environment specified. + When this method is called after previous initialization has failed, it will trigger initialization of the control's again. + Note that even though this method is asynchronous and returns a Task, it still must be called on the UI thread like most public functionality of most UI controls. + + + Thrown if this method is called with a different environment than when it was initialized. See Remarks for more info. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if is null, which probably indicates that the application's event loop hasn't started yet. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + The top-level which the WebView is currently displaying (or will display once initialization of its is finished). + Generally speaking, getting this property is equivalent to getting the property and setting this property (to a different value) is equivalent to calling the method. + + + Getting this property before the has been initialized will retrieve the last Uri which was set to it, or null (the default) if none has been. + Setting this property before the has been initialized will cause initialization to start in the background (if not already in progress), after which the will navigate to the specified . + This property can never be set back to null or to a relative . + See the class documentation for an initialization overview. + + Thrown if has already been called on the control. + Thrown if the property is set to null. + Thrown if the property is set to a relative (i.e. a whose property is false). + + + + + Returns true if the WebView can navigate to a previous page in the navigation history. + Wrapper around the property of . + If isn't initialized yet then returns false. + + + + + + Returns true if the WebView can navigate to a next page in the navigation history. + Wrapper around the property of . + If isn't initialized yet then returns false. + + + + + + The zoom factor for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was set to it, or 1.0 (the default) if none has been. + The most recent value set to this property before the CoreWebView2 has been initialized will be set on it after initialization. + + + + + + The default background color for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was + set to it, or Color.White (the default) if none has been. + The most recent value set to this property before CoreWebView2Controller has been initialized will be set on it after initialization. + + + + + The foreground color to be used in design mode. + + + + + The AllowExternalDrop property for the WebView. + This property directly exposes , see its documentation for more info. + Getting this property before the has been initialized will retrieve the last value which was + set to it, or true (the default) if none has been. + The most recent value set to this property before CoreWebView2Controller has been initialized will be set on it after initialization. + + + + + Navigates the WebView to the previous page in the navigation history. + Equivalent to calling + If hasn't been initialized yet then does nothing. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Navigates the WebView to the next page in the navigation history. + Equivalent to calling . + If hasn't been initialized yet then does nothing. + + + Thrown if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Reloads the current page. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Stops all navigations and pending resource fetches. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Initiates a navigation to htmlContent as source HTML of a new document. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + The htmlContent parameter may not be larger than 2 MB (2 * 1024 * 1024 bytes) in total size. The origin of the new page is about:blank. + + + + + + Executes JavaScript code from the javaScript parameter in the current top level document rendered in the WebView. + Equivalent to calling . + + + Thrown if hasn't been initialized yet, or if the calling thread isn't the thread which created this object (usually the UI thread). See for more info. + May also be thrown if the browser process has crashed unexpectedly and left the control in an invalid state. We are considering throwing a different type of exception for this case in the future. + + Thrown if has already been called on the control. + + + + + + Attempts to set focus to the WebView2 Control. + Equivalent to calling . + Returns true if keyboard focus and logical focus were set to this element; + false if only logical focus was set to this element, or if the call to this method did not force the focus to change. + + + + + Defines internal operations specific to the WebView2 WPF control, separating the control-specific logic + that cannot be shared across different types of controls. + + + + + Initializes the WebView2 controller with operations specific to the control type. + + + + + Unregister controller's handlers specific to the control type. + + + + + A control to embed web content in a WPF application. + + + This control is effectively a wrapper around the [WebView2 COM API](https://aka.ms/webview2). + You can directly access the underlying + ICoreWebView2 interface and all of its functionality by accessing the + property. Some of the most common COM + functionality is also accessible directly through wrapper + methods/properties/events on the control. + + Upon creation, the control's property will be + null. This is because creating the is an + expensive operation which involves things like launching Edge browser + processes. There are two ways to cause the to + be created: + + + Call the method. This is + referred to as explicit initialization. + + + Set the property (which could be done from + markup, for example). This is referred to as implicit initialization. + Either option will start initialization in the background and return + back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass + your own to or set the control's property prior to initialization. + + + + When initialization has finished (regardless of how it was triggered or + whether it succeeded) then the following things will occur, in this + order: + + + The control's event + will be invoked. If you need to perform one time setup operations on + the prior to its use then you should + do so in a handler for that event. + + + If initialization was successful and a Uri has been set to the property then the control will start navigating to it in + the background (i.e. these steps will continue without waiting for the + navigation to finish). + + + The Task returned from will + complete. + + + + For more details about any of the methods/properties/events involved in + the initialization process, see its specific documentation. + + Because the control's is a very heavyweight + object (potentially responsible for multiple running processes and + megabytes of disk space) the control implements to provide an explicit means to free it. + Calling will release the + and its underlying resources (except any that are also being used by other + WebViews), and reset to null. After has been called the cannot be + re-initialized, and any attempt to use functionality which requires it + will throw an . + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + Note that this control extends in order to embed + windows which live outside of the WPF ecosystem. This has some + implications regarding the control's input and output behavior as well as + the functionality it "inherits" from and . + See the and [WPF/Win32 interop](/dotnet/framework/wpf/advanced/wpf-and-win32-interoperation#hwnds-inside-wpf) + documentation for more information. + + + + + + Creates a new instance of a WebView2 control. + Note that the control's will be null until initialized. + See the class documentation for an initialization overview. + + + + + The WPF which backs the property. + + + + + + + + + This is overridden from and is called to instruct us to create our HWND. + + The HWND that we should use as the parent of the one we create. + The HWND that we created. + + + + + This is overridden from and is called to instruct us to destroy our HWND. + + Our HWND that we need to destroy. + + + + + This is overridden from and is called to provide us with Win32 messages that are sent to our hwnd. + + Window receiving the message (should always match our ). + Indicates the message being received. See Win32 documentation for WM_* constant values. + The "wParam" data being provided with the message. Meaning varies by message. + The "lParam" data being provided with the message. Meaning varies by message. + If true then the message will not be forwarded to any (more) handlers. + Return value varies by message. + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + Override for painting to draw + + The tools to handle the drawing via . + + + + + + + + + + + + + + + + + + + + + + This is called by our base class according to the typical implementation of the pattern. + We implement it by releasing all of our underlying COM resources, including our . + + True if a caller is explicitly calling Dispose, false if we're being finalized. + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + Changes our controller's ParentWindow to the given HWND, along with any other necessary associated work. + + The new HWND to set as the controller's parent. IntPtr.Zero means that the controller will have no parent and the CoreWebView2 will be hidden. + Whether or not to call as required. Defaults to true. If you pass false then you should call it yourself if required. + + Reparenting the controller isn't necessarily as simple as changing its ParentWindow property, + and this method exists to ensure that any other work that needs to be done at the same time gets done. + The reason that SyncControllerWithParentWindow isn't baked directly into this method is because + sometimes we want to call the Sync functionality without necessarily reparenting (e.g. during initialization). + + + + + Syncs visual/windowing information between the controller and its parent HWND. + This should be called any time a new, non-null HWND is set as the controller's parent, + including when the controller is first created. + + + + + This is overridden from and called when our control's location has changed. + The HwndHost takes care of updating the HWND we created. + What we need to do is move our CoreWebView2 to match the new location. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + This is overridden from and is called to inform us that tabbing has caused the focus to move into our control/window. + Since WPF can't manage the transition of focus to a non-WPF HWND, it delegates the transition to us here. + So our job is just to place the focus in our external HWND. + + Information about how the focus is moving. + true to indicate that we handled the navigation, or false to indicate that we didn't. + + + + This is overridden from and called to allow us to handle key press input. + WPF should never actually call this in response to keyboard events because we're hosting a non-WPF window. + When our window has focus Windows will send the input directly to it rather than to WPF's top-level window and input system. + This override should only be called when we're explicitly forwarding accelerator key input from the CoreWebView2 to WPF (in CoreWebView2Controller_AcceleratorKeyPressed). + Even then, this KeyDownEvent is only triggered because our PreviewKeyDownEvent implementation explicitly triggers it, matching WPF's usual system. + So the process is: + + CoreWebView2Controller_AcceleratorKeyPressed + PreviewKeyDownEvent + KeyDownEvent + OnKeyDown + + . + + + + + See . + + + + + This is the "Preview" (i.e. tunneling) version of , so it actually happens first. + Like OnKeyDown, this will only ever be called if we're explicitly forwarding key presses from the CoreWebView2. + In order to mimic WPF's standard input handling, when we receive this we turn around and fire off the standard bubbling KeyDownEvent. + That way others in the WPF tree see the same standard pair of input events that WPF itself would have triggered if it were handling the key press. + + + + + + See . + + + + + The WPF which backs the property. + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True when we're in design mode and shouldn't create an underlying CoreWebView2. + + + + + The WPF which backs the property. + + + + + + + + + Design mode drawing content. + + + + + + + + + + + + + + + + + This is an event handler for our CoreWebView2's ProcessFailedEvent. + + + + + This is a "gate" which controls whether or not implicit initialization can occur. + If implicit initialization is triggered while the gate is closed, + then the initialization should be delayed until the gate opens. + When we want to trigger implicit initialization we route the call through this gate. + If the gate is open then the initialization will proceed. + If the gate is closed then it will remember to trigger the initialization when it opens. + + + + + Implementation of the ISupportInitialize pattern. + + + + + Implementation of the ISupportInitialize pattern. + + + + + Updates one of our dependency properties to match a new value from the . + It both sets the value and remembers (in _propertyChangingFromCore) that it came from the CoreWebView2 rather than the caller, + allowing the property's "on changed" handler to alter its behavior based on where the new value came from. + It's only intended to be called in a CoreWebView2 event handler that's informing us of a new property value. + It's basically just a wrapper around the inherited SetCurrentValue which also maintains _propertyChangingFromCore. + See the comments on for additional background info. + One more thing worth explicitly stating is that it wraps SetCurrentValue rather than SetValue, + in order to avoid overwriting any OneWay bindings that are set on the specified properties. + Check the link https://stackoverflow.com/q/4230698 for more information about the difference between SetValue and SetCurrentValue. + + The property to change due to an equivalent change in the CoreWebView2. + The new value from the CoreWebView2. + + + + Checks if a given property is currently being updated to match an equivalent change in the . + This method should only be called from a property's "on changed" handler; it has no meaning at any other time. + It is used to determine if the property is changing to match the CoreWebView2 or because the caller set it. + Usually this is used in order to decide if the new value needs to be propagated down to the CoreWebView2. + See the comments on for additional background info. + + The property to check. + True if the property is changing to match the CoreWebView2, or false if the property was changed by the caller. + + + + This is a handler for our base UIElement's IsVisibleChanged event. + It's predictably fired whenever IsVisible changes, and IsVisible reflects the actual current visibility status of the control. + We just need to pass this info through to our CoreWebView2Controller so it can save some effort when the control isn't visible. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls to validate a potential new Source value. + + + True if the value is valid, false if it is not. + If we return false then WPF should respond by throwing an . + + + Note that we unfortunately can't treat null as invalid here because null is valid prior to initialization. + + + + + This is a callback that WPF calls when the WPF Source property's value changes. + This might have been triggered by either: + 1) The caller set Source to programmatically trigger a navigation. + 2) The CoreWebView changed its own source and we're just updating the dependency property to match. + We use to distinguish the two cases. + + + + + + + + This is an event handler for our CoreWebView2's SourceChanged event. + Unsurprisingly, it fires when the CoreWebView2's source URI has been changed. + Note that there are two distinct triggers for this: + 1) The CoreWebView2 was told to navigate programmatically (potentially by us, see SourcePropertyChanged). + 2) The user interacted with the CoreWebView2, e.g. clicked a link. + In either of the above cases, this event might trigger several times due to e.g. redirection. + Aside from propagating to our own event, we just need to update our WPF Source property to match the CoreWebView2's. + + + + + + + + This is an event handler for our CoreWebView2's NavigationStarting event. + We just need to propagate the event to WPF. + + + + + + + + This is an event handler for our CoreWebView2's NavigationCompleted event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2's HistoryChanged event. + We're handling it in order to update our WPF CanGoBack and CanGoForward properties. + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + This is an event handler for our CoreWebView2Controller's MoveFocusRequested event. + It fires when the CoreWebView2Controller has focus but wants to move it elsewhere in the app. + E.g. this happens when the user tabs past the last item in the CoreWebView2 and focus needs to return to some other app control. + So our job is just to tell WPF to move the focus on to the next control. + Note that we don't propagate this event outward as a standard WPF routed event because we've implemented its purpose here. + If users of the control want to track focus shifting in/out of the control, they should use standard WPF events. + + + + + This is an event handler for our CoreWebView2Controller's GotFocus event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2Controller's LostFocus event. + We just need to propagate the event to WPF. + + + + + This is an event handler for our CoreWebView2Controller's AcceleratorKeyPressed event. + This is called to inform us about key presses that are likely to have special behavior (e.g. esc, return, Function keys, letters with modifier keys). + WPF can't detect this input because Windows sends it directly to the Win32 CoreWebView2Controller control. + We implement this by generating standard WPF key input events, allowing callers to handle the input in the usual WPF way if they want. + If nobody handles the WPF key events then we'll allow the default CoreWebView2Controller logic (if any) to handle it. + Of the possible options, this implementation should provide the most flexibility to callers. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF ZoomFactor property's value changes. + This might have been triggered by either: + 1) The caller set ZoomFactor to change the zoom of the CoreWebView2. + 2) The CoreWebView2 changed its own ZoomFactor and we're just updating the dependency property to match. + We use to distinguish the two cases. + + + + + + + + This is an event handler for our CoreWebView2Controller's ZoomFactorChanged event. + Unsurprisingly, it fires when the CoreWebView2Controller's ZoomFactor has been changed. + Note that there are two distinct triggers for this: + 1) The value was changed programmatically (potentially by us, see ZoomFactorPropertyChanged). + 2) The user interacted with the CoreWebView2, e.g. CTRL + Mouse Wheel. + Aside from propagating to our own event, we just need to update our WPF ZoomFactor property to match the CoreWebView2Controller's. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF DefaultBackgroundColor property's value changes. + Since CoreWebView2Controller does not update this property itself, this is only triggered by the + caller setting DefaultBackgroundColor. + + + + + The WPF which backs the property. + + + + + + + + This is a callback that WPF calls when our WPF AllowExternalDrop property's value changes. + Since CoreWebView2Controller does not update this property itself, this is only triggered by the + caller setting AllowExternalDrop. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + + + + + + + + + + This is an event handler for our CoreWebView2's ContentLoading event. + We just need to propagate the event to WPF. + + + + + + + + + + + This is an event handler for our CoreWebView2's WebMessageReceived event. + We just need to propagate the event to WPF. + + + + + Moves focus to the CoreWebView2Controller according to the + + + + + This is an event handler for the event. + It is called to inform us when we receive the keyboard focus. + We handle this by passing the keyboard focus on to the underlying . + We never want to land in a state where our control actually has the keyboard focus. + + The control that received keyboard focus. + Arguments from the underlying GotKeyboardFocus event. + + For WebView2 control, it's actually possible for us to receive keyboard focus without this method being called. + One known case where that happens is when our parent window is deactivated while we have focus, then reactivated. + We handle that case in . + + + + + + Implementation of pattern. + Developers should never reach the WebView2Base class here. + + + + + Implementation of the pattern. + Should on be called during m_element's Dispose(). + When this is called, it means all resources releted to the control are disposed and we can safely remove the control from the dictionary. + + + + + Visual hosting version of the WebView2 control. + + + This control is effectively a wrapper around the [WebView2 COM + API](https://aka.ms/webview2). You can directly access the underlying + ICoreWebView2 interface and all of its functionality by accessing the + property. Some of the most common COM + functionality is also accessible directly through wrapper + methods/properties/events on the control. + + Upon creation, the control's property will be + null. This is because creating the is an + expensive operation which involves things like launching Edge browser + processes. There are two ways to cause the to + be created: + + + Call the method. This is + referred to as explicit initialization. + + + Set the property (which could be done from + markup, for example). This is referred to as implicit initialization. + Either option will start initialization in the background and return + back to the caller without waiting for it to finish. + To specify options regarding the initialization process, either pass + your own to or set the control's property prior to initialization. + + + + When initialization has finished (regardless of how it was triggered or + whether it succeeded) then the following things will occur, in this + order: + + + The control's event + will be invoked. If you need to perform one time setup operations on + the prior to its use then you should + do so in a handler for that event. + + + If initialization was successful and a Uri has been set to the property then the control will start navigating to it in + the background (i.e. these steps will continue without waiting for the + navigation to finish). + + + The Task returned from will + complete. + + + + For more details about any of the methods/properties/events involved in + the initialization process, see its specific documentation. + + Because the control's is a very heavyweight + object (potentially responsible for multiple running processes and + megabytes of disk space) the control implements to provide an explicit means to free it. + Calling will release the + and its underlying resources (except any that are also being used by other + WebViews), and reset to null. After has been called the cannot be + re-initialized, and any attempt to use functionality which requires it + will throw an . + + Accelerator key presses (e.g. Ctrl+P) that occur within the control will + fire standard key press events such as OnKeyDown. You can suppress the + control's default implementation of an accelerator key press (e.g. + printing, in the case of Ctrl+P) by setting the Handled property of its + EventArgs to true. Also note that the underlying browser process is + blocked while these handlers execute, so: + + + You should avoid doing a lot of work in these handlers. + + + Some of the WebView2 and CoreWebView2 APIs may throw errors if + invoked within these handlers due to being unable to communicate with + the browser process. + + + If you need to do a lot of work and/or invoke WebView2 APIs in response to + accelerator keys then consider kicking off a background task or queuing + the work for later execution on the UI thread. + + This control extends in order to host the image + displaying WebView's content using template. This has some + implications regarding the control's input and output behavior as well as + the functionality it "inherits" from and . + + The content of is rendered by an . + By default, of WebView2CompositionControl + is set to true. This can prevent the from becoming blurry at certain dimensions, + but it disables anti-aliasing. Set it to false if you want to keep the anti-aliasing. + + Note that the uses a [GraphicsCaptureSession](https://learn.microsoft.com/en-us/uwp/api/windows.graphics.capture.graphicscapturesession) + to capture the screen content from the underlying browser processes. + As such, you may experience lower framerates compared to the standard control, and DRM protected + content will fail to play or display properly. + + + + + + + TemplatePart Name constant for the Image used to represent WebView2. + + + + + Image control uses to display content of WebView2. + + + + + Component used to capture from WebView visual and work as source of Image. + + + + + interface. + + + + + Static constructor for the WebView2CompositionControl class. + + + This static constructor is responsible for overriding the default style key property + for instances of the WebView2CompositionControl class. It sets the metadata to use + the type of the WebView2CompositionControl as the default style key. + See href="https://learn.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.defaultstylekey?view=netframework-4.8.1"/> + + + + + Creates a new instance of a WebView2Composition control. + Note that the control's will be null until initialized. + See the class documentation for an initialization overview. + + + + + This is an event handler for WPF control's SizeChanged event. + We use CoreWebView2Controller.NotifyParentWindowPositionChanged to notify our browser our + size and relative location has changed. + + + + + This is an event handler for WPF control's LocationChange event. + We use CoreWebView2Controller.NotifyParentWindowPositionChanged to notify our browser our + position has changed. + + + + + Initialize the dispatcher queue. + + + + + This is an event handler for our CoreWebView2CompositionController's CursorChanged event. + We use CursorInteropHelper to Obtain a WPF Cursor from the provided Win32 Handle. + + + + + Send the pointer event to the WebView2 Control. + + + + + + This is an event handler for WPF control's OnTouchDown event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + This is an event handler for WPF control's OnTouchMove event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + This is an event handler for WPF control's OnTouchUp event. + We use CoreWebView2CompositionController.SendPointerInput to send the touch input to our browser. + + + + + Helper function to get the of the mouse event. + + + + + Send the mouse event to the WebView2 Control. + + + + + + This is an event handler for WPF control's OnMouseMove event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseDown event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseUp event. + We use CoreWebView2CompositionController.SendMouseInput to send the mouse input to our browser. + + + + + This is an event handler for WPF control's OnMouseWheel event. + We use CoreWebView2CompositionController.SendMouseInput to send the input to our browser. + + + + + This is an event handler for WPF control's OnMouseDoubleClick event. + We use CoreWebView2CompositionController.SendMouseInput to send the input to our browser. + + + + + The WPF which backs the property. + + + + + + + + + Override for painting to draw + + The tools to handle the drawing via . + + + + + + + + + + + + + + + + + + + + + + Implementation of the pattern. + This will release all of our underlying COM resources. + + + + + Implementation of the ISupportInitialize pattern. + Prevents the control from implicitly initializing its until is called. + Does *not* prevent explicit initialization of the CoreWebView2 (i.e. ). + Mainly intended for use by interactive UI designers. + + + Note that the "Initialize" in ISupportInitialize and the "Init" in BeginInit/EndInit mean + something different and more general than this control's specific concept of initializing + its CoreWebView2 (explicitly or implicitly). This ISupportInitialize pattern is a general + way to set batches of properties on the control to their initial values without triggering + any dependent side effects until all of the values are set (i.e. until EndInit is called). + In the case of this control, a specific side effect to be avoided is triggering implicit + initialization of the CoreWebView2 when setting the Source property. + For example, normally if you set after you've already set Source, + the data set to CreationProperties is ignored because implicit initialization has already started. + However, if you set the two properties (in the same order) in between calls to BeginInit and + EndInit then the implicit initialization of the CoreWebView2 is delayed until EndInit, so the data + set to CreationProperties is still used even though it was set after Source. + + + + + Implementation of the ISupportInitialize pattern. + Invokes any functionality that has been delayed since the corresponding call to . + Mainly intended for use by interactive UI designers. + + + See the documentation of for more information. + + + + + The WPF which backs the property. + + + + + + + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + WebView2Composition Control only needs IKeyboardInputSink:TabInto to get the direction of tab traversal. + KeyboardInputSite is not implemented by WebView2Composition. + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + We override the to prevent the focus event from propagating. + We expect the event raised from + + + + + This is an event handler for our CoreWebView2Controller's GotFocus event. + Used to record whether the control currently has focus. + + + + + This is an event handler for our CoreWebView2Controller's Lost event. + We just need to propagate the event to WPF. + + + + + IKeyboardInputSink:HasFocusWithin interface. + Whether WebView has focus. + + + + + IKeyboardInputSink:OnMnemonic interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:RegisterKeyboardInputSink interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:TabInto interface. + + + + + IKeyboardInputSink:TranslateAccelerator interface. + Not implemented by WebView2. + + + + + IKeyboardInputSink:TranslateChar interface. + Not implemented by WebView2. + + + + + This is overridden from and called to allow us to handle key press input. + WPF should never actually call this in response to keyboard events because the focus is on the controller's HWND. + When Controller's HWND has focus, WPF does not know the Controller's HWND belongs to this control, and the key event will not be fired for this control and WPF main window. + This override should only be called when we're explicitly forwarding accelerator key input from the CoreWebView2 to WPF (in CoreWebView2Controller_AcceleratorKeyPressed). + Even then, this KeyDownEvent is only triggered because our PreviewKeyDownEvent implementation explicitly triggers it, matching WPF's usual system. + So the process is: + + CoreWebView2Controller_AcceleratorKeyPressed + PreviewKeyDownEvent + KeyDownEvent + OnKeyDown + + . + + + + + See . + + + + + This is the "Preview" (i.e. tunneling) version of , so it actually happens first. + Like OnKeyDown, this will only ever be called if we're explicitly forwarding key presses from the CoreWebView2. + In order to mimic WPF's standard input handling, when we receive this we turn around and fire off the standard bubbling KeyDownEvent. + That way others in the WPF tree see the same standard pair of input events that WPF itself would have triggered if it were handling the key press. + + + + + + See . + + + + + The WPF which backs the property. + + + + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + + + + The WPF which backs the property. + + + + + Gets or sets the divider for the rendering frame rate of the WebViewCompositionControl. + + + The FpsDivider property affects how the rendering frame rate is divided. For example, if the default rendering frame rate of the content is 60 frames + per second (fps), setting the FpsDivider to 2 reduces the frame rate to 30 fps. This property is useful for reducing the rendering load and improving + performance for scenarios where high frame rates are unnecessary. + + + + + This is a callback that WPF calls when our WPF FpsDivider property's value changes. + We implement it by setting the FpsDivider of the GraphicsItemD3DImage. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True when we're in design mode and shouldn't create an underlying CoreWebView2. + + + + + GeneratedInternalTypeHelper + + + + + CreateInstance + + + + + GetPropertyValue + + + + + SetPropertyValue + + + + + CreateDelegate + + + + + AddEventHandler + + + + diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/System.Diagnostics.EventLog.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/System.Diagnostics.EventLog.dll new file mode 100644 index 0000000..6281e73 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/System.Diagnostics.EventLog.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/System.IO.Packaging.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/System.IO.Packaging.dll new file mode 100644 index 0000000..eb95db7 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/System.IO.Packaging.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/System.ServiceProcess.ServiceController.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/System.ServiceProcess.ServiceController.dll new file mode 100644 index 0000000..0d456dc Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/System.ServiceProcess.ServiceController.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Core.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Core.dll new file mode 100644 index 0000000..d623133 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Core.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Fonts.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Fonts.dll new file mode 100644 index 0000000..444918b Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Fonts.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Tokenization.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Tokenization.dll new file mode 100644 index 0000000..a9b3be9 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Tokenization.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Tokens.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Tokens.dll new file mode 100644 index 0000000..7595fb6 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.Tokens.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.dll new file mode 100644 index 0000000..3645736 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/UglyToad.PdfPig.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/WebView2Loader.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/WebView2Loader.dll new file mode 100644 index 0000000..983ee32 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/WebView2Loader.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/runtimes/win-x64/native/WebView2Loader.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/runtimes/win-x64/native/WebView2Loader.dll new file mode 100644 index 0000000..983ee32 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/runtimes/win-x64/native/WebView2Loader.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/system_prompt.txt b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/system_prompt.txt new file mode 100644 index 0000000..5a999d3 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/publish/system_prompt.txt @@ -0,0 +1 @@ +[역할] 당신은 회사 업무의 도움을 주는 매우 유능한 비서입니다. 말투는 정중하게 하며, 욕을 해서는 안됩니다. \ No newline at end of file diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/runtimes/win-x64/native/WebView2Loader.dll b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/runtimes/win-x64/native/WebView2Loader.dll new file mode 100644 index 0000000..983ee32 Binary files /dev/null and b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/runtimes/win-x64/native/WebView2Loader.dll differ diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/adr-writer.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/adr-writer.skill.md new file mode 100644 index 0000000..e746d27 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/adr-writer.skill.md @@ -0,0 +1,95 @@ +--- +name: adr-writer +label: 아키텍처 결정 기록 (ADR) +description: 아키텍처 결정 사항을 표준 ADR 형식으로 문서화합니다. +icon: \uE82D +allowed-tools: + - file_read + - file_write + - folder_map + - grep + - search_codebase +tabs: code +--- + +아키텍처 결정 사항을 ADR(Architecture Decision Record) 형식으로 문서화하세요. + +## ADR이란? +소프트웨어 아키텍처에서 내린 중요한 결정의 배경, 대안, 근거를 기록하는 경량 문서입니다. +미래의 팀원이 "왜 이렇게 결정했는지"를 이해할 수 있게 합니다. + +## 워크플로우 + +1. **결정 사항 확인**: 사용자에게 다음을 파악 + - 어떤 결정을 내렸는가 (또는 내려야 하는가) + - 관련 코드/시스템 영역 + - 고려한 대안들 +2. **코드 분석** (선택): 관련 코드 구조를 읽어 현재 상태 파악 +3. **ADR 작성**: 표준 형식으로 문서 생성 +4. **파일 저장**: `docs/adr/` 폴더에 번호 형식으로 저장 + +## ADR 표준 형식 + +```markdown +# ADR-[번호]: [결정 제목] + +**상태**: 제안됨 | 승인됨 | 폐기됨 | 대체됨 +**날짜**: YYYY-MM-DD +**결정자**: [이름/팀] + +## 맥락 (Context) +어떤 상황에서 이 결정이 필요한가? +- 기술적 배경 +- 비즈니스 요구사항 +- 제약 조건 + +## 결정 (Decision) +무엇을 결정했는가? +- 선택한 방안의 구체적 내용 +- 적용 범위 + +## 대안 (Alternatives) + +### 대안 1: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +### 대안 2: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +## 근거 (Rationale) +왜 이 결정을 선택했는가? +- 대안 대비 장점 +- 트레이드오프 분석 +- 참고 자료/벤치마크 + +## 결과 (Consequences) + +### 긍정적 +- ... + +### 부정적 +- ... + +### 리스크 +- ... + +## 관련 문서 +- ADR-[관련번호]: [제목] +- [외부 참고 링크] +``` + +## 파일 명명 규칙 +- 위치: `docs/adr/` (없으면 생성) +- 파일명: `ADR-NNNN-제목-요약.md` (예: `ADR-0001-데이터베이스-선택.md`) +- 번호: 기존 ADR 파일 조회 후 자동 부여 + +## 규칙 +- 결정의 "왜"를 중심으로 작성 (코드를 읽으면 "무엇"은 알 수 있음) +- 대안은 최소 2개 이상 제시 +- 트레이드오프를 솔직하게 기록 (완벽한 선택은 없음) +- 짧고 명확하게 (1~2페이지 이내) +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/api-docs.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/api-docs.skill.md new file mode 100644 index 0000000..dc8c12e --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/api-docs.skill.md @@ -0,0 +1,53 @@ +--- +name: api-docs +label: API 문서 생성 +description: 코드에서 API 엔드포인트를 분석하여 마크다운/HTML API 문서를 자동 생성합니다. +icon: \uE8A1 +tabs: code +--- + +작업 폴더의 소스 코드를 분석하여 API 문서를 생성하세요. + +## 분석 대상 +- REST API 엔드포인트 (Controller, Route 어노테이션) +- 함수/메서드 시그니처 및 주석 +- 요청/응답 모델 (DTO, Schema) +- 인증/권한 요구사항 + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — API 엔드포인트 패턴 검색 (`[HttpGet]`, `@GetMapping`, `router.get`, `@app.route` 등) +3. `file_read` — 컨트롤러/라우터 파일 분석 +4. `grep_tool` — 요청/응답 모델 클래스 검색 +5. `file_read` — 모델 구조 분석 +6. `file_write` — API 문서 생성 + +## 출력 형식 +마크다운으로 작성하되 다음 구조를 따르세요: + +``` +# API 문서 + +## 개요 +- Base URL, 인증 방식, 공통 헤더 + +## 엔드포인트 + +### [POST] /api/users +- **설명**: 사용자 생성 +- **인증**: Bearer Token 필요 +- **요청 본문**: + | 필드 | 타입 | 필수 | 설명 | + |------|------|------|------| + | name | string | ✓ | 사용자 이름 | +- **응답**: 201 Created + ```json + { "id": 1, "name": "..." } + ``` +- **에러 코드**: 400, 401, 409 +``` + +## 주의사항 +- 코드에서 실제 확인된 내용만 문서화하세요. 추측하지 마세요. +- 주석이나 Swagger/OpenAPI 어노테이션이 있으면 우선 활용하세요. +- 인증, 페이징, 에러 처리 등 공통 패턴은 별도 섹션으로 정리하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/batch-rename.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/batch-rename.skill.md new file mode 100644 index 0000000..0598dbc --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/batch-rename.skill.md @@ -0,0 +1,70 @@ +--- +name: batch-rename +label: 파일 일괄 이름 변경 +description: 패턴 매칭, 번호 붙이기, 날짜 추가 등 파일 이름을 일괄 변경합니다. +icon: \uE8AC +tabs: cowork +allowed-tools: + - folder_map + - file_read + - file_manage + - clipboard_tool +--- + +파일 이름을 규칙에 따라 일괄 변경하세요. 변경 전 반드시 미리보기를 제공합니다. + +## 작업 절차 + +1. **대상 파일 스캔**: folder_map으로 작업 폴더의 파일 목록을 수집 +2. **이름 변경 규칙 확인**: 사용자에게 다음 옵션을 확인 + - 대상 파일 필터 (확장자, 이름 패턴) + - 변경 규칙 (아래 지원 규칙 참조) + - 적용 순서 (이름순, 날짜순, 크기순) +3. **변경 미리보기 생성**: 변경 전/후 이름을 표로 표시 + ``` + | # | 현재 이름 | 변경 후 이름 | + |---|----------------------|----------------------| + | 1 | IMG_20260101_001.jpg | 2026-01-01_001.jpg | + | 2 | IMG_20260101_002.jpg | 2026-01-01_002.jpg | + ``` +4. **사용자 확인**: 미리보기를 보여주고 진행 여부를 확인 +5. **일괄 변경 실행**: file_manage로 파일 이름을 순차 변경 +6. **결과 보고**: 변경 성공/실패 건수와 상세 내역을 안내 + +## 지원 이름 변경 규칙 + +### 패턴 치환 +- **문자열 치환**: "IMG_" → "사진_" +- **정규식 치환**: `(\d{4})(\d{2})(\d{2})` → `$1-$2-$3` +- **대소문자 변환**: 소문자, 대문자, 타이틀 케이스 + +### 번호 붙이기 +- **순번 추가**: `문서_001.pdf`, `문서_002.pdf`, ... +- **시작 번호**: 사용자 지정 (기본: 1) +- **자릿수**: 자동 계산 (파일 수 기준) +- **위치**: 접두사 또는 접미사 + +### 날짜 추가 +- **오늘 날짜**: `보고서_2026-03-30.docx` +- **파일 수정일**: 파일의 실제 수정 날짜 사용 +- **날짜 형식**: YYYY-MM-DD, YYYYMMDD, YY.MM.DD + +### 정리 +- **공백 처리**: 공백 → 언더스코어/하이픈 +- **특수문자 제거**: 파일명에서 특수문자 제거 +- **확장자 변경**: `.jpeg` → `.jpg` +- **접두사/접미사 추가 또는 제거** + +## 충돌 처리 +- 변경 후 이름이 이미 존재하면 자동으로 번호 추가 (`_1`, `_2`) +- 충돌 건은 미리보기에서 ⚠️ 표시로 경고 +- 원본 파일 덮어쓰기 절대 금지 + +## 규칙 +- **미리보기 없이 직접 변경하지 않음** — 반드시 미리보기 후 사용자 확인 +- 하위 폴더 포함 여부는 사용자에게 확인 +- 숨김 파일(.으로 시작)은 기본 제외 +- 변경 실패 시 이미 변경된 파일은 원복하지 않으므로, 중요한 경우 백업 권장 +- 한 번에 1,000개 이상의 파일 변경 시 경고 + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/changelog.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/changelog.skill.md new file mode 100644 index 0000000..a40539b --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/changelog.skill.md @@ -0,0 +1,74 @@ +--- +name: changelog +label: 변경 이력 / 릴리즈 노트 +description: Git 커밋 이력에서 자동으로 변경 이력과 릴리즈 노트를 생성합니다. +icon: \uE81C +allowed-tools: + - git_tool + - file_read + - file_write + - html_create + - text_summarize +tabs: code +--- + +Git 커밋 이력을 분석하여 변경 이력(CHANGELOG) 또는 릴리즈 노트를 생성하세요. + +## 워크플로우 + +1. **이력 조회**: git_tool로 커밋 로그 수집 + - 지정 기간 또는 태그 간 커밋 + - 커밋 메시지 + 변경 파일 목록 +2. **분류**: 커밋을 Conventional Commits 기준으로 분류 +3. **Breaking Change 감지**: 시그니처 변경, API 삭제 등 감지 +4. **문서 생성**: Markdown 또는 HTML로 출력 + +## Conventional Commits 분류 + +| 접두사 | 분류 | 설명 | +|--------|------|------| +| feat | ✨ 신기능 | 새로운 기능 추가 | +| fix | 🐛 버그 수정 | 버그 수정 | +| docs | 📝 문서 | 문서 변경 | +| style | 💄 스타일 | 코드 포맷팅 (동작 변경 없음) | +| refactor | ♻️ 리팩토링 | 코드 리팩토링 | +| perf | ⚡ 성능 | 성능 개선 | +| test | ✅ 테스트 | 테스트 추가/수정 | +| chore | 🔧 기타 | 빌드, 설정 변경 | +| BREAKING | 💥 Breaking | 하위 호환성 깨지는 변경 | + +## 출력 형식 + +### CHANGELOG.md +```markdown +# Changelog + +## [1.6.0] - 2026-03-30 + +### ✨ 신기능 +- 멀티패스 문서 생성 엔진 (#123) +- PPT 네이티브 생성 도구 + +### 🐛 버그 수정 +- 탭 전환 시 대화 유실 문제 해결 + +### 💥 Breaking Changes +- 없음 + +### 📝 문서 +- 개발자 가이드 v1.6.0 업데이트 +``` + +### 릴리즈 노트 (HTML) +사용자 친화적인 형식: +- 주요 변경사항 (스크린샷 포함 가능) +- 개선 사항 +- 알려진 이슈 +- 업그레이드 가이드 + +## 규칙 +- Conventional Commits 형식이 아닌 커밋도 내용 분석으로 분류 +- 중복/사소한 커밋은 병합하여 요약 +- Breaking Change는 반드시 별도 섹션으로 강조 +- 이슈 번호가 있으면 링크 포함 +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/code-scaffold.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/code-scaffold.skill.md new file mode 100644 index 0000000..35e4a74 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/code-scaffold.skill.md @@ -0,0 +1,31 @@ +--- +name: code-scaffold +label: 코드 스캐폴딩 +description: 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 자동 생성합니다. +icon: \uE943 +tabs: code +--- + +작업 폴더의 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 프로젝트 구조 파악 +2. file_read — 기존 코드 패턴 분석 +3. grep_tool — 코딩 컨벤션 확인 +4. file_write — 새 파일 생성 + +작업 순서: +1. 프로젝트 타입 감지 (언어, 프레임워크, 빌드 시스템) +2. 기존 코드 패턴 분석 (네이밍, 폴더 구조, 임포트 스타일) +3. 사용자 요청에 맞는 코드 뼈대 생성 + +생성 항목: +- 클래스/모듈 파일 (프로젝트 컨벤션에 맞춰) +- 인터페이스/타입 정의 +- 단위 테스트 파일 +- 필요한 설정/구성 파일 + +규칙: +- 기존 프로젝트의 코딩 스타일을 따르세요 +- TODO 주석으로 구현이 필요한 부분을 표시하세요 +- 한국어 주석을 추가하세요 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/commit-review.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/commit-review.skill.md new file mode 100644 index 0000000..0f8663b --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/commit-review.skill.md @@ -0,0 +1,67 @@ +--- +name: commit-review +label: 커밋 메시지 리뷰 +description: Git 커밋 메시지를 Conventional Commits 기준으로 검토하고 개선을 제안합니다. +icon: \uE8CB +tabs: code +--- + +작업 폴더의 최근 Git 커밋 메시지를 검토하고 개선안을 제시하세요. + +## 작업 절차 +1. `process_run` — `git log --oneline -20` 으로 최근 커밋 목록 확인 +2. `process_run` — `git log --format="%H%n%s%n%b%n---" -10` 으로 상세 메시지 확인 +3. `process_run` — `git diff HEAD~1` 으로 최신 커밋 변경 내용 확인 (필요 시) +4. 각 커밋을 Conventional Commits 기준으로 분석 +5. 결과를 정리하여 출력 + +## Conventional Commits 규칙 +``` +[optional scope]: + +[optional body] + +[optional footer(s)] +``` + +### type 종류 +- `feat`: 새 기능 +- `fix`: 버그 수정 +- `docs`: 문서 변경 +- `style`: 포맷팅 (코드 동작 변경 없음) +- `refactor`: 리팩토링 +- `perf`: 성능 개선 +- `test`: 테스트 추가/수정 +- `chore`: 빌드/도구 설정 +- `ci`: CI 설정 변경 + +## 검토 항목 +1. **type 적절성**: 변경 내용과 type이 일치하는가 +2. **설명 품질**: 50자 이내, 명령형, 명확한 내용 +3. **본문 유무**: 복잡한 변경에 "왜" 설명이 있는가 +4. **일관성**: 팀 내 커밋 스타일이 통일되어 있는가 +5. **Breaking Change**: BREAKING CHANGE 푸터 또는 ! 표기 + +## 출력 형식 +``` +## 커밋 메시지 리뷰 결과 + +### 전체 요약 +- 검토 커밋: N개 +- 규칙 준수: N개 ✓ / 위반: N개 ✗ + +### 개별 리뷰 + +#### abc1234 "Fix login bug" +- ❌ type 없음 → `fix: resolve login authentication failure` +- ❌ 본문 없음 → 원인과 해결 방법 추가 권장 + +#### def5678 "feat: add user profile page" +- ✅ Conventional Commits 준수 +- 💡 scope 추가 권장: `feat(profile): add user profile page` +``` + +## 주의사항 +- 비판이 아닌 건설적 제안을 하세요. +- 팀의 기존 컨벤션이 있으면 그것을 우선 존중하세요. +- 개선된 메시지 예시를 항상 함께 제시하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/compare.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/compare.skill.md new file mode 100644 index 0000000..6538dd7 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/compare.skill.md @@ -0,0 +1,51 @@ +--- +name: compare +label: 비교 분석표 +description: 2개 이상 항목의 비교 분석 매트릭스를 생성합니다. +icon: \uE9D5 +allowed-tools: + - html_create + - excel_create + - file_read + - document_read + - chart_create +tabs: all +--- + +사용자가 요청한 항목들을 체계적으로 비교 분석하는 매트릭스를 생성하세요. + +## 워크플로우 + +1. **비교 대상 확인**: 어떤 항목들을 비교할지 파악 + - 제품, 기술, 방안, 서비스, 도구, 프레임워크 등 +2. **비교 기준 설정**: 적절한 비교 축을 설계 + - 기능, 가격, 성능, 사용성, 확장성, 지원, 보안 등 +3. **데이터 수집**: 참고 파일이 있으면 읽어서 반영 +4. **분석표 생성**: HTML 또는 Excel로 비교 매트릭스 생성 +5. **종합 평가**: 총평 + 추천 의견 제시 + +## 비교표 구성 + +### 기본 매트릭스 +| 기준 | 항목 A | 항목 B | 항목 C | +|------|--------|--------|--------| +| 기능1 | ✅ 지원 | ⚠ 일부 | ❌ 미지원 | +| 기능2 | ... | ... | ... | + +### 점수 비교 (radar 차트 활용) +- 각 항목을 1~10점으로 정량화 +- chart_create로 레이더 차트 또는 바 차트 시각화 + +### 종합 평가 +- 장점/단점 요약 +- 상황별 추천 (예: "예산이 제한적이면 A, 확장성이 중요하면 B") + +## 출력 형식 +- **HTML** (권장): 색상 배지, 차트 포함 비주얼 보고서 +- **Excel**: 정량 데이터 + 수식 기반 점수표 + +## 규칙 +- 객관적 사실 기반으로 비교 (주관적 판단은 별도 섹션) +- 각 항목의 강점과 약점을 균형 있게 서술 +- 출처/근거가 있으면 명시 +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/csv-to-xlsx.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/csv-to-xlsx.skill.md new file mode 100644 index 0000000..fb819ac --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/csv-to-xlsx.skill.md @@ -0,0 +1,125 @@ +--- +name: csv-to-xlsx +label: CSV → Excel 변환 +description: CSV 파일을 서식이 완성된 Excel(.xlsx)로 변환합니다. 헤더 고정, 필터, 조건부 서식, 자동 열 너비를 적용합니다. +icon: \uE9F9 +tabs: cowork +requires: python +--- + +CSV 파일을 전문적인 서식이 적용된 Excel 파일로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install openpyxl pandas +``` + +## 작업 절차 + +1. **파일 확인**: folder_map으로 작업 폴더에서 CSV 파일을 탐색 +2. **CSV 분석**: file_read로 CSV 파일의 구조(컬럼, 행 수, 인코딩, 구분자) 파악 +3. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 헤더 행 고정 여부 (기본: 활성) + - 자동 필터 적용 여부 (기본: 활성) + - 조건부 서식 대상 컬럼 (숫자 컬럼 자동 감지) + - 시트 이름 (기본: 파일명) +4. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +5. **스크립트 실행**: process_run으로 Python 스크립트 실행 +6. **결과 확인**: 생성된 .xlsx 파일 경로와 요약 정보를 안내 + +## Python 스크립트 템플릿 +```python +import pandas as pd +from openpyxl import load_workbook +from openpyxl.styles import Font, PatternFill, Alignment, Border, Side +from openpyxl.utils import get_column_letter +from openpyxl.formatting.rule import CellIsRule + +# CSV 읽기 (인코딩 자동 감지) +for enc in ['utf-8', 'cp949', 'euc-kr', 'utf-8-sig']: + try: + df = pd.read_csv('input.csv', encoding=enc) + break + except (UnicodeDecodeError, Exception): + continue + +# Excel 저장 +output_path = 'output.xlsx' +df.to_excel(output_path, index=False, sheet_name='Sheet1') + +# 서식 적용 +wb = load_workbook(output_path) +ws = wb.active + +# 헤더 스타일 +header_font = Font(bold=True, color='FFFFFF', size=11) +header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid') +header_align = Alignment(horizontal='center', vertical='center', wrap_text=True) +thin_border = Border( + left=Side(style='thin'), + right=Side(style='thin'), + top=Side(style='thin'), + bottom=Side(style='thin') +) + +for col_idx, cell in enumerate(ws[1], 1): + cell.font = header_font + cell.fill = header_fill + cell.alignment = header_align + cell.border = thin_border + +# 자동 열 너비 +for col_idx in range(1, ws.max_column + 1): + max_length = 0 + col_letter = get_column_letter(col_idx) + for row in ws.iter_rows(min_col=col_idx, max_col=col_idx): + for cell in row: + if cell.value: + max_length = max(max_length, len(str(cell.value))) + ws.column_dimensions[col_letter].width = min(max_length + 4, 50) + +# 헤더 행 고정 (Freeze Panes) +ws.freeze_panes = 'A2' + +# 자동 필터 +ws.auto_filter.ref = ws.dimensions + +# 숫자 컬럼 조건부 서식 (음수 빨강) +for col_idx in range(1, ws.max_column + 1): + col_letter = get_column_letter(col_idx) + sample_values = [ws.cell(row=r, column=col_idx).value for r in range(2, min(ws.max_row + 1, 12))] + if any(isinstance(v, (int, float)) for v in sample_values if v is not None): + cell_range = f'{col_letter}2:{col_letter}{ws.max_row}' + ws.conditional_formatting.add(cell_range, + CellIsRule(operator='lessThan', formula=['0'], + font=Font(color='FF0000'))) + +# 데이터 행 줄무늬 (가독성) +light_fill = PatternFill(start_color='D9E2F3', end_color='D9E2F3', fill_type='solid') +for row_idx in range(2, ws.max_row + 1): + for col_idx in range(1, ws.max_column + 1): + cell = ws.cell(row=row_idx, column=col_idx) + cell.border = thin_border + if row_idx % 2 == 0: + cell.fill = light_fill + +wb.save(output_path) +print(f'변환 완료: {output_path} ({ws.max_row - 1}행 × {ws.max_column}열)') +``` + +## 서식 옵션 +- **헤더 스타일**: 파란 배경 + 흰색 굵은 글씨 + 가운데 정렬 +- **줄무늬**: 짝수 행 연한 파랑 배경 (가독성 향상) +- **열 너비**: 내용 기준 자동 조정 (최대 50) +- **조건부 서식**: 숫자 컬럼 음수 빨강 표시 +- **Freeze Panes**: 헤더 행 고정 +- **Auto Filter**: 전체 컬럼 필터 활성화 + +## 규칙 +- 원본 CSV 파일은 수정하지 않음 +- 인코딩 자동 감지 (UTF-8 → CP949 → EUC-KR 순) +- 대용량 파일 (100,000행 이상) 경고 후 진행 +- 출력 파일명: 원본 파일명 기준 (.csv → .xlsx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/data-convert.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/data-convert.skill.md new file mode 100644 index 0000000..edd84f6 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/data-convert.skill.md @@ -0,0 +1,56 @@ +--- +name: data-convert +label: 데이터 변환기 +description: 데이터 포맷 간 변환, 정제, 필터링, 통계 요약을 수행합니다. +icon: \uE8AB +allowed-tools: + - file_read + - file_write + - json_tool + - csv_create + - data_pivot + - excel_create +tabs: cowork +--- + +데이터 파일의 포맷 변환, 정제, 필터링, 통계 요약을 수행하세요. + +## 지원 변환 + +| 입력 → | JSON | CSV | Excel | Markdown | +|--------|------|-----|-------|----------| +| JSON | — | ✅ | ✅ | ✅ | +| CSV | ✅ | — | ✅ | ✅ | +| Excel | ✅ | ✅ | — | ✅ | +| TSV | ✅ | ✅ | ✅ | ✅ | + +## 워크플로우 + +1. **파일 분석**: 입력 파일의 포맷, 인코딩, 구조 파악 +2. **데이터 정제** (선택): + - 빈 행/열 제거 + - 중복 제거 + - 데이터 타입 정리 (숫자 문자열 → 숫자) + - 결측치 처리 (제거 또는 기본값) +3. **필터링** (선택): + - 조건 기반 행 필터링 + - 필요 컬럼만 추출 +4. **변환**: 대상 포맷으로 변환 +5. **통계 요약**: 기본 통계 제공 + +## 정제 옵션 +- `remove_empty`: 빈 행 제거 +- `remove_duplicates`: 중복 행 제거 +- `trim`: 공백 제거 +- `fill_na`: 결측치 채우기 (값 지정) + +## 출력 +- 변환된 파일 저장 +- 변환 통계 (원본 행 수, 변환 후 행 수, 제거 행 수) +- 컬럼별 기본 통계 (수치 컬럼: 합계, 평균, 최소, 최대) + +## 규칙 +- 원본 파일은 수정하지 않음 (새 파일로 저장) +- 인코딩: UTF-8 기본 (EUC-KR 옵션) +- 대용량 파일 (10MB 이상) 경고 +- 한국어로 안내 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/data-visualize-adv.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/data-visualize-adv.skill.md new file mode 100644 index 0000000..53817d4 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/data-visualize-adv.skill.md @@ -0,0 +1,125 @@ +--- +name: data-visualize-adv +label: 고급 데이터 시각화 +description: Python matplotlib/seaborn을 사용하여 히트맵, 산점도, 상관관계 등 고급 시각화를 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +데이터를 고급 시각화 차트로 변환하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib seaborn pandas numpy +``` + +## 작업 절차 +1. **데이터 확인**: 사용자가 제공한 CSV/JSON/Excel 데이터 파일 확인 +2. **데이터 로드**: pandas로 데이터 읽기 +3. **Python 스크립트 작성**: file_write로 시각화 스크립트 생성 +4. **스크립트 실행**: process_run으로 실행 +5. **결과 확인**: 생성된 차트 이미지 경로를 사용자에게 안내 + +## 시각화 유형별 템플릿 + +### 공통 설정 +```python +import matplotlib.pyplot as plt +import seaborn as sns +import pandas as pd +import numpy as np + +# 한글 폰트 설정 +plt.rcParams['font.family'] = 'Malgun Gothic' +plt.rcParams['axes.unicode_minus'] = False +sns.set_theme(style='whitegrid', font='Malgun Gothic') +``` + +### 히트맵 (상관관계 행렬) +```python +df = pd.read_csv('data.csv') +corr = df.select_dtypes(include=[np.number]).corr() + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r', + center=0, square=True, linewidths=0.5, ax=ax) +ax.set_title('상관관계 히트맵') +plt.tight_layout() +plt.savefig('heatmap.png', dpi=150) +``` + +### 산점도 (Scatter Plot) +```python +df = pd.read_csv('data.csv') + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.scatterplot(data=df, x='col_x', y='col_y', hue='category', + size='value', sizes=(20, 200), alpha=0.7, ax=ax) +ax.set_title('산점도') +plt.tight_layout() +plt.savefig('scatter.png', dpi=150) +``` + +### 시계열 분석 +```python +df = pd.read_csv('data.csv', parse_dates=['date']) + +fig, ax = plt.subplots(figsize=(12, 6)) +sns.lineplot(data=df, x='date', y='value', hue='category', ax=ax) +ax.set_title('시계열 트렌드') +plt.xticks(rotation=45) +plt.tight_layout() +plt.savefig('timeseries.png', dpi=150) +``` + +### 분포 비교 (박스플롯 + 바이올린) +```python +fig, axes = plt.subplots(1, 2, figsize=(14, 6)) + +sns.boxplot(data=df, x='group', y='value', ax=axes[0]) +axes[0].set_title('박스플롯') + +sns.violinplot(data=df, x='group', y='value', ax=axes[1]) +axes[1].set_title('바이올린 플롯') + +plt.tight_layout() +plt.savefig('distribution.png', dpi=150) +``` + +### 다중 차트 대시보드 +```python +fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + +# 좌상: 히트맵 +sns.heatmap(corr, annot=True, fmt='.1f', ax=axes[0,0]) + +# 우상: 산점도 +sns.scatterplot(data=df, x='x', y='y', ax=axes[0,1]) + +# 좌하: 히스토그램 +sns.histplot(data=df, x='value', kde=True, ax=axes[1,0]) + +# 우하: 박스플롯 +sns.boxplot(data=df, x='group', y='value', ax=axes[1,1]) + +fig.suptitle('데이터 분석 대시보드', fontsize=16, fontweight='bold') +plt.tight_layout() +plt.savefig('dashboard.png', dpi=150) +``` + +### 페어플롯 (변수 간 관계 전체) +```python +g = sns.pairplot(df, hue='category', diag_kind='kde') +g.fig.suptitle('변수 간 관계', y=1.02) +plt.savefig('pairplot.png', dpi=150) +``` + +## 스타일 옵션 +- seaborn 테마: `whitegrid`, `darkgrid`, `white`, `dark`, `ticks` +- 컬러 팔레트: `Set2`, `husl`, `coolwarm`, `RdBu_r`, `viridis` +- 출력 형식: png, svg, pdf +- 해상도: `dpi=150` (기본), `dpi=300` (인쇄용) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/data-visualize.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/data-visualize.skill.md new file mode 100644 index 0000000..965bf8b --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/data-visualize.skill.md @@ -0,0 +1,38 @@ +--- +name: data-visualize +label: 데이터 시각화 +description: CSV/Excel 데이터를 분석하여 차트가 포함된 HTML 보고서를 생성합니다. +icon: \uE9D9 +tabs: cowork +--- + +작업 폴더의 데이터 파일을 분석하고 시각화 보고서를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — HTML 시각화 보고서 생성 + +���각화 전략: +1. **데이터 파악**: 컬럼 타입, 결측치, 기본 통계량 확인 +2. **적절한 차트 선택**: + - 시계열 → 라인 차트 + - 비교 → 바 차트 + - 비율 → 파이/도넛 차트 + - 분포 → 히스토그램 + - 상관관계 → 산점도 +3. **HTML 보고서 생성**: 인라인 SVG 또는 CSS 기반 차트 (외부 라이브러리 없이) + +보고서 구성: +## 데이터 요약 +- 기본 통계 테이블 + +## 시각화 +- 데이터 특성에 맞는 2~4개 차트 +- 각 차트에 대한 해석 + +## 인사이트 +- 데이터에서 발견한 주요 패턴 +- 이상치 또는 주목할 포인트 + +한국어로 작성하세요. 차트는 CSS/SVG 기반으로 외부 의존성 없이 생성하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/db-schema.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/db-schema.skill.md new file mode 100644 index 0000000..446d5e1 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/db-schema.skill.md @@ -0,0 +1,60 @@ +--- +name: db-schema +label: DB 스키마 분석 +description: 데이터베이스 스키마를 분석하여 ERD 다이어그램과 테이블 문서를 생성합니다. +icon: \uE968 +tabs: code +--- + +작업 폴더의 코드에서 데이터베이스 스키마를 분석하고 문서화하세요. + +## 분석 대상 +- ORM 모델/엔티티 클래스 (Entity Framework, SQLAlchemy, Sequelize, JPA 등) +- 마이그레이션 파일 +- SQL DDL 스크립트 (CREATE TABLE) +- 관계 정의 (FK, Navigation Property) + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — 엔티티/모델 클래스 검색 (`DbSet`, `@Entity`, `Model.define`, `CREATE TABLE` 등) +3. `file_read` — 모델 파일 분석 (컬럼, 타입, 관계) +4. `grep_tool` — 인덱스, 제약 조건 검색 +5. `file_write` — 스키마 문서 + Mermaid ERD 생성 + +## 출력 형식 + +### 테이블 문서 +각 테이블에 대해: +``` +## Users 테이블 +| 컬럼 | 타입 | Null | 기본값 | 설명 | +|------|------|------|--------|------| +| Id | int | NO | AUTO_INCREMENT | PK | +| Name | nvarchar(100) | NO | - | 사용자 이름 | +| CreatedAt | datetime | NO | GETDATE() | 생성일 | + +- **인덱스**: IX_Users_Name (Name) +- **관계**: Orders (1:N), Profile (1:1) +``` + +### Mermaid ERD +```mermaid +erDiagram + Users ||--o{ Orders : "has" + Users ||--|| Profile : "has" + Users { + int Id PK + string Name + datetime CreatedAt + } + Orders { + int Id PK + int UserId FK + decimal Amount + } +``` + +## 주의사항 +- 코드에서 실제 확인된 스키마만 문서화하세요. +- 관계(1:1, 1:N, N:M)를 정확히 파악하세요. +- 마이그레이션이 있으면 최종 상태를 기준으로 작성하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/dependency-audit.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/dependency-audit.skill.md new file mode 100644 index 0000000..73dbb2e --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/dependency-audit.skill.md @@ -0,0 +1,85 @@ +--- +name: dependency-audit +label: 의존성 분석 +description: 프로젝트 의존성 그래프를 분석하고 보안 취약점, 라이선스, 업데이트 현황을 보고합니다. +icon: \uE964 +allowed-tools: + - file_read + - grep + - folder_map + - glob + - html_create + - process +tabs: code +--- + +프로젝트의 패키지 의존성을 분석하여 보안, 라이선스, 업데이트 보고서를 생성하세요. + +## 워크플로우 + +1. **패키지 파일 탐지**: glob으로 의존성 파일 검색 + - .NET: `*.csproj`, `packages.config`, `Directory.Build.props` + - Node: `package.json`, `package-lock.json`, `yarn.lock` + - Python: `requirements.txt`, `Pipfile`, `pyproject.toml` + - Java: `pom.xml`, `build.gradle` +2. **의존성 목록 추출**: file_read로 파일 파싱 +3. **분석 수행**: 각 의존성에 대해 검사 +4. **보고서 생성**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 1. 직접 의존성 목록 +| 패키지 | 현재 버전 | 최신 버전 | 업데이트 필요 | +|--------|----------|----------|-------------| +| ... | ... | ... | ✅/⚠/❌ | + +### 2. 보안 취약점 (알려진 패턴) +- 알려진 취약 버전 패턴 탐지 +- 폐기된(deprecated) 패키지 식별 +- 유지보수 중단된 패키지 경고 + +### 3. 라이선스 검사 +| 라이선스 | 호환성 | 패키지 | +|---------|--------|--------| +| MIT | ✅ 허용 | lib-a, lib-b | +| GPL-3.0 | ⚠ 주의 | lib-c | +| 상용 | ❌ 검토 필요 | lib-d | + +### 4. 의존성 크기 분석 +- 패키지별 예상 크기 +- 전체 node_modules / NuGet 캐시 크기 +- 불필요하게 큰 패키지 식별 + +### 5. 중복/충돌 검사 +- 동일 기능 중복 패키지 (예: lodash + underscore) +- 버전 충돌 가능성 + +## 프레임워크별 검사 명령 + +### .NET +``` +dotnet list package --outdated +dotnet list package --vulnerable +``` + +### Node.js +``` +npm audit +npm outdated +``` + +### Python +``` +pip list --outdated +pip-audit +``` + +## 출력 +- HTML 보고서: 위험도별 색상 구분, 차트 포함 +- 요약: 총 패키지 수, 업데이트 필요 수, 보안 이슈 수, 라이선스 경고 수 + +## 규칙 +- 외부 서버 접속 없이 로컬 파일 분석만 수행 +- process 도구 사용 시 `dotnet list` / `npm audit` 등 읽기 전용 명령만 +- 패키지를 직접 업데이트하지 않음 (보고서만) +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/diagram-generator.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/diagram-generator.skill.md new file mode 100644 index 0000000..9d887e0 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/diagram-generator.skill.md @@ -0,0 +1,99 @@ +--- +name: diagram-generator +label: 다이어그램 생성 +description: Python matplotlib/graphviz를 사용하여 플로차트, 시퀀스, ER 다이어그램 등을 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 다이어그램을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib graphviz +``` +시스템에 Graphviz가 설치되어 있어야 합니다 (https://graphviz.org/download/). + +## 작업 절차 +1. **요구사항 파악**: 다이어그램 유형, 노드/관계, 스타일 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립트 실행 +4. **결과 확인**: 생성된 이미지 파일 경로를 사용자에게 안내 + +## 다이어그램 유형별 템플릿 + +### 플로차트 (Graphviz) +```python +from graphviz import Digraph + +dot = Digraph(comment='Flowchart', format='png') +dot.attr(rankdir='TB', fontname='Malgun Gothic') +dot.attr('node', shape='box', style='rounded,filled', fillcolor='#E8F0FE') + +dot.node('start', '시작', shape='ellipse', fillcolor='#34A853', fontcolor='white') +dot.node('process1', '데이터 수집') +dot.node('decision', '조건 확인?', shape='diamond', fillcolor='#FBBC04') +dot.node('process2', '처리') +dot.node('end', '종료', shape='ellipse', fillcolor='#EA4335', fontcolor='white') + +dot.edge('start', 'process1') +dot.edge('process1', 'decision') +dot.edge('decision', 'process2', label='예') +dot.edge('decision', 'end', label='아니오') +dot.edge('process2', 'end') + +dot.render('flowchart', cleanup=True) +``` + +### 시퀀스 다이어그램 (matplotlib) +```python +import matplotlib.pyplot as plt +import matplotlib.patches as patches + +fig, ax = plt.subplots(1, 1, figsize=(10, 8)) +# 액터 라이프라인, 메시지 화살표 등을 matplotlib으로 직접 그리기 +ax.set_xlim(0, 10) +ax.set_ylim(0, 10) +ax.invert_yaxis() +ax.axis('off') +plt.savefig('sequence.png', dpi=150, bbox_inches='tight') +``` + +### ER 다이어그램 (Graphviz) +```python +from graphviz import Graph + +er = Graph('ER', format='png', engine='neato') +er.attr('node', shape='box', style='filled', fillcolor='#E8F0FE') + +er.node('user', 'User\n─────\nid (PK)\nname\nemail') +er.node('order', 'Order\n─────\nid (PK)\nuser_id (FK)\ntotal') + +er.edge('user', 'order', label='1:N') +er.render('er_diagram', cleanup=True) +``` + +### 조직도 (Graphviz) +```python +from graphviz import Digraph + +org = Digraph(format='png') +org.attr(rankdir='TB') +org.attr('node', shape='box', style='rounded,filled', fillcolor='#E3F2FD') + +org.node('ceo', 'CEO') +org.node('cto', 'CTO') +org.node('cfo', 'CFO') +org.edges([('ceo', 'cto'), ('ceo', 'cfo')]) +org.render('org_chart', cleanup=True) +``` + +## 스타일 옵션 +- 폰트: `fontname='Malgun Gothic'` (한글 지원) +- 색상: HTML 컬러 코드 지원 +- 출력 형식: png, svg, pdf +- 레이아웃 엔진: dot(계층), neato(스프링), circo(원형), fdp(포스) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/docx-creator.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/docx-creator.skill.md new file mode 100644 index 0000000..74a62ce --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/docx-creator.skill.md @@ -0,0 +1,97 @@ +--- +name: docx-creator +label: Word 문서 생성 +description: Python을 사용하여 전문적인 Word 문서(.docx)를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE8A5 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 전문적인 Word 문서를 Python으로 생성하세요. + +## 사전 준비 +먼저 python-docx 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx +``` + +## 양식 활용 (템플릿 모드) +작업 폴더에 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.docx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .docx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식 파일의 구조(스타일, 헤더, 섹션)를 먼저 확인 +4. **양식 기반 생성**: + ```python + doc = Document('양식_보고서.docx') # ← 빈 Document() 대신 양식 로드 + # 양식의 스타일, 머리글/바닥글, 로고, 페이지 설정이 자동 상속됨 + # 기존 본문 내용을 지우고 새 내용만 추가 + for paragraph in doc.paragraphs: + paragraph.clear() # 기존 내용 제거 + # 또는 필요에 따라 특정 섹션만 교체 + ``` +5. **양식이 없으면**: 아래 기본 템플릿으로 새 문서 생성 + +## 작업 절차 +1. **요구사항 파악**: 사용자가 원하는 문서의 종류, 구조, 내용을 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .docx 파일이 있는지 확인 +3. **Python 스크립트 작성**: file_write로 .py 파일 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 .docx 파일 경로를 사용자에게 안내 + +## Python 스크립트 템플릿 +```python +from docx import Document +from docx.shared import Inches, Pt, Cm +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.style import WD_STYLE_TYPE +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.docx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 문서 +if template_file: + doc = Document(template_file) + print(f'양식 활용: {template_file}') +else: + doc = Document() + # 스타일 설정 (양식이 없을 때만) + style = doc.styles['Normal'] + font = style.font + font.name = '맑은 고딕' + font.size = Pt(11) + +# 제목 +doc.add_heading('문서 제목', level=0) + +# 본문 +doc.add_paragraph('내용을 여기에 작성합니다.') + +# 표 +table = doc.add_table(rows=2, cols=3) +table.style = 'Light Grid Accent 1' + +# 저장 +doc.save('output.docx') +``` + +## 지원 기능 +- 제목/소제목 계층 구조 +- 표 (스타일, 병합, 서식) +- 이미지 삽입 +- 머리글/바닥글 +- 페이지 번호 +- 목차 +- 글머리 기호/번호 목록 +- **양식 파일 기반 스타일 상속** (로고, 헤더, 페이지 설정 자동 유지) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/email-draft.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/email-draft.skill.md new file mode 100644 index 0000000..62f4e5f --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/email-draft.skill.md @@ -0,0 +1,55 @@ +--- +name: email-draft +label: 비즈니스 이메일 작성 +description: 상황과 톤에 맞는 전문적인 비즈니스 이메일 초안을 생성합니다. +icon: \uE715 +allowed-tools: + - clipboard_tool + - file_write +tabs: all +--- + +사용자의 요청에 맞는 전문적인 비즈니스 이메일을 작성하세요. + +## 워크플로우 + +1. 사용자에게 다음 정보를 확인하세요: + - **수신자**: 이름, 직급, 부서 (알고 있다면) + - **목적**: 요청 / 보고 / 안내 / 감사 / 사과 / 협조 / 초대 / 회신 + - **핵심 내용**: 전달할 주요 메시지 (1~3가지) + - **톤**: 공식(格式) / 반공식 / 친근 + - **언어**: 한국어 / 영어 / 일본어 + +2. 이메일 초안을 작성합니다: + - 적절한 인사말로 시작 + - 핵심 내용은 **굵게** 강조 + - 요청 사항은 명확하고 구체적으로 + - 마무리 인사와 서명 포함 + +3. 사용자에게 초안을 보여주고 수정 요청을 받습니다. + +4. 최종본을 clipboard_tool로 클립보드에 복사합니다. + +## 이메일 구조 + +``` +제목: [간결하고 명확한 제목] + +[수신자] 님께, + +[인사말] + +[본문 - 목적과 핵심 내용] + +[요청 사항 또는 다음 단계] + +[마무리 인사] + +[서명] +``` + +## 규칙 +- 한 문단은 3~4문장을 넘지 않도록 간결하게 +- 수동적 표현보다 능동적 표현 선호 +- 약어는 처음 사용 시 풀어 쓰기 +- 긴급도에 따라 제목에 [긴급], [참고] 등 태그 사용 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/env-setup.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/env-setup.skill.md new file mode 100644 index 0000000..f1b397e --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/env-setup.skill.md @@ -0,0 +1,152 @@ +--- +name: env-setup +label: 프로젝트 환경 설정 +description: .gitignore, requirements.txt, .editorconfig 등 프로젝트 환경 설정 파일을 자동 생성합니다. +icon: \uE835 +tabs: code +allowed-tools: + - folder_map + - file_read + - file_write + - process_run +--- + +프로젝트 유형에 맞는 환경 설정 파일을 자동으로 생성하세요. + +## 작업 절차 + +1. **프로젝트 분석**: folder_map으로 프로젝트 구조를 파악하고 유형 판별 + - `.py` 파일 → Python 프로젝트 + - `package.json` 또는 `.js/.ts` 파일 → Node.js 프로젝트 + - `.csproj` 또는 `.sln` 파일 → .NET 프로젝트 + - `pom.xml` 또는 `.java` 파일 → Java 프로젝트 + - 복합 프로젝트인 경우 모든 유형을 병합 +2. **기존 설정 확인**: 이미 존재하는 설정 파일이 있는지 확인 + - 있으면: 내용을 분석하여 누락된 항목만 추가 제안 + - 없으면: 새로 생성 +3. **생성할 파일 목록 제안**: 사용자에게 생성할 파일 목록을 보여주고 확인 +4. **파일 생성**: file_write로 각 설정 파일 생성 +5. **결과 안내**: 생성된 파일 목록과 주요 설정 내용 요약 + +## 프로젝트별 템플릿 + +### Python 프로젝트 +생성 파일: `.gitignore`, `requirements.txt`, `.editorconfig`, `setup.cfg`, `.flake8` + +**.gitignore (Python)**: +``` +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +venv/ +.venv/ +*.egg-info/ +dist/ +build/ +.eggs/ +*.egg +.mypy_cache/ +.pytest_cache/ +.coverage +htmlcov/ +.env +.idea/ +.vscode/ +*.log +``` + +**requirements.txt**: 프로젝트에서 import 문을 스캔하여 자동 생성 + +### Node.js 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `.nvmrc`, `.prettierrc` + +**.gitignore (Node)**: +``` +node_modules/ +dist/ +build/ +.env +.env.local +*.log +npm-debug.log* +.DS_Store +coverage/ +.nyc_output/ +.idea/ +.vscode/ +*.tgz +``` + +### .NET 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `Directory.Build.props` + +**.gitignore (.NET)**: +``` +bin/ +obj/ +.vs/ +*.user +*.suo +*.cache +packages/ +*.nupkg +TestResults/ +.idea/ +*.DotSettings.user +``` + +### Java 프로젝트 +생성 파일: `.gitignore`, `.editorconfig` + +**.gitignore (Java)**: +``` +*.class +*.jar +*.war +*.ear +target/ +.gradle/ +build/ +.idea/ +*.iml +.settings/ +.classpath +.project +out/ +``` + +## 공통 .editorconfig +```ini +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[*.{json,js,ts,jsx,tsx}] +indent_size = 2 + +[Makefile] +indent_style = tab +``` + +## 규칙 +- 기존 설정 파일이 있으면 덮어쓰지 않고, 누락 항목만 제안 +- .env 파일은 생성하지 않음 (보안 — 사용자가 직접 생성) +- 생성 전 파일 목록을 반드시 사용자에게 확인 +- 프로젝트 루트에 생성 (하위 폴더에 생성하지 않음) + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/gen-test.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/gen-test.skill.md new file mode 100644 index 0000000..ede8c8d --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/gen-test.skill.md @@ -0,0 +1,63 @@ +--- +name: gen-test +label: 테스트 생성기 +description: 지정 파일의 단위 테스트를 자동 생성하고 실행하여 커버리지를 분석합니다. +icon: \uE9D5 +allowed-tools: + - file_read + - file_write + - test_loop + - grep + - folder_map + - dev_env_detect + - build_run +tabs: code +--- + +지정된 소스 파일의 단위 테스트를 자동 생성하고 실행하세요. + +## 워크플로우 + +1. **환경 감지**: dev_env_detect로 프로젝트 타입, 테스트 프레임워크 확인 +2. **대상 분석**: file_read로 테스트 대상 파일 분석 + - 공개 메서드/함수 목록 추출 + - 메서드별 입출력 타입 파악 + - 의존성 확인 (Mock 필요 여부) +3. **테스트 생성**: 각 메서드에 대해 테스트 케이스 작성 + - 정상 케이스 (Happy Path) + - 경계값 (Boundary) + - 예외/에러 케이스 + - null/empty 입력 +4. **실행 및 검증**: test_loop으로 테스트 실행 +5. **결과 보고**: 성공/실패 요약, 커버리지 추정 + +## 테스트 작성 원칙 + +### 명명 규칙 +- C#: `[메서드명]_[시나리오]_[기대결과]` +- Python: `test_[메서드명]_[시나리오]` +- JavaScript: `should [기대 동작] when [조건]` + +### 테스트 구조 (AAA 패턴) +``` +Arrange — 테스트 데이터 준비 +Act — 대상 메서드 실행 +Assert — 결과 검증 +``` + +### 프레임워크별 지원 +- C#: xUnit, NUnit, MSTest +- Python: pytest, unittest +- JavaScript: Jest, Mocha, Vitest +- Java: JUnit 5 + +## 출력 +- 테스트 파일 생성 (프로젝트 컨벤션에 맞는 위치) +- 테스트 실행 결과 요약 +- 커버리지 추정 (메서드별 테스트 유무) + +## 규칙 +- 기존 테스트가 있으면 스타일을 따르기 +- 외부 의존성은 Mock/Stub 사용 +- 테스트 간 독립성 보장 (상태 공유 금지) +- 한국어 주석으로 테스트 의도 설명 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/image-processor.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/image-processor.skill.md new file mode 100644 index 0000000..86c6c31 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/image-processor.skill.md @@ -0,0 +1,75 @@ +--- +name: image-processor +label: 이미지 처리 +description: Python Pillow를 사용하여 이미지 리사이즈, 크롭, 워터마크, 포맷 변환을 수행합니다. +icon: \uEB9F +requires: python +tabs: cowork +--- + +사용자의 요구에 맞게 이미지를 처리하세요. + +## 사전 준비 +먼저 Pillow 패키지가 설치되어 있��지 확인하고, 없으면 설���하세요: +``` +process_run: pip install Pillow +``` + +## 작업 절�� +1. **요구사항 파악**: 처리할 이미지 파일과 원하는 작업 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립�� 실행 +4. **결과 확인**: 처리된 이미지 파일 경로를 사용자에게 안내 + +## 지원 기능 + +### 리사이즈 +```python +from PIL import Image +img = Image.open('input.png') +img_resized = img.resize((800, 600)) # 고정 크기 +# 또는 비율 유지 +img.thumbnail((800, 800)) +img.save('output.png') +``` + +### 크롭 +```python +img = Image.open('input.png') +cropped = img.crop((left, top, right, bottom)) +cropped.save('output.png') +``` + +### 워터마크 +```python +from PIL import Image, ImageDraw, ImageFont +img = Image.open('input.png') +draw = ImageDraw.Draw(img) +draw.text((10, 10), "Watermark", fill=(255, 255, 255, 128)) +img.save('output.png') +``` + +### 포맷 변환 +```python +img = Image.open('input.png') +img.save('output.jpg', 'JPEG', quality=85) +img.save('output.webp', 'WEBP', quality=80) +``` + +### 배치 처리 +```python +import glob +for path in glob.glob('*.png'): + img = Image.open(path) + img.thumbnail((800, 800)) + img.save(f'resized_{path}') +``` + +## 추가 기능 +- 회전/뒤집기 (rotate, transpose) +- 밝기/대비/선명도 조절 (ImageEnhance) +- 필터 적용 (ImageFilter: BLUR, SHARPEN, CONTOUR) +- 이미지 합성 (Image.paste, Image.alpha_composite) +- EXIF 정보 읽기 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/impact.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/impact.skill.md new file mode 100644 index 0000000..1b0d56b --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/impact.skill.md @@ -0,0 +1,67 @@ +--- +name: impact +label: 변경 영향 분석 +description: 코드 변경 시 영향받는 파일, 함수, 테스트를 식별합니다. +icon: \uE946 +allowed-tools: + - lsp_code_intel + - grep + - search_codebase + - git_tool + - file_read + - folder_map +tabs: code +--- + +코드 변경이 미치는 영향 범위를 분석하여 안전한 수정을 도와주세요. + +## 워크플로우 + +1. **변경 대상 확인**: 어떤 파일/함수/클래스를 변경할 예정인지 파악 +2. **직접 참조 분석**: lsp_code_intel의 find_references로 직접 호출처 확인 +3. **간접 영향 분석**: + - grep으로 문자열 기반 참조 검색 + - search_codebase로 의미적 유사 코드 탐색 + - 상속/인터페이스 체인 추적 +4. **테스트 영향**: 관련 테스트 파일 식별 +5. **위험도 평가**: 변경 영향 범위와 위험도 매트릭스 생성 +6. **보고서 작성**: 영향 분석 보고서 생성 + +## 분석 항목 + +### 직접 영향 +- 해당 함수/클래스를 직접 호출하는 코드 +- import/using 하는 파일 +- 상속받는 클래스 + +### 간접 영향 +- 인터페이스 구현체를 통한 호출 +- 리플렉션/동적 호출 +- 설정 파일 참조 +- UI 바인딩 + +### 테스트 영향 +- 직접 테스트하는 테스트 파일 +- 관련 통합 테스트 +- 테스트 더블(Mock) 대상 여부 + +## 출력 형식 + +### 영향 분석 보고서 + +| 영향 수준 | 파일 | 관련 함수 | 위험도 | 비고 | +|----------|------|----------|--------|------| +| 🔴 직접 | A.cs | MethodX() | 높음 | 시그니처 변경 시 컴파일 오류 | +| 🟡 간접 | B.cs | MethodY() | 중간 | 동적 호출, 런타임 오류 가능 | +| 🟢 테스트 | A.Tests.cs | Test1() | 낮음 | 테스트 수정 필요 | + +### 변경 체크리스트 +- [ ] 직접 참조 N개 확인 및 수정 +- [ ] 테스트 M개 업데이트 +- [ ] 관련 문서 갱신 + +## 규칙 +- 코드를 직접 수정하지 않음 (분석만 수행) +- 가능하면 LSP 기반 정확한 참조 분석 우선 +- LSP 불가 시 grep 기반 텍스트 검색으로 대체 +- 위험도는 보수적으로 평가 (의심스러우면 높음) diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/json-schema.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/json-schema.skill.md new file mode 100644 index 0000000..821dbf4 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/json-schema.skill.md @@ -0,0 +1,107 @@ +--- +name: json-schema +label: JSON/YAML 스키마 도구 +description: JSON 또는 YAML 데이터에서 스키마를 생성하고, 데이터의 유효성을 검증합니다. +icon: \uE943 +tabs: code +allowed-tools: + - json_tool + - file_read + - file_write + - clipboard_tool +--- + +JSON/YAML 샘플 데이터에서 스키마를 추출하거나, 기존 스키마로 데이터를 검증하세요. + +## 작업 절차 + +1. **요청 유형 판별**: + - **스키마 생성**: 샘플 JSON/YAML → JSON Schema 추출 + - **스키마 검증**: 데이터 + 스키마 → 유효성 검사 + - **스키마 문서화**: 기존 스키마 → 사람이 읽을 수 있는 설명 생성 +2. **입력 데이터 확인**: file_read 또는 사용자 입력으로 데이터 로드 +3. **스키마 생성 또는 검증 수행**: json_tool로 처리 +4. **결과 출력**: 생성된 스키마 또는 검증 결과를 표시 +5. **파일 저장**: file_write로 결과를 저장하거나 clipboard_tool로 복사 + +## 스키마 생성 규칙 + +### 타입 추론 +| JSON 값 | JSON Schema 타입 | 추가 속성 | +|---------|-----------------|----------| +| `"text"` | `string` | — | +| `123` | `integer` | — | +| `1.5` | `number` | — | +| `true` | `boolean` | — | +| `null` | `null` | nullable 처리 | +| `[]` | `array` | items 스키마 | +| `{}` | `object` | properties 스키마 | + +### 추론 강화 +- **패턴 감지**: 이메일, URL, 날짜, UUID 등은 `format` 속성 추가 +- **열거형 감지**: 값의 종류가 적으면 `enum` 으로 제안 +- **필수 필드**: 모든 샘플에 존재하는 필드는 `required`로 표시 +- **배열 항목**: 배열 내 모든 항목을 분석하여 통합 스키마 생성 + +### 출력 형식 (JSON Schema Draft 7) +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "사용자 정보", + "description": "사용자 프로필 데이터 스키마", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "사용자 이름" + }, + "email": { + "type": "string", + "format": "email", + "description": "이메일 주소" + }, + "age": { + "type": "integer", + "minimum": 0, + "maximum": 150, + "description": "나이" + } + }, + "required": ["name", "email"], + "additionalProperties": false +} +``` + +## 검증 결과 형식 +검증 결과는 다음과 같이 표시하세요: +``` +검증 결과: ❌ 실패 (3건의 오류) + +| # | 경로 | 오류 | 기대값 | +|---|------|------|--------| +| 1 | $.email | 필수 필드 누락 | string (required) | +| 2 | $.age | 타입 불일치 | integer (실제: string) | +| 3 | $.tags[2] | 열거형 불일치 | "A", "B", "C" 중 하나 | +``` + +## 스키마 문서화 형식 +기존 스키마를 분석하여 사람이 읽기 쉬운 문서를 생성: +``` +## 사용자 정보 스키마 + +| 필드 | 타입 | 필수 | 설명 | 제약 조건 | +|------|------|------|------|----------| +| name | string | ✅ | 사용자 이름 | — | +| email | string | ✅ | 이메일 주소 | format: email | +| age | integer | — | 나이 | 0~150 | +| tags | array | — | 태그 목록 | items: string | +``` + +## 규칙 +- JSON Schema Draft 7 형식 사용 +- 스키마 생성 시 description 필드를 한국어로 작성 +- 복수 샘플이 제공되면 모든 샘플을 분석하여 통합 스키마 생성 +- 중첩 객체는 재귀적으로 스키마 추출 +- 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/log-analyze.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/log-analyze.skill.md new file mode 100644 index 0000000..0ac33d9 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/log-analyze.skill.md @@ -0,0 +1,69 @@ +--- +name: log-analyze +label: 로그 분석기 +description: 로그 파일의 패턴을 분석하고 에러를 요약하며 타임라인을 시각화합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - chart_create + - html_create + - data_pivot + - text_summarize +tabs: cowork +--- + +로그 파일을 분석하여 패턴, 에러, 추세를 파악하고 보고서를 생성하세요. + +## 워크플로우 + +1. **로그 파일 로드**: file_read로 로그 파일 읽기 +2. **패턴 분석**: + - grep으로 에러/경고/예외 패턴 검색 + - 시간대별 이벤트 빈도 파악 + - 반복되는 에러 패턴 식별 +3. **통계 생성**: data_pivot으로 집계 +4. **시각화**: chart_create로 타임라인 차트 생성 +5. **보고서**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 에러 분석 +- ERROR, WARN, FATAL, Exception 키워드 추출 +- 에러 유형별 발생 빈도 +- 최초 발생 시점 및 최근 발생 시점 +- 에러 메시지 클러스터링 (유사 에러 그룹화) + +### 시간대 분석 +- 시간대별 로그 발생 빈도 +- 피크 시간대 식별 +- 에러 집중 시간대 + +### 패턴 분석 +- 반복 패턴 (주기적 에러) +- 연쇄 에러 (A 에러 후 B 에러 발생 패턴) +- 비정상 패턴 (평소와 다른 로그량) + +## 출력 형식 + +``` +## 로그 분석 보고서 +- 분석 기간: [시작] ~ [끝] +- 총 로그: N줄 + +### 에러 요약 (상위 10건) +| 순위 | 에러 유형 | 발생 횟수 | 최근 발생 | +|------|----------|----------|----------| + +### 타임라인 차트 +[시간대별 이벤트 빈도 차트] + +### 상세 분석 +[에러별 상세 내용 및 권장 조치] +``` + +## 지원 로그 형식 +- 일반 텍스트 로그 (타임스탬프 자동 감지) +- JSON 로그 (각 줄이 JSON 객체) +- CSV 로그 (헤더 포함) +- syslog 형식 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/markdown-to-doc.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/markdown-to-doc.skill.md new file mode 100644 index 0000000..7a852d8 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/markdown-to-doc.skill.md @@ -0,0 +1,164 @@ +--- +name: markdown-to-doc +label: Markdown → 문서 변환 +description: Markdown 파일을 서식이 적용된 Word(.docx) 또는 PDF 문서로 변환합니다. +icon: \uE8A5 +tabs: cowork +requires: python +--- + +Markdown 파일을 전문적인 Word 또는 PDF 문서로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx markdown +``` + +## 작업 절차 + +1. **Markdown 파일 확인**: file_read로 변환할 Markdown 파일의 내용과 구조를 파악 +2. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 출력 형식: Word(.docx) 또는 PDF + - 폰트: 맑은 고딕 (기본) / 사용자 지정 + - 여백, 페이지 크기 설정 + - 머리글/바닥글 포함 여부 +3. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 문서 파일 경로와 페이지 수를 안내 + +## 스타일 매핑 + +| Markdown | Word 스타일 | 설명 | +|----------|------------|------| +| `# 제목` | Heading 1 | 16pt, 굵게 | +| `## 소제목` | Heading 2 | 14pt, 굵게 | +| `### 항목` | Heading 3 | 12pt, 굵게 | +| 본문 텍스트 | Normal | 11pt | +| `**굵게**` | Bold run | 굵게 | +| `*기울임*` | Italic run | 기울임 | +| `` `코드` `` | 코드 스타일 | Consolas, 배경색 | +| `> 인용` | Quote | 들여쓰기 + 왼쪽 테두리 | +| `- 목록` | List Bullet | 글머리 기호 | +| `1. 번호` | List Number | 번호 목록 | +| 표 | Table Grid | 테두리 표 | +| `---` | 페이지 구분 | 가로선 → 페이지 나누기 | +| 코드 블록 | 코드 단락 | Consolas, 회색 배경 | + +## Python 스크립트 템플릿 +```python +import re +from docx import Document +from docx.shared import Inches, Pt, Cm, RGBColor +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.oxml.ns import qn +import markdown + +# Markdown 파일 읽기 +with open('input.md', 'r', encoding='utf-8') as f: + md_content = f.read() + +doc = Document() + +# 기본 스타일 설정 +style = doc.styles['Normal'] +font = style.font +font.name = '맑은 고딕' +font.size = Pt(11) +style.element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕') + +# 여백 설정 +for section in doc.sections: + section.top_margin = Cm(2.54) + section.bottom_margin = Cm(2.54) + section.left_margin = Cm(3.17) + section.right_margin = Cm(3.17) + +# Markdown 파싱 및 변환 +lines = md_content.split('\n') +i = 0 +while i < len(lines): + line = lines[i] + + # 제목 (Heading) + if line.startswith('#'): + level = len(line) - len(line.lstrip('#')) + text = line.lstrip('#').strip() + doc.add_heading(text, level=min(level, 4)) + + # 코드 블록 + elif line.startswith('```'): + code_lines = [] + i += 1 + while i < len(lines) and not lines[i].startswith('```'): + code_lines.append(lines[i]) + i += 1 + p = doc.add_paragraph() + run = p.add_run('\n'.join(code_lines)) + run.font.name = 'Consolas' + run.font.size = Pt(9) + + # 인용 + elif line.startswith('>'): + text = line.lstrip('>').strip() + p = doc.add_paragraph(text) + p.paragraph_format.left_indent = Cm(1.27) + + # 글머리 기호 + elif line.startswith('- ') or line.startswith('* '): + text = line[2:].strip() + doc.add_paragraph(text, style='List Bullet') + + # 번호 목록 + elif re.match(r'^\d+\.\s', line): + text = re.sub(r'^\d+\.\s', '', line).strip() + doc.add_paragraph(text, style='List Number') + + # 가로선 → 페이지 나누기 + elif line.strip() in ('---', '***', '___'): + doc.add_page_break() + + # 빈 줄 + elif line.strip() == '': + pass + + # 일반 텍스트 + else: + p = doc.add_paragraph() + # 굵게, 기울임 처리 + parts = re.split(r'(\*\*.*?\*\*|\*.*?\*|`.*?`)', line) + for part in parts: + if part.startswith('**') and part.endswith('**'): + run = p.add_run(part[2:-2]) + run.bold = True + elif part.startswith('*') and part.endswith('*'): + run = p.add_run(part[1:-1]) + run.italic = True + elif part.startswith('`') and part.endswith('`'): + run = p.add_run(part[1:-1]) + run.font.name = 'Consolas' + run.font.size = Pt(10) + else: + p.add_run(part) + + i += 1 + +# 저장 +doc.save('output.docx') +print(f'변환 완료: output.docx ({len(doc.paragraphs)}개 단락)') +``` + +## 표 변환 +Markdown 표가 있으면 Word 표로 변환합니다: +- 헤더 행: 굵게, 배경색 적용 +- 셀 정렬: Markdown의 `:---`, `:---:`, `---:` 구문 반영 +- 테두리: 전체 셀에 얇은 테두리 + +## 규칙 +- 원본 Markdown 파일은 수정하지 않음 +- 인코딩: UTF-8 기본 +- 이미지 링크(`![](path)`)는 로컬 파일이면 삽입, URL이면 경로만 표시 +- 복잡한 Markdown(수식, 다이어그램)은 지원 범위와 한계를 안내 +- 출력 파일명: 원본 파일명 기준 (.md → .docx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/meeting-minutes.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/meeting-minutes.skill.md new file mode 100644 index 0000000..e3ec988 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/meeting-minutes.skill.md @@ -0,0 +1,40 @@ +--- +name: meeting-minutes +label: 회의록 정리 +description: 회의 내용을 체계적으로 정리하여 회의록을 생성합니다. +icon: \uE771 +tabs: cowork +--- + +사용자가 제공한 회의 내용(텍스트, 메모, 파일)을 정리하여 체계적인 회의록을 작성하세요. + +다음 도구를 사용하세요: +1. file_read — 회의 관련 파일 읽기 (필요 시) +2. file_write — 회의록 파일 생성 + +회의록 형식: +## 회의 정보 +- 일시: +- 참석자: +- 장소/방법: +- 주제: + +## 안건 및 논의 내용 +각 안건별로: +- **안건**: 주제 +- **논의 내용**: 주요 발언 및 의견 정리 +- **결정 사항**: 합의된 내용 + +## 액션 아이템 +| 번호 | 담당자 | 내용 | 기한 | 비고 | +|------|--------|------|------|------| +| 1 | - | - | - | - | + +## 다음 회의 +- 예정일: +- 주요 안건: + +규칙: +- 핵심 내용 위주로 간결하게 정리 +- 결정 사항과 액션 아이템은 명확하게 기술 +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/ocr-extract.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/ocr-extract.skill.md new file mode 100644 index 0000000..8c7e71d --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/ocr-extract.skill.md @@ -0,0 +1,108 @@ +--- +name: ocr-extract +label: OCR 텍스트 추출 +description: Python pytesseract를 사용하여 이미지/스캔 문서에서 텍스트를 추출합니다. +icon: \uE8D4 +requires: python +tabs: cowork +--- + +이미지 또는 스캔된 문서에서 텍스트를 추출하세요. + +## 사전 준비 +1. Tesseract OCR 엔진이 시스템에 설치되어 있어야 합니다. + - Windows: https://github.com/UB-Mannheim/tesseract/wiki 에서 설치 + - 한국어 지원: 설치 시 "Korean" 언어 데이터 선택 +2. Python 패키지 설치: +``` +process_run: pip install pytesseract Pillow +``` + +## 작업 절차 +1. **이미지 확인**: 사용자가 제공한 이미지 파일 확인 +2. **전처리 (선택)**: 이미지 품질이 낮으면 전처리 스크립트 적용 +3. **OCR 실행**: pytesseract로 텍스트 추출 +4. **결과 저장**: 추출된 텍스트를 파일로 저장하고 사용자에게 안내 + +## OCR 스크립트 템플릿 + +### 기본 텍스트 추출 +```python +import pytesseract +from PIL import Image + +# Windows에서 Tesseract 경로 지정 (필요 시) +# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' + +img = Image.open('scan.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +print(text) + +with open('extracted.txt', 'w', encoding='utf-8') as f: + f.write(text) +``` + +### 이미지 전처리 (품질 개선) +```python +from PIL import Image, ImageFilter, ImageEnhance + +img = Image.open('scan.png') + +# 그레이스케일 변환 +img = img.convert('L') + +# 대비 향상 +enhancer = ImageEnhance.Contrast(img) +img = enhancer.enhance(2.0) + +# 선명도 향상 +img = img.filter(ImageFilter.SHARPEN) + +# 이진화 (흑백) +threshold = 128 +img = img.point(lambda x: 255 if x > threshold else 0) + +img.save('preprocessed.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +``` + +### 배치 OCR (여러 이미지) +```python +import glob +import pytesseract +from PIL import Image + +results = [] +for path in sorted(glob.glob('*.png')): + img = Image.open(path) + text = pytesseract.image_to_string(img, lang='kor+eng') + results.append(f'--- {path} ---\n{text}\n') + +with open('all_extracted.txt', 'w', encoding='utf-8') as f: + f.write('\n'.join(results)) +``` + +### 표 영역 추출 +```python +import pytesseract +from PIL import Image + +img = Image.open('table.png') +# TSV 형식으로 추출 (표 구조 보존) +tsv_data = pytesseract.image_to_data(img, lang='kor+eng', output_type=pytesseract.Output.DATAFRAME) +print(tsv_data) +``` + +## 지원 언어 +- `kor` — 한국어 +- `eng` — 영어 +- `kor+eng` — 한국어+영어 혼합 (권장) +- `jpn` — 일본어 +- `chi_sim` — 중국어 간체 + +## 팁 +- 스캔 해상도 300dpi 이상이면 인식률이 높습니다 +- 기울어진 이미지는 `img.rotate()` 로 보정 후 추출하세요 +- 손글씨는 인식률이 낮을 수 있습니다 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/paper-review.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/paper-review.skill.md new file mode 100644 index 0000000..72b558c --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/paper-review.skill.md @@ -0,0 +1,54 @@ +--- +name: paper-review +label: 논문 분석 +description: 논문 또는 기술 문서를 체계적으로 분석하고 핵심 내용을 정리합니다. +icon: \uE736 +tabs: cowork +--- + +사용자가 제공한 논문 또는 기술 문서를 체계적으로 분석하세요. + +## 파일 읽기 전략 +- **PDF 파일**: 반드시 `document_read` 도구를 사용하세요. 페이지 범위 지정이 가능합니다. + - 먼저 전체 페이지 수를 확인한 후, 초록(1-2페이지)→본문→참고문헌 순으로 읽으세요. + - `file_read`로 PDF를 읽으면 텍스트가 깨질 수 있으므로 사용하지 마세요. +- **텍스트 파일** (.txt, .md, .html 등): `file_read` 도구를 사용하세요. + +## 사용 도구 +1. document_read — PDF 논문 파일 읽기 (페이지 범위 지정, 초록/참고문헌 추출) +2. file_read — 텍스트 기반 문서 파일 읽기 +3. file_write — 분석 보고서 생성 + +## 분석 항목 +## 논문 개요 +- 제목, 저자, 발표 연도/학회 +- 연구 분야 및 키워드 + +## 연구 목적 및 배경 +- 연구 문제 정의 +- 기존 연구의 한계점 + +## 방법론 +- 제안 방법의 핵심 아이디어 +- 실험 설계 및 데이터셋 + +## 주요 결과 +- 핵심 실험 결과 (표/수치 인용) +- 기존 방법 대비 개선점 + +## 한계점 및 향후 연구 +- 저자가 인정한 한계 +- 발전 가능성 + +## 실무 적용 가능성 +- 우리 업무에 적용할 수 있는 포인트 +- 기술 도입 시 고려사항 + +## 작업 절차 +1. 사용자가 파일명을 언급하면 작업 폴더에서 해당 파일을 찾아 읽기 +2. PDF인 경우 `document_read`로 초록(1-2p) 먼저 읽어 전체 구조 파악 +3. 본문을 페이지 범위별로 나누어 순차 읽기 +4. 위 분석 항목에 따라 체계적으로 정리 +5. `file_write`로 분석 보고서를 마크다운 파일로 저장 + +한국어로 작성하고, 전문 용어는 원문과 함께 표기하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/pdf-processor.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/pdf-processor.skill.md new file mode 100644 index 0000000..4076e47 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/pdf-processor.skill.md @@ -0,0 +1,63 @@ +--- +name: pdf-processor +label: PDF 처리 +description: Python을 사용하여 PDF에서 텍스트/표를 추출하거나 PDF를 생성합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +PDF 파일을 읽거나 새 PDF를 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pypdf pdfplumber reportlab +``` + +## 작업 절차 + +### PDF 텍스트 추출 +1. **파일 확인**: folder_map으로 PDF 파일 위치 확인 +2. **추출 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행**: process_run으로 실행 +4. **결과 전달**: 추출된 텍스트를 사용자에게 전달 + +### PDF 생성 +1. **내용 파악**: 사용자가 원하는 문서 내용 확인 +2. **생성 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행 및 확인**: process_run으로 실행 + +## 텍스트 추출 템플릿 +```python +import pdfplumber +import json + +results = [] +with pdfplumber.open('input.pdf') as pdf: + for i, page in enumerate(pdf.pages): + text = page.extract_text() or '' + tables = page.extract_tables() or [] + results.append({ + 'page': i + 1, + 'text': text, + 'tables': tables, + }) + +with open('pdf_extracted.json', 'w', encoding='utf-8') as f: + json.dump(results, f, ensure_ascii=False, indent=2) + +for r in results: + print(f"--- 페이지 {r['page']} ---") + print(r['text'][:500]) +``` + +## 지원 기능 +- 텍스트 추출 (페이지별) +- 표 추출 (구조 보존) +- PDF 병합 / 분할 +- PDF 생성 (reportlab) +- 페이지 회전 +- 메타데이터 읽기 + +한국어로 안내하세요. 원본 PDF는 수정하지 마세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/perf-audit.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/perf-audit.skill.md new file mode 100644 index 0000000..9db18d8 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/perf-audit.skill.md @@ -0,0 +1,94 @@ +--- +name: perf-audit +label: 성능 감사 +description: 코드 복잡도, 성능 병목, 메모리 이슈를 분석하고 최적화 방안을 제시합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - glob + - html_create +tabs: code +--- + +코드베이스의 성능 관련 이슈를 분석하고 최적화 보고서를 생성하세요. + +## 워크플로우 + +1. **프로젝트 분석**: folder_map으로 구조 파악, 언어/프레임워크 식별 +2. **복잡도 분석**: 파일별 줄 수, 메서드 크기, 중첩 깊이 측정 +3. **성능 안티패턴 탐지**: grep으로 알려진 성능 이슈 패턴 검색 +4. **메모리 이슈 탐지**: 리소스 해제 누락, 대용량 할당 패턴 +5. **보고서 생성**: html_create로 성능 감사 보고서 + +## 분석 항목 + +### 코드 복잡도 지표 +- **파일 크기**: 500줄 이상 파일 식별 +- **메서드 크기**: 50줄 이상 메서드 식별 +- **중첩 깊이**: 4단계 이상 들여쓰기 +- **매개변수 수**: 5개 이상 파라미터 메서드 + +### 성능 안티패턴 + +#### 데이터베이스 +- N+1 쿼리 패턴 (루프 내 DB 호출) +- SELECT * 사용 (불필요한 컬럼 로드) +- 인덱스 미사용 쿼리 힌트 + +#### 메모리 +- IDisposable 미해제 (using 미사용) +- 대용량 문자열 결합 (StringBuilder 미사용) +- 정적 컬렉션 무한 증가 +- 이벤트 핸들러 미해제 (메모리 누수) + +#### I/O +- 동기 파일 I/O (async 미사용) +- 동기 네트워크 호출 +- 불필요한 직렬화/역직렬화 + +#### 알고리즘 +- O(n²) 이상 루프 (중첩 foreach/for) +- 반복 계산 (캐싱 미적용) +- LINQ 체인의 불필요한 ToList() + +#### 프론트엔드 +- 불필요한 리렌더링 패턴 +- 대용량 번들 임포트 +- 이미지 최적화 미적용 + +### .NET 전용 패턴 +``` +탐지 대상: +- Task.Result / .Wait() (데드락 위험) +- lock 내부 async 호출 +- GC.Collect() 직접 호출 +- Reflection 반복 사용 +- string + string 반복 (루프 내) +``` + +## 출력 형식 + +### 성능 감사 보고서 + +**요약 대시보드** +| 지표 | 값 | 상태 | +|------|-----|------| +| 총 파일 수 | ... | — | +| 대형 파일 (500줄+) | ... | ⚠ | +| 대형 메서드 (50줄+) | ... | ⚠ | +| 성능 안티패턴 | ... | 🔴 | +| 메모리 이슈 | ... | 🟡 | + +**상세 이슈 목록** +| 우선순위 | 파일 | 라인 | 이슈 | 영향 | 권장 조치 | +|---------|------|------|------|------|----------| +| 🔴 높음 | ... | ... | N+1 쿼리 | 응답 지연 | 일괄 로드 | + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 성능 이슈는 영향도와 수정 난이도를 함께 평가 +- 추측보다 패턴 기반 탐지 우선 +- 한국어로 작성 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/pptx-creator.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/pptx-creator.skill.md new file mode 100644 index 0000000..eeea93c --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/pptx-creator.skill.md @@ -0,0 +1,111 @@ +--- +name: pptx-creator +label: PPT 프레젠테이션 생성 +description: Python을 사용하여 전문적인 PowerPoint 프레젠테이션을 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE7BE +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 PowerPoint 프레젠테이션을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install python-pptx +``` + +## 양식 활용 (마스터 슬라이드 템플릿) +작업 폴더에 PPT 양식이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.pptx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .pptx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식의 슬라이드 레이아웃 목록 확인 +4. **양식 기반 생성**: + ```python + prs = Presentation('양식_발표.pptx') + # 마스터 슬라이드의 배경, 로고, 색 테마, 폰트가 자동 상속 + # 기존 슬라이드 제거 후 새 내용 추가 + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + ``` +5. **레이아웃 확인** (양식마다 다를 수 있음): + ```python + for i, layout in enumerate(prs.slide_layouts): + print(f'{i}: {layout.name}') + ``` +6. **양식이 없으면**: 아래 기본 템플릿으로 새 프레젠테이션 생성 + +## 작업 절차 +1. **요구사항 파악**: 발표 주제, 슬라이드 수, 스타일 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .pptx 파일이 있는지 확인 +3. **스크립트 작성**: file_write로 Python 스크립트 생성 +4. **실행**: process_run으로 스크립트 실행 +5. **결과 안내**: 생성된 .pptx 파일 경로를 사용자에게 전달 + +## 스크립트 템플릿 +```python +from pptx import Presentation +from pptx.util import Inches, Pt, Emu +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.pptx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 프레젠테이션 +if template_file: + prs = Presentation(template_file) + # 기존 슬라이드 제거 (마스터/레이아웃은 유지) + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + print(f'양식 활용: {template_file}') + print(f'사용 가능한 레이아웃: {[l.name for l in prs.slide_layouts]}') +else: + prs = Presentation() + prs.slide_width = Inches(13.333) + prs.slide_height = Inches(7.5) + +# 제목 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[0]) +slide.shapes.title.text = '프레젠테이션 제목' +if len(slide.placeholders) > 1: + slide.placeholders[1].text = '부제목' + +# 내용 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[1]) +slide.shapes.title.text = '섹션 제목' +body = slide.placeholders[1] +body.text = '첫 번째 포인트' +p = body.text_frame.add_paragraph() +p.text = '두 번째 포인트' + +prs.save('presentation.pptx') +print('프레젠테이션 생성 완료: presentation.pptx') +``` + +## 지원 기능 +- 제목/내용/빈 슬라이드 레이아웃 +- 텍스트 서식 (글꼴, 크기, 색상, 정렬) +- 표 삽입 +- 이미지 삽입 +- 도형 (사각형, 원, 화살표) +- 차트 (막대, 선, 원형) +- 슬라이드 번호 +- 마스터 슬라이드 커스터마이징 +- **양식 파일 기반 마스터/레이아웃 상속** (배경, 로고, 색 테마, 폰트 자동 유지) + +한국어로 안내하세요. 작업 폴더에 결과 파일을 저장하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/prd-generator.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/prd-generator.skill.md new file mode 100644 index 0000000..8236401 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/prd-generator.skill.md @@ -0,0 +1,100 @@ +--- +name: prd-generator +label: 요구사항 정의서 (PRD) +description: 제품 요구사항 정의서, 유저 스토리, 수용 기준을 체계적으로 생성합니다. +icon: \uE8A5 +allowed-tools: + - file_read + - file_write + - html_create + - docx_create + - document_plan + - document_assemble +tabs: cowork +--- + +제품/기능의 요구사항 정의서(PRD)를 체계적으로 작성하세요. + +## 워크플로우 + +1. **요구사항 수집**: 사용자에게 다음을 확인 + - 제품/기능 이름 + - 목적과 배경 + - 대상 사용자 + - 핵심 기능 목록 + - 제약 조건 (기술, 일정, 예산) + +2. **구조화**: document_plan으로 PRD 개요 설계 + +3. **상세 작성**: 섹션별 상세 내용 작성 + - 유저 스토리 (As a... I want... So that...) + - 수용 기준 (Given... When... Then...) + - 기능 우선순위 (MoSCoW) + +4. **문서 생성**: document_assemble 또는 html_create로 최종 문서 + +## PRD 구조 + +### 1. 개요 +- 제품/기능 이름 +- 버전 / 작성일 / 작성자 +- 문서 목적 + +### 2. 배경 및 목적 +- 비즈니스 배경 +- 해결하려는 문제 +- 기대 효과 (정량적 KPI) + +### 3. 대상 사용자 +- 사용자 페르소나 +- 사용 시나리오 +- 사용자 여정 맵 + +### 4. 기능 요구사항 + +#### 유저 스토리 형식 +``` +US-001: [기능명] +As a [역할], +I want [기능], +So that [가치]. + +수용 기준: +- Given [사전 조건], When [행동], Then [기대 결과] +- Given ..., When ..., Then ... + +우선순위: Must Have / Should Have / Could Have / Won't Have +``` + +### 5. 비기능 요구사항 +- 성능 (응답 시간, 처리량) +- 보안 (인증, 권한, 암호화) +- 접근성 (WCAG 수준) +- 호환성 (브라우저, OS, 디바이스) + +### 6. 기술 제약 +- 기술 스택 제한 +- 연동 시스템 +- 데이터 마이그레이션 + +### 7. 일정 및 마일스톤 +| 마일스톤 | 예정일 | 산출물 | +|---------|--------|--------| +| 설계 완료 | ... | 상세 설계서 | +| 개발 완료 | ... | 릴리즈 빌드 | +| QA 완료 | ... | 테스트 보고서 | + +### 8. 성공 지표 +- 핵심 KPI 및 측정 방법 +- 목표 수치 + +### 9. 리스크 및 대안 +| 리스크 | 영향 | 대안 | +|--------|------|------| +| ... | 높음 | ... | + +## 규칙 +- 사용자 관점에서 작성 (기술 용어 최소화) +- 유저 스토리는 INVEST 원칙 준수 (Independent, Negotiable, Valuable, Estimable, Small, Testable) +- 수용 기준은 테스트 가능하도록 구체적으로 +- 한국어로 작성 (영어 용어 병기 가능) diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/refactor.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/refactor.skill.md new file mode 100644 index 0000000..a58d54e --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/refactor.skill.md @@ -0,0 +1,65 @@ +--- +name: refactor +label: 리팩토링 가이드 +description: 코드베이스를 분석하여 리팩토링 포인트를 식별하고 실행 계획을 생성합니다. +icon: \uE90F +allowed-tools: + - search_codebase + - grep + - file_read + - code_review + - folder_map + - lsp_code_intel +tabs: code +--- + +코드베이스를 분석하여 리팩토링이 필요한 부분을 식별하고 개선 계획을 수립하세요. + +## 워크플로우 + +1. **구조 파악**: folder_map + grep으로 프로젝트 전체 구조 분석 +2. **코드 스멜 탐지**: + - 중복 코드 (grep으로 유사 패턴 검색) + - 긴 메서드/클래스 (file_read로 크기 확인) + - 복잡한 조건문 (중첩 if/switch) + - 미사용 코드 (lsp_code_intel로 참조 확인) +3. **의존성 분석**: lsp_code_intel로 참조 관계 파악 +4. **우선순위 결정**: 영향도 × 난이도 매트릭스 +5. **리팩토링 계획 생성**: 단계별 실행 계획 + +## 분석 항목 + +### 코드 스멜 (Code Smells) +- **중복 코드**: 3곳 이상 반복되는 유사 코드 +- **거대 클래스**: 500줄 이상의 클래스 +- **긴 메서드**: 50줄 이상의 메서드 +- **매개변수 과다**: 5개 이상 파라미터 +- **의존성 순환**: 상호 참조 관계 +- **매직 넘버**: 하드코딩된 숫자/문자열 +- **깊은 중첩**: 4단계 이상 들여쓰기 + +### 리팩토링 기법 (제안) +- Extract Method / Extract Class +- Rename (변수, 메서드, 클래스) +- Move Method / Move Field +- Replace Conditional with Polymorphism +- Introduce Parameter Object +- Remove Dead Code + +## 출력 형식 + +### 리팩토링 보고서 +| 우선순위 | 파일 | 이슈 | 제안 | 영향도 | 난이도 | +|---------|------|------|------|--------|--------| +| 🔴 높음 | ... | ... | ... | ★★★ | ★☆☆ | +| 🟡 중간 | ... | ... | ... | ★★☆ | ★★☆ | + +### 실행 계획 +1. [안전한 변경부터] ... +2. [테스트 추가 후] ... +3. [구조 변경] ... + +## 규칙 +- 코드를 직접 수정하지 않음 (분석 + 계획만) +- 기존 테스트가 있으면 테스트 커버리지 확인 +- 팀 컨벤션/스타일 가이드 존중 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/regex-helper.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/regex-helper.skill.md new file mode 100644 index 0000000..91e10dd --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/regex-helper.skill.md @@ -0,0 +1,86 @@ +--- +name: regex-helper +label: 정규식 도우미 +description: 정규식 패턴을 생성하고, 기존 패턴을 해석하며, 테스트 케이스로 검증합니다. +icon: \uE8FD +tabs: code +allowed-tools: + - regex_tool + - clipboard_tool + - file_read +--- + +사용자의 요구에 맞는 정규식 패턴을 작성하거나, 기존 패턴을 해석하고 테스트하세요. + +## 작업 절차 + +1. **요구사항 파악**: 사용자의 요청 유형을 판별 + - **패턴 생성**: "이메일 주소를 찾는 정규식 만들어줘" + - **패턴 해석**: "이 정규식이 무슨 뜻이야? `^[\w.-]+@[\w.-]+\.\w+$`" + - **패턴 테스트**: "이 패턴이 이 문자열에 매칭되는지 확인해줘" +2. **패턴 작성 또는 분석**: + - 생성: 요구사항을 분석하여 정규식 패턴 작성 + - 해석: 패턴을 구성 요소별로 분해하여 설명 +3. **테스트 수행**: regex_tool로 패턴을 테스트 케이스에 적용 + - 매칭되어야 할 문자열 (positive cases) + - 매칭되지 않아야 할 문자열 (negative cases) +4. **결과 설명**: 매칭 결과와 캡처 그룹을 상세히 설명 +5. **최적화 제안**: 성능 또는 가독성 개선이 가능하면 대안 제시 + +## 패턴 생성 가이드 + +### 자주 사용되는 패턴 +| 용도 | 패턴 | 설명 | +|------|------|------| +| 이메일 | `[\w.-]+@[\w.-]+\.\w{2,}` | 기본 이메일 형식 | +| 전화번호 (한국) | `0\d{1,2}-\d{3,4}-\d{4}` | 010-1234-5678 형식 | +| 날짜 (YYYY-MM-DD) | `\d{4}-(?:0[1-9]\|1[0-2])-(?:0[1-9]\|[12]\d\|3[01])` | ISO 날짜 형식 | +| IP 주소 | `(?:\d{1,3}\.){3}\d{1,3}` | IPv4 기본 | +| URL | `https?://[\w.-]+(?:/[\w./?#&=-]*)?` | HTTP/HTTPS URL | +| 한글만 | `[가-힣]+` | 한글 문자 | +| 사업자등록번호 | `\d{3}-\d{2}-\d{5}` | 123-45-67890 형식 | + +### 패턴 해석 형식 +패턴을 해석할 때는 다음 구조로 설명하세요: +``` +패턴: ^(\d{3})-(\d{2})-(\d{5})$ +해석: + ^ → 문자열 시작 + (\d{3}) → 캡처 그룹 1: 숫자 3자리 + - → 하이픈 (리터럴) + (\d{2}) → 캡처 그룹 2: 숫자 2자리 + - → 하이픈 (리터럴) + (\d{5}) → 캡처 그룹 3: 숫자 5자리 + $ → 문자열 끝 +``` + +## 테스트 형식 +테스트 결과는 다음 형식으로 표시하세요: +``` +패턴: \d{3}-\d{2}-\d{5} + +✅ 매칭 성공: + "123-45-67890" → 전체 매칭: "123-45-67890" + "사업자번호: 123-45-67890입니다" → 부분 매칭: "123-45-67890" + +❌ 매칭 실패: + "12-345-67890" → 형식 불일치 + "abc-de-fghij" → 숫자가 아닌 문자 +``` + +## 플래그 안내 +| 플래그 | 설명 | +|--------|------| +| `i` | 대소문자 무시 | +| `m` | 멀티라인 (^$가 각 줄에 적용) | +| `s` | 점(.)이 줄바꿈도 매칭 | +| `g` | 전역 검색 (모든 매칭) | + +## 규칙 +- 패턴 생성 시 positive/negative 테스트 케이스를 반드시 포함 +- 복잡한 패턴은 주석이 포함된 확장 모드(`x`)로 설명 +- 캡처 그룹이 있으면 각 그룹의 의미를 설명 +- 성능에 민감한 경우 탐욕적/게으른 수량자 선택 이유를 설명 +- 최종 패턴은 clipboard_tool로 클립보드에 복사 + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/release-note.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/release-note.skill.md new file mode 100644 index 0000000..2dc122a --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/release-note.skill.md @@ -0,0 +1,96 @@ +--- +name: release-note +label: 릴리즈 노트 생성 +description: 비개발자 대상의 사용자 친화적인 릴리즈 노트를 자동 생성합니다. +icon: \uE70B +tabs: code +allowed-tools: + - file_read + - file_write + - clipboard_tool + - html_create +--- + +사용자(비개발자) 대상의 읽기 쉬운 릴리즈 노트를 작성하세요. + +## 작업 절차 + +1. **변경 정보 수집**: 사용자에게 다음 정보를 확인 + - 버전 번호 (예: v1.6.0) + - 릴리즈 날짜 + - 주요 변경 내용 (기능 추가, 개선, 버그 수정) + - 참고 자료: CHANGELOG, 커밋 이력, 개발 문서 등 +2. **내용 분류**: 수집된 변경 사항을 사용자 관점으로 분류 + - 기술 용어 → 사용자 언어로 변환 + - 내부 리팩토링 등 사용자에게 무관한 항목은 제외 +3. **릴리즈 노트 초안 작성**: 아래 템플릿 기반으로 작성 +4. **사용자 검토**: 초안을 보여주고 수정 요청 반영 +5. **최종 출력**: Markdown, HTML, 또는 텍스트 형식으로 저장 + +## 릴리즈 노트 템플릿 + +```markdown +# [제품명] v[버전] 업데이트 안내 + +안녕하세요. [제품명] v[버전] 업데이트 소식을 안내드립니다. + +## 🎉 새로운 기능 + +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] + +## ✨ 개선 사항 + +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] + +## 🐛 문제 해결 + +- [사용자가 겪었던 문제]를 해결했습니다. +- [사용자가 겪었던 문제]를 해결했습니다. + +## ⚠️ 알려진 이슈 + +- [현재 알려진 제한 사항이나 이슈] +- [해결 예정 시기 또는 임시 해결 방법] + +--- + +문의 사항이 있으시면 [연락처/채널]로 알려주세요. +감사합니다. +``` + +## 작성 원칙 + +### 사용자 언어로 변환 +| 개발 용어 (사용 금지) | 사용자 표현 (사용) | +|---------------------|-------------------| +| API 엔드포인트 추가 | 새로운 연동 기능 추가 | +| 메모리 누수 수정 | 장시간 사용 시 느려지는 문제 해결 | +| UI 리팩토링 | 화면 디자인 개선 | +| 캐시 최적화 | 실행 속도 개선 | +| null 참조 오류 수정 | 예기치 않은 오류로 종료되는 문제 해결 | +| 인코딩 이슈 수정 | 한글이 깨져 보이는 문제 해결 | +| 동시성 버그 수정 | 여러 작업 동시 실행 시 오류 발생 문제 해결 | + +### 작성 규칙 +- **혜택 중심**: "무엇을 했다"가 아닌 "사용자에게 어떤 도움이 되는지" 설명 +- **간결**: 한 항목당 1~2문장 이내 +- **구체적**: "성능 개선" → "파일 열기 속도가 약 2배 빨라졌습니다" +- **긍정적 톤**: 문제를 "해결했습니다", 기능을 "추가했습니다" +- **이모지 활용**: 섹션별 시각적 구분 (새 기능: 🎉, 개선: ✨, 수정: 🐛, 주의: ⚠️) + +## 출력 형식 +- **Markdown**: 기본 출력 형식 (.md) +- **HTML**: html_create로 스타일이 적용된 웹 페이지 생성 +- **텍스트**: 이메일 본문용 서식 없는 텍스트 +- 사용자가 원하는 형식으로 제공 + +## 규칙 +- 내부 기술 구현 세부사항은 노출하지 않음 +- 사용자에게 무관한 변경(코드 리팩토링, 테스트 추가 등)은 제외 +- Breaking Change가 있으면 "이전 버전과 달라진 점" 섹션 추가 +- 업데이트 방법 안내를 포함 (인스톨러 경로, 주의사항) +- 최종 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/report-writer.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/report-writer.skill.md new file mode 100644 index 0000000..f5e9181 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/report-writer.skill.md @@ -0,0 +1,33 @@ +--- +name: report-writer +label: 보고서 작성 +description: 작업 폴더의 데이터를 분석하여 체계적인 업무 보고서를 생성합��다. +icon: \uE9F9 +tabs: cowork +--- + +작업 폴더의 파일과 데이터를 분석하여 업무 보고서를 작성하세요. + +다음 도구를 사용하세요: +1. folder_map — 작업 폴더의 파일 구조 파악 +2. file_read — 관련 데이터 파일 읽기 (CSV, Excel, 텍스트) +3. file_write — 보고서 파일 생성 (HTML 또는 Markdown) + +보고서 구성: +## 제목 +- 작성 일시, 작성자 (요청 시) + +## 요약 (Executive Summary) +- 핵심 내용을 3줄 이내로 요약 + +## 본문 +- 데이터 기반 분석 결과 +- 표/차트를 활용한 시각적 정리 +- 주요 발견 사항 + +## 결론 및 제안 +- 결론 요약 +- 향후 조치 사항 + +HTML 보고서 생성 시 현재 적용된 디자인 무드를 반영하세요. +한국어로 작성하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/security-audit.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/security-audit.skill.md new file mode 100644 index 0000000..d32ed32 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/security-audit.skill.md @@ -0,0 +1,93 @@ +--- +name: security-audit +label: 보안 코드 감사 +description: 코드베이스의 보안 취약점을 점검하고 OWASP 기반 보안 보고서를 생성합니다. +icon: \uE72E +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - html_create + - glob +tabs: code +--- + +코드베이스의 보안 취약점을 체계적으로 점검하고 보고서를 생성하세요. + +## 워크플로우 + +1. **스캔 범위 확인**: folder_map으로 프로젝트 구조 파악, 언어/프레임워크 식별 +2. **취약점 패턴 탐지**: grep으로 위험 패턴 검색 +3. **의존성 분석**: 패키지 파일(package.json, *.csproj, requirements.txt) 읽기 +4. **비밀 정보 노출 검사**: API 키, 토큰, 비밀번호 하드코딩 탐지 +5. **보고서 생성**: html_create로 보안 감사 보고서 생성 + +## OWASP Top 10 점검 항목 + +### A01 — 접근 제어 취약 +- 인증 없는 API 엔드포인트 +- 하드코딩된 권한 체크 +- 관리자 경로 노출 + +### A02 — 암호화 실패 +- 평문 비밀번호 저장 +- 약한 해시 알고리즘 (MD5, SHA1) +- HTTP (비HTTPS) 통신 + +### A03 — 인젝션 +- SQL 인젝션 (문자열 결합 쿼리) +- XSS (innerHTML, dangerouslySetInnerHTML) +- 명령 인젝션 (Process.Start, exec, system) +- 경로 순회 (../ 미검증) + +### A04 — 불안전한 설계 +- 비즈니스 로직 검증 누락 +- 레이트 리밋 미적용 + +### A05 — 보안 설정 오류 +- 디버그 모드 활성화 상태 +- 기본 자격증명 사용 +- 불필요한 포트/서비스 노출 + +### A07 — 인증 실패 +- 약한 비밀번호 정책 +- 세션 만료 미설정 +- 브루트포스 방어 부재 + +### A09 — 로깅/모니터링 부족 +- 보안 이벤트 미기록 +- 민감 정보 로그 출력 + +## 비밀 정보 탐지 패턴 + +``` +grep 대상 패턴: +- password\s*=\s*["'][^"']+["'] +- api[_-]?key\s*=\s*["'][^"']+["'] +- secret\s*=\s*["'][^"']+["'] +- token\s*=\s*["'][A-Za-z0-9+/=]{20,}["'] +- -----BEGIN (RSA |EC )?PRIVATE KEY----- +- AWS_ACCESS_KEY_ID +- AKIA[0-9A-Z]{16} +``` + +## 출력 형식 + +### 보안 감사 보고서 +| 위험도 | 카테고리 | 파일 | 라인 | 내용 | 권장 조치 | +|--------|---------|------|------|------|----------| +| 🔴 심각 | A03 인젝션 | ... | ... | SQL 문자열 결합 | 파라미터 바인딩 사용 | +| 🟡 경고 | A02 암호화 | ... | ... | MD5 해시 사용 | SHA-256 이상 전환 | +| 🟢 참고 | A09 로깅 | ... | ... | 에러 로깅 미흡 | 보안 이벤트 로깅 추가 | + +### 요약 통계 +- 심각/경고/참고 건수 +- OWASP 카테고리별 분포 +- 우선 조치 항목 Top 5 + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 발견된 비밀 정보는 마스킹하여 보고 (앞 4자만 표시) +- 위험도는 보수적으로 평가 +- 한국어로 보고서 작성 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/sql-report.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/sql-report.skill.md new file mode 100644 index 0000000..76efeca --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/sql-report.skill.md @@ -0,0 +1,52 @@ +--- +name: sql-report +label: SQL 리포트 +description: DB 쿼리를 실행하고 결과를 차트화하여 HTML/Excel 보고서로 생성합니다. +icon: \uE968 +allowed-tools: + - sql_tool + - chart_create + - excel_create + - html_create + - data_pivot +tabs: cowork +--- + +데이터베이스에서 쿼리를 실행하고 결과를 시각화된 보고서로 생성하세요. + +## 워크플로우 + +1. **DB 확인**: sql_tool로 테이블 목록 및 스키마 확인 +2. **쿼리 작성**: 사용자 요청에 맞는 SQL 쿼리 작성 +3. **데이터 조회**: sql_tool로 쿼리 실행 +4. **데이터 가공**: data_pivot으로 집계/피벗 (필요 시) +5. **시각화**: chart_create로 차트 생성 +6. **보고서**: html_create 또는 excel_create로 최종 보고서 생성 + +## 쿼리 작성 원칙 +- SELECT 쿼리만 실행 (데이터 변경 금지) +- 결과 행 수 제한: LIMIT 1000 (대량 데이터 방지) +- 인덱스 활용 쿼리 작성 +- 한글 컬럼명은 alias로 변환 + +## 보고서 구성 + +### 1. 데이터 요약 +- 조회 조건, 기간, 데이터 건수 +- 기본 통계 (합계, 평균, 최대/최소) + +### 2. 시각화 +- 적절한 차트 유형 자동 선택 +- 비교 → 바 차트 +- 추세 → 라인 차트 +- 비율 → 파이/도넛 차트 + +### 3. 상세 데이터 +- Excel: 원본 데이터 + 서식 + 수식 +- HTML: 테이블 + 정렬/필터 + +## 규칙 +- DB 경로는 사용자에게 확인 +- 민감 데이터(개인정보) 마스킹 권고 +- 쿼리 실행 전 사용자 승인 +- 한국어로 보고서 작성 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/translate.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/translate.skill.md new file mode 100644 index 0000000..bc793de --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/translate.skill.md @@ -0,0 +1,60 @@ +--- +name: translate +label: 번역 + 교정 +description: 문서나 텍스트를 번역하고 전문 용어를 보존하며 교정합니다. +icon: \uE8C1 +allowed-tools: + - file_read + - file_write + - document_read + - clipboard_tool +tabs: all +--- + +사용자가 제공한 텍스트 또는 문서를 번역하고 교정하세요. + +## 워크플로우 + +1. **입력 확인**: 텍스트 직접 입력 또는 파일 경로 확인 +2. **언어 감지**: 원문 언어를 자동 감지 +3. **번역 실행**: + - 원문의 뉘앙스와 문맥을 살려 번역 + - 전문 용어는 원어를 괄호 안에 병기: "수율(Yield)" + - 문화적 차이를 고려한 자연스러운 표현 사용 +4. **교정**: 번역 결과의 문법, 맞춤법, 어색한 표현 수정 +5. **결과 제공**: 번역문 + 주요 용어 대조표 + +## 번역 원칙 + +### 정확성 +- 원문의 의미를 정확하게 전달 +- 숫자, 날짜, 고유명사는 원문 그대로 유지 +- 약어는 처음 등장 시 풀어 번역 + +### 가독성 +- 목표 언어의 자연스러운 문체 사용 +- 긴 문장은 적절히 분리 +- 수동태 → 능동태 변환 (한국어의 경우) + +### 전문성 +- 분야별 전문 용어 일관 사용 +- 동일 용어는 문서 전체에서 통일 +- 번역 불가능한 용어는 원어 유지 + +## 출력 형식 + +``` +## 번역 결과 + +[번역된 텍스트] + +--- + +## 용어 대조표 +| 원문 | 번역 | 비고 | +|------|------|------| +| Yield | 수율 | 반도체 공정 용어 | +``` + +## 지원 언어 +한국어 ↔ 영어 / 일본어 / 중국어 (간/번체) / 독일어 / 프랑스어 / 스페인어 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/weekly-report.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/weekly-report.skill.md new file mode 100644 index 0000000..342449e --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/weekly-report.skill.md @@ -0,0 +1,65 @@ +--- +name: weekly-report +label: 주간 보고서 +description: 작업 폴더의 변경 이력을 기반으로 자동 주간보고 초안을 생성합니다. +icon: \uE787 +allowed-tools: + - git_tool + - folder_map + - file_read + - file_watch + - html_create + - docx_create + - text_summarize +tabs: cowork +--- + +작업 폴더의 최근 활동을 분석하여 주간 보고서 초안을 자동 생성하세요. + +## 워크플로우 + +1. **활동 수집**: + - git_tool로 최근 7일간 커밋 이력 조회 + - file_watch로 최근 변경/생성된 파일 목록 확인 + - folder_map으로 프로젝트 구조 파악 + +2. **내용 분석**: + - 커밋 메시지 분류 (기능 추가, 버그 수정, 리팩토링 등) + - 변경 파일 유형별 분류 + - 주요 변경사항 요약 + +3. **보고서 작성**: + - HTML 또는 Word 형식으로 보고서 생성 + - 차트/표로 활동 통계 시각화 + +## 보고서 구성 + +### 1. 주간 요약 +- 보고 기간: yyyy-MM-dd ~ yyyy-MM-dd +- 주요 성과 (3줄 이내) + +### 2. 완료 항목 +| 번호 | 구분 | 내용 | 비고 | +|------|------|------|------| +| 1 | 기능 | ... | 커밋 참조 | + +### 3. 진행 중 항목 +- 현재 작업 중인 사항 +- 진척률 (가능하면) + +### 4. 이슈 및 리스크 +- 지연 사항 +- 블로킹 이슈 + +### 5. 다음 주 계획 +- 예정 작업 항목 + +### 6. 활동 통계 (차트) +- 일별 커밋 수 +- 파일 유형별 변경 비율 + +## 규칙 +- 사실 기반으로 작성 (추측 금지) +- Git 이력이 없으면 파일 변경 이력만으로 작성 +- 한국어로 작성 +- 보고서 톤: 간결하고 전문적 diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/xlsx-analyzer.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/xlsx-analyzer.skill.md new file mode 100644 index 0000000..267a312 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/xlsx-analyzer.skill.md @@ -0,0 +1,97 @@ +--- +name: xlsx-analyzer +label: Excel 데이터 분석 +description: Python을 사용하여 Excel/CSV 데이터를 분석하고 보고서를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +작업 폴더의 Excel 또는 CSV 데이터를 Python으로 분석하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pandas openpyxl +``` + +## 양식 활용 (Excel 보고서 템플릿) +작업 폴더에 Excel 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더에서 `.xlsx` 파일 목록 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본", "보고서양식" 포함 + - 또는 사용자가 "XX 양식에 맞춰서 작성해줘" 요청 + - 또는 사용자가 특정 .xlsx 파일명을 양식으로 지정 +3. **양식 구조 파악**: `document_read`로 양식의 시트 구조, 셀 레이아웃 확인 +4. **양식 기반 데이터 삽입**: + ```python + from openpyxl import load_workbook + wb = load_workbook('양식_보고서.xlsx') + ws = wb.active + # 양식의 서식(셀 병합, 테두리, 글꼴, 색상, 열 너비)이 그대로 유지됨 + # 데이터 영역에만 새 값 삽입 + ws['B3'] = '분석 결과값' + wb.save('결과_보고서.xlsx') + ``` +5. **양식이 없으면**: 아래 기본 방식으로 분석 결과 생성 + +## 작업 절차 +1. **데이터 파일 탐색**: folder_map으로 작업 폴더에서 .xlsx, .csv 파일 확인 +2. **양식 확인**: 양식 .xlsx 파일이 있는지 확인 (데이터 파일과 양식 파일 구분) +3. **데이터 읽기**: file_read 또는 document_read로 파일 구조 파악 +4. **분석 스크립트 작성**: file_write로 Python 분석 스크립트 생성 +5. **실행**: process_run으로 스크립트 실행 +6. **결과 보고**: 분석 결과를 사용자에게 정리하여 전달 + +## 분석 스크립트 템플릿 +```python +import pandas as pd +import json +import os + +df = pd.read_excel('data.xlsx') # 또는 pd.read_csv('data.csv') + +report = { + 'shape': list(df.shape), + 'columns': list(df.columns), + 'dtypes': {col: str(dtype) for col, dtype in df.dtypes.items()}, + 'missing': df.isnull().sum().to_dict(), + 'describe': df.describe().to_dict(), +} + +# 양식 파일로 결과 내보내기 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.xlsx') and f != 'data.xlsx' and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +if template_file: + from openpyxl import load_workbook + wb = load_workbook(template_file) + ws = wb.active + # 양식 서식 유지하면서 데이터 삽입 + print(f'양식 활용: {template_file}') + # TODO: 양식 구조에 맞게 데이터 삽입 로직 작성 + wb.save('결과_보고서.xlsx') +else: + # 양식 없으면 JSON으로 저장 + with open('analysis_result.json', 'w', encoding='utf-8') as f: + json.dump(report, f, ensure_ascii=False, indent=2, default=str) + +print(json.dumps(report, ensure_ascii=False, indent=2, default=str)) +``` + +## 지원 분석 +- 기본 통계 (평균, 중앙값, 표준편차, 분위수) +- 결측치 분석 +- 컬럼별 고유값 분포 +- 피벗 테이블 / 그룹별 집계 +- 시트 간 비교 분석 +- 필터링 및 조건부 추출 +- 분석 결과를 새 Excel로 내보내기 +- **양식 파일 기반 보고서 생성** (셀 서식, 병합, 테두리, 차트 영역 유지) + +한국어로 안내하세요. 원본 파일은 수정하지 마세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/yield-analysis.skill.md b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/yield-analysis.skill.md new file mode 100644 index 0000000..408ba31 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/skills/yield-analysis.skill.md @@ -0,0 +1,40 @@ +--- +name: yield-analysis +label: 수율 분석 +description: 제조/연구 데이터의 수율을 분석하고 개선 포인트를 도출합니다. +icon: \uE9D2 +tabs: cowork +--- + +작업 폴더의 데이터를 활���하여 수율 분석을 수행하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — 분석 보고서 생성 + +분석 프로세스: +## 데이터 개요 +- 분석 대상 데이터셋 설명 +- 데이터 기간, 샘플 수, 주요 변수 + +## 수율 현황 +- 전체 수율 통계 (평균, 중앙값, 표준편차) +- 기간별/로트별/공정별 수율 추이 +- 목표 수율 대비 달성률 + +## 불량 분석 +- 불량 유형별 분류 및 비율 +- 파레토 분석 (상위 불량 원인) +- 시간대/조건별 불량 패턴 + +## 상관관계 분석 +- 주요 공정 변수와 수율의 관계 +- 이상치 탐지 및 원인 추정 + +## 개선 제안 +- 수율 향상을 위한 구체적 조치 사항 +- 우선순위별 개선 로드맵 +- 예상 개선 효과 + +표와 수치를 적극 활용하세요. 한국어로 작성하세요. diff --git a/src/AxCopilot/bin/Release/net8.0-windows/win-x64/system_prompt.txt b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/system_prompt.txt new file mode 100644 index 0000000..5a999d3 --- /dev/null +++ b/src/AxCopilot/bin/Release/net8.0-windows/win-x64/system_prompt.txt @@ -0,0 +1 @@ +[역할] 당신은 회사 업무의 도움을 주는 매우 유능한 비서입니다. 말투는 정중하게 하며, 욕을 해서는 안됩니다. \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_0dwamfnk_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_0dwamfnk_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..0968d7e --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_0dwamfnk_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,186 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.5.3", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_0dwamfnk_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_0dwamfnk_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_0dwamfnk_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_0dwamfnk_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_0dwamfnk_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_0dwamfnk_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_0jhsprx2_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_0jhsprx2_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..593ee30 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_0jhsprx2_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,164 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.1.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_0jhsprx2_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_0jhsprx2_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_0jhsprx2_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_0jhsprx2_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_0jhsprx2_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_0jhsprx2_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_1c1bk4er_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_1c1bk4er_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..97d51eb --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_1c1bk4er_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.5.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_1c1bk4er_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_1c1bk4er_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_1c1bk4er_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_1c1bk4er_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_1c1bk4er_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_1c1bk4er_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_1lzuu0ce_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_1lzuu0ce_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233ccec --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_1lzuu0ce_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.6.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_1lzuu0ce_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_1lzuu0ce_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_1lzuu0ce_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_1lzuu0ce_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_1lzuu0ce_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_1lzuu0ce_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_1qad1ma3_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_1qad1ma3_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..0b1fa5b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_1qad1ma3_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.1.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_1qad1ma3_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_1qad1ma3_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_1qad1ma3_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_1qad1ma3_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_1qad1ma3_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_1qad1ma3_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_2gd2ffji_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_2gd2ffji_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..27c7388 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_2gd2ffji_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.5.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_2gd2ffji_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_2gd2ffji_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_2gd2ffji_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_2gd2ffji_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_2gd2ffji_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_2gd2ffji_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_2td1fmms_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_2td1fmms_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233ccec --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_2td1fmms_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.6.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_2td1fmms_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_2td1fmms_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_2td1fmms_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_2td1fmms_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_2td1fmms_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_2td1fmms_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_52g5fss0_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_52g5fss0_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..c88b7b7 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_52g5fss0_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,152 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.0.6", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_52g5fss0_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_52g5fss0_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_52g5fss0_wpftmp.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_52g5fss0_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_52g5fss0_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_52g5fss0_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_a1dmzdkm_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_a1dmzdkm_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233697f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_a1dmzdkm_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.2.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_a1dmzdkm_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_a1dmzdkm_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_a1dmzdkm_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_a1dmzdkm_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_a1dmzdkm_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_a1dmzdkm_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_a3oszv2s_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_a3oszv2s_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..bca9e91 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_a3oszv2s_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.5.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_a3oszv2s_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_a3oszv2s_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_a3oszv2s_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_a3oszv2s_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_a3oszv2s_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_a3oszv2s_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_b11al3yi_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_b11al3yi_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..d3e17dd --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_b11al3yi_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,186 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.5.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_b11al3yi_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_b11al3yi_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_b11al3yi_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_b11al3yi_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_b11al3yi_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_b11al3yi_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_bp2ox5pb_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_bp2ox5pb_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_bp2ox5pb_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_bp2ox5pb_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_bp2ox5pb_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_bp2ox5pb_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_bp2ox5pb_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_bp2ox5pb_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_bp2ox5pb_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_buuvmwuc_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_buuvmwuc_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..edadc01 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_buuvmwuc_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.2.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_buuvmwuc_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_buuvmwuc_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_buuvmwuc_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_buuvmwuc_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_buuvmwuc_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_buuvmwuc_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_dkkowfaq_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_dkkowfaq_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233ccec --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_dkkowfaq_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.6.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_dkkowfaq_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_dkkowfaq_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_dkkowfaq_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_dkkowfaq_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_dkkowfaq_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_dkkowfaq_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_do3zazsa_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_do3zazsa_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..0b1fa5b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_do3zazsa_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.1.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_do3zazsa_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_do3zazsa_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_do3zazsa_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_do3zazsa_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_do3zazsa_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_do3zazsa_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_dssjjwbh_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_dssjjwbh_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..5be993b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_dssjjwbh_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,186 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.6.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_dssjjwbh_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_dssjjwbh_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_dssjjwbh_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_dssjjwbh_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_dssjjwbh_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_dssjjwbh_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_dwhrpqgt_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_dwhrpqgt_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_dwhrpqgt_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_dwhrpqgt_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_dwhrpqgt_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_dwhrpqgt_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_dwhrpqgt_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_dwhrpqgt_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_dwhrpqgt_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_e53eiakc_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_e53eiakc_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..123213a --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_e53eiakc_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.7.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_e53eiakc_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_e53eiakc_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_e53eiakc_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_e53eiakc_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_e53eiakc_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_e53eiakc_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_fbisrlwo_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_fbisrlwo_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..97d51eb --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_fbisrlwo_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.5.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_fbisrlwo_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_fbisrlwo_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_fbisrlwo_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_fbisrlwo_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_fbisrlwo_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_fbisrlwo_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_fi4bgomd_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_fi4bgomd_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_fi4bgomd_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_fi4bgomd_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_fi4bgomd_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_fi4bgomd_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_fi4bgomd_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_fi4bgomd_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_fi4bgomd_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_fjx3b4t3_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_fjx3b4t3_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233697f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_fjx3b4t3_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.2.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_fjx3b4t3_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_fjx3b4t3_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_fjx3b4t3_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_fjx3b4t3_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_fjx3b4t3_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_fjx3b4t3_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_g52u1y0d_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_g52u1y0d_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_g52u1y0d_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_g52u1y0d_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_g52u1y0d_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_g52u1y0d_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_g52u1y0d_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_g52u1y0d_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_g52u1y0d_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_gahpkzrl_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_gahpkzrl_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..f6b9838 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_gahpkzrl_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.3.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_gahpkzrl_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_gahpkzrl_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_gahpkzrl_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_gahpkzrl_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_gahpkzrl_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_gahpkzrl_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ghnidh1a_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_ghnidh1a_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233697f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ghnidh1a_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.2.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ghnidh1a_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_ghnidh1a_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ghnidh1a_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ghnidh1a_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_ghnidh1a_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ghnidh1a_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_glsyu0wm_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_glsyu0wm_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_glsyu0wm_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_glsyu0wm_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_glsyu0wm_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_glsyu0wm_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_glsyu0wm_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_glsyu0wm_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_glsyu0wm_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_gnssfsey_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_gnssfsey_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_gnssfsey_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_gnssfsey_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_gnssfsey_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_gnssfsey_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_gnssfsey_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_gnssfsey_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_gnssfsey_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_gntx12mm_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_gntx12mm_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..123213a --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_gntx12mm_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.7.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_gntx12mm_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_gntx12mm_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_gntx12mm_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_gntx12mm_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_gntx12mm_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_gntx12mm_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_h3jodnly_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_h3jodnly_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..d3e17dd --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_h3jodnly_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,186 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.5.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_h3jodnly_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_h3jodnly_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_h3jodnly_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_h3jodnly_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_h3jodnly_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_h3jodnly_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_j451iwfl_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_j451iwfl_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..def9f45 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_j451iwfl_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.4.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_j451iwfl_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_j451iwfl_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_j451iwfl_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_j451iwfl_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_j451iwfl_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_j451iwfl_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_jtgi0n3q_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_jtgi0n3q_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..fc9a578 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_jtgi0n3q_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,160 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.1.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_jtgi0n3q_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_jtgi0n3q_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_jtgi0n3q_wpftmp.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_jtgi0n3q_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_jtgi0n3q_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_jtgi0n3q_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_jtu1dyvx_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_jtu1dyvx_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..def9f45 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_jtu1dyvx_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.4.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_jtu1dyvx_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_jtu1dyvx_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_jtu1dyvx_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_jtu1dyvx_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_jtu1dyvx_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_jtu1dyvx_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_jvkts0jm_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_jvkts0jm_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_jvkts0jm_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_jvkts0jm_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_jvkts0jm_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_jvkts0jm_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_jvkts0jm_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_jvkts0jm_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_jvkts0jm_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_k4gudr4n_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_k4gudr4n_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233ccec --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_k4gudr4n_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.6.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_k4gudr4n_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_k4gudr4n_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_k4gudr4n_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_k4gudr4n_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_k4gudr4n_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_k4gudr4n_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_k52umusu_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_k52umusu_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..97d51eb --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_k52umusu_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.5.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_k52umusu_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_k52umusu_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_k52umusu_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_k52umusu_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_k52umusu_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_k52umusu_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_kqmf35ty_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_kqmf35ty_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..0b1fa5b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_kqmf35ty_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.1.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_kqmf35ty_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_kqmf35ty_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_kqmf35ty_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_kqmf35ty_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_kqmf35ty_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_kqmf35ty_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_lk5uw3vb_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_lk5uw3vb_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..0b1fa5b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_lk5uw3vb_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.1.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_lk5uw3vb_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_lk5uw3vb_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_lk5uw3vb_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_lk5uw3vb_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_lk5uw3vb_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_lk5uw3vb_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_lsd4p0u0_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_lsd4p0u0_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_lsd4p0u0_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_lsd4p0u0_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_lsd4p0u0_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_lsd4p0u0_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_lsd4p0u0_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_lsd4p0u0_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_lsd4p0u0_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ltvdq020_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_ltvdq020_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ltvdq020_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ltvdq020_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_ltvdq020_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ltvdq020_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ltvdq020_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_ltvdq020_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ltvdq020_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_nj5exch1_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_nj5exch1_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..27c7388 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_nj5exch1_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.5.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_nj5exch1_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_nj5exch1_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_nj5exch1_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_nj5exch1_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_nj5exch1_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_nj5exch1_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_nk4vxi2q_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_nk4vxi2q_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233697f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_nk4vxi2q_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.2.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_nk4vxi2q_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_nk4vxi2q_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_nk4vxi2q_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_nk4vxi2q_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_nk4vxi2q_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_nk4vxi2q_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ozpgy5ry_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_ozpgy5ry_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233ccec --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ozpgy5ry_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.6.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ozpgy5ry_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_ozpgy5ry_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ozpgy5ry_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ozpgy5ry_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_ozpgy5ry_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ozpgy5ry_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_pf01da43_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_pf01da43_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..123213a --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_pf01da43_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.7.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_pf01da43_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_pf01da43_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_pf01da43_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_pf01da43_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_pf01da43_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_pf01da43_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ppuzvtes_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_ppuzvtes_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ppuzvtes_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ppuzvtes_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_ppuzvtes_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ppuzvtes_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ppuzvtes_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_ppuzvtes_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ppuzvtes_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_q0kinxhh_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_q0kinxhh_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..f61fbf2 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_q0kinxhh_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,166 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.0.6", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_q0kinxhh_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_q0kinxhh_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_q0kinxhh_wpftmp.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_q0kinxhh_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_q0kinxhh_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_q0kinxhh_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_q4gx2nfk_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_q4gx2nfk_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..11db099 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_q4gx2nfk_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.4.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_q4gx2nfk_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_q4gx2nfk_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_q4gx2nfk_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_q4gx2nfk_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_q4gx2nfk_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_q4gx2nfk_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_qamt3fq4_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_qamt3fq4_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..0b1fa5b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_qamt3fq4_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.1.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_qamt3fq4_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_qamt3fq4_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_qamt3fq4_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_qamt3fq4_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_qamt3fq4_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_qamt3fq4_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_qlyaztkm_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_qlyaztkm_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_qlyaztkm_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_qlyaztkm_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_qlyaztkm_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_qlyaztkm_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_qlyaztkm_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_qlyaztkm_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_qlyaztkm_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_qqfytnyy_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_qqfytnyy_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233ccec --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_qqfytnyy_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.6.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_qqfytnyy_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_qqfytnyy_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_qqfytnyy_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_qqfytnyy_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_qqfytnyy_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_qqfytnyy_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_remq1nm0_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_remq1nm0_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_remq1nm0_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_remq1nm0_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_remq1nm0_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_remq1nm0_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_remq1nm0_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_remq1nm0_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_remq1nm0_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_rov4nyp3_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_rov4nyp3_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..4305bc9 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_rov4nyp3_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,156 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.0.7", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_rov4nyp3_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_rov4nyp3_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_rov4nyp3_wpftmp.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_rov4nyp3_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_rov4nyp3_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_rov4nyp3_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_t2o2jdrr_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_t2o2jdrr_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..def9f45 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_t2o2jdrr_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.4.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_t2o2jdrr_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_t2o2jdrr_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_t2o2jdrr_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_t2o2jdrr_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_t2o2jdrr_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_t2o2jdrr_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_twdkjqnx_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_twdkjqnx_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..4305bc9 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_twdkjqnx_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,156 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.0.7", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_twdkjqnx_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_twdkjqnx_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_twdkjqnx_wpftmp.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_twdkjqnx_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_twdkjqnx_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_twdkjqnx_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ubq15sc3_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_ubq15sc3_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..270d4e7 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ubq15sc3_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,186 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.7.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ubq15sc3_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_ubq15sc3_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ubq15sc3_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ubq15sc3_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_ubq15sc3_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ubq15sc3_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_uqh04nve_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_uqh04nve_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_uqh04nve_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_uqh04nve_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_uqh04nve_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_uqh04nve_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_uqh04nve_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_uqh04nve_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_uqh04nve_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ur1vlqnr_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_ur1vlqnr_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ur1vlqnr_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ur1vlqnr_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_ur1vlqnr_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ur1vlqnr_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_ur1vlqnr_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_ur1vlqnr_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_ur1vlqnr_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_v1p3dzje_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_v1p3dzje_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233ccec --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_v1p3dzje_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.6.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_v1p3dzje_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_v1p3dzje_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_v1p3dzje_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_v1p3dzje_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_v1p3dzje_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_v1p3dzje_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_w2tqb20a_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_w2tqb20a_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..233ccec --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_w2tqb20a_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.6.1", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_w2tqb20a_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_w2tqb20a_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_w2tqb20a_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_w2tqb20a_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_w2tqb20a_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_w2tqb20a_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_wiros0z3_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_wiros0z3_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..578f515 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_wiros0z3_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,166 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.0.7", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_wiros0z3_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_wiros0z3_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_wiros0z3_wpftmp.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_wiros0z3_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_wiros0z3_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_wiros0z3_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_wkj1oqnk_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_wkj1oqnk_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..def9f45 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_wkj1oqnk_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.4.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_wkj1oqnk_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_wkj1oqnk_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_wkj1oqnk_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_wkj1oqnk_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_wkj1oqnk_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_wkj1oqnk_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_wkl43us2_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_wkl43us2_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..83ba53f --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_wkl43us2_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,172 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_wkl43us2_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_wkl43us2_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_wkl43us2_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_wkl43us2_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_wkl43us2_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_wkl43us2_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_xe1ozagp_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_xe1ozagp_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..0b1fa5b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_xe1ozagp_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,168 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.1.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_xe1ozagp_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_xe1ozagp_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_xe1ozagp_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_xe1ozagp_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_xe1ozagp_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_xe1ozagp_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_xx2bp3sm_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_xx2bp3sm_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..def9f45 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_xx2bp3sm_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,182 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.4.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_xx2bp3sm_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_xx2bp3sm_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_xx2bp3sm_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_xx2bp3sm_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_xx2bp3sm_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..060e6d3 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_xx2bp3sm_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_z5b2gpen_wpftmp.csproj.nuget.dgspec.json b/src/AxCopilot/obj/AxCopilot_z5b2gpen_wpftmp.csproj.nuget.dgspec.json new file mode 100644 index 0000000..270d4e7 --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_z5b2gpen_wpftmp.csproj.nuget.dgspec.json @@ -0,0 +1,186 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.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" + } + } + }, + "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj": { + "version": "1.7.2", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.NETCore.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Runtime.win-x64", + "version": "[8.0.25, 8.0.25]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_z5b2gpen_wpftmp.csproj.nuget.g.props b/src/AxCopilot/obj/AxCopilot_z5b2gpen_wpftmp.csproj.nuget.g.props new file mode 100644 index 0000000..f78c65b --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_z5b2gpen_wpftmp.csproj.nuget.g.props @@ -0,0 +1,18 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + + C:\Users\admin\.nuget\packages\microsoft.web.webview2\1.0.2903.40 + + \ No newline at end of file diff --git a/src/AxCopilot/obj/AxCopilot_z5b2gpen_wpftmp.csproj.nuget.g.targets b/src/AxCopilot/obj/AxCopilot_z5b2gpen_wpftmp.csproj.nuget.g.targets new file mode 100644 index 0000000..c39e4de --- /dev/null +++ b/src/AxCopilot/obj/AxCopilot_z5b2gpen_wpftmp.csproj.nuget.g.targets @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/App.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/App.baml new file mode 100644 index 0000000..0b7e981 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/App.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/App.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/App.g.cs new file mode 100644 index 0000000..ce2ad29 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/App.g.cs @@ -0,0 +1,78 @@ +#pragma checksum "..\..\..\..\App.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "0B0E851D2C6BB680D8B8F8DD7474F784A24BB388" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using AxCopilot.Themes; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot { + + + /// + /// App + /// + public partial class App : System.Windows.Application { + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/app.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\App.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + /// + /// Application Entry Point. + /// + [System.STAThreadAttribute()] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public static void Main() { + AxCopilot.App app = new AxCopilot.App(); + app.InitializeComponent(); + app.Run(); + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.AssemblyInfo.cs new file mode 100644 index 0000000..9b0b209 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.AssemblyInfoInputs.cache new file mode 100644 index 0000000..8bfdc0d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +884be5a72ec397a030249c12189ad2334cbbbc2b4ac23550185ababcb6c7fcd2 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.assets.cache new file mode 100644 index 0000000..5f74a1e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.AssemblyReference.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.AssemblyReference.cache new file mode 100644 index 0000000..d87fa4d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.AssemblyReference.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.CoreCompileInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..866a51c --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +751715c226219b17eeeb84e8ad3f96ab52466a32d408582ed24f3a1abb7837dc diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.FileListAbsolute.txt b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..3922f7f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.FileListAbsolute.txt @@ -0,0 +1,220 @@ +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\AX Copilot 사용가이드.htm +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\duckduckgo.png +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\github.png +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\google.png +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\namuwiki.png +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\naver.png +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\navermap.png +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\wikipedia.png +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\youtube.png +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\system_prompt.txt +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\icon.ico +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.exe +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.deps.json +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.runtimeconfig.json +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.dll +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.pdb +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\System.Diagnostics.EventLog.dll +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\System.ServiceProcess.ServiceController.dll +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.SDK.dll +E:\AX Commander\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.SDK.pdb +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.csproj.AssemblyReference.cache +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\AboutWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ChatWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ColorPickResultWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\EyeDropperWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\HelpDetailWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\LargeTypeWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\LauncherWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\RegionSelectWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ReminderPopupWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ResourceMonitorWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ShortcutHelpWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\AboutWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ChatWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ColorPickResultWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\EyeDropperWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\HelpDetailWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\LargeTypeWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\LauncherWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\RegionSelectWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ReminderPopupWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ResourceMonitorWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\SettingsWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ShortcutHelpWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\StatisticsWindow.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\App.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot_Content.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\GeneratedInternalTypeHelper.g.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot_MarkupCompile.cache +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot_MarkupCompile.lref +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\App.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\SettingsWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\StatisticsWindow.baml +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.g.resources +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.GeneratedMSBuildEditorConfig.editorconfig +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.AssemblyInfoInputs.cache +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.AssemblyInfo.cs +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.csproj.CoreCompileInputs.cache +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.csproj.Up2Date +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.dll +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\refint\AxCopilot.dll +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.pdb +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.genruntimeconfig.cache +E:\AX Commander\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\ref\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\duckduckgo.png +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\github.png +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\google.png +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\namuwiki.png +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\naver.png +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\navermap.png +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\wikipedia.png +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\SearchEngines\youtube.png +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\system_prompt.txt +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\icon.ico +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.exe +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.deps.json +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.runtimeconfig.json +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.pdb +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\System.Diagnostics.EventLog.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\System.ServiceProcess.ServiceController.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.SDK.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\AxCopilot.SDK.pdb +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.csproj.AssemblyReference.cache +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\AboutWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ChatWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ColorPickResultWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\EyeDropperWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\HelpDetailWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\LargeTypeWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\LauncherWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\RegionSelectWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ReminderPopupWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ResourceMonitorWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ShortcutHelpWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\AboutWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ChatWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ColorPickResultWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\EyeDropperWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\HelpDetailWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\LargeTypeWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\LauncherWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\RegionSelectWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ReminderPopupWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ResourceMonitorWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\SettingsWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\ShortcutHelpWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\StatisticsWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\App.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot_Content.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\GeneratedInternalTypeHelper.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot_MarkupCompile.cache +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot_MarkupCompile.lref +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\App.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\SettingsWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\StatisticsWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.g.resources +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.GeneratedMSBuildEditorConfig.editorconfig +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.AssemblyInfoInputs.cache +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.AssemblyInfo.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.csproj.CoreCompileInputs.cache +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.csproj.Up2Date +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\refint\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.pdb +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\AxCopilot.genruntimeconfig.cache +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\ref\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\DocumentFormat.OpenXml.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\DocumentFormat.OpenXml.Framework.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\System.IO.Packaging.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\UglyToad.PdfPig.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\UglyToad.PdfPig.Core.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\UglyToad.PdfPig.Fonts.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\UglyToad.PdfPig.Tokenization.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\UglyToad.PdfPig.Tokens.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\runtimes\win-x64\native\WebView2Loader.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\WebView2Loader.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Microsoft.Web.WebView2.Core.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Microsoft.Web.WebView2.WinForms.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Microsoft.Web.WebView2.Wpf.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Microsoft.Web.WebView2.Core.xml +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Microsoft.Web.WebView2.WinForms.xml +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Microsoft.Web.WebView2.Wpf.xml +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Markdig.dll +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\CommandPaletteWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\CommandPaletteWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\TextActionPopup.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\TextActionPopup.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\DockBarWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\DockBarWindow.g.cs +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Microsoft.Data.Sqlite.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\SQLitePCLRaw.batteries_v2.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\SQLitePCLRaw.core.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\SQLitePCLRaw.provider.e_sqlite3.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\e_sqlite3.dll +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\code-scaffold.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\data-visualize.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\meeting-minutes.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\paper-review.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\report-writer.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\yield-analysis.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\docx-creator.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\pdf-processor.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\pptx-creator.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\xlsx-analyzer.skill.md +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\WorkflowAnalyzerWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\WorkflowAnalyzerWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\AgentStatsDashboardWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\SkillGalleryWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\AgentStatsDashboardWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\SkillGalleryWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\SkillEditorWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\SkillEditorWindow.g.cs +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\api-docs.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\commit-review.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\db-schema.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\guide_user.enc +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\Assets\guide_dev.enc +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\GuideViewerWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\GuideViewerWindow.g.cs +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\compare.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\data-convert.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\email-draft.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\gen-test.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\impact.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\log-analyze.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\refactor.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\sql-report.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\translate.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\weekly-report.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\adr-writer.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\changelog.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\dependency-audit.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\perf-audit.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\prd-generator.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\security-audit.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\data-visualize-adv.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\diagram-generator.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\image-processor.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\ocr-extract.skill.md +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\TrayMenuWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\TrayMenuWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\PreviewWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\PreviewWindow.g.cs +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\batch-rename.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\csv-to-xlsx.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\env-setup.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\json-schema.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\markdown-to-doc.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\regex-helper.skill.md +E:\AX Copilot\src\AxCopilot\bin\Debug\net8.0-windows\win-x64\skills\release-note.skill.md +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Themes\Codex.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\Controls\AgentInputArea.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\Controls\AgentSessionHeaderBar.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\Controls\AgentSettingsPanel.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\Controls\AgentSidebarView.baml +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\Controls\AgentInputArea.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\Controls\AgentSessionHeaderBar.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\Controls\AgentSettingsPanel.g.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\Views\Controls\AgentSidebarView.g.cs diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.Up2Date b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.csproj.Up2Date new file mode 100644 index 0000000..e69de29 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.dll b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.dll new file mode 100644 index 0000000..a960854 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.dll differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.g.resources b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.g.resources new file mode 100644 index 0000000..c5d00e2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.g.resources differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.genruntimeconfig.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.genruntimeconfig.cache new file mode 100644 index 0000000..0308eff --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.genruntimeconfig.cache @@ -0,0 +1 @@ +5eba16c6b114a460e3f5095a4d17857855998cc70d6c96ef8fc8ff7bfa20618f diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.pdb b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.pdb new file mode 100644 index 0000000..7afc131 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot.pdb differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.assets.cache new file mode 100644 index 0000000..4395eed Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_01xv3yqi_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.assets.cache new file mode 100644 index 0000000..11b47fe Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_04ufuvmm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.assets.cache new file mode 100644 index 0000000..5d05821 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_05v0zqqg_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.assets.cache new file mode 100644 index 0000000..aa46993 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0afecbwl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.assets.cache new file mode 100644 index 0000000..daaed5b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0doxbjoj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.assets.cache new file mode 100644 index 0000000..715450d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0dwamfnk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.assets.cache new file mode 100644 index 0000000..615c9b0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0hpomoao_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.assets.cache new file mode 100644 index 0000000..c921a5a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0jhsprx2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.assets.cache new file mode 100644 index 0000000..a54cfb1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0nv0wq1w_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.assets.cache new file mode 100644 index 0000000..019357e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0o2xyfae_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.assets.cache new file mode 100644 index 0000000..b029c03 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0rs40k5m_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.assets.cache new file mode 100644 index 0000000..c9fdae2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_0zstngwd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.assets.cache new file mode 100644 index 0000000..4590670 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_121trlbk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.assets.cache new file mode 100644 index 0000000..4e24a25 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_12odr5g5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.assets.cache new file mode 100644 index 0000000..b0071b4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_14fw4mol_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.assets.cache new file mode 100644 index 0000000..e0a7a08 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_15igawcn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.assets.cache new file mode 100644 index 0000000..b600908 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1aviecxz_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.assets.cache new file mode 100644 index 0000000..2523dab Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1c1bk4er_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.assets.cache new file mode 100644 index 0000000..afea4b9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1egbncaa_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.assets.cache new file mode 100644 index 0000000..6183cbc Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1gtbbont_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.assets.cache new file mode 100644 index 0000000..e8ad576 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1hyzlrke_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.assets.cache new file mode 100644 index 0000000..2139269 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1jjum3rn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.assets.cache new file mode 100644 index 0000000..8d07e51 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lf2oibm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b7c468e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..38bcde5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +ff4f0d7c19507366d05be3756e429f7bc75378e3ff488558d9b6520919fc4744 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.assets.cache new file mode 100644 index 0000000..40db8e2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1ltyayaa_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.assets.cache new file mode 100644 index 0000000..deb4045 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1lzuu0ce_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.assets.cache new file mode 100644 index 0000000..9892881 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1obdvrdq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.assets.cache new file mode 100644 index 0000000..8b0dbc5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1qad1ma3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.assets.cache new file mode 100644 index 0000000..395cb38 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1vzlncfk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.assets.cache new file mode 100644 index 0000000..ccb4ea5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1x3oq4qe_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.assets.cache new file mode 100644 index 0000000..b41d5ea Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_1xnzatqy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.assets.cache new file mode 100644 index 0000000..ca42811 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_20e5s1d3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.assets.cache new file mode 100644 index 0000000..d945666 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2cmrogfo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.assets.cache new file mode 100644 index 0000000..43ae7e0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2e3ezbcu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.assets.cache new file mode 100644 index 0000000..f9c5310 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2gd2ffji_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.assets.cache new file mode 100644 index 0000000..f2998c3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2h0suvk2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..fb2381e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..23b684e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +4d66998701e5507f648c6013935531b0fbc7b577485dddadcde0684b1aa37f13 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.assets.cache new file mode 100644 index 0000000..7af5247 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2lavloc0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.assets.cache new file mode 100644 index 0000000..0212e98 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2o2gerz2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.assets.cache new file mode 100644 index 0000000..873c95c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2owltosq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.assets.cache new file mode 100644 index 0000000..bd9e228 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2rwdnn5r_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..fb2381e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..23b684e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +4d66998701e5507f648c6013935531b0fbc7b577485dddadcde0684b1aa37f13 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.assets.cache new file mode 100644 index 0000000..9e6e2e4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2si0jig3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.assets.cache new file mode 100644 index 0000000..938dc23 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2td1fmms_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.assets.cache new file mode 100644 index 0000000..395d529 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2uuig21n_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.assets.cache new file mode 100644 index 0000000..be25ab8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2wtx1mjq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.assets.cache new file mode 100644 index 0000000..d8f919e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_2xugkp32_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4ca3822 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d08142e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5ce3d7e1b9cd1df0b1767593c9b4d51fd52675a04932fd185e70d63fd1363392 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.assets.cache new file mode 100644 index 0000000..5bdf645 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_31mg34gp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.assets.cache new file mode 100644 index 0000000..be7954a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_322rfuha_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.assets.cache new file mode 100644 index 0000000..32a2414 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3ceozho0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.assets.cache new file mode 100644 index 0000000..bb091ae Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3fdblfba_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.assets.cache new file mode 100644 index 0000000..c81bc43 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3igbionr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.assets.cache new file mode 100644 index 0000000..750d345 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3kcxwbvw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.assets.cache new file mode 100644 index 0000000..2471b75 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3nmgewcm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.assets.cache new file mode 100644 index 0000000..638d41a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3qh0gzcq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.assets.cache new file mode 100644 index 0000000..2a564d1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3tdghoix_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.assets.cache new file mode 100644 index 0000000..89a403f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3u03zhwb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.assets.cache new file mode 100644 index 0000000..8f8154b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_3zs51lvu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.assets.cache new file mode 100644 index 0000000..43944bd Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41fea4vm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.assets.cache new file mode 100644 index 0000000..1bd4ba2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41ghqms0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.assets.cache new file mode 100644 index 0000000..393b68e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41qumbha_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.assets.cache new file mode 100644 index 0000000..ca0740a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_41s12dss_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.assets.cache new file mode 100644 index 0000000..d373463 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_43apbg3p_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.assets.cache new file mode 100644 index 0000000..60a06fe Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4attq3dv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.assets.cache new file mode 100644 index 0000000..ecf7162 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4d3ccjyu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.assets.cache new file mode 100644 index 0000000..67defad Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4duezgwk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.assets.cache new file mode 100644 index 0000000..645e9f5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4fgzcqoq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.assets.cache new file mode 100644 index 0000000..e53a360 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4jpsj0mo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.assets.cache new file mode 100644 index 0000000..6de5ba3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4k2pbovo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.assets.cache new file mode 100644 index 0000000..bb94da8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4kqokyio_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.assets.cache new file mode 100644 index 0000000..47aa4c6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4lrvnma2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b7c468e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..38bcde5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +ff4f0d7c19507366d05be3756e429f7bc75378e3ff488558d9b6520919fc4744 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.assets.cache new file mode 100644 index 0000000..2e84af2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qajxqtt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.assets.cache new file mode 100644 index 0000000..705f6bc Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4qgncjvs_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.assets.cache new file mode 100644 index 0000000..58010f5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4t0n0vrr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.assets.cache new file mode 100644 index 0000000..d904244 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_4ytiv5c4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.assets.cache new file mode 100644 index 0000000..d986496 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_524kbyth_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.assets.cache new file mode 100644 index 0000000..b127a1c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52g5fss0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.assets.cache new file mode 100644 index 0000000..56db800 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_52t5sxrn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.assets.cache new file mode 100644 index 0000000..3d09044 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5h1om0ab_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.assets.cache new file mode 100644 index 0000000..a4f6da2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5p5pe4ts_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.assets.cache new file mode 100644 index 0000000..b32318f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5px3qlpd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.assets.cache new file mode 100644 index 0000000..b451ff2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5vka5eqe_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.assets.cache new file mode 100644 index 0000000..02dbb29 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wf103dc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.assets.cache new file mode 100644 index 0000000..86c8b37 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5wqoj0tw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.assets.cache new file mode 100644 index 0000000..0145462 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_5y1fz4cj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_Content.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_Content.g.cs new file mode 100644 index 0000000..c8304c5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_Content.g.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/guide_user.enc")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/guide_dev.enc")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/duckduckgo.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/github.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/google.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/namuwiki.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/naver.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/navermap.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/wikipedia.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/youtube.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/system_prompt.txt")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/adr-writer.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/api-docs.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/batch-rename.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/changelog.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/code-scaffold.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/commit-review.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/compare.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/csv-to-xlsx.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/data-convert.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/data-visualize-adv.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/data-visualize.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/db-schema.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/dependency-audit.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/diagram-generator.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/docx-creator.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/email-draft.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/env-setup.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/gen-test.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/image-processor.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/impact.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/json-schema.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/log-analyze.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/markdown-to-doc.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/meeting-minutes.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/ocr-extract.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/paper-review.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/pdf-processor.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/perf-audit.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/pptx-creator.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/prd-generator.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/refactor.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/regex-helper.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/release-note.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/report-writer.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/security-audit.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/sql-report.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/translate.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/weekly-report.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/xlsx-analyzer.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/yield-analysis.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("webview2loader.dll")] + + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_MarkupCompile.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_MarkupCompile.cache new file mode 100644 index 0000000..17c9f95 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_MarkupCompile.cache @@ -0,0 +1,20 @@ +AxCopilot + + +winexe +C# +.cs +E:\AX Copilot\src\AxCopilot\obj\Debug\net8.0-windows\win-x64\ +AxCopilot +none +false +TRACE;DEBUG;NET;NET8_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NET7_0_OR_GREATER;NET8_0_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER;WINDOWS7_0_OR_GREATER +E:\AX Copilot\src\AxCopilot\App.xaml +28-234839436 +5221578752 +2821923792535 +224-678457821 +Themes\Codex.xaml;Views\AboutWindow.xaml;Views\AgentStatsDashboardWindow.xaml;Views\ChatWindow.xaml;Views\ColorPickResultWindow.xaml;Views\CommandPaletteWindow.xaml;Views\Controls\AgentInputArea.xaml;Views\Controls\AgentSessionHeaderBar.xaml;Views\Controls\AgentSettingsPanel.xaml;Views\Controls\AgentSidebarView.xaml;Views\DockBarWindow.xaml;Views\EyeDropperWindow.xaml;Views\GuideViewerWindow.xaml;Views\HelpDetailWindow.xaml;Views\LargeTypeWindow.xaml;Views\LauncherWindow.xaml;Views\PreviewWindow.xaml;Views\RegionSelectWindow.xaml;Views\ReminderPopupWindow.xaml;Views\ResourceMonitorWindow.xaml;Views\SettingsWindow.xaml;Views\ShortcutHelpWindow.xaml;Views\SkillEditorWindow.xaml;Views\SkillGalleryWindow.xaml;Views\StatisticsWindow.xaml;Views\TextActionPopup.xaml;Views\TrayMenuWindow.xaml;Views\WorkflowAnalyzerWindow.xaml; + +False + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_MarkupCompile.lref b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_MarkupCompile.lref new file mode 100644 index 0000000..f40a67a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_MarkupCompile.lref @@ -0,0 +1,6 @@ + +FE:\AX Copilot\src\AxCopilot\App.xaml;; +FE:\AX Copilot\src\AxCopilot\Views\ChatWindow.xaml;; +FE:\AX Copilot\src\AxCopilot\Views\SettingsWindow.xaml;; +FE:\AX Copilot\src\AxCopilot\Views\StatisticsWindow.xaml;; + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.assets.cache new file mode 100644 index 0000000..824ff2b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0eb510a_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.assets.cache new file mode 100644 index 0000000..7212a50 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a0qt4wiy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.assets.cache new file mode 100644 index 0000000..1749be0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a1ftvo4k_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.assets.cache new file mode 100644 index 0000000..7ba647a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a25g4pzo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.assets.cache new file mode 100644 index 0000000..bbb67ec Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_a3oszv2s_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.assets.cache new file mode 100644 index 0000000..43c053d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aatkxnhf_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.assets.cache new file mode 100644 index 0000000..0733fe8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ac1fir4d_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.assets.cache new file mode 100644 index 0000000..1be02cb Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_adjs5lhc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4ca3822 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d08142e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5ce3d7e1b9cd1df0b1767593c9b4d51fd52675a04932fd185e70d63fd1363392 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.assets.cache new file mode 100644 index 0000000..d08dd31 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aejtlxgp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.assets.cache new file mode 100644 index 0000000..ecd84c3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akxiseed_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.assets.cache new file mode 100644 index 0000000..e0cd6a6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_akzjic1j_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.assets.cache new file mode 100644 index 0000000..cc96582 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aljsgem1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.assets.cache new file mode 100644 index 0000000..2e9f6aa Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_amaurnkx_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.assets.cache new file mode 100644 index 0000000..a8dd021 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aop2tpde_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.assets.cache new file mode 100644 index 0000000..2c34972 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_apq1pbrd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.assets.cache new file mode 100644 index 0000000..96409f0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aue4df5g_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f78324a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d1b97f9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f17df244f2fa2d91da43c001677545da830653952625ba7179c4bf1c7fce1809 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.assets.cache new file mode 100644 index 0000000..1d065d9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_augsp3hp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.assets.cache new file mode 100644 index 0000000..f67d7ce Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_avcfwvgw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.assets.cache new file mode 100644 index 0000000..32d1d31 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_aytufajn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.assets.cache new file mode 100644 index 0000000..559f9ba Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b11al3yi_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.assets.cache new file mode 100644 index 0000000..4e9de66 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_b3uyhzai_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.assets.cache new file mode 100644 index 0000000..30f2849 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bhug5ebx_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.assets.cache new file mode 100644 index 0000000..4873348 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bi15dev0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f78324a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d1b97f9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f17df244f2fa2d91da43c001677545da830653952625ba7179c4bf1c7fce1809 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.assets.cache new file mode 100644 index 0000000..6b2be11 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bircj1ng_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.assets.cache new file mode 100644 index 0000000..64f8365 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bjsbphep_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f78324a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d1b97f9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f17df244f2fa2d91da43c001677545da830653952625ba7179c4bf1c7fce1809 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.assets.cache new file mode 100644 index 0000000..dd05c33 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bnufil5x_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.assets.cache new file mode 100644 index 0000000..649bf75 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bp2ox5pb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.assets.cache new file mode 100644 index 0000000..f5baf80 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bpfqacda_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.assets.cache new file mode 100644 index 0000000..320fae4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_brqte4b2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4ca3822 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d08142e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5ce3d7e1b9cd1df0b1767593c9b4d51fd52675a04932fd185e70d63fd1363392 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.assets.cache new file mode 100644 index 0000000..7e22b47 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_buuvmwuc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.assets.cache new file mode 100644 index 0000000..b8f2244 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bwufaddj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.assets.cache new file mode 100644 index 0000000..ac1da47 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bxktbyvs_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.assets.cache new file mode 100644 index 0000000..f3374d9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bysq3mjg_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.assets.cache new file mode 100644 index 0000000..de58fe5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_bzzkpbxv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.assets.cache new file mode 100644 index 0000000..eabac2f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c0e35glq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.assets.cache new file mode 100644 index 0000000..ac72bad Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c1fxljqb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.assets.cache new file mode 100644 index 0000000..4905af2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c3sfz2y5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.assets.cache new file mode 100644 index 0000000..b069076 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c53fcry5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.assets.cache new file mode 100644 index 0000000..5a7cc44 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_c5a5qxi3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.assets.cache new file mode 100644 index 0000000..c16a588 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ci4pborw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.assets.cache new file mode 100644 index 0000000..04bc2e6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ciky2inn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.assets.cache new file mode 100644 index 0000000..4c6721a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cmmlnpl0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.assets.cache new file mode 100644 index 0000000..c51b333 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cproal1j_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.assets.cache new file mode 100644 index 0000000..b2c24fa Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cqkwodhl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.assets.cache new file mode 100644 index 0000000..d9cf903 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_crsnfzex_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.assets.cache new file mode 100644 index 0000000..90b9c30 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_cxj3nqkf_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.assets.cache new file mode 100644 index 0000000..8f53f31 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d0k5llcx_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.assets.cache new file mode 100644 index 0000000..a0ac645 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d1c0yk0r_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.assets.cache new file mode 100644 index 0000000..ef1fde9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_d5rxgbrj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.assets.cache new file mode 100644 index 0000000..34a8c40 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dbufxzfb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.assets.cache new file mode 100644 index 0000000..a5d54dd Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_deamumdg_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.assets.cache new file mode 100644 index 0000000..1380f11 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_defx0mmt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.assets.cache new file mode 100644 index 0000000..ffd9ce1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dfhg5jgi_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.assets.cache new file mode 100644 index 0000000..4b023b5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dhynetnr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.assets.cache new file mode 100644 index 0000000..47b2cd9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dkkowfaq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.assets.cache new file mode 100644 index 0000000..1e78e8f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_do3zazsa_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.assets.cache new file mode 100644 index 0000000..305e046 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dpjwpnes_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.assets.cache new file mode 100644 index 0000000..b8fea3f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqb2dou2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.assets.cache new file mode 100644 index 0000000..cc3079c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dqhoofoh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.assets.cache new file mode 100644 index 0000000..bb2893c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_drlr0uji_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.assets.cache new file mode 100644 index 0000000..7f4cfa3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dughihwd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.assets.cache new file mode 100644 index 0000000..f740305 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dvd4xsky_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.assets.cache new file mode 100644 index 0000000..633dad1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dwhrpqgt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.assets.cache new file mode 100644 index 0000000..d9e04b7 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_dxngrgqw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.assets.cache new file mode 100644 index 0000000..5340a68 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e1f52gqy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.assets.cache new file mode 100644 index 0000000..9f26654 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e4k32wlb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.assets.cache new file mode 100644 index 0000000..4344b0a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_e53eiakc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.assets.cache new file mode 100644 index 0000000..33cb4f9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eafnccxl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.assets.cache new file mode 100644 index 0000000..3b71b01 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ef0m4p40_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.assets.cache new file mode 100644 index 0000000..362cde8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_efmxej0k_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.assets.cache new file mode 100644 index 0000000..c3bc0ae Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eg1qerrj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.assets.cache new file mode 100644 index 0000000..9e90803 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_egsvstqe_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.assets.cache new file mode 100644 index 0000000..9f35c6c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eifrgk0u_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.assets.cache new file mode 100644 index 0000000..5df7696 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_epo4voic_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.assets.cache new file mode 100644 index 0000000..d527698 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eq0zq1df_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.assets.cache new file mode 100644 index 0000000..c9eed94 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eu03hepq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.assets.cache new file mode 100644 index 0000000..f268de3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_eusk1xos_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.assets.cache new file mode 100644 index 0000000..19d5b38 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ew3ceocs_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.assets.cache new file mode 100644 index 0000000..3293126 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ezcrjq2j_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.assets.cache new file mode 100644 index 0000000..0b6f3da Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f1kkj20z_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.assets.cache new file mode 100644 index 0000000..048faf0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_f412atht_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.assets.cache new file mode 100644 index 0000000..51ff25f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fbisrlwo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.assets.cache new file mode 100644 index 0000000..c3ea087 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fdwnlkiy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.assets.cache new file mode 100644 index 0000000..9d11bbb Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fev4u2m2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.assets.cache new file mode 100644 index 0000000..be0df10 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fi4bgomd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.assets.cache new file mode 100644 index 0000000..223f59f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fjvufp5b_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.assets.cache new file mode 100644 index 0000000..dbbebec Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fmkarcct_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.assets.cache new file mode 100644 index 0000000..3b734bc Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fp0fppd0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.assets.cache new file mode 100644 index 0000000..77752b7 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_frn40vqf_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.assets.cache new file mode 100644 index 0000000..689c4ff Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fse4t5jr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.assets.cache new file mode 100644 index 0000000..28cadc2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fugx2swo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.assets.cache new file mode 100644 index 0000000..336eb19 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fvkpc15i_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.assets.cache new file mode 100644 index 0000000..a814fcb Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_fyyztuvy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.assets.cache new file mode 100644 index 0000000..d8a41d5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g10b5ru2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.assets.cache new file mode 100644 index 0000000..f00ca8e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g43rqkat_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.assets.cache new file mode 100644 index 0000000..96a4404 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g52u1y0d_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4b60b33 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.4.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.4")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.4.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..93c5595 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +ca22310c8caa624bf551e7a7be85bb77164745e7a8832641ecef8b40d0354532 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.assets.cache new file mode 100644 index 0000000..72a3684 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_g5edkpoq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.assets.cache new file mode 100644 index 0000000..e081e10 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ga1mxnty_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.assets.cache new file mode 100644 index 0000000..c4cbec8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gahpkzrl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.assets.cache new file mode 100644 index 0000000..96da47f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gbuguj5j_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.assets.cache new file mode 100644 index 0000000..4d0f8bf Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ghtxgbfm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9b0b209 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..8bfdc0d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +884be5a72ec397a030249c12189ad2334cbbbc2b4ac23550185ababcb6c7fcd2 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.assets.cache new file mode 100644 index 0000000..c790c84 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_glsyu0wm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.assets.cache new file mode 100644 index 0000000..bbf8b58 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gmybhd4c_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.assets.cache new file mode 100644 index 0000000..980cec0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gnssfsey_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.assets.cache new file mode 100644 index 0000000..f9461e1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gonsgxx4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.assets.cache new file mode 100644 index 0000000..d8d08ed Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gstnb5cu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.assets.cache new file mode 100644 index 0000000..0a1e8c7 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gvtwsqua_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.assets.cache new file mode 100644 index 0000000..82382da Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_gwazthhd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.assets.cache new file mode 100644 index 0000000..6f9be4a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h13bpw2q_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f78324a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d1b97f9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f17df244f2fa2d91da43c001677545da830653952625ba7179c4bf1c7fce1809 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.assets.cache new file mode 100644 index 0000000..fb55b58 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h1jdomw1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..fb2381e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..23b684e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +4d66998701e5507f648c6013935531b0fbc7b577485dddadcde0684b1aa37f13 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.assets.cache new file mode 100644 index 0000000..6509918 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h20skjkr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.assets.cache new file mode 100644 index 0000000..b85f2f5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_h3jodnly_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.assets.cache new file mode 100644 index 0000000..cc00492 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hbkc3ika_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.assets.cache new file mode 100644 index 0000000..0ee4161 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_he3szyyr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.assets.cache new file mode 100644 index 0000000..a3780ad Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hjtpp3e5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.assets.cache new file mode 100644 index 0000000..f191dea Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hlacgwl3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.assets.cache new file mode 100644 index 0000000..434c51d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hsrmggsv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4ca3822 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d08142e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5ce3d7e1b9cd1df0b1767593c9b4d51fd52675a04932fd185e70d63fd1363392 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.assets.cache new file mode 100644 index 0000000..2f856ad Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hvz15cu0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.assets.cache new file mode 100644 index 0000000..6ca4f89 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hy1rn4c2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.assets.cache new file mode 100644 index 0000000..59b9c3b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_hywzbxms_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.assets.cache new file mode 100644 index 0000000..2a802ac Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i1ozsswo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.assets.cache new file mode 100644 index 0000000..3dab875 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_i33urmdy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.assets.cache new file mode 100644 index 0000000..99865c0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ich5md2w_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.assets.cache new file mode 100644 index 0000000..dba0375 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iiknae1g_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.assets.cache new file mode 100644 index 0000000..4a8e9d2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_imuy3anb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.assets.cache new file mode 100644 index 0000000..aa401a0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iptcuo5v_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.assets.cache new file mode 100644 index 0000000..2ec21f5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iqg5jjtd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.assets.cache new file mode 100644 index 0000000..28365f6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ir3mwsur_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.assets.cache new file mode 100644 index 0000000..41213e0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_islpympf_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.assets.cache new file mode 100644 index 0000000..168b7f5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iu3xlwh4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..36e1f9d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..62dffeb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +4b42a12b646e105f4a9d9ff501da4faccfd23c58f13001d2c148b0201b81c974 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.assets.cache new file mode 100644 index 0000000..58b1ff8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ivm0ayh5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.assets.cache new file mode 100644 index 0000000..6922e0e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iwdd5kpm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4ca3822 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d08142e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5ce3d7e1b9cd1df0b1767593c9b4d51fd52675a04932fd185e70d63fd1363392 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.assets.cache new file mode 100644 index 0000000..a2cfaae Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_iy5nccoe_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.assets.cache new file mode 100644 index 0000000..151c800 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_j451iwfl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.assets.cache new file mode 100644 index 0000000..b043dd1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ja2qamym_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.assets.cache new file mode 100644 index 0000000..75382dd Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jahggllw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.assets.cache new file mode 100644 index 0000000..b31b6ef Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jcezbx1i_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.assets.cache new file mode 100644 index 0000000..e70b7a6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ji4xhi1n_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.assets.cache new file mode 100644 index 0000000..dafefef Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jkwbuc2n_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.assets.cache new file mode 100644 index 0000000..4edee05 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jn2ykwju_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.assets.cache new file mode 100644 index 0000000..730d985 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jo42co4n_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.assets.cache new file mode 100644 index 0000000..f03dada Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jof4hibt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.assets.cache new file mode 100644 index 0000000..661ff09 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jp10jx2p_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.assets.cache new file mode 100644 index 0000000..2dcda7d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jroojlh3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.assets.cache new file mode 100644 index 0000000..b79d125 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_js4aotdl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.assets.cache new file mode 100644 index 0000000..1ece9e5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtd0uab3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.assets.cache new file mode 100644 index 0000000..d872afe Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtgi0n3q_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.assets.cache new file mode 100644 index 0000000..2d242e1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtu1dyvx_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.assets.cache new file mode 100644 index 0000000..855a05d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jtuq34be_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.assets.cache new file mode 100644 index 0000000..b4dff2a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ju5xixk2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.assets.cache new file mode 100644 index 0000000..b1eb309 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jvkts0jm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b7c468e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..38bcde5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +ff4f0d7c19507366d05be3756e429f7bc75378e3ff488558d9b6520919fc4744 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.assets.cache new file mode 100644 index 0000000..ba22782 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_jzl32asz_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.assets.cache new file mode 100644 index 0000000..67c8e0b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k0m5x1l2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.assets.cache new file mode 100644 index 0000000..fb207dc Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4gudr4n_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f78324a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d1b97f9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f17df244f2fa2d91da43c001677545da830653952625ba7179c4bf1c7fce1809 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.assets.cache new file mode 100644 index 0000000..e31de4f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k4p0pzpw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.assets.cache new file mode 100644 index 0000000..17a55a6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_k52umusu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.assets.cache new file mode 100644 index 0000000..05e0423 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kaxtxike_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.assets.cache new file mode 100644 index 0000000..bbf827b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kh5hfkp5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.assets.cache new file mode 100644 index 0000000..c9fee80 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kkm3ebp4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.assets.cache new file mode 100644 index 0000000..14afbce Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kmynm152_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.assets.cache new file mode 100644 index 0000000..0db34c0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kobvm1j3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.assets.cache new file mode 100644 index 0000000..d85b15e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kofu53c3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.assets.cache new file mode 100644 index 0000000..85739d6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_koqgfw3j_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.assets.cache new file mode 100644 index 0000000..0432219 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kq3onbp4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.assets.cache new file mode 100644 index 0000000..dfbbe2f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kqmf35ty_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.assets.cache new file mode 100644 index 0000000..1ed5c01 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_krbr1q3g_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.assets.cache new file mode 100644 index 0000000..78dfb7c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ktl0rg1z_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.assets.cache new file mode 100644 index 0000000..078c0a8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kvcf30au_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.assets.cache new file mode 100644 index 0000000..235b9b0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_kxbioedg_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.assets.cache new file mode 100644 index 0000000..bbe9032 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_l43pafvs_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.assets.cache new file mode 100644 index 0000000..b44765e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lbtmjia4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.assets.cache new file mode 100644 index 0000000..c116ec6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lh0ac3is_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.assets.cache new file mode 100644 index 0000000..8d53b73 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ljqzrdep_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.assets.cache new file mode 100644 index 0000000..e6f1336 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lk5uw3vb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.assets.cache new file mode 100644 index 0000000..e2a3b01 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_llmf243x_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.assets.cache new file mode 100644 index 0000000..62345d6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lmfdun3w_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.assets.cache new file mode 100644 index 0000000..6de23da Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lpmfknf2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.assets.cache new file mode 100644 index 0000000..41e9ee9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lsd4p0u0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.assets.cache new file mode 100644 index 0000000..0b94b88 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lslxjdgr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.assets.cache new file mode 100644 index 0000000..28ce824 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltb0gsxn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.assets.cache new file mode 100644 index 0000000..995c639 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltm3su4k_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.assets.cache new file mode 100644 index 0000000..bafa500 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ltvdq020_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.assets.cache new file mode 100644 index 0000000..e53edad Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lwgqmsqh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.assets.cache new file mode 100644 index 0000000..b39fe52 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxpvtb5z_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.assets.cache new file mode 100644 index 0000000..fd61036 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lxwda3lm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.assets.cache new file mode 100644 index 0000000..65b19e7 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_lzeinggs_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.assets.cache new file mode 100644 index 0000000..d188c87 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m1np3sbr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.assets.cache new file mode 100644 index 0000000..404d8c6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_m4pjuszq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.assets.cache new file mode 100644 index 0000000..91b72a5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_macdsvmu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.assets.cache new file mode 100644 index 0000000..b0fa90c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_meox5bsa_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.assets.cache new file mode 100644 index 0000000..db82a9b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mesdpdtv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.assets.cache new file mode 100644 index 0000000..3e8c0f7 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mgmgifv0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.assets.cache new file mode 100644 index 0000000..8d0865a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhpgp4gr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.assets.cache new file mode 100644 index 0000000..b6b0dbc Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mhziyn2l_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.assets.cache new file mode 100644 index 0000000..47b2f05 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mixdkdrv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.assets.cache new file mode 100644 index 0000000..4cc5847 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moskav3h_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.assets.cache new file mode 100644 index 0000000..f0a33a4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_moxwy0ns_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.assets.cache new file mode 100644 index 0000000..91e314f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mt34w5fm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.assets.cache new file mode 100644 index 0000000..f9b7c20 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mtzezoag_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.assets.cache new file mode 100644 index 0000000..5f24b39 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_mufzdie1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.assets.cache new file mode 100644 index 0000000..86d0542 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n0lokrai_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.assets.cache new file mode 100644 index 0000000..8559fcb Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n3dr4fg4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f78324a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d1b97f9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f17df244f2fa2d91da43c001677545da830653952625ba7179c4bf1c7fce1809 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.assets.cache new file mode 100644 index 0000000..78c3022 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5neglpk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.assets.cache new file mode 100644 index 0000000..711d119 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_n5yiutd5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.assets.cache new file mode 100644 index 0000000..7e90ca1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfdjrdkh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.assets.cache new file mode 100644 index 0000000..af34d29 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nfpsuaxm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.assets.cache new file mode 100644 index 0000000..27e6953 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ngcib0n4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.assets.cache new file mode 100644 index 0000000..6e16cd8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nie1wznw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.assets.cache new file mode 100644 index 0000000..6696dc2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj1mtbiw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.assets.cache new file mode 100644 index 0000000..2312459 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nj5exch1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.assets.cache new file mode 100644 index 0000000..462fea6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_njvn34bf_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.assets.cache new file mode 100644 index 0000000..ca29d74 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nle22jeb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.assets.cache new file mode 100644 index 0000000..4afbd64 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nlmcpfzp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.assets.cache new file mode 100644 index 0000000..64c0c35 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnorj0al_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.assets.cache new file mode 100644 index 0000000..0c1c691 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nnzxhvua_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.assets.cache new file mode 100644 index 0000000..476c17d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nogdxzvw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.assets.cache new file mode 100644 index 0000000..46b4f26 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nr24w35a_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..fb2381e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..23b684e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +4d66998701e5507f648c6013935531b0fbc7b577485dddadcde0684b1aa37f13 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.assets.cache new file mode 100644 index 0000000..1041a08 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nvtjnciu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.assets.cache new file mode 100644 index 0000000..f21c91a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nxvimdh0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.assets.cache new file mode 100644 index 0000000..ec319fc Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzh4g4oo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.assets.cache new file mode 100644 index 0000000..914c885 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_nzvwi3ri_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.assets.cache new file mode 100644 index 0000000..eb05fb7 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o2oyz4bq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.assets.cache new file mode 100644 index 0000000..96b5f88 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o34yindc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.assets.cache new file mode 100644 index 0000000..deaf671 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o3yohz1b_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.assets.cache new file mode 100644 index 0000000..29a711a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o40031j3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.assets.cache new file mode 100644 index 0000000..f581400 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o4l15o3a_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..fb2381e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..23b684e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +4d66998701e5507f648c6013935531b0fbc7b577485dddadcde0684b1aa37f13 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.assets.cache new file mode 100644 index 0000000..a3afc8c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_o5sfdhw4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.assets.cache new file mode 100644 index 0000000..d63e20d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oblltgla_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.assets.cache new file mode 100644 index 0000000..512cd78 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oczmsudp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.assets.cache new file mode 100644 index 0000000..cdfaac1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oe0225nn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.assets.cache new file mode 100644 index 0000000..3d962fa Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ofzc0ppw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.assets.cache new file mode 100644 index 0000000..1a8eae8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oll0lvyp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.assets.cache new file mode 100644 index 0000000..e8b7b4a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_opye5ykd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.assets.cache new file mode 100644 index 0000000..82e8fd2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ovasmzjt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f78324a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d1b97f9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f17df244f2fa2d91da43c001677545da830653952625ba7179c4bf1c7fce1809 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.assets.cache new file mode 100644 index 0000000..ae0b632 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_owvnn2ej_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.assets.cache new file mode 100644 index 0000000..0ca7d64 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_oz2yyz5b_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.assets.cache new file mode 100644 index 0000000..52743c8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ozpgy5ry_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.assets.cache new file mode 100644 index 0000000..6767032 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pc13pfbn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.assets.cache new file mode 100644 index 0000000..9863047 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pdzka4dw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.assets.cache new file mode 100644 index 0000000..0b08ff5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pf01da43_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.assets.cache new file mode 100644 index 0000000..f8df471 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_phdwozp0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.assets.cache new file mode 100644 index 0000000..be7e553 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pifz5gv0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.assets.cache new file mode 100644 index 0000000..8507e79 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkh3p122_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..e3fb442 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Commander\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.assets.cache new file mode 100644 index 0000000..425f1e9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pkydzera_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.assets.cache new file mode 100644 index 0000000..ad11437 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pm455rlc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.assets.cache new file mode 100644 index 0000000..30cc82a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pmd0hs5l_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.assets.cache new file mode 100644 index 0000000..ed1100a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppl5ec20_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.assets.cache new file mode 100644 index 0000000..99883f4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ppuzvtes_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.assets.cache new file mode 100644 index 0000000..1b8394e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pvmpjey0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.assets.cache new file mode 100644 index 0000000..160d850 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_pwfns0qv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.assets.cache new file mode 100644 index 0000000..f2a1718 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q0kinxhh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.assets.cache new file mode 100644 index 0000000..8726b3c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4e4rit3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.assets.cache new file mode 100644 index 0000000..92b3cea Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q4gx2nfk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.assets.cache new file mode 100644 index 0000000..51d248b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_q5j2kybr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.assets.cache new file mode 100644 index 0000000..df58be4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qamt3fq4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b7c468e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..38bcde5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +ff4f0d7c19507366d05be3756e429f7bc75378e3ff488558d9b6520919fc4744 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.assets.cache new file mode 100644 index 0000000..18dc326 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qdtxrvwm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.assets.cache new file mode 100644 index 0000000..6a8b88b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qf1qexhj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..e3fb442 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Commander\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.assets.cache new file mode 100644 index 0000000..956f888 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlmdr24o_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.assets.cache new file mode 100644 index 0000000..9bc3264 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qlyaztkm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.assets.cache new file mode 100644 index 0000000..7d9cab3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qm3nqdxk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.assets.cache new file mode 100644 index 0000000..9e71a78 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qn0ytyi2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.assets.cache new file mode 100644 index 0000000..87aaa59 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qoavyudv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.assets.cache new file mode 100644 index 0000000..ba1237f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qp1hds4d_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.assets.cache new file mode 100644 index 0000000..f417f5e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qqfytnyy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.assets.cache new file mode 100644 index 0000000..338a582 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qraf0fpj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.assets.cache new file mode 100644 index 0000000..fcebabb Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrbi3vy1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.assets.cache new file mode 100644 index 0000000..73f9353 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qrlxu4be_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.assets.cache new file mode 100644 index 0000000..049c2f3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_qwievfo3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.assets.cache new file mode 100644 index 0000000..934a521 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5eqhtu3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.assets.cache new file mode 100644 index 0000000..3274d3b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_r5fhv5md_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.assets.cache new file mode 100644 index 0000000..0e60ca5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rad00kh3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.assets.cache new file mode 100644 index 0000000..dbe618a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_radjxuji_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.assets.cache new file mode 100644 index 0000000..734658a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_raiewwxq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.assets.cache new file mode 100644 index 0000000..358b092 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rbho3sqo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.assets.cache new file mode 100644 index 0000000..f32d3c1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_remq1nm0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.assets.cache new file mode 100644 index 0000000..9161015 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhf1i2ut_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.assets.cache new file mode 100644 index 0000000..6c1469f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rhxqv0xf_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.assets.cache new file mode 100644 index 0000000..82994a2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rov4nyp3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.assets.cache new file mode 100644 index 0000000..506df28 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rsa1akm4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.assets.cache new file mode 100644 index 0000000..6d63269 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ruuem02o_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b7c468e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..38bcde5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +ff4f0d7c19507366d05be3756e429f7bc75378e3ff488558d9b6520919fc4744 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.assets.cache new file mode 100644 index 0000000..b3cfa4c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ryewr1sp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.assets.cache new file mode 100644 index 0000000..a2ad7f0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_rys543c4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.assets.cache new file mode 100644 index 0000000..90b8157 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s0v2ptl4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.assets.cache new file mode 100644 index 0000000..e9f3839 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2dd3t3b_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.assets.cache new file mode 100644 index 0000000..43541f2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2j5nyie_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.assets.cache new file mode 100644 index 0000000..0201842 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s2zid0gt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.assets.cache new file mode 100644 index 0000000..b2a8dd7 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_s5vbdc0x_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.assets.cache new file mode 100644 index 0000000..ce356fa Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sbeahi0p_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.assets.cache new file mode 100644 index 0000000..537a621 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sekybp0r_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.assets.cache new file mode 100644 index 0000000..f5eb1d2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sh2ohdcm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.assets.cache new file mode 100644 index 0000000..5bd6044 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_sta4qbib_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.assets.cache new file mode 100644 index 0000000..6c0c599 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t1s45u3i_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.assets.cache new file mode 100644 index 0000000..6531da0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_t2o2jdrr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.assets.cache new file mode 100644 index 0000000..151739c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_taaviny5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4b60b33 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.4.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.4")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.4.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..93c5595 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +ca22310c8caa624bf551e7a7be85bb77164745e7a8832641ecef8b40d0354532 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.assets.cache new file mode 100644 index 0000000..5995597 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ti40jngg_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.assets.cache new file mode 100644 index 0000000..9d02447 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tk0ctxsj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..fb2381e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..23b684e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +4d66998701e5507f648c6013935531b0fbc7b577485dddadcde0684b1aa37f13 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.assets.cache new file mode 100644 index 0000000..5166382 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tqglnqmb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.assets.cache new file mode 100644 index 0000000..99c26b3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tt1n3q4j_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.assets.cache new file mode 100644 index 0000000..8fa84a8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tu0flmij_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.assets.cache new file mode 100644 index 0000000..4911f99 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_twdkjqnx_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.assets.cache new file mode 100644 index 0000000..6927366 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_tykkeinn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.assets.cache new file mode 100644 index 0000000..16e257b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u3njyluq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f29aa91 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..4ba6481 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +dcac0d504b89ac8ecaea2d07006f26d0b345a124ed6bc430dc3a31fbfc846334 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.assets.cache new file mode 100644 index 0000000..e7b21ab Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u4txhsr0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.assets.cache new file mode 100644 index 0000000..286f5be Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u53321wd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.assets.cache new file mode 100644 index 0000000..fe6ad8f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_u5rmtgrz_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.assets.cache new file mode 100644 index 0000000..62ddb79 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uf2w2lmk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.assets.cache new file mode 100644 index 0000000..9ff6de5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ufhbnixj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.assets.cache new file mode 100644 index 0000000..29f4bdb Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ugnkhmzr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.assets.cache new file mode 100644 index 0000000..9ea95f0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uifa1mfb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.assets.cache new file mode 100644 index 0000000..68cffc6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uko3hkpn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.assets.cache new file mode 100644 index 0000000..5e1070e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uloq2zgm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.assets.cache new file mode 100644 index 0000000..4aa456c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_um4qdme5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.assets.cache new file mode 100644 index 0000000..38670e3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_upsbvuzm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.assets.cache new file mode 100644 index 0000000..f59f38a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uq3mts5o_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.assets.cache new file mode 100644 index 0000000..56a0230 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uqh04nve_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.assets.cache new file mode 100644 index 0000000..02e92f4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ur1vlqnr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.assets.cache new file mode 100644 index 0000000..87fd768 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_urp3pyll_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.assets.cache new file mode 100644 index 0000000..579ba69 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uvmztao4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.assets.cache new file mode 100644 index 0000000..955f250 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uwunftkp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.assets.cache new file mode 100644 index 0000000..8fcea57 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_uyl1vsmu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f78324a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d1b97f9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f17df244f2fa2d91da43c001677545da830653952625ba7179c4bf1c7fce1809 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.assets.cache new file mode 100644 index 0000000..cc21f8c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v0h24yxo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.assets.cache new file mode 100644 index 0000000..c1b1365 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_v1p3dzje_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.assets.cache new file mode 100644 index 0000000..5058b73 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vcoknxbh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.assets.cache new file mode 100644 index 0000000..76c8f0b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_veqnxopp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.assets.cache new file mode 100644 index 0000000..4e1a0a5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vff3qu0t_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.assets.cache new file mode 100644 index 0000000..526e15e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vh2r1uxx_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..af491b2 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..080ff67 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +33af9f22e65e18dfee54864862389543d93d48642fbc7c7363adf55c5fe3435b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.assets.cache new file mode 100644 index 0000000..891a57c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_viq0z1ti_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.assets.cache new file mode 100644 index 0000000..443a1db Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vjjnrxgl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.assets.cache new file mode 100644 index 0000000..f5793c0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vo5mof01_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.assets.cache new file mode 100644 index 0000000..90f1975 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vobi14rz_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.assets.cache new file mode 100644 index 0000000..b75f3d1 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vp4vfijz_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.assets.cache new file mode 100644 index 0000000..dce23c6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vpunzxs0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.assets.cache new file mode 100644 index 0000000..adfa2ed Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vq0yknd5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.assets.cache new file mode 100644 index 0000000..024ce80 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vr2jnbcu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.assets.cache new file mode 100644 index 0000000..310b2f5 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_vv5n54i0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.assets.cache new file mode 100644 index 0000000..91d9c82 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_w2tqb20a_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.assets.cache new file mode 100644 index 0000000..cbc48d9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_waadasp4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.assets.cache new file mode 100644 index 0000000..8250cc4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wbm1dc5r_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.assets.cache new file mode 100644 index 0000000..da4581f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wc3ykmzw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.assets.cache new file mode 100644 index 0000000..8183bc8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wchjmlvp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.assets.cache new file mode 100644 index 0000000..f45f863 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wfwarkpr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.assets.cache new file mode 100644 index 0000000..bec4a62 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wiros0z3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.assets.cache new file mode 100644 index 0000000..d22afa6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wjvwsgbk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.assets.cache new file mode 100644 index 0000000..1aebb16 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkj1oqnk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.assets.cache new file mode 100644 index 0000000..2a39068 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wkl43us2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9b0b209 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..8bfdc0d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +884be5a72ec397a030249c12189ad2334cbbbc2b4ac23550185ababcb6c7fcd2 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.assets.cache new file mode 100644 index 0000000..866940b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wlm0p35p_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.assets.cache new file mode 100644 index 0000000..b435b0d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wogsd1tt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.assets.cache new file mode 100644 index 0000000..e642d84 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_woz1xjem_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.assets.cache new file mode 100644 index 0000000..52bf7ca Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wqotkwzt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.assets.cache new file mode 100644 index 0000000..ad32b2c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wr5wb231_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.assets.cache new file mode 100644 index 0000000..86d747e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wwiloj3p_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.assets.cache new file mode 100644 index 0000000..e0dc30e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_wzpmgvja_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.assets.cache new file mode 100644 index 0000000..6c69349 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x2q4fhkn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.assets.cache new file mode 100644 index 0000000..21e5412 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x4y1tddd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.assets.cache new file mode 100644 index 0000000..3e0bd9f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_x5akpztl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.assets.cache new file mode 100644 index 0000000..633d33a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xaywmc5q_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..4202225 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..123ef55 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +59f959ad5c16c845e7be6bb014ccfe57198efebbbb16d2d1eab2370a6f2ec7da diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.assets.cache new file mode 100644 index 0000000..3a65c0a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xbksw5b4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.assets.cache new file mode 100644 index 0000000..d1aa5eb Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xe1ozagp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.assets.cache new file mode 100644 index 0000000..6a4c047 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xg44kwfy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.assets.cache new file mode 100644 index 0000000..b289a3c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xhhmn0bc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.assets.cache new file mode 100644 index 0000000..bd9faaf Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xivkowrj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.assets.cache new file mode 100644 index 0000000..aad9731 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xiwas5nq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.assets.cache new file mode 100644 index 0000000..7d738fe Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xmd2ol53_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.assets.cache new file mode 100644 index 0000000..469725b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xr5ghad5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.assets.cache new file mode 100644 index 0000000..36512b3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xropjl21_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.assets.cache new file mode 100644 index 0000000..3d884d7 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xux5ydz1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.assets.cache new file mode 100644 index 0000000..0513d29 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xx2bp3sm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.assets.cache new file mode 100644 index 0000000..fa8161c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_xyhxcxhb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.assets.cache new file mode 100644 index 0000000..0e6b10d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1cevlpf_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.assets.cache new file mode 100644 index 0000000..5502c24 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y1w2sz0k_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.assets.cache new file mode 100644 index 0000000..a3585cd Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_y20pef41_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.assets.cache new file mode 100644 index 0000000..bebfdc9 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ya2mgpge_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.assets.cache new file mode 100644 index 0000000..908cef8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yagjafkp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.assets.cache new file mode 100644 index 0000000..c7bd06d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yb4qz01t_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.assets.cache new file mode 100644 index 0000000..6953ac2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeg5d0cy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f78324a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d1b97f9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f17df244f2fa2d91da43c001677545da830653952625ba7179c4bf1c7fce1809 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.assets.cache new file mode 100644 index 0000000..2d81aa0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yeiergmv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.assets.cache new file mode 100644 index 0000000..9dddf74 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yhnijlqb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.assets.cache new file mode 100644 index 0000000..f33012f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yklpi1cp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.assets.cache new file mode 100644 index 0000000..0750e0f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_ylxmupx4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.assets.cache new file mode 100644 index 0000000..8f50691 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yo0a2sgz_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..456aa9f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..f5a3669 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +cc2bdb67211250fa86b9356753e6ffefa1b0e88361602444b191af4ec6e95bd7 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.assets.cache new file mode 100644 index 0000000..7a044b0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yonqnubx_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.assets.cache new file mode 100644 index 0000000..c81f7ca Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_yxzlzlo0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ec7546d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..102d5e7 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d129eebc41490377fb7208e267b5360645e12089aa45e82a89824011123e6f89 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.assets.cache new file mode 100644 index 0000000..6f4d729 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z24rgkio_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..272b7b0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1b95447 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c179c69c2600abbdbd0cd31ff24db9bf7b3f61f608ebbda5f58f3a71a4b264e9 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.assets.cache new file mode 100644 index 0000000..e405552 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z4gyrbkj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.assets.cache new file mode 100644 index 0000000..d61ea28 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5b2gpen_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f865640 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0+511366997a73bfafad6e1f6cc594710f52fe992f")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2b1d7d5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2753dc329edc37045e24f72bf4422c909166f77d0b20af2cbfb9ce3047693325 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.assets.cache new file mode 100644 index 0000000..0391cfb Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_z5yzzewg_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..e475241 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5ffb84b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +d81b05d243b1329906110d8abd977432a18f4b88e823b9356c072db22d6027ce diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.assets.cache new file mode 100644 index 0000000..120005e Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zebn0ji3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..05fb49e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c1b6e17 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c0a791b6b1e23fb4fa511bd4b1a5dd59bfa90e299075e49c4b35a953851e6f80 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.assets.cache new file mode 100644 index 0000000..832db78 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zeyw4yy2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..56be2e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e8a57e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a2120cfa751174a9ab1329c56671b194a0d107257b1676bda7afef5bdd001721 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.assets.cache new file mode 100644 index 0000000..878fc90 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zixk45pj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..2ccc8a1 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..5806575 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6f23906c48668c9ee3e1da335fb7130bd41b89aa11493d401a604814013ff82b diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.assets.cache new file mode 100644 index 0000000..bb010f2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zqzzgwwy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..122f233 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..37b5cfb --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7bd7a9f035fc91b35c8f2a60721d416f6db9dd294973212029c4f2de533700f5 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.assets.cache new file mode 100644 index 0000000..85ed961 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zrhiin23_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7345a8d --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e9fd33e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +354d5e72c2393c78b8810a318c769e4639a6d69354a60bc2a3510a8831d8f647 diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.assets.cache b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.assets.cache new file mode 100644 index 0000000..5f460b6 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/AxCopilot_zs0u4ad5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/GeneratedInternalTypeHelper.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/GeneratedInternalTypeHelper.g.cs new file mode 100644 index 0000000..e035e89 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/GeneratedInternalTypeHelper.g.cs @@ -0,0 +1,61 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace XamlGeneratedNamespace { + + + /// + /// GeneratedInternalTypeHelper + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + public sealed class GeneratedInternalTypeHelper : System.Windows.Markup.InternalTypeHelper { + + /// + /// CreateInstance + /// + protected override object CreateInstance(System.Type type, System.Globalization.CultureInfo culture) { + return System.Activator.CreateInstance(type, ((System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic) + | (System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.CreateInstance)), null, null, culture); + } + + /// + /// GetPropertyValue + /// + protected override object GetPropertyValue(System.Reflection.PropertyInfo propertyInfo, object target, System.Globalization.CultureInfo culture) { + return propertyInfo.GetValue(target, System.Reflection.BindingFlags.Default, null, null, culture); + } + + /// + /// SetPropertyValue + /// + protected override void SetPropertyValue(System.Reflection.PropertyInfo propertyInfo, object target, object value, System.Globalization.CultureInfo culture) { + propertyInfo.SetValue(target, value, System.Reflection.BindingFlags.Default, null, null, culture); + } + + /// + /// CreateDelegate + /// + protected override System.Delegate CreateDelegate(System.Type delegateType, object target, string handler) { + return ((System.Delegate)(target.GetType().InvokeMember("_CreateDelegate", (System.Reflection.BindingFlags.InvokeMethod + | (System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)), null, target, new object[] { + delegateType, + handler}, null))); + } + + /// + /// AddEventHandler + /// + protected override void AddEventHandler(System.Reflection.EventInfo eventInfo, object target, System.Delegate handler) { + eventInfo.AddEventHandler(target, handler); + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Themes/Codex.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Themes/Codex.baml new file mode 100644 index 0000000..56dec55 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Themes/Codex.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AboutWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AboutWindow.baml new file mode 100644 index 0000000..c6327e7 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AboutWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AboutWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AboutWindow.g.cs new file mode 100644 index 0000000..c8e2e8c --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AboutWindow.g.cs @@ -0,0 +1,270 @@ +#pragma checksum "..\..\..\..\..\Views\AboutWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "2A37B0CE577C6027D104B073B2DC456FEFC9E12A" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// AboutWindow + /// + public partial class AboutWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 103 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas DiamondIconCanvas; + + #line default + #line hidden + + + #line 132 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Image AppIconImage; + + #line default + #line hidden + + + #line 135 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock FallbackIcon; + + #line default + #line hidden + + + #line 144 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Image MascotImage; + + #line default + #line hidden + + + #line 146 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock AppNameText; + + #line default + #line hidden + + + #line 152 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock VersionText; + + #line default + #line hidden + + + #line 160 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Grid MascotOverlay; + + #line default + #line hidden + + + #line 179 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Image MascotOverlayImage; + + #line default + #line hidden + + + #line 209 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PurposeText; + + #line default + #line hidden + + + #line 237 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CompanyNameText; + + #line default + #line hidden + + + #line 265 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BlogLinkBtn; + + #line default + #line hidden + + + #line 273 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Grid ContributorsGrid; + + #line default + #line hidden + + + #line 286 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ContributorsText; + + #line default + #line hidden + + + #line 301 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock BuildInfoText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/aboutwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\AboutWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 15 "..\..\..\..\..\Views\AboutWindow.xaml" + ((AxCopilot.Views.AboutWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + return; + case 2: + + #line 72 "..\..\..\..\..\Views\AboutWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 3: + this.DiamondIconCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 4: + this.AppIconImage = ((System.Windows.Controls.Image)(target)); + return; + case 5: + this.FallbackIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + this.MascotImage = ((System.Windows.Controls.Image)(target)); + return; + case 7: + this.AppNameText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: + this.VersionText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 9: + this.MascotOverlay = ((System.Windows.Controls.Grid)(target)); + return; + case 10: + + #line 166 "..\..\..\..\..\Views\AboutWindow.xaml" + ((System.Windows.Shapes.Rectangle)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.HideMascot_Click); + + #line default + #line hidden + return; + case 11: + this.MascotOverlayImage = ((System.Windows.Controls.Image)(target)); + return; + case 12: + this.PurposeText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 13: + + #line 224 "..\..\..\..\..\Views\AboutWindow.xaml" + ((System.Windows.Controls.Grid)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.ShowMascot_Click); + + #line default + #line hidden + return; + case 14: + this.CompanyNameText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 15: + this.BlogLinkBtn = ((System.Windows.Controls.Button)(target)); + + #line 268 "..\..\..\..\..\Views\AboutWindow.xaml" + this.BlogLinkBtn.Click += new System.Windows.RoutedEventHandler(this.Blog_Click); + + #line default + #line hidden + return; + case 16: + this.ContributorsGrid = ((System.Windows.Controls.Grid)(target)); + return; + case 17: + this.ContributorsText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 18: + this.BuildInfoText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.baml new file mode 100644 index 0000000..07c19f2 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.g.cs new file mode 100644 index 0000000..b12d19f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.g.cs @@ -0,0 +1,267 @@ +#pragma checksum "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "0E07DAFD7F5E4E82750CB3C022924CD06643CD18" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// AgentStatsDashboardWindow + /// + public partial class AgentStatsDashboardWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 34 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnClose; + + #line default + #line hidden + + + #line 57 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FilterToday; + + #line default + #line hidden + + + #line 61 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border Filter7d; + + #line default + #line hidden + + + #line 65 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border Filter30d; + + #line default + #line hidden + + + #line 69 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FilterAll; + + #line default + #line hidden + + + #line 89 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.UniformGrid SummaryCards; + + #line default + #line hidden + + + #line 95 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DailyChartTitle; + + #line default + #line hidden + + + #line 98 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas DailyBarChart; + + #line default + #line hidden + + + #line 99 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas DailyBarLabels; + + #line default + #line hidden + + + #line 116 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ToolFreqPanel; + + #line default + #line hidden + + + #line 126 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TabBreakPanel; + + #line default + #line hidden + + + #line 129 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ModelBreakPanel; + + #line default + #line hidden + + + #line 139 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/agentstatsdashboardwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 25 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.BtnClose = ((System.Windows.Controls.Border)(target)); + + #line 35 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.BtnClose.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 3: + this.FilterToday = ((System.Windows.Controls.Border)(target)); + + #line 58 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.FilterToday.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.Filter_Click); + + #line default + #line hidden + return; + case 4: + this.Filter7d = ((System.Windows.Controls.Border)(target)); + + #line 62 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.Filter7d.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.Filter_Click); + + #line default + #line hidden + return; + case 5: + this.Filter30d = ((System.Windows.Controls.Border)(target)); + + #line 66 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.Filter30d.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.Filter_Click); + + #line default + #line hidden + return; + case 6: + this.FilterAll = ((System.Windows.Controls.Border)(target)); + + #line 70 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.FilterAll.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.Filter_Click); + + #line default + #line hidden + return; + case 7: + + #line 75 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClearStats_Click); + + #line default + #line hidden + return; + case 8: + this.SummaryCards = ((System.Windows.Controls.Primitives.UniformGrid)(target)); + return; + case 9: + this.DailyChartTitle = ((System.Windows.Controls.TextBlock)(target)); + return; + case 10: + this.DailyBarChart = ((System.Windows.Controls.Canvas)(target)); + return; + case 11: + this.DailyBarLabels = ((System.Windows.Controls.Canvas)(target)); + return; + case 12: + this.ToolFreqPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 13: + this.TabBreakPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 14: + this.ModelBreakPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 15: + this.StatusText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ChatWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ChatWindow.baml new file mode 100644 index 0000000..8dd0df3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ChatWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ChatWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ChatWindow.g.cs new file mode 100644 index 0000000..83ae704 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ChatWindow.g.cs @@ -0,0 +1,1736 @@ +#pragma checksum "..\..\..\..\..\Views\ChatWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "760AA964D0D00D0F76130D24399DB1A82696927D" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using AxCopilot.Views.Controls; +using Microsoft.Web.WebView2.Wpf; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ChatWindow + /// + public partial class ChatWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 125 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ColumnDefinition IconBarColumn; + + #line default + #line hidden + + + #line 127 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ColumnDefinition SidebarColumn; + + #line default + #line hidden + + + #line 130 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ColumnDefinition SplitterColumn; + + #line default + #line hidden + + + #line 132 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ColumnDefinition PreviewColumn; + + #line default + #line hidden + + + #line 134 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ColumnDefinition SettingsPanelColumn; + + #line default + #line hidden + + + #line 138 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border IconBarPanel; + + #line default + #line hidden + + + #line 174 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnUserIconBar; + + #line default + #line hidden + + + #line 180 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UserInitialIconBar; + + #line default + #line hidden + + + #line 190 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SidebarPanel; + + #line default + #line hidden + + + #line 214 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnNewChat; + + #line default + #line hidden + + + #line 229 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox SearchBox; + + #line default + #line hidden + + + #line 239 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnCategoryDrop; + + #line default + #line hidden + + + #line 244 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CategoryIcon; + + #line default + #line hidden + + + #line 248 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CategoryLabel; + + #line default + #line hidden + + + #line 263 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ConversationPanel; + + #line default + #line hidden + + + #line 269 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnDeleteAll; + + #line default + #line hidden + + + #line 289 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UserInitialSidebar; + + #line default + #line hidden + + + #line 293 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UserNameText; + + #line default + #line hidden + + + #line 296 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UserPcText; + + #line default + #line hidden + + + #line 326 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ChatTitle; + + #line default + #line hidden + + + #line 332 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox ChatTitleEdit; + + #line default + #line hidden + + + #line 346 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnPlanMode; + + #line default + #line hidden + + + #line 352 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PlanModeIcon; + + #line default + #line hidden + + + #line 355 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PlanModeLabel; + + #line default + #line hidden + + + #line 358 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PlanModeValue; + + #line default + #line hidden + + + #line 363 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnPreviewToggle; + + #line default + #line hidden + + + #line 367 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Ellipse PreviewDot; + + #line default + #line hidden + + + #line 379 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border AgentProgressBar; + + #line default + #line hidden + + + #line 392 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ProgressIcon; + + #line default + #line hidden + + + #line 397 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ProgressStepLabel; + + #line default + #line hidden + + + #line 405 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border ProgressFill; + + #line default + #line hidden + + + #line 409 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ProgressPercent; + + #line default + #line hidden + + + #line 414 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ProgressElapsed; + + #line default + #line hidden + + + #line 426 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnToggleSidebar; + + #line default + #line hidden + + + #line 430 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToggleSidebarIcon; + + #line default + #line hidden + + + #line 440 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton TabChat; + + #line default + #line hidden + + + #line 443 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton TabCowork; + + #line default + #line hidden + + + #line 446 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton TabCode; + + #line default + #line hidden + + + #line 465 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock MaximizeIcon; + + #line default + #line hidden + + + #line 477 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border MessageSearchBar; + + #line default + #line hidden + + + #line 494 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox SearchTextBox; + + #line default + #line hidden + + + #line 499 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SearchResultCount; + + #line default + #line hidden + + + #line 522 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer MessageScroll; + + #line default + #line hidden + + + #line 526 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MessagePanel; + + #line default + #line hidden + + + #line 536 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel EmptyState; + + #line default + #line hidden + + + #line 541 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border EmptyIcon; + + #line default + #line hidden + + + #line 550 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.TranslateTransform EmptyIconTranslate; + + #line default + #line hidden + + + #line 572 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock EmptyStateTitle; + + #line default + #line hidden + + + #line 574 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock EmptyStateDesc; + + #line default + #line hidden + + + #line 579 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.WrapPanel TopicButtonPanel; + + #line default + #line hidden + + + #line 584 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup TemplatePopup; + + #line default + #line hidden + + + #line 596 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl TemplateItems; + + #line default + #line hidden + + + #line 597 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TemplateEmptyHint; + + #line default + #line hidden + + + #line 606 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup PermissionPopup; + + #line default + #line hidden + + + #line 614 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel PermissionItems; + + #line default + #line hidden + + + #line 619 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup DataUsagePopup; + + #line default + #line hidden + + + #line 627 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel DataUsageItems; + + #line default + #line hidden + + + #line 632 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup SlashPopup; + + #line default + #line hidden + + + #line 643 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SlashNavUp; + + #line default + #line hidden + + + #line 655 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SlashNavUpText; + + #line default + #line hidden + + + #line 660 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl SlashItems; + + #line default + #line hidden + + + #line 662 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SlashNavDown; + + #line default + #line hidden + + + #line 674 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SlashNavDownText; + + #line default + #line hidden + + + #line 683 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup FolderMenuPopup; + + #line default + #line hidden + + + #line 691 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel FolderMenuItems; + + #line default + #line hidden + + + #line 696 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border ToastBorder; + + #line default + #line hidden + + + #line 704 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToastIcon; + + #line default + #line hidden + + + #line 706 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToastText; + + #line default + #line hidden + + + #line 717 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border InputGlowBorder; + + #line default + #line hidden + + + #line 720 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.LinearGradientBrush RainbowBrush; + + #line default + #line hidden + + + #line 738 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border InputBorder; + + #line default + #line hidden + + + #line 751 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnModelSelector; + + #line default + #line hidden + + + #line 762 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ModelLabel; + + #line default + #line hidden + + + #line 770 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnTemplateSelector; + + #line default + #line hidden + + + #line 789 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl AttachedFilesPanel; + + #line default + #line hidden + + + #line 809 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox InputBox; + + #line default + #line hidden + + + #line 823 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock InputWatermark; + + #line default + #line hidden + + + #line 830 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SlashCommandChip; + + #line default + #line hidden + + + #line 839 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SlashChipText; + + #line default + #line hidden + + + #line 843 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SlashChipClose; + + #line default + #line hidden + + + #line 855 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAttach; + + #line default + #line hidden + + + #line 874 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnPause; + + #line default + #line hidden + + + #line 881 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PauseIcon; + + #line default + #line hidden + + + #line 888 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnStop; + + #line default + #line hidden + + + #line 903 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnSend; + + #line default + #line hidden + + + #line 932 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FolderBar; + + #line default + #line hidden + + + #line 953 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock FolderPathLabel; + + #line default + #line hidden + + + #line 972 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MoodIconPanel; + + #line default + #line hidden + + + #line 976 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FormatMoodSeparator; + + #line default + #line hidden + + + #line 980 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnDataUsage; + + #line default + #line hidden + + + #line 985 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DataUsageIcon; + + #line default + #line hidden + + + #line 988 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DataUsageLabel; + + #line default + #line hidden + + + #line 999 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnPermission; + + #line default + #line hidden + + + #line 1002 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PermissionIcon; + + #line default + #line hidden + + + #line 1005 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PermissionLabel; + + #line default + #line hidden + + + #line 1014 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup FormatMenuPopup; + + #line default + #line hidden + + + #line 1021 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel FormatMenuItems; + + #line default + #line hidden + + + #line 1026 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup MoodMenuPopup; + + #line default + #line hidden + + + #line 1034 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MoodMenuItems; + + #line default + #line hidden + + + #line 1040 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border AutoPermissionWarning; + + #line default + #line hidden + + + #line 1049 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAutoWarningClose; + + #line default + #line hidden + + + #line 1061 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FileBrowserPanel; + + #line default + #line hidden + + + #line 1077 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock FileBrowserTitle; + + #line default + #line hidden + + + #line 1102 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TreeView FileTreeView; + + #line default + #line hidden + + + #line 1117 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusDiamond; + + #line default + #line hidden + + + #line 1122 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.RotateTransform StatusDiamondRotate; + + #line default + #line hidden + + + #line 1125 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusLabel; + + #line default + #line hidden + + + #line 1132 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnShowAnalyzer; + + #line default + #line hidden + + + #line 1143 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusElapsed; + + #line default + #line hidden + + + #line 1146 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusTokens; + + #line default + #line hidden + + + #line 1155 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.GridSplitter PreviewSplitter; + + #line default + #line hidden + + + #line 1167 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border PreviewPanel; + + #line default + #line hidden + + + #line 1184 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel PreviewTabPanel; + + #line default + #line hidden + + + #line 1187 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnOpenExternal; + + #line default + #line hidden + + + #line 1203 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal Microsoft.Web.WebView2.Wpf.WebView2 PreviewWebView; + + #line default + #line hidden + + + #line 1204 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer PreviewTextScroll; + + #line default + #line hidden + + + #line 1206 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewTextBlock; + + #line default + #line hidden + + + #line 1210 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.DataGrid PreviewDataGrid; + + #line default + #line hidden + + + #line 1217 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewEmpty; + + #line default + #line hidden + + + #line 1226 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal AxCopilot.Views.Controls.AgentSettingsPanel SettingsPanel; + + #line default + #line hidden + + + #line 1230 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Thumb ResizeGrip; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/chatwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ChatWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal System.Delegate _CreateDelegate(System.Type delegateType, string handler) { + return System.Delegate.CreateDelegate(delegateType, this, handler); + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + this.IconBarColumn = ((System.Windows.Controls.ColumnDefinition)(target)); + return; + case 2: + this.SidebarColumn = ((System.Windows.Controls.ColumnDefinition)(target)); + return; + case 3: + this.SplitterColumn = ((System.Windows.Controls.ColumnDefinition)(target)); + return; + case 4: + this.PreviewColumn = ((System.Windows.Controls.ColumnDefinition)(target)); + return; + case 5: + this.SettingsPanelColumn = ((System.Windows.Controls.ColumnDefinition)(target)); + return; + case 6: + this.IconBarPanel = ((System.Windows.Controls.Border)(target)); + return; + case 7: + + #line 151 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnNewChat_Click); + + #line default + #line hidden + return; + case 8: + + #line 160 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnToggleSidebar_Click); + + #line default + #line hidden + return; + case 9: + + #line 166 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnCategoryDrop_Click); + + #line default + #line hidden + return; + case 10: + this.BtnUserIconBar = ((System.Windows.Controls.Button)(target)); + return; + case 11: + this.UserInitialIconBar = ((System.Windows.Controls.TextBlock)(target)); + return; + case 12: + this.SidebarPanel = ((System.Windows.Controls.Border)(target)); + return; + case 13: + this.BtnNewChat = ((System.Windows.Controls.Button)(target)); + + #line 216 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnNewChat.Click += new System.Windows.RoutedEventHandler(this.BtnNewChat_Click); + + #line default + #line hidden + return; + case 14: + this.SearchBox = ((System.Windows.Controls.TextBox)(target)); + + #line 233 "..\..\..\..\..\Views\ChatWindow.xaml" + this.SearchBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.SearchBox_TextChanged); + + #line default + #line hidden + return; + case 15: + this.BtnCategoryDrop = ((System.Windows.Controls.Button)(target)); + + #line 241 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnCategoryDrop.Click += new System.Windows.RoutedEventHandler(this.BtnCategoryDrop_Click); + + #line default + #line hidden + return; + case 16: + this.CategoryIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 17: + this.CategoryLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 18: + this.ConversationPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 19: + this.BtnDeleteAll = ((System.Windows.Controls.Button)(target)); + + #line 271 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnDeleteAll.Click += new System.Windows.RoutedEventHandler(this.BtnDeleteAll_Click); + + #line default + #line hidden + return; + case 20: + this.UserInitialSidebar = ((System.Windows.Controls.TextBlock)(target)); + return; + case 21: + this.UserNameText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 22: + this.UserPcText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 23: + this.ChatTitle = ((System.Windows.Controls.TextBlock)(target)); + + #line 330 "..\..\..\..\..\Views\ChatWindow.xaml" + this.ChatTitle.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.ChatTitle_MouseDown); + + #line default + #line hidden + return; + case 24: + this.ChatTitleEdit = ((System.Windows.Controls.TextBox)(target)); + + #line 339 "..\..\..\..\..\Views\ChatWindow.xaml" + this.ChatTitleEdit.LostFocus += new System.Windows.RoutedEventHandler(this.ChatTitleEdit_LostFocus); + + #line default + #line hidden + + #line 340 "..\..\..\..\..\Views\ChatWindow.xaml" + this.ChatTitleEdit.KeyDown += new System.Windows.Input.KeyEventHandler(this.ChatTitleEdit_KeyDown); + + #line default + #line hidden + return; + case 25: + this.BtnPlanMode = ((System.Windows.Controls.Border)(target)); + + #line 349 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnPlanMode.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnPlanMode_Click); + + #line default + #line hidden + return; + case 26: + this.PlanModeIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 27: + this.PlanModeLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 28: + this.PlanModeValue = ((System.Windows.Controls.TextBlock)(target)); + return; + case 29: + this.BtnPreviewToggle = ((System.Windows.Controls.Button)(target)); + + #line 364 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnPreviewToggle.Click += new System.Windows.RoutedEventHandler(this.BtnPreviewToggle_Click); + + #line default + #line hidden + return; + case 30: + this.PreviewDot = ((System.Windows.Shapes.Ellipse)(target)); + return; + case 31: + this.AgentProgressBar = ((System.Windows.Controls.Border)(target)); + return; + case 32: + this.ProgressIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 33: + this.ProgressStepLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 34: + this.ProgressFill = ((System.Windows.Controls.Border)(target)); + return; + case 35: + this.ProgressPercent = ((System.Windows.Controls.TextBlock)(target)); + return; + case 36: + this.ProgressElapsed = ((System.Windows.Controls.TextBlock)(target)); + return; + case 37: + this.BtnToggleSidebar = ((System.Windows.Controls.Button)(target)); + + #line 428 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnToggleSidebar.Click += new System.Windows.RoutedEventHandler(this.BtnToggleSidebar_Click); + + #line default + #line hidden + return; + case 38: + this.ToggleSidebarIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 39: + this.TabChat = ((System.Windows.Controls.RadioButton)(target)); + + #line 442 "..\..\..\..\..\Views\ChatWindow.xaml" + this.TabChat.Checked += new System.Windows.RoutedEventHandler(this.TabChat_Checked); + + #line default + #line hidden + return; + case 40: + this.TabCowork = ((System.Windows.Controls.RadioButton)(target)); + + #line 445 "..\..\..\..\..\Views\ChatWindow.xaml" + this.TabCowork.Checked += new System.Windows.RoutedEventHandler(this.TabCowork_Checked); + + #line default + #line hidden + return; + case 41: + this.TabCode = ((System.Windows.Controls.RadioButton)(target)); + + #line 448 "..\..\..\..\..\Views\ChatWindow.xaml" + this.TabCode.Checked += new System.Windows.RoutedEventHandler(this.TabCode_Checked); + + #line default + #line hidden + return; + case 42: + + #line 456 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnSettings_Click); + + #line default + #line hidden + return; + case 43: + + #line 460 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnMinimize_Click); + + #line default + #line hidden + return; + case 44: + + #line 464 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnMaximize_Click); + + #line default + #line hidden + return; + case 45: + this.MaximizeIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 46: + + #line 468 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 47: + this.MessageSearchBar = ((System.Windows.Controls.Border)(target)); + return; + case 48: + this.SearchTextBox = ((System.Windows.Controls.TextBox)(target)); + + #line 498 "..\..\..\..\..\Views\ChatWindow.xaml" + this.SearchTextBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.SearchTextBox_TextChanged); + + #line default + #line hidden + return; + case 49: + this.SearchResultCount = ((System.Windows.Controls.TextBlock)(target)); + return; + case 50: + + #line 504 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SearchPrev_Click); + + #line default + #line hidden + return; + case 51: + + #line 509 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SearchNext_Click); + + #line default + #line hidden + return; + case 52: + + #line 514 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SearchClose_Click); + + #line default + #line hidden + return; + case 53: + this.MessageScroll = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 54: + this.MessagePanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 55: + this.EmptyState = ((System.Windows.Controls.StackPanel)(target)); + return; + case 56: + this.EmptyIcon = ((System.Windows.Controls.Border)(target)); + return; + case 57: + this.EmptyIconTranslate = ((System.Windows.Media.TranslateTransform)(target)); + return; + case 58: + this.EmptyStateTitle = ((System.Windows.Controls.TextBlock)(target)); + return; + case 59: + this.EmptyStateDesc = ((System.Windows.Controls.TextBlock)(target)); + return; + case 60: + this.TopicButtonPanel = ((System.Windows.Controls.WrapPanel)(target)); + return; + case 61: + this.TemplatePopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 62: + this.TemplateItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 63: + this.TemplateEmptyHint = ((System.Windows.Controls.TextBlock)(target)); + return; + case 64: + this.PermissionPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 65: + this.PermissionItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 66: + this.DataUsagePopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 67: + this.DataUsageItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 68: + this.SlashPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 69: + + #line 640 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Border)(target)).PreviewMouseWheel += new System.Windows.Input.MouseWheelEventHandler(this.SlashPopup_PreviewMouseWheel); + + #line default + #line hidden + return; + case 70: + this.SlashNavUp = ((System.Windows.Controls.Border)(target)); + return; + case 71: + this.SlashNavUpText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 72: + this.SlashItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 73: + this.SlashNavDown = ((System.Windows.Controls.Border)(target)); + return; + case 74: + this.SlashNavDownText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 75: + this.FolderMenuPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 76: + this.FolderMenuItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 77: + this.ToastBorder = ((System.Windows.Controls.Border)(target)); + return; + case 78: + this.ToastIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 79: + this.ToastText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 80: + this.InputGlowBorder = ((System.Windows.Controls.Border)(target)); + return; + case 81: + this.RainbowBrush = ((System.Windows.Media.LinearGradientBrush)(target)); + return; + case 82: + this.InputBorder = ((System.Windows.Controls.Border)(target)); + return; + case 83: + this.BtnModelSelector = ((System.Windows.Controls.Button)(target)); + + #line 755 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnModelSelector.Click += new System.Windows.RoutedEventHandler(this.BtnModelSelector_Click); + + #line default + #line hidden + return; + case 84: + this.ModelLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 85: + this.BtnTemplateSelector = ((System.Windows.Controls.Button)(target)); + + #line 774 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnTemplateSelector.Click += new System.Windows.RoutedEventHandler(this.BtnTemplateSelector_Click); + + #line default + #line hidden + return; + case 86: + this.AttachedFilesPanel = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 87: + this.InputBox = ((System.Windows.Controls.TextBox)(target)); + + #line 817 "..\..\..\..\..\Views\ChatWindow.xaml" + this.InputBox.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.InputBox_PreviewKeyDown); + + #line default + #line hidden + + #line 818 "..\..\..\..\..\Views\ChatWindow.xaml" + this.InputBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.InputBox_TextChanged); + + #line default + #line hidden + return; + case 88: + this.InputWatermark = ((System.Windows.Controls.TextBlock)(target)); + return; + case 89: + this.SlashCommandChip = ((System.Windows.Controls.Border)(target)); + return; + case 90: + this.SlashChipText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 91: + this.SlashChipClose = ((System.Windows.Controls.Border)(target)); + return; + case 92: + this.BtnAttach = ((System.Windows.Controls.Button)(target)); + + #line 857 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnAttach.Click += new System.Windows.RoutedEventHandler(this.BtnAttach_Click); + + #line default + #line hidden + return; + case 93: + + #line 867 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnExport_Click); + + #line default + #line hidden + return; + case 94: + this.BtnPause = ((System.Windows.Controls.Border)(target)); + + #line 879 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnPause.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnPause_Click); + + #line default + #line hidden + return; + case 95: + this.PauseIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 96: + this.BtnStop = ((System.Windows.Controls.Button)(target)); + + #line 890 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnStop.Click += new System.Windows.RoutedEventHandler(this.BtnStop_Click); + + #line default + #line hidden + return; + case 97: + this.BtnSend = ((System.Windows.Controls.Button)(target)); + + #line 905 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnSend.Click += new System.Windows.RoutedEventHandler(this.BtnSend_Click); + + #line default + #line hidden + return; + case 98: + this.FolderBar = ((System.Windows.Controls.Border)(target)); + return; + case 99: + this.FolderPathLabel = ((System.Windows.Controls.TextBlock)(target)); + + #line 957 "..\..\..\..\..\Views\ChatWindow.xaml" + this.FolderPathLabel.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.FolderPathLabel_Click); + + #line default + #line hidden + return; + case 100: + + #line 962 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnFolderClear_Click); + + #line default + #line hidden + return; + case 101: + this.MoodIconPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 102: + this.FormatMoodSeparator = ((System.Windows.Controls.Border)(target)); + return; + case 103: + this.BtnDataUsage = ((System.Windows.Controls.Border)(target)); + + #line 982 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnDataUsage.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnDataUsage_Click); + + #line default + #line hidden + return; + case 104: + this.DataUsageIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 105: + this.DataUsageLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 106: + this.BtnPermission = ((System.Windows.Controls.Button)(target)); + + #line 1000 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnPermission.Click += new System.Windows.RoutedEventHandler(this.BtnPermission_Click); + + #line default + #line hidden + return; + case 107: + this.PermissionIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 108: + this.PermissionLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 109: + this.FormatMenuPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 110: + this.FormatMenuItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 111: + this.MoodMenuPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 112: + this.MoodMenuItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 113: + this.AutoPermissionWarning = ((System.Windows.Controls.Border)(target)); + return; + case 114: + this.BtnAutoWarningClose = ((System.Windows.Controls.Button)(target)); + + #line 1051 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnAutoWarningClose.Click += new System.Windows.RoutedEventHandler(this.BtnAutoWarningClose_Click); + + #line default + #line hidden + return; + case 115: + this.FileBrowserPanel = ((System.Windows.Controls.Border)(target)); + return; + case 116: + this.FileBrowserTitle = ((System.Windows.Controls.TextBlock)(target)); + return; + case 117: + + #line 1084 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnFileBrowserRefresh_Click); + + #line default + #line hidden + return; + case 118: + + #line 1089 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnFileBrowserOpenFolder_Click); + + #line default + #line hidden + return; + case 119: + + #line 1094 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnFileBrowserClose_Click); + + #line default + #line hidden + return; + case 120: + this.FileTreeView = ((System.Windows.Controls.TreeView)(target)); + return; + case 121: + this.StatusDiamond = ((System.Windows.Controls.TextBlock)(target)); + return; + case 122: + this.StatusDiamondRotate = ((System.Windows.Media.RotateTransform)(target)); + return; + case 123: + this.StatusLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 124: + this.BtnShowAnalyzer = ((System.Windows.Controls.Border)(target)); + + #line 1135 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnShowAnalyzer.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnShowAnalyzer_Click); + + #line default + #line hidden + return; + case 125: + this.StatusElapsed = ((System.Windows.Controls.TextBlock)(target)); + return; + case 126: + this.StatusTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 127: + this.PreviewSplitter = ((System.Windows.Controls.GridSplitter)(target)); + return; + case 128: + this.PreviewPanel = ((System.Windows.Controls.Border)(target)); + return; + case 129: + + #line 1176 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Border)(target)).PreviewMouseDown += new System.Windows.Input.MouseButtonEventHandler(this.PreviewTabBar_PreviewMouseDown); + + #line default + #line hidden + return; + case 130: + this.PreviewTabPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 131: + this.BtnOpenExternal = ((System.Windows.Controls.Button)(target)); + + #line 1188 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnOpenExternal.Click += new System.Windows.RoutedEventHandler(this.BtnOpenExternal_Click); + + #line default + #line hidden + return; + case 132: + + #line 1193 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnClosePreview_Click); + + #line default + #line hidden + return; + case 133: + this.PreviewWebView = ((Microsoft.Web.WebView2.Wpf.WebView2)(target)); + return; + case 134: + this.PreviewTextScroll = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 135: + this.PreviewTextBlock = ((System.Windows.Controls.TextBlock)(target)); + return; + case 136: + this.PreviewDataGrid = ((System.Windows.Controls.DataGrid)(target)); + return; + case 137: + this.PreviewEmpty = ((System.Windows.Controls.TextBlock)(target)); + return; + case 138: + this.SettingsPanel = ((AxCopilot.Views.Controls.AgentSettingsPanel)(target)); + return; + case 139: + this.ResizeGrip = ((System.Windows.Controls.Primitives.Thumb)(target)); + + #line 1234 "..\..\..\..\..\Views\ChatWindow.xaml" + this.ResizeGrip.DragDelta += new System.Windows.Controls.Primitives.DragDeltaEventHandler(this.ResizeGrip_DragDelta); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ColorPickResultWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ColorPickResultWindow.baml new file mode 100644 index 0000000..929f1b4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ColorPickResultWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ColorPickResultWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ColorPickResultWindow.g.cs new file mode 100644 index 0000000..f146cd9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ColorPickResultWindow.g.cs @@ -0,0 +1,111 @@ +#pragma checksum "..\..\..\..\..\Views\ColorPickResultWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "3F33817147873F931CD71729FAB24371726BC8E5" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ColorPickResultWindow + /// + public partial class ColorPickResultWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 27 "..\..\..\..\..\Views\ColorPickResultWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Ellipse ColorPreview; + + #line default + #line hidden + + + #line 33 "..\..\..\..\..\Views\ColorPickResultWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock HexText; + + #line default + #line hidden + + + #line 41 "..\..\..\..\..\Views\ColorPickResultWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock RgbText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/colorpickresultwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ColorPickResultWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + this.ColorPreview = ((System.Windows.Shapes.Ellipse)(target)); + return; + case 2: + this.HexText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + this.RgbText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/CommandPaletteWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/CommandPaletteWindow.baml new file mode 100644 index 0000000..1fbb65d Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/CommandPaletteWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/CommandPaletteWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/CommandPaletteWindow.g.cs new file mode 100644 index 0000000..f09a8a4 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/CommandPaletteWindow.g.cs @@ -0,0 +1,120 @@ +#pragma checksum "..\..\..\..\..\Views\CommandPaletteWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "778D99FD34A10FE1F82C6C7B6937EB35B30FE93E" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// CommandPaletteWindow + /// + public partial class CommandPaletteWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 34 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox SearchBox; + + #line default + #line hidden + + + #line 44 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ResultPanel; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/commandpalettewindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 12 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + ((AxCopilot.Views.CommandPaletteWindow)(target)).PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.Window_PreviewKeyDown); + + #line default + #line hidden + + #line 13 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + ((AxCopilot.Views.CommandPaletteWindow)(target)).Deactivated += new System.EventHandler(this.Window_Deactivated); + + #line default + #line hidden + return; + case 2: + this.SearchBox = ((System.Windows.Controls.TextBox)(target)); + + #line 38 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + this.SearchBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.SearchBox_TextChanged); + + #line default + #line hidden + return; + case 3: + this.ResultPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentInputArea.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentInputArea.baml new file mode 100644 index 0000000..62b99ff Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentInputArea.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentInputArea.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentInputArea.g.cs new file mode 100644 index 0000000..6805a45 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentInputArea.g.cs @@ -0,0 +1,208 @@ +#pragma checksum "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "020AE1A48240276769D2F65E00DD6AD86312FCA4" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views.Controls { + + + /// + /// AgentInputArea + /// + public partial class AgentInputArea : System.Windows.Controls.UserControl, System.Windows.Markup.IComponentConnector { + + + #line 74 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel AttachmentChips; + + #line default + #line hidden + + + #line 80 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox InputBox; + + #line default + #line hidden + + + #line 96 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtModelChip; + + #line default + #line hidden + + + #line 103 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtPermissionChip; + + #line default + #line hidden + + + #line 110 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtPlanChip; + + #line default + #line hidden + + + #line 116 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnSend; + + #line default + #line hidden + + + #line 130 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock IconSend; + + #line default + #line hidden + + + #line 132 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtSendLabel; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/controls/agentinputarea.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 22 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnMention_Click); + + #line default + #line hidden + return; + case 2: + + #line 38 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnSkill_Click); + + #line default + #line hidden + return; + case 3: + + #line 54 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnAttach_Click); + + #line default + #line hidden + return; + case 4: + this.AttachmentChips = ((System.Windows.Controls.StackPanel)(target)); + return; + case 5: + this.InputBox = ((System.Windows.Controls.TextBox)(target)); + + #line 85 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + this.InputBox.KeyDown += new System.Windows.Input.KeyEventHandler(this.InputBox_KeyDown); + + #line default + #line hidden + + #line 86 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + this.InputBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.InputBox_TextChanged); + + #line default + #line hidden + return; + case 6: + this.TxtModelChip = ((System.Windows.Controls.TextBlock)(target)); + return; + case 7: + this.TxtPermissionChip = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: + this.TxtPlanChip = ((System.Windows.Controls.TextBlock)(target)); + return; + case 9: + this.BtnSend = ((System.Windows.Controls.Border)(target)); + + #line 118 "..\..\..\..\..\..\Views\Controls\AgentInputArea.xaml" + this.BtnSend.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnSend_Click); + + #line default + #line hidden + return; + case 10: + this.IconSend = ((System.Windows.Controls.TextBlock)(target)); + return; + case 11: + this.TxtSendLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSessionHeaderBar.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSessionHeaderBar.baml new file mode 100644 index 0000000..d3b05fa Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSessionHeaderBar.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSessionHeaderBar.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSessionHeaderBar.g.cs new file mode 100644 index 0000000..df38bd6 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSessionHeaderBar.g.cs @@ -0,0 +1,181 @@ +#pragma checksum "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "6656FF6DB8B8CCA7440BD72B24370B93E91C0C68" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views.Controls { + + + /// + /// AgentSessionHeaderBar + /// + public partial class AgentSessionHeaderBar : System.Windows.Controls.UserControl, System.Windows.Markup.IComponentConnector { + + + #line 15 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtTabLabel; + + #line default + #line hidden + + + #line 23 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border ChipModel; + + #line default + #line hidden + + + #line 38 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtModelChip; + + #line default + #line hidden + + + #line 46 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border ChipPlan; + + #line default + #line hidden + + + #line 61 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtPlanChip; + + #line default + #line hidden + + + #line 67 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border ChipPermission; + + #line default + #line hidden + + + #line 82 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtPermissionChip; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/controls/agentsessionheaderbar.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + this.TxtTabLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 2: + this.ChipModel = ((System.Windows.Controls.Border)(target)); + + #line 24 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + this.ChipModel.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.ChipModel_Click); + + #line default + #line hidden + return; + case 3: + this.TxtModelChip = ((System.Windows.Controls.TextBlock)(target)); + return; + case 4: + this.ChipPlan = ((System.Windows.Controls.Border)(target)); + + #line 47 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + this.ChipPlan.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.ChipPlan_Click); + + #line default + #line hidden + return; + case 5: + this.TxtPlanChip = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + this.ChipPermission = ((System.Windows.Controls.Border)(target)); + + #line 68 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + this.ChipPermission.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.ChipPermission_Click); + + #line default + #line hidden + return; + case 7: + this.TxtPermissionChip = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: + + #line 91 "..\..\..\..\..\..\Views\Controls\AgentSessionHeaderBar.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnSettings_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSettingsPanel.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSettingsPanel.baml new file mode 100644 index 0000000..1e1d949 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSettingsPanel.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSettingsPanel.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSettingsPanel.g.cs new file mode 100644 index 0000000..0791c27 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSettingsPanel.g.cs @@ -0,0 +1,418 @@ +#pragma checksum "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "9DBC2072F601B851311ED6DCA7DE8492B7E581B4" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views.Controls { + + + /// + /// AgentSettingsPanel + /// + public partial class AgentSettingsPanel : System.Windows.Controls.UserControl, System.Windows.Markup.IComponentConnector { + + + #line 11 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.TranslateTransform SlideTransform; + + #line default + #line hidden + + + #line 60 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtCurrentTab; + + #line default + #line hidden + + + #line 90 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtServiceName; + + #line default + #line hidden + + + #line 120 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtModelName; + + #line default + #line hidden + + + #line 137 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtApiEndpoint; + + #line default + #line hidden + + + #line 159 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtMaxIterations; + + #line default + #line hidden + + + #line 163 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Slider SliderMaxIterations; + + #line default + #line hidden + + + #line 175 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtMaxRetry; + + #line default + #line hidden + + + #line 179 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Slider SliderMaxRetry; + + #line default + #line hidden + + + #line 191 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkParallelTools; + + #line default + #line hidden + + + #line 203 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel PanelCoworkSettings; + + #line default + #line hidden + + + #line 211 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkCoworkVerify; + + #line default + #line hidden + + + #line 218 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel PanelCodeSettings; + + #line default + #line hidden + + + #line 226 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkCodeLsp; + + #line default + #line hidden + + + #line 237 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkCodeVerify; + + #line default + #line hidden + + + #line 249 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel PanelToolToggles; + + #line default + #line hidden + + + #line 267 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtAutoCompact; + + #line default + #line hidden + + + #line 271 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Slider SliderAutoCompact; + + #line default + #line hidden + + + #line 283 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkProjectRules; + + #line default + #line hidden + + + #line 296 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkDevMode; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/controls/agentsettingspanel.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + this.SlideTransform = ((System.Windows.Media.TranslateTransform)(target)); + return; + case 2: + + #line 35 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 3: + this.TxtCurrentTab = ((System.Windows.Controls.TextBlock)(target)); + return; + case 4: + + #line 79 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnServiceSelector_Click); + + #line default + #line hidden + return; + case 5: + this.TxtServiceName = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + + #line 109 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnModelSelector_Click); + + #line default + #line hidden + return; + case 7: + this.TxtModelName = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: + this.TxtApiEndpoint = ((System.Windows.Controls.TextBox)(target)); + + #line 142 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.TxtApiEndpoint.LostFocus += new System.Windows.RoutedEventHandler(this.TxtApiEndpoint_LostFocus); + + #line default + #line hidden + return; + case 9: + this.TxtMaxIterations = ((System.Windows.Controls.TextBlock)(target)); + return; + case 10: + this.SliderMaxIterations = ((System.Windows.Controls.Slider)(target)); + + #line 165 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.SliderMaxIterations.ValueChanged += new System.Windows.RoutedPropertyChangedEventHandler(this.SliderMaxIterations_ValueChanged); + + #line default + #line hidden + return; + case 11: + this.TxtMaxRetry = ((System.Windows.Controls.TextBlock)(target)); + return; + case 12: + this.SliderMaxRetry = ((System.Windows.Controls.Slider)(target)); + + #line 181 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.SliderMaxRetry.ValueChanged += new System.Windows.RoutedPropertyChangedEventHandler(this.SliderMaxRetry_ValueChanged); + + #line default + #line hidden + return; + case 13: + this.ChkParallelTools = ((System.Windows.Controls.CheckBox)(target)); + + #line 193 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkParallelTools.Checked += new System.Windows.RoutedEventHandler(this.ChkParallelTools_Changed); + + #line default + #line hidden + + #line 193 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkParallelTools.Unchecked += new System.Windows.RoutedEventHandler(this.ChkParallelTools_Changed); + + #line default + #line hidden + return; + case 14: + this.PanelCoworkSettings = ((System.Windows.Controls.StackPanel)(target)); + return; + case 15: + this.ChkCoworkVerify = ((System.Windows.Controls.CheckBox)(target)); + + #line 213 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkCoworkVerify.Checked += new System.Windows.RoutedEventHandler(this.ChkCoworkVerify_Changed); + + #line default + #line hidden + + #line 213 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkCoworkVerify.Unchecked += new System.Windows.RoutedEventHandler(this.ChkCoworkVerify_Changed); + + #line default + #line hidden + return; + case 16: + this.PanelCodeSettings = ((System.Windows.Controls.StackPanel)(target)); + return; + case 17: + this.ChkCodeLsp = ((System.Windows.Controls.CheckBox)(target)); + + #line 228 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkCodeLsp.Checked += new System.Windows.RoutedEventHandler(this.ChkCodeLsp_Changed); + + #line default + #line hidden + + #line 228 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkCodeLsp.Unchecked += new System.Windows.RoutedEventHandler(this.ChkCodeLsp_Changed); + + #line default + #line hidden + return; + case 18: + this.ChkCodeVerify = ((System.Windows.Controls.CheckBox)(target)); + + #line 239 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkCodeVerify.Checked += new System.Windows.RoutedEventHandler(this.ChkCodeVerify_Changed); + + #line default + #line hidden + + #line 239 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkCodeVerify.Unchecked += new System.Windows.RoutedEventHandler(this.ChkCodeVerify_Changed); + + #line default + #line hidden + return; + case 19: + this.PanelToolToggles = ((System.Windows.Controls.StackPanel)(target)); + return; + case 20: + this.TxtAutoCompact = ((System.Windows.Controls.TextBlock)(target)); + return; + case 21: + this.SliderAutoCompact = ((System.Windows.Controls.Slider)(target)); + + #line 273 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.SliderAutoCompact.ValueChanged += new System.Windows.RoutedPropertyChangedEventHandler(this.SliderAutoCompact_ValueChanged); + + #line default + #line hidden + return; + case 22: + this.ChkProjectRules = ((System.Windows.Controls.CheckBox)(target)); + + #line 285 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkProjectRules.Checked += new System.Windows.RoutedEventHandler(this.ChkProjectRules_Changed); + + #line default + #line hidden + + #line 285 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkProjectRules.Unchecked += new System.Windows.RoutedEventHandler(this.ChkProjectRules_Changed); + + #line default + #line hidden + return; + case 23: + this.ChkDevMode = ((System.Windows.Controls.CheckBox)(target)); + + #line 298 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkDevMode.Checked += new System.Windows.RoutedEventHandler(this.ChkDevMode_Changed); + + #line default + #line hidden + + #line 298 "..\..\..\..\..\..\Views\Controls\AgentSettingsPanel.xaml" + this.ChkDevMode.Unchecked += new System.Windows.RoutedEventHandler(this.ChkDevMode_Changed); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSidebarView.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSidebarView.baml new file mode 100644 index 0000000..080e119 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSidebarView.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSidebarView.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSidebarView.g.cs new file mode 100644 index 0000000..fd7b34a --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/Controls/AgentSidebarView.g.cs @@ -0,0 +1,211 @@ +#pragma checksum "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "0B65C021A9A6CB6AC1BF47A94135DA92BD1EFA2D" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views.Controls { + + + /// + /// AgentSidebarView + /// + public partial class AgentSidebarView : System.Windows.Controls.UserControl, System.Windows.Markup.IComponentConnector { + + + #line 28 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TxtTitle; + + #line default + #line hidden + + + #line 43 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock IconCollapse; + + #line default + #line hidden + + + #line 58 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border TabChat; + + #line default + #line hidden + + + #line 64 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border TabCowork; + + #line default + #line hidden + + + #line 70 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border TabCode; + + #line default + #line hidden + + + #line 108 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtSearch; + + #line default + #line hidden + + + #line 127 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ConversationList; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/controls/agentsidebarview.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + this.TxtTitle = ((System.Windows.Controls.TextBlock)(target)); + return; + case 2: + + #line 33 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnCollapse_Click); + + #line default + #line hidden + return; + case 3: + this.IconCollapse = ((System.Windows.Controls.TextBlock)(target)); + return; + case 4: + this.TabChat = ((System.Windows.Controls.Border)(target)); + + #line 59 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + this.TabChat.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.TabChat_Click); + + #line default + #line hidden + return; + case 5: + this.TabCowork = ((System.Windows.Controls.Border)(target)); + + #line 65 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + this.TabCowork.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.TabCowork_Click); + + #line default + #line hidden + return; + case 6: + this.TabCode = ((System.Windows.Controls.Border)(target)); + + #line 71 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + this.TabCode.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.TabCode_Click); + + #line default + #line hidden + return; + case 7: + + #line 81 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnNewChat_Click); + + #line default + #line hidden + return; + case 8: + this.TxtSearch = ((System.Windows.Controls.TextBox)(target)); + + #line 110 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + this.TxtSearch.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.TxtSearch_TextChanged); + + #line default + #line hidden + return; + case 9: + this.ConversationList = ((System.Windows.Controls.StackPanel)(target)); + return; + case 10: + + #line 134 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnDeleteAll_Click); + + #line default + #line hidden + return; + case 11: + + #line 157 "..\..\..\..\..\..\Views\Controls\AgentSidebarView.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnSettings_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/DockBarWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/DockBarWindow.baml new file mode 100644 index 0000000..8b2bda3 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/DockBarWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/DockBarWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/DockBarWindow.g.cs new file mode 100644 index 0000000..7a12466 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/DockBarWindow.g.cs @@ -0,0 +1,130 @@ +#pragma checksum "..\..\..\..\..\Views\DockBarWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "7CB362752B6906283C7B5A7001786A4921E47B73" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// DockBarWindow + /// + public partial class DockBarWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 16 "..\..\..\..\..\Views\DockBarWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border RainbowGlowBorder; + + #line default + #line hidden + + + #line 19 "..\..\..\..\..\Views\DockBarWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.LinearGradientBrush RainbowBrush; + + #line default + #line hidden + + + #line 35 "..\..\..\..\..\Views\DockBarWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border DockBorder; + + #line default + #line hidden + + + #line 40 "..\..\..\..\..\Views\DockBarWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel DockContent; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/dockbarwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\DockBarWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 12 "..\..\..\..\..\Views\DockBarWindow.xaml" + ((AxCopilot.Views.DockBarWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RainbowGlowBorder = ((System.Windows.Controls.Border)(target)); + return; + case 3: + this.RainbowBrush = ((System.Windows.Media.LinearGradientBrush)(target)); + return; + case 4: + this.DockBorder = ((System.Windows.Controls.Border)(target)); + return; + case 5: + this.DockContent = ((System.Windows.Controls.StackPanel)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/EyeDropperWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/EyeDropperWindow.baml new file mode 100644 index 0000000..cc339da Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/EyeDropperWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/EyeDropperWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/EyeDropperWindow.g.cs new file mode 100644 index 0000000..d37abba --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/EyeDropperWindow.g.cs @@ -0,0 +1,153 @@ +#pragma checksum "..\..\..\..\..\Views\EyeDropperWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "163E2B8FABE11D0EE242F297C7ADAF9251951717" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// EyeDropperWindow + /// + public partial class EyeDropperWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 19 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas RootCanvas; + + #line default + #line hidden + + + #line 21 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border Magnifier; + + #line default + #line hidden + + + #line 31 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Ellipse MagPreview; + + #line default + #line hidden + + + #line 39 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border HexLabel; + + #line default + #line hidden + + + #line 45 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock HexLabelText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/eyedropperwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 14 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + ((AxCopilot.Views.EyeDropperWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 15 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + ((AxCopilot.Views.EyeDropperWindow)(target)).MouseMove += new System.Windows.Input.MouseEventHandler(this.Window_MouseMove); + + #line default + #line hidden + + #line 16 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + ((AxCopilot.Views.EyeDropperWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RootCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 3: + this.Magnifier = ((System.Windows.Controls.Border)(target)); + return; + case 4: + this.MagPreview = ((System.Windows.Shapes.Ellipse)(target)); + return; + case 5: + this.HexLabel = ((System.Windows.Controls.Border)(target)); + return; + case 6: + this.HexLabelText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/GuideViewerWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/GuideViewerWindow.baml new file mode 100644 index 0000000..7d12ee0 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/GuideViewerWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/GuideViewerWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/GuideViewerWindow.g.cs new file mode 100644 index 0000000..622c5ae --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/GuideViewerWindow.g.cs @@ -0,0 +1,180 @@ +#pragma checksum "..\..\..\..\..\Views\GuideViewerWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "3A7A43FB211B4C35DC5BC90F0D5F6727B92D34A3" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using Microsoft.Web.WebView2.Wpf; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// GuideViewerWindow + /// + public partial class GuideViewerWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 38 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TitleText; + + #line default + #line hidden + + + #line 58 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock MaxBtnIcon; + + #line default + #line hidden + + + #line 75 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal Microsoft.Web.WebView2.Wpf.WebView2 GuideBrowser; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/guideviewerwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 26 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.TitleText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 48 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.MinBtn_Click); + + #line default + #line hidden + + #line 49 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 49 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 4: + + #line 56 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.MaxBtn_Click); + + #line default + #line hidden + + #line 57 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 57 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 5: + this.MaxBtnIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + + #line 64 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.CloseBtn_Click); + + #line default + #line hidden + + #line 65 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.CloseBtnEnter); + + #line default + #line hidden + + #line 65 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 7: + this.GuideBrowser = ((Microsoft.Web.WebView2.Wpf.WebView2)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/HelpDetailWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/HelpDetailWindow.baml new file mode 100644 index 0000000..a15da2b Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/HelpDetailWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/HelpDetailWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/HelpDetailWindow.g.cs new file mode 100644 index 0000000..410b631 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/HelpDetailWindow.g.cs @@ -0,0 +1,206 @@ +#pragma checksum "..\..\..\..\..\Views\HelpDetailWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "FF175B09974367331C1FB87B3330BA9C7809D841" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// HelpDetailWindow + /// + public partial class HelpDetailWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 59 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SubtitleText; + + #line default + #line hidden + + + #line 79 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TopMenuBar; + + #line default + #line hidden + + + #line 90 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox SearchBox; + + #line default + #line hidden + + + #line 105 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.WrapPanel CategoryBar; + + #line default + #line hidden + + + #line 115 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl ItemsHost; + + #line default + #line hidden + + + #line 189 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button PrevBtn; + + #line default + #line hidden + + + #line 194 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PageIndicator; + + #line default + #line hidden + + + #line 197 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button NextBtn; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/helpdetailwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 13 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + ((AxCopilot.Views.HelpDetailWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 14 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + ((AxCopilot.Views.HelpDetailWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.SubtitleText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 67 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 4: + this.TopMenuBar = ((System.Windows.Controls.StackPanel)(target)); + return; + case 5: + this.SearchBox = ((System.Windows.Controls.TextBox)(target)); + + #line 97 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + this.SearchBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.SearchBox_TextChanged); + + #line default + #line hidden + return; + case 6: + this.CategoryBar = ((System.Windows.Controls.WrapPanel)(target)); + return; + case 7: + this.ItemsHost = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 8: + this.PrevBtn = ((System.Windows.Controls.Button)(target)); + + #line 190 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + this.PrevBtn.Click += new System.Windows.RoutedEventHandler(this.Prev_Click); + + #line default + #line hidden + return; + case 9: + this.PageIndicator = ((System.Windows.Controls.TextBlock)(target)); + return; + case 10: + this.NextBtn = ((System.Windows.Controls.Button)(target)); + + #line 198 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + this.NextBtn.Click += new System.Windows.RoutedEventHandler(this.Next_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LargeTypeWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LargeTypeWindow.baml new file mode 100644 index 0000000..768a22a Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LargeTypeWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LargeTypeWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LargeTypeWindow.g.cs new file mode 100644 index 0000000..271e9e9 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LargeTypeWindow.g.cs @@ -0,0 +1,128 @@ +#pragma checksum "..\..\..\..\..\Views\LargeTypeWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "BBE8D57BB2FE77EFADA45AB45137687AE6EC7D2B" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// LargeTypeWindow + /// + public partial class LargeTypeWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 18 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border Overlay; + + #line default + #line hidden + + + #line 62 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock LargeText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/largetypewindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 13 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + ((AxCopilot.Views.LargeTypeWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + + #line 14 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + ((AxCopilot.Views.LargeTypeWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 15 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + ((AxCopilot.Views.LargeTypeWindow)(target)).Loaded += new System.Windows.RoutedEventHandler(this.Window_Loaded); + + #line default + #line hidden + return; + case 2: + this.Overlay = ((System.Windows.Controls.Border)(target)); + return; + case 3: + + #line 37 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 4: + this.LargeText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LauncherWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LauncherWindow.baml new file mode 100644 index 0000000..be2ff8f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LauncherWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LauncherWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LauncherWindow.g.cs new file mode 100644 index 0000000..46ef40f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/LauncherWindow.g.cs @@ -0,0 +1,348 @@ +#pragma checksum "..\..\..\..\..\Views\LauncherWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "AB0A66F008BC0EDBB8D9AB3181073972F28C2B41" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// LauncherWindow + /// + public partial class LauncherWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 166 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border RainbowGlowBorder; + + #line default + #line hidden + + + #line 171 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.LinearGradientBrush LauncherRainbowBrush; + + #line default + #line hidden + + + #line 190 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border MainBorder; + + #line default + #line hidden + + + #line 218 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas DiamondIcon; + + #line default + #line hidden + + + #line 226 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.RotateTransform IconRotate; + + #line default + #line hidden + + + #line 227 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.ScaleTransform IconScale; + + #line default + #line hidden + + + #line 231 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle GlowBlue; + + #line default + #line hidden + + + #line 238 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle GlowGreen1; + + #line default + #line hidden + + + #line 245 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle GlowGreen2; + + #line default + #line hidden + + + #line 252 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle GlowRed; + + #line default + #line hidden + + + #line 261 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle PixelBlue; + + #line default + #line hidden + + + #line 267 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle PixelGreen1; + + #line default + #line hidden + + + #line 273 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle PixelGreen2; + + #line default + #line hidden + + + #line 279 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle PixelRed; + + #line default + #line hidden + + + #line 349 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox InputBox; + + #line default + #line hidden + + + #line 488 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ListView ResultList; + + #line default + #line hidden + + + #line 695 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock IndexStatusText; + + #line default + #line hidden + + + #line 705 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border ToastOverlay; + + #line default + #line hidden + + + #line 724 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToastIcon; + + #line default + #line hidden + + + #line 730 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToastText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/launcherwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\LauncherWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 19 "..\..\..\..\..\Views\LauncherWindow.xaml" + ((AxCopilot.Views.LauncherWindow)(target)).Loaded += new System.Windows.RoutedEventHandler(this.Window_Loaded); + + #line default + #line hidden + + #line 20 "..\..\..\..\..\Views\LauncherWindow.xaml" + ((AxCopilot.Views.LauncherWindow)(target)).Deactivated += new System.EventHandler(this.Window_Deactivated); + + #line default + #line hidden + + #line 21 "..\..\..\..\..\Views\LauncherWindow.xaml" + ((AxCopilot.Views.LauncherWindow)(target)).PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.Window_PreviewKeyDown); + + #line default + #line hidden + + #line 22 "..\..\..\..\..\Views\LauncherWindow.xaml" + ((AxCopilot.Views.LauncherWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RainbowGlowBorder = ((System.Windows.Controls.Border)(target)); + return; + case 3: + this.LauncherRainbowBrush = ((System.Windows.Media.LinearGradientBrush)(target)); + return; + case 4: + this.MainBorder = ((System.Windows.Controls.Border)(target)); + return; + case 5: + this.DiamondIcon = ((System.Windows.Controls.Canvas)(target)); + + #line 221 "..\..\..\..\..\Views\LauncherWindow.xaml" + this.DiamondIcon.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.DiamondIcon_Click); + + #line default + #line hidden + return; + case 6: + this.IconRotate = ((System.Windows.Media.RotateTransform)(target)); + return; + case 7: + this.IconScale = ((System.Windows.Media.ScaleTransform)(target)); + return; + case 8: + this.GlowBlue = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 9: + this.GlowGreen1 = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 10: + this.GlowGreen2 = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 11: + this.GlowRed = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 12: + this.PixelBlue = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 13: + this.PixelGreen1 = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 14: + this.PixelGreen2 = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 15: + this.PixelRed = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 16: + this.InputBox = ((System.Windows.Controls.TextBox)(target)); + + #line 359 "..\..\..\..\..\Views\LauncherWindow.xaml" + this.InputBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.InputBox_TextChanged); + + #line default + #line hidden + return; + case 17: + this.ResultList = ((System.Windows.Controls.ListView)(target)); + + #line 501 "..\..\..\..\..\Views\LauncherWindow.xaml" + this.ResultList.PreviewMouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.ResultList_PreviewMouseLeftButtonUp); + + #line default + #line hidden + + #line 502 "..\..\..\..\..\Views\LauncherWindow.xaml" + this.ResultList.MouseDoubleClick += new System.Windows.Input.MouseButtonEventHandler(this.ResultList_MouseDoubleClick); + + #line default + #line hidden + return; + case 18: + this.IndexStatusText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 19: + this.ToastOverlay = ((System.Windows.Controls.Border)(target)); + return; + case 20: + this.ToastIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 21: + this.ToastText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/PreviewWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/PreviewWindow.baml new file mode 100644 index 0000000..b53aebf Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/PreviewWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/PreviewWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/PreviewWindow.g.cs new file mode 100644 index 0000000..0a45de0 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/PreviewWindow.g.cs @@ -0,0 +1,255 @@ +#pragma checksum "..\..\..\..\..\Views\PreviewWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "1FF13D4AAF15CB1FB4F079DA7FCA2453E3A0E61A" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using Microsoft.Web.WebView2.Wpf; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// PreviewWindow + /// + public partial class PreviewWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 40 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TitleText; + + #line default + #line hidden + + + #line 69 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock MaxBtnIcon; + + #line default + #line hidden + + + #line 91 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TabPanel; + + #line default + #line hidden + + + #line 97 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal Microsoft.Web.WebView2.Wpf.WebView2 PreviewBrowser; + + #line default + #line hidden + + + #line 98 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer TextScroll; + + #line default + #line hidden + + + #line 100 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TextContent; + + #line default + #line hidden + + + #line 104 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.DataGrid DataGridContent; + + #line default + #line hidden + + + #line 112 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock EmptyMessage; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/previewwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\PreviewWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 28 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.TitleText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 51 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.OpenExternalBtn_Click); + + #line default + #line hidden + + #line 52 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 52 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 4: + + #line 59 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.MinBtn_Click); + + #line default + #line hidden + + #line 60 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 60 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 5: + + #line 67 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.MaxBtn_Click); + + #line default + #line hidden + + #line 68 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 68 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 6: + this.MaxBtnIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 7: + + #line 75 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.CloseBtn_Click); + + #line default + #line hidden + + #line 76 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.CloseBtnEnter); + + #line default + #line hidden + + #line 76 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 8: + this.TabPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 9: + this.PreviewBrowser = ((Microsoft.Web.WebView2.Wpf.WebView2)(target)); + return; + case 10: + this.TextScroll = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 11: + this.TextContent = ((System.Windows.Controls.TextBlock)(target)); + return; + case 12: + this.DataGridContent = ((System.Windows.Controls.DataGrid)(target)); + return; + case 13: + this.EmptyMessage = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/RegionSelectWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/RegionSelectWindow.baml new file mode 100644 index 0000000..6971abe Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/RegionSelectWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/RegionSelectWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/RegionSelectWindow.g.cs new file mode 100644 index 0000000..ab15353 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/RegionSelectWindow.g.cs @@ -0,0 +1,203 @@ +#pragma checksum "..\..\..\..\..\Views\RegionSelectWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "0A02F0226116B955A7CB62EC9AAF934093D25A01" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// RegionSelectWindow + /// + public partial class RegionSelectWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 17 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas RootCanvas; + + #line default + #line hidden + + + #line 20 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle OverlayTop; + + #line default + #line hidden + + + #line 21 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle OverlayBottom; + + #line default + #line hidden + + + #line 22 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle OverlayLeft; + + #line default + #line hidden + + + #line 23 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle OverlayRight; + + #line default + #line hidden + + + #line 26 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle SelectionBorder; + + #line default + #line hidden + + + #line 33 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border GuideText; + + #line default + #line hidden + + + #line 51 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SizeLabel; + + #line default + #line hidden + + + #line 56 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SizeLabelText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/regionselectwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 12 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + ((AxCopilot.Views.RegionSelectWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 13 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + ((AxCopilot.Views.RegionSelectWindow)(target)).MouseMove += new System.Windows.Input.MouseEventHandler(this.Window_MouseMove); + + #line default + #line hidden + + #line 14 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + ((AxCopilot.Views.RegionSelectWindow)(target)).MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseUp); + + #line default + #line hidden + + #line 15 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + ((AxCopilot.Views.RegionSelectWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RootCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 3: + this.OverlayTop = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 4: + this.OverlayBottom = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 5: + this.OverlayLeft = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 6: + this.OverlayRight = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 7: + this.SelectionBorder = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 8: + this.GuideText = ((System.Windows.Controls.Border)(target)); + return; + case 9: + this.SizeLabel = ((System.Windows.Controls.Border)(target)); + return; + case 10: + this.SizeLabelText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ReminderPopupWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ReminderPopupWindow.baml new file mode 100644 index 0000000..cdd925c Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ReminderPopupWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ReminderPopupWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ReminderPopupWindow.g.cs new file mode 100644 index 0000000..e7e267f --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ReminderPopupWindow.g.cs @@ -0,0 +1,150 @@ +#pragma checksum "..\..\..\..\..\Views\ReminderPopupWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "05C334D340086FB76EB59EDA0728DD8FAF0C79F8" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ReminderPopupWindow + /// + public partial class ReminderPopupWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 17 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border PopupBorder; + + #line default + #line hidden + + + #line 40 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UsageText; + + #line default + #line hidden + + + #line 46 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button CloseBtn; + + #line default + #line hidden + + + #line 77 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock QuoteText; + + #line default + #line hidden + + + #line 86 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock AuthorText; + + #line default + #line hidden + + + #line 94 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ProgressBar CountdownBar; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/reminderpopupwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + this.PopupBorder = ((System.Windows.Controls.Border)(target)); + return; + case 2: + this.UsageText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + this.CloseBtn = ((System.Windows.Controls.Button)(target)); + + #line 51 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + this.CloseBtn.Click += new System.Windows.RoutedEventHandler(this.CloseBtn_Click); + + #line default + #line hidden + return; + case 4: + this.QuoteText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 5: + this.AuthorText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + this.CountdownBar = ((System.Windows.Controls.ProgressBar)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ResourceMonitorWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ResourceMonitorWindow.baml new file mode 100644 index 0000000..9d03df8 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ResourceMonitorWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ResourceMonitorWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ResourceMonitorWindow.g.cs new file mode 100644 index 0000000..3592cf4 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ResourceMonitorWindow.g.cs @@ -0,0 +1,226 @@ +#pragma checksum "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "6D5354408893A419BC0C8B94407E656D8BABD4E6" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ResourceMonitorWindow + /// + public partial class ResourceMonitorWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 52 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock RefreshLabel; + + #line default + #line hidden + + + #line 98 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CpuValueText; + + #line default + #line hidden + + + #line 106 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border CpuBar; + + #line default + #line hidden + + + #line 110 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CpuNameText; + + #line default + #line hidden + + + #line 130 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock RamValueText; + + #line default + #line hidden + + + #line 138 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border RamBar; + + #line default + #line hidden + + + #line 142 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock RamDetailText; + + #line default + #line hidden + + + #line 153 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl DriveList; + + #line default + #line hidden + + + #line 202 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl ProcessList; + + #line default + #line hidden + + + #line 263 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UptimeText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/resourcemonitorwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 17 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((AxCopilot.Views.ResourceMonitorWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 18 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((AxCopilot.Views.ResourceMonitorWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RefreshLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 60 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 4: + this.CpuValueText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 5: + this.CpuBar = ((System.Windows.Controls.Border)(target)); + return; + case 6: + this.CpuNameText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 7: + this.RamValueText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: + this.RamBar = ((System.Windows.Controls.Border)(target)); + return; + case 9: + this.RamDetailText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 10: + this.DriveList = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 11: + this.ProcessList = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 12: + + #line 246 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.ResizeGrip_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 13: + this.UptimeText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 14: + + #line 268 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SettingsWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SettingsWindow.baml new file mode 100644 index 0000000..3ff156f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SettingsWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SettingsWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SettingsWindow.g.cs new file mode 100644 index 0000000..e0572fd --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SettingsWindow.g.cs @@ -0,0 +1,1597 @@ +#pragma checksum "..\..\..\..\..\Views\SettingsWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "54ADBAA498458DE42EB02A97EEDA82B2A05FFC1E" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using AxCopilot.Themes; +using AxCopilot.ViewModels; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// SettingsWindow + /// + public partial class SettingsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector, System.Windows.Markup.IStyleConnector { + + + #line 608 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton GeneralSubTabMain; + + #line default + #line hidden + + + #line 611 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton GeneralSubTabNotify; + + #line default + #line hidden + + + #line 614 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton GeneralSubTabStorage; + + #line default + #line hidden + + + #line 619 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer GeneralMainPanel; + + #line default + #line hidden + + + #line 640 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox AiEnabledToggle; + + #line default + #line hidden + + + #line 665 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox InternalModeToggle; + + #line default + #line hidden + + + #line 692 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ComboBox HotkeyCombo; + + #line default + #line hidden + + + #line 958 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox NewIndexPathBox; + + #line default + #line hidden + + + #line 1025 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox NewExtensionBox; + + #line default + #line hidden + + + #line 1071 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer GeneralNotifyPanel; + + #line default + #line hidden + + + #line 1073 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel NotifyContent; + + #line default + #line hidden + + + #line 1078 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer GeneralStoragePanel; + + #line default + #line hidden + + + #line 1090 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StorageSummaryText2; + + #line default + #line hidden + + + #line 1091 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StorageDriveText2; + + #line default + #line hidden + + + #line 1111 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel StorageDetailPanel2; + + #line default + #line hidden + + + #line 1132 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton ThemeSubTabSelect; + + #line default + #line hidden + + + #line 1135 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton ThemeSubTabColors; + + #line default + #line hidden + + + #line 1141 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer ThemeSelectPanel; + + #line default + #line hidden + + + #line 1199 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl ThemeCardsPanel; + + #line default + #line hidden + + + #line 1292 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Grid ThemeColorsPanel; + + #line default + #line hidden + + + #line 1434 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkDockAutoShow; + + #line default + #line hidden + + + #line 1451 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkDockRainbowGlow; + + #line default + #line hidden + + + #line 1468 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Slider SliderDockOpacity; + + #line default + #line hidden + + + #line 1507 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel DockItemsPanel; + + #line default + #line hidden + + + #line 2101 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel QuoteCategoryPanel; + + #line default + #line hidden + + + #line 2811 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel FunctionSubTabBar; + + #line default + #line hidden + + + #line 2812 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton FuncSubTab_AI; + + #line default + #line hidden + + + #line 2815 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton FuncSubTab_Launcher; + + #line default + #line hidden + + + #line 2818 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton FuncSubTab_Design; + + #line default + #line hidden + + + #line 2825 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer FuncPanel_AI; + + #line default + #line hidden + + + #line 2856 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkEnableTextAction; + + #line default + #line hidden + + + #line 2867 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TextActionCommandsPanel; + + #line default + #line hidden + + + #line 2897 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkEnableFileDialog; + + #line default + #line hidden + + + #line 2932 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer FuncPanel_Launcher; + + #line default + #line hidden + + + #line 3033 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer FuncPanel_Design; + + #line default + #line hidden + + + #line 3067 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkEnableAutoCategory; + + #line default + #line hidden + + + #line 3258 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TabItem AgentTabItem; + + #line default + #line hidden + + + #line 3272 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel AgentSubTabs; + + #line default + #line hidden + + + #line 3273 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabCommon; + + #line default + #line hidden + + + #line 3276 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabChat; + + #line default + #line hidden + + + #line 3279 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabCoworkCode; + + #line default + #line hidden + + + #line 3282 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabCowork; + + #line default + #line hidden + + + #line 3285 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabCode; + + #line default + #line hidden + + + #line 3288 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabDev; + + #line default + #line hidden + + + #line 3291 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabTools; + + #line default + #line hidden + + + #line 3294 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabEtc; + + #line default + #line hidden + + + #line 3303 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelCommon; + + #line default + #line hidden + + + #line 3330 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ServiceSubTabs; + + #line default + #line hidden + + + #line 3331 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton SvcTabOllama; + + #line default + #line hidden + + + #line 3334 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton SvcTabVllm; + + #line default + #line hidden + + + #line 3337 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton SvcTabGemini; + + #line default + #line hidden + + + #line 3340 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton SvcTabClaude; + + #line default + #line hidden + + + #line 3347 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SvcPanelOllama; + + #line default + #line hidden + + + #line 3365 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAddModel; + + #line default + #line hidden + + + #line 3424 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ComboBox CboActiveModel; + + #line default + #line hidden + + + #line 3445 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SvcPanelVllm; + + #line default + #line hidden + + + #line 3463 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAddVllmModel; + + #line default + #line hidden + + + #line 3522 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ComboBox CboActiveVllmModel; + + #line default + #line hidden + + + #line 3543 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SvcPanelGemini; + + #line default + #line hidden + + + #line 3574 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SvcPanelClaude; + + #line default + #line hidden + + + #line 3611 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnTestConnection; + + #line default + #line hidden + + + #line 3727 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StorageSummaryText; + + #line default + #line hidden + + + #line 3728 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StorageDriveText; + + #line default + #line hidden + + + #line 3748 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel StorageDetailPanel; + + #line default + #line hidden + + + #line 3752 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel AgentBlockSection; + + #line default + #line hidden + + + #line 3925 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel HookListPanel; + + #line default + #line hidden + + + #line 3981 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnBrowseSkillFolder; + + #line default + #line hidden + + + #line 3985 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnOpenSkillFolder; + + #line default + #line hidden + + + #line 4247 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelChat; + + #line default + #line hidden + + + #line 4258 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAddTemplate; + + #line default + #line hidden + + + #line 4308 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelCoworkCode; + + #line default + #line hidden + + + #line 4540 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelCowork; + + #line default + #line hidden + + + #line 4687 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelCode; + + #line default + #line hidden + + + #line 4911 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelDev; + + #line default + #line hidden + + + #line 4923 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox DevModeCheckBox; + + #line default + #line hidden + + + #line 4931 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel DevModeContent; + + #line default + #line hidden + + + #line 4941 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox StepApprovalCheckBox; + + #line default + #line hidden + + + #line 5104 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel FallbackModelsPanel; + + #line default + #line hidden + + + #line 5105 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox FallbackModelsBox; + + #line default + #line hidden + + + #line 5135 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel McpServerListPanel; + + #line default + #line hidden + + + #line 5139 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox McpServersBox; + + #line default + #line hidden + + + #line 5155 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelEtc; + + #line default + #line hidden + + + #line 5158 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel AgentEtcContent; + + #line default + #line hidden + + + #line 5162 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelTools; + + #line default + #line hidden + + + #line 5170 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ToolCardsPanel; + + #line default + #line hidden + + + #line 5175 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel McpStatusPanel; + + #line default + #line hidden + + + #line 5198 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock VersionInfoText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/settingswindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\SettingsWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 16 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((AxCopilot.Views.SettingsWindow)(target)).PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.Window_PreviewKeyDown); + + #line default + #line hidden + return; + case 2: + this.GeneralSubTabMain = ((System.Windows.Controls.RadioButton)(target)); + + #line 610 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.GeneralSubTabMain.Checked += new System.Windows.RoutedEventHandler(this.GeneralSubTab_Checked); + + #line default + #line hidden + return; + case 3: + this.GeneralSubTabNotify = ((System.Windows.Controls.RadioButton)(target)); + + #line 613 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.GeneralSubTabNotify.Checked += new System.Windows.RoutedEventHandler(this.GeneralSubTab_Checked); + + #line default + #line hidden + return; + case 4: + this.GeneralSubTabStorage = ((System.Windows.Controls.RadioButton)(target)); + + #line 616 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.GeneralSubTabStorage.Checked += new System.Windows.RoutedEventHandler(this.GeneralSubTab_Checked); + + #line default + #line hidden + return; + case 5: + this.GeneralMainPanel = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 6: + this.AiEnabledToggle = ((System.Windows.Controls.CheckBox)(target)); + + #line 643 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AiEnabledToggle.Checked += new System.Windows.RoutedEventHandler(this.AiEnabled_Changed); + + #line default + #line hidden + + #line 643 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AiEnabledToggle.Unchecked += new System.Windows.RoutedEventHandler(this.AiEnabled_Changed); + + #line default + #line hidden + return; + case 7: + this.InternalModeToggle = ((System.Windows.Controls.CheckBox)(target)); + + #line 668 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.InternalModeToggle.Checked += new System.Windows.RoutedEventHandler(this.NetworkMode_Changed); + + #line default + #line hidden + + #line 668 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.InternalModeToggle.Unchecked += new System.Windows.RoutedEventHandler(this.NetworkMode_Changed); + + #line default + #line hidden + return; + case 8: + this.HotkeyCombo = ((System.Windows.Controls.ComboBox)(target)); + + #line 695 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.HotkeyCombo.SelectionChanged += new System.Windows.Controls.SelectionChangedEventHandler(this.HotkeyCombo_SelectionChanged); + + #line default + #line hidden + return; + case 10: + this.NewIndexPathBox = ((System.Windows.Controls.TextBox)(target)); + return; + case 11: + + #line 967 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BrowseIndexPath_Click); + + #line default + #line hidden + return; + case 12: + + #line 971 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddIndexPath_Click); + + #line default + #line hidden + return; + case 14: + this.NewExtensionBox = ((System.Windows.Controls.TextBox)(target)); + return; + case 15: + + #line 1033 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddExtension_Click); + + #line default + #line hidden + return; + case 16: + this.GeneralNotifyPanel = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 17: + this.NotifyContent = ((System.Windows.Controls.StackPanel)(target)); + return; + case 18: + this.GeneralStoragePanel = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 19: + this.StorageSummaryText2 = ((System.Windows.Controls.TextBlock)(target)); + return; + case 20: + this.StorageDriveText2 = ((System.Windows.Controls.TextBlock)(target)); + return; + case 21: + + #line 1094 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnStorageRefresh2_Click); + + #line default + #line hidden + return; + case 22: + + #line 1097 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnStorageCleanup_Click); + + #line default + #line hidden + return; + case 23: + this.StorageDetailPanel2 = ((System.Windows.Controls.StackPanel)(target)); + return; + case 24: + this.ThemeSubTabSelect = ((System.Windows.Controls.RadioButton)(target)); + + #line 1134 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.ThemeSubTabSelect.Checked += new System.Windows.RoutedEventHandler(this.ThemeSubTab_Checked); + + #line default + #line hidden + return; + case 25: + this.ThemeSubTabColors = ((System.Windows.Controls.RadioButton)(target)); + + #line 1137 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.ThemeSubTabColors.Checked += new System.Windows.RoutedEventHandler(this.ThemeSubTab_Checked); + + #line default + #line hidden + return; + case 26: + this.ThemeSelectPanel = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 27: + this.ThemeCardsPanel = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 29: + this.ThemeColorsPanel = ((System.Windows.Controls.Grid)(target)); + return; + case 31: + this.ChkDockAutoShow = ((System.Windows.Controls.CheckBox)(target)); + return; + case 32: + this.ChkDockRainbowGlow = ((System.Windows.Controls.CheckBox)(target)); + return; + case 33: + this.SliderDockOpacity = ((System.Windows.Controls.Slider)(target)); + return; + case 34: + + #line 1487 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnDockResetPosition_Click); + + #line default + #line hidden + return; + case 35: + this.DockItemsPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 36: + + #line 1620 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddSnippet_Click); + + #line default + #line hidden + return; + case 38: + + #line 1879 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ResetCapPrefix_Click); + + #line default + #line hidden + return; + case 39: + + #line 1946 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.TextBox)(target)).PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.CapHotkeyRecorder_PreviewKeyDown); + + #line default + #line hidden + return; + case 40: + + #line 1950 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ResetCapGlobalHotkey_Click); + + #line default + #line hidden + return; + case 41: + + #line 2081 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.RadioButton)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderCorner_Click); + + #line default + #line hidden + return; + case 42: + + #line 2084 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.RadioButton)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderCorner_Click); + + #line default + #line hidden + return; + case 43: + + #line 2087 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.RadioButton)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderCorner_Click); + + #line default + #line hidden + return; + case 44: + + #line 2090 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.RadioButton)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderCorner_Click); + + #line default + #line hidden + return; + case 45: + this.QuoteCategoryPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 46: + + #line 2192 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderPreview_Click); + + #line default + #line hidden + return; + case 47: + + #line 2425 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ResetCommandAliases_Click); + + #line default + #line hidden + return; + case 48: + + #line 2513 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Browse_Click); + + #line default + #line hidden + return; + case 49: + + #line 2544 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddShortcut_Click); + + #line default + #line hidden + return; + case 51: + + #line 2700 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddBatchCommand_Click); + + #line default + #line hidden + return; + case 53: + this.FunctionSubTabBar = ((System.Windows.Controls.StackPanel)(target)); + return; + case 54: + this.FuncSubTab_AI = ((System.Windows.Controls.RadioButton)(target)); + + #line 2814 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.FuncSubTab_AI.Checked += new System.Windows.RoutedEventHandler(this.FuncSubTab_Checked); + + #line default + #line hidden + return; + case 55: + this.FuncSubTab_Launcher = ((System.Windows.Controls.RadioButton)(target)); + + #line 2817 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.FuncSubTab_Launcher.Checked += new System.Windows.RoutedEventHandler(this.FuncSubTab_Checked); + + #line default + #line hidden + return; + case 56: + this.FuncSubTab_Design = ((System.Windows.Controls.RadioButton)(target)); + + #line 2820 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.FuncSubTab_Design.Checked += new System.Windows.RoutedEventHandler(this.FuncSubTab_Checked); + + #line default + #line hidden + return; + case 57: + this.FuncPanel_AI = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 58: + this.ChkEnableTextAction = ((System.Windows.Controls.CheckBox)(target)); + return; + case 59: + this.TextActionCommandsPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 60: + this.ChkEnableFileDialog = ((System.Windows.Controls.CheckBox)(target)); + return; + case 61: + this.FuncPanel_Launcher = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 62: + this.FuncPanel_Design = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 63: + this.ChkEnableAutoCategory = ((System.Windows.Controls.CheckBox)(target)); + return; + case 64: + this.AgentTabItem = ((System.Windows.Controls.TabItem)(target)); + return; + case 65: + this.AgentSubTabs = ((System.Windows.Controls.StackPanel)(target)); + return; + case 66: + this.AgentTabCommon = ((System.Windows.Controls.RadioButton)(target)); + + #line 3275 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabCommon.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 67: + this.AgentTabChat = ((System.Windows.Controls.RadioButton)(target)); + + #line 3278 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabChat.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 68: + this.AgentTabCoworkCode = ((System.Windows.Controls.RadioButton)(target)); + + #line 3281 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabCoworkCode.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 69: + this.AgentTabCowork = ((System.Windows.Controls.RadioButton)(target)); + + #line 3284 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabCowork.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 70: + this.AgentTabCode = ((System.Windows.Controls.RadioButton)(target)); + + #line 3287 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabCode.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 71: + this.AgentTabDev = ((System.Windows.Controls.RadioButton)(target)); + + #line 3290 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabDev.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 72: + this.AgentTabTools = ((System.Windows.Controls.RadioButton)(target)); + + #line 3293 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabTools.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 73: + this.AgentTabEtc = ((System.Windows.Controls.RadioButton)(target)); + + #line 3296 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabEtc.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 74: + this.AgentPanelCommon = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 75: + this.ServiceSubTabs = ((System.Windows.Controls.StackPanel)(target)); + return; + case 76: + this.SvcTabOllama = ((System.Windows.Controls.RadioButton)(target)); + + #line 3333 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.SvcTabOllama.Checked += new System.Windows.RoutedEventHandler(this.ServiceSubTab_Checked); + + #line default + #line hidden + return; + case 77: + this.SvcTabVllm = ((System.Windows.Controls.RadioButton)(target)); + + #line 3336 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.SvcTabVllm.Checked += new System.Windows.RoutedEventHandler(this.ServiceSubTab_Checked); + + #line default + #line hidden + return; + case 78: + this.SvcTabGemini = ((System.Windows.Controls.RadioButton)(target)); + + #line 3339 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.SvcTabGemini.Checked += new System.Windows.RoutedEventHandler(this.ServiceSubTab_Checked); + + #line default + #line hidden + return; + case 79: + this.SvcTabClaude = ((System.Windows.Controls.RadioButton)(target)); + + #line 3342 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.SvcTabClaude.Checked += new System.Windows.RoutedEventHandler(this.ServiceSubTab_Checked); + + #line default + #line hidden + return; + case 80: + this.SvcPanelOllama = ((System.Windows.Controls.StackPanel)(target)); + return; + case 81: + this.BtnAddModel = ((System.Windows.Controls.Button)(target)); + + #line 3367 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnAddModel.Click += new System.Windows.RoutedEventHandler(this.BtnAddModel_Click); + + #line default + #line hidden + return; + case 84: + this.CboActiveModel = ((System.Windows.Controls.ComboBox)(target)); + return; + case 85: + this.SvcPanelVllm = ((System.Windows.Controls.StackPanel)(target)); + return; + case 86: + this.BtnAddVllmModel = ((System.Windows.Controls.Button)(target)); + + #line 3465 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnAddVllmModel.Click += new System.Windows.RoutedEventHandler(this.BtnAddModel_Click); + + #line default + #line hidden + return; + case 89: + this.CboActiveVllmModel = ((System.Windows.Controls.ComboBox)(target)); + return; + case 90: + this.SvcPanelGemini = ((System.Windows.Controls.StackPanel)(target)); + return; + case 91: + this.SvcPanelClaude = ((System.Windows.Controls.StackPanel)(target)); + return; + case 92: + this.BtnTestConnection = ((System.Windows.Controls.Button)(target)); + + #line 3614 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnTestConnection.Click += new System.Windows.RoutedEventHandler(this.BtnTestConnection_Click); + + #line default + #line hidden + return; + case 93: + this.StorageSummaryText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 94: + this.StorageDriveText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 95: + + #line 3731 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnStorageRefresh_Click); + + #line default + #line hidden + return; + case 96: + + #line 3734 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnStorageCleanup_Click); + + #line default + #line hidden + return; + case 97: + this.StorageDetailPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 98: + this.AgentBlockSection = ((System.Windows.Controls.StackPanel)(target)); + return; + case 99: + this.HookListPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 100: + + #line 3928 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.AddHookBtn_Click); + + #line default + #line hidden + return; + case 101: + this.BtnBrowseSkillFolder = ((System.Windows.Controls.Button)(target)); + + #line 3981 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnBrowseSkillFolder.Click += new System.Windows.RoutedEventHandler(this.BtnBrowseSkillFolder_Click); + + #line default + #line hidden + return; + case 102: + this.BtnOpenSkillFolder = ((System.Windows.Controls.Button)(target)); + + #line 3985 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnOpenSkillFolder.Click += new System.Windows.RoutedEventHandler(this.BtnOpenSkillFolder_Click); + + #line default + #line hidden + return; + case 103: + this.AgentPanelChat = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 104: + this.BtnAddTemplate = ((System.Windows.Controls.Button)(target)); + + #line 4260 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnAddTemplate.Click += new System.Windows.RoutedEventHandler(this.BtnAddTemplate_Click); + + #line default + #line hidden + return; + case 107: + this.AgentPanelCoworkCode = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 108: + + #line 4519 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnClearMemory_Click); + + #line default + #line hidden + return; + case 109: + this.AgentPanelCowork = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 110: + this.AgentPanelCode = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 111: + this.AgentPanelDev = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 112: + this.DevModeCheckBox = ((System.Windows.Controls.CheckBox)(target)); + + #line 4925 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.DevModeCheckBox.Checked += new System.Windows.RoutedEventHandler(this.DevModeCheckBox_Checked); + + #line default + #line hidden + + #line 4926 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.DevModeCheckBox.Unchecked += new System.Windows.RoutedEventHandler(this.DevModeCheckBox_Unchecked); + + #line default + #line hidden + return; + case 113: + this.DevModeContent = ((System.Windows.Controls.StackPanel)(target)); + return; + case 114: + this.StepApprovalCheckBox = ((System.Windows.Controls.CheckBox)(target)); + + #line 4943 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.StepApprovalCheckBox.Checked += new System.Windows.RoutedEventHandler(this.StepApprovalCheckBox_Checked); + + #line default + #line hidden + return; + case 115: + + #line 5039 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnOpenAuditLog_Click); + + #line default + #line hidden + return; + case 116: + this.FallbackModelsPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 117: + this.FallbackModelsBox = ((System.Windows.Controls.TextBox)(target)); + return; + case 118: + + #line 5132 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnAddMcpServer_Click); + + #line default + #line hidden + return; + case 119: + this.McpServerListPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 120: + this.McpServersBox = ((System.Windows.Controls.TextBox)(target)); + return; + case 121: + this.AgentPanelEtc = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 122: + this.AgentEtcContent = ((System.Windows.Controls.StackPanel)(target)); + return; + case 123: + this.AgentPanelTools = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 124: + this.ToolCardsPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 125: + this.McpStatusPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 126: + this.VersionInfoText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 127: + + #line 5202 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ExportSettings_Click); + + #line default + #line hidden + return; + case 128: + + #line 5205 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ImportSettings_Click); + + #line default + #line hidden + return; + case 129: + + #line 5211 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Cancel_Click); + + #line default + #line hidden + return; + case 130: + + #line 5212 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Save_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + void System.Windows.Markup.IStyleConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 9: + + #line 943 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.RemoveIndexPath_Click); + + #line default + #line hidden + break; + case 13: + + #line 1011 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.RemoveExtension_Click); + + #line default + #line hidden + break; + case 28: + + #line 1211 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ThemeCard_Click); + + #line default + #line hidden + break; + case 30: + + #line 1344 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ColorSwatch_Click); + + #line default + #line hidden + break; + case 37: + + #line 1676 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.DeleteSnippet_Click); + + #line default + #line hidden + break; + case 50: + + #line 2616 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.DeleteShortcut_Click); + + #line default + #line hidden + break; + case 52: + + #line 2782 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.DeleteBatchCommand_Click); + + #line default + #line hidden + break; + case 82: + + #line 3406 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnEditModel_Click); + + #line default + #line hidden + break; + case 83: + + #line 3411 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnDeleteModel_Click); + + #line default + #line hidden + break; + case 87: + + #line 3504 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnEditModel_Click); + + #line default + #line hidden + break; + case 88: + + #line 3509 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnDeleteModel_Click); + + #line default + #line hidden + break; + case 105: + + #line 4287 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnEditTemplate_Click); + + #line default + #line hidden + break; + case 106: + + #line 4292 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnDeleteTemplate_Click); + + #line default + #line hidden + break; + } + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ShortcutHelpWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ShortcutHelpWindow.baml new file mode 100644 index 0000000..0570c56 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ShortcutHelpWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ShortcutHelpWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ShortcutHelpWindow.g.cs new file mode 100644 index 0000000..e341d25 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/ShortcutHelpWindow.g.cs @@ -0,0 +1,194 @@ +#pragma checksum "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "E0D1B21CEAFA49321A0D1E5C3C105368BFD65B78" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ShortcutHelpWindow + /// + public partial class ShortcutHelpWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 78 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl NavigationItems; + + #line default + #line hidden + + + #line 83 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl FileActionItems; + + #line default + #line hidden + + + #line 88 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl ViewItems; + + #line default + #line hidden + + + #line 93 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl RunItems; + + #line default + #line hidden + + + #line 98 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl PrefixItems; + + #line default + #line hidden + + + #line 126 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ThemeColorChk; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/shortcuthelpwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 15 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((AxCopilot.Views.ShortcutHelpWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + + #line 16 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((AxCopilot.Views.ShortcutHelpWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + return; + case 2: + + #line 50 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 3: + this.NavigationItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 4: + this.FileActionItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 5: + this.ViewItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 6: + this.RunItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 7: + this.PrefixItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 8: + + #line 109 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.ResizeGrip_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 9: + this.ThemeColorChk = ((System.Windows.Controls.CheckBox)(target)); + + #line 130 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + this.ThemeColorChk.Checked += new System.Windows.RoutedEventHandler(this.ThemeColorChk_Changed); + + #line default + #line hidden + + #line 131 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + this.ThemeColorChk.Unchecked += new System.Windows.RoutedEventHandler(this.ThemeColorChk_Changed); + + #line default + #line hidden + return; + case 10: + + #line 138 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillEditorWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillEditorWindow.baml new file mode 100644 index 0000000..6d3e906 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillEditorWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillEditorWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillEditorWindow.g.cs new file mode 100644 index 0000000..f6db80e --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillEditorWindow.g.cs @@ -0,0 +1,287 @@ +#pragma checksum "..\..\..\..\..\Views\SkillEditorWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "6D658E60C66BCBEA8DB4B45831383876238697F6" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// SkillEditorWindow + /// + public partial class SkillEditorWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 29 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TitleText; + + #line default + #line hidden + + + #line 72 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtName; + + #line default + #line hidden + + + #line 85 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtLabel; + + #line default + #line hidden + + + #line 101 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtDescription; + + #line default + #line hidden + + + #line 121 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel IconSelectorPanel; + + #line default + #line hidden + + + #line 127 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ComboBox CmbRequires; + + #line default + #line hidden + + + #line 144 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnInsertToolList; + + #line default + #line hidden + + + #line 151 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnInsertFormat; + + #line default + #line hidden + + + #line 166 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtInstructions; + + #line default + #line hidden + + + #line 203 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ToolCheckListPanel; + + #line default + #line hidden + + + #line 214 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewTokens; + + #line default + #line hidden + + + #line 216 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewFileName; + + #line default + #line hidden + + + #line 228 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/skilleditorwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 24 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.TitleText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 34 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 4: + this.TxtName = ((System.Windows.Controls.TextBox)(target)); + return; + case 5: + this.TxtLabel = ((System.Windows.Controls.TextBox)(target)); + return; + case 6: + this.TxtDescription = ((System.Windows.Controls.TextBox)(target)); + return; + case 7: + this.IconSelectorPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 8: + this.CmbRequires = ((System.Windows.Controls.ComboBox)(target)); + return; + case 9: + this.BtnInsertToolList = ((System.Windows.Controls.Border)(target)); + + #line 146 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + this.BtnInsertToolList.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnInsertTemplate_Click); + + #line default + #line hidden + return; + case 10: + this.BtnInsertFormat = ((System.Windows.Controls.Border)(target)); + + #line 153 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + this.BtnInsertFormat.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnInsertTemplate_Click); + + #line default + #line hidden + return; + case 11: + + #line 160 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnInsertTemplate_Click); + + #line default + #line hidden + return; + case 12: + this.TxtInstructions = ((System.Windows.Controls.TextBox)(target)); + + #line 175 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + this.TxtInstructions.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.TxtInstructions_TextChanged); + + #line default + #line hidden + return; + case 13: + this.ToolCheckListPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 14: + this.PreviewTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 15: + this.PreviewFileName = ((System.Windows.Controls.TextBlock)(target)); + return; + case 16: + this.StatusText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 17: + + #line 234 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnCancel_Click); + + #line default + #line hidden + return; + case 18: + + #line 240 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnPreview_Click); + + #line default + #line hidden + return; + case 19: + + #line 246 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnSave_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillGalleryWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillGalleryWindow.baml new file mode 100644 index 0000000..556a201 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillGalleryWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillGalleryWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillGalleryWindow.g.cs new file mode 100644 index 0000000..0376cda --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/SkillGalleryWindow.g.cs @@ -0,0 +1,152 @@ +#pragma checksum "..\..\..\..\..\Views\SkillGalleryWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "A8E475BD4F287C0B683CC45AFF4F1152AA7F0DC4" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// SkillGalleryWindow + /// + public partial class SkillGalleryWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 60 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnCloseGallery; + + #line default + #line hidden + + + #line 83 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel CategoryFilterBar; + + #line default + #line hidden + + + #line 88 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SkillListPanel; + + #line default + #line hidden + + + #line 94 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock GalleryStatus; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/skillgallerywindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 25 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + + #line 42 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnAddSkill_Click); + + #line default + #line hidden + return; + case 3: + + #line 52 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnImport_Click); + + #line default + #line hidden + return; + case 4: + this.BtnCloseGallery = ((System.Windows.Controls.Border)(target)); + + #line 62 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + this.BtnCloseGallery.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 5: + this.CategoryFilterBar = ((System.Windows.Controls.StackPanel)(target)); + return; + case 6: + this.SkillListPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 7: + this.GalleryStatus = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/StatisticsWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/StatisticsWindow.baml new file mode 100644 index 0000000..703797f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/StatisticsWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/StatisticsWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/StatisticsWindow.g.cs new file mode 100644 index 0000000..47a254c --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/StatisticsWindow.g.cs @@ -0,0 +1,195 @@ +#pragma checksum "..\..\..\..\..\Views\StatisticsWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "AFF6B3423613E10086D3FF44E4C4E87A504D82B8" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using AxCopilot.ViewModels; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// StatisticsWindow + /// + public partial class StatisticsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 102 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton StatsTabMain; + + #line default + #line hidden + + + #line 124 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton StatsTabCommander; + + #line default + #line hidden + + + #line 127 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton StatsTabAgent; + + #line default + #line hidden + + + #line 134 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer PanelMain; + + #line default + #line hidden + + + #line 307 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer PanelCommander; + + #line default + #line hidden + + + #line 580 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer PanelAgent; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/statisticswindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\StatisticsWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 18 "..\..\..\..\..\Views\StatisticsWindow.xaml" + ((AxCopilot.Views.StatisticsWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + return; + case 2: + + #line 55 "..\..\..\..\..\Views\StatisticsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Refresh_Click); + + #line default + #line hidden + return; + case 3: + + #line 72 "..\..\..\..\..\Views\StatisticsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 4: + this.StatsTabMain = ((System.Windows.Controls.RadioButton)(target)); + + #line 103 "..\..\..\..\..\Views\StatisticsWindow.xaml" + this.StatsTabMain.Click += new System.Windows.RoutedEventHandler(this.StatsTab_Click); + + #line default + #line hidden + return; + case 5: + this.StatsTabCommander = ((System.Windows.Controls.RadioButton)(target)); + + #line 125 "..\..\..\..\..\Views\StatisticsWindow.xaml" + this.StatsTabCommander.Click += new System.Windows.RoutedEventHandler(this.StatsTab_Click); + + #line default + #line hidden + return; + case 6: + this.StatsTabAgent = ((System.Windows.Controls.RadioButton)(target)); + + #line 128 "..\..\..\..\..\Views\StatisticsWindow.xaml" + this.StatsTabAgent.Click += new System.Windows.RoutedEventHandler(this.StatsTab_Click); + + #line default + #line hidden + return; + case 7: + this.PanelMain = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 8: + this.PanelCommander = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 9: + this.PanelAgent = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 10: + + #line 807 "..\..\..\..\..\Views\StatisticsWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.ResizeGrip_MouseLeftButtonDown); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TextActionPopup.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TextActionPopup.baml new file mode 100644 index 0000000..729b92f Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TextActionPopup.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TextActionPopup.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TextActionPopup.g.cs new file mode 100644 index 0000000..58f9907 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TextActionPopup.g.cs @@ -0,0 +1,114 @@ +#pragma checksum "..\..\..\..\..\Views\TextActionPopup.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "02046947FDB5F4A5DA7B8EEB9F034293FFA55E0F" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// TextActionPopup + /// + public partial class TextActionPopup : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 26 "..\..\..\..\..\Views\TextActionPopup.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewText; + + #line default + #line hidden + + + #line 34 "..\..\..\..\..\Views\TextActionPopup.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MenuItems; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/textactionpopup.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\TextActionPopup.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 11 "..\..\..\..\..\Views\TextActionPopup.xaml" + ((AxCopilot.Views.TextActionPopup)(target)).Deactivated += new System.EventHandler(this.Window_Deactivated); + + #line default + #line hidden + + #line 12 "..\..\..\..\..\Views\TextActionPopup.xaml" + ((AxCopilot.Views.TextActionPopup)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.PreviewText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + this.MenuItems = ((System.Windows.Controls.StackPanel)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TrayMenuWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TrayMenuWindow.baml new file mode 100644 index 0000000..b8493da Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TrayMenuWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TrayMenuWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TrayMenuWindow.g.cs new file mode 100644 index 0000000..331dab5 --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/TrayMenuWindow.g.cs @@ -0,0 +1,108 @@ +#pragma checksum "..\..\..\..\..\Views\TrayMenuWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "40F6FCA56C2ED32D0070A0AADEC9578EEF8AC6CE" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// TrayMenuWindow + /// + public partial class TrayMenuWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 13 "..\..\..\..\..\Views\TrayMenuWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border RootBorder; + + #line default + #line hidden + + + #line 24 "..\..\..\..\..\Views\TrayMenuWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MenuPanel; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/traymenuwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\TrayMenuWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 11 "..\..\..\..\..\Views\TrayMenuWindow.xaml" + ((AxCopilot.Views.TrayMenuWindow)(target)).Deactivated += new System.EventHandler(this.Window_Deactivated); + + #line default + #line hidden + return; + case 2: + this.RootBorder = ((System.Windows.Controls.Border)(target)); + return; + case 3: + this.MenuPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.baml b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.baml new file mode 100644 index 0000000..9296d73 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.baml differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.g.cs b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.g.cs new file mode 100644 index 0000000..4673b2b --- /dev/null +++ b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.g.cs @@ -0,0 +1,471 @@ +#pragma checksum "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "8460548829D487A45549EF4A159B6F31C0FCF501" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// WorkflowAnalyzerWindow + /// + public partial class WorkflowAnalyzerWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 35 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnClear; + + #line default + #line hidden + + + #line 42 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnMinimize; + + #line default + #line hidden + + + #line 49 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnClose; + + #line default + #line hidden + + + #line 65 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardElapsed; + + #line default + #line hidden + + + #line 71 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardIterations; + + #line default + #line hidden + + + #line 78 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardTokens; + + #line default + #line hidden + + + #line 81 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardInputTokens; + + #line default + #line hidden + + + #line 83 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardOutputTokens; + + #line default + #line hidden + + + #line 90 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardToolCalls; + + #line default + #line hidden + + + #line 99 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border TabTimeline; + + #line default + #line hidden + + + #line 102 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TabTimelineIcon; + + #line default + #line hidden + + + #line 104 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TabTimelineText; + + #line default + #line hidden + + + #line 108 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border TabBottleneck; + + #line default + #line hidden + + + #line 111 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TabBottleneckIcon; + + #line default + #line hidden + + + #line 113 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TabBottleneckText; + + #line default + #line hidden + + + #line 121 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer TimelineScroller; + + #line default + #line hidden + + + #line 123 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TimelinePanel; + + #line default + #line hidden + + + #line 127 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer BottleneckScroller; + + #line default + #line hidden + + + #line 129 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel BottleneckPanel; + + #line default + #line hidden + + + #line 135 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas WaterfallCanvas; + + #line default + #line hidden + + + #line 143 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ToolTimePanel; + + #line default + #line hidden + + + #line 151 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas TokenTrendCanvas; + + #line default + #line hidden + + + #line 157 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border DetailPanel; + + #line default + #line hidden + + + #line 163 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DetailTitle; + + #line default + #line hidden + + + #line 165 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DetailBadge; + + #line default + #line hidden + + + #line 169 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DetailMeta; + + #line default + #line hidden + + + #line 171 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DetailContent; + + #line default + #line hidden + + + #line 181 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusText; + + #line default + #line hidden + + + #line 184 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock LogLevelBadge; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/workflowanalyzerwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 27 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + ((System.Windows.Controls.Grid)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.BtnClear = ((System.Windows.Controls.Border)(target)); + + #line 37 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClear.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClear_Click); + + #line default + #line hidden + + #line 38 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClear.MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseEnter); + + #line default + #line hidden + + #line 38 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClear.MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseLeave); + + #line default + #line hidden + return; + case 3: + this.BtnMinimize = ((System.Windows.Controls.Border)(target)); + + #line 44 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnMinimize.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnMinimize_Click); + + #line default + #line hidden + + #line 45 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnMinimize.MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseEnter); + + #line default + #line hidden + + #line 45 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnMinimize.MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseLeave); + + #line default + #line hidden + return; + case 4: + this.BtnClose = ((System.Windows.Controls.Border)(target)); + + #line 51 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClose.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_Click); + + #line default + #line hidden + + #line 52 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClose.MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseEnter); + + #line default + #line hidden + + #line 52 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClose.MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseLeave); + + #line default + #line hidden + return; + case 5: + this.CardElapsed = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + this.CardIterations = ((System.Windows.Controls.TextBlock)(target)); + return; + case 7: + this.CardTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: + this.CardInputTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 9: + this.CardOutputTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 10: + this.CardToolCalls = ((System.Windows.Controls.TextBlock)(target)); + return; + case 11: + this.TabTimeline = ((System.Windows.Controls.Border)(target)); + + #line 100 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.TabTimeline.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.TabTimeline_Click); + + #line default + #line hidden + return; + case 12: + this.TabTimelineIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 13: + this.TabTimelineText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 14: + this.TabBottleneck = ((System.Windows.Controls.Border)(target)); + + #line 109 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.TabBottleneck.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.TabBottleneck_Click); + + #line default + #line hidden + return; + case 15: + this.TabBottleneckIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 16: + this.TabBottleneckText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 17: + this.TimelineScroller = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 18: + this.TimelinePanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 19: + this.BottleneckScroller = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 20: + this.BottleneckPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 21: + this.WaterfallCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 22: + this.ToolTimePanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 23: + this.TokenTrendCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 24: + this.DetailPanel = ((System.Windows.Controls.Border)(target)); + return; + case 25: + this.DetailTitle = ((System.Windows.Controls.TextBlock)(target)); + return; + case 26: + this.DetailBadge = ((System.Windows.Controls.TextBlock)(target)); + return; + case 27: + this.DetailMeta = ((System.Windows.Controls.TextBlock)(target)); + return; + case 28: + this.DetailContent = ((System.Windows.Controls.TextBlock)(target)); + return; + case 29: + this.StatusText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 30: + this.LogLevelBadge = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/apphost.exe b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/apphost.exe new file mode 100644 index 0000000..6262bd4 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/apphost.exe differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/ref/AxCopilot.dll b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/ref/AxCopilot.dll new file mode 100644 index 0000000..7a4aa11 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/ref/AxCopilot.dll differ diff --git a/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/refint/AxCopilot.dll b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/refint/AxCopilot.dll new file mode 100644 index 0000000..7a4aa11 Binary files /dev/null and b/src/AxCopilot/obj/Debug/net8.0-windows/win-x64/refint/AxCopilot.dll differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/App.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/App.baml new file mode 100644 index 0000000..578cb3c Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/App.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/App.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/App.g.cs new file mode 100644 index 0000000..ce2ad29 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/App.g.cs @@ -0,0 +1,78 @@ +#pragma checksum "..\..\..\..\App.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "0B0E851D2C6BB680D8B8F8DD7474F784A24BB388" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using AxCopilot.Themes; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot { + + + /// + /// App + /// + public partial class App : System.Windows.Application { + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/app.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\App.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + /// + /// Application Entry Point. + /// + [System.STAThreadAttribute()] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public static void Main() { + AxCopilot.App app = new AxCopilot.App(); + app.InitializeComponent(); + app.Run(); + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.AssemblyInfo.cs new file mode 100644 index 0000000..82e9895 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.AssemblyInfoInputs.cache new file mode 100644 index 0000000..aac9b2d --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f988f867917f8bf4591a42248a8bcc633410d5702c30e243fe0d6dae13c42bb9 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.assets.cache new file mode 100644 index 0000000..610afc4 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.AssemblyReference.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.AssemblyReference.cache new file mode 100644 index 0000000..24e774d Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.AssemblyReference.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.CoreCompileInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..782a056 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +4118369eacfc3d5f0e92bdaf1db13ccfa0931036c703c0571f02a7e6bf9091b0 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.FileListAbsolute.txt b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..b3a511c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.FileListAbsolute.txt @@ -0,0 +1,146 @@ +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\SearchEngines\duckduckgo.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\SearchEngines\github.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\SearchEngines\google.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\SearchEngines\namuwiki.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\SearchEngines\naver.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\SearchEngines\navermap.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\SearchEngines\wikipedia.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\SearchEngines\youtube.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\system_prompt.txt +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\icon.ico +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\AxCopilot.exe +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\AxCopilot.deps.json +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\AxCopilot.runtimeconfig.json +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\System.ServiceProcess.ServiceController.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\System.Diagnostics.EventLog.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\System.IO.Packaging.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\AxCopilot.SDK.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\AxCopilot.SDK.pdb +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot.csproj.AssemblyReference.cache +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\AboutWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ChatWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ColorPickResultWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\EyeDropperWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\HelpDetailWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\LargeTypeWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\LauncherWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\RegionSelectWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ReminderPopupWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ResourceMonitorWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ShortcutHelpWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\AboutWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ChatWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ColorPickResultWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\EyeDropperWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\HelpDetailWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\LargeTypeWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\LauncherWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\RegionSelectWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ReminderPopupWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ResourceMonitorWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\SettingsWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\ShortcutHelpWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\StatisticsWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\App.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot_Content.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\GeneratedInternalTypeHelper.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot_MarkupCompile.cache +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot_MarkupCompile.lref +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\App.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\SettingsWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\StatisticsWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot.g.resources +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot.GeneratedMSBuildEditorConfig.editorconfig +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot.AssemblyInfoInputs.cache +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot.AssemblyInfo.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot.csproj.CoreCompileInputs.cache +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot.csproj.Up2Date +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\refint\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\AxCopilot.genruntimeconfig.cache +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\ref\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\DocumentFormat.OpenXml.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\DocumentFormat.OpenXml.Framework.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\UglyToad.PdfPig.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\UglyToad.PdfPig.Core.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\UglyToad.PdfPig.Fonts.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\UglyToad.PdfPig.Tokenization.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\UglyToad.PdfPig.Tokens.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\runtimes\win-x64\native\WebView2Loader.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\WebView2Loader.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Microsoft.Web.WebView2.Core.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Microsoft.Web.WebView2.WinForms.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Microsoft.Web.WebView2.Wpf.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Microsoft.Web.WebView2.Core.xml +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Microsoft.Web.WebView2.WinForms.xml +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Microsoft.Web.WebView2.Wpf.xml +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Markdig.dll +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\CommandPaletteWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\CommandPaletteWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\TextActionPopup.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\TextActionPopup.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\DockBarWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\DockBarWindow.g.cs +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\code-scaffold.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\data-visualize.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\meeting-minutes.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\paper-review.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\report-writer.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\yield-analysis.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Microsoft.Data.Sqlite.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\SQLitePCLRaw.batteries_v2.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\SQLitePCLRaw.core.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\SQLitePCLRaw.provider.e_sqlite3.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\e_sqlite3.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\docx-creator.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\pdf-processor.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\pptx-creator.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\xlsx-analyzer.skill.md +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\WorkflowAnalyzerWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\WorkflowAnalyzerWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\AgentStatsDashboardWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\SkillEditorWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\SkillGalleryWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\AgentStatsDashboardWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\SkillEditorWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\SkillGalleryWindow.g.cs +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\guide_user.enc +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\Assets\guide_dev.enc +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\api-docs.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\commit-review.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\db-schema.skill.md +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\GuideViewerWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\GuideViewerWindow.g.cs +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\compare.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\data-convert.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\email-draft.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\gen-test.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\impact.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\log-analyze.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\refactor.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\sql-report.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\translate.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\weekly-report.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\adr-writer.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\changelog.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\dependency-audit.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\perf-audit.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\prd-generator.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\security-audit.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\data-visualize-adv.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\diagram-generator.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\image-processor.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\ocr-extract.skill.md +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\TrayMenuWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\TrayMenuWindow.g.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\PreviewWindow.baml +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Views\PreviewWindow.g.cs +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\batch-rename.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\csv-to-xlsx.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\env-setup.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\json-schema.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\markdown-to-doc.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\regex-helper.skill.md +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\skills\release-note.skill.md +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\Themes\Codex.baml diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.Up2Date b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.csproj.Up2Date new file mode 100644 index 0000000..e69de29 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.dll b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.dll new file mode 100644 index 0000000..ad22375 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.dll differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.g.resources b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.g.resources new file mode 100644 index 0000000..03eaa89 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.g.resources differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.genruntimeconfig.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.genruntimeconfig.cache new file mode 100644 index 0000000..d288cd6 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot.genruntimeconfig.cache @@ -0,0 +1 @@ +aac7fb9f686b061376405dd1eaf81e7f0c93ff7c545290f8252e92af3f9d9679 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.assets.cache new file mode 100644 index 0000000..b18a480 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_051425xz_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.assets.cache new file mode 100644 index 0000000..5d90c62 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0j2yamql_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.assets.cache new file mode 100644 index 0000000..9de1ef1 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0q1ymhlv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.assets.cache new file mode 100644 index 0000000..d36dfc3 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_0z4tyzt2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.assets.cache new file mode 100644 index 0000000..7e4da73 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1d53pk2i_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ab891ef --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.4.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.4")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.4.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..19973d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8e496a8b473dab6d1ecc7625cc1e7c9058c992d15a3fb02e3922452e22992490 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.assets.cache new file mode 100644 index 0000000..2adbc2b Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_1oiwdmz5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.assets.cache new file mode 100644 index 0000000..8bb2b09 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_24edj2ly_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.assets.cache new file mode 100644 index 0000000..59f399b Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2bhgxvhb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.assets.cache new file mode 100644 index 0000000..d0f6b9e Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2e23oveg_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..6162df6 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..69bf724 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +678e1cdbb20644542963cd6b6d37660a5b3453358475522da0e14cae97d922ae diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.assets.cache new file mode 100644 index 0000000..45e2ef4 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2eavscbq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.assets.cache new file mode 100644 index 0000000..a9e09ab Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2gn0hr3a_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bcd2b24 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e852745 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +42767161f5ceddd9e41eb0058ffb00d0f01c3fc075c18042eea0393b83dacf81 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.assets.cache new file mode 100644 index 0000000..5a34260 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2jahjdcd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.assets.cache new file mode 100644 index 0000000..e4bea13 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2ralv1ej_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7a78849 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..49eaeca --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +213fb75f40b8ce75d90b39ee59df6d77e24cdf22b6311c458ddb7e1045b97c2e diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.assets.cache new file mode 100644 index 0000000..ecc62fc Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2wobzzx3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f8a2d2b --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2cd444d --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +aa7b2b50064fa896f0bc918c6d9b9322035ecc6fc65ba673164722c60592f937 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.assets.cache new file mode 100644 index 0000000..43782cd Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_2z4qow02_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.assets.cache new file mode 100644 index 0000000..5bd9487 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34h2rv5u_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.assets.cache new file mode 100644 index 0000000..851dbe8 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_34rzzhuk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.assets.cache new file mode 100644 index 0000000..d4b7a55 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3d35jbw3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.assets.cache new file mode 100644 index 0000000..53683c4 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3gbnqypw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bcd2b24 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e852745 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +42767161f5ceddd9e41eb0058ffb00d0f01c3fc075c18042eea0393b83dacf81 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.assets.cache new file mode 100644 index 0000000..142f0fc Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3jl3afye_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.assets.cache new file mode 100644 index 0000000..b97450d Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3koklyuw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bf8ea43 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1445846 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f0bb17e5afce495d8f69541d0f68f53fbaf77c24025beae075171580ec51139a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.assets.cache new file mode 100644 index 0000000..656ea76 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_3ztiwmih_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.assets.cache new file mode 100644 index 0000000..e753610 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_404g1gmu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.assets.cache new file mode 100644 index 0000000..79f9533 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_455tbkzl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.assets.cache new file mode 100644 index 0000000..c900507 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4dzdye0p_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.assets.cache new file mode 100644 index 0000000..c6147a7 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4fbxzzff_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..526d939 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7a12b42 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +0f39a3950d66080e59a119d17fa81b90b782d95016a83da8a9ac303e581572fc diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.assets.cache new file mode 100644 index 0000000..cbf3eea Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4j3chqos_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.assets.cache new file mode 100644 index 0000000..f1c62c7 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4le245j0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.assets.cache new file mode 100644 index 0000000..a82cecb Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4p4ulqdt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..1b28645 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..b23c29b --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6e1a96f76bcdbdc5bd0e4f87afae4fb2b18a573264f75040b2d3e1aa5b1e09ba diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.assets.cache new file mode 100644 index 0000000..7083d08 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4sqabra5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f8a2d2b --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2cd444d --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +aa7b2b50064fa896f0bc918c6d9b9322035ecc6fc65ba673164722c60592f937 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.assets.cache new file mode 100644 index 0000000..c5c4248 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_4u5vmw5i_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bcd2b24 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e852745 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +42767161f5ceddd9e41eb0058ffb00d0f01c3fc075c18042eea0393b83dacf81 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.assets.cache new file mode 100644 index 0000000..71121aa Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_550q3yfk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.assets.cache new file mode 100644 index 0000000..957d665 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5d2ehxbh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.assets.cache new file mode 100644 index 0000000..46818f0 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5f5tze03_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..526d939 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7a12b42 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +0f39a3950d66080e59a119d17fa81b90b782d95016a83da8a9ac303e581572fc diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.assets.cache new file mode 100644 index 0000000..cc577c5 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5gk1l53m_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.assets.cache new file mode 100644 index 0000000..aec448d Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5glfzhfd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..526d939 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7a12b42 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +0f39a3950d66080e59a119d17fa81b90b782d95016a83da8a9ac303e581572fc diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.assets.cache new file mode 100644 index 0000000..961fdd4 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5kbcebyj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..5b1b945 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d36eb59 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5f13c6fe7d2fae29ad4a58a914e59afbd9f17fd1746db5bb208d67a8da45f42b diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.assets.cache new file mode 100644 index 0000000..40954ff Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5mcrpfny_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.assets.cache new file mode 100644 index 0000000..4858758 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5n5ecvth_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..1b28645 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..b23c29b --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6e1a96f76bcdbdc5bd0e4f87afae4fb2b18a573264f75040b2d3e1aa5b1e09ba diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.assets.cache new file mode 100644 index 0000000..e67e3fa Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5o1my4x1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.assets.cache new file mode 100644 index 0000000..54c5239 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5szrdfus_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.assets.cache new file mode 100644 index 0000000..6ce23f6 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_5y3lvfqg_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_Content.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_Content.g.cs new file mode 100644 index 0000000..c8304c5 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_Content.g.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/guide_user.enc")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/guide_dev.enc")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/duckduckgo.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/github.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/google.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/namuwiki.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/naver.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/navermap.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/wikipedia.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/searchengines/youtube.png")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("assets/system_prompt.txt")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/adr-writer.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/api-docs.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/batch-rename.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/changelog.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/code-scaffold.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/commit-review.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/compare.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/csv-to-xlsx.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/data-convert.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/data-visualize-adv.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/data-visualize.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/db-schema.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/dependency-audit.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/diagram-generator.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/docx-creator.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/email-draft.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/env-setup.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/gen-test.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/image-processor.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/impact.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/json-schema.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/log-analyze.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/markdown-to-doc.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/meeting-minutes.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/ocr-extract.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/paper-review.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/pdf-processor.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/perf-audit.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/pptx-creator.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/prd-generator.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/refactor.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/regex-helper.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/release-note.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/report-writer.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/security-audit.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/sql-report.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/translate.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/weekly-report.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/xlsx-analyzer.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("skills/yield-analysis.skill.md")] +[assembly: System.Windows.Resources.AssemblyAssociatedContentFileAttribute("webview2loader.dll")] + + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_MarkupCompile.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_MarkupCompile.cache new file mode 100644 index 0000000..fee10fd --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_MarkupCompile.cache @@ -0,0 +1,20 @@ +AxCopilot + + +winexe +C# +.cs +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\ +AxCopilot +none +false +TRACE;RELEASE;NET;NET8_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NET7_0_OR_GREATER;NET8_0_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER;WINDOWS7_0_OR_GREATER +E:\AX Copilot\src\AxCopilot\App.xaml +24965938358 +5221578752 +2371178304599 +224-1776901747 +Themes\Codex.xaml;Views\AboutWindow.xaml;Views\AgentStatsDashboardWindow.xaml;Views\ChatWindow.xaml;Views\ColorPickResultWindow.xaml;Views\CommandPaletteWindow.xaml;Views\DockBarWindow.xaml;Views\EyeDropperWindow.xaml;Views\GuideViewerWindow.xaml;Views\HelpDetailWindow.xaml;Views\LargeTypeWindow.xaml;Views\LauncherWindow.xaml;Views\PreviewWindow.xaml;Views\RegionSelectWindow.xaml;Views\ReminderPopupWindow.xaml;Views\ResourceMonitorWindow.xaml;Views\SettingsWindow.xaml;Views\ShortcutHelpWindow.xaml;Views\SkillEditorWindow.xaml;Views\SkillGalleryWindow.xaml;Views\StatisticsWindow.xaml;Views\TextActionPopup.xaml;Views\TrayMenuWindow.xaml;Views\WorkflowAnalyzerWindow.xaml; + +False + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_MarkupCompile.lref b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_MarkupCompile.lref new file mode 100644 index 0000000..c519e99 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_MarkupCompile.lref @@ -0,0 +1,5 @@ +E:\AX Copilot\src\AxCopilot\obj\Release\net8.0-windows\win-x64\GeneratedInternalTypeHelper.g.cs +FE:\AX Copilot\src\AxCopilot\App.xaml;; +FE:\AX Copilot\src\AxCopilot\Views\SettingsWindow.xaml;; +FE:\AX Copilot\src\AxCopilot\Views\StatisticsWindow.xaml;; + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.assets.cache new file mode 100644 index 0000000..12cc08b Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_a1dmzdkm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.assets.cache new file mode 100644 index 0000000..c1581b8 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b55qnx34_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.assets.cache new file mode 100644 index 0000000..5ab91de Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_b5hbvbvu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.assets.cache new file mode 100644 index 0000000..3d43639 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bcyblmhu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.assets.cache new file mode 100644 index 0000000..03fa105 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bln3242z_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.assets.cache new file mode 100644 index 0000000..794da0d Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bn1peo30_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.assets.cache new file mode 100644 index 0000000..214578c Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bsqm3vpn_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.assets.cache new file mode 100644 index 0000000..0dfdfdf Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_bzrx4flp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.assets.cache new file mode 100644 index 0000000..c22a5a3 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cc0s3g0w_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bcd2b24 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e852745 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +42767161f5ceddd9e41eb0058ffb00d0f01c3fc075c18042eea0393b83dacf81 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.assets.cache new file mode 100644 index 0000000..7123847 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_cgoplmvf_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.assets.cache new file mode 100644 index 0000000..eefa952 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ckpoonxm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ef1bf9c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..fd8f77f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2a4bb7875533d409af038f6b12014468813d2668cbf517cf07814edc68c69e2c diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.assets.cache new file mode 100644 index 0000000..49eabd7 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dpfjgxu2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.assets.cache new file mode 100644 index 0000000..3401aea Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_dssjjwbh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.assets.cache new file mode 100644 index 0000000..07706dc Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_e35233dh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.assets.cache new file mode 100644 index 0000000..dcaca35 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eajoelet_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ef1bf9c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..fd8f77f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2a4bb7875533d409af038f6b12014468813d2668cbf517cf07814edc68c69e2c diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.assets.cache new file mode 100644 index 0000000..4db83b9 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ebcyomkq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bf8ea43 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1445846 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f0bb17e5afce495d8f69541d0f68f53fbaf77c24025beae075171580ec51139a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.assets.cache new file mode 100644 index 0000000..219ea69 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eeradxv5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.assets.cache new file mode 100644 index 0000000..177d52b Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_egs3wl1u_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.assets.cache new file mode 100644 index 0000000..b484882 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ergkxfr4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.assets.cache new file mode 100644 index 0000000..b746df2 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_espettje_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ffb747c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7e5b94f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2e6deed0ca6edc2d5f64e6836ddd81a7b0bd4e5774edc840d9b3ce84bd63551b diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.assets.cache new file mode 100644 index 0000000..508ff40 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_eu1ghxvy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.assets.cache new file mode 100644 index 0000000..aab76f6 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_euxl3xdp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ffb747c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7e5b94f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2e6deed0ca6edc2d5f64e6836ddd81a7b0bd4e5774edc840d9b3ce84bd63551b diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.assets.cache new file mode 100644 index 0000000..f7b4f18 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_f0c01jnu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.assets.cache new file mode 100644 index 0000000..bb6f535 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fgicmz1b_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.assets.cache new file mode 100644 index 0000000..37725a2 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fiiixf4k_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..64626f3 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c390cc4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c649d6d6b4dd1b372837d63e48e62316372ff865a3d32f0d5496a4d31da5fd1d diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.assets.cache new file mode 100644 index 0000000..17d1ddf Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fj2fxdod_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.assets.cache new file mode 100644 index 0000000..97f1514 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fjx3b4t3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.assets.cache new file mode 100644 index 0000000..6325d5a Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ftgsba22_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.assets.cache new file mode 100644 index 0000000..677c75a Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fyj5anca_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.assets.cache new file mode 100644 index 0000000..47cea75 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzb1z2t1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..076d1c1 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..ce13e57 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7196071bec05d8486fc263ff4b993073937f433e25c369d1e908c5c900fccbfd diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.assets.cache new file mode 100644 index 0000000..a7bb91e Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_fzfoca1b_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.assets.cache new file mode 100644 index 0000000..c4fa94c Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g3u1ncph_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.assets.cache new file mode 100644 index 0000000..cb515bd Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_g51mdhbu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.assets.cache new file mode 100644 index 0000000..461a51f Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ggf3bsgk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.assets.cache new file mode 100644 index 0000000..e6d0bd5 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ghnidh1a_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.assets.cache new file mode 100644 index 0000000..247a2f2 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gicb4hei_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.assets.cache new file mode 100644 index 0000000..2031efc Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gntx12mm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..5b1b945 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d36eb59 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5f13c6fe7d2fae29ad4a58a914e59afbd9f17fd1746db5bb208d67a8da45f42b diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.assets.cache new file mode 100644 index 0000000..bb8463d Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gv4lf1dt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.assets.cache new file mode 100644 index 0000000..ea195af Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_gzp5wbcm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.assets.cache new file mode 100644 index 0000000..3a41b43 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_h25d4zg2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.assets.cache new file mode 100644 index 0000000..d0564aa Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hegyghjr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.assets.cache new file mode 100644 index 0000000..66a4f9d Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_heushty3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.assets.cache new file mode 100644 index 0000000..5bad0bf Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_hwpw1kfh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..64626f3 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c390cc4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c649d6d6b4dd1b372837d63e48e62316372ff865a3d32f0d5496a4d31da5fd1d diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.assets.cache new file mode 100644 index 0000000..17e2cda Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_i5zytibv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..64626f3 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c390cc4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c649d6d6b4dd1b372837d63e48e62316372ff865a3d32f0d5496a4d31da5fd1d diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.assets.cache new file mode 100644 index 0000000..e8346b5 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iokxpmkb_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ef1bf9c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..fd8f77f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2a4bb7875533d409af038f6b12014468813d2668cbf517cf07814edc68c69e2c diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.assets.cache new file mode 100644 index 0000000..7f8940f Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_iphvlz1q_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.assets.cache new file mode 100644 index 0000000..1bd66f2 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j0hpkgm3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.assets.cache new file mode 100644 index 0000000..c1bf0cc Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j2i0q2xj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.assets.cache new file mode 100644 index 0000000..8433805 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_j50ha3a3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.assets.cache new file mode 100644 index 0000000..46bec08 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ja2431fa_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.assets.cache new file mode 100644 index 0000000..31112b6 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jkzzdx23_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.assets.cache new file mode 100644 index 0000000..8a1f4a3 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jopwhfrw_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.assets.cache new file mode 100644 index 0000000..748b505 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jp4xlcgu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.assets.cache new file mode 100644 index 0000000..ce1f5a1 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jra3tzfe_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.assets.cache new file mode 100644 index 0000000..9d552eb Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_jufms4le_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.assets.cache new file mode 100644 index 0000000..f5784f0 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kcxsor0s_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ef1bf9c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..fd8f77f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2a4bb7875533d409af038f6b12014468813d2668cbf517cf07814edc68c69e2c diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.assets.cache new file mode 100644 index 0000000..565ec19 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kibqhhz0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.assets.cache new file mode 100644 index 0000000..df187db Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_kso0cce2_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.assets.cache new file mode 100644 index 0000000..d918daf Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_l1tr2yiu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.assets.cache new file mode 100644 index 0000000..7c0a018 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lecxjkss_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.assets.cache new file mode 100644 index 0000000..e611657 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_lkz3h0m1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..526d939 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7a12b42 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +0f39a3950d66080e59a119d17fa81b90b782d95016a83da8a9ac303e581572fc diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.assets.cache new file mode 100644 index 0000000..e2ef664 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltlmr5jk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.assets.cache new file mode 100644 index 0000000..9695ad2 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ltnapy1c_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.assets.cache new file mode 100644 index 0000000..b4471fe Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_m3iq1upa_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.assets.cache new file mode 100644 index 0000000..31bf823 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_mexj3541_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.assets.cache new file mode 100644 index 0000000..5f8c771 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_n4my0a24_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.assets.cache new file mode 100644 index 0000000..c3f64fa Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nk4vxi2q_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ef1bf9c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..fd8f77f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2a4bb7875533d409af038f6b12014468813d2668cbf517cf07814edc68c69e2c diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.assets.cache new file mode 100644 index 0000000..ae0db2c Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_nmzyjasj_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.assets.cache new file mode 100644 index 0000000..135a27b Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oa5ultjo_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.assets.cache new file mode 100644 index 0000000..180976c Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_od40s311_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.assets.cache new file mode 100644 index 0000000..0d3b93b Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ohqjhrto_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7a78849 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..49eaeca --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +213fb75f40b8ce75d90b39ee59df6d77e24cdf22b6311c458ddb7e1045b97c2e diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.assets.cache new file mode 100644 index 0000000..9ae1c1e Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oitdgdeh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.assets.cache new file mode 100644 index 0000000..49a26a9 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_onfmosvh_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.assets.cache new file mode 100644 index 0000000..c7bebaa Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oqapbla0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..018158e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.7.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.7")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.7.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d8491d0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +91d43d20b4e20de9695b93a12ceaf53a4c8f7587e14b17ffd08fb04e22760452 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.assets.cache new file mode 100644 index 0000000..3442bbe Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_orhnrbg5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.assets.cache new file mode 100644 index 0000000..0706189 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_oyg3y55j_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..6162df6 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..69bf724 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +678e1cdbb20644542963cd6b6d37660a5b3453358475522da0e14cae97d922ae diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.assets.cache new file mode 100644 index 0000000..cecd193 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p22wwua4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..076d1c1 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..ce13e57 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7196071bec05d8486fc263ff4b993073937f433e25c369d1e908c5c900fccbfd diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.assets.cache new file mode 100644 index 0000000..69c1be6 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_p4locyif_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..526d939 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7a12b42 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +0f39a3950d66080e59a119d17fa81b90b782d95016a83da8a9ac303e581572fc diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.assets.cache new file mode 100644 index 0000000..7f3cd84 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pe3npyzl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..64626f3 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c390cc4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c649d6d6b4dd1b372837d63e48e62316372ff865a3d32f0d5496a4d31da5fd1d diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.assets.cache new file mode 100644 index 0000000..3ed023a Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_piueda5v_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.assets.cache new file mode 100644 index 0000000..570ac86 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_pqienbyq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.assets.cache new file mode 100644 index 0000000..2e71e55 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q0yggybv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bcd2b24 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e852745 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +42767161f5ceddd9e41eb0058ffb00d0f01c3fc075c18042eea0393b83dacf81 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.assets.cache new file mode 100644 index 0000000..61d6526 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_q3zcyygd_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.assets.cache new file mode 100644 index 0000000..6916c45 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qdeb3ubt_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7a78849 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..49eaeca --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +213fb75f40b8ce75d90b39ee59df6d77e24cdf22b6311c458ddb7e1045b97c2e diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.assets.cache new file mode 100644 index 0000000..3a62b13 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qeecjars_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.assets.cache new file mode 100644 index 0000000..99967e1 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_qi1210e0_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.assets.cache new file mode 100644 index 0000000..d2cf742 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r0ec140t_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.assets.cache new file mode 100644 index 0000000..0e181c9 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_r3u5xxdm_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.assets.cache new file mode 100644 index 0000000..7e85188 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rm4sufus_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.assets.cache new file mode 100644 index 0000000..440bd16 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_rms0inft_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.assets.cache new file mode 100644 index 0000000..11530d0 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knfyqk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..82e9895 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.8.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.8.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.8.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..aac9b2d --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f988f867917f8bf4591a42248a8bcc633410d5702c30e243fe0d6dae13c42bb9 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.assets.cache new file mode 100644 index 0000000..2edb597 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1knvn45_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..6162df6 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..69bf724 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +678e1cdbb20644542963cd6b6d37660a5b3453358475522da0e14cae97d922ae diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.assets.cache new file mode 100644 index 0000000..27b31b3 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s1mt1tlk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7a78849 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..49eaeca --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +213fb75f40b8ce75d90b39ee59df6d77e24cdf22b6311c458ddb7e1045b97c2e diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.assets.cache new file mode 100644 index 0000000..4d0c7f0 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_s301ylzv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.assets.cache new file mode 100644 index 0000000..981ade7 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_sf5qayef_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..526d939 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.4.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.4.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.4.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7a12b42 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +0f39a3950d66080e59a119d17fa81b90b782d95016a83da8a9ac303e581572fc diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.assets.cache new file mode 100644 index 0000000..c8c41de Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_skuchyqp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.assets.cache new file mode 100644 index 0000000..956414f Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ssq0k0ge_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..5b1b945 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..d36eb59 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +5f13c6fe7d2fae29ad4a58a914e59afbd9f17fd1746db5bb208d67a8da45f42b diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.assets.cache new file mode 100644 index 0000000..81bf8d4 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_svtj1k3e_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..64626f3 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c390cc4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c649d6d6b4dd1b372837d63e48e62316372ff865a3d32f0d5496a4d31da5fd1d diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.assets.cache new file mode 100644 index 0000000..f03b74e Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t2dycgtl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..9e22b37 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..dd9ef64 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +a854eea15db4591bde1604bd831749b54aad45fa93f637a88d4d96d159c96afb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.assets.cache new file mode 100644 index 0000000..cb21148 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_t5w1np2v_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.assets.cache new file mode 100644 index 0000000..7735335 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tbyqeq3w_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..64626f3 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c390cc4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c649d6d6b4dd1b372837d63e48e62316372ff865a3d32f0d5496a4d31da5fd1d diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.assets.cache new file mode 100644 index 0000000..429e0ff Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tcjy2tfp_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..6162df6 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..69bf724 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +678e1cdbb20644542963cd6b6d37660a5b3453358475522da0e14cae97d922ae diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.assets.cache new file mode 100644 index 0000000..f52ca26 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_th5mty5n_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.assets.cache new file mode 100644 index 0000000..ac80826 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tiualrv4_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.assets.cache new file mode 100644 index 0000000..8409ee0 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_to4snyuc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..6162df6 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..69bf724 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +678e1cdbb20644542963cd6b6d37660a5b3453358475522da0e14cae97d922ae diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.assets.cache new file mode 100644 index 0000000..0a43d2a Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_trp0ahq3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.assets.cache new file mode 100644 index 0000000..5aa2ee0 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tte1ccim_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..f8a2d2b --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..2cd444d --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +aa7b2b50064fa896f0bc918c6d9b9322035ecc6fc65ba673164722c60592f937 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.assets.cache new file mode 100644 index 0000000..97f5852 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_tvgodhbx_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.assets.cache new file mode 100644 index 0000000..a62d81d Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubq15sc3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.assets.cache new file mode 100644 index 0000000..2cf07f1 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ubsv2mhl_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.assets.cache new file mode 100644 index 0000000..64e3934 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_udqf41qk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bcd2b24 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e852745 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +42767161f5ceddd9e41eb0058ffb00d0f01c3fc075c18042eea0393b83dacf81 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.assets.cache new file mode 100644 index 0000000..6cca7a7 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uecz5all_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..64626f3 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c390cc4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c649d6d6b4dd1b372837d63e48e62316372ff865a3d32f0d5496a4d31da5fd1d diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.assets.cache new file mode 100644 index 0000000..54ab7d2 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uoopbptr_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.assets.cache new file mode 100644 index 0000000..6f19c24 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usddno3h_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.assets.cache new file mode 100644 index 0000000..220a4a8 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_usyxak5v_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.assets.cache new file mode 100644 index 0000000..7fbed1f Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uvtu4las_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.assets.cache new file mode 100644 index 0000000..93d7db9 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_uz1azzv3_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..64626f3 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.6.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.6")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.6.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..c390cc4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +c649d6d6b4dd1b372837d63e48e62316372ff865a3d32f0d5496a4d31da5fd1d diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.assets.cache new file mode 100644 index 0000000..37ab700 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_v0t4hbvu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.assets.cache new file mode 100644 index 0000000..dea30b3 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_vltnl2uq_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..ffb747c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7e5b94f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2e6deed0ca6edc2d5f64e6836ddd81a7b0bd4e5774edc840d9b3ce84bd63551b diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.assets.cache new file mode 100644 index 0000000..c1d9ea5 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_whqgx5gu_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.assets.cache new file mode 100644 index 0000000..99b92e6 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wkgsdmhx_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.assets.cache new file mode 100644 index 0000000..2dc6273 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_wufvz1te_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.assets.cache new file mode 100644 index 0000000..1303fe5 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x2yphy0r_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..b070108 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.1.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..a34ff0f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +232588634ffa467e6a52b85091b7fc30a838d5ad27d95d88ed8bc839c7fb62fb diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.assets.cache new file mode 100644 index 0000000..af4dbe9 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5imvnlc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.assets.cache new file mode 100644 index 0000000..ea58100 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_x5nlsijy_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..6162df6 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.5.3.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.5.3")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.5.3.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..69bf724 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +678e1cdbb20644542963cd6b6d37660a5b3453358475522da0e14cae97d922ae diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.assets.cache new file mode 100644 index 0000000..206a5f5 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xb2fj4db_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.assets.cache new file mode 100644 index 0000000..240e6a5 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xqwmhzmv_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.assets.cache new file mode 100644 index 0000000..67dea64 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_xx21qqkk_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.assets.cache new file mode 100644 index 0000000..9633368 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ylnbfk3s_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bcd2b24 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..e852745 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +42767161f5ceddd9e41eb0058ffb00d0f01c3fc075c18042eea0393b83dacf81 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.assets.cache new file mode 100644 index 0000000..6d3f60a Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yo2jqzf5_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.assets.cache new file mode 100644 index 0000000..a1c7325 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_ypxg5pit_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.assets.cache new file mode 100644 index 0000000..74d6b1b Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxhpnd4l_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..7a78849 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.3.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.3.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.3.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..49eaeca --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +213fb75f40b8ce75d90b39ee59df6d77e24cdf22b6311c458ddb7e1045b97c2e diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.assets.cache new file mode 100644 index 0000000..0a58c77 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_yxxwx4e1_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..846fbe2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7af8bff --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +2de9384ca8a7181e64fa1e759c469bfd0540751ab3821275370408cfb4c7c13a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.assets.cache new file mode 100644 index 0000000..7d8b520 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4hnhxec_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..1b28645 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..b23c29b --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6e1a96f76bcdbdc5bd0e4f87afae4fb2b18a573264f75040b2d3e1aa5b1e09ba diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.assets.cache new file mode 100644 index 0000000..b619f53 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_z4mbsoax_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..bf8ea43 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.2.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.2.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.2.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..1445846 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f0bb17e5afce495d8f69541d0f68f53fbaf77c24025beae075171580ec51139a diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.assets.cache new file mode 100644 index 0000000..942e805 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zkptnohs_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.assets.cache new file mode 100644 index 0000000..f05f728 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zsoxiw4a_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.assets.cache new file mode 100644 index 0000000..3fed503 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zuk5iwhe_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.AssemblyInfo.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.AssemblyInfo.cs new file mode 100644 index 0000000..a5b2df2 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.AssemblyInfo.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AxCopilot.Tests")] +[assembly: System.Reflection.AssemblyCompanyAttribute("AX")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyDescriptionAttribute("AI 기반 업무 자동화 런처 & 코파일럿")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.6.1.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.6.1")] +[assembly: System.Reflection.AssemblyProductAttribute("AX Copilot")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.6.1.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.AssemblyInfoInputs.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.AssemblyInfoInputs.cache new file mode 100644 index 0000000..51d9052 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8ba2aadc0a00a4aba2abe03f0411d3535cdb97dadc95273fb3f3216dd15149d8 diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..408260f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 +build_property.ProjectDir = E:\AX Copilot\src\AxCopilot\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.GlobalUsings.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.GlobalUsings.g.cs new file mode 100644 index 0000000..e6eff56 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.GlobalUsings.g.cs @@ -0,0 +1,6 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Linq; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.assets.cache b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.assets.cache new file mode 100644 index 0000000..627a4f5 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/AxCopilot_zy0ogtmc_wpftmp.assets.cache differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/GeneratedInternalTypeHelper.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/GeneratedInternalTypeHelper.g.cs new file mode 100644 index 0000000..c65238f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/GeneratedInternalTypeHelper.g.cs @@ -0,0 +1,2 @@ + + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/PublishOutputs.30534f3901.txt b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/PublishOutputs.30534f3901.txt new file mode 100644 index 0000000..5ac7f71 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/PublishOutputs.30534f3901.txt @@ -0,0 +1,36 @@ +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\AxCopilot.exe +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\AX Copilot 사용가이드.htm +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\SearchEngines\duckduckgo.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\SearchEngines\github.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\SearchEngines\google.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\SearchEngines\namuwiki.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\SearchEngines\naver.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\SearchEngines\navermap.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\SearchEngines\wikipedia.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\SearchEngines\youtube.png +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\system_prompt.txt +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\runtimes\win-x64\native\WebView2Loader.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Assets\icon.ico +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\AxCopilot.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\AxCopilot.deps.json +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\AxCopilot.runtimeconfig.json +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\DocumentFormat.OpenXml.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\DocumentFormat.OpenXml.Framework.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Markdig.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\System.Diagnostics.EventLog.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\System.IO.Packaging.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\System.ServiceProcess.ServiceController.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\UglyToad.PdfPig.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\UglyToad.PdfPig.Core.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\UglyToad.PdfPig.Fonts.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\UglyToad.PdfPig.Tokenization.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\UglyToad.PdfPig.Tokens.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\WebView2Loader.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\AxCopilot.SDK.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Microsoft.Web.WebView2.Core.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Microsoft.Web.WebView2.WinForms.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Microsoft.Web.WebView2.Wpf.dll +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\AxCopilot.SDK.pdb +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Microsoft.Web.WebView2.Core.xml +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Microsoft.Web.WebView2.WinForms.xml +E:\AX Copilot\src\AxCopilot\bin\Release\net8.0-windows\win-x64\publish\Microsoft.Web.WebView2.Wpf.xml diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/PublishOutputs.7ac3d3aa68.txt b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/PublishOutputs.7ac3d3aa68.txt new file mode 100644 index 0000000..4cee6d9 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/PublishOutputs.7ac3d3aa68.txt @@ -0,0 +1,539 @@ +E:\AX Copilot\dist\AxCopilot\AxCopilot.exe +E:\AX Copilot\dist\AxCopilot\Assets\guide_user.enc +E:\AX Copilot\dist\AxCopilot\Assets\guide_dev.enc +E:\AX Copilot\dist\AxCopilot\Assets\SearchEngines\duckduckgo.png +E:\AX Copilot\dist\AxCopilot\Assets\SearchEngines\github.png +E:\AX Copilot\dist\AxCopilot\Assets\SearchEngines\google.png +E:\AX Copilot\dist\AxCopilot\Assets\SearchEngines\namuwiki.png +E:\AX Copilot\dist\AxCopilot\Assets\SearchEngines\naver.png +E:\AX Copilot\dist\AxCopilot\Assets\SearchEngines\navermap.png +E:\AX Copilot\dist\AxCopilot\Assets\SearchEngines\wikipedia.png +E:\AX Copilot\dist\AxCopilot\Assets\SearchEngines\youtube.png +E:\AX Copilot\dist\AxCopilot\system_prompt.txt +E:\AX Copilot\dist\AxCopilot\skills\adr-writer.skill.md +E:\AX Copilot\dist\AxCopilot\skills\api-docs.skill.md +E:\AX Copilot\dist\AxCopilot\skills\batch-rename.skill.md +E:\AX Copilot\dist\AxCopilot\skills\changelog.skill.md +E:\AX Copilot\dist\AxCopilot\skills\code-scaffold.skill.md +E:\AX Copilot\dist\AxCopilot\skills\commit-review.skill.md +E:\AX Copilot\dist\AxCopilot\skills\compare.skill.md +E:\AX Copilot\dist\AxCopilot\skills\csv-to-xlsx.skill.md +E:\AX Copilot\dist\AxCopilot\skills\data-convert.skill.md +E:\AX Copilot\dist\AxCopilot\skills\data-visualize-adv.skill.md +E:\AX Copilot\dist\AxCopilot\skills\data-visualize.skill.md +E:\AX Copilot\dist\AxCopilot\skills\db-schema.skill.md +E:\AX Copilot\dist\AxCopilot\skills\dependency-audit.skill.md +E:\AX Copilot\dist\AxCopilot\skills\diagram-generator.skill.md +E:\AX Copilot\dist\AxCopilot\skills\docx-creator.skill.md +E:\AX Copilot\dist\AxCopilot\skills\email-draft.skill.md +E:\AX Copilot\dist\AxCopilot\skills\env-setup.skill.md +E:\AX Copilot\dist\AxCopilot\skills\gen-test.skill.md +E:\AX Copilot\dist\AxCopilot\skills\image-processor.skill.md +E:\AX Copilot\dist\AxCopilot\skills\impact.skill.md +E:\AX Copilot\dist\AxCopilot\skills\json-schema.skill.md +E:\AX Copilot\dist\AxCopilot\skills\log-analyze.skill.md +E:\AX Copilot\dist\AxCopilot\skills\markdown-to-doc.skill.md +E:\AX Copilot\dist\AxCopilot\skills\meeting-minutes.skill.md +E:\AX Copilot\dist\AxCopilot\skills\ocr-extract.skill.md +E:\AX Copilot\dist\AxCopilot\skills\paper-review.skill.md +E:\AX Copilot\dist\AxCopilot\skills\pdf-processor.skill.md +E:\AX Copilot\dist\AxCopilot\skills\perf-audit.skill.md +E:\AX Copilot\dist\AxCopilot\skills\pptx-creator.skill.md +E:\AX Copilot\dist\AxCopilot\skills\prd-generator.skill.md +E:\AX Copilot\dist\AxCopilot\skills\refactor.skill.md +E:\AX Copilot\dist\AxCopilot\skills\regex-helper.skill.md +E:\AX Copilot\dist\AxCopilot\skills\release-note.skill.md +E:\AX Copilot\dist\AxCopilot\skills\report-writer.skill.md +E:\AX Copilot\dist\AxCopilot\skills\security-audit.skill.md +E:\AX Copilot\dist\AxCopilot\skills\sql-report.skill.md +E:\AX Copilot\dist\AxCopilot\skills\translate.skill.md +E:\AX Copilot\dist\AxCopilot\skills\weekly-report.skill.md +E:\AX Copilot\dist\AxCopilot\skills\xlsx-analyzer.skill.md +E:\AX Copilot\dist\AxCopilot\skills\yield-analysis.skill.md +E:\AX Copilot\dist\AxCopilot\runtimes\win-x64\native\WebView2Loader.dll +E:\AX Copilot\dist\AxCopilot\Assets\icon.ico +E:\AX Copilot\dist\AxCopilot\AxCopilot.dll +E:\AX Copilot\dist\AxCopilot\AxCopilot.deps.json +E:\AX Copilot\dist\AxCopilot\AxCopilot.runtimeconfig.json +E:\AX Copilot\dist\AxCopilot\Microsoft.CSharp.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.VisualBasic.Core.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.Win32.Primitives.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.Win32.Registry.dll +E:\AX Copilot\dist\AxCopilot\System.AppContext.dll +E:\AX Copilot\dist\AxCopilot\System.Buffers.dll +E:\AX Copilot\dist\AxCopilot\System.Collections.Concurrent.dll +E:\AX Copilot\dist\AxCopilot\System.Collections.Immutable.dll +E:\AX Copilot\dist\AxCopilot\System.Collections.NonGeneric.dll +E:\AX Copilot\dist\AxCopilot\System.Collections.Specialized.dll +E:\AX Copilot\dist\AxCopilot\System.Collections.dll +E:\AX Copilot\dist\AxCopilot\System.ComponentModel.Annotations.dll +E:\AX Copilot\dist\AxCopilot\System.ComponentModel.DataAnnotations.dll +E:\AX Copilot\dist\AxCopilot\System.ComponentModel.EventBasedAsync.dll +E:\AX Copilot\dist\AxCopilot\System.ComponentModel.Primitives.dll +E:\AX Copilot\dist\AxCopilot\System.ComponentModel.TypeConverter.dll +E:\AX Copilot\dist\AxCopilot\System.ComponentModel.dll +E:\AX Copilot\dist\AxCopilot\System.Configuration.dll +E:\AX Copilot\dist\AxCopilot\System.Console.dll +E:\AX Copilot\dist\AxCopilot\System.Core.dll +E:\AX Copilot\dist\AxCopilot\System.Data.Common.dll +E:\AX Copilot\dist\AxCopilot\System.Data.DataSetExtensions.dll +E:\AX Copilot\dist\AxCopilot\System.Data.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.Contracts.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.Debug.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.DiagnosticSource.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.FileVersionInfo.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.Process.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.StackTrace.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.TextWriterTraceListener.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.Tools.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.TraceSource.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.Tracing.dll +E:\AX Copilot\dist\AxCopilot\System.Drawing.Primitives.dll +E:\AX Copilot\dist\AxCopilot\System.Dynamic.Runtime.dll +E:\AX Copilot\dist\AxCopilot\System.Formats.Asn1.dll +E:\AX Copilot\dist\AxCopilot\System.Formats.Tar.dll +E:\AX Copilot\dist\AxCopilot\System.Globalization.Calendars.dll +E:\AX Copilot\dist\AxCopilot\System.Globalization.Extensions.dll +E:\AX Copilot\dist\AxCopilot\System.Globalization.dll +E:\AX Copilot\dist\AxCopilot\System.IO.Compression.Brotli.dll +E:\AX Copilot\dist\AxCopilot\System.IO.Compression.FileSystem.dll +E:\AX Copilot\dist\AxCopilot\System.IO.Compression.ZipFile.dll +E:\AX Copilot\dist\AxCopilot\System.IO.Compression.dll +E:\AX Copilot\dist\AxCopilot\System.IO.FileSystem.AccessControl.dll +E:\AX Copilot\dist\AxCopilot\System.IO.FileSystem.DriveInfo.dll +E:\AX Copilot\dist\AxCopilot\System.IO.FileSystem.Primitives.dll +E:\AX Copilot\dist\AxCopilot\System.IO.FileSystem.Watcher.dll +E:\AX Copilot\dist\AxCopilot\System.IO.FileSystem.dll +E:\AX Copilot\dist\AxCopilot\System.IO.IsolatedStorage.dll +E:\AX Copilot\dist\AxCopilot\System.IO.MemoryMappedFiles.dll +E:\AX Copilot\dist\AxCopilot\System.IO.Pipes.AccessControl.dll +E:\AX Copilot\dist\AxCopilot\System.IO.Pipes.dll +E:\AX Copilot\dist\AxCopilot\System.IO.UnmanagedMemoryStream.dll +E:\AX Copilot\dist\AxCopilot\System.IO.dll +E:\AX Copilot\dist\AxCopilot\System.Linq.Expressions.dll +E:\AX Copilot\dist\AxCopilot\System.Linq.Parallel.dll +E:\AX Copilot\dist\AxCopilot\System.Linq.Queryable.dll +E:\AX Copilot\dist\AxCopilot\System.Linq.dll +E:\AX Copilot\dist\AxCopilot\System.Memory.dll +E:\AX Copilot\dist\AxCopilot\System.Net.Http.Json.dll +E:\AX Copilot\dist\AxCopilot\System.Net.Http.dll +E:\AX Copilot\dist\AxCopilot\System.Net.HttpListener.dll +E:\AX Copilot\dist\AxCopilot\System.Net.Mail.dll +E:\AX Copilot\dist\AxCopilot\System.Net.NameResolution.dll +E:\AX Copilot\dist\AxCopilot\System.Net.NetworkInformation.dll +E:\AX Copilot\dist\AxCopilot\System.Net.Ping.dll +E:\AX Copilot\dist\AxCopilot\System.Net.Primitives.dll +E:\AX Copilot\dist\AxCopilot\System.Net.Quic.dll +E:\AX Copilot\dist\AxCopilot\System.Net.Requests.dll +E:\AX Copilot\dist\AxCopilot\System.Net.Security.dll +E:\AX Copilot\dist\AxCopilot\System.Net.ServicePoint.dll +E:\AX Copilot\dist\AxCopilot\System.Net.Sockets.dll +E:\AX Copilot\dist\AxCopilot\System.Net.WebClient.dll +E:\AX Copilot\dist\AxCopilot\System.Net.WebHeaderCollection.dll +E:\AX Copilot\dist\AxCopilot\System.Net.WebProxy.dll +E:\AX Copilot\dist\AxCopilot\System.Net.WebSockets.Client.dll +E:\AX Copilot\dist\AxCopilot\System.Net.WebSockets.dll +E:\AX Copilot\dist\AxCopilot\System.Net.dll +E:\AX Copilot\dist\AxCopilot\System.Numerics.Vectors.dll +E:\AX Copilot\dist\AxCopilot\System.Numerics.dll +E:\AX Copilot\dist\AxCopilot\System.ObjectModel.dll +E:\AX Copilot\dist\AxCopilot\System.Private.CoreLib.dll +E:\AX Copilot\dist\AxCopilot\System.Private.DataContractSerialization.dll +E:\AX Copilot\dist\AxCopilot\System.Private.Uri.dll +E:\AX Copilot\dist\AxCopilot\System.Private.Xml.Linq.dll +E:\AX Copilot\dist\AxCopilot\System.Private.Xml.dll +E:\AX Copilot\dist\AxCopilot\System.Reflection.DispatchProxy.dll +E:\AX Copilot\dist\AxCopilot\System.Reflection.Emit.ILGeneration.dll +E:\AX Copilot\dist\AxCopilot\System.Reflection.Emit.Lightweight.dll +E:\AX Copilot\dist\AxCopilot\System.Reflection.Emit.dll +E:\AX Copilot\dist\AxCopilot\System.Reflection.Extensions.dll +E:\AX Copilot\dist\AxCopilot\System.Reflection.Metadata.dll +E:\AX Copilot\dist\AxCopilot\System.Reflection.Primitives.dll +E:\AX Copilot\dist\AxCopilot\System.Reflection.TypeExtensions.dll +E:\AX Copilot\dist\AxCopilot\System.Reflection.dll +E:\AX Copilot\dist\AxCopilot\System.Resources.Reader.dll +E:\AX Copilot\dist\AxCopilot\System.Resources.ResourceManager.dll +E:\AX Copilot\dist\AxCopilot\System.Resources.Writer.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.CompilerServices.Unsafe.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.CompilerServices.VisualC.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Extensions.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Handles.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.InteropServices.JavaScript.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.InteropServices.RuntimeInformation.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.InteropServices.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Intrinsics.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Loader.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Numerics.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Serialization.Formatters.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Serialization.Json.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Serialization.Primitives.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Serialization.Xml.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.Serialization.dll +E:\AX Copilot\dist\AxCopilot\System.Runtime.dll +E:\AX Copilot\dist\AxCopilot\System.Security.AccessControl.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Claims.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.Algorithms.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.Cng.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.Csp.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.Encoding.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.OpenSsl.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.Primitives.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.X509Certificates.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Principal.Windows.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Principal.dll +E:\AX Copilot\dist\AxCopilot\System.Security.SecureString.dll +E:\AX Copilot\dist\AxCopilot\System.Security.dll +E:\AX Copilot\dist\AxCopilot\System.ServiceModel.Web.dll +E:\AX Copilot\dist\AxCopilot\System.ServiceProcess.dll +E:\AX Copilot\dist\AxCopilot\System.Text.Encoding.CodePages.dll +E:\AX Copilot\dist\AxCopilot\System.Text.Encoding.Extensions.dll +E:\AX Copilot\dist\AxCopilot\System.Text.Encoding.dll +E:\AX Copilot\dist\AxCopilot\System.Text.Encodings.Web.dll +E:\AX Copilot\dist\AxCopilot\System.Text.Json.dll +E:\AX Copilot\dist\AxCopilot\System.Text.RegularExpressions.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.Channels.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.Overlapped.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.Tasks.Dataflow.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.Tasks.Extensions.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.Tasks.Parallel.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.Tasks.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.Thread.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.ThreadPool.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.Timer.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.dll +E:\AX Copilot\dist\AxCopilot\System.Transactions.Local.dll +E:\AX Copilot\dist\AxCopilot\System.Transactions.dll +E:\AX Copilot\dist\AxCopilot\System.ValueTuple.dll +E:\AX Copilot\dist\AxCopilot\System.Web.HttpUtility.dll +E:\AX Copilot\dist\AxCopilot\System.Web.dll +E:\AX Copilot\dist\AxCopilot\System.Windows.dll +E:\AX Copilot\dist\AxCopilot\System.Xml.Linq.dll +E:\AX Copilot\dist\AxCopilot\System.Xml.ReaderWriter.dll +E:\AX Copilot\dist\AxCopilot\System.Xml.Serialization.dll +E:\AX Copilot\dist\AxCopilot\System.Xml.XDocument.dll +E:\AX Copilot\dist\AxCopilot\System.Xml.XPath.XDocument.dll +E:\AX Copilot\dist\AxCopilot\System.Xml.XPath.dll +E:\AX Copilot\dist\AxCopilot\System.Xml.XmlDocument.dll +E:\AX Copilot\dist\AxCopilot\System.Xml.XmlSerializer.dll +E:\AX Copilot\dist\AxCopilot\System.Xml.dll +E:\AX Copilot\dist\AxCopilot\System.dll +E:\AX Copilot\dist\AxCopilot\mscorlib.dll +E:\AX Copilot\dist\AxCopilot\netstandard.dll +E:\AX Copilot\dist\AxCopilot\Accessibility.dll +E:\AX Copilot\dist\AxCopilot\DirectWriteForwarder.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.VisualBasic.Forms.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.VisualBasic.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.Win32.Registry.AccessControl.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.Win32.SystemEvents.dll +E:\AX Copilot\dist\AxCopilot\PresentationCore.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework-SystemCore.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework-SystemData.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework-SystemDrawing.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework-SystemXml.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework-SystemXmlLinq.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework.Aero.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework.Aero2.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework.AeroLite.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework.Classic.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework.Luna.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework.Royale.dll +E:\AX Copilot\dist\AxCopilot\PresentationFramework.dll +E:\AX Copilot\dist\AxCopilot\PresentationUI.dll +E:\AX Copilot\dist\AxCopilot\ReachFramework.dll +E:\AX Copilot\dist\AxCopilot\System.CodeDom.dll +E:\AX Copilot\dist\AxCopilot\System.Configuration.ConfigurationManager.dll +E:\AX Copilot\dist\AxCopilot\System.Design.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.EventLog.Messages.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.EventLog.dll +E:\AX Copilot\dist\AxCopilot\System.Diagnostics.PerformanceCounter.dll +E:\AX Copilot\dist\AxCopilot\System.DirectoryServices.dll +E:\AX Copilot\dist\AxCopilot\System.Drawing.Common.dll +E:\AX Copilot\dist\AxCopilot\System.Drawing.Design.dll +E:\AX Copilot\dist\AxCopilot\System.Drawing.dll +E:\AX Copilot\dist\AxCopilot\System.IO.Packaging.dll +E:\AX Copilot\dist\AxCopilot\System.Printing.dll +E:\AX Copilot\dist\AxCopilot\System.Resources.Extensions.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.Pkcs.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.ProtectedData.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Cryptography.Xml.dll +E:\AX Copilot\dist\AxCopilot\System.Security.Permissions.dll +E:\AX Copilot\dist\AxCopilot\System.Threading.AccessControl.dll +E:\AX Copilot\dist\AxCopilot\System.Windows.Controls.Ribbon.dll +E:\AX Copilot\dist\AxCopilot\System.Windows.Extensions.dll +E:\AX Copilot\dist\AxCopilot\System.Windows.Forms.Design.Editors.dll +E:\AX Copilot\dist\AxCopilot\System.Windows.Forms.Design.dll +E:\AX Copilot\dist\AxCopilot\System.Windows.Forms.Primitives.dll +E:\AX Copilot\dist\AxCopilot\System.Windows.Forms.dll +E:\AX Copilot\dist\AxCopilot\System.Windows.Input.Manipulations.dll +E:\AX Copilot\dist\AxCopilot\System.Windows.Presentation.dll +E:\AX Copilot\dist\AxCopilot\System.Xaml.dll +E:\AX Copilot\dist\AxCopilot\UIAutomationClient.dll +E:\AX Copilot\dist\AxCopilot\UIAutomationClientSideProviders.dll +E:\AX Copilot\dist\AxCopilot\UIAutomationProvider.dll +E:\AX Copilot\dist\AxCopilot\UIAutomationTypes.dll +E:\AX Copilot\dist\AxCopilot\WindowsBase.dll +E:\AX Copilot\dist\AxCopilot\WindowsFormsIntegration.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.DiaSymReader.Native.amd64.dll +E:\AX Copilot\dist\AxCopilot\System.IO.Compression.Native.dll +E:\AX Copilot\dist\AxCopilot\clretwrc.dll +E:\AX Copilot\dist\AxCopilot\clrgc.dll +E:\AX Copilot\dist\AxCopilot\clrjit.dll +E:\AX Copilot\dist\AxCopilot\coreclr.dll +E:\AX Copilot\dist\AxCopilot\createdump.exe +E:\AX Copilot\dist\AxCopilot\hostfxr.dll +E:\AX Copilot\dist\AxCopilot\hostpolicy.dll +E:\AX Copilot\dist\AxCopilot\mscordaccore.dll +E:\AX Copilot\dist\AxCopilot\mscordaccore_amd64_amd64_8.0.2526.11203.dll +E:\AX Copilot\dist\AxCopilot\mscordbi.dll +E:\AX Copilot\dist\AxCopilot\mscorrc.dll +E:\AX Copilot\dist\AxCopilot\msquic.dll +E:\AX Copilot\dist\AxCopilot\D3DCompiler_47_cor3.dll +E:\AX Copilot\dist\AxCopilot\PenImc_cor3.dll +E:\AX Copilot\dist\AxCopilot\PresentationNative_cor3.dll +E:\AX Copilot\dist\AxCopilot\vcruntime140_cor3.dll +E:\AX Copilot\dist\AxCopilot\wpfgfx_cor3.dll +E:\AX Copilot\dist\AxCopilot\cs\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\cs\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\de\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\de\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\de\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\de\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\de\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\de\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\de\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\de\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\de\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\de\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\de\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\de\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\de\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\de\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\de\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\de\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\de\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\es\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\es\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\es\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\es\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\es\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\es\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\es\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\es\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\es\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\es\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\es\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\es\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\es\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\es\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\es\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\es\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\es\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\fr\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\it\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\it\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\it\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\it\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\it\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\it\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\it\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\it\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\it\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\it\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\it\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\it\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\it\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\it\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\it\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\it\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\it\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\ja\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\ko\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\pl\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\pt-BR\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\ru\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\tr\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hans\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\Microsoft.VisualBasic.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\PresentationCore.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\PresentationFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\PresentationUI.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\ReachFramework.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\System.Windows.Controls.Ribbon.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\System.Windows.Forms.Design.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\System.Windows.Forms.Primitives.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\System.Windows.Forms.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\System.Windows.Input.Manipulations.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\System.Xaml.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\UIAutomationClient.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\UIAutomationClientSideProviders.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\UIAutomationProvider.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\UIAutomationTypes.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\WindowsBase.resources.dll +E:\AX Copilot\dist\AxCopilot\zh-Hant\WindowsFormsIntegration.resources.dll +E:\AX Copilot\dist\AxCopilot\DocumentFormat.OpenXml.dll +E:\AX Copilot\dist\AxCopilot\DocumentFormat.OpenXml.Framework.dll +E:\AX Copilot\dist\AxCopilot\Markdig.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.Data.Sqlite.dll +E:\AX Copilot\dist\AxCopilot\SQLitePCLRaw.batteries_v2.dll +E:\AX Copilot\dist\AxCopilot\SQLitePCLRaw.core.dll +E:\AX Copilot\dist\AxCopilot\SQLitePCLRaw.provider.e_sqlite3.dll +E:\AX Copilot\dist\AxCopilot\System.ServiceProcess.ServiceController.dll +E:\AX Copilot\dist\AxCopilot\UglyToad.PdfPig.dll +E:\AX Copilot\dist\AxCopilot\UglyToad.PdfPig.Core.dll +E:\AX Copilot\dist\AxCopilot\UglyToad.PdfPig.Fonts.dll +E:\AX Copilot\dist\AxCopilot\UglyToad.PdfPig.Tokenization.dll +E:\AX Copilot\dist\AxCopilot\UglyToad.PdfPig.Tokens.dll +E:\AX Copilot\dist\AxCopilot\WebView2Loader.dll +E:\AX Copilot\dist\AxCopilot\e_sqlite3.dll +E:\AX Copilot\dist\AxCopilot\AxCopilot.SDK.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.Web.WebView2.Core.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.Web.WebView2.WinForms.dll +E:\AX Copilot\dist\AxCopilot\Microsoft.Web.WebView2.Wpf.dll +E:\AX Copilot\dist\AxCopilot\AxCopilot.SDK.pdb +E:\AX Copilot\dist\AxCopilot\Microsoft.Web.WebView2.Core.xml +E:\AX Copilot\dist\AxCopilot\Microsoft.Web.WebView2.WinForms.xml +E:\AX Copilot\dist\AxCopilot\Microsoft.Web.WebView2.Wpf.xml diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Themes/Codex.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Themes/Codex.baml new file mode 100644 index 0000000..d3d8e94 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Themes/Codex.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AboutWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AboutWindow.baml new file mode 100644 index 0000000..6854af0 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AboutWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AboutWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AboutWindow.g.cs new file mode 100644 index 0000000..c8e2e8c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AboutWindow.g.cs @@ -0,0 +1,270 @@ +#pragma checksum "..\..\..\..\..\Views\AboutWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "2A37B0CE577C6027D104B073B2DC456FEFC9E12A" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// AboutWindow + /// + public partial class AboutWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 103 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas DiamondIconCanvas; + + #line default + #line hidden + + + #line 132 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Image AppIconImage; + + #line default + #line hidden + + + #line 135 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock FallbackIcon; + + #line default + #line hidden + + + #line 144 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Image MascotImage; + + #line default + #line hidden + + + #line 146 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock AppNameText; + + #line default + #line hidden + + + #line 152 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock VersionText; + + #line default + #line hidden + + + #line 160 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Grid MascotOverlay; + + #line default + #line hidden + + + #line 179 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Image MascotOverlayImage; + + #line default + #line hidden + + + #line 209 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PurposeText; + + #line default + #line hidden + + + #line 237 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CompanyNameText; + + #line default + #line hidden + + + #line 265 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BlogLinkBtn; + + #line default + #line hidden + + + #line 273 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Grid ContributorsGrid; + + #line default + #line hidden + + + #line 286 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ContributorsText; + + #line default + #line hidden + + + #line 301 "..\..\..\..\..\Views\AboutWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock BuildInfoText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/aboutwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\AboutWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 15 "..\..\..\..\..\Views\AboutWindow.xaml" + ((AxCopilot.Views.AboutWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + return; + case 2: + + #line 72 "..\..\..\..\..\Views\AboutWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 3: + this.DiamondIconCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 4: + this.AppIconImage = ((System.Windows.Controls.Image)(target)); + return; + case 5: + this.FallbackIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + this.MascotImage = ((System.Windows.Controls.Image)(target)); + return; + case 7: + this.AppNameText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: + this.VersionText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 9: + this.MascotOverlay = ((System.Windows.Controls.Grid)(target)); + return; + case 10: + + #line 166 "..\..\..\..\..\Views\AboutWindow.xaml" + ((System.Windows.Shapes.Rectangle)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.HideMascot_Click); + + #line default + #line hidden + return; + case 11: + this.MascotOverlayImage = ((System.Windows.Controls.Image)(target)); + return; + case 12: + this.PurposeText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 13: + + #line 224 "..\..\..\..\..\Views\AboutWindow.xaml" + ((System.Windows.Controls.Grid)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.ShowMascot_Click); + + #line default + #line hidden + return; + case 14: + this.CompanyNameText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 15: + this.BlogLinkBtn = ((System.Windows.Controls.Button)(target)); + + #line 268 "..\..\..\..\..\Views\AboutWindow.xaml" + this.BlogLinkBtn.Click += new System.Windows.RoutedEventHandler(this.Blog_Click); + + #line default + #line hidden + return; + case 16: + this.ContributorsGrid = ((System.Windows.Controls.Grid)(target)); + return; + case 17: + this.ContributorsText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 18: + this.BuildInfoText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.baml new file mode 100644 index 0000000..809dd26 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.g.cs new file mode 100644 index 0000000..b12d19f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/AgentStatsDashboardWindow.g.cs @@ -0,0 +1,267 @@ +#pragma checksum "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "0E07DAFD7F5E4E82750CB3C022924CD06643CD18" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// AgentStatsDashboardWindow + /// + public partial class AgentStatsDashboardWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 34 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnClose; + + #line default + #line hidden + + + #line 57 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FilterToday; + + #line default + #line hidden + + + #line 61 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border Filter7d; + + #line default + #line hidden + + + #line 65 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border Filter30d; + + #line default + #line hidden + + + #line 69 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FilterAll; + + #line default + #line hidden + + + #line 89 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.UniformGrid SummaryCards; + + #line default + #line hidden + + + #line 95 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DailyChartTitle; + + #line default + #line hidden + + + #line 98 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas DailyBarChart; + + #line default + #line hidden + + + #line 99 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas DailyBarLabels; + + #line default + #line hidden + + + #line 116 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ToolFreqPanel; + + #line default + #line hidden + + + #line 126 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TabBreakPanel; + + #line default + #line hidden + + + #line 129 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ModelBreakPanel; + + #line default + #line hidden + + + #line 139 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/agentstatsdashboardwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 25 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.BtnClose = ((System.Windows.Controls.Border)(target)); + + #line 35 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.BtnClose.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 3: + this.FilterToday = ((System.Windows.Controls.Border)(target)); + + #line 58 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.FilterToday.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.Filter_Click); + + #line default + #line hidden + return; + case 4: + this.Filter7d = ((System.Windows.Controls.Border)(target)); + + #line 62 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.Filter7d.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.Filter_Click); + + #line default + #line hidden + return; + case 5: + this.Filter30d = ((System.Windows.Controls.Border)(target)); + + #line 66 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.Filter30d.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.Filter_Click); + + #line default + #line hidden + return; + case 6: + this.FilterAll = ((System.Windows.Controls.Border)(target)); + + #line 70 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + this.FilterAll.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.Filter_Click); + + #line default + #line hidden + return; + case 7: + + #line 75 "..\..\..\..\..\Views\AgentStatsDashboardWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClearStats_Click); + + #line default + #line hidden + return; + case 8: + this.SummaryCards = ((System.Windows.Controls.Primitives.UniformGrid)(target)); + return; + case 9: + this.DailyChartTitle = ((System.Windows.Controls.TextBlock)(target)); + return; + case 10: + this.DailyBarChart = ((System.Windows.Controls.Canvas)(target)); + return; + case 11: + this.DailyBarLabels = ((System.Windows.Controls.Canvas)(target)); + return; + case 12: + this.ToolFreqPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 13: + this.TabBreakPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 14: + this.ModelBreakPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 15: + this.StatusText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ChatWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ChatWindow.baml new file mode 100644 index 0000000..b3b3307 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ChatWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ChatWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ChatWindow.g.cs new file mode 100644 index 0000000..77a43af --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ChatWindow.g.cs @@ -0,0 +1,1706 @@ +#pragma checksum "..\..\..\..\..\Views\ChatWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "F951B8B4120C88FDB3C4F6E0D8F44C668D86C6CB" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using Microsoft.Web.WebView2.Wpf; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ChatWindow + /// + public partial class ChatWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 124 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ColumnDefinition IconBarColumn; + + #line default + #line hidden + + + #line 126 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ColumnDefinition SidebarColumn; + + #line default + #line hidden + + + #line 129 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ColumnDefinition SplitterColumn; + + #line default + #line hidden + + + #line 131 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ColumnDefinition PreviewColumn; + + #line default + #line hidden + + + #line 135 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border IconBarPanel; + + #line default + #line hidden + + + #line 171 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnUserIconBar; + + #line default + #line hidden + + + #line 177 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UserInitialIconBar; + + #line default + #line hidden + + + #line 187 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SidebarPanel; + + #line default + #line hidden + + + #line 211 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnNewChat; + + #line default + #line hidden + + + #line 226 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox SearchBox; + + #line default + #line hidden + + + #line 236 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnCategoryDrop; + + #line default + #line hidden + + + #line 241 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CategoryIcon; + + #line default + #line hidden + + + #line 245 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CategoryLabel; + + #line default + #line hidden + + + #line 260 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ConversationPanel; + + #line default + #line hidden + + + #line 266 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnDeleteAll; + + #line default + #line hidden + + + #line 286 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UserInitialSidebar; + + #line default + #line hidden + + + #line 290 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UserNameText; + + #line default + #line hidden + + + #line 293 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UserPcText; + + #line default + #line hidden + + + #line 323 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ChatTitle; + + #line default + #line hidden + + + #line 329 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox ChatTitleEdit; + + #line default + #line hidden + + + #line 343 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnPlanMode; + + #line default + #line hidden + + + #line 349 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PlanModeIcon; + + #line default + #line hidden + + + #line 352 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PlanModeLabel; + + #line default + #line hidden + + + #line 355 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PlanModeValue; + + #line default + #line hidden + + + #line 360 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnPreviewToggle; + + #line default + #line hidden + + + #line 364 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Ellipse PreviewDot; + + #line default + #line hidden + + + #line 376 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border AgentProgressBar; + + #line default + #line hidden + + + #line 389 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ProgressIcon; + + #line default + #line hidden + + + #line 394 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ProgressStepLabel; + + #line default + #line hidden + + + #line 402 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border ProgressFill; + + #line default + #line hidden + + + #line 406 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ProgressPercent; + + #line default + #line hidden + + + #line 411 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ProgressElapsed; + + #line default + #line hidden + + + #line 423 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnToggleSidebar; + + #line default + #line hidden + + + #line 427 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToggleSidebarIcon; + + #line default + #line hidden + + + #line 437 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton TabChat; + + #line default + #line hidden + + + #line 440 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton TabCowork; + + #line default + #line hidden + + + #line 443 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton TabCode; + + #line default + #line hidden + + + #line 462 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock MaximizeIcon; + + #line default + #line hidden + + + #line 474 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border MessageSearchBar; + + #line default + #line hidden + + + #line 491 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox SearchTextBox; + + #line default + #line hidden + + + #line 496 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SearchResultCount; + + #line default + #line hidden + + + #line 519 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer MessageScroll; + + #line default + #line hidden + + + #line 523 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MessagePanel; + + #line default + #line hidden + + + #line 533 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel EmptyState; + + #line default + #line hidden + + + #line 538 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border EmptyIcon; + + #line default + #line hidden + + + #line 547 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.TranslateTransform EmptyIconTranslate; + + #line default + #line hidden + + + #line 569 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock EmptyStateTitle; + + #line default + #line hidden + + + #line 571 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock EmptyStateDesc; + + #line default + #line hidden + + + #line 576 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.WrapPanel TopicButtonPanel; + + #line default + #line hidden + + + #line 581 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup TemplatePopup; + + #line default + #line hidden + + + #line 593 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl TemplateItems; + + #line default + #line hidden + + + #line 594 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TemplateEmptyHint; + + #line default + #line hidden + + + #line 603 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup PermissionPopup; + + #line default + #line hidden + + + #line 611 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel PermissionItems; + + #line default + #line hidden + + + #line 616 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup DataUsagePopup; + + #line default + #line hidden + + + #line 624 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel DataUsageItems; + + #line default + #line hidden + + + #line 629 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup SlashPopup; + + #line default + #line hidden + + + #line 640 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SlashNavUp; + + #line default + #line hidden + + + #line 652 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SlashNavUpText; + + #line default + #line hidden + + + #line 657 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl SlashItems; + + #line default + #line hidden + + + #line 659 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SlashNavDown; + + #line default + #line hidden + + + #line 671 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SlashNavDownText; + + #line default + #line hidden + + + #line 680 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup FolderMenuPopup; + + #line default + #line hidden + + + #line 688 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel FolderMenuItems; + + #line default + #line hidden + + + #line 693 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border ToastBorder; + + #line default + #line hidden + + + #line 701 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToastIcon; + + #line default + #line hidden + + + #line 703 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToastText; + + #line default + #line hidden + + + #line 714 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border InputGlowBorder; + + #line default + #line hidden + + + #line 717 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.LinearGradientBrush RainbowBrush; + + #line default + #line hidden + + + #line 735 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border InputBorder; + + #line default + #line hidden + + + #line 748 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnModelSelector; + + #line default + #line hidden + + + #line 759 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ModelLabel; + + #line default + #line hidden + + + #line 767 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnTemplateSelector; + + #line default + #line hidden + + + #line 786 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl AttachedFilesPanel; + + #line default + #line hidden + + + #line 806 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox InputBox; + + #line default + #line hidden + + + #line 820 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock InputWatermark; + + #line default + #line hidden + + + #line 827 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SlashCommandChip; + + #line default + #line hidden + + + #line 836 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SlashChipText; + + #line default + #line hidden + + + #line 840 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SlashChipClose; + + #line default + #line hidden + + + #line 852 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAttach; + + #line default + #line hidden + + + #line 871 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnPause; + + #line default + #line hidden + + + #line 878 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PauseIcon; + + #line default + #line hidden + + + #line 885 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnStop; + + #line default + #line hidden + + + #line 900 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnSend; + + #line default + #line hidden + + + #line 929 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FolderBar; + + #line default + #line hidden + + + #line 950 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock FolderPathLabel; + + #line default + #line hidden + + + #line 969 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MoodIconPanel; + + #line default + #line hidden + + + #line 973 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FormatMoodSeparator; + + #line default + #line hidden + + + #line 977 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnDataUsage; + + #line default + #line hidden + + + #line 982 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DataUsageIcon; + + #line default + #line hidden + + + #line 985 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DataUsageLabel; + + #line default + #line hidden + + + #line 996 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnPermission; + + #line default + #line hidden + + + #line 999 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PermissionIcon; + + #line default + #line hidden + + + #line 1002 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PermissionLabel; + + #line default + #line hidden + + + #line 1011 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup FormatMenuPopup; + + #line default + #line hidden + + + #line 1018 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel FormatMenuItems; + + #line default + #line hidden + + + #line 1023 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Popup MoodMenuPopup; + + #line default + #line hidden + + + #line 1031 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MoodMenuItems; + + #line default + #line hidden + + + #line 1037 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border AutoPermissionWarning; + + #line default + #line hidden + + + #line 1046 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAutoWarningClose; + + #line default + #line hidden + + + #line 1058 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border FileBrowserPanel; + + #line default + #line hidden + + + #line 1074 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock FileBrowserTitle; + + #line default + #line hidden + + + #line 1099 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TreeView FileTreeView; + + #line default + #line hidden + + + #line 1114 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusDiamond; + + #line default + #line hidden + + + #line 1119 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.RotateTransform StatusDiamondRotate; + + #line default + #line hidden + + + #line 1122 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusLabel; + + #line default + #line hidden + + + #line 1129 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnShowAnalyzer; + + #line default + #line hidden + + + #line 1140 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusElapsed; + + #line default + #line hidden + + + #line 1143 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusTokens; + + #line default + #line hidden + + + #line 1152 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.GridSplitter PreviewSplitter; + + #line default + #line hidden + + + #line 1164 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border PreviewPanel; + + #line default + #line hidden + + + #line 1181 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel PreviewTabPanel; + + #line default + #line hidden + + + #line 1184 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnOpenExternal; + + #line default + #line hidden + + + #line 1200 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal Microsoft.Web.WebView2.Wpf.WebView2 PreviewWebView; + + #line default + #line hidden + + + #line 1201 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer PreviewTextScroll; + + #line default + #line hidden + + + #line 1203 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewTextBlock; + + #line default + #line hidden + + + #line 1207 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.DataGrid PreviewDataGrid; + + #line default + #line hidden + + + #line 1214 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewEmpty; + + #line default + #line hidden + + + #line 1223 "..\..\..\..\..\Views\ChatWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Primitives.Thumb ResizeGrip; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/chatwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ChatWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + this.IconBarColumn = ((System.Windows.Controls.ColumnDefinition)(target)); + return; + case 2: + this.SidebarColumn = ((System.Windows.Controls.ColumnDefinition)(target)); + return; + case 3: + this.SplitterColumn = ((System.Windows.Controls.ColumnDefinition)(target)); + return; + case 4: + this.PreviewColumn = ((System.Windows.Controls.ColumnDefinition)(target)); + return; + case 5: + this.IconBarPanel = ((System.Windows.Controls.Border)(target)); + return; + case 6: + + #line 148 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnNewChat_Click); + + #line default + #line hidden + return; + case 7: + + #line 157 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnToggleSidebar_Click); + + #line default + #line hidden + return; + case 8: + + #line 163 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnCategoryDrop_Click); + + #line default + #line hidden + return; + case 9: + this.BtnUserIconBar = ((System.Windows.Controls.Button)(target)); + return; + case 10: + this.UserInitialIconBar = ((System.Windows.Controls.TextBlock)(target)); + return; + case 11: + this.SidebarPanel = ((System.Windows.Controls.Border)(target)); + return; + case 12: + this.BtnNewChat = ((System.Windows.Controls.Button)(target)); + + #line 213 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnNewChat.Click += new System.Windows.RoutedEventHandler(this.BtnNewChat_Click); + + #line default + #line hidden + return; + case 13: + this.SearchBox = ((System.Windows.Controls.TextBox)(target)); + + #line 230 "..\..\..\..\..\Views\ChatWindow.xaml" + this.SearchBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.SearchBox_TextChanged); + + #line default + #line hidden + return; + case 14: + this.BtnCategoryDrop = ((System.Windows.Controls.Button)(target)); + + #line 238 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnCategoryDrop.Click += new System.Windows.RoutedEventHandler(this.BtnCategoryDrop_Click); + + #line default + #line hidden + return; + case 15: + this.CategoryIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 16: + this.CategoryLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 17: + this.ConversationPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 18: + this.BtnDeleteAll = ((System.Windows.Controls.Button)(target)); + + #line 268 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnDeleteAll.Click += new System.Windows.RoutedEventHandler(this.BtnDeleteAll_Click); + + #line default + #line hidden + return; + case 19: + this.UserInitialSidebar = ((System.Windows.Controls.TextBlock)(target)); + return; + case 20: + this.UserNameText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 21: + this.UserPcText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 22: + this.ChatTitle = ((System.Windows.Controls.TextBlock)(target)); + + #line 327 "..\..\..\..\..\Views\ChatWindow.xaml" + this.ChatTitle.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.ChatTitle_MouseDown); + + #line default + #line hidden + return; + case 23: + this.ChatTitleEdit = ((System.Windows.Controls.TextBox)(target)); + + #line 336 "..\..\..\..\..\Views\ChatWindow.xaml" + this.ChatTitleEdit.LostFocus += new System.Windows.RoutedEventHandler(this.ChatTitleEdit_LostFocus); + + #line default + #line hidden + + #line 337 "..\..\..\..\..\Views\ChatWindow.xaml" + this.ChatTitleEdit.KeyDown += new System.Windows.Input.KeyEventHandler(this.ChatTitleEdit_KeyDown); + + #line default + #line hidden + return; + case 24: + this.BtnPlanMode = ((System.Windows.Controls.Border)(target)); + + #line 346 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnPlanMode.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnPlanMode_Click); + + #line default + #line hidden + return; + case 25: + this.PlanModeIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 26: + this.PlanModeLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 27: + this.PlanModeValue = ((System.Windows.Controls.TextBlock)(target)); + return; + case 28: + this.BtnPreviewToggle = ((System.Windows.Controls.Button)(target)); + + #line 361 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnPreviewToggle.Click += new System.Windows.RoutedEventHandler(this.BtnPreviewToggle_Click); + + #line default + #line hidden + return; + case 29: + this.PreviewDot = ((System.Windows.Shapes.Ellipse)(target)); + return; + case 30: + this.AgentProgressBar = ((System.Windows.Controls.Border)(target)); + return; + case 31: + this.ProgressIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 32: + this.ProgressStepLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 33: + this.ProgressFill = ((System.Windows.Controls.Border)(target)); + return; + case 34: + this.ProgressPercent = ((System.Windows.Controls.TextBlock)(target)); + return; + case 35: + this.ProgressElapsed = ((System.Windows.Controls.TextBlock)(target)); + return; + case 36: + this.BtnToggleSidebar = ((System.Windows.Controls.Button)(target)); + + #line 425 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnToggleSidebar.Click += new System.Windows.RoutedEventHandler(this.BtnToggleSidebar_Click); + + #line default + #line hidden + return; + case 37: + this.ToggleSidebarIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 38: + this.TabChat = ((System.Windows.Controls.RadioButton)(target)); + + #line 439 "..\..\..\..\..\Views\ChatWindow.xaml" + this.TabChat.Checked += new System.Windows.RoutedEventHandler(this.TabChat_Checked); + + #line default + #line hidden + return; + case 39: + this.TabCowork = ((System.Windows.Controls.RadioButton)(target)); + + #line 442 "..\..\..\..\..\Views\ChatWindow.xaml" + this.TabCowork.Checked += new System.Windows.RoutedEventHandler(this.TabCowork_Checked); + + #line default + #line hidden + return; + case 40: + this.TabCode = ((System.Windows.Controls.RadioButton)(target)); + + #line 445 "..\..\..\..\..\Views\ChatWindow.xaml" + this.TabCode.Checked += new System.Windows.RoutedEventHandler(this.TabCode_Checked); + + #line default + #line hidden + return; + case 41: + + #line 453 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnSettings_Click); + + #line default + #line hidden + return; + case 42: + + #line 457 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnMinimize_Click); + + #line default + #line hidden + return; + case 43: + + #line 461 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnMaximize_Click); + + #line default + #line hidden + return; + case 44: + this.MaximizeIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 45: + + #line 465 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 46: + this.MessageSearchBar = ((System.Windows.Controls.Border)(target)); + return; + case 47: + this.SearchTextBox = ((System.Windows.Controls.TextBox)(target)); + + #line 495 "..\..\..\..\..\Views\ChatWindow.xaml" + this.SearchTextBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.SearchTextBox_TextChanged); + + #line default + #line hidden + return; + case 48: + this.SearchResultCount = ((System.Windows.Controls.TextBlock)(target)); + return; + case 49: + + #line 501 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SearchPrev_Click); + + #line default + #line hidden + return; + case 50: + + #line 506 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SearchNext_Click); + + #line default + #line hidden + return; + case 51: + + #line 511 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.SearchClose_Click); + + #line default + #line hidden + return; + case 52: + this.MessageScroll = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 53: + this.MessagePanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 54: + this.EmptyState = ((System.Windows.Controls.StackPanel)(target)); + return; + case 55: + this.EmptyIcon = ((System.Windows.Controls.Border)(target)); + return; + case 56: + this.EmptyIconTranslate = ((System.Windows.Media.TranslateTransform)(target)); + return; + case 57: + this.EmptyStateTitle = ((System.Windows.Controls.TextBlock)(target)); + return; + case 58: + this.EmptyStateDesc = ((System.Windows.Controls.TextBlock)(target)); + return; + case 59: + this.TopicButtonPanel = ((System.Windows.Controls.WrapPanel)(target)); + return; + case 60: + this.TemplatePopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 61: + this.TemplateItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 62: + this.TemplateEmptyHint = ((System.Windows.Controls.TextBlock)(target)); + return; + case 63: + this.PermissionPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 64: + this.PermissionItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 65: + this.DataUsagePopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 66: + this.DataUsageItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 67: + this.SlashPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 68: + + #line 637 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Border)(target)).PreviewMouseWheel += new System.Windows.Input.MouseWheelEventHandler(this.SlashPopup_PreviewMouseWheel); + + #line default + #line hidden + return; + case 69: + this.SlashNavUp = ((System.Windows.Controls.Border)(target)); + return; + case 70: + this.SlashNavUpText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 71: + this.SlashItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 72: + this.SlashNavDown = ((System.Windows.Controls.Border)(target)); + return; + case 73: + this.SlashNavDownText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 74: + this.FolderMenuPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 75: + this.FolderMenuItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 76: + this.ToastBorder = ((System.Windows.Controls.Border)(target)); + return; + case 77: + this.ToastIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 78: + this.ToastText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 79: + this.InputGlowBorder = ((System.Windows.Controls.Border)(target)); + return; + case 80: + this.RainbowBrush = ((System.Windows.Media.LinearGradientBrush)(target)); + return; + case 81: + this.InputBorder = ((System.Windows.Controls.Border)(target)); + return; + case 82: + this.BtnModelSelector = ((System.Windows.Controls.Button)(target)); + + #line 752 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnModelSelector.Click += new System.Windows.RoutedEventHandler(this.BtnModelSelector_Click); + + #line default + #line hidden + return; + case 83: + this.ModelLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 84: + this.BtnTemplateSelector = ((System.Windows.Controls.Button)(target)); + + #line 771 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnTemplateSelector.Click += new System.Windows.RoutedEventHandler(this.BtnTemplateSelector_Click); + + #line default + #line hidden + return; + case 85: + this.AttachedFilesPanel = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 86: + this.InputBox = ((System.Windows.Controls.TextBox)(target)); + + #line 814 "..\..\..\..\..\Views\ChatWindow.xaml" + this.InputBox.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.InputBox_PreviewKeyDown); + + #line default + #line hidden + + #line 815 "..\..\..\..\..\Views\ChatWindow.xaml" + this.InputBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.InputBox_TextChanged); + + #line default + #line hidden + return; + case 87: + this.InputWatermark = ((System.Windows.Controls.TextBlock)(target)); + return; + case 88: + this.SlashCommandChip = ((System.Windows.Controls.Border)(target)); + return; + case 89: + this.SlashChipText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 90: + this.SlashChipClose = ((System.Windows.Controls.Border)(target)); + return; + case 91: + this.BtnAttach = ((System.Windows.Controls.Button)(target)); + + #line 854 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnAttach.Click += new System.Windows.RoutedEventHandler(this.BtnAttach_Click); + + #line default + #line hidden + return; + case 92: + + #line 864 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnExport_Click); + + #line default + #line hidden + return; + case 93: + this.BtnPause = ((System.Windows.Controls.Border)(target)); + + #line 876 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnPause.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnPause_Click); + + #line default + #line hidden + return; + case 94: + this.PauseIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 95: + this.BtnStop = ((System.Windows.Controls.Button)(target)); + + #line 887 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnStop.Click += new System.Windows.RoutedEventHandler(this.BtnStop_Click); + + #line default + #line hidden + return; + case 96: + this.BtnSend = ((System.Windows.Controls.Button)(target)); + + #line 902 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnSend.Click += new System.Windows.RoutedEventHandler(this.BtnSend_Click); + + #line default + #line hidden + return; + case 97: + this.FolderBar = ((System.Windows.Controls.Border)(target)); + return; + case 98: + this.FolderPathLabel = ((System.Windows.Controls.TextBlock)(target)); + + #line 954 "..\..\..\..\..\Views\ChatWindow.xaml" + this.FolderPathLabel.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.FolderPathLabel_Click); + + #line default + #line hidden + return; + case 99: + + #line 959 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnFolderClear_Click); + + #line default + #line hidden + return; + case 100: + this.MoodIconPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 101: + this.FormatMoodSeparator = ((System.Windows.Controls.Border)(target)); + return; + case 102: + this.BtnDataUsage = ((System.Windows.Controls.Border)(target)); + + #line 979 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnDataUsage.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnDataUsage_Click); + + #line default + #line hidden + return; + case 103: + this.DataUsageIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 104: + this.DataUsageLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 105: + this.BtnPermission = ((System.Windows.Controls.Button)(target)); + + #line 997 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnPermission.Click += new System.Windows.RoutedEventHandler(this.BtnPermission_Click); + + #line default + #line hidden + return; + case 106: + this.PermissionIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 107: + this.PermissionLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 108: + this.FormatMenuPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 109: + this.FormatMenuItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 110: + this.MoodMenuPopup = ((System.Windows.Controls.Primitives.Popup)(target)); + return; + case 111: + this.MoodMenuItems = ((System.Windows.Controls.StackPanel)(target)); + return; + case 112: + this.AutoPermissionWarning = ((System.Windows.Controls.Border)(target)); + return; + case 113: + this.BtnAutoWarningClose = ((System.Windows.Controls.Button)(target)); + + #line 1048 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnAutoWarningClose.Click += new System.Windows.RoutedEventHandler(this.BtnAutoWarningClose_Click); + + #line default + #line hidden + return; + case 114: + this.FileBrowserPanel = ((System.Windows.Controls.Border)(target)); + return; + case 115: + this.FileBrowserTitle = ((System.Windows.Controls.TextBlock)(target)); + return; + case 116: + + #line 1081 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnFileBrowserRefresh_Click); + + #line default + #line hidden + return; + case 117: + + #line 1086 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnFileBrowserOpenFolder_Click); + + #line default + #line hidden + return; + case 118: + + #line 1091 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnFileBrowserClose_Click); + + #line default + #line hidden + return; + case 119: + this.FileTreeView = ((System.Windows.Controls.TreeView)(target)); + return; + case 120: + this.StatusDiamond = ((System.Windows.Controls.TextBlock)(target)); + return; + case 121: + this.StatusDiamondRotate = ((System.Windows.Media.RotateTransform)(target)); + return; + case 122: + this.StatusLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 123: + this.BtnShowAnalyzer = ((System.Windows.Controls.Border)(target)); + + #line 1132 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnShowAnalyzer.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnShowAnalyzer_Click); + + #line default + #line hidden + return; + case 124: + this.StatusElapsed = ((System.Windows.Controls.TextBlock)(target)); + return; + case 125: + this.StatusTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 126: + this.PreviewSplitter = ((System.Windows.Controls.GridSplitter)(target)); + return; + case 127: + this.PreviewPanel = ((System.Windows.Controls.Border)(target)); + return; + case 128: + + #line 1173 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Border)(target)).PreviewMouseDown += new System.Windows.Input.MouseButtonEventHandler(this.PreviewTabBar_PreviewMouseDown); + + #line default + #line hidden + return; + case 129: + this.PreviewTabPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 130: + this.BtnOpenExternal = ((System.Windows.Controls.Button)(target)); + + #line 1185 "..\..\..\..\..\Views\ChatWindow.xaml" + this.BtnOpenExternal.Click += new System.Windows.RoutedEventHandler(this.BtnOpenExternal_Click); + + #line default + #line hidden + return; + case 131: + + #line 1190 "..\..\..\..\..\Views\ChatWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnClosePreview_Click); + + #line default + #line hidden + return; + case 132: + this.PreviewWebView = ((Microsoft.Web.WebView2.Wpf.WebView2)(target)); + return; + case 133: + this.PreviewTextScroll = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 134: + this.PreviewTextBlock = ((System.Windows.Controls.TextBlock)(target)); + return; + case 135: + this.PreviewDataGrid = ((System.Windows.Controls.DataGrid)(target)); + return; + case 136: + this.PreviewEmpty = ((System.Windows.Controls.TextBlock)(target)); + return; + case 137: + this.ResizeGrip = ((System.Windows.Controls.Primitives.Thumb)(target)); + + #line 1227 "..\..\..\..\..\Views\ChatWindow.xaml" + this.ResizeGrip.DragDelta += new System.Windows.Controls.Primitives.DragDeltaEventHandler(this.ResizeGrip_DragDelta); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ColorPickResultWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ColorPickResultWindow.baml new file mode 100644 index 0000000..5a5fcc0 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ColorPickResultWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ColorPickResultWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ColorPickResultWindow.g.cs new file mode 100644 index 0000000..f146cd9 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ColorPickResultWindow.g.cs @@ -0,0 +1,111 @@ +#pragma checksum "..\..\..\..\..\Views\ColorPickResultWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "3F33817147873F931CD71729FAB24371726BC8E5" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ColorPickResultWindow + /// + public partial class ColorPickResultWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 27 "..\..\..\..\..\Views\ColorPickResultWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Ellipse ColorPreview; + + #line default + #line hidden + + + #line 33 "..\..\..\..\..\Views\ColorPickResultWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock HexText; + + #line default + #line hidden + + + #line 41 "..\..\..\..\..\Views\ColorPickResultWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock RgbText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/colorpickresultwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ColorPickResultWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + this.ColorPreview = ((System.Windows.Shapes.Ellipse)(target)); + return; + case 2: + this.HexText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + this.RgbText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/CommandPaletteWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/CommandPaletteWindow.baml new file mode 100644 index 0000000..db113e8 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/CommandPaletteWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/CommandPaletteWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/CommandPaletteWindow.g.cs new file mode 100644 index 0000000..f09a8a4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/CommandPaletteWindow.g.cs @@ -0,0 +1,120 @@ +#pragma checksum "..\..\..\..\..\Views\CommandPaletteWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "778D99FD34A10FE1F82C6C7B6937EB35B30FE93E" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// CommandPaletteWindow + /// + public partial class CommandPaletteWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 34 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox SearchBox; + + #line default + #line hidden + + + #line 44 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ResultPanel; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/commandpalettewindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 12 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + ((AxCopilot.Views.CommandPaletteWindow)(target)).PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.Window_PreviewKeyDown); + + #line default + #line hidden + + #line 13 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + ((AxCopilot.Views.CommandPaletteWindow)(target)).Deactivated += new System.EventHandler(this.Window_Deactivated); + + #line default + #line hidden + return; + case 2: + this.SearchBox = ((System.Windows.Controls.TextBox)(target)); + + #line 38 "..\..\..\..\..\Views\CommandPaletteWindow.xaml" + this.SearchBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.SearchBox_TextChanged); + + #line default + #line hidden + return; + case 3: + this.ResultPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/DockBarWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/DockBarWindow.baml new file mode 100644 index 0000000..320f173 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/DockBarWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/DockBarWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/DockBarWindow.g.cs new file mode 100644 index 0000000..7a12466 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/DockBarWindow.g.cs @@ -0,0 +1,130 @@ +#pragma checksum "..\..\..\..\..\Views\DockBarWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "7CB362752B6906283C7B5A7001786A4921E47B73" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// DockBarWindow + /// + public partial class DockBarWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 16 "..\..\..\..\..\Views\DockBarWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border RainbowGlowBorder; + + #line default + #line hidden + + + #line 19 "..\..\..\..\..\Views\DockBarWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.LinearGradientBrush RainbowBrush; + + #line default + #line hidden + + + #line 35 "..\..\..\..\..\Views\DockBarWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border DockBorder; + + #line default + #line hidden + + + #line 40 "..\..\..\..\..\Views\DockBarWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel DockContent; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/dockbarwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\DockBarWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 12 "..\..\..\..\..\Views\DockBarWindow.xaml" + ((AxCopilot.Views.DockBarWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RainbowGlowBorder = ((System.Windows.Controls.Border)(target)); + return; + case 3: + this.RainbowBrush = ((System.Windows.Media.LinearGradientBrush)(target)); + return; + case 4: + this.DockBorder = ((System.Windows.Controls.Border)(target)); + return; + case 5: + this.DockContent = ((System.Windows.Controls.StackPanel)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/EyeDropperWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/EyeDropperWindow.baml new file mode 100644 index 0000000..f53d5a2 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/EyeDropperWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/EyeDropperWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/EyeDropperWindow.g.cs new file mode 100644 index 0000000..d37abba --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/EyeDropperWindow.g.cs @@ -0,0 +1,153 @@ +#pragma checksum "..\..\..\..\..\Views\EyeDropperWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "163E2B8FABE11D0EE242F297C7ADAF9251951717" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// EyeDropperWindow + /// + public partial class EyeDropperWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 19 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas RootCanvas; + + #line default + #line hidden + + + #line 21 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border Magnifier; + + #line default + #line hidden + + + #line 31 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Ellipse MagPreview; + + #line default + #line hidden + + + #line 39 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border HexLabel; + + #line default + #line hidden + + + #line 45 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock HexLabelText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/eyedropperwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 14 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + ((AxCopilot.Views.EyeDropperWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 15 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + ((AxCopilot.Views.EyeDropperWindow)(target)).MouseMove += new System.Windows.Input.MouseEventHandler(this.Window_MouseMove); + + #line default + #line hidden + + #line 16 "..\..\..\..\..\Views\EyeDropperWindow.xaml" + ((AxCopilot.Views.EyeDropperWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RootCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 3: + this.Magnifier = ((System.Windows.Controls.Border)(target)); + return; + case 4: + this.MagPreview = ((System.Windows.Shapes.Ellipse)(target)); + return; + case 5: + this.HexLabel = ((System.Windows.Controls.Border)(target)); + return; + case 6: + this.HexLabelText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/GuideViewerWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/GuideViewerWindow.baml new file mode 100644 index 0000000..0f6a2da Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/GuideViewerWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/GuideViewerWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/GuideViewerWindow.g.cs new file mode 100644 index 0000000..622c5ae --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/GuideViewerWindow.g.cs @@ -0,0 +1,180 @@ +#pragma checksum "..\..\..\..\..\Views\GuideViewerWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "3A7A43FB211B4C35DC5BC90F0D5F6727B92D34A3" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using Microsoft.Web.WebView2.Wpf; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// GuideViewerWindow + /// + public partial class GuideViewerWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 38 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TitleText; + + #line default + #line hidden + + + #line 58 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock MaxBtnIcon; + + #line default + #line hidden + + + #line 75 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal Microsoft.Web.WebView2.Wpf.WebView2 GuideBrowser; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/guideviewerwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 26 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.TitleText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 48 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.MinBtn_Click); + + #line default + #line hidden + + #line 49 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 49 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 4: + + #line 56 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.MaxBtn_Click); + + #line default + #line hidden + + #line 57 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 57 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 5: + this.MaxBtnIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + + #line 64 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.CloseBtn_Click); + + #line default + #line hidden + + #line 65 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.CloseBtnEnter); + + #line default + #line hidden + + #line 65 "..\..\..\..\..\Views\GuideViewerWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 7: + this.GuideBrowser = ((Microsoft.Web.WebView2.Wpf.WebView2)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/HelpDetailWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/HelpDetailWindow.baml new file mode 100644 index 0000000..2d0cfd8 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/HelpDetailWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/HelpDetailWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/HelpDetailWindow.g.cs new file mode 100644 index 0000000..410b631 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/HelpDetailWindow.g.cs @@ -0,0 +1,206 @@ +#pragma checksum "..\..\..\..\..\Views\HelpDetailWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "FF175B09974367331C1FB87B3330BA9C7809D841" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// HelpDetailWindow + /// + public partial class HelpDetailWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 59 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SubtitleText; + + #line default + #line hidden + + + #line 79 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TopMenuBar; + + #line default + #line hidden + + + #line 90 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox SearchBox; + + #line default + #line hidden + + + #line 105 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.WrapPanel CategoryBar; + + #line default + #line hidden + + + #line 115 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl ItemsHost; + + #line default + #line hidden + + + #line 189 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button PrevBtn; + + #line default + #line hidden + + + #line 194 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PageIndicator; + + #line default + #line hidden + + + #line 197 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button NextBtn; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/helpdetailwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 13 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + ((AxCopilot.Views.HelpDetailWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 14 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + ((AxCopilot.Views.HelpDetailWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.SubtitleText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 67 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 4: + this.TopMenuBar = ((System.Windows.Controls.StackPanel)(target)); + return; + case 5: + this.SearchBox = ((System.Windows.Controls.TextBox)(target)); + + #line 97 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + this.SearchBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.SearchBox_TextChanged); + + #line default + #line hidden + return; + case 6: + this.CategoryBar = ((System.Windows.Controls.WrapPanel)(target)); + return; + case 7: + this.ItemsHost = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 8: + this.PrevBtn = ((System.Windows.Controls.Button)(target)); + + #line 190 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + this.PrevBtn.Click += new System.Windows.RoutedEventHandler(this.Prev_Click); + + #line default + #line hidden + return; + case 9: + this.PageIndicator = ((System.Windows.Controls.TextBlock)(target)); + return; + case 10: + this.NextBtn = ((System.Windows.Controls.Button)(target)); + + #line 198 "..\..\..\..\..\Views\HelpDetailWindow.xaml" + this.NextBtn.Click += new System.Windows.RoutedEventHandler(this.Next_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LargeTypeWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LargeTypeWindow.baml new file mode 100644 index 0000000..4221a7b Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LargeTypeWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LargeTypeWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LargeTypeWindow.g.cs new file mode 100644 index 0000000..271e9e9 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LargeTypeWindow.g.cs @@ -0,0 +1,128 @@ +#pragma checksum "..\..\..\..\..\Views\LargeTypeWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "BBE8D57BB2FE77EFADA45AB45137687AE6EC7D2B" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// LargeTypeWindow + /// + public partial class LargeTypeWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 18 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border Overlay; + + #line default + #line hidden + + + #line 62 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock LargeText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/largetypewindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 13 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + ((AxCopilot.Views.LargeTypeWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + + #line 14 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + ((AxCopilot.Views.LargeTypeWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 15 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + ((AxCopilot.Views.LargeTypeWindow)(target)).Loaded += new System.Windows.RoutedEventHandler(this.Window_Loaded); + + #line default + #line hidden + return; + case 2: + this.Overlay = ((System.Windows.Controls.Border)(target)); + return; + case 3: + + #line 37 "..\..\..\..\..\Views\LargeTypeWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 4: + this.LargeText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LauncherWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LauncherWindow.baml new file mode 100644 index 0000000..22a86a8 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LauncherWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LauncherWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LauncherWindow.g.cs new file mode 100644 index 0000000..46ef40f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/LauncherWindow.g.cs @@ -0,0 +1,348 @@ +#pragma checksum "..\..\..\..\..\Views\LauncherWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "AB0A66F008BC0EDBB8D9AB3181073972F28C2B41" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// LauncherWindow + /// + public partial class LauncherWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 166 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border RainbowGlowBorder; + + #line default + #line hidden + + + #line 171 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.LinearGradientBrush LauncherRainbowBrush; + + #line default + #line hidden + + + #line 190 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border MainBorder; + + #line default + #line hidden + + + #line 218 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas DiamondIcon; + + #line default + #line hidden + + + #line 226 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.RotateTransform IconRotate; + + #line default + #line hidden + + + #line 227 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Media.ScaleTransform IconScale; + + #line default + #line hidden + + + #line 231 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle GlowBlue; + + #line default + #line hidden + + + #line 238 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle GlowGreen1; + + #line default + #line hidden + + + #line 245 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle GlowGreen2; + + #line default + #line hidden + + + #line 252 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle GlowRed; + + #line default + #line hidden + + + #line 261 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle PixelBlue; + + #line default + #line hidden + + + #line 267 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle PixelGreen1; + + #line default + #line hidden + + + #line 273 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle PixelGreen2; + + #line default + #line hidden + + + #line 279 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle PixelRed; + + #line default + #line hidden + + + #line 349 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox InputBox; + + #line default + #line hidden + + + #line 488 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ListView ResultList; + + #line default + #line hidden + + + #line 695 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock IndexStatusText; + + #line default + #line hidden + + + #line 705 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border ToastOverlay; + + #line default + #line hidden + + + #line 724 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToastIcon; + + #line default + #line hidden + + + #line 730 "..\..\..\..\..\Views\LauncherWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock ToastText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/launcherwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\LauncherWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 19 "..\..\..\..\..\Views\LauncherWindow.xaml" + ((AxCopilot.Views.LauncherWindow)(target)).Loaded += new System.Windows.RoutedEventHandler(this.Window_Loaded); + + #line default + #line hidden + + #line 20 "..\..\..\..\..\Views\LauncherWindow.xaml" + ((AxCopilot.Views.LauncherWindow)(target)).Deactivated += new System.EventHandler(this.Window_Deactivated); + + #line default + #line hidden + + #line 21 "..\..\..\..\..\Views\LauncherWindow.xaml" + ((AxCopilot.Views.LauncherWindow)(target)).PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.Window_PreviewKeyDown); + + #line default + #line hidden + + #line 22 "..\..\..\..\..\Views\LauncherWindow.xaml" + ((AxCopilot.Views.LauncherWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RainbowGlowBorder = ((System.Windows.Controls.Border)(target)); + return; + case 3: + this.LauncherRainbowBrush = ((System.Windows.Media.LinearGradientBrush)(target)); + return; + case 4: + this.MainBorder = ((System.Windows.Controls.Border)(target)); + return; + case 5: + this.DiamondIcon = ((System.Windows.Controls.Canvas)(target)); + + #line 221 "..\..\..\..\..\Views\LauncherWindow.xaml" + this.DiamondIcon.MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.DiamondIcon_Click); + + #line default + #line hidden + return; + case 6: + this.IconRotate = ((System.Windows.Media.RotateTransform)(target)); + return; + case 7: + this.IconScale = ((System.Windows.Media.ScaleTransform)(target)); + return; + case 8: + this.GlowBlue = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 9: + this.GlowGreen1 = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 10: + this.GlowGreen2 = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 11: + this.GlowRed = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 12: + this.PixelBlue = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 13: + this.PixelGreen1 = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 14: + this.PixelGreen2 = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 15: + this.PixelRed = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 16: + this.InputBox = ((System.Windows.Controls.TextBox)(target)); + + #line 359 "..\..\..\..\..\Views\LauncherWindow.xaml" + this.InputBox.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.InputBox_TextChanged); + + #line default + #line hidden + return; + case 17: + this.ResultList = ((System.Windows.Controls.ListView)(target)); + + #line 501 "..\..\..\..\..\Views\LauncherWindow.xaml" + this.ResultList.PreviewMouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.ResultList_PreviewMouseLeftButtonUp); + + #line default + #line hidden + + #line 502 "..\..\..\..\..\Views\LauncherWindow.xaml" + this.ResultList.MouseDoubleClick += new System.Windows.Input.MouseButtonEventHandler(this.ResultList_MouseDoubleClick); + + #line default + #line hidden + return; + case 18: + this.IndexStatusText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 19: + this.ToastOverlay = ((System.Windows.Controls.Border)(target)); + return; + case 20: + this.ToastIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 21: + this.ToastText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/PreviewWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/PreviewWindow.baml new file mode 100644 index 0000000..de7cc3d Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/PreviewWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/PreviewWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/PreviewWindow.g.cs new file mode 100644 index 0000000..0a45de0 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/PreviewWindow.g.cs @@ -0,0 +1,255 @@ +#pragma checksum "..\..\..\..\..\Views\PreviewWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "1FF13D4AAF15CB1FB4F079DA7FCA2453E3A0E61A" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using Microsoft.Web.WebView2.Wpf; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// PreviewWindow + /// + public partial class PreviewWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 40 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TitleText; + + #line default + #line hidden + + + #line 69 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock MaxBtnIcon; + + #line default + #line hidden + + + #line 91 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TabPanel; + + #line default + #line hidden + + + #line 97 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal Microsoft.Web.WebView2.Wpf.WebView2 PreviewBrowser; + + #line default + #line hidden + + + #line 98 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer TextScroll; + + #line default + #line hidden + + + #line 100 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TextContent; + + #line default + #line hidden + + + #line 104 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.DataGrid DataGridContent; + + #line default + #line hidden + + + #line 112 "..\..\..\..\..\Views\PreviewWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock EmptyMessage; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/previewwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\PreviewWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 28 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.TitleText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 51 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.OpenExternalBtn_Click); + + #line default + #line hidden + + #line 52 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 52 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 4: + + #line 59 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.MinBtn_Click); + + #line default + #line hidden + + #line 60 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 60 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 5: + + #line 67 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.MaxBtn_Click); + + #line default + #line hidden + + #line 68 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Enter); + + #line default + #line hidden + + #line 68 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 6: + this.MaxBtnIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 7: + + #line 75 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.CloseBtn_Click); + + #line default + #line hidden + + #line 76 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseEnter += new System.Windows.Input.MouseEventHandler(this.CloseBtnEnter); + + #line default + #line hidden + + #line 76 "..\..\..\..\..\Views\PreviewWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_Leave); + + #line default + #line hidden + return; + case 8: + this.TabPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 9: + this.PreviewBrowser = ((Microsoft.Web.WebView2.Wpf.WebView2)(target)); + return; + case 10: + this.TextScroll = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 11: + this.TextContent = ((System.Windows.Controls.TextBlock)(target)); + return; + case 12: + this.DataGridContent = ((System.Windows.Controls.DataGrid)(target)); + return; + case 13: + this.EmptyMessage = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/RegionSelectWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/RegionSelectWindow.baml new file mode 100644 index 0000000..61819f4 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/RegionSelectWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/RegionSelectWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/RegionSelectWindow.g.cs new file mode 100644 index 0000000..ab15353 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/RegionSelectWindow.g.cs @@ -0,0 +1,203 @@ +#pragma checksum "..\..\..\..\..\Views\RegionSelectWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "0A02F0226116B955A7CB62EC9AAF934093D25A01" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// RegionSelectWindow + /// + public partial class RegionSelectWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 17 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas RootCanvas; + + #line default + #line hidden + + + #line 20 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle OverlayTop; + + #line default + #line hidden + + + #line 21 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle OverlayBottom; + + #line default + #line hidden + + + #line 22 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle OverlayLeft; + + #line default + #line hidden + + + #line 23 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle OverlayRight; + + #line default + #line hidden + + + #line 26 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Shapes.Rectangle SelectionBorder; + + #line default + #line hidden + + + #line 33 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border GuideText; + + #line default + #line hidden + + + #line 51 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border SizeLabel; + + #line default + #line hidden + + + #line 56 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock SizeLabelText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/regionselectwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 12 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + ((AxCopilot.Views.RegionSelectWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 13 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + ((AxCopilot.Views.RegionSelectWindow)(target)).MouseMove += new System.Windows.Input.MouseEventHandler(this.Window_MouseMove); + + #line default + #line hidden + + #line 14 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + ((AxCopilot.Views.RegionSelectWindow)(target)).MouseUp += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseUp); + + #line default + #line hidden + + #line 15 "..\..\..\..\..\Views\RegionSelectWindow.xaml" + ((AxCopilot.Views.RegionSelectWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RootCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 3: + this.OverlayTop = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 4: + this.OverlayBottom = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 5: + this.OverlayLeft = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 6: + this.OverlayRight = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 7: + this.SelectionBorder = ((System.Windows.Shapes.Rectangle)(target)); + return; + case 8: + this.GuideText = ((System.Windows.Controls.Border)(target)); + return; + case 9: + this.SizeLabel = ((System.Windows.Controls.Border)(target)); + return; + case 10: + this.SizeLabelText = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ReminderPopupWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ReminderPopupWindow.baml new file mode 100644 index 0000000..c8b037f Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ReminderPopupWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ReminderPopupWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ReminderPopupWindow.g.cs new file mode 100644 index 0000000..e7e267f --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ReminderPopupWindow.g.cs @@ -0,0 +1,150 @@ +#pragma checksum "..\..\..\..\..\Views\ReminderPopupWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "05C334D340086FB76EB59EDA0728DD8FAF0C79F8" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ReminderPopupWindow + /// + public partial class ReminderPopupWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 17 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border PopupBorder; + + #line default + #line hidden + + + #line 40 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UsageText; + + #line default + #line hidden + + + #line 46 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button CloseBtn; + + #line default + #line hidden + + + #line 77 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock QuoteText; + + #line default + #line hidden + + + #line 86 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock AuthorText; + + #line default + #line hidden + + + #line 94 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ProgressBar CountdownBar; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/reminderpopupwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + this.PopupBorder = ((System.Windows.Controls.Border)(target)); + return; + case 2: + this.UsageText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + this.CloseBtn = ((System.Windows.Controls.Button)(target)); + + #line 51 "..\..\..\..\..\Views\ReminderPopupWindow.xaml" + this.CloseBtn.Click += new System.Windows.RoutedEventHandler(this.CloseBtn_Click); + + #line default + #line hidden + return; + case 4: + this.QuoteText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 5: + this.AuthorText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + this.CountdownBar = ((System.Windows.Controls.ProgressBar)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ResourceMonitorWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ResourceMonitorWindow.baml new file mode 100644 index 0000000..b63f3db Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ResourceMonitorWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ResourceMonitorWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ResourceMonitorWindow.g.cs new file mode 100644 index 0000000..3592cf4 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ResourceMonitorWindow.g.cs @@ -0,0 +1,226 @@ +#pragma checksum "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "6D5354408893A419BC0C8B94407E656D8BABD4E6" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ResourceMonitorWindow + /// + public partial class ResourceMonitorWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 52 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock RefreshLabel; + + #line default + #line hidden + + + #line 98 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CpuValueText; + + #line default + #line hidden + + + #line 106 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border CpuBar; + + #line default + #line hidden + + + #line 110 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CpuNameText; + + #line default + #line hidden + + + #line 130 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock RamValueText; + + #line default + #line hidden + + + #line 138 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border RamBar; + + #line default + #line hidden + + + #line 142 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock RamDetailText; + + #line default + #line hidden + + + #line 153 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl DriveList; + + #line default + #line hidden + + + #line 202 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl ProcessList; + + #line default + #line hidden + + + #line 263 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock UptimeText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/resourcemonitorwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 17 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((AxCopilot.Views.ResourceMonitorWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + + #line 18 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((AxCopilot.Views.ResourceMonitorWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.RefreshLabel = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 60 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 4: + this.CpuValueText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 5: + this.CpuBar = ((System.Windows.Controls.Border)(target)); + return; + case 6: + this.CpuNameText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 7: + this.RamValueText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: + this.RamBar = ((System.Windows.Controls.Border)(target)); + return; + case 9: + this.RamDetailText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 10: + this.DriveList = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 11: + this.ProcessList = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 12: + + #line 246 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.ResizeGrip_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 13: + this.UptimeText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 14: + + #line 268 "..\..\..\..\..\Views\ResourceMonitorWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SettingsWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SettingsWindow.baml new file mode 100644 index 0000000..f76c93d Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SettingsWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SettingsWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SettingsWindow.g.cs new file mode 100644 index 0000000..e0572fd --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SettingsWindow.g.cs @@ -0,0 +1,1597 @@ +#pragma checksum "..\..\..\..\..\Views\SettingsWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "54ADBAA498458DE42EB02A97EEDA82B2A05FFC1E" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using AxCopilot.Themes; +using AxCopilot.ViewModels; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// SettingsWindow + /// + public partial class SettingsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector, System.Windows.Markup.IStyleConnector { + + + #line 608 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton GeneralSubTabMain; + + #line default + #line hidden + + + #line 611 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton GeneralSubTabNotify; + + #line default + #line hidden + + + #line 614 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton GeneralSubTabStorage; + + #line default + #line hidden + + + #line 619 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer GeneralMainPanel; + + #line default + #line hidden + + + #line 640 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox AiEnabledToggle; + + #line default + #line hidden + + + #line 665 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox InternalModeToggle; + + #line default + #line hidden + + + #line 692 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ComboBox HotkeyCombo; + + #line default + #line hidden + + + #line 958 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox NewIndexPathBox; + + #line default + #line hidden + + + #line 1025 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox NewExtensionBox; + + #line default + #line hidden + + + #line 1071 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer GeneralNotifyPanel; + + #line default + #line hidden + + + #line 1073 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel NotifyContent; + + #line default + #line hidden + + + #line 1078 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer GeneralStoragePanel; + + #line default + #line hidden + + + #line 1090 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StorageSummaryText2; + + #line default + #line hidden + + + #line 1091 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StorageDriveText2; + + #line default + #line hidden + + + #line 1111 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel StorageDetailPanel2; + + #line default + #line hidden + + + #line 1132 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton ThemeSubTabSelect; + + #line default + #line hidden + + + #line 1135 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton ThemeSubTabColors; + + #line default + #line hidden + + + #line 1141 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer ThemeSelectPanel; + + #line default + #line hidden + + + #line 1199 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl ThemeCardsPanel; + + #line default + #line hidden + + + #line 1292 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Grid ThemeColorsPanel; + + #line default + #line hidden + + + #line 1434 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkDockAutoShow; + + #line default + #line hidden + + + #line 1451 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkDockRainbowGlow; + + #line default + #line hidden + + + #line 1468 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Slider SliderDockOpacity; + + #line default + #line hidden + + + #line 1507 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel DockItemsPanel; + + #line default + #line hidden + + + #line 2101 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel QuoteCategoryPanel; + + #line default + #line hidden + + + #line 2811 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel FunctionSubTabBar; + + #line default + #line hidden + + + #line 2812 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton FuncSubTab_AI; + + #line default + #line hidden + + + #line 2815 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton FuncSubTab_Launcher; + + #line default + #line hidden + + + #line 2818 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton FuncSubTab_Design; + + #line default + #line hidden + + + #line 2825 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer FuncPanel_AI; + + #line default + #line hidden + + + #line 2856 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkEnableTextAction; + + #line default + #line hidden + + + #line 2867 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TextActionCommandsPanel; + + #line default + #line hidden + + + #line 2897 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkEnableFileDialog; + + #line default + #line hidden + + + #line 2932 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer FuncPanel_Launcher; + + #line default + #line hidden + + + #line 3033 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer FuncPanel_Design; + + #line default + #line hidden + + + #line 3067 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ChkEnableAutoCategory; + + #line default + #line hidden + + + #line 3258 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TabItem AgentTabItem; + + #line default + #line hidden + + + #line 3272 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel AgentSubTabs; + + #line default + #line hidden + + + #line 3273 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabCommon; + + #line default + #line hidden + + + #line 3276 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabChat; + + #line default + #line hidden + + + #line 3279 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabCoworkCode; + + #line default + #line hidden + + + #line 3282 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabCowork; + + #line default + #line hidden + + + #line 3285 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabCode; + + #line default + #line hidden + + + #line 3288 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabDev; + + #line default + #line hidden + + + #line 3291 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabTools; + + #line default + #line hidden + + + #line 3294 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton AgentTabEtc; + + #line default + #line hidden + + + #line 3303 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelCommon; + + #line default + #line hidden + + + #line 3330 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ServiceSubTabs; + + #line default + #line hidden + + + #line 3331 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton SvcTabOllama; + + #line default + #line hidden + + + #line 3334 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton SvcTabVllm; + + #line default + #line hidden + + + #line 3337 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton SvcTabGemini; + + #line default + #line hidden + + + #line 3340 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton SvcTabClaude; + + #line default + #line hidden + + + #line 3347 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SvcPanelOllama; + + #line default + #line hidden + + + #line 3365 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAddModel; + + #line default + #line hidden + + + #line 3424 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ComboBox CboActiveModel; + + #line default + #line hidden + + + #line 3445 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SvcPanelVllm; + + #line default + #line hidden + + + #line 3463 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAddVllmModel; + + #line default + #line hidden + + + #line 3522 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ComboBox CboActiveVllmModel; + + #line default + #line hidden + + + #line 3543 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SvcPanelGemini; + + #line default + #line hidden + + + #line 3574 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SvcPanelClaude; + + #line default + #line hidden + + + #line 3611 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnTestConnection; + + #line default + #line hidden + + + #line 3727 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StorageSummaryText; + + #line default + #line hidden + + + #line 3728 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StorageDriveText; + + #line default + #line hidden + + + #line 3748 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel StorageDetailPanel; + + #line default + #line hidden + + + #line 3752 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel AgentBlockSection; + + #line default + #line hidden + + + #line 3925 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel HookListPanel; + + #line default + #line hidden + + + #line 3981 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnBrowseSkillFolder; + + #line default + #line hidden + + + #line 3985 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnOpenSkillFolder; + + #line default + #line hidden + + + #line 4247 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelChat; + + #line default + #line hidden + + + #line 4258 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Button BtnAddTemplate; + + #line default + #line hidden + + + #line 4308 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelCoworkCode; + + #line default + #line hidden + + + #line 4540 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelCowork; + + #line default + #line hidden + + + #line 4687 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelCode; + + #line default + #line hidden + + + #line 4911 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelDev; + + #line default + #line hidden + + + #line 4923 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox DevModeCheckBox; + + #line default + #line hidden + + + #line 4931 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel DevModeContent; + + #line default + #line hidden + + + #line 4941 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox StepApprovalCheckBox; + + #line default + #line hidden + + + #line 5104 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel FallbackModelsPanel; + + #line default + #line hidden + + + #line 5105 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox FallbackModelsBox; + + #line default + #line hidden + + + #line 5135 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel McpServerListPanel; + + #line default + #line hidden + + + #line 5139 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox McpServersBox; + + #line default + #line hidden + + + #line 5155 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelEtc; + + #line default + #line hidden + + + #line 5158 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel AgentEtcContent; + + #line default + #line hidden + + + #line 5162 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer AgentPanelTools; + + #line default + #line hidden + + + #line 5170 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ToolCardsPanel; + + #line default + #line hidden + + + #line 5175 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel McpStatusPanel; + + #line default + #line hidden + + + #line 5198 "..\..\..\..\..\Views\SettingsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock VersionInfoText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/settingswindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\SettingsWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 16 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((AxCopilot.Views.SettingsWindow)(target)).PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.Window_PreviewKeyDown); + + #line default + #line hidden + return; + case 2: + this.GeneralSubTabMain = ((System.Windows.Controls.RadioButton)(target)); + + #line 610 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.GeneralSubTabMain.Checked += new System.Windows.RoutedEventHandler(this.GeneralSubTab_Checked); + + #line default + #line hidden + return; + case 3: + this.GeneralSubTabNotify = ((System.Windows.Controls.RadioButton)(target)); + + #line 613 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.GeneralSubTabNotify.Checked += new System.Windows.RoutedEventHandler(this.GeneralSubTab_Checked); + + #line default + #line hidden + return; + case 4: + this.GeneralSubTabStorage = ((System.Windows.Controls.RadioButton)(target)); + + #line 616 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.GeneralSubTabStorage.Checked += new System.Windows.RoutedEventHandler(this.GeneralSubTab_Checked); + + #line default + #line hidden + return; + case 5: + this.GeneralMainPanel = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 6: + this.AiEnabledToggle = ((System.Windows.Controls.CheckBox)(target)); + + #line 643 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AiEnabledToggle.Checked += new System.Windows.RoutedEventHandler(this.AiEnabled_Changed); + + #line default + #line hidden + + #line 643 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AiEnabledToggle.Unchecked += new System.Windows.RoutedEventHandler(this.AiEnabled_Changed); + + #line default + #line hidden + return; + case 7: + this.InternalModeToggle = ((System.Windows.Controls.CheckBox)(target)); + + #line 668 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.InternalModeToggle.Checked += new System.Windows.RoutedEventHandler(this.NetworkMode_Changed); + + #line default + #line hidden + + #line 668 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.InternalModeToggle.Unchecked += new System.Windows.RoutedEventHandler(this.NetworkMode_Changed); + + #line default + #line hidden + return; + case 8: + this.HotkeyCombo = ((System.Windows.Controls.ComboBox)(target)); + + #line 695 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.HotkeyCombo.SelectionChanged += new System.Windows.Controls.SelectionChangedEventHandler(this.HotkeyCombo_SelectionChanged); + + #line default + #line hidden + return; + case 10: + this.NewIndexPathBox = ((System.Windows.Controls.TextBox)(target)); + return; + case 11: + + #line 967 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BrowseIndexPath_Click); + + #line default + #line hidden + return; + case 12: + + #line 971 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddIndexPath_Click); + + #line default + #line hidden + return; + case 14: + this.NewExtensionBox = ((System.Windows.Controls.TextBox)(target)); + return; + case 15: + + #line 1033 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddExtension_Click); + + #line default + #line hidden + return; + case 16: + this.GeneralNotifyPanel = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 17: + this.NotifyContent = ((System.Windows.Controls.StackPanel)(target)); + return; + case 18: + this.GeneralStoragePanel = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 19: + this.StorageSummaryText2 = ((System.Windows.Controls.TextBlock)(target)); + return; + case 20: + this.StorageDriveText2 = ((System.Windows.Controls.TextBlock)(target)); + return; + case 21: + + #line 1094 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnStorageRefresh2_Click); + + #line default + #line hidden + return; + case 22: + + #line 1097 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnStorageCleanup_Click); + + #line default + #line hidden + return; + case 23: + this.StorageDetailPanel2 = ((System.Windows.Controls.StackPanel)(target)); + return; + case 24: + this.ThemeSubTabSelect = ((System.Windows.Controls.RadioButton)(target)); + + #line 1134 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.ThemeSubTabSelect.Checked += new System.Windows.RoutedEventHandler(this.ThemeSubTab_Checked); + + #line default + #line hidden + return; + case 25: + this.ThemeSubTabColors = ((System.Windows.Controls.RadioButton)(target)); + + #line 1137 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.ThemeSubTabColors.Checked += new System.Windows.RoutedEventHandler(this.ThemeSubTab_Checked); + + #line default + #line hidden + return; + case 26: + this.ThemeSelectPanel = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 27: + this.ThemeCardsPanel = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 29: + this.ThemeColorsPanel = ((System.Windows.Controls.Grid)(target)); + return; + case 31: + this.ChkDockAutoShow = ((System.Windows.Controls.CheckBox)(target)); + return; + case 32: + this.ChkDockRainbowGlow = ((System.Windows.Controls.CheckBox)(target)); + return; + case 33: + this.SliderDockOpacity = ((System.Windows.Controls.Slider)(target)); + return; + case 34: + + #line 1487 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnDockResetPosition_Click); + + #line default + #line hidden + return; + case 35: + this.DockItemsPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 36: + + #line 1620 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddSnippet_Click); + + #line default + #line hidden + return; + case 38: + + #line 1879 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ResetCapPrefix_Click); + + #line default + #line hidden + return; + case 39: + + #line 1946 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.TextBox)(target)).PreviewKeyDown += new System.Windows.Input.KeyEventHandler(this.CapHotkeyRecorder_PreviewKeyDown); + + #line default + #line hidden + return; + case 40: + + #line 1950 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ResetCapGlobalHotkey_Click); + + #line default + #line hidden + return; + case 41: + + #line 2081 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.RadioButton)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderCorner_Click); + + #line default + #line hidden + return; + case 42: + + #line 2084 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.RadioButton)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderCorner_Click); + + #line default + #line hidden + return; + case 43: + + #line 2087 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.RadioButton)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderCorner_Click); + + #line default + #line hidden + return; + case 44: + + #line 2090 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.RadioButton)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderCorner_Click); + + #line default + #line hidden + return; + case 45: + this.QuoteCategoryPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 46: + + #line 2192 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ReminderPreview_Click); + + #line default + #line hidden + return; + case 47: + + #line 2425 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ResetCommandAliases_Click); + + #line default + #line hidden + return; + case 48: + + #line 2513 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Browse_Click); + + #line default + #line hidden + return; + case 49: + + #line 2544 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddShortcut_Click); + + #line default + #line hidden + return; + case 51: + + #line 2700 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.AddBatchCommand_Click); + + #line default + #line hidden + return; + case 53: + this.FunctionSubTabBar = ((System.Windows.Controls.StackPanel)(target)); + return; + case 54: + this.FuncSubTab_AI = ((System.Windows.Controls.RadioButton)(target)); + + #line 2814 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.FuncSubTab_AI.Checked += new System.Windows.RoutedEventHandler(this.FuncSubTab_Checked); + + #line default + #line hidden + return; + case 55: + this.FuncSubTab_Launcher = ((System.Windows.Controls.RadioButton)(target)); + + #line 2817 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.FuncSubTab_Launcher.Checked += new System.Windows.RoutedEventHandler(this.FuncSubTab_Checked); + + #line default + #line hidden + return; + case 56: + this.FuncSubTab_Design = ((System.Windows.Controls.RadioButton)(target)); + + #line 2820 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.FuncSubTab_Design.Checked += new System.Windows.RoutedEventHandler(this.FuncSubTab_Checked); + + #line default + #line hidden + return; + case 57: + this.FuncPanel_AI = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 58: + this.ChkEnableTextAction = ((System.Windows.Controls.CheckBox)(target)); + return; + case 59: + this.TextActionCommandsPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 60: + this.ChkEnableFileDialog = ((System.Windows.Controls.CheckBox)(target)); + return; + case 61: + this.FuncPanel_Launcher = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 62: + this.FuncPanel_Design = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 63: + this.ChkEnableAutoCategory = ((System.Windows.Controls.CheckBox)(target)); + return; + case 64: + this.AgentTabItem = ((System.Windows.Controls.TabItem)(target)); + return; + case 65: + this.AgentSubTabs = ((System.Windows.Controls.StackPanel)(target)); + return; + case 66: + this.AgentTabCommon = ((System.Windows.Controls.RadioButton)(target)); + + #line 3275 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabCommon.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 67: + this.AgentTabChat = ((System.Windows.Controls.RadioButton)(target)); + + #line 3278 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabChat.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 68: + this.AgentTabCoworkCode = ((System.Windows.Controls.RadioButton)(target)); + + #line 3281 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabCoworkCode.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 69: + this.AgentTabCowork = ((System.Windows.Controls.RadioButton)(target)); + + #line 3284 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabCowork.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 70: + this.AgentTabCode = ((System.Windows.Controls.RadioButton)(target)); + + #line 3287 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabCode.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 71: + this.AgentTabDev = ((System.Windows.Controls.RadioButton)(target)); + + #line 3290 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabDev.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 72: + this.AgentTabTools = ((System.Windows.Controls.RadioButton)(target)); + + #line 3293 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabTools.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 73: + this.AgentTabEtc = ((System.Windows.Controls.RadioButton)(target)); + + #line 3296 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.AgentTabEtc.Checked += new System.Windows.RoutedEventHandler(this.AgentSubTab_Checked); + + #line default + #line hidden + return; + case 74: + this.AgentPanelCommon = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 75: + this.ServiceSubTabs = ((System.Windows.Controls.StackPanel)(target)); + return; + case 76: + this.SvcTabOllama = ((System.Windows.Controls.RadioButton)(target)); + + #line 3333 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.SvcTabOllama.Checked += new System.Windows.RoutedEventHandler(this.ServiceSubTab_Checked); + + #line default + #line hidden + return; + case 77: + this.SvcTabVllm = ((System.Windows.Controls.RadioButton)(target)); + + #line 3336 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.SvcTabVllm.Checked += new System.Windows.RoutedEventHandler(this.ServiceSubTab_Checked); + + #line default + #line hidden + return; + case 78: + this.SvcTabGemini = ((System.Windows.Controls.RadioButton)(target)); + + #line 3339 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.SvcTabGemini.Checked += new System.Windows.RoutedEventHandler(this.ServiceSubTab_Checked); + + #line default + #line hidden + return; + case 79: + this.SvcTabClaude = ((System.Windows.Controls.RadioButton)(target)); + + #line 3342 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.SvcTabClaude.Checked += new System.Windows.RoutedEventHandler(this.ServiceSubTab_Checked); + + #line default + #line hidden + return; + case 80: + this.SvcPanelOllama = ((System.Windows.Controls.StackPanel)(target)); + return; + case 81: + this.BtnAddModel = ((System.Windows.Controls.Button)(target)); + + #line 3367 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnAddModel.Click += new System.Windows.RoutedEventHandler(this.BtnAddModel_Click); + + #line default + #line hidden + return; + case 84: + this.CboActiveModel = ((System.Windows.Controls.ComboBox)(target)); + return; + case 85: + this.SvcPanelVllm = ((System.Windows.Controls.StackPanel)(target)); + return; + case 86: + this.BtnAddVllmModel = ((System.Windows.Controls.Button)(target)); + + #line 3465 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnAddVllmModel.Click += new System.Windows.RoutedEventHandler(this.BtnAddModel_Click); + + #line default + #line hidden + return; + case 89: + this.CboActiveVllmModel = ((System.Windows.Controls.ComboBox)(target)); + return; + case 90: + this.SvcPanelGemini = ((System.Windows.Controls.StackPanel)(target)); + return; + case 91: + this.SvcPanelClaude = ((System.Windows.Controls.StackPanel)(target)); + return; + case 92: + this.BtnTestConnection = ((System.Windows.Controls.Button)(target)); + + #line 3614 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnTestConnection.Click += new System.Windows.RoutedEventHandler(this.BtnTestConnection_Click); + + #line default + #line hidden + return; + case 93: + this.StorageSummaryText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 94: + this.StorageDriveText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 95: + + #line 3731 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnStorageRefresh_Click); + + #line default + #line hidden + return; + case 96: + + #line 3734 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnStorageCleanup_Click); + + #line default + #line hidden + return; + case 97: + this.StorageDetailPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 98: + this.AgentBlockSection = ((System.Windows.Controls.StackPanel)(target)); + return; + case 99: + this.HookListPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 100: + + #line 3928 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.AddHookBtn_Click); + + #line default + #line hidden + return; + case 101: + this.BtnBrowseSkillFolder = ((System.Windows.Controls.Button)(target)); + + #line 3981 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnBrowseSkillFolder.Click += new System.Windows.RoutedEventHandler(this.BtnBrowseSkillFolder_Click); + + #line default + #line hidden + return; + case 102: + this.BtnOpenSkillFolder = ((System.Windows.Controls.Button)(target)); + + #line 3985 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnOpenSkillFolder.Click += new System.Windows.RoutedEventHandler(this.BtnOpenSkillFolder_Click); + + #line default + #line hidden + return; + case 103: + this.AgentPanelChat = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 104: + this.BtnAddTemplate = ((System.Windows.Controls.Button)(target)); + + #line 4260 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.BtnAddTemplate.Click += new System.Windows.RoutedEventHandler(this.BtnAddTemplate_Click); + + #line default + #line hidden + return; + case 107: + this.AgentPanelCoworkCode = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 108: + + #line 4519 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnClearMemory_Click); + + #line default + #line hidden + return; + case 109: + this.AgentPanelCowork = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 110: + this.AgentPanelCode = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 111: + this.AgentPanelDev = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 112: + this.DevModeCheckBox = ((System.Windows.Controls.CheckBox)(target)); + + #line 4925 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.DevModeCheckBox.Checked += new System.Windows.RoutedEventHandler(this.DevModeCheckBox_Checked); + + #line default + #line hidden + + #line 4926 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.DevModeCheckBox.Unchecked += new System.Windows.RoutedEventHandler(this.DevModeCheckBox_Unchecked); + + #line default + #line hidden + return; + case 113: + this.DevModeContent = ((System.Windows.Controls.StackPanel)(target)); + return; + case 114: + this.StepApprovalCheckBox = ((System.Windows.Controls.CheckBox)(target)); + + #line 4943 "..\..\..\..\..\Views\SettingsWindow.xaml" + this.StepApprovalCheckBox.Checked += new System.Windows.RoutedEventHandler(this.StepApprovalCheckBox_Checked); + + #line default + #line hidden + return; + case 115: + + #line 5039 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnOpenAuditLog_Click); + + #line default + #line hidden + return; + case 116: + this.FallbackModelsPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 117: + this.FallbackModelsBox = ((System.Windows.Controls.TextBox)(target)); + return; + case 118: + + #line 5132 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnAddMcpServer_Click); + + #line default + #line hidden + return; + case 119: + this.McpServerListPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 120: + this.McpServersBox = ((System.Windows.Controls.TextBox)(target)); + return; + case 121: + this.AgentPanelEtc = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 122: + this.AgentEtcContent = ((System.Windows.Controls.StackPanel)(target)); + return; + case 123: + this.AgentPanelTools = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 124: + this.ToolCardsPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 125: + this.McpStatusPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 126: + this.VersionInfoText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 127: + + #line 5202 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ExportSettings_Click); + + #line default + #line hidden + return; + case 128: + + #line 5205 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ImportSettings_Click); + + #line default + #line hidden + return; + case 129: + + #line 5211 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Cancel_Click); + + #line default + #line hidden + return; + case 130: + + #line 5212 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Save_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + void System.Windows.Markup.IStyleConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 9: + + #line 943 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.RemoveIndexPath_Click); + + #line default + #line hidden + break; + case 13: + + #line 1011 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.RemoveExtension_Click); + + #line default + #line hidden + break; + case 28: + + #line 1211 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ThemeCard_Click); + + #line default + #line hidden + break; + case 30: + + #line 1344 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.ColorSwatch_Click); + + #line default + #line hidden + break; + case 37: + + #line 1676 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.DeleteSnippet_Click); + + #line default + #line hidden + break; + case 50: + + #line 2616 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.DeleteShortcut_Click); + + #line default + #line hidden + break; + case 52: + + #line 2782 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.DeleteBatchCommand_Click); + + #line default + #line hidden + break; + case 82: + + #line 3406 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnEditModel_Click); + + #line default + #line hidden + break; + case 83: + + #line 3411 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnDeleteModel_Click); + + #line default + #line hidden + break; + case 87: + + #line 3504 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnEditModel_Click); + + #line default + #line hidden + break; + case 88: + + #line 3509 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnDeleteModel_Click); + + #line default + #line hidden + break; + case 105: + + #line 4287 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnEditTemplate_Click); + + #line default + #line hidden + break; + case 106: + + #line 4292 "..\..\..\..\..\Views\SettingsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.BtnDeleteTemplate_Click); + + #line default + #line hidden + break; + } + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ShortcutHelpWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ShortcutHelpWindow.baml new file mode 100644 index 0000000..2c5ca10 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ShortcutHelpWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ShortcutHelpWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ShortcutHelpWindow.g.cs new file mode 100644 index 0000000..e341d25 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/ShortcutHelpWindow.g.cs @@ -0,0 +1,194 @@ +#pragma checksum "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "E0D1B21CEAFA49321A0D1E5C3C105368BFD65B78" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// ShortcutHelpWindow + /// + public partial class ShortcutHelpWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 78 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl NavigationItems; + + #line default + #line hidden + + + #line 83 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl FileActionItems; + + #line default + #line hidden + + + #line 88 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl ViewItems; + + #line default + #line hidden + + + #line 93 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl RunItems; + + #line default + #line hidden + + + #line 98 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ItemsControl PrefixItems; + + #line default + #line hidden + + + #line 126 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.CheckBox ThemeColorChk; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/shortcuthelpwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 15 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((AxCopilot.Views.ShortcutHelpWindow)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + + #line 16 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((AxCopilot.Views.ShortcutHelpWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + return; + case 2: + + #line 50 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 3: + this.NavigationItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 4: + this.FileActionItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 5: + this.ViewItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 6: + this.RunItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 7: + this.PrefixItems = ((System.Windows.Controls.ItemsControl)(target)); + return; + case 8: + + #line 109 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.ResizeGrip_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 9: + this.ThemeColorChk = ((System.Windows.Controls.CheckBox)(target)); + + #line 130 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + this.ThemeColorChk.Checked += new System.Windows.RoutedEventHandler(this.ThemeColorChk_Changed); + + #line default + #line hidden + + #line 131 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + this.ThemeColorChk.Unchecked += new System.Windows.RoutedEventHandler(this.ThemeColorChk_Changed); + + #line default + #line hidden + return; + case 10: + + #line 138 "..\..\..\..\..\Views\ShortcutHelpWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillEditorWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillEditorWindow.baml new file mode 100644 index 0000000..e9011d2 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillEditorWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillEditorWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillEditorWindow.g.cs new file mode 100644 index 0000000..f6db80e --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillEditorWindow.g.cs @@ -0,0 +1,287 @@ +#pragma checksum "..\..\..\..\..\Views\SkillEditorWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "6D658E60C66BCBEA8DB4B45831383876238697F6" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// SkillEditorWindow + /// + public partial class SkillEditorWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 29 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TitleText; + + #line default + #line hidden + + + #line 72 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtName; + + #line default + #line hidden + + + #line 85 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtLabel; + + #line default + #line hidden + + + #line 101 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtDescription; + + #line default + #line hidden + + + #line 121 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel IconSelectorPanel; + + #line default + #line hidden + + + #line 127 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ComboBox CmbRequires; + + #line default + #line hidden + + + #line 144 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnInsertToolList; + + #line default + #line hidden + + + #line 151 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnInsertFormat; + + #line default + #line hidden + + + #line 166 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBox TxtInstructions; + + #line default + #line hidden + + + #line 203 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ToolCheckListPanel; + + #line default + #line hidden + + + #line 214 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewTokens; + + #line default + #line hidden + + + #line 216 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewFileName; + + #line default + #line hidden + + + #line 228 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusText; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/skilleditorwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 24 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.TitleText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + + #line 34 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 4: + this.TxtName = ((System.Windows.Controls.TextBox)(target)); + return; + case 5: + this.TxtLabel = ((System.Windows.Controls.TextBox)(target)); + return; + case 6: + this.TxtDescription = ((System.Windows.Controls.TextBox)(target)); + return; + case 7: + this.IconSelectorPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 8: + this.CmbRequires = ((System.Windows.Controls.ComboBox)(target)); + return; + case 9: + this.BtnInsertToolList = ((System.Windows.Controls.Border)(target)); + + #line 146 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + this.BtnInsertToolList.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnInsertTemplate_Click); + + #line default + #line hidden + return; + case 10: + this.BtnInsertFormat = ((System.Windows.Controls.Border)(target)); + + #line 153 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + this.BtnInsertFormat.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnInsertTemplate_Click); + + #line default + #line hidden + return; + case 11: + + #line 160 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnInsertTemplate_Click); + + #line default + #line hidden + return; + case 12: + this.TxtInstructions = ((System.Windows.Controls.TextBox)(target)); + + #line 175 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + this.TxtInstructions.TextChanged += new System.Windows.Controls.TextChangedEventHandler(this.TxtInstructions_TextChanged); + + #line default + #line hidden + return; + case 13: + this.ToolCheckListPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 14: + this.PreviewTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 15: + this.PreviewFileName = ((System.Windows.Controls.TextBlock)(target)); + return; + case 16: + this.StatusText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 17: + + #line 234 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnCancel_Click); + + #line default + #line hidden + return; + case 18: + + #line 240 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnPreview_Click); + + #line default + #line hidden + return; + case 19: + + #line 246 "..\..\..\..\..\Views\SkillEditorWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnSave_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillGalleryWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillGalleryWindow.baml new file mode 100644 index 0000000..5d94d58 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillGalleryWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillGalleryWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillGalleryWindow.g.cs new file mode 100644 index 0000000..0376cda --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/SkillGalleryWindow.g.cs @@ -0,0 +1,152 @@ +#pragma checksum "..\..\..\..\..\Views\SkillGalleryWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "A8E475BD4F287C0B683CC45AFF4F1152AA7F0DC4" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// SkillGalleryWindow + /// + public partial class SkillGalleryWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 60 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnCloseGallery; + + #line default + #line hidden + + + #line 83 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel CategoryFilterBar; + + #line default + #line hidden + + + #line 88 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel SkillListPanel; + + #line default + #line hidden + + + #line 94 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock GalleryStatus; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/skillgallerywindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 25 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + + #line 42 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnAddSkill_Click); + + #line default + #line hidden + return; + case 3: + + #line 52 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnImport_Click); + + #line default + #line hidden + return; + case 4: + this.BtnCloseGallery = ((System.Windows.Controls.Border)(target)); + + #line 62 "..\..\..\..\..\Views\SkillGalleryWindow.xaml" + this.BtnCloseGallery.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_Click); + + #line default + #line hidden + return; + case 5: + this.CategoryFilterBar = ((System.Windows.Controls.StackPanel)(target)); + return; + case 6: + this.SkillListPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 7: + this.GalleryStatus = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/StatisticsWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/StatisticsWindow.baml new file mode 100644 index 0000000..43bec6f Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/StatisticsWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/StatisticsWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/StatisticsWindow.g.cs new file mode 100644 index 0000000..47a254c --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/StatisticsWindow.g.cs @@ -0,0 +1,195 @@ +#pragma checksum "..\..\..\..\..\Views\StatisticsWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "AFF6B3423613E10086D3FF44E4C4E87A504D82B8" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using AxCopilot.ViewModels; +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// StatisticsWindow + /// + public partial class StatisticsWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 102 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton StatsTabMain; + + #line default + #line hidden + + + #line 124 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton StatsTabCommander; + + #line default + #line hidden + + + #line 127 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.RadioButton StatsTabAgent; + + #line default + #line hidden + + + #line 134 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer PanelMain; + + #line default + #line hidden + + + #line 307 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer PanelCommander; + + #line default + #line hidden + + + #line 580 "..\..\..\..\..\Views\StatisticsWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer PanelAgent; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/statisticswindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\StatisticsWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 18 "..\..\..\..\..\Views\StatisticsWindow.xaml" + ((AxCopilot.Views.StatisticsWindow)(target)).MouseDown += new System.Windows.Input.MouseButtonEventHandler(this.Window_MouseDown); + + #line default + #line hidden + return; + case 2: + + #line 55 "..\..\..\..\..\Views\StatisticsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Refresh_Click); + + #line default + #line hidden + return; + case 3: + + #line 72 "..\..\..\..\..\Views\StatisticsWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Close_Click); + + #line default + #line hidden + return; + case 4: + this.StatsTabMain = ((System.Windows.Controls.RadioButton)(target)); + + #line 103 "..\..\..\..\..\Views\StatisticsWindow.xaml" + this.StatsTabMain.Click += new System.Windows.RoutedEventHandler(this.StatsTab_Click); + + #line default + #line hidden + return; + case 5: + this.StatsTabCommander = ((System.Windows.Controls.RadioButton)(target)); + + #line 125 "..\..\..\..\..\Views\StatisticsWindow.xaml" + this.StatsTabCommander.Click += new System.Windows.RoutedEventHandler(this.StatsTab_Click); + + #line default + #line hidden + return; + case 6: + this.StatsTabAgent = ((System.Windows.Controls.RadioButton)(target)); + + #line 128 "..\..\..\..\..\Views\StatisticsWindow.xaml" + this.StatsTabAgent.Click += new System.Windows.RoutedEventHandler(this.StatsTab_Click); + + #line default + #line hidden + return; + case 7: + this.PanelMain = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 8: + this.PanelCommander = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 9: + this.PanelAgent = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 10: + + #line 807 "..\..\..\..\..\Views\StatisticsWindow.xaml" + ((System.Windows.Controls.Border)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.ResizeGrip_MouseLeftButtonDown); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TextActionPopup.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TextActionPopup.baml new file mode 100644 index 0000000..7f86315 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TextActionPopup.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TextActionPopup.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TextActionPopup.g.cs new file mode 100644 index 0000000..58f9907 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TextActionPopup.g.cs @@ -0,0 +1,114 @@ +#pragma checksum "..\..\..\..\..\Views\TextActionPopup.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "02046947FDB5F4A5DA7B8EEB9F034293FFA55E0F" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// TextActionPopup + /// + public partial class TextActionPopup : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 26 "..\..\..\..\..\Views\TextActionPopup.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock PreviewText; + + #line default + #line hidden + + + #line 34 "..\..\..\..\..\Views\TextActionPopup.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MenuItems; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/textactionpopup.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\TextActionPopup.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 11 "..\..\..\..\..\Views\TextActionPopup.xaml" + ((AxCopilot.Views.TextActionPopup)(target)).Deactivated += new System.EventHandler(this.Window_Deactivated); + + #line default + #line hidden + + #line 12 "..\..\..\..\..\Views\TextActionPopup.xaml" + ((AxCopilot.Views.TextActionPopup)(target)).KeyDown += new System.Windows.Input.KeyEventHandler(this.Window_KeyDown); + + #line default + #line hidden + return; + case 2: + this.PreviewText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 3: + this.MenuItems = ((System.Windows.Controls.StackPanel)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TrayMenuWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TrayMenuWindow.baml new file mode 100644 index 0000000..cff12f4 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TrayMenuWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TrayMenuWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TrayMenuWindow.g.cs new file mode 100644 index 0000000..331dab5 --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/TrayMenuWindow.g.cs @@ -0,0 +1,108 @@ +#pragma checksum "..\..\..\..\..\Views\TrayMenuWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "40F6FCA56C2ED32D0070A0AADEC9578EEF8AC6CE" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// TrayMenuWindow + /// + public partial class TrayMenuWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 13 "..\..\..\..\..\Views\TrayMenuWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border RootBorder; + + #line default + #line hidden + + + #line 24 "..\..\..\..\..\Views\TrayMenuWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel MenuPanel; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/traymenuwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\TrayMenuWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 11 "..\..\..\..\..\Views\TrayMenuWindow.xaml" + ((AxCopilot.Views.TrayMenuWindow)(target)).Deactivated += new System.EventHandler(this.Window_Deactivated); + + #line default + #line hidden + return; + case 2: + this.RootBorder = ((System.Windows.Controls.Border)(target)); + return; + case 3: + this.MenuPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.baml b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.baml new file mode 100644 index 0000000..e2ce4ff Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.baml differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.g.cs b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.g.cs new file mode 100644 index 0000000..4673b2b --- /dev/null +++ b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/Views/WorkflowAnalyzerWindow.g.cs @@ -0,0 +1,471 @@ +#pragma checksum "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "8460548829D487A45549EF4A159B6F31C0FCF501" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Forms.Integration; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace AxCopilot.Views { + + + /// + /// WorkflowAnalyzerWindow + /// + public partial class WorkflowAnalyzerWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + + #line 35 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnClear; + + #line default + #line hidden + + + #line 42 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnMinimize; + + #line default + #line hidden + + + #line 49 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border BtnClose; + + #line default + #line hidden + + + #line 65 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardElapsed; + + #line default + #line hidden + + + #line 71 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardIterations; + + #line default + #line hidden + + + #line 78 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardTokens; + + #line default + #line hidden + + + #line 81 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardInputTokens; + + #line default + #line hidden + + + #line 83 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardOutputTokens; + + #line default + #line hidden + + + #line 90 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock CardToolCalls; + + #line default + #line hidden + + + #line 99 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border TabTimeline; + + #line default + #line hidden + + + #line 102 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TabTimelineIcon; + + #line default + #line hidden + + + #line 104 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TabTimelineText; + + #line default + #line hidden + + + #line 108 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border TabBottleneck; + + #line default + #line hidden + + + #line 111 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TabBottleneckIcon; + + #line default + #line hidden + + + #line 113 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock TabBottleneckText; + + #line default + #line hidden + + + #line 121 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer TimelineScroller; + + #line default + #line hidden + + + #line 123 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel TimelinePanel; + + #line default + #line hidden + + + #line 127 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.ScrollViewer BottleneckScroller; + + #line default + #line hidden + + + #line 129 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel BottleneckPanel; + + #line default + #line hidden + + + #line 135 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas WaterfallCanvas; + + #line default + #line hidden + + + #line 143 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.StackPanel ToolTimePanel; + + #line default + #line hidden + + + #line 151 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Canvas TokenTrendCanvas; + + #line default + #line hidden + + + #line 157 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.Border DetailPanel; + + #line default + #line hidden + + + #line 163 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DetailTitle; + + #line default + #line hidden + + + #line 165 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DetailBadge; + + #line default + #line hidden + + + #line 169 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DetailMeta; + + #line default + #line hidden + + + #line 171 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock DetailContent; + + #line default + #line hidden + + + #line 181 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock StatusText; + + #line default + #line hidden + + + #line 184 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")] + internal System.Windows.Controls.TextBlock LogLevelBadge; + + #line default + #line hidden + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/AxCopilot;component/views/workflowanalyzerwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "10.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 27 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + ((System.Windows.Controls.Grid)(target)).MouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(this.TitleBar_MouseLeftButtonDown); + + #line default + #line hidden + return; + case 2: + this.BtnClear = ((System.Windows.Controls.Border)(target)); + + #line 37 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClear.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClear_Click); + + #line default + #line hidden + + #line 38 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClear.MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseEnter); + + #line default + #line hidden + + #line 38 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClear.MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseLeave); + + #line default + #line hidden + return; + case 3: + this.BtnMinimize = ((System.Windows.Controls.Border)(target)); + + #line 44 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnMinimize.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnMinimize_Click); + + #line default + #line hidden + + #line 45 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnMinimize.MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseEnter); + + #line default + #line hidden + + #line 45 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnMinimize.MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseLeave); + + #line default + #line hidden + return; + case 4: + this.BtnClose = ((System.Windows.Controls.Border)(target)); + + #line 51 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClose.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.BtnClose_Click); + + #line default + #line hidden + + #line 52 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClose.MouseEnter += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseEnter); + + #line default + #line hidden + + #line 52 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.BtnClose.MouseLeave += new System.Windows.Input.MouseEventHandler(this.TitleBtn_MouseLeave); + + #line default + #line hidden + return; + case 5: + this.CardElapsed = ((System.Windows.Controls.TextBlock)(target)); + return; + case 6: + this.CardIterations = ((System.Windows.Controls.TextBlock)(target)); + return; + case 7: + this.CardTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 8: + this.CardInputTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 9: + this.CardOutputTokens = ((System.Windows.Controls.TextBlock)(target)); + return; + case 10: + this.CardToolCalls = ((System.Windows.Controls.TextBlock)(target)); + return; + case 11: + this.TabTimeline = ((System.Windows.Controls.Border)(target)); + + #line 100 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.TabTimeline.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.TabTimeline_Click); + + #line default + #line hidden + return; + case 12: + this.TabTimelineIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 13: + this.TabTimelineText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 14: + this.TabBottleneck = ((System.Windows.Controls.Border)(target)); + + #line 109 "..\..\..\..\..\Views\WorkflowAnalyzerWindow.xaml" + this.TabBottleneck.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(this.TabBottleneck_Click); + + #line default + #line hidden + return; + case 15: + this.TabBottleneckIcon = ((System.Windows.Controls.TextBlock)(target)); + return; + case 16: + this.TabBottleneckText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 17: + this.TimelineScroller = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 18: + this.TimelinePanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 19: + this.BottleneckScroller = ((System.Windows.Controls.ScrollViewer)(target)); + return; + case 20: + this.BottleneckPanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 21: + this.WaterfallCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 22: + this.ToolTimePanel = ((System.Windows.Controls.StackPanel)(target)); + return; + case 23: + this.TokenTrendCanvas = ((System.Windows.Controls.Canvas)(target)); + return; + case 24: + this.DetailPanel = ((System.Windows.Controls.Border)(target)); + return; + case 25: + this.DetailTitle = ((System.Windows.Controls.TextBlock)(target)); + return; + case 26: + this.DetailBadge = ((System.Windows.Controls.TextBlock)(target)); + return; + case 27: + this.DetailMeta = ((System.Windows.Controls.TextBlock)(target)); + return; + case 28: + this.DetailContent = ((System.Windows.Controls.TextBlock)(target)); + return; + case 29: + this.StatusText = ((System.Windows.Controls.TextBlock)(target)); + return; + case 30: + this.LogLevelBadge = ((System.Windows.Controls.TextBlock)(target)); + return; + } + this._contentLoaded = true; + } + } +} + diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/apphost.exe b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/apphost.exe new file mode 100644 index 0000000..6262bd4 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/apphost.exe differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/ref/AxCopilot.dll b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/ref/AxCopilot.dll new file mode 100644 index 0000000..e9e41d6 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/ref/AxCopilot.dll differ diff --git a/src/AxCopilot/obj/Release/net8.0-windows/win-x64/refint/AxCopilot.dll b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/refint/AxCopilot.dll new file mode 100644 index 0000000..e9e41d6 Binary files /dev/null and b/src/AxCopilot/obj/Release/net8.0-windows/win-x64/refint/AxCopilot.dll differ diff --git a/src/AxCopilot/obj/project.assets.json b/src/AxCopilot/obj/project.assets.json new file mode 100644 index 0000000..437a10b --- /dev/null +++ b/src/AxCopilot/obj/project.assets.json @@ -0,0 +1,1456 @@ +{ + "version": 3, + "targets": { + "net8.0-windows7.0": { + "DocumentFormat.OpenXml/3.2.0": { + "type": "package", + "dependencies": { + "DocumentFormat.OpenXml.Framework": "3.2.0" + }, + "compile": { + "lib/net8.0/DocumentFormat.OpenXml.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.dll": { + "related": ".xml" + } + } + }, + "DocumentFormat.OpenXml.Framework/3.2.0": { + "type": "package", + "dependencies": { + "System.IO.Packaging": "8.0.1" + }, + "compile": { + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll": { + "related": ".xml" + } + } + }, + "Markdig/0.37.0": { + "type": "package", + "compile": { + "lib/net8.0/Markdig.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Markdig.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Data.Sqlite/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" + }, + "compile": { + "lib/netstandard2.0/_._": {} + }, + "runtime": { + "lib/netstandard2.0/_._": {} + } + }, + "Microsoft.Data.Sqlite.Core/8.0.0": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.core": "2.1.6" + }, + "compile": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Web.WebView2/1.0.2903.40": { + "type": "package", + "build": { + "buildTransitive/Microsoft.Web.WebView2.targets": {} + }, + "runtimeTargets": { + "runtimes/win-arm64/native/WebView2Loader.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/WebView2Loader.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/WebView2Loader.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "SQLitePCLRaw.bundle_e_sqlite3/2.1.6": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" + }, + "compile": { + "lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll": {} + }, + "runtime": { + "lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll": {} + } + }, + "SQLitePCLRaw.core/2.1.6": { + "type": "package", + "dependencies": { + "System.Memory": "4.5.3" + }, + "compile": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": {} + }, + "runtime": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": {} + } + }, + "SQLitePCLRaw.lib.e_sqlite3/2.1.6": { + "type": "package", + "compile": { + "lib/netstandard2.0/_._": {} + }, + "runtime": { + "lib/netstandard2.0/_._": {} + }, + "build": { + "buildTransitive/net8.0/SQLitePCLRaw.lib.e_sqlite3.targets": {} + }, + "runtimeTargets": { + "runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a": { + "assetType": "native", + "rid": "browser-wasm" + }, + "runtimes/linux-arm/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-arm" + }, + "runtimes/linux-arm64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-arm64" + }, + "runtimes/linux-armel/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-armel" + }, + "runtimes/linux-mips64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-mips64" + }, + "runtimes/linux-musl-arm/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-arm" + }, + "runtimes/linux-musl-arm64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-arm64" + }, + "runtimes/linux-musl-x64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-musl-x64" + }, + "runtimes/linux-ppc64le/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-ppc64le" + }, + "runtimes/linux-s390x/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-s390x" + }, + "runtimes/linux-x64/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-x64" + }, + "runtimes/linux-x86/native/libe_sqlite3.so": { + "assetType": "native", + "rid": "linux-x86" + }, + "runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "maccatalyst-arm64" + }, + "runtimes/maccatalyst-x64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "maccatalyst-x64" + }, + "runtimes/osx-arm64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "osx-arm64" + }, + "runtimes/osx-x64/native/libe_sqlite3.dylib": { + "assetType": "native", + "rid": "osx-x64" + }, + "runtimes/win-arm/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-arm" + }, + "runtimes/win-arm64/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-arm64" + }, + "runtimes/win-x64/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-x64" + }, + "runtimes/win-x86/native/e_sqlite3.dll": { + "assetType": "native", + "rid": "win-x86" + } + } + }, + "SQLitePCLRaw.provider.e_sqlite3/2.1.6": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.core": "2.1.6" + }, + "compile": { + "lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {} + }, + "runtime": { + "lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {} + } + }, + "System.Diagnostics.EventLog/8.0.1": { + "type": "package", + "compile": { + "lib/net8.0/System.Diagnostics.EventLog.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Diagnostics.EventLog.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll": { + "assetType": "runtime", + "rid": "win" + }, + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "System.IO.Packaging/8.0.1": { + "type": "package", + "compile": { + "lib/net8.0/System.IO.Packaging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.IO.Packaging.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Memory/4.5.3": { + "type": "package", + "compile": { + "ref/netcoreapp2.1/_._": {} + }, + "runtime": { + "lib/netcoreapp2.1/_._": {} + } + }, + "System.Security.Cryptography.ProtectedData/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.ServiceProcess.ServiceController/8.0.1": { + "type": "package", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.1" + }, + "compile": { + "lib/net8.0/System.ServiceProcess.ServiceController.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.ServiceProcess.ServiceController.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + }, + "runtimeTargets": { + "runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll": { + "assetType": "runtime", + "rid": "win" + } + } + }, + "UglyToad.PdfPig/1.7.0-custom-5": { + "type": "package", + "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" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.dll": { + "related": ".xml" + } + } + }, + "UglyToad.PdfPig.Core/1.7.0-custom-5": { + "type": "package", + "compile": { + "lib/net6.0/UglyToad.PdfPig.Core.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Core.dll": { + "related": ".xml" + } + } + }, + "UglyToad.PdfPig.Fonts/1.7.0-custom-5": { + "type": "package", + "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" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.Fonts.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Fonts.dll": { + "related": ".xml" + } + }, + "contentFiles": { + "contentFiles/any/any/_._": { + "buildAction": "None", + "codeLanguage": "any", + "copyToOutput": false + } + } + }, + "UglyToad.PdfPig.Tokenization/1.7.0-custom-5": { + "type": "package", + "dependencies": { + "UglyToad.PdfPig.Core": "1.7.0-custom-5", + "UglyToad.PdfPig.Tokens": "1.7.0-custom-5" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.Tokenization.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Tokenization.dll": { + "related": ".xml" + } + } + }, + "UglyToad.PdfPig.Tokens/1.7.0-custom-5": { + "type": "package", + "dependencies": { + "UglyToad.PdfPig.Core": "1.7.0-custom-5" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.Tokens.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Tokens.dll": { + "related": ".xml" + } + } + }, + "AxCopilot.SDK/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v8.0", + "compile": { + "bin/placeholder/AxCopilot.SDK.dll": {} + }, + "runtime": { + "bin/placeholder/AxCopilot.SDK.dll": {} + } + } + }, + "net8.0-windows7.0/win-x64": { + "DocumentFormat.OpenXml/3.2.0": { + "type": "package", + "dependencies": { + "DocumentFormat.OpenXml.Framework": "3.2.0" + }, + "compile": { + "lib/net8.0/DocumentFormat.OpenXml.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.dll": { + "related": ".xml" + } + } + }, + "DocumentFormat.OpenXml.Framework/3.2.0": { + "type": "package", + "dependencies": { + "System.IO.Packaging": "8.0.1" + }, + "compile": { + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll": { + "related": ".xml" + } + } + }, + "Markdig/0.37.0": { + "type": "package", + "compile": { + "lib/net8.0/Markdig.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Markdig.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Data.Sqlite/8.0.0": { + "type": "package", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "8.0.0", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" + }, + "compile": { + "lib/netstandard2.0/_._": {} + }, + "runtime": { + "lib/netstandard2.0/_._": {} + } + }, + "Microsoft.Data.Sqlite.Core/8.0.0": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.core": "2.1.6" + }, + "compile": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/Microsoft.Data.Sqlite.dll": { + "related": ".xml" + } + } + }, + "Microsoft.Web.WebView2/1.0.2903.40": { + "type": "package", + "native": { + "runtimes/win-x64/native/WebView2Loader.dll": {} + }, + "build": { + "buildTransitive/Microsoft.Web.WebView2.targets": {} + } + }, + "SQLitePCLRaw.bundle_e_sqlite3/2.1.6": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" + }, + "compile": { + "lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll": {} + }, + "runtime": { + "lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll": {} + } + }, + "SQLitePCLRaw.core/2.1.6": { + "type": "package", + "dependencies": { + "System.Memory": "4.5.3" + }, + "compile": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": {} + }, + "runtime": { + "lib/netstandard2.0/SQLitePCLRaw.core.dll": {} + } + }, + "SQLitePCLRaw.lib.e_sqlite3/2.1.6": { + "type": "package", + "compile": { + "lib/netstandard2.0/_._": {} + }, + "runtime": { + "lib/netstandard2.0/_._": {} + }, + "native": { + "runtimes/win-x64/native/e_sqlite3.dll": {} + }, + "build": { + "buildTransitive/net8.0/SQLitePCLRaw.lib.e_sqlite3.targets": {} + } + }, + "SQLitePCLRaw.provider.e_sqlite3/2.1.6": { + "type": "package", + "dependencies": { + "SQLitePCLRaw.core": "2.1.6" + }, + "compile": { + "lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {} + }, + "runtime": { + "lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {} + } + }, + "System.Diagnostics.EventLog/8.0.1": { + "type": "package", + "compile": { + "lib/net8.0/System.Diagnostics.EventLog.dll": { + "related": ".xml" + } + }, + "runtime": { + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll": {}, + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.IO.Packaging/8.0.1": { + "type": "package", + "compile": { + "lib/net8.0/System.IO.Packaging.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.IO.Packaging.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.Memory/4.5.3": { + "type": "package", + "compile": { + "ref/netcoreapp2.1/_._": {} + }, + "runtime": { + "lib/netcoreapp2.1/_._": {} + } + }, + "System.Security.Cryptography.ProtectedData/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "System.ServiceProcess.ServiceController/8.0.1": { + "type": "package", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.1" + }, + "compile": { + "lib/net8.0/System.ServiceProcess.ServiceController.dll": { + "related": ".xml" + } + }, + "runtime": { + "runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + }, + "UglyToad.PdfPig/1.7.0-custom-5": { + "type": "package", + "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" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.dll": { + "related": ".xml" + } + } + }, + "UglyToad.PdfPig.Core/1.7.0-custom-5": { + "type": "package", + "compile": { + "lib/net6.0/UglyToad.PdfPig.Core.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Core.dll": { + "related": ".xml" + } + } + }, + "UglyToad.PdfPig.Fonts/1.7.0-custom-5": { + "type": "package", + "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" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.Fonts.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Fonts.dll": { + "related": ".xml" + } + }, + "contentFiles": { + "contentFiles/any/any/_._": { + "buildAction": "None", + "codeLanguage": "any", + "copyToOutput": false + } + } + }, + "UglyToad.PdfPig.Tokenization/1.7.0-custom-5": { + "type": "package", + "dependencies": { + "UglyToad.PdfPig.Core": "1.7.0-custom-5", + "UglyToad.PdfPig.Tokens": "1.7.0-custom-5" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.Tokenization.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Tokenization.dll": { + "related": ".xml" + } + } + }, + "UglyToad.PdfPig.Tokens/1.7.0-custom-5": { + "type": "package", + "dependencies": { + "UglyToad.PdfPig.Core": "1.7.0-custom-5" + }, + "compile": { + "lib/net6.0/UglyToad.PdfPig.Tokens.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net6.0/UglyToad.PdfPig.Tokens.dll": { + "related": ".xml" + } + } + }, + "AxCopilot.SDK/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v8.0", + "compile": { + "bin/placeholder/AxCopilot.SDK.dll": {} + }, + "runtime": { + "bin/placeholder/AxCopilot.SDK.dll": {} + } + } + } + }, + "libraries": { + "DocumentFormat.OpenXml/3.2.0": { + "sha512": "eDBT9G0sAWUvjgE8l8E5bGCFXgxCZXIecQ8dqUnj2PyxyMR5eBmLahqRRw3Q7uSKM3cKbysaL2mEY0JJbEEOEA==", + "type": "package", + "path": "documentformat.openxml/3.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "documentformat.openxml.3.2.0.nupkg.sha512", + "documentformat.openxml.nuspec", + "icon.png", + "lib/net35/DocumentFormat.OpenXml.dll", + "lib/net35/DocumentFormat.OpenXml.xml", + "lib/net40/DocumentFormat.OpenXml.dll", + "lib/net40/DocumentFormat.OpenXml.xml", + "lib/net46/DocumentFormat.OpenXml.dll", + "lib/net46/DocumentFormat.OpenXml.xml", + "lib/net8.0/DocumentFormat.OpenXml.dll", + "lib/net8.0/DocumentFormat.OpenXml.xml", + "lib/netstandard2.0/DocumentFormat.OpenXml.dll", + "lib/netstandard2.0/DocumentFormat.OpenXml.xml" + ] + }, + "DocumentFormat.OpenXml.Framework/3.2.0": { + "sha512": "e1neOKqRnSHUom4JQEorAoZ67aiJOp6+Xzsu0fc6IYfFcgQn6roo+w6i2w//N2u/5ilEfvLr35bNO9zaIN7r7g==", + "type": "package", + "path": "documentformat.openxml.framework/3.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "README.md", + "documentformat.openxml.framework.3.2.0.nupkg.sha512", + "documentformat.openxml.framework.nuspec", + "icon.png", + "lib/net35/DocumentFormat.OpenXml.Framework.dll", + "lib/net35/DocumentFormat.OpenXml.Framework.xml", + "lib/net40/DocumentFormat.OpenXml.Framework.dll", + "lib/net40/DocumentFormat.OpenXml.Framework.xml", + "lib/net46/DocumentFormat.OpenXml.Framework.dll", + "lib/net46/DocumentFormat.OpenXml.Framework.xml", + "lib/net6.0/DocumentFormat.OpenXml.Framework.dll", + "lib/net6.0/DocumentFormat.OpenXml.Framework.xml", + "lib/net8.0/DocumentFormat.OpenXml.Framework.dll", + "lib/net8.0/DocumentFormat.OpenXml.Framework.xml", + "lib/netstandard2.0/DocumentFormat.OpenXml.Framework.dll", + "lib/netstandard2.0/DocumentFormat.OpenXml.Framework.xml" + ] + }, + "Markdig/0.37.0": { + "sha512": "biiu4MTPFjW55qw6v5Aphtj0MjDLJ14x8ndZwkJUHIeqvaSGKeqhLY7S7Vu/S3k7/c9KwhhnaCDP9hdFNUhcNA==", + "type": "package", + "path": "markdig/0.37.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net462/Markdig.dll", + "lib/net462/Markdig.xml", + "lib/net6.0/Markdig.dll", + "lib/net6.0/Markdig.xml", + "lib/net8.0/Markdig.dll", + "lib/net8.0/Markdig.xml", + "lib/netstandard2.0/Markdig.dll", + "lib/netstandard2.0/Markdig.xml", + "lib/netstandard2.1/Markdig.dll", + "lib/netstandard2.1/Markdig.xml", + "markdig.0.37.0.nupkg.sha512", + "markdig.nuspec", + "markdig.png", + "readme.md" + ] + }, + "Microsoft.Data.Sqlite/8.0.0": { + "sha512": "H+iC5IvkCCKSNHXzL3JARvDn7VpkvuJM91KVB89sKjeTF/KX/BocNNh93ZJtX5MCQKb/z4yVKgkU2sVIq+xKfg==", + "type": "package", + "path": "microsoft.data.sqlite/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "lib/netstandard2.0/_._", + "microsoft.data.sqlite.8.0.0.nupkg.sha512", + "microsoft.data.sqlite.nuspec" + ] + }, + "Microsoft.Data.Sqlite.Core/8.0.0": { + "sha512": "pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==", + "type": "package", + "path": "microsoft.data.sqlite.core/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "lib/net6.0/Microsoft.Data.Sqlite.dll", + "lib/net6.0/Microsoft.Data.Sqlite.xml", + "lib/net8.0/Microsoft.Data.Sqlite.dll", + "lib/net8.0/Microsoft.Data.Sqlite.xml", + "lib/netstandard2.0/Microsoft.Data.Sqlite.dll", + "lib/netstandard2.0/Microsoft.Data.Sqlite.xml", + "microsoft.data.sqlite.core.8.0.0.nupkg.sha512", + "microsoft.data.sqlite.core.nuspec" + ] + }, + "Microsoft.Web.WebView2/1.0.2903.40": { + "sha512": "THrzYAnJgE3+cNH+9Epr44XjoZoRELdVpXlWGPs6K9C9G6TqyDfVCeVAR/Er8ljLitIUX5gaSkPsy9wRhD1sgQ==", + "type": "package", + "path": "microsoft.web.webview2/1.0.2903.40", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.txt", + "NOTICE.txt", + "WebView2.idl", + "WebView2.tlb", + "build/Common.targets", + "build/Microsoft.Web.WebView2.targets", + "build/WebView2Rules.Project.xml", + "build/native/Microsoft.Web.WebView2.targets", + "build/native/arm64/WebView2Loader.dll", + "build/native/arm64/WebView2Loader.dll.lib", + "build/native/arm64/WebView2LoaderStatic.lib", + "build/native/include-winrt/WebView2Interop.h", + "build/native/include-winrt/WebView2Interop.idl", + "build/native/include-winrt/WebView2Interop.tlb", + "build/native/include/WebView2.h", + "build/native/include/WebView2EnvironmentOptions.h", + "build/native/x64/WebView2Loader.dll", + "build/native/x64/WebView2Loader.dll.lib", + "build/native/x64/WebView2LoaderStatic.lib", + "build/native/x86/WebView2Loader.dll", + "build/native/x86/WebView2Loader.dll.lib", + "build/native/x86/WebView2LoaderStatic.lib", + "build/wv2winrt.targets", + "buildTransitive/Microsoft.Web.WebView2.targets", + "lib/Microsoft.Web.WebView2.Core.winmd", + "lib/net462/Microsoft.Web.WebView2.Core.dll", + "lib/net462/Microsoft.Web.WebView2.Core.xml", + "lib/net462/Microsoft.Web.WebView2.WinForms.dll", + "lib/net462/Microsoft.Web.WebView2.WinForms.xml", + "lib/net462/Microsoft.Web.WebView2.Wpf.dll", + "lib/net462/Microsoft.Web.WebView2.Wpf.xml", + "lib_manual/net5.0-windows10.0.17763.0/Microsoft.Web.WebView2.Wpf.dll", + "lib_manual/net5.0-windows10.0.17763.0/Microsoft.Web.WebView2.Wpf.xml", + "lib_manual/net6.0-windows10.0.17763.0/Microsoft.Web.WebView2.Core.Projection.dll", + "lib_manual/net8.0-windows10.0.17763.0/Microsoft.Web.WebView2.Core.Projection.dll", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.Core.dll", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.Core.xml", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.WinForms.dll", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.WinForms.xml", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.Wpf.dll", + "lib_manual/netcoreapp3.0/Microsoft.Web.WebView2.Wpf.xml", + "microsoft.web.webview2.1.0.2903.40.nupkg.sha512", + "microsoft.web.webview2.nuspec", + "runtimes/win-arm64/native/WebView2Loader.dll", + "runtimes/win-arm64/native_uap/Microsoft.Web.WebView2.Core.dll", + "runtimes/win-x64/native/WebView2Loader.dll", + "runtimes/win-x64/native_uap/Microsoft.Web.WebView2.Core.dll", + "runtimes/win-x86/native/WebView2Loader.dll", + "runtimes/win-x86/native_uap/Microsoft.Web.WebView2.Core.dll", + "tools/VisualStudioToolsManifest.xml", + "tools/wv2winrt/Antlr3.Runtime.dll", + "tools/wv2winrt/Antlr4.StringTemplate.dll", + "tools/wv2winrt/System.Buffers.dll", + "tools/wv2winrt/System.CommandLine.DragonFruit.dll", + "tools/wv2winrt/System.CommandLine.Rendering.dll", + "tools/wv2winrt/System.CommandLine.dll", + "tools/wv2winrt/System.Memory.dll", + "tools/wv2winrt/System.Numerics.Vectors.dll", + "tools/wv2winrt/System.Runtime.CompilerServices.Unsafe.dll", + "tools/wv2winrt/codegen_util.dll", + "tools/wv2winrt/concrt140_app.dll", + "tools/wv2winrt/cs/System.CommandLine.resources.dll", + "tools/wv2winrt/de/System.CommandLine.resources.dll", + "tools/wv2winrt/es/System.CommandLine.resources.dll", + "tools/wv2winrt/fr/System.CommandLine.resources.dll", + "tools/wv2winrt/it/System.CommandLine.resources.dll", + "tools/wv2winrt/ja/System.CommandLine.resources.dll", + "tools/wv2winrt/ko/System.CommandLine.resources.dll", + "tools/wv2winrt/msvcp140_1_app.dll", + "tools/wv2winrt/msvcp140_2_app.dll", + "tools/wv2winrt/msvcp140_app.dll", + "tools/wv2winrt/pl/System.CommandLine.resources.dll", + "tools/wv2winrt/pt-BR/System.CommandLine.resources.dll", + "tools/wv2winrt/ru/System.CommandLine.resources.dll", + "tools/wv2winrt/tr/System.CommandLine.resources.dll", + "tools/wv2winrt/type_hierarchy.dll", + "tools/wv2winrt/vcamp140_app.dll", + "tools/wv2winrt/vccorlib140_app.dll", + "tools/wv2winrt/vcomp140_app.dll", + "tools/wv2winrt/vcruntime140_app.dll", + "tools/wv2winrt/winrt_winmd.dll", + "tools/wv2winrt/winrt_winmd.winmd", + "tools/wv2winrt/wv2winrt.exe", + "tools/wv2winrt/wv2winrt.exe.config", + "tools/wv2winrt/wv2winrt.xml", + "tools/wv2winrt/zh-Hans/System.CommandLine.resources.dll", + "tools/wv2winrt/zh-Hant/System.CommandLine.resources.dll" + ] + }, + "SQLitePCLRaw.bundle_e_sqlite3/2.1.6": { + "sha512": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", + "type": "package", + "path": "sqlitepclraw.bundle_e_sqlite3/2.1.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/monoandroid90/SQLitePCLRaw.batteries_v2.dll", + "lib/net461/SQLitePCLRaw.batteries_v2.dll", + "lib/net6.0-android31.0/SQLitePCLRaw.batteries_v2.dll", + "lib/net6.0-android31.0/SQLitePCLRaw.batteries_v2.xml", + "lib/net6.0-ios14.0/SQLitePCLRaw.batteries_v2.dll", + "lib/net6.0-ios14.2/SQLitePCLRaw.batteries_v2.dll", + "lib/net6.0-tvos10.0/SQLitePCLRaw.batteries_v2.dll", + "lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll", + "lib/xamarinios10/SQLitePCLRaw.batteries_v2.dll", + "sqlitepclraw.bundle_e_sqlite3.2.1.6.nupkg.sha512", + "sqlitepclraw.bundle_e_sqlite3.nuspec" + ] + }, + "SQLitePCLRaw.core/2.1.6": { + "sha512": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", + "type": "package", + "path": "sqlitepclraw.core/2.1.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/netstandard2.0/SQLitePCLRaw.core.dll", + "sqlitepclraw.core.2.1.6.nupkg.sha512", + "sqlitepclraw.core.nuspec" + ] + }, + "SQLitePCLRaw.lib.e_sqlite3/2.1.6": { + "sha512": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==", + "type": "package", + "path": "sqlitepclraw.lib.e_sqlite3/2.1.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "buildTransitive/net461/SQLitePCLRaw.lib.e_sqlite3.targets", + "buildTransitive/net6.0/SQLitePCLRaw.lib.e_sqlite3.targets", + "buildTransitive/net7.0/SQLitePCLRaw.lib.e_sqlite3.targets", + "buildTransitive/net8.0/SQLitePCLRaw.lib.e_sqlite3.targets", + "lib/net461/_._", + "lib/netstandard2.0/_._", + "runtimes/browser-wasm/nativeassets/net6.0/e_sqlite3.a", + "runtimes/browser-wasm/nativeassets/net7.0/e_sqlite3.a", + "runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a", + "runtimes/linux-arm/native/libe_sqlite3.so", + "runtimes/linux-arm64/native/libe_sqlite3.so", + "runtimes/linux-armel/native/libe_sqlite3.so", + "runtimes/linux-mips64/native/libe_sqlite3.so", + "runtimes/linux-musl-arm/native/libe_sqlite3.so", + "runtimes/linux-musl-arm64/native/libe_sqlite3.so", + "runtimes/linux-musl-x64/native/libe_sqlite3.so", + "runtimes/linux-ppc64le/native/libe_sqlite3.so", + "runtimes/linux-s390x/native/libe_sqlite3.so", + "runtimes/linux-x64/native/libe_sqlite3.so", + "runtimes/linux-x86/native/libe_sqlite3.so", + "runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib", + "runtimes/maccatalyst-x64/native/libe_sqlite3.dylib", + "runtimes/osx-arm64/native/libe_sqlite3.dylib", + "runtimes/osx-x64/native/libe_sqlite3.dylib", + "runtimes/win-arm/native/e_sqlite3.dll", + "runtimes/win-arm64/native/e_sqlite3.dll", + "runtimes/win-x64/native/e_sqlite3.dll", + "runtimes/win-x86/native/e_sqlite3.dll", + "runtimes/win10-arm/nativeassets/uap10.0/e_sqlite3.dll", + "runtimes/win10-arm64/nativeassets/uap10.0/e_sqlite3.dll", + "runtimes/win10-x64/nativeassets/uap10.0/e_sqlite3.dll", + "runtimes/win10-x86/nativeassets/uap10.0/e_sqlite3.dll", + "sqlitepclraw.lib.e_sqlite3.2.1.6.nupkg.sha512", + "sqlitepclraw.lib.e_sqlite3.nuspec" + ] + }, + "SQLitePCLRaw.provider.e_sqlite3/2.1.6": { + "sha512": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", + "type": "package", + "path": "sqlitepclraw.provider.e_sqlite3/2.1.6", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll", + "lib/net6.0/SQLitePCLRaw.provider.e_sqlite3.dll", + "lib/netstandard2.0/SQLitePCLRaw.provider.e_sqlite3.dll", + "sqlitepclraw.provider.e_sqlite3.2.1.6.nupkg.sha512", + "sqlitepclraw.provider.e_sqlite3.nuspec" + ] + }, + "System.Diagnostics.EventLog/8.0.1": { + "sha512": "n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==", + "type": "package", + "path": "system.diagnostics.eventlog/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Diagnostics.EventLog.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Diagnostics.EventLog.targets", + "lib/net462/System.Diagnostics.EventLog.dll", + "lib/net462/System.Diagnostics.EventLog.xml", + "lib/net6.0/System.Diagnostics.EventLog.dll", + "lib/net6.0/System.Diagnostics.EventLog.xml", + "lib/net7.0/System.Diagnostics.EventLog.dll", + "lib/net7.0/System.Diagnostics.EventLog.xml", + "lib/net8.0/System.Diagnostics.EventLog.dll", + "lib/net8.0/System.Diagnostics.EventLog.xml", + "lib/netstandard2.0/System.Diagnostics.EventLog.dll", + "lib/netstandard2.0/System.Diagnostics.EventLog.xml", + "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.Messages.dll", + "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.dll", + "runtimes/win/lib/net6.0/System.Diagnostics.EventLog.xml", + "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.Messages.dll", + "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.dll", + "runtimes/win/lib/net7.0/System.Diagnostics.EventLog.xml", + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.Messages.dll", + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll", + "runtimes/win/lib/net8.0/System.Diagnostics.EventLog.xml", + "system.diagnostics.eventlog.8.0.1.nupkg.sha512", + "system.diagnostics.eventlog.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.IO.Packaging/8.0.1": { + "sha512": "KYkIOAvPexQOLDxPO2g0BVoWInnQhPpkFzRqvNrNrMhVT6kqhVr0zEb6KCHlptLFukxnZrjuMVAnxK7pOGUYrw==", + "type": "package", + "path": "system.io.packaging/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.IO.Packaging.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.IO.Packaging.targets", + "lib/net462/System.IO.Packaging.dll", + "lib/net462/System.IO.Packaging.xml", + "lib/net6.0/System.IO.Packaging.dll", + "lib/net6.0/System.IO.Packaging.xml", + "lib/net7.0/System.IO.Packaging.dll", + "lib/net7.0/System.IO.Packaging.xml", + "lib/net8.0/System.IO.Packaging.dll", + "lib/net8.0/System.IO.Packaging.xml", + "lib/netstandard2.0/System.IO.Packaging.dll", + "lib/netstandard2.0/System.IO.Packaging.xml", + "system.io.packaging.8.0.1.nupkg.sha512", + "system.io.packaging.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.Memory/4.5.3": { + "sha512": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==", + "type": "package", + "path": "system.memory/4.5.3", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netcoreapp2.1/_._", + "lib/netstandard1.1/System.Memory.dll", + "lib/netstandard1.1/System.Memory.xml", + "lib/netstandard2.0/System.Memory.dll", + "lib/netstandard2.0/System.Memory.xml", + "ref/netcoreapp2.1/_._", + "system.memory.4.5.3.nupkg.sha512", + "system.memory.nuspec", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "System.Security.Cryptography.ProtectedData/8.0.0": { + "sha512": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==", + "type": "package", + "path": "system.security.cryptography.protecteddata/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Security.Cryptography.ProtectedData.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Security.Cryptography.ProtectedData.targets", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net462/System.Security.Cryptography.ProtectedData.dll", + "lib/net462/System.Security.Cryptography.ProtectedData.xml", + "lib/net6.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net6.0/System.Security.Cryptography.ProtectedData.xml", + "lib/net7.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net7.0/System.Security.Cryptography.ProtectedData.xml", + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net8.0/System.Security.Cryptography.ProtectedData.xml", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "system.security.cryptography.protecteddata.8.0.0.nupkg.sha512", + "system.security.cryptography.protecteddata.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "System.ServiceProcess.ServiceController/8.0.1": { + "sha512": "02I0BXo1kmMBgw03E8Hu4K6nTqur4wpQdcDZrndczPzY2fEoGvlinE35AWbyzLZ2h2IksEZ6an4tVt3hi9j1oA==", + "type": "package", + "path": "system.serviceprocess.servicecontroller/8.0.1", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.ServiceProcess.ServiceController.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.ServiceProcess.ServiceController.targets", + "lib/net462/System.ServiceProcess.ServiceController.dll", + "lib/net462/System.ServiceProcess.ServiceController.xml", + "lib/net6.0/System.ServiceProcess.ServiceController.dll", + "lib/net6.0/System.ServiceProcess.ServiceController.xml", + "lib/net7.0/System.ServiceProcess.ServiceController.dll", + "lib/net7.0/System.ServiceProcess.ServiceController.xml", + "lib/net8.0/System.ServiceProcess.ServiceController.dll", + "lib/net8.0/System.ServiceProcess.ServiceController.xml", + "lib/netstandard2.0/System.ServiceProcess.ServiceController.dll", + "lib/netstandard2.0/System.ServiceProcess.ServiceController.xml", + "runtimes/win/lib/net6.0/System.ServiceProcess.ServiceController.dll", + "runtimes/win/lib/net6.0/System.ServiceProcess.ServiceController.xml", + "runtimes/win/lib/net7.0/System.ServiceProcess.ServiceController.dll", + "runtimes/win/lib/net7.0/System.ServiceProcess.ServiceController.xml", + "runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll", + "runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.xml", + "system.serviceprocess.servicecontroller.8.0.1.nupkg.sha512", + "system.serviceprocess.servicecontroller.nuspec", + "useSharedDesignerContext.txt" + ] + }, + "UglyToad.PdfPig/1.7.0-custom-5": { + "sha512": "mddnoBg+XV5YZJg+lp/LlXQ9NY9/oV/MoNjLbbLHw0uTymfyuinVePQB4ff/ELRv3s6n0G7h8q3Ycb3KYg+hgQ==", + "type": "package", + "path": "uglytoad.pdfpig/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net451/UglyToad.PdfPig.dll", + "lib/net451/UglyToad.PdfPig.xml", + "lib/net452/UglyToad.PdfPig.dll", + "lib/net452/UglyToad.PdfPig.xml", + "lib/net46/UglyToad.PdfPig.dll", + "lib/net46/UglyToad.PdfPig.xml", + "lib/net461/UglyToad.PdfPig.dll", + "lib/net461/UglyToad.PdfPig.xml", + "lib/net462/UglyToad.PdfPig.dll", + "lib/net462/UglyToad.PdfPig.xml", + "lib/net47/UglyToad.PdfPig.dll", + "lib/net47/UglyToad.PdfPig.xml", + "lib/net6.0/UglyToad.PdfPig.dll", + "lib/net6.0/UglyToad.PdfPig.xml", + "lib/netstandard2.0/UglyToad.PdfPig.dll", + "lib/netstandard2.0/UglyToad.PdfPig.xml", + "uglytoad.pdfpig.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.nuspec" + ] + }, + "UglyToad.PdfPig.Core/1.7.0-custom-5": { + "sha512": "bChQUAYApM6/vgBis0+fBTZyAVqjXdqshjZDCgI3dgwUplfLJxXRrnkCOdNj0a6JNcF32R4aLpnGpTc9QmmVmg==", + "type": "package", + "path": "uglytoad.pdfpig.core/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net451/UglyToad.PdfPig.Core.dll", + "lib/net451/UglyToad.PdfPig.Core.xml", + "lib/net452/UglyToad.PdfPig.Core.dll", + "lib/net452/UglyToad.PdfPig.Core.xml", + "lib/net46/UglyToad.PdfPig.Core.dll", + "lib/net46/UglyToad.PdfPig.Core.xml", + "lib/net461/UglyToad.PdfPig.Core.dll", + "lib/net461/UglyToad.PdfPig.Core.xml", + "lib/net462/UglyToad.PdfPig.Core.dll", + "lib/net462/UglyToad.PdfPig.Core.xml", + "lib/net47/UglyToad.PdfPig.Core.dll", + "lib/net47/UglyToad.PdfPig.Core.xml", + "lib/net6.0/UglyToad.PdfPig.Core.dll", + "lib/net6.0/UglyToad.PdfPig.Core.xml", + "lib/netstandard2.0/UglyToad.PdfPig.Core.dll", + "lib/netstandard2.0/UglyToad.PdfPig.Core.xml", + "uglytoad.pdfpig.core.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.core.nuspec" + ] + }, + "UglyToad.PdfPig.Fonts/1.7.0-custom-5": { + "sha512": "Z6SBBAIL8wRkJNhXGYaz0CrHnNrNeuNtmwRbBtQUA1b3TDhRQppOmHCIuhjb6Vu/Rirp6FIOtzAU1lXsGik90w==", + "type": "package", + "path": "uglytoad.pdfpig.fonts/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "content/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net451/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net452/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net46/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net461/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net462/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net47/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/net6.0/Resources/AdobeFontMetrics/MustRead.html", + "contentFiles/any/netstandard2.0/Resources/AdobeFontMetrics/MustRead.html", + "lib/net451/UglyToad.PdfPig.Fonts.dll", + "lib/net451/UglyToad.PdfPig.Fonts.xml", + "lib/net452/UglyToad.PdfPig.Fonts.dll", + "lib/net452/UglyToad.PdfPig.Fonts.xml", + "lib/net46/UglyToad.PdfPig.Fonts.dll", + "lib/net46/UglyToad.PdfPig.Fonts.xml", + "lib/net461/UglyToad.PdfPig.Fonts.dll", + "lib/net461/UglyToad.PdfPig.Fonts.xml", + "lib/net462/UglyToad.PdfPig.Fonts.dll", + "lib/net462/UglyToad.PdfPig.Fonts.xml", + "lib/net47/UglyToad.PdfPig.Fonts.dll", + "lib/net47/UglyToad.PdfPig.Fonts.xml", + "lib/net6.0/UglyToad.PdfPig.Fonts.dll", + "lib/net6.0/UglyToad.PdfPig.Fonts.xml", + "lib/netstandard2.0/UglyToad.PdfPig.Fonts.dll", + "lib/netstandard2.0/UglyToad.PdfPig.Fonts.xml", + "uglytoad.pdfpig.fonts.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.fonts.nuspec" + ] + }, + "UglyToad.PdfPig.Tokenization/1.7.0-custom-5": { + "sha512": "U8VVH7VJjv6czP7qWyzDq6CRaiJQe7/sESUCL8H3kiEa3zi0l9TonIKlD/YidQ5DlgTumracii6zjLyKPEFKwA==", + "type": "package", + "path": "uglytoad.pdfpig.tokenization/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net451/UglyToad.PdfPig.Tokenization.dll", + "lib/net451/UglyToad.PdfPig.Tokenization.xml", + "lib/net452/UglyToad.PdfPig.Tokenization.dll", + "lib/net452/UglyToad.PdfPig.Tokenization.xml", + "lib/net46/UglyToad.PdfPig.Tokenization.dll", + "lib/net46/UglyToad.PdfPig.Tokenization.xml", + "lib/net461/UglyToad.PdfPig.Tokenization.dll", + "lib/net461/UglyToad.PdfPig.Tokenization.xml", + "lib/net462/UglyToad.PdfPig.Tokenization.dll", + "lib/net462/UglyToad.PdfPig.Tokenization.xml", + "lib/net47/UglyToad.PdfPig.Tokenization.dll", + "lib/net47/UglyToad.PdfPig.Tokenization.xml", + "lib/net6.0/UglyToad.PdfPig.Tokenization.dll", + "lib/net6.0/UglyToad.PdfPig.Tokenization.xml", + "lib/netstandard2.0/UglyToad.PdfPig.Tokenization.dll", + "lib/netstandard2.0/UglyToad.PdfPig.Tokenization.xml", + "uglytoad.pdfpig.tokenization.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.tokenization.nuspec" + ] + }, + "UglyToad.PdfPig.Tokens/1.7.0-custom-5": { + "sha512": "m/j5RVfL4eF/OwX6ASprzK+yzD3l7xdgQ7zQPgENhjxfuXD+hj6FSeZlmxSTt9ywvWcTCjGKAILl9XTK9iQgCQ==", + "type": "package", + "path": "uglytoad.pdfpig.tokens/1.7.0-custom-5", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "lib/net451/UglyToad.PdfPig.Tokens.dll", + "lib/net451/UglyToad.PdfPig.Tokens.xml", + "lib/net452/UglyToad.PdfPig.Tokens.dll", + "lib/net452/UglyToad.PdfPig.Tokens.xml", + "lib/net46/UglyToad.PdfPig.Tokens.dll", + "lib/net46/UglyToad.PdfPig.Tokens.xml", + "lib/net461/UglyToad.PdfPig.Tokens.dll", + "lib/net461/UglyToad.PdfPig.Tokens.xml", + "lib/net462/UglyToad.PdfPig.Tokens.dll", + "lib/net462/UglyToad.PdfPig.Tokens.xml", + "lib/net47/UglyToad.PdfPig.Tokens.dll", + "lib/net47/UglyToad.PdfPig.Tokens.xml", + "lib/net6.0/UglyToad.PdfPig.Tokens.dll", + "lib/net6.0/UglyToad.PdfPig.Tokens.xml", + "lib/netstandard2.0/UglyToad.PdfPig.Tokens.dll", + "lib/netstandard2.0/UglyToad.PdfPig.Tokens.xml", + "uglytoad.pdfpig.tokens.1.7.0-custom-5.nupkg.sha512", + "uglytoad.pdfpig.tokens.nuspec" + ] + }, + "AxCopilot.SDK/1.0.0": { + "type": "project", + "path": "../AxCopilot.SDK/AxCopilot.SDK.csproj", + "msbuildProject": "../AxCopilot.SDK/AxCopilot.SDK.csproj" + } + }, + "projectFileDependencyGroups": { + "net8.0-windows7.0": [ + "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.Security.Cryptography.ProtectedData >= 8.0.0", + "System.ServiceProcess.ServiceController >= 8.0.1", + "UglyToad.PdfPig >= 1.7.0-custom-5" + ] + }, + "packageFolders": { + "C:\\Users\\admin\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.8.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "projectName": "AxCopilot", + "projectPath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxCopilot\\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": { + "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": { + "projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net8.0-windows7.0": { + "targetAlias": "net8.0-windows", + "dependencies": { + "DocumentFormat.OpenXml": { + "target": "Package", + "version": "[3.2.0, )" + }, + "Markdig": { + "target": "Package", + "version": "[0.37.0, )" + }, + "Microsoft.Data.Sqlite": { + "target": "Package", + "version": "[8.0.0, )" + }, + "Microsoft.Web.WebView2": { + "target": "Package", + "version": "[1.0.2903.40, )" + }, + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + }, + "System.ServiceProcess.ServiceController": { + "target": "Package", + "version": "[8.0.1, )" + }, + "UglyToad.PdfPig": { + "target": "Package", + "version": "[1.7.0-custom-5, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "win-x64": { + "#import": [] + } + } + } +} \ No newline at end of file diff --git a/src/AxCopilot/obj/project.nuget.cache b/src/AxCopilot/obj/project.nuget.cache new file mode 100644 index 0000000..bef29ea --- /dev/null +++ b/src/AxCopilot/obj/project.nuget.cache @@ -0,0 +1,29 @@ +{ + "version": 2, + "dgSpecHash": "9B9m2ag5uzw=", + "success": true, + "projectFilePath": "E:\\AX Copilot\\src\\AxCopilot\\AxCopilot.csproj", + "expectedPackageFiles": [ + "C:\\Users\\admin\\.nuget\\packages\\documentformat.openxml\\3.2.0\\documentformat.openxml.3.2.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\documentformat.openxml.framework\\3.2.0\\documentformat.openxml.framework.3.2.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\markdig\\0.37.0\\markdig.0.37.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.data.sqlite\\8.0.0\\microsoft.data.sqlite.8.0.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.data.sqlite.core\\8.0.0\\microsoft.data.sqlite.core.8.0.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\microsoft.web.webview2\\1.0.2903.40\\microsoft.web.webview2.1.0.2903.40.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\sqlitepclraw.bundle_e_sqlite3\\2.1.6\\sqlitepclraw.bundle_e_sqlite3.2.1.6.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\sqlitepclraw.core\\2.1.6\\sqlitepclraw.core.2.1.6.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\sqlitepclraw.lib.e_sqlite3\\2.1.6\\sqlitepclraw.lib.e_sqlite3.2.1.6.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\sqlitepclraw.provider.e_sqlite3\\2.1.6\\sqlitepclraw.provider.e_sqlite3.2.1.6.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.diagnostics.eventlog\\8.0.1\\system.diagnostics.eventlog.8.0.1.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.io.packaging\\8.0.1\\system.io.packaging.8.0.1.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.memory\\4.5.3\\system.memory.4.5.3.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.security.cryptography.protecteddata\\8.0.0\\system.security.cryptography.protecteddata.8.0.0.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\system.serviceprocess.servicecontroller\\8.0.1\\system.serviceprocess.servicecontroller.8.0.1.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig\\1.7.0-custom-5\\uglytoad.pdfpig.1.7.0-custom-5.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig.core\\1.7.0-custom-5\\uglytoad.pdfpig.core.1.7.0-custom-5.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig.fonts\\1.7.0-custom-5\\uglytoad.pdfpig.fonts.1.7.0-custom-5.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig.tokenization\\1.7.0-custom-5\\uglytoad.pdfpig.tokenization.1.7.0-custom-5.nupkg.sha512", + "C:\\Users\\admin\\.nuget\\packages\\uglytoad.pdfpig.tokens\\1.7.0-custom-5\\uglytoad.pdfpig.tokens.1.7.0-custom-5.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/src/AxCopilot/skills/adr-writer.skill.md b/src/AxCopilot/skills/adr-writer.skill.md new file mode 100644 index 0000000..e746d27 --- /dev/null +++ b/src/AxCopilot/skills/adr-writer.skill.md @@ -0,0 +1,95 @@ +--- +name: adr-writer +label: 아키텍처 결정 기록 (ADR) +description: 아키텍처 결정 사항을 표준 ADR 형식으로 문서화합니다. +icon: \uE82D +allowed-tools: + - file_read + - file_write + - folder_map + - grep + - search_codebase +tabs: code +--- + +아키텍처 결정 사항을 ADR(Architecture Decision Record) 형식으로 문서화하세요. + +## ADR이란? +소프트웨어 아키텍처에서 내린 중요한 결정의 배경, 대안, 근거를 기록하는 경량 문서입니다. +미래의 팀원이 "왜 이렇게 결정했는지"를 이해할 수 있게 합니다. + +## 워크플로우 + +1. **결정 사항 확인**: 사용자에게 다음을 파악 + - 어떤 결정을 내렸는가 (또는 내려야 하는가) + - 관련 코드/시스템 영역 + - 고려한 대안들 +2. **코드 분석** (선택): 관련 코드 구조를 읽어 현재 상태 파악 +3. **ADR 작성**: 표준 형식으로 문서 생성 +4. **파일 저장**: `docs/adr/` 폴더에 번호 형식으로 저장 + +## ADR 표준 형식 + +```markdown +# ADR-[번호]: [결정 제목] + +**상태**: 제안됨 | 승인됨 | 폐기됨 | 대체됨 +**날짜**: YYYY-MM-DD +**결정자**: [이름/팀] + +## 맥락 (Context) +어떤 상황에서 이 결정이 필요한가? +- 기술적 배경 +- 비즈니스 요구사항 +- 제약 조건 + +## 결정 (Decision) +무엇을 결정했는가? +- 선택한 방안의 구체적 내용 +- 적용 범위 + +## 대안 (Alternatives) + +### 대안 1: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +### 대안 2: [이름] +- 장점: ... +- 단점: ... +- 비용/복잡도: ... + +## 근거 (Rationale) +왜 이 결정을 선택했는가? +- 대안 대비 장점 +- 트레이드오프 분석 +- 참고 자료/벤치마크 + +## 결과 (Consequences) + +### 긍정적 +- ... + +### 부정적 +- ... + +### 리스크 +- ... + +## 관련 문서 +- ADR-[관련번호]: [제목] +- [외부 참고 링크] +``` + +## 파일 명명 규칙 +- 위치: `docs/adr/` (없으면 생성) +- 파일명: `ADR-NNNN-제목-요약.md` (예: `ADR-0001-데이터베이스-선택.md`) +- 번호: 기존 ADR 파일 조회 후 자동 부여 + +## 규칙 +- 결정의 "왜"를 중심으로 작성 (코드를 읽으면 "무엇"은 알 수 있음) +- 대안은 최소 2개 이상 제시 +- 트레이드오프를 솔직하게 기록 (완벽한 선택은 없음) +- 짧고 명확하게 (1~2페이지 이내) +- 한국어로 작성 diff --git a/src/AxCopilot/skills/api-docs.skill.md b/src/AxCopilot/skills/api-docs.skill.md new file mode 100644 index 0000000..dc8c12e --- /dev/null +++ b/src/AxCopilot/skills/api-docs.skill.md @@ -0,0 +1,53 @@ +--- +name: api-docs +label: API 문서 생성 +description: 코드에서 API 엔드포인트를 분석하여 마크다운/HTML API 문서를 자동 생성합니다. +icon: \uE8A1 +tabs: code +--- + +작업 폴더의 소스 코드를 분석하여 API 문서를 생성하세요. + +## 분석 대상 +- REST API 엔드포인트 (Controller, Route 어노테이션) +- 함수/메서드 시그니처 및 주석 +- 요청/응답 모델 (DTO, Schema) +- 인증/권한 요구사항 + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — API 엔드포인트 패턴 검색 (`[HttpGet]`, `@GetMapping`, `router.get`, `@app.route` 등) +3. `file_read` — 컨트롤러/라우터 파일 분석 +4. `grep_tool` — 요청/응답 모델 클래스 검색 +5. `file_read` — 모델 구조 분석 +6. `file_write` — API 문서 생성 + +## 출력 형식 +마크다운으로 작성하되 다음 구조를 따르세요: + +``` +# API 문서 + +## 개요 +- Base URL, 인증 방식, 공통 헤더 + +## 엔드포인트 + +### [POST] /api/users +- **설명**: 사용자 생성 +- **인증**: Bearer Token 필요 +- **요청 본문**: + | 필드 | 타입 | 필수 | 설명 | + |------|------|------|------| + | name | string | ✓ | 사용자 이름 | +- **응답**: 201 Created + ```json + { "id": 1, "name": "..." } + ``` +- **에러 코드**: 400, 401, 409 +``` + +## 주의사항 +- 코드에서 실제 확인된 내용만 문서화하세요. 추측하지 마세요. +- 주석이나 Swagger/OpenAPI 어노테이션이 있으면 우선 활용하세요. +- 인증, 페이징, 에러 처리 등 공통 패턴은 별도 섹션으로 정리하세요. diff --git a/src/AxCopilot/skills/batch-rename.skill.md b/src/AxCopilot/skills/batch-rename.skill.md new file mode 100644 index 0000000..0598dbc --- /dev/null +++ b/src/AxCopilot/skills/batch-rename.skill.md @@ -0,0 +1,70 @@ +--- +name: batch-rename +label: 파일 일괄 이름 변경 +description: 패턴 매칭, 번호 붙이기, 날짜 추가 등 파일 이름을 일괄 변경합니다. +icon: \uE8AC +tabs: cowork +allowed-tools: + - folder_map + - file_read + - file_manage + - clipboard_tool +--- + +파일 이름을 규칙에 따라 일괄 변경하세요. 변경 전 반드시 미리보기를 제공합니다. + +## 작업 절차 + +1. **대상 파일 스캔**: folder_map으로 작업 폴더의 파일 목록을 수집 +2. **이름 변경 규칙 확인**: 사용자에게 다음 옵션을 확인 + - 대상 파일 필터 (확장자, 이름 패턴) + - 변경 규칙 (아래 지원 규칙 참조) + - 적용 순서 (이름순, 날짜순, 크기순) +3. **변경 미리보기 생성**: 변경 전/후 이름을 표로 표시 + ``` + | # | 현재 이름 | 변경 후 이름 | + |---|----------------------|----------------------| + | 1 | IMG_20260101_001.jpg | 2026-01-01_001.jpg | + | 2 | IMG_20260101_002.jpg | 2026-01-01_002.jpg | + ``` +4. **사용자 확인**: 미리보기를 보여주고 진행 여부를 확인 +5. **일괄 변경 실행**: file_manage로 파일 이름을 순차 변경 +6. **결과 보고**: 변경 성공/실패 건수와 상세 내역을 안내 + +## 지원 이름 변경 규칙 + +### 패턴 치환 +- **문자열 치환**: "IMG_" → "사진_" +- **정규식 치환**: `(\d{4})(\d{2})(\d{2})` → `$1-$2-$3` +- **대소문자 변환**: 소문자, 대문자, 타이틀 케이스 + +### 번호 붙이기 +- **순번 추가**: `문서_001.pdf`, `문서_002.pdf`, ... +- **시작 번호**: 사용자 지정 (기본: 1) +- **자릿수**: 자동 계산 (파일 수 기준) +- **위치**: 접두사 또는 접미사 + +### 날짜 추가 +- **오늘 날짜**: `보고서_2026-03-30.docx` +- **파일 수정일**: 파일의 실제 수정 날짜 사용 +- **날짜 형식**: YYYY-MM-DD, YYYYMMDD, YY.MM.DD + +### 정리 +- **공백 처리**: 공백 → 언더스코어/하이픈 +- **특수문자 제거**: 파일명에서 특수문자 제거 +- **확장자 변경**: `.jpeg` → `.jpg` +- **접두사/접미사 추가 또는 제거** + +## 충돌 처리 +- 변경 후 이름이 이미 존재하면 자동으로 번호 추가 (`_1`, `_2`) +- 충돌 건은 미리보기에서 ⚠️ 표시로 경고 +- 원본 파일 덮어쓰기 절대 금지 + +## 규칙 +- **미리보기 없이 직접 변경하지 않음** — 반드시 미리보기 후 사용자 확인 +- 하위 폴더 포함 여부는 사용자에게 확인 +- 숨김 파일(.으로 시작)은 기본 제외 +- 변경 실패 시 이미 변경된 파일은 원복하지 않으므로, 중요한 경우 백업 권장 +- 한 번에 1,000개 이상의 파일 변경 시 경고 + +한국어로 안내하세요. diff --git a/src/AxCopilot/skills/changelog.skill.md b/src/AxCopilot/skills/changelog.skill.md new file mode 100644 index 0000000..a40539b --- /dev/null +++ b/src/AxCopilot/skills/changelog.skill.md @@ -0,0 +1,74 @@ +--- +name: changelog +label: 변경 이력 / 릴리즈 노트 +description: Git 커밋 이력에서 자동으로 변경 이력과 릴리즈 노트를 생성합니다. +icon: \uE81C +allowed-tools: + - git_tool + - file_read + - file_write + - html_create + - text_summarize +tabs: code +--- + +Git 커밋 이력을 분석하여 변경 이력(CHANGELOG) 또는 릴리즈 노트를 생성하세요. + +## 워크플로우 + +1. **이력 조회**: git_tool로 커밋 로그 수집 + - 지정 기간 또는 태그 간 커밋 + - 커밋 메시지 + 변경 파일 목록 +2. **분류**: 커밋을 Conventional Commits 기준으로 분류 +3. **Breaking Change 감지**: 시그니처 변경, API 삭제 등 감지 +4. **문서 생성**: Markdown 또는 HTML로 출력 + +## Conventional Commits 분류 + +| 접두사 | 분류 | 설명 | +|--------|------|------| +| feat | ✨ 신기능 | 새로운 기능 추가 | +| fix | 🐛 버그 수정 | 버그 수정 | +| docs | 📝 문서 | 문서 변경 | +| style | 💄 스타일 | 코드 포맷팅 (동작 변경 없음) | +| refactor | ♻️ 리팩토링 | 코드 리팩토링 | +| perf | ⚡ 성능 | 성능 개선 | +| test | ✅ 테스트 | 테스트 추가/수정 | +| chore | 🔧 기타 | 빌드, 설정 변경 | +| BREAKING | 💥 Breaking | 하위 호환성 깨지는 변경 | + +## 출력 형식 + +### CHANGELOG.md +```markdown +# Changelog + +## [1.6.0] - 2026-03-30 + +### ✨ 신기능 +- 멀티패스 문서 생성 엔진 (#123) +- PPT 네이티브 생성 도구 + +### 🐛 버그 수정 +- 탭 전환 시 대화 유실 문제 해결 + +### 💥 Breaking Changes +- 없음 + +### 📝 문서 +- 개발자 가이드 v1.6.0 업데이트 +``` + +### 릴리즈 노트 (HTML) +사용자 친화적인 형식: +- 주요 변경사항 (스크린샷 포함 가능) +- 개선 사항 +- 알려진 이슈 +- 업그레이드 가이드 + +## 규칙 +- Conventional Commits 형식이 아닌 커밋도 내용 분석으로 분류 +- 중복/사소한 커밋은 병합하여 요약 +- Breaking Change는 반드시 별도 섹션으로 강조 +- 이슈 번호가 있으면 링크 포함 +- 한국어로 작성 diff --git a/src/AxCopilot/skills/code-scaffold.skill.md b/src/AxCopilot/skills/code-scaffold.skill.md new file mode 100644 index 0000000..35e4a74 --- /dev/null +++ b/src/AxCopilot/skills/code-scaffold.skill.md @@ -0,0 +1,31 @@ +--- +name: code-scaffold +label: 코드 스캐폴딩 +description: 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 자동 생성합니다. +icon: \uE943 +tabs: code +--- + +작업 폴더의 프로젝트 구조를 분석하고 새 기능의 코드 뼈대를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 프로젝트 구조 파악 +2. file_read — 기존 코드 패턴 분석 +3. grep_tool — 코딩 컨벤션 확인 +4. file_write — 새 파일 생성 + +작업 순서: +1. 프로젝트 타입 감지 (언어, 프레임워크, 빌드 시스템) +2. 기존 코드 패턴 분석 (네이밍, 폴더 구조, 임포트 스타일) +3. 사용자 요청에 맞는 코드 뼈대 생성 + +생성 항목: +- 클래스/모듈 파일 (프로젝트 컨벤션에 맞춰) +- 인터페이스/타입 정의 +- 단위 테스트 파일 +- 필요한 설정/구성 파일 + +규칙: +- 기존 프로젝트의 코딩 스타일을 따르세요 +- TODO 주석으로 구현이 필요한 부분을 표시하세요 +- 한국어 주석을 추가하세요 diff --git a/src/AxCopilot/skills/commit-review.skill.md b/src/AxCopilot/skills/commit-review.skill.md new file mode 100644 index 0000000..0f8663b --- /dev/null +++ b/src/AxCopilot/skills/commit-review.skill.md @@ -0,0 +1,67 @@ +--- +name: commit-review +label: 커밋 메시지 리뷰 +description: Git 커밋 메시지를 Conventional Commits 기준으로 검토하고 개선을 제안합니다. +icon: \uE8CB +tabs: code +--- + +작업 폴더의 최근 Git 커밋 메시지를 검토하고 개선안을 제시하세요. + +## 작업 절차 +1. `process_run` — `git log --oneline -20` 으로 최근 커밋 목록 확인 +2. `process_run` — `git log --format="%H%n%s%n%b%n---" -10` 으로 상세 메시지 확인 +3. `process_run` — `git diff HEAD~1` 으로 최신 커밋 변경 내용 확인 (필요 시) +4. 각 커밋을 Conventional Commits 기준으로 분석 +5. 결과를 정리하여 출력 + +## Conventional Commits 규칙 +``` +[optional scope]: + +[optional body] + +[optional footer(s)] +``` + +### type 종류 +- `feat`: 새 기능 +- `fix`: 버그 수정 +- `docs`: 문서 변경 +- `style`: 포맷팅 (코드 동작 변경 없음) +- `refactor`: 리팩토링 +- `perf`: 성능 개선 +- `test`: 테스트 추가/수정 +- `chore`: 빌드/도구 설정 +- `ci`: CI 설정 변경 + +## 검토 항목 +1. **type 적절성**: 변경 내용과 type이 일치하는가 +2. **설명 품질**: 50자 이내, 명령형, 명확한 내용 +3. **본문 유무**: 복잡한 변경에 "왜" 설명이 있는가 +4. **일관성**: 팀 내 커밋 스타일이 통일되어 있는가 +5. **Breaking Change**: BREAKING CHANGE 푸터 또는 ! 표기 + +## 출력 형식 +``` +## 커밋 메시지 리뷰 결과 + +### 전체 요약 +- 검토 커밋: N개 +- 규칙 준수: N개 ✓ / 위반: N개 ✗ + +### 개별 리뷰 + +#### abc1234 "Fix login bug" +- ❌ type 없음 → `fix: resolve login authentication failure` +- ❌ 본문 없음 → 원인과 해결 방법 추가 권장 + +#### def5678 "feat: add user profile page" +- ✅ Conventional Commits 준수 +- 💡 scope 추가 권장: `feat(profile): add user profile page` +``` + +## 주의사항 +- 비판이 아닌 건설적 제안을 하세요. +- 팀의 기존 컨벤션이 있으면 그것을 우선 존중하세요. +- 개선된 메시지 예시를 항상 함께 제시하세요. diff --git a/src/AxCopilot/skills/compare.skill.md b/src/AxCopilot/skills/compare.skill.md new file mode 100644 index 0000000..6538dd7 --- /dev/null +++ b/src/AxCopilot/skills/compare.skill.md @@ -0,0 +1,51 @@ +--- +name: compare +label: 비교 분석표 +description: 2개 이상 항목의 비교 분석 매트릭스를 생성합니다. +icon: \uE9D5 +allowed-tools: + - html_create + - excel_create + - file_read + - document_read + - chart_create +tabs: all +--- + +사용자가 요청한 항목들을 체계적으로 비교 분석하는 매트릭스를 생성하세요. + +## 워크플로우 + +1. **비교 대상 확인**: 어떤 항목들을 비교할지 파악 + - 제품, 기술, 방안, 서비스, 도구, 프레임워크 등 +2. **비교 기준 설정**: 적절한 비교 축을 설계 + - 기능, 가격, 성능, 사용성, 확장성, 지원, 보안 등 +3. **데이터 수집**: 참고 파일이 있으면 읽어서 반영 +4. **분석표 생성**: HTML 또는 Excel로 비교 매트릭스 생성 +5. **종합 평가**: 총평 + 추천 의견 제시 + +## 비교표 구성 + +### 기본 매트릭스 +| 기준 | 항목 A | 항목 B | 항목 C | +|------|--------|--------|--------| +| 기능1 | ✅ 지원 | ⚠ 일부 | ❌ 미지원 | +| 기능2 | ... | ... | ... | + +### 점수 비교 (radar 차트 활용) +- 각 항목을 1~10점으로 정량화 +- chart_create로 레이더 차트 또는 바 차트 시각화 + +### 종합 평가 +- 장점/단점 요약 +- 상황별 추천 (예: "예산이 제한적이면 A, 확장성이 중요하면 B") + +## 출력 형식 +- **HTML** (권장): 색상 배지, 차트 포함 비주얼 보고서 +- **Excel**: 정량 데이터 + 수식 기반 점수표 + +## 규칙 +- 객관적 사실 기반으로 비교 (주관적 판단은 별도 섹션) +- 각 항목의 강점과 약점을 균형 있게 서술 +- 출처/근거가 있으면 명시 +- 한국어로 작성 diff --git a/src/AxCopilot/skills/csv-to-xlsx.skill.md b/src/AxCopilot/skills/csv-to-xlsx.skill.md new file mode 100644 index 0000000..fb819ac --- /dev/null +++ b/src/AxCopilot/skills/csv-to-xlsx.skill.md @@ -0,0 +1,125 @@ +--- +name: csv-to-xlsx +label: CSV → Excel 변환 +description: CSV 파일을 서식이 완성된 Excel(.xlsx)로 변환합니다. 헤더 고정, 필터, 조건부 서식, 자동 열 너비를 적용합니다. +icon: \uE9F9 +tabs: cowork +requires: python +--- + +CSV 파일을 전문적인 서식이 적용된 Excel 파일로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install openpyxl pandas +``` + +## 작업 절차 + +1. **파일 확인**: folder_map으로 작업 폴더에서 CSV 파일을 탐색 +2. **CSV 분석**: file_read로 CSV 파일의 구조(컬럼, 행 수, 인코딩, 구분자) 파악 +3. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 헤더 행 고정 여부 (기본: 활성) + - 자동 필터 적용 여부 (기본: 활성) + - 조건부 서식 대상 컬럼 (숫자 컬럼 자동 감지) + - 시트 이름 (기본: 파일명) +4. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +5. **스크립트 실행**: process_run으로 Python 스크립트 실행 +6. **결과 확인**: 생성된 .xlsx 파일 경로와 요약 정보를 안내 + +## Python 스크립트 템플릿 +```python +import pandas as pd +from openpyxl import load_workbook +from openpyxl.styles import Font, PatternFill, Alignment, Border, Side +from openpyxl.utils import get_column_letter +from openpyxl.formatting.rule import CellIsRule + +# CSV 읽기 (인코딩 자동 감지) +for enc in ['utf-8', 'cp949', 'euc-kr', 'utf-8-sig']: + try: + df = pd.read_csv('input.csv', encoding=enc) + break + except (UnicodeDecodeError, Exception): + continue + +# Excel 저장 +output_path = 'output.xlsx' +df.to_excel(output_path, index=False, sheet_name='Sheet1') + +# 서식 적용 +wb = load_workbook(output_path) +ws = wb.active + +# 헤더 스타일 +header_font = Font(bold=True, color='FFFFFF', size=11) +header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid') +header_align = Alignment(horizontal='center', vertical='center', wrap_text=True) +thin_border = Border( + left=Side(style='thin'), + right=Side(style='thin'), + top=Side(style='thin'), + bottom=Side(style='thin') +) + +for col_idx, cell in enumerate(ws[1], 1): + cell.font = header_font + cell.fill = header_fill + cell.alignment = header_align + cell.border = thin_border + +# 자동 열 너비 +for col_idx in range(1, ws.max_column + 1): + max_length = 0 + col_letter = get_column_letter(col_idx) + for row in ws.iter_rows(min_col=col_idx, max_col=col_idx): + for cell in row: + if cell.value: + max_length = max(max_length, len(str(cell.value))) + ws.column_dimensions[col_letter].width = min(max_length + 4, 50) + +# 헤더 행 고정 (Freeze Panes) +ws.freeze_panes = 'A2' + +# 자동 필터 +ws.auto_filter.ref = ws.dimensions + +# 숫자 컬럼 조건부 서식 (음수 빨강) +for col_idx in range(1, ws.max_column + 1): + col_letter = get_column_letter(col_idx) + sample_values = [ws.cell(row=r, column=col_idx).value for r in range(2, min(ws.max_row + 1, 12))] + if any(isinstance(v, (int, float)) for v in sample_values if v is not None): + cell_range = f'{col_letter}2:{col_letter}{ws.max_row}' + ws.conditional_formatting.add(cell_range, + CellIsRule(operator='lessThan', formula=['0'], + font=Font(color='FF0000'))) + +# 데이터 행 줄무늬 (가독성) +light_fill = PatternFill(start_color='D9E2F3', end_color='D9E2F3', fill_type='solid') +for row_idx in range(2, ws.max_row + 1): + for col_idx in range(1, ws.max_column + 1): + cell = ws.cell(row=row_idx, column=col_idx) + cell.border = thin_border + if row_idx % 2 == 0: + cell.fill = light_fill + +wb.save(output_path) +print(f'변환 완료: {output_path} ({ws.max_row - 1}행 × {ws.max_column}열)') +``` + +## 서식 옵션 +- **헤더 스타일**: 파란 배경 + 흰색 굵은 글씨 + 가운데 정렬 +- **줄무늬**: 짝수 행 연한 파랑 배경 (가독성 향상) +- **열 너비**: 내용 기준 자동 조정 (최대 50) +- **조건부 서식**: 숫자 컬럼 음수 빨강 표시 +- **Freeze Panes**: 헤더 행 고정 +- **Auto Filter**: 전체 컬럼 필터 활성화 + +## 규칙 +- 원본 CSV 파일은 수정하지 않음 +- 인코딩 자동 감지 (UTF-8 → CP949 → EUC-KR 순) +- 대용량 파일 (100,000행 이상) 경고 후 진행 +- 출력 파일명: 원본 파일명 기준 (.csv → .xlsx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/skills/data-convert.skill.md b/src/AxCopilot/skills/data-convert.skill.md new file mode 100644 index 0000000..edd84f6 --- /dev/null +++ b/src/AxCopilot/skills/data-convert.skill.md @@ -0,0 +1,56 @@ +--- +name: data-convert +label: 데이터 변환기 +description: 데이터 포맷 간 변환, 정제, 필터링, 통계 요약을 수행합니다. +icon: \uE8AB +allowed-tools: + - file_read + - file_write + - json_tool + - csv_create + - data_pivot + - excel_create +tabs: cowork +--- + +데이터 파일의 포맷 변환, 정제, 필터링, 통계 요약을 수행하세요. + +## 지원 변환 + +| 입력 → | JSON | CSV | Excel | Markdown | +|--------|------|-----|-------|----------| +| JSON | — | ✅ | ✅ | ✅ | +| CSV | ✅ | — | ✅ | ✅ | +| Excel | ✅ | ✅ | — | ✅ | +| TSV | ✅ | ✅ | ✅ | ✅ | + +## 워크플로우 + +1. **파일 분석**: 입력 파일의 포맷, 인코딩, 구조 파악 +2. **데이터 정제** (선택): + - 빈 행/열 제거 + - 중복 제거 + - 데이터 타입 정리 (숫자 문자열 → 숫자) + - 결측치 처리 (제거 또는 기본값) +3. **필터링** (선택): + - 조건 기반 행 필터링 + - 필요 컬럼만 추출 +4. **변환**: 대상 포맷으로 변환 +5. **통계 요약**: 기본 통계 제공 + +## 정제 옵션 +- `remove_empty`: 빈 행 제거 +- `remove_duplicates`: 중복 행 제거 +- `trim`: 공백 제거 +- `fill_na`: 결측치 채우기 (값 지정) + +## 출력 +- 변환된 파일 저장 +- 변환 통계 (원본 행 수, 변환 후 행 수, 제거 행 수) +- 컬럼별 기본 통계 (수치 컬럼: 합계, 평균, 최소, 최대) + +## 규칙 +- 원본 파일은 수정하지 않음 (새 파일로 저장) +- 인코딩: UTF-8 기본 (EUC-KR 옵션) +- 대용량 파일 (10MB 이상) 경고 +- 한국어로 안내 diff --git a/src/AxCopilot/skills/data-visualize-adv.skill.md b/src/AxCopilot/skills/data-visualize-adv.skill.md new file mode 100644 index 0000000..53817d4 --- /dev/null +++ b/src/AxCopilot/skills/data-visualize-adv.skill.md @@ -0,0 +1,125 @@ +--- +name: data-visualize-adv +label: 고급 데이터 시각화 +description: Python matplotlib/seaborn을 사용하여 히트맵, 산점도, 상관관계 등 고급 시각화를 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +데이터를 고급 시각화 차트로 변환하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib seaborn pandas numpy +``` + +## 작업 절차 +1. **데이터 확인**: 사용자가 제공한 CSV/JSON/Excel 데이터 파일 확인 +2. **데이터 로드**: pandas로 데이터 읽기 +3. **Python 스크립트 작성**: file_write로 시각화 스크립트 생성 +4. **스크립트 실행**: process_run으로 실행 +5. **결과 확인**: 생성된 차트 이미지 경로를 사용자에게 안내 + +## 시각화 유형별 템플릿 + +### 공통 설정 +```python +import matplotlib.pyplot as plt +import seaborn as sns +import pandas as pd +import numpy as np + +# 한글 폰트 설정 +plt.rcParams['font.family'] = 'Malgun Gothic' +plt.rcParams['axes.unicode_minus'] = False +sns.set_theme(style='whitegrid', font='Malgun Gothic') +``` + +### 히트맵 (상관관계 행렬) +```python +df = pd.read_csv('data.csv') +corr = df.select_dtypes(include=[np.number]).corr() + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.heatmap(corr, annot=True, fmt='.2f', cmap='RdBu_r', + center=0, square=True, linewidths=0.5, ax=ax) +ax.set_title('상관관계 히트맵') +plt.tight_layout() +plt.savefig('heatmap.png', dpi=150) +``` + +### 산점도 (Scatter Plot) +```python +df = pd.read_csv('data.csv') + +fig, ax = plt.subplots(figsize=(10, 8)) +sns.scatterplot(data=df, x='col_x', y='col_y', hue='category', + size='value', sizes=(20, 200), alpha=0.7, ax=ax) +ax.set_title('산점도') +plt.tight_layout() +plt.savefig('scatter.png', dpi=150) +``` + +### 시계열 분석 +```python +df = pd.read_csv('data.csv', parse_dates=['date']) + +fig, ax = plt.subplots(figsize=(12, 6)) +sns.lineplot(data=df, x='date', y='value', hue='category', ax=ax) +ax.set_title('시계열 트렌드') +plt.xticks(rotation=45) +plt.tight_layout() +plt.savefig('timeseries.png', dpi=150) +``` + +### 분포 비교 (박스플롯 + 바이올린) +```python +fig, axes = plt.subplots(1, 2, figsize=(14, 6)) + +sns.boxplot(data=df, x='group', y='value', ax=axes[0]) +axes[0].set_title('박스플롯') + +sns.violinplot(data=df, x='group', y='value', ax=axes[1]) +axes[1].set_title('바이올린 플롯') + +plt.tight_layout() +plt.savefig('distribution.png', dpi=150) +``` + +### 다중 차트 대시보드 +```python +fig, axes = plt.subplots(2, 2, figsize=(14, 12)) + +# 좌상: 히트맵 +sns.heatmap(corr, annot=True, fmt='.1f', ax=axes[0,0]) + +# 우상: 산점도 +sns.scatterplot(data=df, x='x', y='y', ax=axes[0,1]) + +# 좌하: 히스토그램 +sns.histplot(data=df, x='value', kde=True, ax=axes[1,0]) + +# 우하: 박스플롯 +sns.boxplot(data=df, x='group', y='value', ax=axes[1,1]) + +fig.suptitle('데이터 분석 대시보드', fontsize=16, fontweight='bold') +plt.tight_layout() +plt.savefig('dashboard.png', dpi=150) +``` + +### 페어플롯 (변수 간 관계 전체) +```python +g = sns.pairplot(df, hue='category', diag_kind='kde') +g.fig.suptitle('변수 간 관계', y=1.02) +plt.savefig('pairplot.png', dpi=150) +``` + +## 스타일 옵션 +- seaborn 테마: `whitegrid`, `darkgrid`, `white`, `dark`, `ticks` +- 컬러 팔레트: `Set2`, `husl`, `coolwarm`, `RdBu_r`, `viridis` +- 출력 형식: png, svg, pdf +- 해상도: `dpi=150` (기본), `dpi=300` (인쇄용) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/skills/data-visualize.skill.md b/src/AxCopilot/skills/data-visualize.skill.md new file mode 100644 index 0000000..965bf8b --- /dev/null +++ b/src/AxCopilot/skills/data-visualize.skill.md @@ -0,0 +1,38 @@ +--- +name: data-visualize +label: 데이터 시각화 +description: CSV/Excel 데이터를 분석하여 차트가 포함된 HTML 보고서를 생성합니다. +icon: \uE9D9 +tabs: cowork +--- + +작업 폴더의 데이터 파일을 분석하고 시각화 보고서를 생성하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — HTML 시각화 보고서 생성 + +���각화 전략: +1. **데이터 파악**: 컬럼 타입, 결측치, 기본 통계량 확인 +2. **적절한 차트 선택**: + - 시계열 → 라인 차트 + - 비교 → 바 차트 + - 비율 → 파이/도넛 차트 + - 분포 → 히스토그램 + - 상관관계 → 산점도 +3. **HTML 보고서 생성**: 인라인 SVG 또는 CSS 기반 차트 (외부 라이브러리 없이) + +보고서 구성: +## 데이터 요약 +- 기본 통계 테이블 + +## 시각화 +- 데이터 특성에 맞는 2~4개 차트 +- 각 차트에 대한 해석 + +## 인사이트 +- 데이터에서 발견한 주요 패턴 +- 이상치 또는 주목할 포인트 + +한국어로 작성하세요. 차트는 CSS/SVG 기반으로 외부 의존성 없이 생성하세요. diff --git a/src/AxCopilot/skills/db-schema.skill.md b/src/AxCopilot/skills/db-schema.skill.md new file mode 100644 index 0000000..446d5e1 --- /dev/null +++ b/src/AxCopilot/skills/db-schema.skill.md @@ -0,0 +1,60 @@ +--- +name: db-schema +label: DB 스키마 분석 +description: 데이터베이스 스키마를 분석하여 ERD 다이어그램과 테이블 문서를 생성합니다. +icon: \uE968 +tabs: code +--- + +작업 폴더의 코드에서 데이터베이스 스키마를 분석하고 문서화하세요. + +## 분석 대상 +- ORM 모델/엔티티 클래스 (Entity Framework, SQLAlchemy, Sequelize, JPA 등) +- 마이그레이션 파일 +- SQL DDL 스크립트 (CREATE TABLE) +- 관계 정의 (FK, Navigation Property) + +## 작업 절차 +1. `folder_map` — 프로젝트 구조 파악 +2. `grep_tool` — 엔티티/모델 클래스 검색 (`DbSet`, `@Entity`, `Model.define`, `CREATE TABLE` 등) +3. `file_read` — 모델 파일 분석 (컬럼, 타입, 관계) +4. `grep_tool` — 인덱스, 제약 조건 검색 +5. `file_write` — 스키마 문서 + Mermaid ERD 생성 + +## 출력 형식 + +### 테이블 문서 +각 테이블에 대해: +``` +## Users 테이블 +| 컬럼 | 타입 | Null | 기본값 | 설명 | +|------|------|------|--------|------| +| Id | int | NO | AUTO_INCREMENT | PK | +| Name | nvarchar(100) | NO | - | 사용자 이름 | +| CreatedAt | datetime | NO | GETDATE() | 생성일 | + +- **인덱스**: IX_Users_Name (Name) +- **관계**: Orders (1:N), Profile (1:1) +``` + +### Mermaid ERD +```mermaid +erDiagram + Users ||--o{ Orders : "has" + Users ||--|| Profile : "has" + Users { + int Id PK + string Name + datetime CreatedAt + } + Orders { + int Id PK + int UserId FK + decimal Amount + } +``` + +## 주의사항 +- 코드에서 실제 확인된 스키마만 문서화하세요. +- 관계(1:1, 1:N, N:M)를 정확히 파악하세요. +- 마이그레이션이 있으면 최종 상태를 기준으로 작성하세요. diff --git a/src/AxCopilot/skills/dependency-audit.skill.md b/src/AxCopilot/skills/dependency-audit.skill.md new file mode 100644 index 0000000..73dbb2e --- /dev/null +++ b/src/AxCopilot/skills/dependency-audit.skill.md @@ -0,0 +1,85 @@ +--- +name: dependency-audit +label: 의존성 분석 +description: 프로젝트 의존성 그래프를 분석하고 보안 취약점, 라이선스, 업데이트 현황을 보고합니다. +icon: \uE964 +allowed-tools: + - file_read + - grep + - folder_map + - glob + - html_create + - process +tabs: code +--- + +프로젝트의 패키지 의존성을 분석하여 보안, 라이선스, 업데이트 보고서를 생성하세요. + +## 워크플로우 + +1. **패키지 파일 탐지**: glob으로 의존성 파일 검색 + - .NET: `*.csproj`, `packages.config`, `Directory.Build.props` + - Node: `package.json`, `package-lock.json`, `yarn.lock` + - Python: `requirements.txt`, `Pipfile`, `pyproject.toml` + - Java: `pom.xml`, `build.gradle` +2. **의존성 목록 추출**: file_read로 파일 파싱 +3. **분석 수행**: 각 의존성에 대해 검사 +4. **보고서 생성**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 1. 직접 의존성 목록 +| 패키지 | 현재 버전 | 최신 버전 | 업데이트 필요 | +|--------|----------|----------|-------------| +| ... | ... | ... | ✅/⚠/❌ | + +### 2. 보안 취약점 (알려진 패턴) +- 알려진 취약 버전 패턴 탐지 +- 폐기된(deprecated) 패키지 식별 +- 유지보수 중단된 패키지 경고 + +### 3. 라이선스 검사 +| 라이선스 | 호환성 | 패키지 | +|---------|--------|--------| +| MIT | ✅ 허용 | lib-a, lib-b | +| GPL-3.0 | ⚠ 주의 | lib-c | +| 상용 | ❌ 검토 필요 | lib-d | + +### 4. 의존성 크기 분석 +- 패키지별 예상 크기 +- 전체 node_modules / NuGet 캐시 크기 +- 불필요하게 큰 패키지 식별 + +### 5. 중복/충돌 검사 +- 동일 기능 중복 패키지 (예: lodash + underscore) +- 버전 충돌 가능성 + +## 프레임워크별 검사 명령 + +### .NET +``` +dotnet list package --outdated +dotnet list package --vulnerable +``` + +### Node.js +``` +npm audit +npm outdated +``` + +### Python +``` +pip list --outdated +pip-audit +``` + +## 출력 +- HTML 보고서: 위험도별 색상 구분, 차트 포함 +- 요약: 총 패키지 수, 업데이트 필요 수, 보안 이슈 수, 라이선스 경고 수 + +## 규칙 +- 외부 서버 접속 없이 로컬 파일 분석만 수행 +- process 도구 사용 시 `dotnet list` / `npm audit` 등 읽기 전용 명령만 +- 패키지를 직접 업데이트하지 않음 (보고서만) +- 한국어로 작성 diff --git a/src/AxCopilot/skills/diagram-generator.skill.md b/src/AxCopilot/skills/diagram-generator.skill.md new file mode 100644 index 0000000..9d887e0 --- /dev/null +++ b/src/AxCopilot/skills/diagram-generator.skill.md @@ -0,0 +1,99 @@ +--- +name: diagram-generator +label: 다이어그램 생성 +description: Python matplotlib/graphviz를 사용하여 플로차트, 시퀀스, ER 다이어그램 등을 생성합니다. +icon: \uE9D9 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 다이어그램을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 설치하세요: +``` +process_run: pip install matplotlib graphviz +``` +시스템에 Graphviz가 설치되어 있어야 합니다 (https://graphviz.org/download/). + +## 작업 절차 +1. **요구사항 파악**: 다이어그램 유형, 노드/관계, 스타일 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립트 실행 +4. **결과 확인**: 생성된 이미지 파일 경로를 사용자에게 안내 + +## 다이어그램 유형별 템플릿 + +### 플로차트 (Graphviz) +```python +from graphviz import Digraph + +dot = Digraph(comment='Flowchart', format='png') +dot.attr(rankdir='TB', fontname='Malgun Gothic') +dot.attr('node', shape='box', style='rounded,filled', fillcolor='#E8F0FE') + +dot.node('start', '시작', shape='ellipse', fillcolor='#34A853', fontcolor='white') +dot.node('process1', '데이터 수집') +dot.node('decision', '조건 확인?', shape='diamond', fillcolor='#FBBC04') +dot.node('process2', '처리') +dot.node('end', '종료', shape='ellipse', fillcolor='#EA4335', fontcolor='white') + +dot.edge('start', 'process1') +dot.edge('process1', 'decision') +dot.edge('decision', 'process2', label='예') +dot.edge('decision', 'end', label='아니오') +dot.edge('process2', 'end') + +dot.render('flowchart', cleanup=True) +``` + +### 시퀀스 다이어그램 (matplotlib) +```python +import matplotlib.pyplot as plt +import matplotlib.patches as patches + +fig, ax = plt.subplots(1, 1, figsize=(10, 8)) +# 액터 라이프라인, 메시지 화살표 등을 matplotlib으로 직접 그리기 +ax.set_xlim(0, 10) +ax.set_ylim(0, 10) +ax.invert_yaxis() +ax.axis('off') +plt.savefig('sequence.png', dpi=150, bbox_inches='tight') +``` + +### ER 다이어그램 (Graphviz) +```python +from graphviz import Graph + +er = Graph('ER', format='png', engine='neato') +er.attr('node', shape='box', style='filled', fillcolor='#E8F0FE') + +er.node('user', 'User\n─────\nid (PK)\nname\nemail') +er.node('order', 'Order\n─────\nid (PK)\nuser_id (FK)\ntotal') + +er.edge('user', 'order', label='1:N') +er.render('er_diagram', cleanup=True) +``` + +### 조직도 (Graphviz) +```python +from graphviz import Digraph + +org = Digraph(format='png') +org.attr(rankdir='TB') +org.attr('node', shape='box', style='rounded,filled', fillcolor='#E3F2FD') + +org.node('ceo', 'CEO') +org.node('cto', 'CTO') +org.node('cfo', 'CFO') +org.edges([('ceo', 'cto'), ('ceo', 'cfo')]) +org.render('org_chart', cleanup=True) +``` + +## 스타일 옵션 +- 폰트: `fontname='Malgun Gothic'` (한글 지원) +- 색상: HTML 컬러 코드 지원 +- 출력 형식: png, svg, pdf +- 레이아웃 엔진: dot(계층), neato(스프링), circo(원형), fdp(포스) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/skills/docx-creator.skill.md b/src/AxCopilot/skills/docx-creator.skill.md new file mode 100644 index 0000000..74a62ce --- /dev/null +++ b/src/AxCopilot/skills/docx-creator.skill.md @@ -0,0 +1,97 @@ +--- +name: docx-creator +label: Word 문서 생성 +description: Python을 사용하여 전문적인 Word 문서(.docx)를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE8A5 +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 전문적인 Word 문서를 Python으로 생성하세요. + +## 사전 준비 +먼저 python-docx 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx +``` + +## 양식 활용 (템플릿 모드) +작업 폴더에 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.docx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .docx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식 파일의 구조(스타일, 헤더, 섹션)를 먼저 확인 +4. **양식 기반 생성**: + ```python + doc = Document('양식_보고서.docx') # ← 빈 Document() 대신 양식 로드 + # 양식의 스타일, 머리글/바닥글, 로고, 페이지 설정이 자동 상속됨 + # 기존 본문 내용을 지우고 새 내용만 추가 + for paragraph in doc.paragraphs: + paragraph.clear() # 기존 내용 제거 + # 또는 필요에 따라 특정 섹션만 교체 + ``` +5. **양식이 없으면**: 아래 기본 템플릿으로 새 문서 생성 + +## 작업 절차 +1. **요구사항 파악**: 사용자가 원하는 문서의 종류, 구조, 내용을 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .docx 파일이 있는지 확인 +3. **Python 스크립트 작성**: file_write로 .py 파일 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 .docx 파일 경로를 사용자에게 안내 + +## Python 스크립트 템플릿 +```python +from docx import Document +from docx.shared import Inches, Pt, Cm +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.style import WD_STYLE_TYPE +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.docx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 문서 +if template_file: + doc = Document(template_file) + print(f'양식 활용: {template_file}') +else: + doc = Document() + # 스타일 설정 (양식이 없을 때만) + style = doc.styles['Normal'] + font = style.font + font.name = '맑은 고딕' + font.size = Pt(11) + +# 제목 +doc.add_heading('문서 제목', level=0) + +# 본문 +doc.add_paragraph('내용을 여기에 작성합니다.') + +# 표 +table = doc.add_table(rows=2, cols=3) +table.style = 'Light Grid Accent 1' + +# 저장 +doc.save('output.docx') +``` + +## 지원 기능 +- 제목/소제목 계층 구조 +- 표 (스타일, 병합, 서식) +- 이미지 삽입 +- 머리글/바닥글 +- 페이지 번호 +- 목차 +- 글머리 기호/번호 목록 +- **양식 파일 기반 스타일 상속** (로고, 헤더, 페이지 설정 자동 유지) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/skills/email-draft.skill.md b/src/AxCopilot/skills/email-draft.skill.md new file mode 100644 index 0000000..62f4e5f --- /dev/null +++ b/src/AxCopilot/skills/email-draft.skill.md @@ -0,0 +1,55 @@ +--- +name: email-draft +label: 비즈니스 이메일 작성 +description: 상황과 톤에 맞는 전문적인 비즈니스 이메일 초안을 생성합니다. +icon: \uE715 +allowed-tools: + - clipboard_tool + - file_write +tabs: all +--- + +사용자의 요청에 맞는 전문적인 비즈니스 이메일을 작성하세요. + +## 워크플로우 + +1. 사용자에게 다음 정보를 확인하세요: + - **수신자**: 이름, 직급, 부서 (알고 있다면) + - **목적**: 요청 / 보고 / 안내 / 감사 / 사과 / 협조 / 초대 / 회신 + - **핵심 내용**: 전달할 주요 메시지 (1~3가지) + - **톤**: 공식(格式) / 반공식 / 친근 + - **언어**: 한국어 / 영어 / 일본어 + +2. 이메일 초안을 작성합니다: + - 적절한 인사말로 시작 + - 핵심 내용은 **굵게** 강조 + - 요청 사항은 명확하고 구체적으로 + - 마무리 인사와 서명 포함 + +3. 사용자에게 초안을 보여주고 수정 요청을 받습니다. + +4. 최종본을 clipboard_tool로 클립보드에 복사합니다. + +## 이메일 구조 + +``` +제목: [간결하고 명확한 제목] + +[수신자] 님께, + +[인사말] + +[본문 - 목적과 핵심 내용] + +[요청 사항 또는 다음 단계] + +[마무리 인사] + +[서명] +``` + +## 규칙 +- 한 문단은 3~4문장을 넘지 않도록 간결하게 +- 수동적 표현보다 능동적 표현 선호 +- 약어는 처음 사용 시 풀어 쓰기 +- 긴급도에 따라 제목에 [긴급], [참고] 등 태그 사용 diff --git a/src/AxCopilot/skills/env-setup.skill.md b/src/AxCopilot/skills/env-setup.skill.md new file mode 100644 index 0000000..f1b397e --- /dev/null +++ b/src/AxCopilot/skills/env-setup.skill.md @@ -0,0 +1,152 @@ +--- +name: env-setup +label: 프로젝트 환경 설정 +description: .gitignore, requirements.txt, .editorconfig 등 프로젝트 환경 설정 파일을 자동 생성합니다. +icon: \uE835 +tabs: code +allowed-tools: + - folder_map + - file_read + - file_write + - process_run +--- + +프로젝트 유형에 맞는 환경 설정 파일을 자동으로 생성하세요. + +## 작업 절차 + +1. **프로젝트 분석**: folder_map으로 프로젝트 구조를 파악하고 유형 판별 + - `.py` 파일 → Python 프로젝트 + - `package.json` 또는 `.js/.ts` 파일 → Node.js 프로젝트 + - `.csproj` 또는 `.sln` 파일 → .NET 프로젝트 + - `pom.xml` 또는 `.java` 파일 → Java 프로젝트 + - 복합 프로젝트인 경우 모든 유형을 병합 +2. **기존 설정 확인**: 이미 존재하는 설정 파일이 있는지 확인 + - 있으면: 내용을 분석하여 누락된 항목만 추가 제안 + - 없으면: 새로 생성 +3. **생성할 파일 목록 제안**: 사용자에게 생성할 파일 목록을 보여주고 확인 +4. **파일 생성**: file_write로 각 설정 파일 생성 +5. **결과 안내**: 생성된 파일 목록과 주요 설정 내용 요약 + +## 프로젝트별 템플릿 + +### Python 프로젝트 +생성 파일: `.gitignore`, `requirements.txt`, `.editorconfig`, `setup.cfg`, `.flake8` + +**.gitignore (Python)**: +``` +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +venv/ +.venv/ +*.egg-info/ +dist/ +build/ +.eggs/ +*.egg +.mypy_cache/ +.pytest_cache/ +.coverage +htmlcov/ +.env +.idea/ +.vscode/ +*.log +``` + +**requirements.txt**: 프로젝트에서 import 문을 스캔하여 자동 생성 + +### Node.js 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `.nvmrc`, `.prettierrc` + +**.gitignore (Node)**: +``` +node_modules/ +dist/ +build/ +.env +.env.local +*.log +npm-debug.log* +.DS_Store +coverage/ +.nyc_output/ +.idea/ +.vscode/ +*.tgz +``` + +### .NET 프로젝트 +생성 파일: `.gitignore`, `.editorconfig`, `Directory.Build.props` + +**.gitignore (.NET)**: +``` +bin/ +obj/ +.vs/ +*.user +*.suo +*.cache +packages/ +*.nupkg +TestResults/ +.idea/ +*.DotSettings.user +``` + +### Java 프로젝트 +생성 파일: `.gitignore`, `.editorconfig` + +**.gitignore (Java)**: +``` +*.class +*.jar +*.war +*.ear +target/ +.gradle/ +build/ +.idea/ +*.iml +.settings/ +.classpath +.project +out/ +``` + +## 공통 .editorconfig +```ini +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[*.{json,js,ts,jsx,tsx}] +indent_size = 2 + +[Makefile] +indent_style = tab +``` + +## 규칙 +- 기존 설정 파일이 있으면 덮어쓰지 않고, 누락 항목만 제안 +- .env 파일은 생성하지 않음 (보안 — 사용자가 직접 생성) +- 생성 전 파일 목록을 반드시 사용자에게 확인 +- 프로젝트 루트에 생성 (하위 폴더에 생성하지 않음) + +한국어로 안내하세요. diff --git a/src/AxCopilot/skills/gen-test.skill.md b/src/AxCopilot/skills/gen-test.skill.md new file mode 100644 index 0000000..ede8c8d --- /dev/null +++ b/src/AxCopilot/skills/gen-test.skill.md @@ -0,0 +1,63 @@ +--- +name: gen-test +label: 테스트 생성기 +description: 지정 파일의 단위 테스트를 자동 생성하고 실행하여 커버리지를 분석합니다. +icon: \uE9D5 +allowed-tools: + - file_read + - file_write + - test_loop + - grep + - folder_map + - dev_env_detect + - build_run +tabs: code +--- + +지정된 소스 파일의 단위 테스트를 자동 생성하고 실행하세요. + +## 워크플로우 + +1. **환경 감지**: dev_env_detect로 프로젝트 타입, 테스트 프레임워크 확인 +2. **대상 분석**: file_read로 테스트 대상 파일 분석 + - 공개 메서드/함수 목록 추출 + - 메서드별 입출력 타입 파악 + - 의존성 확인 (Mock 필요 여부) +3. **테스트 생성**: 각 메서드에 대해 테스트 케이스 작성 + - 정상 케이스 (Happy Path) + - 경계값 (Boundary) + - 예외/에러 케이스 + - null/empty 입력 +4. **실행 및 검증**: test_loop으로 테스트 실행 +5. **결과 보고**: 성공/실패 요약, 커버리지 추정 + +## 테스트 작성 원칙 + +### 명명 규칙 +- C#: `[메서드명]_[시나리오]_[기대결과]` +- Python: `test_[메서드명]_[시나리오]` +- JavaScript: `should [기대 동작] when [조건]` + +### 테스트 구조 (AAA 패턴) +``` +Arrange — 테스트 데이터 준비 +Act — 대상 메서드 실행 +Assert — 결과 검증 +``` + +### 프레임워크별 지원 +- C#: xUnit, NUnit, MSTest +- Python: pytest, unittest +- JavaScript: Jest, Mocha, Vitest +- Java: JUnit 5 + +## 출력 +- 테스트 파일 생성 (프로젝트 컨벤션에 맞는 위치) +- 테스트 실행 결과 요약 +- 커버리지 추정 (메서드별 테스트 유무) + +## 규칙 +- 기존 테스트가 있으면 스타일을 따르기 +- 외부 의존성은 Mock/Stub 사용 +- 테스트 간 독립성 보장 (상태 공유 금지) +- 한국어 주석으로 테스트 의도 설명 diff --git a/src/AxCopilot/skills/image-processor.skill.md b/src/AxCopilot/skills/image-processor.skill.md new file mode 100644 index 0000000..86c6c31 --- /dev/null +++ b/src/AxCopilot/skills/image-processor.skill.md @@ -0,0 +1,75 @@ +--- +name: image-processor +label: 이미지 처리 +description: Python Pillow를 사용하여 이미지 리사이즈, 크롭, 워터마크, 포맷 변환을 수행합니다. +icon: \uEB9F +requires: python +tabs: cowork +--- + +사용자의 요구에 맞게 이미지를 처리하세요. + +## 사전 준비 +먼저 Pillow 패키지가 설치되어 있��지 확인하고, 없으면 설���하세요: +``` +process_run: pip install Pillow +``` + +## 작업 절�� +1. **요구사항 파악**: 처리할 이미지 파일과 원하는 작업 확인 +2. **Python 스크립트 작성**: file_write로 .py 파일 생성 +3. **스크립트 실행**: process_run으로 Python 스크립�� 실행 +4. **결과 확인**: 처리된 이미지 파일 경로를 사용자에게 안내 + +## 지원 기능 + +### 리사이즈 +```python +from PIL import Image +img = Image.open('input.png') +img_resized = img.resize((800, 600)) # 고정 크기 +# 또는 비율 유지 +img.thumbnail((800, 800)) +img.save('output.png') +``` + +### 크롭 +```python +img = Image.open('input.png') +cropped = img.crop((left, top, right, bottom)) +cropped.save('output.png') +``` + +### 워터마크 +```python +from PIL import Image, ImageDraw, ImageFont +img = Image.open('input.png') +draw = ImageDraw.Draw(img) +draw.text((10, 10), "Watermark", fill=(255, 255, 255, 128)) +img.save('output.png') +``` + +### 포맷 변환 +```python +img = Image.open('input.png') +img.save('output.jpg', 'JPEG', quality=85) +img.save('output.webp', 'WEBP', quality=80) +``` + +### 배치 처리 +```python +import glob +for path in glob.glob('*.png'): + img = Image.open(path) + img.thumbnail((800, 800)) + img.save(f'resized_{path}') +``` + +## 추가 기능 +- 회전/뒤집기 (rotate, transpose) +- 밝기/대비/선명도 조절 (ImageEnhance) +- 필터 적용 (ImageFilter: BLUR, SHARPEN, CONTOUR) +- 이미지 합성 (Image.paste, Image.alpha_composite) +- EXIF 정보 읽기 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/skills/impact.skill.md b/src/AxCopilot/skills/impact.skill.md new file mode 100644 index 0000000..1b0d56b --- /dev/null +++ b/src/AxCopilot/skills/impact.skill.md @@ -0,0 +1,67 @@ +--- +name: impact +label: 변경 영향 분석 +description: 코드 변경 시 영향받는 파일, 함수, 테스트를 식별합니다. +icon: \uE946 +allowed-tools: + - lsp_code_intel + - grep + - search_codebase + - git_tool + - file_read + - folder_map +tabs: code +--- + +코드 변경이 미치는 영향 범위를 분석하여 안전한 수정을 도와주세요. + +## 워크플로우 + +1. **변경 대상 확인**: 어떤 파일/함수/클래스를 변경할 예정인지 파악 +2. **직접 참조 분석**: lsp_code_intel의 find_references로 직접 호출처 확인 +3. **간접 영향 분석**: + - grep으로 문자열 기반 참조 검색 + - search_codebase로 의미적 유사 코드 탐색 + - 상속/인터페이스 체인 추적 +4. **테스트 영향**: 관련 테스트 파일 식별 +5. **위험도 평가**: 변경 영향 범위와 위험도 매트릭스 생성 +6. **보고서 작성**: 영향 분석 보고서 생성 + +## 분석 항목 + +### 직접 영향 +- 해당 함수/클래스를 직접 호출하는 코드 +- import/using 하는 파일 +- 상속받는 클래스 + +### 간접 영향 +- 인터페이스 구현체를 통한 호출 +- 리플렉션/동적 호출 +- 설정 파일 참조 +- UI 바인딩 + +### 테스트 영향 +- 직접 테스트하는 테스트 파일 +- 관련 통합 테스트 +- 테스트 더블(Mock) 대상 여부 + +## 출력 형식 + +### 영향 분석 보고서 + +| 영향 수준 | 파일 | 관련 함수 | 위험도 | 비고 | +|----------|------|----------|--------|------| +| 🔴 직접 | A.cs | MethodX() | 높음 | 시그니처 변경 시 컴파일 오류 | +| 🟡 간접 | B.cs | MethodY() | 중간 | 동적 호출, 런타임 오류 가능 | +| 🟢 테스트 | A.Tests.cs | Test1() | 낮음 | 테스트 수정 필요 | + +### 변경 체크리스트 +- [ ] 직접 참조 N개 확인 및 수정 +- [ ] 테스트 M개 업데이트 +- [ ] 관련 문서 갱신 + +## 규칙 +- 코드를 직접 수정하지 않음 (분석만 수행) +- 가능하면 LSP 기반 정확한 참조 분석 우선 +- LSP 불가 시 grep 기반 텍스트 검색으로 대체 +- 위험도는 보수적으로 평가 (의심스러우면 높음) diff --git a/src/AxCopilot/skills/json-schema.skill.md b/src/AxCopilot/skills/json-schema.skill.md new file mode 100644 index 0000000..821dbf4 --- /dev/null +++ b/src/AxCopilot/skills/json-schema.skill.md @@ -0,0 +1,107 @@ +--- +name: json-schema +label: JSON/YAML 스키마 도구 +description: JSON 또는 YAML 데이터에서 스키마를 생성하고, 데이터의 유효성을 검증합니다. +icon: \uE943 +tabs: code +allowed-tools: + - json_tool + - file_read + - file_write + - clipboard_tool +--- + +JSON/YAML 샘플 데이터에서 스키마를 추출하거나, 기존 스키마로 데이터를 검증하세요. + +## 작업 절차 + +1. **요청 유형 판별**: + - **스키마 생성**: 샘플 JSON/YAML → JSON Schema 추출 + - **스키마 검증**: 데이터 + 스키마 → 유효성 검사 + - **스키마 문서화**: 기존 스키마 → 사람이 읽을 수 있는 설명 생성 +2. **입력 데이터 확인**: file_read 또는 사용자 입력으로 데이터 로드 +3. **스키마 생성 또는 검증 수행**: json_tool로 처리 +4. **결과 출력**: 생성된 스키마 또는 검증 결과를 표시 +5. **파일 저장**: file_write로 결과를 저장하거나 clipboard_tool로 복사 + +## 스키마 생성 규칙 + +### 타입 추론 +| JSON 값 | JSON Schema 타입 | 추가 속성 | +|---------|-----------------|----------| +| `"text"` | `string` | — | +| `123` | `integer` | — | +| `1.5` | `number` | — | +| `true` | `boolean` | — | +| `null` | `null` | nullable 처리 | +| `[]` | `array` | items 스키마 | +| `{}` | `object` | properties 스키마 | + +### 추론 강화 +- **패턴 감지**: 이메일, URL, 날짜, UUID 등은 `format` 속성 추가 +- **열거형 감지**: 값의 종류가 적으면 `enum` 으로 제안 +- **필수 필드**: 모든 샘플에 존재하는 필드는 `required`로 표시 +- **배열 항목**: 배열 내 모든 항목을 분석하여 통합 스키마 생성 + +### 출력 형식 (JSON Schema Draft 7) +```json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "사용자 정보", + "description": "사용자 프로필 데이터 스키마", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "사용자 이름" + }, + "email": { + "type": "string", + "format": "email", + "description": "이메일 주소" + }, + "age": { + "type": "integer", + "minimum": 0, + "maximum": 150, + "description": "나이" + } + }, + "required": ["name", "email"], + "additionalProperties": false +} +``` + +## 검증 결과 형식 +검증 결과는 다음과 같이 표시하세요: +``` +검증 결과: ❌ 실패 (3건의 오류) + +| # | 경로 | 오류 | 기대값 | +|---|------|------|--------| +| 1 | $.email | 필수 필드 누락 | string (required) | +| 2 | $.age | 타입 불일치 | integer (실제: string) | +| 3 | $.tags[2] | 열거형 불일치 | "A", "B", "C" 중 하나 | +``` + +## 스키마 문서화 형식 +기존 스키마를 분석하여 사람이 읽기 쉬운 문서를 생성: +``` +## 사용자 정보 스키마 + +| 필드 | 타입 | 필수 | 설명 | 제약 조건 | +|------|------|------|------|----------| +| name | string | ✅ | 사용자 이름 | — | +| email | string | ✅ | 이메일 주소 | format: email | +| age | integer | — | 나이 | 0~150 | +| tags | array | — | 태그 목록 | items: string | +``` + +## 규칙 +- JSON Schema Draft 7 형식 사용 +- 스키마 생성 시 description 필드를 한국어로 작성 +- 복수 샘플이 제공되면 모든 샘플을 분석하여 통합 스키마 생성 +- 중첩 객체는 재귀적으로 스키마 추출 +- 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/src/AxCopilot/skills/log-analyze.skill.md b/src/AxCopilot/skills/log-analyze.skill.md new file mode 100644 index 0000000..0ac33d9 --- /dev/null +++ b/src/AxCopilot/skills/log-analyze.skill.md @@ -0,0 +1,69 @@ +--- +name: log-analyze +label: 로그 분석기 +description: 로그 파일의 패턴을 분석하고 에러를 요약하며 타임라인을 시각화합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - chart_create + - html_create + - data_pivot + - text_summarize +tabs: cowork +--- + +로그 파일을 분석하여 패턴, 에러, 추세를 파악하고 보고서를 생성하세요. + +## 워크플로우 + +1. **로그 파일 로드**: file_read로 로그 파일 읽기 +2. **패턴 분석**: + - grep으로 에러/경고/예외 패턴 검색 + - 시간대별 이벤트 빈도 파악 + - 반복되는 에러 패턴 식별 +3. **통계 생성**: data_pivot으로 집계 +4. **시각화**: chart_create로 타임라인 차트 생성 +5. **보고서**: html_create로 분석 보고서 생성 + +## 분석 항목 + +### 에러 분석 +- ERROR, WARN, FATAL, Exception 키워드 추출 +- 에러 유형별 발생 빈도 +- 최초 발생 시점 및 최근 발생 시점 +- 에러 메시지 클러스터링 (유사 에러 그룹화) + +### 시간대 분석 +- 시간대별 로그 발생 빈도 +- 피크 시간대 식별 +- 에러 집중 시간대 + +### 패턴 분석 +- 반복 패턴 (주기적 에러) +- 연쇄 에러 (A 에러 후 B 에러 발생 패턴) +- 비정상 패턴 (평소와 다른 로그량) + +## 출력 형식 + +``` +## 로그 분석 보고서 +- 분석 기간: [시작] ~ [끝] +- 총 로그: N줄 + +### 에러 요약 (상위 10건) +| 순위 | 에러 유형 | 발생 횟수 | 최근 발생 | +|------|----------|----------|----------| + +### 타임라인 차트 +[시간대별 이벤트 빈도 차트] + +### 상세 분석 +[에러별 상세 내용 및 권장 조치] +``` + +## 지원 로그 형식 +- 일반 텍스트 로그 (타임스탬프 자동 감지) +- JSON 로그 (각 줄이 JSON 객체) +- CSV 로그 (헤더 포함) +- syslog 형식 diff --git a/src/AxCopilot/skills/markdown-to-doc.skill.md b/src/AxCopilot/skills/markdown-to-doc.skill.md new file mode 100644 index 0000000..7a852d8 --- /dev/null +++ b/src/AxCopilot/skills/markdown-to-doc.skill.md @@ -0,0 +1,164 @@ +--- +name: markdown-to-doc +label: Markdown → 문서 변환 +description: Markdown 파일을 서식이 적용된 Word(.docx) 또는 PDF 문서로 변환합니다. +icon: \uE8A5 +tabs: cowork +requires: python +--- + +Markdown 파일을 전문적인 Word 또는 PDF 문서로 변환하세요. + +## 사전 준비 +먼저 필요한 패키지가 설치되어 있는지 확인하고, 없으면 설치하세요: +``` +process_run: pip install python-docx markdown +``` + +## 작업 절차 + +1. **Markdown 파일 확인**: file_read로 변환할 Markdown 파일의 내용과 구조를 파악 +2. **변환 옵션 확인**: 사용자에게 다음 옵션을 확인 + - 출력 형식: Word(.docx) 또는 PDF + - 폰트: 맑은 고딕 (기본) / 사용자 지정 + - 여백, 페이지 크기 설정 + - 머리글/바닥글 포함 여부 +3. **Python 스크립트 작성**: file_write로 변환 스크립트 생성 +4. **스크립트 실행**: process_run으로 Python 스크립트 실행 +5. **결과 확인**: 생성된 문서 파일 경로와 페이지 수를 안내 + +## 스타일 매핑 + +| Markdown | Word 스타일 | 설명 | +|----------|------------|------| +| `# 제목` | Heading 1 | 16pt, 굵게 | +| `## 소제목` | Heading 2 | 14pt, 굵게 | +| `### 항목` | Heading 3 | 12pt, 굵게 | +| 본문 텍스트 | Normal | 11pt | +| `**굵게**` | Bold run | 굵게 | +| `*기울임*` | Italic run | 기울임 | +| `` `코드` `` | 코드 스타일 | Consolas, 배경색 | +| `> 인용` | Quote | 들여쓰기 + 왼쪽 테두리 | +| `- 목록` | List Bullet | 글머리 기호 | +| `1. 번호` | List Number | 번호 목록 | +| 표 | Table Grid | 테두리 표 | +| `---` | 페이지 구분 | 가로선 → 페이지 나누기 | +| 코드 블록 | 코드 단락 | Consolas, 회색 배경 | + +## Python 스크립트 템플릿 +```python +import re +from docx import Document +from docx.shared import Inches, Pt, Cm, RGBColor +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.oxml.ns import qn +import markdown + +# Markdown 파일 읽기 +with open('input.md', 'r', encoding='utf-8') as f: + md_content = f.read() + +doc = Document() + +# 기본 스타일 설정 +style = doc.styles['Normal'] +font = style.font +font.name = '맑은 고딕' +font.size = Pt(11) +style.element.rPr.rFonts.set(qn('w:eastAsia'), '맑은 고딕') + +# 여백 설정 +for section in doc.sections: + section.top_margin = Cm(2.54) + section.bottom_margin = Cm(2.54) + section.left_margin = Cm(3.17) + section.right_margin = Cm(3.17) + +# Markdown 파싱 및 변환 +lines = md_content.split('\n') +i = 0 +while i < len(lines): + line = lines[i] + + # 제목 (Heading) + if line.startswith('#'): + level = len(line) - len(line.lstrip('#')) + text = line.lstrip('#').strip() + doc.add_heading(text, level=min(level, 4)) + + # 코드 블록 + elif line.startswith('```'): + code_lines = [] + i += 1 + while i < len(lines) and not lines[i].startswith('```'): + code_lines.append(lines[i]) + i += 1 + p = doc.add_paragraph() + run = p.add_run('\n'.join(code_lines)) + run.font.name = 'Consolas' + run.font.size = Pt(9) + + # 인용 + elif line.startswith('>'): + text = line.lstrip('>').strip() + p = doc.add_paragraph(text) + p.paragraph_format.left_indent = Cm(1.27) + + # 글머리 기호 + elif line.startswith('- ') or line.startswith('* '): + text = line[2:].strip() + doc.add_paragraph(text, style='List Bullet') + + # 번호 목록 + elif re.match(r'^\d+\.\s', line): + text = re.sub(r'^\d+\.\s', '', line).strip() + doc.add_paragraph(text, style='List Number') + + # 가로선 → 페이지 나누기 + elif line.strip() in ('---', '***', '___'): + doc.add_page_break() + + # 빈 줄 + elif line.strip() == '': + pass + + # 일반 텍스트 + else: + p = doc.add_paragraph() + # 굵게, 기울임 처리 + parts = re.split(r'(\*\*.*?\*\*|\*.*?\*|`.*?`)', line) + for part in parts: + if part.startswith('**') and part.endswith('**'): + run = p.add_run(part[2:-2]) + run.bold = True + elif part.startswith('*') and part.endswith('*'): + run = p.add_run(part[1:-1]) + run.italic = True + elif part.startswith('`') and part.endswith('`'): + run = p.add_run(part[1:-1]) + run.font.name = 'Consolas' + run.font.size = Pt(10) + else: + p.add_run(part) + + i += 1 + +# 저장 +doc.save('output.docx') +print(f'변환 완료: output.docx ({len(doc.paragraphs)}개 단락)') +``` + +## 표 변환 +Markdown 표가 있으면 Word 표로 변환합니다: +- 헤더 행: 굵게, 배경색 적용 +- 셀 정렬: Markdown의 `:---`, `:---:`, `---:` 구문 반영 +- 테두리: 전체 셀에 얇은 테두리 + +## 규칙 +- 원본 Markdown 파일은 수정하지 않음 +- 인코딩: UTF-8 기본 +- 이미지 링크(`![](path)`)는 로컬 파일이면 삽입, URL이면 경로만 표시 +- 복잡한 Markdown(수식, 다이어그램)은 지원 범위와 한계를 안내 +- 출력 파일명: 원본 파일명 기준 (.md → .docx) + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/skills/meeting-minutes.skill.md b/src/AxCopilot/skills/meeting-minutes.skill.md new file mode 100644 index 0000000..e3ec988 --- /dev/null +++ b/src/AxCopilot/skills/meeting-minutes.skill.md @@ -0,0 +1,40 @@ +--- +name: meeting-minutes +label: 회의록 정리 +description: 회의 내용을 체계적으로 정리하여 회의록을 생성합니다. +icon: \uE771 +tabs: cowork +--- + +사용자가 제공한 회의 내용(텍스트, 메모, 파일)을 정리하여 체계적인 회의록을 작성하세요. + +다음 도구를 사용하세요: +1. file_read — 회의 관련 파일 읽기 (필요 시) +2. file_write — 회의록 파일 생성 + +회의록 형식: +## 회의 정보 +- 일시: +- 참석자: +- 장소/방법: +- 주제: + +## 안건 및 논의 내용 +각 안건별로: +- **안건**: 주제 +- **논의 내용**: 주요 발언 및 의견 정리 +- **결정 사항**: 합의된 내용 + +## 액션 아이템 +| 번호 | 담당자 | 내용 | 기한 | 비고 | +|------|--------|------|------|------| +| 1 | - | - | - | - | + +## 다음 회의 +- 예정일: +- 주요 안건: + +규칙: +- 핵심 내용 위주로 간결하게 정리 +- 결정 사항과 액션 아이템은 명확하게 기술 +- 한국어로 작성 diff --git a/src/AxCopilot/skills/ocr-extract.skill.md b/src/AxCopilot/skills/ocr-extract.skill.md new file mode 100644 index 0000000..8c7e71d --- /dev/null +++ b/src/AxCopilot/skills/ocr-extract.skill.md @@ -0,0 +1,108 @@ +--- +name: ocr-extract +label: OCR 텍스트 추출 +description: Python pytesseract를 사용하여 이미지/스캔 문서에서 텍스트를 추출합니다. +icon: \uE8D4 +requires: python +tabs: cowork +--- + +이미지 또는 스캔된 문서에서 텍스트를 추출하세요. + +## 사전 준비 +1. Tesseract OCR 엔진이 시스템에 설치되어 있어야 합니다. + - Windows: https://github.com/UB-Mannheim/tesseract/wiki 에서 설치 + - 한국어 지원: 설치 시 "Korean" 언어 데이터 선택 +2. Python 패키지 설치: +``` +process_run: pip install pytesseract Pillow +``` + +## 작업 절차 +1. **이미지 확인**: 사용자가 제공한 이미지 파일 확인 +2. **전처리 (선택)**: 이미지 품질이 낮으면 전처리 스크립트 적용 +3. **OCR 실행**: pytesseract로 텍스트 추출 +4. **결과 저장**: 추출된 텍스트를 파일로 저장하고 사용자에게 안내 + +## OCR 스크립트 템플릿 + +### 기본 텍스트 추출 +```python +import pytesseract +from PIL import Image + +# Windows에서 Tesseract 경로 지정 (필요 시) +# pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' + +img = Image.open('scan.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +print(text) + +with open('extracted.txt', 'w', encoding='utf-8') as f: + f.write(text) +``` + +### 이미지 전처리 (품질 개선) +```python +from PIL import Image, ImageFilter, ImageEnhance + +img = Image.open('scan.png') + +# 그레이스케일 변환 +img = img.convert('L') + +# 대비 향상 +enhancer = ImageEnhance.Contrast(img) +img = enhancer.enhance(2.0) + +# 선명도 향상 +img = img.filter(ImageFilter.SHARPEN) + +# 이진화 (흑백) +threshold = 128 +img = img.point(lambda x: 255 if x > threshold else 0) + +img.save('preprocessed.png') +text = pytesseract.image_to_string(img, lang='kor+eng') +``` + +### 배치 OCR (여러 이미지) +```python +import glob +import pytesseract +from PIL import Image + +results = [] +for path in sorted(glob.glob('*.png')): + img = Image.open(path) + text = pytesseract.image_to_string(img, lang='kor+eng') + results.append(f'--- {path} ---\n{text}\n') + +with open('all_extracted.txt', 'w', encoding='utf-8') as f: + f.write('\n'.join(results)) +``` + +### 표 영역 추출 +```python +import pytesseract +from PIL import Image + +img = Image.open('table.png') +# TSV 형식으로 추출 (표 구조 보존) +tsv_data = pytesseract.image_to_data(img, lang='kor+eng', output_type=pytesseract.Output.DATAFRAME) +print(tsv_data) +``` + +## 지원 언어 +- `kor` — 한국어 +- `eng` — 영어 +- `kor+eng` — 한국어+영어 혼합 (권장) +- `jpn` — 일본어 +- `chi_sim` — 중국어 간체 + +## 팁 +- 스캔 해상도 300dpi 이상이면 인식률이 높습니다 +- 기울어진 이미지는 `img.rotate()` 로 보정 후 추출하세요 +- 손글씨는 인식률이 낮을 수 있습니다 + +한국어로 안내하세요. 작업 폴더에 Python 스크립트와 결과 파일을 저장하세요. diff --git a/src/AxCopilot/skills/paper-review.skill.md b/src/AxCopilot/skills/paper-review.skill.md new file mode 100644 index 0000000..72b558c --- /dev/null +++ b/src/AxCopilot/skills/paper-review.skill.md @@ -0,0 +1,54 @@ +--- +name: paper-review +label: 논문 분석 +description: 논문 또는 기술 문서를 체계적으로 분석하고 핵심 내용을 정리합니다. +icon: \uE736 +tabs: cowork +--- + +사용자가 제공한 논문 또는 기술 문서를 체계적으로 분석하세요. + +## 파일 읽기 전략 +- **PDF 파일**: 반드시 `document_read` 도구를 사용하세요. 페이지 범위 지정이 가능합니다. + - 먼저 전체 페이지 수를 확인한 후, 초록(1-2페이지)→본문→참고문헌 순으로 읽으세요. + - `file_read`로 PDF를 읽으면 텍스트가 깨질 수 있으므로 사용하지 마세요. +- **텍스트 파일** (.txt, .md, .html 등): `file_read` 도구를 사용하세요. + +## 사용 도구 +1. document_read — PDF 논문 파일 읽기 (페이지 범위 지정, 초록/참고문헌 추출) +2. file_read — 텍스트 기반 문서 파일 읽기 +3. file_write — 분석 보고서 생성 + +## 분석 항목 +## 논문 개요 +- 제목, 저자, 발표 연도/학회 +- 연구 분야 및 키워드 + +## 연구 목적 및 배경 +- 연구 문제 정의 +- 기존 연구의 한계점 + +## 방법론 +- 제안 방법의 핵심 아이디어 +- 실험 설계 및 데이터셋 + +## 주요 결과 +- 핵심 실험 결과 (표/수치 인용) +- 기존 방법 대비 개선점 + +## 한계점 및 향후 연구 +- 저자가 인정한 한계 +- 발전 가능성 + +## 실무 적용 가능성 +- 우리 업무에 적용할 수 있는 포인트 +- 기술 도입 시 고려사항 + +## 작업 절차 +1. 사용자가 파일명을 언급하면 작업 폴더에서 해당 파일을 찾아 읽기 +2. PDF인 경우 `document_read`로 초록(1-2p) 먼저 읽어 전체 구조 파악 +3. 본문을 페이지 범위별로 나누어 순차 읽기 +4. 위 분석 항목에 따라 체계적으로 정리 +5. `file_write`로 분석 보고서를 마크다운 파일로 저장 + +한국어로 작성하고, 전문 용어는 원문과 함께 표기하세요. diff --git a/src/AxCopilot/skills/pdf-processor.skill.md b/src/AxCopilot/skills/pdf-processor.skill.md new file mode 100644 index 0000000..4076e47 --- /dev/null +++ b/src/AxCopilot/skills/pdf-processor.skill.md @@ -0,0 +1,63 @@ +--- +name: pdf-processor +label: PDF 처리 +description: Python을 사용하여 PDF에서 텍스트/표를 추출하거나 PDF를 생성합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +PDF 파일을 읽거나 새 PDF를 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pypdf pdfplumber reportlab +``` + +## 작업 절차 + +### PDF 텍스트 추출 +1. **파일 확인**: folder_map으로 PDF 파일 위치 확인 +2. **추출 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행**: process_run으로 실행 +4. **결과 전달**: 추출된 텍스트를 사용자에게 전달 + +### PDF 생성 +1. **내용 파악**: 사용자가 원하는 문서 내용 확인 +2. **생성 스크립트 작성**: file_write로 Python 스크립트 생성 +3. **실행 및 확인**: process_run으로 실행 + +## 텍스트 추출 템플릿 +```python +import pdfplumber +import json + +results = [] +with pdfplumber.open('input.pdf') as pdf: + for i, page in enumerate(pdf.pages): + text = page.extract_text() or '' + tables = page.extract_tables() or [] + results.append({ + 'page': i + 1, + 'text': text, + 'tables': tables, + }) + +with open('pdf_extracted.json', 'w', encoding='utf-8') as f: + json.dump(results, f, ensure_ascii=False, indent=2) + +for r in results: + print(f"--- 페이지 {r['page']} ---") + print(r['text'][:500]) +``` + +## 지원 기능 +- 텍스트 추출 (페이지별) +- 표 추출 (구조 보존) +- PDF 병합 / 분할 +- PDF 생성 (reportlab) +- 페이지 회전 +- 메타데이터 읽기 + +한국어로 안내하세요. 원본 PDF는 수정하지 마세요. diff --git a/src/AxCopilot/skills/perf-audit.skill.md b/src/AxCopilot/skills/perf-audit.skill.md new file mode 100644 index 0000000..9db18d8 --- /dev/null +++ b/src/AxCopilot/skills/perf-audit.skill.md @@ -0,0 +1,94 @@ +--- +name: perf-audit +label: 성능 감사 +description: 코드 복잡도, 성능 병목, 메모리 이슈를 분석하고 최적화 방안을 제시합니다. +icon: \uE9D9 +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - glob + - html_create +tabs: code +--- + +코드베이스의 성능 관련 이슈를 분석하고 최적화 보고서를 생성하세요. + +## 워크플로우 + +1. **프로젝트 분석**: folder_map으로 구조 파악, 언어/프레임워크 식별 +2. **복잡도 분석**: 파일별 줄 수, 메서드 크기, 중첩 깊이 측정 +3. **성능 안티패턴 탐지**: grep으로 알려진 성능 이슈 패턴 검색 +4. **메모리 이슈 탐지**: 리소스 해제 누락, 대용량 할당 패턴 +5. **보고서 생성**: html_create로 성능 감사 보고서 + +## 분석 항목 + +### 코드 복잡도 지표 +- **파일 크기**: 500줄 이상 파일 식별 +- **메서드 크기**: 50줄 이상 메서드 식별 +- **중첩 깊이**: 4단계 이상 들여쓰기 +- **매개변수 수**: 5개 이상 파라미터 메서드 + +### 성능 안티패턴 + +#### 데이터베이스 +- N+1 쿼리 패턴 (루프 내 DB 호출) +- SELECT * 사용 (불필요한 컬럼 로드) +- 인덱스 미사용 쿼리 힌트 + +#### 메모리 +- IDisposable 미해제 (using 미사용) +- 대용량 문자열 결합 (StringBuilder 미사용) +- 정적 컬렉션 무한 증가 +- 이벤트 핸들러 미해제 (메모리 누수) + +#### I/O +- 동기 파일 I/O (async 미사용) +- 동기 네트워크 호출 +- 불필요한 직렬화/역직렬화 + +#### 알고리즘 +- O(n²) 이상 루프 (중첩 foreach/for) +- 반복 계산 (캐싱 미적용) +- LINQ 체인의 불필요한 ToList() + +#### 프론트엔드 +- 불필요한 리렌더링 패턴 +- 대용량 번들 임포트 +- 이미지 최적화 미적용 + +### .NET 전용 패턴 +``` +탐지 대상: +- Task.Result / .Wait() (데드락 위험) +- lock 내부 async 호출 +- GC.Collect() 직접 호출 +- Reflection 반복 사용 +- string + string 반복 (루프 내) +``` + +## 출력 형식 + +### 성능 감사 보고서 + +**요약 대시보드** +| 지표 | 값 | 상태 | +|------|-----|------| +| 총 파일 수 | ... | — | +| 대형 파일 (500줄+) | ... | ⚠ | +| 대형 메서드 (50줄+) | ... | ⚠ | +| 성능 안티패턴 | ... | 🔴 | +| 메모리 이슈 | ... | 🟡 | + +**상세 이슈 목록** +| 우선순위 | 파일 | 라인 | 이슈 | 영향 | 권장 조치 | +|---------|------|------|------|------|----------| +| 🔴 높음 | ... | ... | N+1 쿼리 | 응답 지연 | 일괄 로드 | + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 성능 이슈는 영향도와 수정 난이도를 함께 평가 +- 추측보다 패턴 기반 탐지 우선 +- 한국어로 작성 diff --git a/src/AxCopilot/skills/pptx-creator.skill.md b/src/AxCopilot/skills/pptx-creator.skill.md new file mode 100644 index 0000000..eeea93c --- /dev/null +++ b/src/AxCopilot/skills/pptx-creator.skill.md @@ -0,0 +1,111 @@ +--- +name: pptx-creator +label: PPT 프레젠테이션 생성 +description: Python을 사용하여 전문적인 PowerPoint 프레젠테이션을 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE7BE +requires: python +tabs: cowork +--- + +사용자의 요구에 맞는 PowerPoint 프레젠테이션을 Python으로 생성하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install python-pptx +``` + +## 양식 활용 (마스터 슬라이드 템플릿) +작업 폴더에 PPT 양식이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더를 스캔하여 `.pptx` 파일 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본" 포함 + - 또는 사용자가 명시적으로 "XX 양식으로 작성해줘" 요청 + - 또는 사용자가 특정 .pptx 파일명을 언급 +3. **양식 구조 파악**: `document_read`로 양식의 슬라이드 레이아웃 목록 확인 +4. **양식 기반 생성**: + ```python + prs = Presentation('양식_발표.pptx') + # 마스터 슬라이드의 배경, 로고, 색 테마, 폰트가 자동 상속 + # 기존 슬라이드 제거 후 새 내용 추가 + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + ``` +5. **레이아웃 확인** (양식마다 다를 수 있음): + ```python + for i, layout in enumerate(prs.slide_layouts): + print(f'{i}: {layout.name}') + ``` +6. **양식이 없으면**: 아래 기본 템플릿으로 새 프레젠테이션 생성 + +## 작업 절차 +1. **요구사항 파악**: 발표 주제, 슬라이드 수, 스타일 확인 +2. **양식 확인**: folder_map으로 작업 폴더에 양식 .pptx 파일이 있는지 확인 +3. **스크립트 작성**: file_write로 Python 스크립트 생성 +4. **실행**: process_run으로 스크립트 실행 +5. **결과 안내**: 생성된 .pptx 파일 경로를 사용자에게 전달 + +## 스크립트 템플릿 +```python +from pptx import Presentation +from pptx.util import Inches, Pt, Emu +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN +import os + +# 양식 파일 자동 감지 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.pptx') and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +# 양식이 있으면 활용, 없으면 새 프레젠테이션 +if template_file: + prs = Presentation(template_file) + # 기존 슬라이드 제거 (마스터/레이아웃은 유지) + while len(prs.slides) > 0: + rId = prs.slides._sldIdLst[0].rId + prs.part.drop_rel(rId) + del prs.slides._sldIdLst[0] + print(f'양식 활용: {template_file}') + print(f'사용 가능한 레이아웃: {[l.name for l in prs.slide_layouts]}') +else: + prs = Presentation() + prs.slide_width = Inches(13.333) + prs.slide_height = Inches(7.5) + +# 제목 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[0]) +slide.shapes.title.text = '프레젠테이션 제목' +if len(slide.placeholders) > 1: + slide.placeholders[1].text = '부제목' + +# 내용 슬라이드 +slide = prs.slides.add_slide(prs.slide_layouts[1]) +slide.shapes.title.text = '섹션 제목' +body = slide.placeholders[1] +body.text = '첫 번째 포인트' +p = body.text_frame.add_paragraph() +p.text = '두 번째 포인트' + +prs.save('presentation.pptx') +print('프레젠테이션 생성 완료: presentation.pptx') +``` + +## 지원 기능 +- 제목/내용/빈 슬라이드 레이아웃 +- 텍스트 서식 (글꼴, 크기, 색상, 정렬) +- 표 삽입 +- 이미지 삽입 +- 도형 (사각형, 원, 화살표) +- 차트 (막대, 선, 원형) +- 슬라이드 번호 +- 마스터 슬라이드 커스터마이징 +- **양식 파일 기반 마스터/레이아웃 상속** (배경, 로고, 색 테마, 폰트 자동 유지) + +한국어로 안내하세요. 작업 폴더에 결과 파일을 저장하세요. diff --git a/src/AxCopilot/skills/prd-generator.skill.md b/src/AxCopilot/skills/prd-generator.skill.md new file mode 100644 index 0000000..8236401 --- /dev/null +++ b/src/AxCopilot/skills/prd-generator.skill.md @@ -0,0 +1,100 @@ +--- +name: prd-generator +label: 요구사항 정의서 (PRD) +description: 제품 요구사항 정의서, 유저 스토리, 수용 기준을 체계적으로 생성합니다. +icon: \uE8A5 +allowed-tools: + - file_read + - file_write + - html_create + - docx_create + - document_plan + - document_assemble +tabs: cowork +--- + +제품/기능의 요구사항 정의서(PRD)를 체계적으로 작성하세요. + +## 워크플로우 + +1. **요구사항 수집**: 사용자에게 다음을 확인 + - 제품/기능 이름 + - 목적과 배경 + - 대상 사용자 + - 핵심 기능 목록 + - 제약 조건 (기술, 일정, 예산) + +2. **구조화**: document_plan으로 PRD 개요 설계 + +3. **상세 작성**: 섹션별 상세 내용 작성 + - 유저 스토리 (As a... I want... So that...) + - 수용 기준 (Given... When... Then...) + - 기능 우선순위 (MoSCoW) + +4. **문서 생성**: document_assemble 또는 html_create로 최종 문서 + +## PRD 구조 + +### 1. 개요 +- 제품/기능 이름 +- 버전 / 작성일 / 작성자 +- 문서 목적 + +### 2. 배경 및 목적 +- 비즈니스 배경 +- 해결하려는 문제 +- 기대 효과 (정량적 KPI) + +### 3. 대상 사용자 +- 사용자 페르소나 +- 사용 시나리오 +- 사용자 여정 맵 + +### 4. 기능 요구사항 + +#### 유저 스토리 형식 +``` +US-001: [기능명] +As a [역할], +I want [기능], +So that [가치]. + +수용 기준: +- Given [사전 조건], When [행동], Then [기대 결과] +- Given ..., When ..., Then ... + +우선순위: Must Have / Should Have / Could Have / Won't Have +``` + +### 5. 비기능 요구사항 +- 성능 (응답 시간, 처리량) +- 보안 (인증, 권한, 암호화) +- 접근성 (WCAG 수준) +- 호환성 (브라우저, OS, 디바이스) + +### 6. 기술 제약 +- 기술 스택 제한 +- 연동 시스템 +- 데이터 마이그레이션 + +### 7. 일정 및 마일스톤 +| 마일스톤 | 예정일 | 산출물 | +|---------|--------|--------| +| 설계 완료 | ... | 상세 설계서 | +| 개발 완료 | ... | 릴리즈 빌드 | +| QA 완료 | ... | 테스트 보고서 | + +### 8. 성공 지표 +- 핵심 KPI 및 측정 방법 +- 목표 수치 + +### 9. 리스크 및 대안 +| 리스크 | 영향 | 대안 | +|--------|------|------| +| ... | 높음 | ... | + +## 규칙 +- 사용자 관점에서 작성 (기술 용어 최소화) +- 유저 스토리는 INVEST 원칙 준수 (Independent, Negotiable, Valuable, Estimable, Small, Testable) +- 수용 기준은 테스트 가능하도록 구체적으로 +- 한국어로 작성 (영어 용어 병기 가능) diff --git a/src/AxCopilot/skills/refactor.skill.md b/src/AxCopilot/skills/refactor.skill.md new file mode 100644 index 0000000..a58d54e --- /dev/null +++ b/src/AxCopilot/skills/refactor.skill.md @@ -0,0 +1,65 @@ +--- +name: refactor +label: 리팩토링 가이드 +description: 코드베이스를 분석하여 리팩토링 포인트를 식별하고 실행 계획을 생성합니다. +icon: \uE90F +allowed-tools: + - search_codebase + - grep + - file_read + - code_review + - folder_map + - lsp_code_intel +tabs: code +--- + +코드베이스를 분석하여 리팩토링이 필요한 부분을 식별하고 개선 계획을 수립하세요. + +## 워크플로우 + +1. **구조 파악**: folder_map + grep으로 프로젝트 전체 구조 분석 +2. **코드 스멜 탐지**: + - 중복 코드 (grep으로 유사 패턴 검색) + - 긴 메서드/클래스 (file_read로 크기 확인) + - 복잡한 조건문 (중첩 if/switch) + - 미사용 코드 (lsp_code_intel로 참조 확인) +3. **의존성 분석**: lsp_code_intel로 참조 관계 파악 +4. **우선순위 결정**: 영향도 × 난이도 매트릭스 +5. **리팩토링 계획 생성**: 단계별 실행 계획 + +## 분석 항목 + +### 코드 스멜 (Code Smells) +- **중복 코드**: 3곳 이상 반복되는 유사 코드 +- **거대 클래스**: 500줄 이상의 클래스 +- **긴 메서드**: 50줄 이상의 메서드 +- **매개변수 과다**: 5개 이상 파라미터 +- **의존성 순환**: 상호 참조 관계 +- **매직 넘버**: 하드코딩된 숫자/문자열 +- **깊은 중첩**: 4단계 이상 들여쓰기 + +### 리팩토링 기법 (제안) +- Extract Method / Extract Class +- Rename (변수, 메서드, 클래스) +- Move Method / Move Field +- Replace Conditional with Polymorphism +- Introduce Parameter Object +- Remove Dead Code + +## 출력 형식 + +### 리팩토링 보고서 +| 우선순위 | 파일 | 이슈 | 제안 | 영향도 | 난이도 | +|---------|------|------|------|--------|--------| +| 🔴 높음 | ... | ... | ... | ★★★ | ★☆☆ | +| 🟡 중간 | ... | ... | ... | ★★☆ | ★★☆ | + +### 실행 계획 +1. [안전한 변경부터] ... +2. [테스트 추가 후] ... +3. [구조 변경] ... + +## 규칙 +- 코드를 직접 수정하지 않음 (분석 + 계획만) +- 기존 테스트가 있으면 테스트 커버리지 확인 +- 팀 컨벤션/스타일 가이드 존중 diff --git a/src/AxCopilot/skills/regex-helper.skill.md b/src/AxCopilot/skills/regex-helper.skill.md new file mode 100644 index 0000000..91e10dd --- /dev/null +++ b/src/AxCopilot/skills/regex-helper.skill.md @@ -0,0 +1,86 @@ +--- +name: regex-helper +label: 정규식 도우미 +description: 정규식 패턴을 생성하고, 기존 패턴을 해석하며, 테스트 케이스로 검증합니다. +icon: \uE8FD +tabs: code +allowed-tools: + - regex_tool + - clipboard_tool + - file_read +--- + +사용자의 요구에 맞는 정규식 패턴을 작성하거나, 기존 패턴을 해석하고 테스트하세요. + +## 작업 절차 + +1. **요구사항 파악**: 사용자의 요청 유형을 판별 + - **패턴 생성**: "이메일 주소를 찾는 정규식 만들어줘" + - **패턴 해석**: "이 정규식이 무슨 뜻이야? `^[\w.-]+@[\w.-]+\.\w+$`" + - **패턴 테스트**: "이 패턴이 이 문자열에 매칭되는지 확인해줘" +2. **패턴 작성 또는 분석**: + - 생성: 요구사항을 분석하여 정규식 패턴 작성 + - 해석: 패턴을 구성 요소별로 분해하여 설명 +3. **테스트 수행**: regex_tool로 패턴을 테스트 케이스에 적용 + - 매칭되어야 할 문자열 (positive cases) + - 매칭되지 않아야 할 문자열 (negative cases) +4. **결과 설명**: 매칭 결과와 캡처 그룹을 상세히 설명 +5. **최적화 제안**: 성능 또는 가독성 개선이 가능하면 대안 제시 + +## 패턴 생성 가이드 + +### 자주 사용되는 패턴 +| 용도 | 패턴 | 설명 | +|------|------|------| +| 이메일 | `[\w.-]+@[\w.-]+\.\w{2,}` | 기본 이메일 형식 | +| 전화번호 (한국) | `0\d{1,2}-\d{3,4}-\d{4}` | 010-1234-5678 형식 | +| 날짜 (YYYY-MM-DD) | `\d{4}-(?:0[1-9]\|1[0-2])-(?:0[1-9]\|[12]\d\|3[01])` | ISO 날짜 형식 | +| IP 주소 | `(?:\d{1,3}\.){3}\d{1,3}` | IPv4 기본 | +| URL | `https?://[\w.-]+(?:/[\w./?#&=-]*)?` | HTTP/HTTPS URL | +| 한글만 | `[가-힣]+` | 한글 문자 | +| 사업자등록번호 | `\d{3}-\d{2}-\d{5}` | 123-45-67890 형식 | + +### 패턴 해석 형식 +패턴을 해석할 때는 다음 구조로 설명하세요: +``` +패턴: ^(\d{3})-(\d{2})-(\d{5})$ +해석: + ^ → 문자열 시작 + (\d{3}) → 캡처 그룹 1: 숫자 3자리 + - → 하이픈 (리터럴) + (\d{2}) → 캡처 그룹 2: 숫자 2자리 + - → 하이픈 (리터럴) + (\d{5}) → 캡처 그룹 3: 숫자 5자리 + $ → 문자열 끝 +``` + +## 테스트 형식 +테스트 결과는 다음 형식으로 표시하세요: +``` +패턴: \d{3}-\d{2}-\d{5} + +✅ 매칭 성공: + "123-45-67890" → 전체 매칭: "123-45-67890" + "사업자번호: 123-45-67890입니다" → 부분 매칭: "123-45-67890" + +❌ 매칭 실패: + "12-345-67890" → 형식 불일치 + "abc-de-fghij" → 숫자가 아닌 문자 +``` + +## 플래그 안내 +| 플래그 | 설명 | +|--------|------| +| `i` | 대소문자 무시 | +| `m` | 멀티라인 (^$가 각 줄에 적용) | +| `s` | 점(.)이 줄바꿈도 매칭 | +| `g` | 전역 검색 (모든 매칭) | + +## 규칙 +- 패턴 생성 시 positive/negative 테스트 케이스를 반드시 포함 +- 복잡한 패턴은 주석이 포함된 확장 모드(`x`)로 설명 +- 캡처 그룹이 있으면 각 그룹의 의미를 설명 +- 성능에 민감한 경우 탐욕적/게으른 수량자 선택 이유를 설명 +- 최종 패턴은 clipboard_tool로 클립보드에 복사 + +한국어로 안내하세요. diff --git a/src/AxCopilot/skills/release-note.skill.md b/src/AxCopilot/skills/release-note.skill.md new file mode 100644 index 0000000..2dc122a --- /dev/null +++ b/src/AxCopilot/skills/release-note.skill.md @@ -0,0 +1,96 @@ +--- +name: release-note +label: 릴리즈 노트 생성 +description: 비개발자 대상의 사용자 친화적인 릴리즈 노트를 자동 생성합니다. +icon: \uE70B +tabs: code +allowed-tools: + - file_read + - file_write + - clipboard_tool + - html_create +--- + +사용자(비개발자) 대상의 읽기 쉬운 릴리즈 노트를 작성하세요. + +## 작업 절차 + +1. **변경 정보 수집**: 사용자에게 다음 정보를 확인 + - 버전 번호 (예: v1.6.0) + - 릴리즈 날짜 + - 주요 변경 내용 (기능 추가, 개선, 버그 수정) + - 참고 자료: CHANGELOG, 커밋 이력, 개발 문서 등 +2. **내용 분류**: 수집된 변경 사항을 사용자 관점으로 분류 + - 기술 용어 → 사용자 언어로 변환 + - 내부 리팩토링 등 사용자에게 무관한 항목은 제외 +3. **릴리즈 노트 초안 작성**: 아래 템플릿 기반으로 작성 +4. **사용자 검토**: 초안을 보여주고 수정 요청 반영 +5. **최종 출력**: Markdown, HTML, 또는 텍스트 형식으로 저장 + +## 릴리즈 노트 템플릿 + +```markdown +# [제품명] v[버전] 업데이트 안내 + +안녕하세요. [제품명] v[버전] 업데이트 소식을 안내드립니다. + +## 🎉 새로운 기능 + +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] +- **[기능 이름]**: [사용자가 얻는 혜택 중심으로 1~2문장 설명] + +## ✨ 개선 사항 + +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] +- **[개선 영역]**: [무엇이 어떻게 좋아졌는지 설명] + +## 🐛 문제 해결 + +- [사용자가 겪었던 문제]를 해결했습니다. +- [사용자가 겪었던 문제]를 해결했습니다. + +## ⚠️ 알려진 이슈 + +- [현재 알려진 제한 사항이나 이슈] +- [해결 예정 시기 또는 임시 해결 방법] + +--- + +문의 사항이 있으시면 [연락처/채널]로 알려주세요. +감사합니다. +``` + +## 작성 원칙 + +### 사용자 언어로 변환 +| 개발 용어 (사용 금지) | 사용자 표현 (사용) | +|---------------------|-------------------| +| API 엔드포인트 추가 | 새로운 연동 기능 추가 | +| 메모리 누수 수정 | 장시간 사용 시 느려지는 문제 해결 | +| UI 리팩토링 | 화면 디자인 개선 | +| 캐시 최적화 | 실행 속도 개선 | +| null 참조 오류 수정 | 예기치 않은 오류로 종료되는 문제 해결 | +| 인코딩 이슈 수정 | 한글이 깨져 보이는 문제 해결 | +| 동시성 버그 수정 | 여러 작업 동시 실행 시 오류 발생 문제 해결 | + +### 작성 규칙 +- **혜택 중심**: "무엇을 했다"가 아닌 "사용자에게 어떤 도움이 되는지" 설명 +- **간결**: 한 항목당 1~2문장 이내 +- **구체적**: "성능 개선" → "파일 열기 속도가 약 2배 빨라졌습니다" +- **긍정적 톤**: 문제를 "해결했습니다", 기능을 "추가했습니다" +- **이모지 활용**: 섹션별 시각적 구분 (새 기능: 🎉, 개선: ✨, 수정: 🐛, 주의: ⚠️) + +## 출력 형식 +- **Markdown**: 기본 출력 형식 (.md) +- **HTML**: html_create로 스타일이 적용된 웹 페이지 생성 +- **텍스트**: 이메일 본문용 서식 없는 텍스트 +- 사용자가 원하는 형식으로 제공 + +## 규칙 +- 내부 기술 구현 세부사항은 노출하지 않음 +- 사용자에게 무관한 변경(코드 리팩토링, 테스트 추가 등)은 제외 +- Breaking Change가 있으면 "이전 버전과 달라진 점" 섹션 추가 +- 업데이트 방법 안내를 포함 (인스톨러 경로, 주의사항) +- 최종 결과는 파일 저장과 클립보드 복사 모두 제공 + +한국어로 안내하세요. diff --git a/src/AxCopilot/skills/report-writer.skill.md b/src/AxCopilot/skills/report-writer.skill.md new file mode 100644 index 0000000..f5e9181 --- /dev/null +++ b/src/AxCopilot/skills/report-writer.skill.md @@ -0,0 +1,33 @@ +--- +name: report-writer +label: 보고서 작성 +description: 작업 폴더의 데이터를 분석하여 체계적인 업무 보고서를 생성합��다. +icon: \uE9F9 +tabs: cowork +--- + +작업 폴더의 파일과 데이터를 분석하여 업무 보고서를 작성하세요. + +다음 도구를 사용하세요: +1. folder_map — 작업 폴더의 파일 구조 파악 +2. file_read — 관련 데이터 파일 읽기 (CSV, Excel, 텍스트) +3. file_write — 보고서 파일 생성 (HTML 또는 Markdown) + +보고서 구성: +## 제목 +- 작성 일시, 작성자 (요청 시) + +## 요약 (Executive Summary) +- 핵심 내용을 3줄 이내로 요약 + +## 본문 +- 데이터 기반 분석 결과 +- 표/차트를 활용한 시각적 정리 +- 주요 발견 사항 + +## 결론 및 제안 +- 결론 요약 +- 향후 조치 사항 + +HTML 보고서 생성 시 현재 적용된 디자인 무드를 반영하세요. +한국어로 작성하세요. diff --git a/src/AxCopilot/skills/security-audit.skill.md b/src/AxCopilot/skills/security-audit.skill.md new file mode 100644 index 0000000..d32ed32 --- /dev/null +++ b/src/AxCopilot/skills/security-audit.skill.md @@ -0,0 +1,93 @@ +--- +name: security-audit +label: 보안 코드 감사 +description: 코드베이스의 보안 취약점을 점검하고 OWASP 기반 보안 보고서를 생성합니다. +icon: \uE72E +allowed-tools: + - file_read + - grep + - folder_map + - search_codebase + - html_create + - glob +tabs: code +--- + +코드베이스의 보안 취약점을 체계적으로 점검하고 보고서를 생성하세요. + +## 워크플로우 + +1. **스캔 범위 확인**: folder_map으로 프로젝트 구조 파악, 언어/프레임워크 식별 +2. **취약점 패턴 탐지**: grep으로 위험 패턴 검색 +3. **의존성 분석**: 패키지 파일(package.json, *.csproj, requirements.txt) 읽기 +4. **비밀 정보 노출 검사**: API 키, 토큰, 비밀번호 하드코딩 탐지 +5. **보고서 생성**: html_create로 보안 감사 보고서 생성 + +## OWASP Top 10 점검 항목 + +### A01 — 접근 제어 취약 +- 인증 없는 API 엔드포인트 +- 하드코딩된 권한 체크 +- 관리자 경로 노출 + +### A02 — 암호화 실패 +- 평문 비밀번호 저장 +- 약한 해시 알고리즘 (MD5, SHA1) +- HTTP (비HTTPS) 통신 + +### A03 — 인젝션 +- SQL 인젝션 (문자열 결합 쿼리) +- XSS (innerHTML, dangerouslySetInnerHTML) +- 명령 인젝션 (Process.Start, exec, system) +- 경로 순회 (../ 미검증) + +### A04 — 불안전한 설계 +- 비즈니스 로직 검증 누락 +- 레이트 리밋 미적용 + +### A05 — 보안 설정 오류 +- 디버그 모드 활성화 상태 +- 기본 자격증명 사용 +- 불필요한 포트/서비스 노출 + +### A07 — 인증 실패 +- 약한 비밀번호 정책 +- 세션 만료 미설정 +- 브루트포스 방어 부재 + +### A09 — 로깅/모니터링 부족 +- 보안 이벤트 미기록 +- 민감 정보 로그 출력 + +## 비밀 정보 탐지 패턴 + +``` +grep 대상 패턴: +- password\s*=\s*["'][^"']+["'] +- api[_-]?key\s*=\s*["'][^"']+["'] +- secret\s*=\s*["'][^"']+["'] +- token\s*=\s*["'][A-Za-z0-9+/=]{20,}["'] +- -----BEGIN (RSA |EC )?PRIVATE KEY----- +- AWS_ACCESS_KEY_ID +- AKIA[0-9A-Z]{16} +``` + +## 출력 형식 + +### 보안 감사 보고서 +| 위험도 | 카테고리 | 파일 | 라인 | 내용 | 권장 조치 | +|--------|---------|------|------|------|----------| +| 🔴 심각 | A03 인젝션 | ... | ... | SQL 문자열 결합 | 파라미터 바인딩 사용 | +| 🟡 경고 | A02 암호화 | ... | ... | MD5 해시 사용 | SHA-256 이상 전환 | +| 🟢 참고 | A09 로깅 | ... | ... | 에러 로깅 미흡 | 보안 이벤트 로깅 추가 | + +### 요약 통계 +- 심각/경고/참고 건수 +- OWASP 카테고리별 분포 +- 우선 조치 항목 Top 5 + +## 규칙 +- 코드를 수정하지 않음 (분석 + 보고서만) +- 발견된 비밀 정보는 마스킹하여 보고 (앞 4자만 표시) +- 위험도는 보수적으로 평가 +- 한국어로 보고서 작성 diff --git a/src/AxCopilot/skills/sql-report.skill.md b/src/AxCopilot/skills/sql-report.skill.md new file mode 100644 index 0000000..76efeca --- /dev/null +++ b/src/AxCopilot/skills/sql-report.skill.md @@ -0,0 +1,52 @@ +--- +name: sql-report +label: SQL 리포트 +description: DB 쿼리를 실행하고 결과를 차트화하여 HTML/Excel 보고서로 생성합니다. +icon: \uE968 +allowed-tools: + - sql_tool + - chart_create + - excel_create + - html_create + - data_pivot +tabs: cowork +--- + +데이터베이스에서 쿼리를 실행하고 결과를 시각화된 보고서로 생성하세요. + +## 워크플로우 + +1. **DB 확인**: sql_tool로 테이블 목록 및 스키마 확인 +2. **쿼리 작성**: 사용자 요청에 맞는 SQL 쿼리 작성 +3. **데이터 조회**: sql_tool로 쿼리 실행 +4. **데이터 가공**: data_pivot으로 집계/피벗 (필요 시) +5. **시각화**: chart_create로 차트 생성 +6. **보고서**: html_create 또는 excel_create로 최종 보고서 생성 + +## 쿼리 작성 원칙 +- SELECT 쿼리만 실행 (데이터 변경 금지) +- 결과 행 수 제한: LIMIT 1000 (대량 데이터 방지) +- 인덱스 활용 쿼리 작성 +- 한글 컬럼명은 alias로 변환 + +## 보고서 구성 + +### 1. 데이터 요약 +- 조회 조건, 기간, 데이터 건수 +- 기본 통계 (합계, 평균, 최대/최소) + +### 2. 시각화 +- 적절한 차트 유형 자동 선택 +- 비교 → 바 차트 +- 추세 → 라인 차트 +- 비율 → 파이/도넛 차트 + +### 3. 상세 데이터 +- Excel: 원본 데이터 + 서식 + 수식 +- HTML: 테이블 + 정렬/필터 + +## 규칙 +- DB 경로는 사용자에게 확인 +- 민감 데이터(개인정보) 마스킹 권고 +- 쿼리 실행 전 사용자 승인 +- 한국어로 보고서 작성 diff --git a/src/AxCopilot/skills/translate.skill.md b/src/AxCopilot/skills/translate.skill.md new file mode 100644 index 0000000..bc793de --- /dev/null +++ b/src/AxCopilot/skills/translate.skill.md @@ -0,0 +1,60 @@ +--- +name: translate +label: 번역 + 교정 +description: 문서나 텍스트를 번역하고 전문 용어를 보존하며 교정합니다. +icon: \uE8C1 +allowed-tools: + - file_read + - file_write + - document_read + - clipboard_tool +tabs: all +--- + +사용자가 제공한 텍스트 또는 문서를 번역하고 교정하세요. + +## 워크플로우 + +1. **입력 확인**: 텍스트 직접 입력 또는 파일 경로 확인 +2. **언어 감지**: 원문 언어를 자동 감지 +3. **번역 실행**: + - 원문의 뉘앙스와 문맥을 살려 번역 + - 전문 용어는 원어를 괄호 안에 병기: "수율(Yield)" + - 문화적 차이를 고려한 자연스러운 표현 사용 +4. **교정**: 번역 결과의 문법, 맞춤법, 어색한 표현 수정 +5. **결과 제공**: 번역문 + 주요 용어 대조표 + +## 번역 원칙 + +### 정확성 +- 원문의 의미를 정확하게 전달 +- 숫자, 날짜, 고유명사는 원문 그대로 유지 +- 약어는 처음 등장 시 풀어 번역 + +### 가독성 +- 목표 언어의 자연스러운 문체 사용 +- 긴 문장은 적절히 분리 +- 수동태 → 능동태 변환 (한국어의 경우) + +### 전문성 +- 분야별 전문 용어 일관 사용 +- 동일 용어는 문서 전체에서 통일 +- 번역 불가능한 용어는 원어 유지 + +## 출력 형식 + +``` +## 번역 결과 + +[번역된 텍스트] + +--- + +## 용어 대조표 +| 원문 | 번역 | 비고 | +|------|------|------| +| Yield | 수율 | 반도체 공정 용어 | +``` + +## 지원 언어 +한국어 ↔ 영어 / 일본어 / 중국어 (간/번체) / 독일어 / 프랑스어 / 스페인어 diff --git a/src/AxCopilot/skills/weekly-report.skill.md b/src/AxCopilot/skills/weekly-report.skill.md new file mode 100644 index 0000000..342449e --- /dev/null +++ b/src/AxCopilot/skills/weekly-report.skill.md @@ -0,0 +1,65 @@ +--- +name: weekly-report +label: 주간 보고서 +description: 작업 폴더의 변경 이력을 기반으로 자동 주간보고 초안을 생성합니다. +icon: \uE787 +allowed-tools: + - git_tool + - folder_map + - file_read + - file_watch + - html_create + - docx_create + - text_summarize +tabs: cowork +--- + +작업 폴더의 최근 활동을 분석하여 주간 보고서 초안을 자동 생성하세요. + +## 워크플로우 + +1. **활동 수집**: + - git_tool로 최근 7일간 커밋 이력 조회 + - file_watch로 최근 변경/생성된 파일 목록 확인 + - folder_map으로 프로젝트 구조 파악 + +2. **내용 분석**: + - 커밋 메시지 분류 (기능 추가, 버그 수정, 리팩토링 등) + - 변경 파일 유형별 분류 + - 주요 변경사항 요약 + +3. **보고서 작성**: + - HTML 또는 Word 형식으로 보고서 생성 + - 차트/표로 활동 통계 시각화 + +## 보고서 구성 + +### 1. 주간 요약 +- 보고 기간: yyyy-MM-dd ~ yyyy-MM-dd +- 주요 성과 (3줄 이내) + +### 2. 완료 항목 +| 번호 | 구분 | 내용 | 비고 | +|------|------|------|------| +| 1 | 기능 | ... | 커밋 참조 | + +### 3. 진행 중 항목 +- 현재 작업 중인 사항 +- 진척률 (가능하면) + +### 4. 이슈 및 리스크 +- 지연 사항 +- 블로킹 이슈 + +### 5. 다음 주 계획 +- 예정 작업 항목 + +### 6. 활동 통계 (차트) +- 일별 커밋 수 +- 파일 유형별 변경 비율 + +## 규칙 +- 사실 기반으로 작성 (추측 금지) +- Git 이력이 없으면 파일 변경 이력만으로 작성 +- 한국어로 작성 +- 보고서 톤: 간결하고 전문적 diff --git a/src/AxCopilot/skills/xlsx-analyzer.skill.md b/src/AxCopilot/skills/xlsx-analyzer.skill.md new file mode 100644 index 0000000..267a312 --- /dev/null +++ b/src/AxCopilot/skills/xlsx-analyzer.skill.md @@ -0,0 +1,97 @@ +--- +name: xlsx-analyzer +label: Excel 데이터 분석 +description: Python을 사용하여 Excel/CSV 데이터를 분석하고 보고서를 생성합니다. 작업 폴더의 양식 파일을 자동 활용합니다. +icon: \uE9F9 +requires: python +tabs: cowork +--- + +작업 폴더의 Excel 또는 CSV 데이터를 Python으로 분석하세요. + +## 사전 준비 +필요한 패키지를 확인하고 설치하세요: +``` +process_run: pip install pandas openpyxl +``` + +## 양식 활용 (Excel 보고서 템플릿) +작업 폴더에 Excel 양식 파일이 있으면 **반드시** 활용하세요: + +1. **양식 탐색**: `folder_map`으로 작업 폴더에서 `.xlsx` 파일 목록 확인 +2. **양식 후보 판별**: + - 파일명에 "양식", "template", "서식", "표준", "기본", "보고서양식" 포함 + - 또는 사용자가 "XX 양식에 맞춰서 작성해줘" 요청 + - 또는 사용자가 특정 .xlsx 파일명을 양식으로 지정 +3. **양식 구조 파악**: `document_read`로 양식의 시트 구조, 셀 레이아웃 확인 +4. **양식 기반 데이터 삽입**: + ```python + from openpyxl import load_workbook + wb = load_workbook('양식_보고서.xlsx') + ws = wb.active + # 양식의 서식(셀 병합, 테두리, 글꼴, 색상, 열 너비)이 그대로 유지됨 + # 데이터 영역에만 새 값 삽입 + ws['B3'] = '분석 결과값' + wb.save('결과_보고서.xlsx') + ``` +5. **양식이 없으면**: 아래 기본 방식으로 분석 결과 생성 + +## 작업 절차 +1. **데이터 파일 탐색**: folder_map으로 작업 폴더에서 .xlsx, .csv 파일 확인 +2. **양식 확인**: 양식 .xlsx 파일이 있는지 확인 (데이터 파일과 양식 파일 구분) +3. **데이터 읽기**: file_read 또는 document_read로 파일 구조 파악 +4. **분석 스크립트 작성**: file_write로 Python 분석 스크립트 생성 +5. **실행**: process_run으로 스크립트 실행 +6. **결과 보고**: 분석 결과를 사용자에게 정리하여 전달 + +## 분석 스크립트 템플릿 +```python +import pandas as pd +import json +import os + +df = pd.read_excel('data.xlsx') # 또는 pd.read_csv('data.csv') + +report = { + 'shape': list(df.shape), + 'columns': list(df.columns), + 'dtypes': {col: str(dtype) for col, dtype in df.dtypes.items()}, + 'missing': df.isnull().sum().to_dict(), + 'describe': df.describe().to_dict(), +} + +# 양식 파일로 결과 내보내기 +template_keywords = ['양식', 'template', '서식', '표준', '기본'] +template_file = None +for f in os.listdir('.'): + if f.endswith('.xlsx') and f != 'data.xlsx' and any(kw in f.lower() for kw in template_keywords): + template_file = f + break + +if template_file: + from openpyxl import load_workbook + wb = load_workbook(template_file) + ws = wb.active + # 양식 서식 유지하면서 데이터 삽입 + print(f'양식 활용: {template_file}') + # TODO: 양식 구조에 맞게 데이터 삽입 로직 작성 + wb.save('결과_보고서.xlsx') +else: + # 양식 없으면 JSON으로 저장 + with open('analysis_result.json', 'w', encoding='utf-8') as f: + json.dump(report, f, ensure_ascii=False, indent=2, default=str) + +print(json.dumps(report, ensure_ascii=False, indent=2, default=str)) +``` + +## 지원 분석 +- 기본 통계 (평균, 중앙값, 표준편차, 분위수) +- 결측치 분석 +- 컬럼별 고유값 분포 +- 피벗 테이블 / 그룹별 집계 +- 시트 간 비교 분석 +- 필터링 및 조건부 추출 +- 분석 결과를 새 Excel로 내보내기 +- **양식 파일 기반 보고서 생성** (셀 서식, 병합, 테두리, 차트 영역 유지) + +한국어로 안내하세요. 원본 파일은 수정하지 마세요. diff --git a/src/AxCopilot/skills/yield-analysis.skill.md b/src/AxCopilot/skills/yield-analysis.skill.md new file mode 100644 index 0000000..408ba31 --- /dev/null +++ b/src/AxCopilot/skills/yield-analysis.skill.md @@ -0,0 +1,40 @@ +--- +name: yield-analysis +label: 수율 분석 +description: 제조/연구 데이터의 수율을 분석하고 개선 포인트를 도출합니다. +icon: \uE9D2 +tabs: cowork +--- + +작업 폴더의 데이터를 활���하여 수율 분석을 수행하세요. + +다음 도구를 사용하세요: +1. folder_map — 데이터 파일 탐색 +2. file_read — CSV/Excel 데이터 읽기 +3. file_write — 분석 보고서 생성 + +분석 프로세스: +## 데이터 개요 +- 분석 대상 데이터셋 설명 +- 데이터 기간, 샘플 수, 주요 변수 + +## 수율 현황 +- 전체 수율 통계 (평균, 중앙값, 표준편차) +- 기간별/로트별/공정별 수율 추이 +- 목표 수율 대비 달성률 + +## 불량 분석 +- 불량 유형별 분류 및 비율 +- 파레토 분석 (상위 불량 원인) +- 시간대/조건별 불량 패턴 + +## 상관관계 분석 +- 주요 공정 변수와 수율의 관계 +- 이상치 탐지 및 원인 추정 + +## 개선 제안 +- 수율 향상을 위한 구체적 조치 사항 +- 우선순위별 개선 로드맵 +- 예상 개선 효과 + +표와 수치를 적극 활용하세요. 한국어로 작성하세요. diff --git a/src/AxKeyEncryptor/AxKeyEncryptor.csproj b/src/AxKeyEncryptor/AxKeyEncryptor.csproj new file mode 100644 index 0000000..34437d9 --- /dev/null +++ b/src/AxKeyEncryptor/AxKeyEncryptor.csproj @@ -0,0 +1,18 @@ + + + WinExe + net8.0-windows + true + enable + enable + AxKeyEncryptor + AxKeyEncryptor + Resources\icon.ico + + + + + + + + diff --git a/src/AxKeyEncryptor/CryptoHelper.cs b/src/AxKeyEncryptor/CryptoHelper.cs new file mode 100644 index 0000000..a51b93c --- /dev/null +++ b/src/AxKeyEncryptor/CryptoHelper.cs @@ -0,0 +1,85 @@ +using System.Security.Cryptography; +using System.Text; + +namespace AxKeyEncryptor; + +/// +/// 앱 공용 키(Portable) 암호화/복호화 — CryptoService.cs와 동일한 로직. +/// +internal static class CryptoHelper +{ + private static readonly byte[] AppSeed = + { + // "AX-Commander-Key-0104-sj.baeck" + 2-byte pad + 0x41, 0x58, 0x2D, 0x43, 0x6F, 0x6D, 0x6D, 0x61, + 0x6E, 0x64, 0x65, 0x72, 0x2D, 0x4B, 0x65, 0x79, + 0x2D, 0x30, 0x31, 0x30, 0x34, 0x2D, 0x73, 0x6A, + 0x2E, 0x62, 0x61, 0x65, 0x63, 0x6B, 0xA7, 0x5C + }; + + private static readonly byte[] AppSalt = + { + 0x58, 0x43, 0x4D, 0x44, 0x53, 0x61, 0x6C, 0x74, + 0x9E, 0x27, 0xC1, 0x4A, 0xB3, 0x06, 0x7F, 0xD8 + }; + + private static byte[]? _appKey; + + private static byte[] GetAppKey() + { + if (_appKey != null) return _appKey; + using var pbkdf2 = new Rfc2898DeriveBytes(AppSeed, AppSalt, 100_000, HashAlgorithmName.SHA256); + _appKey = pbkdf2.GetBytes(32); + return _appKey; + } + + public static string Encrypt(string plainText) + { + if (string.IsNullOrEmpty(plainText)) return ""; + var key = GetAppKey(); + using var aes = Aes.Create(); + aes.Key = key; + aes.Mode = CipherMode.CBC; + aes.Padding = PaddingMode.PKCS7; + aes.GenerateIV(); + + using var enc = aes.CreateEncryptor(); + var plainBytes = Encoding.UTF8.GetBytes(plainText); + var cipher = enc.TransformFinalBlock(plainBytes, 0, plainBytes.Length); + + var result = new byte[16 + cipher.Length]; + Buffer.BlockCopy(aes.IV, 0, result, 0, 16); + Buffer.BlockCopy(cipher, 0, result, 16, cipher.Length); + return Convert.ToBase64String(result); + } + + public static (bool Success, string Result) Decrypt(string base64) + { + if (string.IsNullOrEmpty(base64)) return (false, "입력이 비어 있습니다."); + try + { + var raw = Convert.FromBase64String(base64); + if (raw.Length < 17) return (false, "데이터가 너무 짧습니다."); + + var key = GetAppKey(); + var iv = new byte[16]; + Buffer.BlockCopy(raw, 0, iv, 0, 16); + var cipher = new byte[raw.Length - 16]; + Buffer.BlockCopy(raw, 16, cipher, 0, cipher.Length); + + using var aes = Aes.Create(); + aes.Key = key; + aes.IV = iv; + aes.Mode = CipherMode.CBC; + aes.Padding = PaddingMode.PKCS7; + + using var dec = aes.CreateDecryptor(); + var plain = dec.TransformFinalBlock(cipher, 0, cipher.Length); + return (true, Encoding.UTF8.GetString(plain)); + } + catch (Exception ex) + { + return (false, $"복호화 오류: {ex.Message}"); + } + } +} diff --git a/src/AxKeyEncryptor/MainForm.cs b/src/AxKeyEncryptor/MainForm.cs new file mode 100644 index 0000000..8503c25 --- /dev/null +++ b/src/AxKeyEncryptor/MainForm.cs @@ -0,0 +1,754 @@ +using System.Drawing.Drawing2D; +using System.Text.Json; + +namespace AxKeyEncryptor; + +/// +/// AX Copilot — Settings Encryptor (개발자 전용) +/// Ollama / vLLM / Gemini 3종 서비스에 대한 설정값 암호화 UI +/// +public class MainForm : Form +{ + // ── 색상 테마 ─────────────────────────────────────────────────── + private static readonly Color BgDark = Color.FromArgb(24, 24, 32); + private static readonly Color BgPanel = Color.FromArgb(32, 34, 46); + private static readonly Color BgCard = Color.FromArgb(42, 44, 58); + private static readonly Color BgInput = Color.FromArgb(52, 54, 70); + private static readonly Color AccentBlue = Color.FromArgb(88, 130, 255); + private static readonly Color AccentGreen = Color.FromArgb(80, 200, 120); + private static readonly Color AccentOrange= Color.FromArgb(255, 160, 60); + private static readonly Color AccentRed = Color.FromArgb(255, 90, 90); + private static readonly Color TextPrimary = Color.FromArgb(230, 232, 240); + private static readonly Color TextSecondary= Color.FromArgb(140, 145, 170); + private static readonly Color BorderColor = Color.FromArgb(60, 64, 80); + + // ── 서비스별 탭 컨트롤 ────────────────────────────────────────── + private TabControl _tabs = null!; + + // Ollama 탭 컨트롤 + private TextBox _ollamaEndpoint = null!; + private TextBox _ollamaModel = null!; + private TextBox _ollamaEncEndpoint = null!; + private TextBox _ollamaEncModel = null!; + + // vLLM 탭 컨트롤 + private TextBox _vllmEndpoint = null!; + private TextBox _vllmModel = null!; + private TextBox _vllmApiKey = null!; + private TextBox _vllmEncEndpoint = null!; + private TextBox _vllmEncModel = null!; + private TextBox _vllmEncApiKey = null!; + + // Gemini 탭 컨트롤 + private TextBox _geminiApiKey = null!; + private TextBox _geminiModel = null!; + private TextBox _geminiEncApiKey = null!; + private TextBox _geminiEncModel = null!; + + // 하단 공용 + private RichTextBox _outputBox = null!; + private TextBox _decryptInput = null!; + private TextBox _decryptResult = null!; + + public MainForm() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + // ── 폼 기본 설정 ──────────────────────────────────────── + Text = "AX Copilot — Settings Encryptor"; + Size = new Size(760, 680); + MinimumSize = new Size(720, 620); + StartPosition = FormStartPosition.CenterScreen; + BackColor = BgDark; + ForeColor = TextPrimary; + Font = new Font("Segoe UI", 9.5f, FontStyle.Regular); + FormBorderStyle = FormBorderStyle.FixedSingle; + MaximizeBox = false; + + // 아이콘 설정 + try + { + var asm = System.Reflection.Assembly.GetExecutingAssembly(); + var stream = asm.GetManifestResourceStream("AxKeyEncryptor.Resources.icon.ico"); + if (stream != null) Icon = new Icon(stream); + } + catch { } + + // ── 헤더 패널 ────────────────────────────────────────── + var headerPanel = new Panel + { + Dock = DockStyle.Top, + Height = 60, + BackColor = Color.Transparent + }; + headerPanel.Paint += (s, e) => + { + using var brush = new LinearGradientBrush( + headerPanel.ClientRectangle, + Color.FromArgb(35, 40, 65), + Color.FromArgb(24, 24, 32), + LinearGradientMode.Vertical); + e.Graphics.FillRectangle(brush, headerPanel.ClientRectangle); + + // 타이틀 + using var titleFont = new Font("Segoe UI", 14f, FontStyle.Bold); + e.Graphics.DrawString("🔐 AX Copilot — Settings Encryptor", + titleFont, new SolidBrush(TextPrimary), 20, 8); + + // 서브타이틀 + using var subFont = new Font("Segoe UI", 8.5f, FontStyle.Regular); + e.Graphics.DrawString("AES-256-CBC 앱 공용 키 암호화 · 모든 PC에서 동일 복호화 · 개발자 전용", + subFont, new SolidBrush(TextSecondary), 48, 36); + }; + Controls.Add(headerPanel); + + // ── 메인 컨텐츠 패널 ──────────────────────────────────── + var mainPanel = new Panel + { + Dock = DockStyle.Fill, + Padding = new Padding(16, 8, 16, 16), + BackColor = BgDark + }; + Controls.Add(mainPanel); + + // ── 서비스 선택 탭 ────────────────────────────────────── + _tabs = new TabControl + { + Dock = DockStyle.Top, + Height = 260, + Font = new Font("Segoe UI", 10f, FontStyle.Regular), + Padding = new Point(12, 6) + }; + _tabs.DrawMode = TabDrawMode.OwnerDrawFixed; + _tabs.DrawItem += DrawTab; + _tabs.SizeMode = TabSizeMode.Fixed; + _tabs.ItemSize = new Size(160, 36); + + // Ollama 탭 + var ollamaPage = CreateTabPage("🟢 Ollama", AccentGreen); + BuildOllamaTab(ollamaPage); + _tabs.TabPages.Add(ollamaPage); + + // vLLM 탭 + var vllmPage = CreateTabPage("🔵 vLLM (OpenAI)", AccentBlue); + BuildVllmTab(vllmPage); + _tabs.TabPages.Add(vllmPage); + + // Gemini 탭 + var geminiPage = CreateTabPage("🟠 Gemini", AccentOrange); + BuildGeminiTab(geminiPage); + _tabs.TabPages.Add(geminiPage); + + // 복호화 검증 탭 추가 + var toolsPage = CreateTabPage("🔓 복호화 검증", AccentBlue); + BuildToolsTab(toolsPage); + _tabs.TabPages.Add(toolsPage); + + mainPanel.Controls.Add(_tabs); + + // ── 출력 로그 섹션 ────────────────────────────────────── + var outputLabel = CreateLabel("📋 출력 로그", 10f, FontStyle.Bold); + outputLabel.Dock = DockStyle.Top; + outputLabel.Height = 28; + outputLabel.Padding = new Padding(4, 8, 0, 0); + mainPanel.Controls.Add(outputLabel); + + _outputBox = new RichTextBox + { + Dock = DockStyle.Fill, + BackColor = Color.FromArgb(18, 18, 24), + ForeColor = TextPrimary, + Font = new Font("Cascadia Code", 9.5f, FontStyle.Regular, GraphicsUnit.Point, 0, + // fallback if Cascadia Code not installed + false), + BorderStyle = BorderStyle.None, + ReadOnly = true, + WordWrap = true, + Padding = new Padding(8) + }; + // Cascadia Code fallback + if (_outputBox.Font.Name != "Cascadia Code") + _outputBox.Font = new Font("Consolas", 9.5f); + mainPanel.Controls.Add(_outputBox); + + // ── 하단 상태바 ───────────────────────────────────────── + var statusBar = new Panel + { + Dock = DockStyle.Bottom, + Height = 30, + BackColor = Color.FromArgb(20, 22, 30) + }; + var statusLabel = CreateLabel(" AES-256-CBC · PBKDF2 100K iterations · 모든 PC에서 동일한 암호화 키", 8f, FontStyle.Regular); + statusLabel.ForeColor = TextSecondary; + statusLabel.Dock = DockStyle.Fill; + statusLabel.TextAlign = ContentAlignment.MiddleLeft; + statusBar.Controls.Add(statusLabel); + Controls.Add(statusBar); + + // ── 컨트롤 순서 (뒤에서 앞으로) ────────────────────────── + // Panel DockStyle 순서 보장 + Controls.SetChildIndex(statusBar, 0); + Controls.SetChildIndex(headerPanel, 0); + + mainPanel.Controls.SetChildIndex(_outputBox, 0); + mainPanel.Controls.SetChildIndex(outputLabel, 0); + mainPanel.Controls.SetChildIndex(_tabs, 0); + + AppendLog("AX Copilot Settings Encryptor 시작됨", AccentGreen); + AppendLog("", TextSecondary); + AppendLog("── 사용 방법 ──────────────────────────────────────────", AccentBlue); + AppendLog("1. 상단 탭에서 LLM 서비스(Ollama/vLLM/Gemini)를 선택합니다.", TextPrimary); + AppendLog("2. 각 필드에 평문 값(URL, 모델명, API 키)을 입력합니다.", TextPrimary); + AppendLog("3. [⚡ 전체 암호화] 버튼으로 모든 필드를 한번에 암호화합니다.", TextPrimary); + AppendLog("4. [📋 settings.json 복사] 버튼으로 암호화된 JSON을 클립보드에 복사합니다.", TextPrimary); + AppendLog("5. 복사된 JSON을 settings.json 파일의 llm 섹션에 붙여넣으면 완료!", TextPrimary); + AppendLog("", TextSecondary); + AppendLog("── 암호화 방식 ────────────────────────────────────────", AccentBlue); + AppendLog("• AES-256-CBC + PBKDF2(100K iterations, SHA256)", TextSecondary); + AppendLog("• 앱 공용 키 방식 — 모든 PC에서 동일한 키로 복호화됩니다.", TextSecondary); + AppendLog("• 배포 시 settings.json에 암호화된 값을 넣으면 앱이 자동 복호화합니다.", TextSecondary); + AppendLog("", TextSecondary); + } + + // ═════════════════════════════════════════════════════════════════ + // Ollama 탭 빌드 + // ═════════════════════════════════════════════════════════════════ + private void BuildOllamaTab(TabPage page) + { + int y = 12; + var desc = CreateLabel("Ollama는 로컬 LLM 서버입니다. API 키가 필요 없습니다.", 9f, FontStyle.Italic); + desc.ForeColor = TextSecondary; + desc.Location = new Point(12, y); + desc.AutoSize = true; + page.Controls.Add(desc); + y += 30; + + // Endpoint + AddFieldPair(page, ref y, "Endpoint URL:", "http://localhost:11434", + out _ollamaEndpoint, out _ollamaEncEndpoint, "암호화", AccentGreen, (s, e) => + { + EncryptAndShow(_ollamaEndpoint, _ollamaEncEndpoint, "Ollama Endpoint"); + }); + + // Model + AddFieldPair(page, ref y, "Model:", "llama3.1:8b", + out _ollamaModel, out _ollamaEncModel, "암호화", AccentGreen, (s, e) => + { + EncryptAndShow(_ollamaModel, _ollamaEncModel, "Ollama Model"); + }); + + // 전체 암호화 버튼 + var btnAll = CreateButton("⚡ 전체 암호화", AccentGreen); + btnAll.Location = new Point(12, y + 4); + btnAll.Size = new Size(130, 34); + btnAll.Click += (s, e) => + { + EncryptAndShow(_ollamaEndpoint, _ollamaEncEndpoint, "Ollama Endpoint"); + EncryptAndShow(_ollamaModel, _ollamaEncModel, "Ollama Model"); + AppendLog("[Ollama] 전체 암호화 완료 ✔", AccentGreen); + }; + page.Controls.Add(btnAll); + + // JSON 생성 버튼 + var btnJson = CreateButton("📋 settings.json 복사", AccentGreen); + btnJson.Location = new Point(150, y + 4); + btnJson.Size = new Size(200, 34); + btnJson.Click += (s, e) => GenerateOllamaJson(); + page.Controls.Add(btnJson); + } + + // ═════════════════════════════════════════════════════════════════ + // vLLM 탭 빌드 + // ═════════════════════════════════════════════════════════════════ + private void BuildVllmTab(TabPage page) + { + int y = 12; + var desc = CreateLabel("vLLM은 OpenAI 호환 API 서버입니다. API 키는 선택사항입니다.", 9f, FontStyle.Italic); + desc.ForeColor = TextSecondary; + desc.Location = new Point(12, y); + desc.AutoSize = true; + page.Controls.Add(desc); + y += 30; + + // Endpoint + AddFieldPair(page, ref y, "Endpoint URL:", "http://localhost:8000", + out _vllmEndpoint, out _vllmEncEndpoint, "암호화", AccentBlue, (s, e) => + { + EncryptAndShow(_vllmEndpoint, _vllmEncEndpoint, "vLLM Endpoint"); + }); + + // Model + AddFieldPair(page, ref y, "Model:", "meta-llama/Llama-3.1-8B-Instruct", + out _vllmModel, out _vllmEncModel, "암호화", AccentBlue, (s, e) => + { + EncryptAndShow(_vllmModel, _vllmEncModel, "vLLM Model"); + }); + + // API Key + AddFieldPair(page, ref y, "API Key (선택):", "", + out _vllmApiKey, out _vllmEncApiKey, "암호화", AccentBlue, (s, e) => + { + EncryptAndShow(_vllmApiKey, _vllmEncApiKey, "vLLM API Key"); + }); + + var btnAll = CreateButton("⚡ 전체 암호화", AccentBlue); + btnAll.Location = new Point(12, y + 4); + btnAll.Size = new Size(130, 34); + btnAll.Click += (s, e) => + { + EncryptAndShow(_vllmEndpoint, _vllmEncEndpoint, "vLLM Endpoint"); + EncryptAndShow(_vllmModel, _vllmEncModel, "vLLM Model"); + if (!string.IsNullOrEmpty(_vllmApiKey.Text.Trim())) + EncryptAndShow(_vllmApiKey, _vllmEncApiKey, "vLLM API Key"); + AppendLog("[vLLM] 전체 암호화 완료 ✔", AccentGreen); + }; + page.Controls.Add(btnAll); + + var btnJson = CreateButton("📋 settings.json 복사", AccentBlue); + btnJson.Location = new Point(150, y + 4); + btnJson.Size = new Size(200, 34); + btnJson.Click += (s, e) => GenerateVllmJson(); + page.Controls.Add(btnJson); + } + + // ═════════════════════════════════════════════════════════════════ + // Gemini 탭 빌드 + // ═════════════════════════════════════════════════════════════════ + private void BuildGeminiTab(TabPage page) + { + int y = 12; + var desc = CreateLabel("Google Gemini API를 사용합니다. API Key가 필수입니다.", 9f, FontStyle.Italic); + desc.ForeColor = TextSecondary; + desc.Location = new Point(12, y); + desc.AutoSize = true; + page.Controls.Add(desc); + y += 30; + + // API Key + AddFieldPair(page, ref y, "API Key (필수):", "", + out _geminiApiKey, out _geminiEncApiKey, "암호화", AccentOrange, (s, e) => + { + EncryptAndShow(_geminiApiKey, _geminiEncApiKey, "Gemini API Key"); + }); + + // Model + AddFieldPair(page, ref y, "Model:", "gemini-2.0-flash", + out _geminiModel, out _geminiEncModel, "암호화", AccentOrange, (s, e) => + { + EncryptAndShow(_geminiModel, _geminiEncModel, "Gemini Model"); + }); + + var btnAll = CreateButton("⚡ 전체 암호화", AccentOrange); + btnAll.Location = new Point(12, y + 4); + btnAll.Size = new Size(130, 34); + btnAll.Click += (s, e) => + { + EncryptAndShow(_geminiApiKey, _geminiEncApiKey, "Gemini API Key"); + EncryptAndShow(_geminiModel, _geminiEncModel, "Gemini Model"); + AppendLog("[Gemini] 전체 암호화 완료 ✔", AccentGreen); + }; + page.Controls.Add(btnAll); + + var btnJson = CreateButton("📋 settings.json 복사", AccentOrange); + btnJson.Location = new Point(150, y + 4); + btnJson.Size = new Size(200, 34); + btnJson.Click += (s, e) => GenerateGeminiJson(); + page.Controls.Add(btnJson); + } + + // ═════════════════════════════════════════════════════════════════ + // 필드 쌍 헬퍼 (라벨 + 입력 + 암호화 버튼 + 결과) + // ═════════════════════════════════════════════════════════════════ + // ═══════════════════════════════════════════════════════════════════════ + // 복호화 검증 탭 + // ═══════════════════════════════════════════════════════════════════════ + private void BuildToolsTab(TabPage page) + { + int y = 12; + var desc = CreateLabel("암호화된 Base64 값을 붙여넣고 원문을 확인합니다.", 9f, FontStyle.Italic); + desc.ForeColor = TextSecondary; + desc.Location = new Point(12, y); + desc.AutoSize = true; + page.Controls.Add(desc); + y += 30; + + var inputLabel = CreateLabel("암호화된 값 (Base64):", 9f, FontStyle.Regular); + inputLabel.Location = new Point(12, y); + inputLabel.AutoSize = true; + page.Controls.Add(inputLabel); + y += 20; + + _decryptInput = CreateTextBox(); + _decryptInput.Location = new Point(12, y); + _decryptInput.Size = new Size(440, 28); + page.Controls.Add(_decryptInput); + + var btnDecrypt = CreateButton("복호화", AccentBlue); + btnDecrypt.Location = new Point(460, y - 1); + btnDecrypt.Size = new Size(80, 30); + btnDecrypt.Click += BtnDecrypt_Click; + page.Controls.Add(btnDecrypt); + + var btnVerify = CreateButton("왕복 검증", Color.FromArgb(130, 100, 220)); + btnVerify.Location = new Point(546, y - 1); + btnVerify.Size = new Size(90, 30); + btnVerify.Click += BtnVerify_Click; + page.Controls.Add(btnVerify); + y += 40; + + var resultLabel = CreateLabel("복호화 결과:", 9f, FontStyle.Regular); + resultLabel.Location = new Point(12, y); + resultLabel.AutoSize = true; + page.Controls.Add(resultLabel); + y += 20; + + _decryptResult = CreateTextBox(); + _decryptResult.Location = new Point(12, y); + _decryptResult.Size = new Size(624, 28); + _decryptResult.ReadOnly = true; + page.Controls.Add(_decryptResult); + } + + private void AddFieldPair(TabPage page, ref int y, + string labelText, string placeholder, + out TextBox input, out TextBox encrypted, + string buttonText, Color accentColor, EventHandler onClick) + { + var lbl = CreateLabel(labelText, 9f, FontStyle.Regular); + lbl.Location = new Point(12, y); + lbl.AutoSize = true; + page.Controls.Add(lbl); + y += 22; + + input = CreateTextBox(); + input.Location = new Point(12, y); + input.Size = new Size(310, 28); + input.PlaceholderText = placeholder; + if (!string.IsNullOrEmpty(placeholder) && placeholder.StartsWith("http")) + input.Text = placeholder; + page.Controls.Add(input); + + var btn = CreateButton(buttonText, accentColor); + btn.Location = new Point(328, y - 1); + btn.Size = new Size(70, 30); + btn.Click += onClick; + page.Controls.Add(btn); + + encrypted = CreateTextBox(); + encrypted.Location = new Point(404, y); + encrypted.Size = new Size(238, 28); + encrypted.ReadOnly = true; + encrypted.PlaceholderText = "암호화 결과"; + page.Controls.Add(encrypted); + + // 복사 버튼 + var btnCopy = CreateCopyButton(encrypted); + btnCopy.Location = new Point(646, y); + btnCopy.Size = new Size(28, 28); + page.Controls.Add(btnCopy); + + y += 40; + } + + // ═════════════════════════════════════════════════════════════════ + // 암호화 실행 + // ═════════════════════════════════════════════════════════════════ + private void EncryptAndShow(TextBox input, TextBox output, string fieldName) + { + var text = input.Text.Trim(); + if (string.IsNullOrEmpty(text)) + { + AppendLog($"[{fieldName}] 입력이 비어 있습니다.", AccentRed); + return; + } + var enc = CryptoHelper.Encrypt(text); + output.Text = enc; + AppendLog($"[{fieldName}] 암호화 완료 ✔", AccentGreen); + AppendLog($" 원본: {text}", TextSecondary); + AppendLog($" 결과: {enc}", TextPrimary); + } + + // ═════════════════════════════════════════════════════════════════ + // 복호화 + // ═════════════════════════════════════════════════════════════════ + private void BtnDecrypt_Click(object? sender, EventArgs e) + { + var b64 = _decryptInput.Text.Trim(); + if (string.IsNullOrEmpty(b64)) + { + AppendLog("[복호화] 입력이 비어 있습니다.", AccentRed); + return; + } + var (success, result) = CryptoHelper.Decrypt(b64); + _decryptResult.Text = result; + if (success) + { + _decryptResult.ForeColor = AccentGreen; + AppendLog($"[복호화] 성공 ✔ → {result}", AccentGreen); + } + else + { + _decryptResult.ForeColor = AccentRed; + AppendLog($"[복호화] 실패 ✘ — {result}", AccentRed); + } + } + + // ═════════════════════════════════════════════════════════════════ + // 왕복 검증 + // ═════════════════════════════════════════════════════════════════ + private void BtnVerify_Click(object? sender, EventArgs e) + { + var b64 = _decryptInput.Text.Trim(); + string testText; + if (string.IsNullOrEmpty(b64)) + { + testText = "test-api-key-12345"; + AppendLog("[왕복 검증] 테스트 문자열 사용: " + testText, TextSecondary); + } + else + { + // 이미 암호화된 값이면 복호화 → 재암호화 → 재복호화 + var (ok, dec) = CryptoHelper.Decrypt(b64); + if (ok) testText = dec; + else testText = b64; // 평문으로 간주 + } + + var encrypted = CryptoHelper.Encrypt(testText); + var (success, decrypted) = CryptoHelper.Decrypt(encrypted); + var match = success && testText == decrypted; + + _decryptResult.Text = match ? $"✅ 일치 — {decrypted}" : $"❌ 불일치"; + _decryptResult.ForeColor = match ? AccentGreen : AccentRed; + + AppendLog("[왕복 검증]", AccentBlue); + AppendLog($" 원본: {testText}", TextSecondary); + AppendLog($" 암호화: {encrypted}", TextSecondary); + AppendLog($" 복호화: {decrypted}", TextSecondary); + AppendLog($" 결과: {(match ? "✅ 성공" : "❌ 실패")}", match ? AccentGreen : AccentRed); + } + + // ═════════════════════════════════════════════════════════════════ + // JSON 생성 (서비스별) + // ═════════════════════════════════════════════════════════════════ + private void GenerateOllamaJson() + { + var endpoint = _ollamaEncEndpoint.Text; + var model = _ollamaEncModel.Text; + + if (string.IsNullOrEmpty(endpoint)) endpoint = CryptoHelper.Encrypt(_ollamaEndpoint.Text); + if (string.IsNullOrEmpty(model)) model = CryptoHelper.Encrypt(_ollamaModel.Text); + + var json = JsonSerializer.Serialize(new + { + llm = new + { + service = "ollama", + encryptedEndpoint = endpoint, + encryptedModel = model, + streaming = true, + maxContextTokens = 4096, + temperature = 0.7 + } + }, new JsonSerializerOptions { WriteIndented = true }); + + CopyToClipboard(json, "Ollama"); + } + + private void GenerateVllmJson() + { + var endpoint = _vllmEncEndpoint.Text; + var model = _vllmEncModel.Text; + var apiKey = _vllmEncApiKey.Text; + + if (string.IsNullOrEmpty(endpoint)) endpoint = CryptoHelper.Encrypt(_vllmEndpoint.Text); + if (string.IsNullOrEmpty(model)) model = CryptoHelper.Encrypt(_vllmModel.Text); + if (string.IsNullOrEmpty(apiKey) && !string.IsNullOrEmpty(_vllmApiKey.Text)) + apiKey = CryptoHelper.Encrypt(_vllmApiKey.Text); + + var obj = new Dictionary + { + ["llm"] = new Dictionary + { + ["service"] = "vllm", + ["encryptedEndpoint"] = endpoint, + ["encryptedModel"] = model, + ["encryptedApiKey"] = apiKey ?? "", + ["streaming"] = true, + ["maxContextTokens"] = 4096, + ["temperature"] = 0.7 + } + }; + + var json = JsonSerializer.Serialize(obj, new JsonSerializerOptions { WriteIndented = true }); + CopyToClipboard(json, "vLLM"); + } + + private void GenerateGeminiJson() + { + var apiKey = _geminiEncApiKey.Text; + var model = _geminiEncModel.Text; + + if (string.IsNullOrEmpty(apiKey)) + { + if (string.IsNullOrEmpty(_geminiApiKey.Text)) + { + AppendLog("[Gemini] API Key는 필수입니다!", AccentRed); + return; + } + apiKey = CryptoHelper.Encrypt(_geminiApiKey.Text); + } + if (string.IsNullOrEmpty(model)) model = CryptoHelper.Encrypt(_geminiModel.Text); + + var json = JsonSerializer.Serialize(new + { + llm = new + { + service = "gemini", + encryptedApiKey = apiKey, + encryptedModel = model, + streaming = true, + maxContextTokens = 8192, + temperature = 0.7 + } + }, new JsonSerializerOptions { WriteIndented = true }); + + CopyToClipboard(json, "Gemini"); + } + + private void CopyToClipboard(string json, string serviceName) + { + Clipboard.SetText(json); + AppendLog($"[{serviceName}] settings.json 설정값이 클립보드에 복사되었습니다! 📋", AccentGreen); + AppendLog(json, TextSecondary); + AppendLog("", TextSecondary); + + // 짧은 알림 + var tip = new ToolTip(); + tip.Show($"{serviceName} 설정이 클립보드에 복사됨!", this, Width / 2 - 100, Height - 60, 2000); + } + + // ═════════════════════════════════════════════════════════════════ + // 출력 로그 + // ═════════════════════════════════════════════════════════════════ + private void AppendLog(string text, Color color) + { + _outputBox.SelectionStart = _outputBox.TextLength; + _outputBox.SelectionLength = 0; + _outputBox.SelectionColor = color; + _outputBox.AppendText(text + Environment.NewLine); + _outputBox.ScrollToCaret(); + } + + // ═════════════════════════════════════════════════════════════════ + // UI 팩토리 헬퍼 + // ═════════════════════════════════════════════════════════════════ + private static Label CreateLabel(string text, float fontSize, FontStyle style) + { + return new Label + { + Text = text, + ForeColor = TextPrimary, + Font = new Font("Segoe UI", fontSize, style), + AutoSize = true + }; + } + + private static TextBox CreateTextBox() + { + return new TextBox + { + BackColor = BgInput, + ForeColor = TextPrimary, + Font = new Font("Segoe UI", 10f), + BorderStyle = BorderStyle.FixedSingle + }; + } + + private Button CreateButton(string text, Color bgColor) + { + var btn = new Button + { + Text = text, + BackColor = bgColor, + ForeColor = Color.White, + FlatStyle = FlatStyle.Flat, + Font = new Font("Segoe UI", 9f, FontStyle.Bold), + Cursor = Cursors.Hand + }; + btn.FlatAppearance.BorderSize = 0; + btn.FlatAppearance.MouseOverBackColor = ControlPaint.Light(bgColor, 0.15f); + btn.FlatAppearance.MouseDownBackColor = ControlPaint.Dark(bgColor, 0.1f); + return btn; + } + + private Button CreateCopyButton(TextBox target) + { + var btn = new Button + { + Text = "📋", + BackColor = BgCard, + ForeColor = TextPrimary, + FlatStyle = FlatStyle.Flat, + Font = new Font("Segoe UI", 9f), + Cursor = Cursors.Hand + }; + btn.FlatAppearance.BorderSize = 1; + btn.FlatAppearance.BorderColor = BorderColor; + btn.Click += (s, e) => + { + if (!string.IsNullOrEmpty(target.Text)) + { + Clipboard.SetText(target.Text); + var tip = new ToolTip(); + tip.Show("복사됨!", btn, 0, -20, 1200); + } + }; + return btn; + } + + private TabPage CreateTabPage(string title, Color accentColor) + { + var page = new TabPage(title) + { + BackColor = BgPanel, + ForeColor = TextPrimary, + Padding = new Padding(4) + }; + page.Tag = accentColor; // 탭 드로잉에 사용 + return page; + } + + private void DrawTab(object? sender, DrawItemEventArgs e) + { + if (sender is not TabControl tabs) return; + var page = tabs.TabPages[e.Index]; + var isSelected = e.Index == tabs.SelectedIndex; + var accent = page.Tag is Color c ? c : AccentBlue; + + // 배경 + var bgColor = isSelected ? BgCard : BgPanel; + using var bgBrush = new SolidBrush(bgColor); + e.Graphics.FillRectangle(bgBrush, e.Bounds); + + // 선택된 탭 하단 악센트 라인 + if (isSelected) + { + using var lineBrush = new SolidBrush(accent); + e.Graphics.FillRectangle(lineBrush, + new Rectangle(e.Bounds.Left, e.Bounds.Bottom - 3, e.Bounds.Width, 3)); + } + + // 텍스트 + var textColor = isSelected ? TextPrimary : TextSecondary; + using var textBrush = new SolidBrush(textColor); + var textFont = isSelected + ? new Font("Segoe UI", 10f, FontStyle.Bold) + : new Font("Segoe UI", 9.5f, FontStyle.Regular); + var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; + e.Graphics.DrawString(page.Text, textFont, textBrush, e.Bounds, sf); + textFont.Dispose(); + } +} diff --git a/src/AxKeyEncryptor/Program.cs b/src/AxKeyEncryptor/Program.cs new file mode 100644 index 0000000..51f50dc --- /dev/null +++ b/src/AxKeyEncryptor/Program.cs @@ -0,0 +1,11 @@ +namespace AxKeyEncryptor; + +static class Program +{ + [STAThread] + static void Main() + { + ApplicationConfiguration.Initialize(); + Application.Run(new MainForm()); + } +} diff --git a/src/AxKeyEncryptor/Resources/icon.ico b/src/AxKeyEncryptor/Resources/icon.ico new file mode 100644 index 0000000..8b3e223 Binary files /dev/null and b/src/AxKeyEncryptor/Resources/icon.ico differ diff --git a/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.deps.json b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.deps.json new file mode 100644 index 0000000..2faf9b9 --- /dev/null +++ b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "AxKeyEncryptor/1.0.0": { + "runtime": { + "AxKeyEncryptor.dll": {} + } + } + } + }, + "libraries": { + "AxKeyEncryptor/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.dll b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.dll new file mode 100644 index 0000000..385542c Binary files /dev/null and b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.dll differ diff --git a/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.exe b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.exe new file mode 100644 index 0000000..2410db0 Binary files /dev/null and b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.exe differ diff --git a/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.pdb b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.pdb new file mode 100644 index 0000000..1b43075 Binary files /dev/null and b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.pdb differ diff --git a/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.runtimeconfig.json b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.runtimeconfig.json new file mode 100644 index 0000000..c7a4117 --- /dev/null +++ b/src/AxKeyEncryptor/bin/Debug/net8.0-windows/AxKeyEncryptor.runtimeconfig.json @@ -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 + } + } +} \ No newline at end of file diff --git a/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.deps.json b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.deps.json new file mode 100644 index 0000000..2faf9b9 --- /dev/null +++ b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "AxKeyEncryptor/1.0.0": { + "runtime": { + "AxKeyEncryptor.dll": {} + } + } + } + }, + "libraries": { + "AxKeyEncryptor/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.dll b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.dll new file mode 100644 index 0000000..a28db68 Binary files /dev/null and b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.dll differ diff --git a/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.exe b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.exe new file mode 100644 index 0000000..2410db0 Binary files /dev/null and b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.exe differ diff --git a/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.pdb b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.pdb new file mode 100644 index 0000000..dd3fd88 Binary files /dev/null and b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.pdb differ diff --git a/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.runtimeconfig.json b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.runtimeconfig.json new file mode 100644 index 0000000..b65a073 --- /dev/null +++ b/src/AxKeyEncryptor/bin/Release/net8.0-windows/AxKeyEncryptor.runtimeconfig.json @@ -0,0 +1,19 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "8.0.0" + } + ], + "configProperties": { + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false + } + } +} \ No newline at end of file diff --git a/src/AxKeyEncryptor/obj/AxKeyEncryptor.csproj.nuget.dgspec.json b/src/AxKeyEncryptor/obj/AxKeyEncryptor.csproj.nuget.dgspec.json new file mode 100644 index 0000000..8bbf7f2 --- /dev/null +++ b/src/AxKeyEncryptor/obj/AxKeyEncryptor.csproj.nuget.dgspec.json @@ -0,0 +1,78 @@ +{ + "format": 1, + "restore": { + "E:\\AX Copilot\\src\\AxKeyEncryptor\\AxKeyEncryptor.csproj": {} + }, + "projects": { + "E:\\AX Copilot\\src\\AxKeyEncryptor\\AxKeyEncryptor.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxKeyEncryptor\\AxKeyEncryptor.csproj", + "projectName": "AxKeyEncryptor", + "projectPath": "E:\\AX Copilot\\src\\AxKeyEncryptor\\AxKeyEncryptor.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxKeyEncryptor\\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", + "dependencies": { + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App.WindowsForms": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/src/AxKeyEncryptor/obj/AxKeyEncryptor.csproj.nuget.g.props b/src/AxKeyEncryptor/obj/AxKeyEncryptor.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/src/AxKeyEncryptor/obj/AxKeyEncryptor.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/src/AxKeyEncryptor/obj/AxKeyEncryptor.csproj.nuget.g.targets b/src/AxKeyEncryptor/obj/AxKeyEncryptor.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/src/AxKeyEncryptor/obj/AxKeyEncryptor.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.AssemblyInfo.cs b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.AssemblyInfo.cs new file mode 100644 index 0000000..3ad3dab --- /dev/null +++ b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("AxKeyEncryptor")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AxKeyEncryptor")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxKeyEncryptor")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.AssemblyInfoInputs.cache b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.AssemblyInfoInputs.cache new file mode 100644 index 0000000..7eb4e9e --- /dev/null +++ b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +190b7f1457f4f606569cacb2861b7b9098298183a3aa44b0c25475e4472572f8 diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..8ccc586 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 = AxKeyEncryptor +build_property.ProjectDir = E:\AX Copilot\src\AxKeyEncryptor\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.GlobalUsings.g.cs b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.GlobalUsings.g.cs new file mode 100644 index 0000000..18cabb0 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.GlobalUsings.g.cs @@ -0,0 +1,10 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Drawing; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; +global using System.Windows.Forms; diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.assets.cache b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.assets.cache new file mode 100644 index 0000000..c9d8c57 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.assets.cache differ diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.csproj.CoreCompileInputs.cache b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..e0e744c --- /dev/null +++ b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +2afc5e8e76c2d39d447e7036ce58906507efb4e8d1556a5db37a4ec85186b8c1 diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.csproj.FileListAbsolute.txt b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..d96fe99 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.csproj.FileListAbsolute.txt @@ -0,0 +1,28 @@ +E:\AX Commander\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.exe +E:\AX Commander\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.deps.json +E:\AX Commander\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.runtimeconfig.json +E:\AX Commander\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.dll +E:\AX Commander\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.pdb +E:\AX Commander\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig +E:\AX Commander\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.AssemblyInfoInputs.cache +E:\AX Commander\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.AssemblyInfo.cs +E:\AX Commander\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.csproj.CoreCompileInputs.cache +E:\AX Commander\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.dll +E:\AX Commander\src\AxKeyEncryptor\obj\Debug\net8.0-windows\refint\AxKeyEncryptor.dll +E:\AX Commander\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.pdb +E:\AX Commander\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.genruntimeconfig.cache +E:\AX Commander\src\AxKeyEncryptor\obj\Debug\net8.0-windows\ref\AxKeyEncryptor.dll +E:\AX Copilot\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.exe +E:\AX Copilot\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.deps.json +E:\AX Copilot\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.runtimeconfig.json +E:\AX Copilot\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.dll +E:\AX Copilot\src\AxKeyEncryptor\bin\Debug\net8.0-windows\AxKeyEncryptor.pdb +E:\AX Copilot\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig +E:\AX Copilot\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.AssemblyInfoInputs.cache +E:\AX Copilot\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.AssemblyInfo.cs +E:\AX Copilot\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.csproj.CoreCompileInputs.cache +E:\AX Copilot\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.dll +E:\AX Copilot\src\AxKeyEncryptor\obj\Debug\net8.0-windows\refint\AxKeyEncryptor.dll +E:\AX Copilot\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.pdb +E:\AX Copilot\src\AxKeyEncryptor\obj\Debug\net8.0-windows\AxKeyEncryptor.genruntimeconfig.cache +E:\AX Copilot\src\AxKeyEncryptor\obj\Debug\net8.0-windows\ref\AxKeyEncryptor.dll diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.dll b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.dll new file mode 100644 index 0000000..385542c Binary files /dev/null and b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.dll differ diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.genruntimeconfig.cache b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.genruntimeconfig.cache new file mode 100644 index 0000000..a11b7ba --- /dev/null +++ b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.genruntimeconfig.cache @@ -0,0 +1 @@ +9bae04ce882e8cd2d63c26506f9b6ceb0d082059b0cbab587f1430579549af6d diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.pdb b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.pdb new file mode 100644 index 0000000..1b43075 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/AxKeyEncryptor.pdb differ diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/apphost.exe b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/apphost.exe new file mode 100644 index 0000000..2410db0 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/apphost.exe differ diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/ref/AxKeyEncryptor.dll b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/ref/AxKeyEncryptor.dll new file mode 100644 index 0000000..4988e76 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/ref/AxKeyEncryptor.dll differ diff --git a/src/AxKeyEncryptor/obj/Debug/net8.0-windows/refint/AxKeyEncryptor.dll b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/refint/AxKeyEncryptor.dll new file mode 100644 index 0000000..4988e76 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Debug/net8.0-windows/refint/AxKeyEncryptor.dll differ diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/src/AxKeyEncryptor/obj/Release/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.AssemblyInfo.cs b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.AssemblyInfo.cs new file mode 100644 index 0000000..9fb2a29 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("AxKeyEncryptor")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("AxKeyEncryptor")] +[assembly: System.Reflection.AssemblyTitleAttribute("AxKeyEncryptor")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.AssemblyInfoInputs.cache b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.AssemblyInfoInputs.cache new file mode 100644 index 0000000..482c39c --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +fd628c4965ee6878cb7f295c46b126ed27906b8074767f39b1e9ecba1944035c diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..8ccc586 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 = AxKeyEncryptor +build_property.ProjectDir = E:\AX Copilot\src\AxKeyEncryptor\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.GlobalUsings.g.cs b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.GlobalUsings.g.cs new file mode 100644 index 0000000..18cabb0 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.GlobalUsings.g.cs @@ -0,0 +1,10 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Drawing; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; +global using System.Windows.Forms; diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.assets.cache b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.assets.cache new file mode 100644 index 0000000..2d12ced Binary files /dev/null and b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.assets.cache differ diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.csproj.CoreCompileInputs.cache b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..4767d93 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +634a8bbb8f424f3006a2950ddd75ba537e46918915120c2cff2107efffe8de24 diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.csproj.FileListAbsolute.txt b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..e29f03d --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.csproj.FileListAbsolute.txt @@ -0,0 +1,28 @@ +E:\AX Commander\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig +E:\AX Commander\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.AssemblyInfoInputs.cache +E:\AX Commander\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.AssemblyInfo.cs +E:\AX Commander\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.csproj.CoreCompileInputs.cache +E:\AX Commander\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.exe +E:\AX Commander\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.deps.json +E:\AX Commander\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.runtimeconfig.json +E:\AX Commander\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.dll +E:\AX Commander\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.pdb +E:\AX Commander\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.dll +E:\AX Commander\src\AxKeyEncryptor\obj\Release\net8.0-windows\refint\AxKeyEncryptor.dll +E:\AX Commander\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.pdb +E:\AX Commander\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.genruntimeconfig.cache +E:\AX Commander\src\AxKeyEncryptor\obj\Release\net8.0-windows\ref\AxKeyEncryptor.dll +E:\AX Copilot\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.exe +E:\AX Copilot\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.deps.json +E:\AX Copilot\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.runtimeconfig.json +E:\AX Copilot\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.dll +E:\AX Copilot\src\AxKeyEncryptor\bin\Release\net8.0-windows\AxKeyEncryptor.pdb +E:\AX Copilot\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.GeneratedMSBuildEditorConfig.editorconfig +E:\AX Copilot\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.AssemblyInfoInputs.cache +E:\AX Copilot\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.AssemblyInfo.cs +E:\AX Copilot\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.csproj.CoreCompileInputs.cache +E:\AX Copilot\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.dll +E:\AX Copilot\src\AxKeyEncryptor\obj\Release\net8.0-windows\refint\AxKeyEncryptor.dll +E:\AX Copilot\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.pdb +E:\AX Copilot\src\AxKeyEncryptor\obj\Release\net8.0-windows\AxKeyEncryptor.genruntimeconfig.cache +E:\AX Copilot\src\AxKeyEncryptor\obj\Release\net8.0-windows\ref\AxKeyEncryptor.dll diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.dll b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.dll new file mode 100644 index 0000000..a28db68 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.dll differ diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.genruntimeconfig.cache b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.genruntimeconfig.cache new file mode 100644 index 0000000..cc18428 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.genruntimeconfig.cache @@ -0,0 +1 @@ +0f1c0010d6da416743f3fb1ce205ad8b1102ab51147f8c5a9374c003ac43fda9 diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.pdb b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.pdb new file mode 100644 index 0000000..dd3fd88 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Release/net8.0-windows/AxKeyEncryptor.pdb differ diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/PublishOutputs.699d6fd760.txt b/src/AxKeyEncryptor/obj/Release/net8.0-windows/PublishOutputs.699d6fd760.txt new file mode 100644 index 0000000..431f591 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/PublishOutputs.699d6fd760.txt @@ -0,0 +1,5 @@ +E:\AX Commander\dist\AxKeyEncryptor\AxKeyEncryptor.exe +E:\AX Commander\dist\AxKeyEncryptor\AxKeyEncryptor.dll +E:\AX Commander\dist\AxKeyEncryptor\AxKeyEncryptor.deps.json +E:\AX Commander\dist\AxKeyEncryptor\AxKeyEncryptor.runtimeconfig.json +E:\AX Commander\dist\AxKeyEncryptor\AxKeyEncryptor.pdb diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/PublishOutputs.d30efed6cd.txt b/src/AxKeyEncryptor/obj/Release/net8.0-windows/PublishOutputs.d30efed6cd.txt new file mode 100644 index 0000000..13ecba4 --- /dev/null +++ b/src/AxKeyEncryptor/obj/Release/net8.0-windows/PublishOutputs.d30efed6cd.txt @@ -0,0 +1,5 @@ +E:\AX Copilot\dist\AxKeyEncryptor\AxKeyEncryptor.exe +E:\AX Copilot\dist\AxKeyEncryptor\AxKeyEncryptor.dll +E:\AX Copilot\dist\AxKeyEncryptor\AxKeyEncryptor.deps.json +E:\AX Copilot\dist\AxKeyEncryptor\AxKeyEncryptor.runtimeconfig.json +E:\AX Copilot\dist\AxKeyEncryptor\AxKeyEncryptor.pdb diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/apphost.exe b/src/AxKeyEncryptor/obj/Release/net8.0-windows/apphost.exe new file mode 100644 index 0000000..2410db0 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Release/net8.0-windows/apphost.exe differ diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/ref/AxKeyEncryptor.dll b/src/AxKeyEncryptor/obj/Release/net8.0-windows/ref/AxKeyEncryptor.dll new file mode 100644 index 0000000..720dba2 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Release/net8.0-windows/ref/AxKeyEncryptor.dll differ diff --git a/src/AxKeyEncryptor/obj/Release/net8.0-windows/refint/AxKeyEncryptor.dll b/src/AxKeyEncryptor/obj/Release/net8.0-windows/refint/AxKeyEncryptor.dll new file mode 100644 index 0000000..720dba2 Binary files /dev/null and b/src/AxKeyEncryptor/obj/Release/net8.0-windows/refint/AxKeyEncryptor.dll differ diff --git a/src/AxKeyEncryptor/obj/project.assets.json b/src/AxKeyEncryptor/obj/project.assets.json new file mode 100644 index 0000000..53eb214 --- /dev/null +++ b/src/AxKeyEncryptor/obj/project.assets.json @@ -0,0 +1,139 @@ +{ + "version": 3, + "targets": { + "net8.0-windows7.0": { + "System.Security.Cryptography.ProtectedData/8.0.0": { + "type": "package", + "compile": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "runtime": { + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll": { + "related": ".xml" + } + }, + "build": { + "buildTransitive/net6.0/_._": {} + } + } + } + }, + "libraries": { + "System.Security.Cryptography.ProtectedData/8.0.0": { + "sha512": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==", + "type": "package", + "path": "system.security.cryptography.protecteddata/8.0.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "PACKAGE.md", + "THIRD-PARTY-NOTICES.TXT", + "buildTransitive/net461/System.Security.Cryptography.ProtectedData.targets", + "buildTransitive/net462/_._", + "buildTransitive/net6.0/_._", + "buildTransitive/netcoreapp2.0/System.Security.Cryptography.ProtectedData.targets", + "lib/MonoAndroid10/_._", + "lib/MonoTouch10/_._", + "lib/net462/System.Security.Cryptography.ProtectedData.dll", + "lib/net462/System.Security.Cryptography.ProtectedData.xml", + "lib/net6.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net6.0/System.Security.Cryptography.ProtectedData.xml", + "lib/net7.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net7.0/System.Security.Cryptography.ProtectedData.xml", + "lib/net8.0/System.Security.Cryptography.ProtectedData.dll", + "lib/net8.0/System.Security.Cryptography.ProtectedData.xml", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.dll", + "lib/netstandard2.0/System.Security.Cryptography.ProtectedData.xml", + "lib/xamarinios10/_._", + "lib/xamarinmac20/_._", + "lib/xamarintvos10/_._", + "lib/xamarinwatchos10/_._", + "system.security.cryptography.protecteddata.8.0.0.nupkg.sha512", + "system.security.cryptography.protecteddata.nuspec", + "useSharedDesignerContext.txt" + ] + } + }, + "projectFileDependencyGroups": { + "net8.0-windows7.0": [ + "System.Security.Cryptography.ProtectedData >= 8.0.0" + ] + }, + "packageFolders": { + "C:\\Users\\admin\\.nuget\\packages\\": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "E:\\AX Copilot\\src\\AxKeyEncryptor\\AxKeyEncryptor.csproj", + "projectName": "AxKeyEncryptor", + "projectPath": "E:\\AX Copilot\\src\\AxKeyEncryptor\\AxKeyEncryptor.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Copilot\\src\\AxKeyEncryptor\\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", + "dependencies": { + "System.Security.Cryptography.ProtectedData": { + "target": "Package", + "version": "[8.0.0, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App.WindowsForms": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/src/AxKeyEncryptor/obj/project.nuget.cache b/src/AxKeyEncryptor/obj/project.nuget.cache new file mode 100644 index 0000000..0dad94d --- /dev/null +++ b/src/AxKeyEncryptor/obj/project.nuget.cache @@ -0,0 +1,10 @@ +{ + "version": 2, + "dgSpecHash": "H3Okld6d9gE=", + "success": true, + "projectFilePath": "E:\\AX Copilot\\src\\AxKeyEncryptor\\AxKeyEncryptor.csproj", + "expectedPackageFiles": [ + "C:\\Users\\admin\\.nuget\\packages\\system.security.cryptography.protecteddata\\8.0.0\\system.security.cryptography.protecteddata.8.0.0.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/srs.rtf b/srs.rtf new file mode 100644 index 0000000..06ca2d3 --- /dev/null +++ b/srs.rtf @@ -0,0 +1,540 @@ +{\rtf1\ansi\ansicpg949\cocoartf2868 +\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\fnil\fcharset129 AppleSDGothicNeo-Regular;\f2\fnil\fcharset0 LucidaGrande; +} +{\colortbl;\red255\green255\blue255;} +{\*\expandedcolortbl;;} +\paperw11900\paperh16840\margl1440\margr1440\vieww20200\viewh15100\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural\partightenfactor0 + +\f0\fs24 \cf0 1. +\f1 \'bd\'c3\'bd\'ba\'c5\'db +\f0 +\f1 \'c7\'d9\'bd\'c9 +\f0 +\f1 \'be\'c6\'c5\'b0\'c5\'d8\'c3\'b3 +\f0 \ + +\f1 \'c1\'d6\'bf\'e4 +\f0 +\f1 \'b8\'f0\'b5\'e2 +\f0 +\f1 \'b1\'b8\'bc\'ba\ + * \'c0\'a9\'b5\'b5\'bf\'ec os\'bf\'a1\'bc\'ad \'b5\'bf\'c0\'db\'c7\'cf\'b4\'c2 \'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5\'c0\'b8\'b7\'ce \'c1\'a4\'c0\'c7 +\f0 \ + * Input Listener (Global Hook): +\f1 \'be\'ee\'b6\'b2 +\f0 +\f1 \'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5 +\f0 +\f1 \'c0\'a7\'bf\'a1 +\f0 +\f1 \'c0\'d6\'b5\'e7 +\f0 Alt + Space +\f1 \'bf\'cd +\f0 +\f1 \'b0\'b0\'c0\'ba +\f0 +\f1 \'b4\'dc\'c3\'e0\'c5\'b0\'b8\'a6 +\f0 +\f1 \'b0\'a8\'c1\'f6\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Context Manager: +\f1 \'c7\'f6\'c0\'e7 +\f0 +\f1 \'bf\'ad\'b7\'c1 +\f0 +\f1 \'c0\'d6\'b4\'c2 +\f0 +\f1 \'c0\'a9\'b5\'b5\'bf\'ec\'b5\'e9\'c0\'c7 +\f0 +\f1 \'c7\'da\'b5\'e9 +\f0 (HWND), +\f1 \'c7\'c1\'b7\'ce\'bc\'bc\'bd\'ba +\f0 +\f1 \'b0\'e6\'b7\'ce +\f0 , +\f1 \'c3\'a2 +\f0 +\f1 \'c0\'a7\'c4\'a1 +\f0 (Rect) +\f1 \'b8\'a6 +\f0 +\f1 \'bd\'ba\'b3\'c0\'bc\'a6\'c0\'b8\'b7\'ce +\f0 +\f1 \'c4\'b8\'c3\'b3\'c7\'cf\'b0\'ed +\f0 +\f1 \'ba\'b9\'bf\'f8\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Command Resolver: +\f1 \'c0\'d4\'b7\'c2\'b5\'c8 +\f0 +\f1 \'b8\'ed\'b7\'c9\'be\'ee +\f0 ( +\f1 \'bf\'b9 +\f0 : @nas, !dev) +\f1 \'b8\'a6 +\f0 +\f1 \'c7\'d8\'bc\'ae\'c7\'cf\'bf\'a9 +\f0 +\f1 \'b9\'cc\'b8\'ae +\f0 +\f1 \'c1\'a4\'c0\'c7\'b5\'c8 +\f0 +\f1 \'be\'d7\'bc\'c7 +\f0 ( +\f1 \'c6\'fa\'b4\'f5 +\f0 +\f1 \'bf\'ad\'b1\'e2 +\f0 , +\f1 \'b9\'e8\'c4\'a1 +\f0 +\f1 \'bd\'c7\'c7\'e0 +\f0 , +\f1 \'c0\'a9\'b5\'b5\'bf\'ec +\f0 +\f1 \'c1\'a4\'b7\'c4 +\f0 ) +\f1 \'c0\'bb +\f0 +\f1 \'b8\'c5\'c7\'ce\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Fuzzy Engine: +\f1 \'c6\'c4\'c0\'cf\'b8\'ed\'c0\'cc\'b3\'aa +\f0 +\f1 \'c5\'b0\'bf\'f6\'b5\'e5\'c0\'c7 +\f0 +\f1 \'c0\'cf\'ba\'ce\'b8\'b8 +\f0 +\f1 \'c0\'d4\'b7\'c2\'c7\'d8\'b5\'b5 +\f0 +\f1 \'b0\'a1\'c0\'e5 +\f0 +\f1 \'c0\'af\'bb\'e7\'c7\'d1 +\f0 +\f1 \'c7\'d7\'b8\'f1\'c0\'bb +\f0 +\f1 \'c3\'ca\'b0\'ed\'bc\'d3\'c0\'b8\'b7\'ce +\f0 +\f1 \'c3\'a3\'be\'c6\'c1\'dd\'b4\'cf\'b4\'d9 +\f0 .\ + * max os\uc0\u51032 \u50508 \u54532 \u47112 \u46300 \u50752 \u50976 \u49324 \u54620 \u44592 \u45733 \u51012 \u50952 \u46020 \u50864 os\u50640 \u44396 \u52629 \ +2. +\f1 \'c1\'d6\'bf\'e4 +\f0 +\f1 \'b1\'e2\'b4\'c9 +\f0 +\f1 \'bb\'f3\'bc\'bc +\f0 (Feature List)\ +A. +\f1 \'bf\'f6\'c5\'a9\'bd\'ba\'c6\'e4\'c0\'cc\'bd\'ba +\f0 +\f1 \'bd\'ba\'b3\'c0\'bc\'a6 +\f0 & +\f1 \'bd\'c3\'c7\'c1\'c6\'ae +\f0 (The Shifter)\ + +\f1 \'b4\'dc\'bc\'f8\'c8\'f7 +\f0 +\f1 \'c7\'c1\'b7\'ce\'b1\'d7\'b7\'a5\'c0\'bb +\f0 +\f1 \'b6\'e7\'bf\'ec\'b4\'c2 +\f0 +\f1 \'b0\'cd\'c0\'cc +\f0 +\f1 \'be\'c6\'b4\'cf\'b6\'f3 +\f0 , ' +\f1 \'be\'ee\'b6\'b2 +\f0 +\f1 \'c0\'a7\'c4\'a1\'bf\'a1 +\f0 +\f1 \'be\'ee\'b6\'b2 +\f0 +\f1 \'c5\'a9\'b1\'e2\'b7\'ce +\f0 ' +\f1 \'b6\'b0 +\f0 +\f1 \'c0\'d6\'b4\'c2\'c1\'f6\'b1\'ee\'c1\'f6 +\f0 +\f1 \'b0\'fc\'b8\'ae\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Snapshot Capture: +\f1 \'c7\'f6\'c0\'e7 +\f0 +\f1 \'c8\'ad\'b8\'e9\'bf\'a1 +\f0 +\f1 \'b6\'b0 +\f0 +\f1 \'c0\'d6\'b4\'c2 +\f0 +\f1 \'b8\'f0\'b5\'e7 +\f0 +\f1 \'be\'f7\'b9\'ab\'bf\'eb +\f0 +\f1 \'c3\'a2 +\f0 +\f1 \'b9\'e8\'c4\'a1\'b8\'a6 +\f0 ' +\f1 \'c7\'c1\'b7\'ce\'c7\'ca +\f0 ' +\f1 \'b7\'ce +\f0 +\f1 \'c0\'fa\'c0\'e5\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 . ( +\f1 \'bf\'b9 +\f0 : +\f1 \'bf\'de\'c2\'ca\'bf\'a3 +\f0 VS Code, +\f1 \'bf\'c0\'b8\'a5\'c2\'ca +\f0 +\f1 \'bb\'f3\'b4\'dc\'bf\'a3 +\f0 +\f1 \'b1\'e2\'c8\'b9\'bc\'ad +\f0 PDF, +\f1 \'c7\'cf\'b4\'dc\'bf\'a3 +\f0 SQL +\f1 \'c5\'f8 +\f0 )\ + * Instant Restore: !dev +\f1 \'b8\'ed\'b7\'c9 +\f0 +\f1 \'bd\'c3 +\f0 , +\f1 \'c0\'fa\'c0\'e5\'b5\'c8 +\f0 +\f1 \'c7\'c1\'b7\'ce\'c7\'ca\'c0\'bb +\f0 +\f1 \'ba\'d2\'b7\'af\'bf\'cd +\f0 +\f1 \'c3\'a2\'b5\'e9\'c0\'bb +\f0 +\f1 \'b0\'ad\'c1\'a6\'b7\'ce +\f0 +\f1 \'c0\'e7\'b9\'e8\'c4\'a1\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * Multi-Monitor Support: +\f1 \'b5\'e0\'be\'f3 +\f0 +\f1 \'b8\'f0\'b4\'cf\'c5\'cd +\f0 +\f1 \'c8\'af\'b0\'e6\'bf\'a1\'bc\'ad\'b5\'b5 +\f0 +\f1 \'b0\'a2 +\f0 +\f1 \'b8\'f0\'b4\'cf\'c5\'cd\'ba\'b0 +\f0 +\f1 \'c3\'a2 +\f0 +\f1 \'b9\'e8\'c4\'a1\'b8\'a6 +\f0 +\f1 \'c1\'a4\'c8\'ae\'c8\'f7 +\f0 +\f1 \'b1\'e2\'be\'ef\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ +B. +\f1 \'bd\'c3\'b8\'c7\'c6\'bd +\f0 +\f1 \'c4\'bf\'b8\'c7\'b5\'e5 +\f0 +\f1 \'b7\'b1\'c3\'b3 +\f0 (The Alfred)\ + +\f1 \'c5\'b0\'ba\'b8\'b5\'e5\'b8\'b8\'c0\'b8\'b7\'ce +\f0 +\f1 \'b8\'b6\'bf\'ec\'bd\'ba +\f0 +\f1 \'c5\'ac\'b8\'af +\f0 +\f1 \'bc\'f6\'bd\'ca +\f0 +\f1 \'b9\'f8\'c0\'c7 +\f0 +\f1 \'b0\'a1\'c4\'a1\'b8\'a6 +\f0 +\f1 \'b8\'b8\'b5\'e9\'be\'ee\'b3\'c0\'b4\'cf\'b4\'d9 +\f0 .\ + * Smart Aliases: +\f1 \'b1\'e4 +\f0 +\f1 \'b0\'e6\'b7\'ce\'b3\'aa +\f0 +\f1 \'ba\'b9\'c0\'e2\'c7\'d1 +\f0 +\f1 \'b8\'ed\'b7\'c9\'c0\'bb +\f0 +\f1 \'c2\'aa\'c0\'ba +\f0 +\f1 \'ba\'b0\'c4\'aa\'c0\'b8\'b7\'ce +\f0 +\f1 \'b5\'ee\'b7\'cf\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * @blog +\f2 \uc0\u8594 +\f0 swarchitect.net +\f1 \'b0\'fc\'b8\'ae\'c0\'da +\f0 +\f1 \'c6\'e4\'c0\'cc\'c1\'f6 +\f0 +\f1 \'bf\'c0\'c7\'c2 +\f0 \ + * #jira +\f2 \uc0\u8594 +\f0 +\f1 \'b3\'bb\'b0\'a1 +\f0 +\f1 \'b4\'e3\'b4\'e7\'c7\'d1 +\f0 +\f1 \'c3\'d6\'bd\'c5 +\f0 +\f1 \'c6\'bc\'c4\'cf +\f0 +\f1 \'c6\'e4\'c0\'cc\'c1\'f6\'b7\'ce +\f0 +\f1 \'b9\'d9\'b7\'ce +\f0 +\f1 \'c0\'cc\'b5\'bf +\f0 \ + * Clipboard Transformer: +\f1 \'ba\'b9\'bb\'e7\'c7\'d1 +\f0 +\f1 \'c5\'d8\'bd\'ba\'c6\'ae\'b8\'a6 +\f0 +\f1 \'b1\'d4\'c4\'a2\'bf\'a1 +\f0 +\f1 \'b5\'fb\'b6\'f3 +\f0 +\f1 \'b0\'a1\'b0\'f8\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 . ( +\f1 \'bf\'b9 +\f0 : JSON +\f1 \'c6\'f7\'b8\'cb\'c6\'c3 +\f0 , +\f1 \'c0\'af\'b4\'d0\'bd\'ba +\f0 +\f1 \'c5\'b8\'c0\'d3\'bd\'ba\'c5\'c6\'c7\'c1 +\f0 +\f1 \'ba\'af\'c8\'af +\f0 +\f1 \'b5\'ee +\f0 )\ +3. UI/UX +\f1 \'b5\'f0\'c0\'da\'c0\'ce +\f0 +\f1 \'b0\'a1\'c0\'cc\'b5\'e5 +\f0 (WPF +\f1 \'b1\'e2\'b9\'dd +\f0 )\ + +\f1 \'bb\'e7\'bf\'eb\'c0\'da\'c0\'c7 +\f0 +\f1 \'bd\'c3\'b0\'a2\'c0\'fb +\f0 +\f1 \'b9\'e6\'c7\'d8\'b8\'a6 +\f0 +\f1 \'c3\'d6\'bc\'d2\'c8\'ad\'c7\'cf\'b8\'e9\'bc\'ad +\f0 +\f1 \'bc\'bc\'b7\'c3\'b5\'c8 +\f0 +\f1 \'b4\'c0\'b3\'a6\'c0\'bb +\f0 +\f1 \'c1\'d6\'b4\'c2 +\f0 +\f1 \'b5\'f0\'c0\'da\'c0\'ce +\f0 +\f1 \'b9\'e6\'c7\'e2\'c0\'d4\'b4\'cf\'b4\'d9 +\f0 .\ +| +\f1 \'bf\'e4\'bc\'d2 +\f0 | +\f1 \'b5\'f0\'c0\'da\'c0\'ce +\f0 +\f1 \'b1\'c7\'c0\'e5 +\f0 +\f1 \'bb\'e7\'c7\'d7 +\f0 |\ +|---|---|\ +| +\f1 \'c3\'a2 +\f0 +\f1 \'c7\'fc\'c5\'c2 +\f0 | +\f1 \'c8\'ad\'b8\'e9 +\f0 +\f1 \'c1\'df\'be\'d3\'bf\'a1 +\f0 +\f1 \'b6\'df\'b4\'c2 +\f0 +\f1 \'c5\'f5\'b8\'ed\'b5\'b5 +\f0 (Opacity) +\f1 \'b0\'a1 +\f0 +\f1 \'c0\'fb\'bf\'eb\'b5\'c8 +\f0 +\f1 \'b9\'d9 +\f0 (Bar) +\f1 \'c7\'fc\'c5\'c2 +\f0 |\ +| +\f1 \'c5\'d7\'b8\'b6 +\f0 | +\f1 \'bd\'c3\'bd\'ba\'c5\'db +\f0 +\f1 \'bc\'b3\'c1\'a4\'bf\'a1 +\f0 +\f1 \'b5\'fb\'b8\'a5 +\f0 +\f1 \'b4\'d9\'c5\'a9 +\f0 / +\f1 \'b6\'f3\'c0\'cc\'c6\'ae +\f0 +\f1 \'b8\'f0\'b5\'e5 +\f0 +\f1 \'c0\'da\'b5\'bf +\f0 +\f1 \'c0\'fc\'c8\'af +\f0 |\ +| +\f1 \'b0\'e1\'b0\'fa +\f0 +\f1 \'b8\'ae\'bd\'ba\'c6\'ae +\f0 | +\f1 \'b8\'ed\'b7\'c9\'be\'ee +\f0 +\f1 \'c0\'d4\'b7\'c2 +\f0 +\f1 \'bd\'c3 +\f0 +\f1 \'be\'c6\'b7\'a1\'b7\'ce +\f0 +\f1 \'c3\'d6\'b4\'eb +\f0 5~7 +\f1 \'b0\'b3\'c0\'c7 +\f0 +\f1 \'c3\'df\'c3\'b5 +\f0 +\f1 \'b8\'ae\'bd\'ba\'c6\'ae\'b0\'a1 +\f0 +\f1 \'b8\'ae\'bd\'ba\'c6\'ae\'ba\'e4 +\f0 +\f1 \'c7\'fc\'c5\'c2\'b7\'ce +\f0 +\f1 \'c7\'a5\'bd\'c3 +\f0 |\ +| +\f1 \'be\'d6\'b4\'cf\'b8\'de\'c0\'cc\'bc\'c7 +\f0 | +\f1 \'c8\'a3\'c3\'e2 +\f0 +\f1 \'bd\'c3 +\f0 +\f1 \'c6\'e4\'c0\'cc\'b5\'e5\'c0\'ce +\f0 (Fade-in), +\f1 \'bd\'c7\'c7\'e0 +\f0 +\f1 \'bd\'c3 +\f0 +\f1 \'bb\'e7\'b6\'f3\'c1\'f6\'b4\'c2 +\f0 +\f1 \'c8\'bf\'b0\'fa\'b7\'ce +\f0 +\f1 \'bc\'d3\'b5\'b5\'b0\'a8 +\f0 +\f1 \'ba\'ce\'bf\'a9 +\f0 |\ +4. +\f1 \'b1\'b8\'c7\'f6\'c0\'bb +\f0 +\f1 \'c0\'a7\'c7\'d1 +\f0 +\f1 \'c7\'d9\'bd\'c9 +\f0 +\f1 \'b1\'e2\'bc\'fa +\f0 +\f1 \'c6\'f7\'c0\'ce\'c6\'ae +\f0 (C# .NET)\ + +\f1 \'c0\'cc +\f0 +\f1 \'b5\'b5\'b1\'b8\'c0\'c7 +\f0 +\f1 \'bd\'c9\'c0\'e5\'c0\'ba +\f0 Windows API +\f1 \'c1\'a6\'be\'ee\'bf\'a1 +\f0 +\f1 \'c0\'d6\'bd\'c0\'b4\'cf\'b4\'d9 +\f0 .\ + * +\f1 \'c0\'a9\'b5\'b5\'bf\'ec +\f0 +\f1 \'c1\'a6\'be\'ee +\f0 : User32.dll +\f1 \'c0\'c7 +\f0 GetWindowPlacement, SetWindowPos, ShowWindow +\f1 \'c7\'d4\'bc\'f6\'b8\'a6 +\f0 +\f1 \'c5\'eb\'c7\'d8 +\f0 +\f1 \'b4\'d9\'b8\'a5 +\f0 +\f1 \'be\'db\'c0\'c7 +\f0 +\f1 \'c0\'a7\'c4\'a1\'bf\'cd +\f0 +\f1 \'c5\'a9\'b1\'e2\'b8\'a6 +\f0 +\f1 \'b0\'ad\'c1\'a6 +\f0 +\f1 \'c1\'b6\'c1\'a4\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * +\f1 \'b1\'db\'b7\'ce\'b9\'fa +\f0 +\f1 \'b4\'dc\'c3\'e0\'c5\'b0 +\f0 : RegisterHotKey +\f1 \'b8\'a6 +\f0 +\f1 \'bb\'e7\'bf\'eb\'c7\'cf\'bf\'a9 +\f0 +\f1 \'bd\'c3\'bd\'ba\'c5\'db +\f0 +\f1 \'c0\'fc\'c3\'bc\'bf\'a1\'bc\'ad +\f0 +\f1 \'c0\'db\'b5\'bf\'c7\'cf\'b4\'c2 +\f0 +\f1 \'c7\'d6\'c5\'b0\'b8\'a6 +\f0 +\f1 \'b1\'b8\'c7\'f6\'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ + * +\f1 \'b5\'a5\'c0\'cc\'c5\'cd +\f0 +\f1 \'c0\'fa\'c0\'e5 +\f0 : +\f1 \'ba\'b9\'c0\'e2\'c7\'d1 +\f0 DB +\f1 \'b4\'eb\'bd\'c5 +\f0 JSON +\f1 \'c6\'c4\'c0\'cf +\f0 (settings.json) +\f1 \'c0\'bb +\f0 +\f1 \'bb\'e7\'bf\'eb\'c7\'cf\'bf\'a9 +\f0 +\f1 \'bb\'e7\'bf\'eb\'c0\'da\'b0\'a1 +\f0 +\f1 \'c1\'f7\'c1\'a2 +\f0 +\f1 \'c5\'d8\'bd\'ba\'c6\'ae +\f0 +\f1 \'bf\'a1\'b5\'f0\'c5\'cd\'b7\'ce +\f0 +\f1 \'ba\'b0\'c4\'aa\'c0\'bb +\f0 +\f1 \'bc\'f6\'c1\'a4\'c7\'d2 +\f0 +\f1 \'bc\'f6 +\f0 +\f1 \'c0\'d6\'b0\'d4 +\f0 +\f1 \'c7\'d5\'b4\'cf\'b4\'d9 +\f0 .\ +} \ No newline at end of file diff --git a/tools/GenerateIcon.csx b/tools/GenerateIcon.csx new file mode 100644 index 0000000..fa6c2e7 --- /dev/null +++ b/tools/GenerateIcon.csx @@ -0,0 +1,115 @@ +// C# Script: 다이아몬드 픽셀 아이콘 생성 (PNG → ICO) +// 실행: dotnet-script GenerateIcon.csx +// 또는 별도 콘솔 앱으로 빌드 + +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.IO; + +// 여러 크기로 생성 +int[] sizes = { 16, 24, 32, 48, 64, 128, 256 }; +string outputDir = Path.Combine(Path.GetDirectoryName(Environment.ProcessPath) ?? ".", "output"); +Directory.CreateDirectory(outputDir); + +foreach (var size in sizes) +{ + using var bmp = DrawDiamondPixel(size); + bmp.Save(Path.Combine(outputDir, $"icon_{size}.png"), ImageFormat.Png); + Console.WriteLine($"Generated icon_{size}.png"); +} + +// ICO 파일 생성 +CreateIco(sizes.Select(s => Path.Combine(outputDir, $"icon_{s}.png")).ToArray(), + Path.Combine(outputDir, "icon.ico")); +Console.WriteLine("Generated icon.ico"); + +static Bitmap DrawDiamondPixel(int size) +{ + var bmp = new Bitmap(size, size, PixelFormat.Format32bppArgb); + using var g = Graphics.FromImage(bmp); + g.SmoothingMode = SmoothingMode.HighQuality; + g.Clear(Color.Transparent); + + float cx = size / 2f; + float cy = size * 0.47f; // 약간 위쪽 중심 + float w = size * 0.44f; // 좌우 반폭 + float ht = size * 0.27f; // 상단 높이 + float hb = size * 0.23f; // 하단 높이 + + // 꼭짓점 + PointF top = new(cx, cy - ht); + PointF right = new(cx + w, cy); + PointF bottom = new(cx, cy + hb); + PointF left = new(cx - w, cy); + PointF center = new(cx, cy); + + // 좌상 - Blue + using (var brush = new LinearGradientBrush(top, center, Color.FromArgb(91, 141, 239), Color.FromArgb(45, 95, 204))) + { + g.FillPolygon(brush, new[] { top, center, left }); + } + // 우상 - Green + using (var brush = new LinearGradientBrush(top, center, Color.FromArgb(126, 217, 87), Color.FromArgb(76, 175, 80))) + { + g.FillPolygon(brush, new[] { top, right, center }); + } + // 좌하 - Red + using (var brush = new LinearGradientBrush(left, bottom, Color.FromArgb(255, 77, 106), Color.FromArgb(229, 57, 53))) + { + g.FillPolygon(brush, new[] { left, center, bottom }); + } + // 우하 - Green (darker) + using (var brush = new LinearGradientBrush(right, bottom, Color.FromArgb(102, 187, 106), Color.FromArgb(67, 160, 71))) + { + g.FillPolygon(brush, new[] { right, center, bottom }); + } + + // 갭 라인 + float gap = Math.Max(1, size / 128f); + using var pen = new Pen(Color.FromArgb(200, 10, 10, 20), gap); + g.DrawLine(pen, top, bottom); + g.DrawLine(pen, left, right); + + // 외곽 하이라이트 + float border = Math.Max(0.5f, size / 256f); + using var borderPen = new Pen(Color.FromArgb(60, 255, 255, 255), border); + g.DrawPolygon(borderPen, new[] { top, right, bottom, left }); + + return bmp; +} + +static void CreateIco(string[] pngPaths, string icoPath) +{ + using var ms = new MemoryStream(); + using var bw = new BinaryWriter(ms); + + var pngData = pngPaths.Select(p => File.ReadAllBytes(p)).ToArray(); + + // ICO Header + bw.Write((short)0); // Reserved + bw.Write((short)1); // ICO type + bw.Write((short)pngData.Length); // Image count + + int offset = 6 + (16 * pngData.Length); // After header + entries + + foreach (var png in pngData) + { + using var img = Image.FromStream(new MemoryStream(png)); + bw.Write((byte)(img.Width >= 256 ? 0 : img.Width)); + bw.Write((byte)(img.Height >= 256 ? 0 : img.Height)); + bw.Write((byte)0); // Color palette + bw.Write((byte)0); // Reserved + bw.Write((short)1); // Color planes + bw.Write((short)32); // Bits per pixel + bw.Write(png.Length); // Size + bw.Write(offset); // Offset + offset += png.Length; + } + + foreach (var png in pngData) + bw.Write(png); + + File.WriteAllBytes(icoPath, ms.ToArray()); +} diff --git a/tools/IconGenerator/IconGenerator.csproj b/tools/IconGenerator/IconGenerator.csproj new file mode 100644 index 0000000..b4ff856 --- /dev/null +++ b/tools/IconGenerator/IconGenerator.csproj @@ -0,0 +1,11 @@ + + + + Exe + net8.0-windows + true + enable + enable + + + diff --git a/tools/IconGenerator/Program.cs b/tools/IconGenerator/Program.cs new file mode 100644 index 0000000..3688a0f --- /dev/null +++ b/tools/IconGenerator/Program.cs @@ -0,0 +1,205 @@ +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; + +// 다이아몬드 픽셀 아이콘 생성기 v4 +// 보석 다이아몬드 컷 실루엣 (flat top → wide girdle → bottom point) +// 내부 facet 선 + RGBG 4색 채움 +// 참고: Samsung Diamond Pixel 구조 (흰색선 다이아몬드 도형) + +var outputPath = args.Length > 0 ? args[0] + : Path.Combine(AppContext.BaseDirectory, "icon.ico"); + +int[] sizes = [16, 24, 32, 48, 64, 128, 256]; +var pngList = new List(); + +foreach (var sz in sizes) +{ + using var bmp = DrawGemDiamond(sz); + using var ms = new MemoryStream(); + bmp.Save(ms, ImageFormat.Png); + pngList.Add(ms.ToArray()); + Console.WriteLine($" {sz}x{sz} OK"); +} + +CreateIco(pngList, sizes, outputPath); +Console.WriteLine($"Icon saved: {outputPath}"); + +static Bitmap DrawGemDiamond(int size) +{ + var bmp = new Bitmap(size, size, PixelFormat.Format32bppArgb); + using var g = Graphics.FromImage(bmp); + g.SmoothingMode = SmoothingMode.HighQuality; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.Clear(Color.Transparent); + + float s = size; + float cx = s / 2f; + + // ── 보석 다이아몬드 외곽 좌표 ── + // Table (평평한 윗면) + float tableL = s * 0.22f; + float tableR = s * 0.78f; + float tableY = s * 0.18f; + + // Girdle (가장 넓은 부분) + float girdleL = s * 0.06f; + float girdleR = s * 0.94f; + float girdleY = s * 0.40f; + + // Culet (바닥 뾰족한 점) + float culetX = cx; + float culetY = s * 0.92f; + + // 주요 꼭짓점 + PointF TL = new(tableL, tableY); // 테이블 좌 + PointF TR = new(tableR, tableY); // 테이블 우 + PointF GL = new(girdleL, girdleY); // 거들 좌 + PointF GR = new(girdleR, girdleY); // 거들 우 + PointF BT = new(culetX, culetY); // 바닥 점 + + // Crown 내부 포인트 (table → girdle 사이 facet) + PointF CM = new(cx, girdleY); // 거들 중앙 + PointF CT = new(cx, tableY); // 테이블 중앙 + + // Crown facet 분할점 + PointF CL = new(s * 0.14f, girdleY); // 거들 좌측 근처 + PointF CR = new(s * 0.86f, girdleY); // 거들 우측 근처 + + // Pavilion facet 내부 교차점들 + float pavMidY = s * 0.62f; + PointF PL = new(s * 0.28f, pavMidY); // 파빌리온 좌 중간 + PointF PR = new(s * 0.72f, pavMidY); // 파빌리온 우 중간 + PointF PM = new(cx, pavMidY); // 파빌리온 중앙 + + // ── 색상 ── + var blue = Color.FromArgb(50, 110, 230); + var blueBright = Color.FromArgb(80, 150, 255); + var green = Color.FromArgb(60, 200, 80); + var greenBright = Color.FromArgb(100, 235, 110); + var red = Color.FromArgb(230, 50, 65); + var redBright = Color.FromArgb(255, 90, 100); + var greenDk = Color.FromArgb(45, 170, 75); + var greenDkBr = Color.FromArgb(80, 210, 100); + + // ── Crown (상단부) 채우기 ── + + // Crown 좌: Blue + FillPoly(g, new[]{TL, GL, CM, CT}, blueBright, blue); + // Crown 우: Green + FillPoly(g, new[]{TR, CT, CM, GR}, greenBright, green); + + // ── Pavilion (하단부) 채우기 ── + + // Pavilion 좌: Red + FillPoly(g, new[]{GL, CM, BT}, redBright, red); + // Pavilion 우: Green (darker) + FillPoly(g, new[]{CM, GR, BT}, greenDkBr, greenDk); + + // ── Facet 내부 색상 변화 (깊이감) ── + // Crown 좌측 어두운 삼각형 + using var crownShadow = new SolidBrush(Color.FromArgb(25, 0, 0, 0)); + g.FillPolygon(crownShadow, new[]{TL, GL, new PointF(cx * 0.7f, girdleY * 0.85f)}); + + // Pavilion 중앙 밝은 삼각형 (반사) + using var pavHighlight = new SolidBrush(Color.FromArgb(20, 255, 255, 255)); + g.FillPolygon(pavHighlight, new[]{CM, BT, new PointF(cx - s*0.08f, pavMidY)}); + + // ── Facet 선 (흰색) ── + float lw = Math.Max(0.8f, s / 140f); + using var facetPen = new Pen(Color.FromArgb(180, 255, 255, 255), lw) + { + LineJoin = LineJoin.Round, + StartCap = LineCap.Round, + EndCap = LineCap.Round + }; + + // Crown facet lines + // 테이블 윗변 + g.DrawLine(facetPen, TL, TR); + // 테이블 → 거들 대각선 + g.DrawLine(facetPen, TL, GL); + g.DrawLine(facetPen, TR, GR); + // 세로 중심선 (table → girdle) + g.DrawLine(facetPen, CT, CM); + // Crown 크로스 facet + g.DrawLine(facetPen, TL, CM); + g.DrawLine(facetPen, TR, CM); + // 추가 Crown facet (table 모서리 → 거들 중간) + g.DrawLine(facetPen, TL, new PointF(girdleL + (cx - girdleL) * 0.5f, girdleY)); + g.DrawLine(facetPen, TR, new PointF(cx + (girdleR - cx) * 0.5f, girdleY)); + + // Girdle 수평선 + g.DrawLine(facetPen, GL, GR); + + // Pavilion facet lines + // 거들 → 바닥 점 + g.DrawLine(facetPen, GL, BT); + g.DrawLine(facetPen, GR, BT); + // 중심 → 바닥 + g.DrawLine(facetPen, CM, BT); + // Pavilion 크로스 facets + float crossY = girdleY + (culetY - girdleY) * 0.45f; + PointF crossL = new(girdleL + (culetX - girdleL) * 0.45f, crossY); + PointF crossR = new(girdleR - (girdleR - culetX) * 0.45f, crossY); + g.DrawLine(facetPen, GL, crossR); + g.DrawLine(facetPen, GR, crossL); + // 거들 중간점에서 바닥으로 + g.DrawLine(facetPen, new PointF(girdleL + (cx - girdleL) * 0.5f, girdleY), BT); + g.DrawLine(facetPen, new PointF(cx + (girdleR - cx) * 0.5f, girdleY), BT); + + // ── 외곽선 (두꺼운 흰색) ── + float olw = Math.Max(1.2f, s / 100f); + using var outlinePen = new Pen(Color.FromArgb(220, 255, 255, 255), olw) + { + LineJoin = LineJoin.Round + }; + g.DrawPolygon(outlinePen, new[]{TL, TR, GR, BT, GL}); + + // ── 상단 하이라이트 (테이블 면 빛 반사) ── + using var tableHL = new LinearGradientBrush( + TL, new PointF(cx, girdleY), + Color.FromArgb(45, 255, 255, 255), + Color.Transparent); + g.FillPolygon(tableHL, new[]{TL, TR, CT}); + + return bmp; +} + +static void FillPoly(Graphics g, PointF[] pts, Color c1, Color c2) +{ + float minX = pts.Min(p => p.X), maxX = pts.Max(p => p.X); + float minY = pts.Min(p => p.Y), maxY = pts.Max(p => p.Y); + var rect = new RectangleF(minX, minY, Math.Max(1, maxX - minX), Math.Max(1, maxY - minY)); + try + { + using var brush = new LinearGradientBrush(rect, c1, c2, LinearGradientMode.Vertical); + g.FillPolygon(brush, pts); + } + catch + { + using var brush = new SolidBrush(c1); + g.FillPolygon(brush, pts); + } +} + +static void CreateIco(List pngs, int[] sizes, string path) +{ + using var ms = new MemoryStream(); + using var bw = new BinaryWriter(ms); + bw.Write((short)0); + bw.Write((short)1); + bw.Write((short)pngs.Count); + int offset = 6 + 16 * pngs.Count; + for (int i = 0; i < pngs.Count; i++) + { + byte dim = (byte)(sizes[i] >= 256 ? 0 : sizes[i]); + bw.Write(dim); bw.Write(dim); + bw.Write((byte)0); bw.Write((byte)0); + bw.Write((short)1); bw.Write((short)32); + bw.Write(pngs[i].Length); bw.Write(offset); + offset += pngs[i].Length; + } + foreach (var png in pngs) bw.Write(png); + File.WriteAllBytes(path, ms.ToArray()); +} diff --git a/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.deps.json b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.deps.json new file mode 100644 index 0000000..b8ce41a --- /dev/null +++ b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "IconGenerator/1.0.0": { + "runtime": { + "IconGenerator.dll": {} + } + } + } + }, + "libraries": { + "IconGenerator/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.dll b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.dll new file mode 100644 index 0000000..09bd870 Binary files /dev/null and b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.dll differ diff --git a/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.exe b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.exe new file mode 100644 index 0000000..41e0532 Binary files /dev/null and b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.exe differ diff --git a/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.pdb b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.pdb new file mode 100644 index 0000000..687e59c Binary files /dev/null and b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.pdb differ diff --git a/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.runtimeconfig.json b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.runtimeconfig.json new file mode 100644 index 0000000..c7a4117 --- /dev/null +++ b/tools/IconGenerator/bin/Debug/net8.0-windows/IconGenerator.runtimeconfig.json @@ -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 + } + } +} \ No newline at end of file diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/tools/IconGenerator/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/tools/IconGenerator/obj/Debug/net8.0-windows/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.AssemblyInfo.cs b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.AssemblyInfo.cs new file mode 100644 index 0000000..aa1cd17 --- /dev/null +++ b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("IconGenerator")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("IconGenerator")] +[assembly: System.Reflection.AssemblyTitleAttribute("IconGenerator")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.AssemblyInfoInputs.cache b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.AssemblyInfoInputs.cache new file mode 100644 index 0000000..b2d85fc --- /dev/null +++ b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +8db69e7a9a114aa43ade0725fb4dc411b55dcd7dc248ff43874be8dbdf10f384 diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.GeneratedMSBuildEditorConfig.editorconfig b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..31f8d83 --- /dev/null +++ b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +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 = IconGenerator +build_property.ProjectDir = E:\AX Commander\tools\IconGenerator\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.GlobalUsings.g.cs b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.GlobalUsings.g.cs new file mode 100644 index 0000000..18cabb0 --- /dev/null +++ b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.GlobalUsings.g.cs @@ -0,0 +1,10 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Drawing; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; +global using System.Windows.Forms; diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.assets.cache b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.assets.cache new file mode 100644 index 0000000..87cd5f0 Binary files /dev/null and b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.assets.cache differ diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.csproj.CoreCompileInputs.cache b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..daccb6d --- /dev/null +++ b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +f8efbcd43fc5ccb39f9ae89bdef07be7bd65fb101bf102bd5f9287a1d91fde0c diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.csproj.FileListAbsolute.txt b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..20544af --- /dev/null +++ b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.csproj.FileListAbsolute.txt @@ -0,0 +1,14 @@ +E:\AX Commander\tools\IconGenerator\bin\Debug\net8.0-windows\IconGenerator.exe +E:\AX Commander\tools\IconGenerator\bin\Debug\net8.0-windows\IconGenerator.deps.json +E:\AX Commander\tools\IconGenerator\bin\Debug\net8.0-windows\IconGenerator.runtimeconfig.json +E:\AX Commander\tools\IconGenerator\bin\Debug\net8.0-windows\IconGenerator.dll +E:\AX Commander\tools\IconGenerator\bin\Debug\net8.0-windows\IconGenerator.pdb +E:\AX Commander\tools\IconGenerator\obj\Debug\net8.0-windows\IconGenerator.GeneratedMSBuildEditorConfig.editorconfig +E:\AX Commander\tools\IconGenerator\obj\Debug\net8.0-windows\IconGenerator.AssemblyInfoInputs.cache +E:\AX Commander\tools\IconGenerator\obj\Debug\net8.0-windows\IconGenerator.AssemblyInfo.cs +E:\AX Commander\tools\IconGenerator\obj\Debug\net8.0-windows\IconGenerator.csproj.CoreCompileInputs.cache +E:\AX Commander\tools\IconGenerator\obj\Debug\net8.0-windows\IconGenerator.dll +E:\AX Commander\tools\IconGenerator\obj\Debug\net8.0-windows\refint\IconGenerator.dll +E:\AX Commander\tools\IconGenerator\obj\Debug\net8.0-windows\IconGenerator.pdb +E:\AX Commander\tools\IconGenerator\obj\Debug\net8.0-windows\IconGenerator.genruntimeconfig.cache +E:\AX Commander\tools\IconGenerator\obj\Debug\net8.0-windows\ref\IconGenerator.dll diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.dll b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.dll new file mode 100644 index 0000000..09bd870 Binary files /dev/null and b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.dll differ diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.genruntimeconfig.cache b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.genruntimeconfig.cache new file mode 100644 index 0000000..1559dd8 --- /dev/null +++ b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.genruntimeconfig.cache @@ -0,0 +1 @@ +afab21064b1ed1d53cc92cad9266d0b51a7fd595a19d163e2eabcb858a0392da diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.pdb b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.pdb new file mode 100644 index 0000000..687e59c Binary files /dev/null and b/tools/IconGenerator/obj/Debug/net8.0-windows/IconGenerator.pdb differ diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/apphost.exe b/tools/IconGenerator/obj/Debug/net8.0-windows/apphost.exe new file mode 100644 index 0000000..41e0532 Binary files /dev/null and b/tools/IconGenerator/obj/Debug/net8.0-windows/apphost.exe differ diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/ref/IconGenerator.dll b/tools/IconGenerator/obj/Debug/net8.0-windows/ref/IconGenerator.dll new file mode 100644 index 0000000..ffdd9c6 Binary files /dev/null and b/tools/IconGenerator/obj/Debug/net8.0-windows/ref/IconGenerator.dll differ diff --git a/tools/IconGenerator/obj/Debug/net8.0-windows/refint/IconGenerator.dll b/tools/IconGenerator/obj/Debug/net8.0-windows/refint/IconGenerator.dll new file mode 100644 index 0000000..ffdd9c6 Binary files /dev/null and b/tools/IconGenerator/obj/Debug/net8.0-windows/refint/IconGenerator.dll differ diff --git a/tools/IconGenerator/obj/IconGenerator.csproj.nuget.dgspec.json b/tools/IconGenerator/obj/IconGenerator.csproj.nuget.dgspec.json new file mode 100644 index 0000000..73282c5 --- /dev/null +++ b/tools/IconGenerator/obj/IconGenerator.csproj.nuget.dgspec.json @@ -0,0 +1,72 @@ +{ + "format": 1, + "restore": { + "E:\\AX Commander\\tools\\IconGenerator\\IconGenerator.csproj": {} + }, + "projects": { + "E:\\AX Commander\\tools\\IconGenerator\\IconGenerator.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "E:\\AX Commander\\tools\\IconGenerator\\IconGenerator.csproj", + "projectName": "IconGenerator", + "projectPath": "E:\\AX Commander\\tools\\IconGenerator\\IconGenerator.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Commander\\tools\\IconGenerator\\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" + }, + "Microsoft.WindowsDesktop.App.WindowsForms": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/tools/IconGenerator/obj/IconGenerator.csproj.nuget.g.props b/tools/IconGenerator/obj/IconGenerator.csproj.nuget.g.props new file mode 100644 index 0000000..e97f99c --- /dev/null +++ b/tools/IconGenerator/obj/IconGenerator.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\admin\.nuget\packages\ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/tools/IconGenerator/obj/IconGenerator.csproj.nuget.g.targets b/tools/IconGenerator/obj/IconGenerator.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/tools/IconGenerator/obj/IconGenerator.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/tools/IconGenerator/obj/project.assets.json b/tools/IconGenerator/obj/project.assets.json new file mode 100644 index 0000000..85fe5c1 --- /dev/null +++ b/tools/IconGenerator/obj/project.assets.json @@ -0,0 +1,77 @@ +{ + "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 Commander\\tools\\IconGenerator\\IconGenerator.csproj", + "projectName": "IconGenerator", + "projectPath": "E:\\AX Commander\\tools\\IconGenerator\\IconGenerator.csproj", + "packagesPath": "C:\\Users\\admin\\.nuget\\packages\\", + "outputPath": "E:\\AX Commander\\tools\\IconGenerator\\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" + }, + "Microsoft.WindowsDesktop.App.WindowsForms": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/tools/IconGenerator/obj/project.nuget.cache b/tools/IconGenerator/obj/project.nuget.cache new file mode 100644 index 0000000..a108705 --- /dev/null +++ b/tools/IconGenerator/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "x+cHY1VR888=", + "success": true, + "projectFilePath": "E:\\AX Commander\\tools\\IconGenerator\\IconGenerator.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file