diff --git a/.github/actions/spelling/allow/allow.txt b/.github/actions/spelling/allow/allow.txt
index 20999b3a54e..7bff8f0cfa0 100644
--- a/.github/actions/spelling/allow/allow.txt
+++ b/.github/actions/spelling/allow/allow.txt
@@ -13,6 +13,7 @@ clickable
clig
CMMI
copyable
+Counterintuitively
CtrlDToClose
cybersecurity
dalet
@@ -94,6 +95,7 @@ shcha
slnt
Sos
ssh
+sustainability
stakeholders
sxn
timeline
diff --git a/.github/actions/spelling/allow/apis.txt b/.github/actions/spelling/allow/apis.txt
index 71b2922ca03..4ce5fe88d6d 100644
--- a/.github/actions/spelling/allow/apis.txt
+++ b/.github/actions/spelling/allow/apis.txt
@@ -28,6 +28,7 @@ CYICON
Dacl
dataobject
dcomp
+debugbreak
delayimp
DERR
dlldata
@@ -219,16 +220,19 @@ UFIELD
ULARGE
UOI
UPDATEINIFILE
+urlmon
userenv
USEROBJECTFLAGS
Vcpp
Viewbox
virtualalloc
vsnwprintf
+wcsnlen
wcsstr
wcstoui
WDJ
winhttp
+wininet
winmain
winsta
winstamin
diff --git a/.github/actions/spelling/allow/microsoft.txt b/.github/actions/spelling/allow/microsoft.txt
index b79f49c3781..1ed1c6da897 100644
--- a/.github/actions/spelling/allow/microsoft.txt
+++ b/.github/actions/spelling/allow/microsoft.txt
@@ -4,6 +4,7 @@ advapi
altform
altforms
appendwttlogging
+appinstaller
appx
appxbundle
appxerror
@@ -59,12 +60,13 @@ PRIINFO
propkey
pscustomobject
QWORD
+rdpclip
regedit
resfiles
robocopy
SACLs
-segoe
sdkddkver
+segoe
Shobjidl
sid
Skype
diff --git a/.github/actions/spelling/expect/expect.txt b/.github/actions/spelling/expect/expect.txt
index 2826e125a02..4339b17eb04 100644
--- a/.github/actions/spelling/expect/expect.txt
+++ b/.github/actions/spelling/expect/expect.txt
@@ -188,8 +188,10 @@ changelist
chaof
charinfo
CHARSETINFO
+chcbpat
chh
chk
+chshdng
CHT
Cic
cielab
@@ -749,7 +751,6 @@ gfx
GGI
GHIJK
GHIJKL
-GHIJKLM
gitfilters
gitmodules
gle
@@ -1000,7 +1001,6 @@ listptrsize
lld
llx
LMENU
-LMNOP
lnk
lnkd
lnkfile
@@ -1223,7 +1223,6 @@ nonspace
NOOWNERZORDER
Nop
NOPAINT
-NOPQRST
noprofile
NOREDRAW
NOREMOVE
@@ -1498,7 +1497,6 @@ pwsz
pythonw
Qaabbcc
qos
-QRSTU
QUERYOPEN
QUESTIONMARK
quickedit
@@ -1861,7 +1859,6 @@ testname
TESTNULL
testpass
testpasses
-testtimeout
TEXCOORD
texel
TExpected
@@ -1908,6 +1905,7 @@ touchpad
Tpp
Tpqrst
tprivapi
+tput
tracelog
tracelogging
traceloggingprovider
@@ -2018,7 +2016,6 @@ utext
UText
UTEXT
utr
-UVWX
UVWXY
UVWXYZ
uwa
@@ -2077,7 +2074,6 @@ VTRGBTo
vtseq
vtterm
vttest
-VWX
waitable
WANSUNG
WANTARROWS
@@ -2273,6 +2269,7 @@ YCast
YCENTER
YCount
YDPI
+YLimit
YOffset
YSubstantial
YVIRTUALSCREEN
diff --git a/OpenConsole.sln b/OpenConsole.sln
index 1a48fa2a001..5c2b55ccd4b 100644
--- a/OpenConsole.sln
+++ b/OpenConsole.sln
@@ -239,8 +239,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{89CDCC
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Types.Unit.Tests", "src\types\ut_types\Types.Unit.Tests.vcxproj", "{34DE34D3-1CD6-4EE3-8BD9-A26B5B27EC73}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PublicTerminalCore", "src\cascadia\PublicTerminalCore\PublicTerminalCore.vcxproj", "{84848BFA-931D-42CE-9ADF-01EE54DE7890}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfTerminalControl", "src\cascadia\WpfTerminalControl\WpfTerminalControl.csproj", "{376FE273-6B84-4EB5-8B30-8DE9D21B022C}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests_TerminalApp", "src\cascadia\ut_app\TerminalApp.UnitTests.vcxproj", "{CA5CAD1A-9333-4D05-B12A-1905CBF112F9}"
@@ -334,7 +332,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fmt", "src\dep\fmt\fmt.vcxp
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfTerminalTestNetCore", "src\cascadia\WpfTerminalTestNetCore\WpfTerminalTestNetCore.csproj", "{1588FD7C-241E-4E7D-9113-43735F3E6BAD}"
ProjectSection(ProjectDependencies) = postProject
- {84848BFA-931D-42CE-9ADF-01EE54DE7890} = {84848BFA-931D-42CE-9ADF-01EE54DE7890}
+ {CA5CAD1A-F542-4635-A069-7CAEFB930070} = {CA5CAD1A-F542-4635-A069-7CAEFB930070}
{A22EC5F6-7851-4B88-AC52-47249D437A52} = {A22EC5F6-7851-4B88-AC52-47249D437A52}
EndProjectSection
EndProject
@@ -1711,34 +1709,6 @@ Global
{34DE34D3-1CD6-4EE3-8BD9-A26B5B27EC73}.Release|x64.Build.0 = Release|x64
{34DE34D3-1CD6-4EE3-8BD9-A26B5B27EC73}.Release|x86.ActiveCfg = Release|Win32
{34DE34D3-1CD6-4EE3-8BD9-A26B5B27EC73}.Release|x86.Build.0 = Release|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.AuditMode|Any CPU.ActiveCfg = AuditMode|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.AuditMode|ARM.ActiveCfg = AuditMode|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.AuditMode|ARM64.ActiveCfg = AuditMode|ARM64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.AuditMode|x64.ActiveCfg = AuditMode|x64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.AuditMode|x64.Build.0 = AuditMode|x64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.AuditMode|x86.ActiveCfg = AuditMode|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.AuditMode|x86.Build.0 = AuditMode|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Debug|ARM.ActiveCfg = Debug|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Debug|ARM64.Build.0 = Debug|ARM64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Debug|x64.ActiveCfg = Debug|x64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Debug|x64.Build.0 = Debug|x64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Debug|x86.ActiveCfg = Debug|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Debug|x86.Build.0 = Debug|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Fuzzing|Any CPU.ActiveCfg = Fuzzing|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Fuzzing|ARM.ActiveCfg = Fuzzing|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Fuzzing|ARM64.ActiveCfg = Fuzzing|ARM64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Fuzzing|x64.ActiveCfg = Fuzzing|x64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Fuzzing|x86.ActiveCfg = Fuzzing|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Release|Any CPU.ActiveCfg = Release|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Release|ARM.ActiveCfg = Release|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Release|ARM64.ActiveCfg = Release|ARM64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Release|ARM64.Build.0 = Release|ARM64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Release|x64.ActiveCfg = Release|x64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Release|x64.Build.0 = Release|x64
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Release|x86.ActiveCfg = Release|Win32
- {84848BFA-931D-42CE-9ADF-01EE54DE7890}.Release|x86.Build.0 = Release|Win32
{376FE273-6B84-4EB5-8B30-8DE9D21B022C}.AuditMode|Any CPU.ActiveCfg = Release|Any CPU
{376FE273-6B84-4EB5-8B30-8DE9D21B022C}.AuditMode|ARM.ActiveCfg = Debug|Any CPU
{376FE273-6B84-4EB5-8B30-8DE9D21B022C}.AuditMode|ARM.Build.0 = Debug|Any CPU
@@ -2894,7 +2864,6 @@ Global
{05500DEF-2294-41E3-AF9A-24E580B82836} = {89CDCC5C-9F53-4054-97A4-639D99F169CD}
{1E4A062E-293B-4817-B20D-BF16B979E350} = {89CDCC5C-9F53-4054-97A4-639D99F169CD}
{34DE34D3-1CD6-4EE3-8BD9-A26B5B27EC73} = {89CDCC5C-9F53-4054-97A4-639D99F169CD}
- {84848BFA-931D-42CE-9ADF-01EE54DE7890} = {4DAF0299-495E-4CD1-A982-9BAC16A45932}
{376FE273-6B84-4EB5-8B30-8DE9D21B022C} = {4DAF0299-495E-4CD1-A982-9BAC16A45932}
{CA5CAD1A-9333-4D05-B12A-1905CBF112F9} = {BDB237B6-1D1D-400F-84CC-40A58FA59C8E}
{CA5CAD1A-9A12-429C-B551-8562EC954746} = {59840756-302F-44DF-AA47-441A9D673202}
diff --git a/README.md b/README.md
index b174aeaa5a9..2ace5f109b5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-![terminal-logos](https://user-images.githubusercontent.com/48369326/115790869-4c852b00-a37c-11eb-97f1-f61972c7800c.png)
+![terminal-logos](https://github.com/microsoft/terminal/assets/91625426/333ddc76-8ab2-4eb4-a8c0-4d7b953b1179)
# Welcome to the Windows Terminal, Console and Command-Line repo
@@ -118,6 +118,28 @@ repository.
---
+## Installing Windows Terminal Canary
+Windows Terminal Canary is a nightly build of Windows Terminal. This build has the latest code from our `main` branch, giving you an opportunity to try features before they make it to Windows Terminal Preview.
+
+Windows Terminal Canary is our least stable offering, so you may discover bugs before we have had a chance to find them.
+
+Windows Terminal Canary is available as an App Installer distribution and a Portable ZIP distribution.
+
+The App Installer distribution supports automatic updates. Due to platform limitations, this installer only works on Windows 11.
+
+The Portable ZIP distribution is a portable application. It will not automatically update and will not automatically check for updates. This portable ZIP distribution works on Windows 10 (19041+) and Windows 11.
+
+| Distribution | Architecture | Link |
+|---------------|:---------------:|------------------------------------------------------|
+| App Installer | x64, arm64, x86 | [download](https://aka.ms/terminal-canary-installer) |
+| Portable ZIP | x64 | [download](https://aka.ms/terminal-canary-zip-x64) |
+| Portable ZIP | ARM64 | [download](https://aka.ms/terminal-canary-zip-arm64) |
+| Portable ZIP | x86 | [download](https://aka.ms/terminal-canary-zip-x86) |
+
+_Learn more about the [types of Windows Terminal distributions](https://learn.microsoft.com/windows/terminal/distributions)._
+
+---
+
## Windows Terminal Roadmap
The plan for the Windows Terminal [is described here](/doc/roadmap-2023.md) and
diff --git a/build/config/esrp.build.batch.wpf.json b/build/config/esrp.build.batch.wpf.json
index e9c9af87891..62432046664 100644
--- a/build/config/esrp.build.batch.wpf.json
+++ b/build/config/esrp.build.batch.wpf.json
@@ -1,7 +1,7 @@
[
{
"MatchedPath": [
- "PublicTerminalCore.dll"
+ "Microsoft.Terminal.Control/Microsoft.Terminal.Control.dll"
],
"SigningInfo": {
"Operations": [
diff --git a/build/config/release.gdnbaselines b/build/config/release.gdnbaselines
new file mode 100644
index 00000000000..b8f686e3a94
--- /dev/null
+++ b/build/config/release.gdnbaselines
@@ -0,0 +1,1127 @@
+{
+ "hydrated": false,
+ "properties": {
+ "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/baselines",
+ "hydrationStatus": "This file does not contain identifying data. It is safe to check into your repo. To hydrate this file with identifying data, run `guardian hydrate --help` and follow the guidance."
+ },
+ "version": "1.0.0",
+ "baselines": {
+ "default": {
+ "name": "default",
+ "createdDate": "2023-09-29 19:39:12Z",
+ "lastUpdatedDate": "2023-09-29 19:39:12Z"
+ }
+ },
+ "results": {
+ "b1e592dc96e9286d806682680cffcb44b7ba2f7ea883b022371037689fe2bb5b": {
+ "signature": "b1e592dc96e9286d806682680cffcb44b7ba2f7ea883b022371037689fe2bb5b",
+ "alternativeSignatures": [
+ "25d5f2d86325f3e6666cf720c3b0827c7b5773c42f3770a6e83ab8bc0f716686"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "fd608e2146a69491516290ae3b65d4d094e5f9ba53c6624ff457c3b21f67e433": {
+ "signature": "fd608e2146a69491516290ae3b65d4d094e5f9ba53c6624ff457c3b21f67e433",
+ "alternativeSignatures": [
+ "528526d5f81c7387e9eca88c1dc1e7886bb3189d9c53f7678c63a44a7e78d2b8"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "104eb68a26c9a422f9973b85603046c42bb6894f398e1ebd454d829a386c47cd": {
+ "signature": "104eb68a26c9a422f9973b85603046c42bb6894f398e1ebd454d829a386c47cd",
+ "alternativeSignatures": [
+ "33b75434f899dc72a71c55e6667420b5f3406641eae1a784bad8632fe80eccc6"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "fa8ab295467d81fd138402f12899da84cdf312e2e84712a539e08361b6900651": {
+ "signature": "fa8ab295467d81fd138402f12899da84cdf312e2e84712a539e08361b6900651",
+ "alternativeSignatures": [
+ "b0ef4eae3f158488f99f7705cc93d037d55e8bd39b173c40e25581a35c6889d2"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "2d5cf239e62a256384275134ea1e1180b927f4cd53e51193751b0b5671045be8": {
+ "signature": "2d5cf239e62a256384275134ea1e1180b927f4cd53e51193751b0b5671045be8",
+ "alternativeSignatures": [
+ "bd73f2f051d6525c01db61a4c4a6c3b9a80083da83ed602eae2a70e17286a7ed"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "e88b3902e68d0315f7bef3a24860a7d3d9abd2d960fde06a0c650c6bb569df74": {
+ "signature": "e88b3902e68d0315f7bef3a24860a7d3d9abd2d960fde06a0c650c6bb569df74",
+ "alternativeSignatures": [
+ "143ade735d3d6d19f999555f2ce706f647a64688054b5f19052f99992ab325fd"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "01306239b92e4508b0ab60e025cadc4c974c33c29f1eb28d2b3fdda8d4019e09": {
+ "signature": "01306239b92e4508b0ab60e025cadc4c974c33c29f1eb28d2b3fdda8d4019e09",
+ "alternativeSignatures": [
+ "dca24210a3064ca7069a737f9a88f4a25b1cc1cd4c9e2a095156297246611de5"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "675ea9bd7809b2f210105e9703dffe8e48ee134ab21677e7cc4556bf22782e8d": {
+ "signature": "675ea9bd7809b2f210105e9703dffe8e48ee134ab21677e7cc4556bf22782e8d",
+ "alternativeSignatures": [
+ "7d5287a33645767969627a20e3a65fb2f1bb2db0e79a689b5a804a98f65d01fa"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "6e040bc57aa08165f8af6007e3794149d3a2c0325021e746e9705ada7c05b30c": {
+ "signature": "6e040bc57aa08165f8af6007e3794149d3a2c0325021e746e9705ada7c05b30c",
+ "alternativeSignatures": [
+ "218c0d7d5332113e33632d06eb0f209bac711ac515bd76a0fcfda2a0cbed885d"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "73e85b3af96a27c797fbe9f36f00feccd4118204615b9477da67e5868dd5dfb9": {
+ "signature": "73e85b3af96a27c797fbe9f36f00feccd4118204615b9477da67e5868dd5dfb9",
+ "alternativeSignatures": [
+ "49c44c3dc27233eba172214cb302de4b5c9b2a845e8595e7930fad74805183ac"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "15bd7ecdb19cdd263867db23c12a98029cede5476c89e870b811fce45abb8db4": {
+ "signature": "15bd7ecdb19cdd263867db23c12a98029cede5476c89e870b811fce45abb8db4",
+ "alternativeSignatures": [
+ "2705f7f6c9e83d2a812e264f39878e0e0173a1a5efea16e7206c4d02dc419af8"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "3f7d3360f0b185361b1e67b94c22b2a319b7c2d5aa2c8fd7fc3e4626394cba54": {
+ "signature": "3f7d3360f0b185361b1e67b94c22b2a319b7c2d5aa2c8fd7fc3e4626394cba54",
+ "alternativeSignatures": [
+ "71f05133f86c279daee4f1b85f997955e36857bcc5945dbae71f8bbb91b5df6d"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "3bcb157fd01d81513a15da41b4fc8b2820247331689fef5d0026578d95b85716": {
+ "signature": "3bcb157fd01d81513a15da41b4fc8b2820247331689fef5d0026578d95b85716",
+ "alternativeSignatures": [
+ "67e145d1f3bf6eb205e385884ca6356decffc3cac3e15339cc7ca43441cff99b"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "27ae6a9a7047c5ca98d1dc3a9b0885733875387d475f1426afc4d031b357fc1b": {
+ "signature": "27ae6a9a7047c5ca98d1dc3a9b0885733875387d475f1426afc4d031b357fc1b",
+ "alternativeSignatures": [
+ "b87d72abe37f6144614469221a0ce60e389792843f602805afe149b3ad1dd098"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "bd2aea1d24e36c1dcc128eb87a2c27292ed251d95aedf5f11204647bc68719f8": {
+ "signature": "bd2aea1d24e36c1dcc128eb87a2c27292ed251d95aedf5f11204647bc68719f8",
+ "alternativeSignatures": [
+ "ca29329aae819543d357e86acf0ccce914dbc3a15e0f91016091c3079638ad34"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "b836a6e0d58634003e054c88f3ed615d8e92182ebc78e9dd2168d8126c33e694": {
+ "signature": "b836a6e0d58634003e054c88f3ed615d8e92182ebc78e9dd2168d8126c33e694",
+ "alternativeSignatures": [
+ "850aa5d2e92dac06fc119ed297e84dfde9fdb3f9b116bdb2c83e8d66ea442865"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "e54972bb37d35b3b9c7c764cdf5351f0254ae2b8526465fe03c9ba8a04b06651": {
+ "signature": "e54972bb37d35b3b9c7c764cdf5351f0254ae2b8526465fe03c9ba8a04b06651",
+ "alternativeSignatures": [
+ "9e8723695743edaddfc5b188ec6bde240ddde68516f5c2342bd1c4d2a8c68430"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "3786d03543e25eec1f68beb21a3884953460239c269ba4071baf9fd4f564e763": {
+ "signature": "3786d03543e25eec1f68beb21a3884953460239c269ba4071baf9fd4f564e763",
+ "alternativeSignatures": [
+ "05e0c9bc16b8ade4d40d4e4371864da4ee7d9c8d68b19c3319543dbebea97a39"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "5f7c1c0c1f9290d3afad4bb3a17d5e5d33f2176e18b8ec406df71e8245ec0b7f": {
+ "signature": "5f7c1c0c1f9290d3afad4bb3a17d5e5d33f2176e18b8ec406df71e8245ec0b7f",
+ "alternativeSignatures": [
+ "952d91003467bdf2dbf5e72f56b9c69de52c4abf44cc82c0833ba8d89d9befac"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "605037e76782777be2f16c12c023247671ebad0afea868ed0c4bf939c9ff443a": {
+ "signature": "605037e76782777be2f16c12c023247671ebad0afea868ed0c4bf939c9ff443a",
+ "alternativeSignatures": [
+ "4f77f69716e098fec8214948428cfe9d2c2324d0719250b25e5c084a21d05e69"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "4a173deb8aeab5f4f2463774f117b909dee0168c99bc54b29b1141fca64598bd": {
+ "signature": "4a173deb8aeab5f4f2463774f117b909dee0168c99bc54b29b1141fca64598bd",
+ "alternativeSignatures": [
+ "66526149b57bbdaa8d4e3437a0099a4e3b7818c911b2110fa40d7d0264ce99f6"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "e557e9c4d1c36f69fd4a2310d22bbeadc1dff3dd2404449b8424662bb1c6adc7": {
+ "signature": "e557e9c4d1c36f69fd4a2310d22bbeadc1dff3dd2404449b8424662bb1c6adc7",
+ "alternativeSignatures": [
+ "6b93c58cd83ba89289c12b408c2988dfd54d7936c0920981cf690725155caf7a"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "70eb589101b9b57d2e47f6879348a8b93cd0c2f223e2c20d2289c5e1e8be0b9d": {
+ "signature": "70eb589101b9b57d2e47f6879348a8b93cd0c2f223e2c20d2289c5e1e8be0b9d",
+ "alternativeSignatures": [
+ "e9fe7fc2a31de263521f635058984dd81b4bab9cba174949fc5582fbeef6f693"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "3e5c0b1cad192bf5fa00d6b0f46f4cfaa7251ebaea30177d2d6891890f0dafab": {
+ "signature": "3e5c0b1cad192bf5fa00d6b0f46f4cfaa7251ebaea30177d2d6891890f0dafab",
+ "alternativeSignatures": [
+ "9a1dd0e934ddd3a33f3cf37372052731f5c157c13cac05ef0539815f845db9bf"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "dd3b2ddb278bb70559efcfc10e19c2f3a3bfe805cbbecd6a16dd141433f0b433": {
+ "signature": "dd3b2ddb278bb70559efcfc10e19c2f3a3bfe805cbbecd6a16dd141433f0b433",
+ "alternativeSignatures": [
+ "3fcb3a01715c6d244d26ef49fa4c06f8a92616a9c6465c26c4398c554f7fd67f"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "a635cb613925ab6c9f6b133890169bdf77acee212b6ac8f83cca7253faafaec7": {
+ "signature": "a635cb613925ab6c9f6b133890169bdf77acee212b6ac8f83cca7253faafaec7",
+ "alternativeSignatures": [
+ "2ff5cc7a3bf6cd63862cffc5088690fc824eb1d2f9e42c732fcd1611e9e25bfc"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "4ecdfc33e6267bfeadb1507d5304a9737f3ba0ee3132e6d7bc6f3fd68a47824e": {
+ "signature": "4ecdfc33e6267bfeadb1507d5304a9737f3ba0ee3132e6d7bc6f3fd68a47824e",
+ "alternativeSignatures": [
+ "23dc3273d54a3db12ad729569696b875523201dc13d4cbba9e3642dde17492bb"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "a9b9f171556057eaf197eb19780abfac5df82154f6c06c07240ce73970127df7": {
+ "signature": "a9b9f171556057eaf197eb19780abfac5df82154f6c06c07240ce73970127df7",
+ "alternativeSignatures": [
+ "0a9f4d3a4aa85e918744a5af36851791eb4b2f44fc132560cc56cf5661ba28fb"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "ad9da2b392f1622c6cff4a2b63eadf0da2ff31811dbbf8c9f2b2c4e8d9fefa1f": {
+ "signature": "ad9da2b392f1622c6cff4a2b63eadf0da2ff31811dbbf8c9f2b2c4e8d9fefa1f",
+ "alternativeSignatures": [
+ "b1fafebeb213b04346d56182ce395ccb9a0ad866dc28bda801c222499e550396"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "b8f591f33a84c38402239941484ead425c3e37bfcfd486b9be3a15d2213d9fa3": {
+ "signature": "b8f591f33a84c38402239941484ead425c3e37bfcfd486b9be3a15d2213d9fa3",
+ "alternativeSignatures": [
+ "de56fbe02702da318ea6a113e592b2efee3f942e04e31c5e9300cf6798abea0c"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "37adbb986601cf75f2d1eaebbe6d430a70a0886e60685a880e7d1f2c48f9b125": {
+ "signature": "37adbb986601cf75f2d1eaebbe6d430a70a0886e60685a880e7d1f2c48f9b125",
+ "alternativeSignatures": [
+ "7ebe5c4d5a144a3f356114bf5e062295ee90d5cdc7ca615dc729b7dcba8bed33"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "e0de291c50fb0cae3bdaf75237ac8e3f34acc6a8de18ba589dde4e76352ab849": {
+ "signature": "e0de291c50fb0cae3bdaf75237ac8e3f34acc6a8de18ba589dde4e76352ab849",
+ "alternativeSignatures": [
+ "52c0187472041933b5d850e47cf28ac6a7ef5ba0a6a85bca65af3b3531ddb06a"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "6b163fce31228367e0323768ab0dcc1224f8416cc856ddc03ccc2b8a2cf9a08e": {
+ "signature": "6b163fce31228367e0323768ab0dcc1224f8416cc856ddc03ccc2b8a2cf9a08e",
+ "alternativeSignatures": [
+ "0e6f9f2e1008091bcfbf520d7407c3690564ea5118580fd8cfca965946f53a78"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "25012b8cab7c6dddc276e2c0d7888554e8542dd686891914d2c2e82dfd3f697a": {
+ "signature": "25012b8cab7c6dddc276e2c0d7888554e8542dd686891914d2c2e82dfd3f697a",
+ "alternativeSignatures": [
+ "ea05d52f5ee2b483e83c14216a3e56bc8a4474396b71cbb426ced61242d81919"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "bfc7ac3b82698c138a970968cce2c849ed0e45bb8930d42215f6704659f63762": {
+ "signature": "bfc7ac3b82698c138a970968cce2c849ed0e45bb8930d42215f6704659f63762",
+ "alternativeSignatures": [
+ "c59c7529464c717d1909058d1f4fbc5109881effafab3c67bbbf02ccdffddd4e"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "25582fa1ab3be3a375a0d053304e65b50ebfa590f81a5d957759304ba29e3053": {
+ "signature": "25582fa1ab3be3a375a0d053304e65b50ebfa590f81a5d957759304ba29e3053",
+ "alternativeSignatures": [
+ "e2628baf1e09340a2063cd39c238e541014a65f4433018cc36cd25c5c8c3043d"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "38b73c3711c0c9cd958195f318fd2e6ab1f10cfa94abdfb7505d784ba022cfae": {
+ "signature": "38b73c3711c0c9cd958195f318fd2e6ab1f10cfa94abdfb7505d784ba022cfae",
+ "alternativeSignatures": [
+ "6688a9492755e33e541513bf297d0b4f459f70a43486fd8411749a2caf5cb91c"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "250a0184e9feee525e9a54930f5714965bd2bc29d0fe91c502c560443fa0e10a": {
+ "signature": "250a0184e9feee525e9a54930f5714965bd2bc29d0fe91c502c560443fa0e10a",
+ "alternativeSignatures": [
+ "d7b1083c67959b8f095acd532a10244a0a5afcbc93eefc66be20c19841b2588e"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "2c64c980db98b04a7daeedf4c5d358b8ecaecca81a8e0f70911fd211e06c8e20": {
+ "signature": "2c64c980db98b04a7daeedf4c5d358b8ecaecca81a8e0f70911fd211e06c8e20",
+ "alternativeSignatures": [
+ "7778c4704d515b92d4dc77a9b612c151e6bb9e7cd88e100c7d0419fb150f34e6"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "3bb5f422737103df8f018ec0789d2b7793ce5b1641927d5646e963126e73e1b5": {
+ "signature": "3bb5f422737103df8f018ec0789d2b7793ce5b1641927d5646e963126e73e1b5",
+ "alternativeSignatures": [
+ "225e02e47ea3f999bc43279246ee51b4287e4e2b4b7dac899da91c365d8acd0e"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "6e39bdcfe28e2cb6868a5dcbe12fa712d2a60762bb57fd82734089e19ca85b52": {
+ "signature": "6e39bdcfe28e2cb6868a5dcbe12fa712d2a60762bb57fd82734089e19ca85b52",
+ "alternativeSignatures": [
+ "f6ebab2bea88d78f69c8ae78f4ec641edd0f0796b9ca193260c44cee9d543a18"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "e9a5cff46470c62be3e1db1e43785b71daa88e466c802d4393bf9248a9e6fb56": {
+ "signature": "e9a5cff46470c62be3e1db1e43785b71daa88e466c802d4393bf9248a9e6fb56",
+ "alternativeSignatures": [
+ "3bdabc64cff83a1322f107a97ce6eab6e8cb41b8492643e9a0df3561d0169b95"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "9f19392621589641c13fc5762e36429cc4d38fc04f98297006be89e5ca3e5631": {
+ "signature": "9f19392621589641c13fc5762e36429cc4d38fc04f98297006be89e5ca3e5631",
+ "alternativeSignatures": [
+ "f448a0535740dcb9bddebe7765ea55c819472efdb9cd63761dc156b8af11a260"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "60b306912ae3399a167514dabf495a7f57e0ff17ec9a9491e66cf39c1ecbf60b": {
+ "signature": "60b306912ae3399a167514dabf495a7f57e0ff17ec9a9491e66cf39c1ecbf60b",
+ "alternativeSignatures": [
+ "fbd4d1fe2e8e21ed5fe000fc592ef9fa98ff52f529b849c9ceca12c85c3cf4f3"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "2498be9bbe27f393fad6af89f23cf228fe5c263e38fa3d20d3652b68c356243b": {
+ "signature": "2498be9bbe27f393fad6af89f23cf228fe5c263e38fa3d20d3652b68c356243b",
+ "alternativeSignatures": [
+ "750b9e1ff2f1b443502036d226678bcdda2f22a3879e36b61e3bcec24c0eec3e"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "147fa7e9b0187ab163dfe5049876c838b2b599a8ac2c243226ab4fed8d9e3513": {
+ "signature": "147fa7e9b0187ab163dfe5049876c838b2b599a8ac2c243226ab4fed8d9e3513",
+ "alternativeSignatures": [
+ "5fe9a0ee3ada52e4dbee1aa6f45683a82d14ed812d9d7c1634b786f28fc2ca51"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "a2fe2c57ef4efc03e72dfd1fa653fc9d731b69bda91711f8ab8d46edc3b12667": {
+ "signature": "a2fe2c57ef4efc03e72dfd1fa653fc9d731b69bda91711f8ab8d46edc3b12667",
+ "alternativeSignatures": [
+ "42ab6b70626c246ddea96b060cb7a79248576d19f003c4f4eedf171f4f5992f4"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "e7973a3b90d74d4ff6ee544dee45bb35ac66214a3e92eadecbf8fafccca9abb1": {
+ "signature": "e7973a3b90d74d4ff6ee544dee45bb35ac66214a3e92eadecbf8fafccca9abb1",
+ "alternativeSignatures": [
+ "3359d44d5bbf533487fc65e4a98220af62eef0cc6b883bc35b8286ee1a31ca4f"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "190440674b3fec2fcc77b341a684a9e9100c8dec0911a8c83f19f6ccedcb2b78": {
+ "signature": "190440674b3fec2fcc77b341a684a9e9100c8dec0911a8c83f19f6ccedcb2b78",
+ "alternativeSignatures": [
+ "c7aab0deb9b97032353766e961f4b23bc694e85b8b06709beaddfa2e5743e742"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "4d258afa7d015f4fc96c8866e2e43cb00290526d56394eec3848ed650cec840d": {
+ "signature": "4d258afa7d015f4fc96c8866e2e43cb00290526d56394eec3848ed650cec840d",
+ "alternativeSignatures": [
+ "e23b41b521b849057b8c5ba0594af11fc5ceec59714f3d0ebbeda708511d5803"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "530d02de7ec8a3c9f575cf3770e34665a58b127e01555000e611ee4c5e37e24d": {
+ "signature": "530d02de7ec8a3c9f575cf3770e34665a58b127e01555000e611ee4c5e37e24d",
+ "alternativeSignatures": [
+ "23f217577bcf9d3a6f87c0ac259cf891a80e78f2b77dd58e631816f3183101bd"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "69a35d8bd5d4766e5dc981526229ccc0d27f238b06357bdd8e0469cd35b47d08": {
+ "signature": "69a35d8bd5d4766e5dc981526229ccc0d27f238b06357bdd8e0469cd35b47d08",
+ "alternativeSignatures": [
+ "cab1cab825e5846acc097221236feaf3a06895e648c2ef16a4c285616b714987"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "c78a17b7f8d46b9ddedd34240d76adf92e4f1bf27a978c022e4599fe6a7b150d": {
+ "signature": "c78a17b7f8d46b9ddedd34240d76adf92e4f1bf27a978c022e4599fe6a7b150d",
+ "alternativeSignatures": [
+ "fa75ccd56697c3073a6ef17e2d959ee24b6afc11eabc4bd5dbea1d74ecdb81cb"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "7bd1757994e7f1909ffd25e56393f991d436232150cff2555a97e9b08b347b99": {
+ "signature": "7bd1757994e7f1909ffd25e56393f991d436232150cff2555a97e9b08b347b99",
+ "alternativeSignatures": [
+ "dbdb5c5ebe211b21d9b25e346dfbc58e6b32500258a1efed248e4630216ce57e"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "cef01bb2a477968c8cbc997179d04b90c36febd9cfd21ca973d4a22b3efc4caa": {
+ "signature": "cef01bb2a477968c8cbc997179d04b90c36febd9cfd21ca973d4a22b3efc4caa",
+ "alternativeSignatures": [
+ "9ec52d86604abde8a13124534ec587d3a1686630ea7bb2f736a66963349abdbd"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "11026da7398e29b59d98ffee5ed5317c243407638a77d7a09637ebe2d8bb09f3": {
+ "signature": "11026da7398e29b59d98ffee5ed5317c243407638a77d7a09637ebe2d8bb09f3",
+ "alternativeSignatures": [
+ "a642f1f37cf06c75c2082d720e317481bb7e73249dcda33dba0b5cdd6933926f"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "8f2550b4f39a798d217679c04dd7cb21b72ef63e6f6d63b06aadb1c40d8c2546": {
+ "signature": "8f2550b4f39a798d217679c04dd7cb21b72ef63e6f6d63b06aadb1c40d8c2546",
+ "alternativeSignatures": [
+ "10c95aac8513a0d6cc2c0ef08b51f7f4ac3be4b23ddd90d68d06fc536421acc3"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "022eb0065260832f06f12313f8bf99765488c1db9ff9ef8ecf8a0cbf393e878d": {
+ "signature": "022eb0065260832f06f12313f8bf99765488c1db9ff9ef8ecf8a0cbf393e878d",
+ "alternativeSignatures": [
+ "4801e53b7e46778aa21a8c9a0ec2725e73746fb648e76c9359f6db0f32ac2963"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "36f66ad8b00e978f29a7b1c09c7942247e3b068d131431c3b321190aa7cb2978": {
+ "signature": "36f66ad8b00e978f29a7b1c09c7942247e3b068d131431c3b321190aa7cb2978",
+ "alternativeSignatures": [
+ "7d3ee020a3a1601c49be0c5d687f46858f679ecf6d4150b97ba9ae5abfa742e4"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "c50b78c8370aa9d767f783bddf8c57b2f1dbd749073ccde60b3b210b116b6951": {
+ "signature": "c50b78c8370aa9d767f783bddf8c57b2f1dbd749073ccde60b3b210b116b6951",
+ "alternativeSignatures": [
+ "87568cc368760fe9f38d9fb95e93297d8bb5a83587d20d071f97713443df2e04"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "8e2be08973d6028cf58e152fba8dcd5616b7938591d2292eaf3bb5f80bdcf004": {
+ "signature": "8e2be08973d6028cf58e152fba8dcd5616b7938591d2292eaf3bb5f80bdcf004",
+ "alternativeSignatures": [
+ "d9df5f887062a990099a2cb70e46778aad25304d9758db556040beb4b23a8776"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "be36363b685b28e3ac4457b7a415120cab5a01c14d5c9a19192ef5ebd71c176a": {
+ "signature": "be36363b685b28e3ac4457b7a415120cab5a01c14d5c9a19192ef5ebd71c176a",
+ "alternativeSignatures": [
+ "13779d67c6e5f5eba285b83093a2c9eec2d79b3b36ee86400873191310088255"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "a6e48721d67f94b2876a97fe4b385ee37adc1b345825f751e87d6bd05095bfb9": {
+ "signature": "a6e48721d67f94b2876a97fe4b385ee37adc1b345825f751e87d6bd05095bfb9",
+ "alternativeSignatures": [
+ "f6a5898d9652b23b269283d4bc1a8e95865ee9f7125479ab78087e3dd3b3b12f"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "b1b1aba985591c904b0faf09b54ddc4763890d25e5dcfa2d3ca758165a616970": {
+ "signature": "b1b1aba985591c904b0faf09b54ddc4763890d25e5dcfa2d3ca758165a616970",
+ "alternativeSignatures": [
+ "b7ad084f971c1fae38509e87d50fd4984185ea6915d501d6cc0d1eac8bd93abf"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "078e8e5c43a51876fb09d7fab78a07fe896bbbb74c9507f3b6313ed3fe7586d4": {
+ "signature": "078e8e5c43a51876fb09d7fab78a07fe896bbbb74c9507f3b6313ed3fe7586d4",
+ "alternativeSignatures": [
+ "7046bab04be2bfce75f0a34461871d3dccddab009c2a223a78c08696610c7a55"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "9443465290e747bbefb4435296af78a82a948222097df6559db0d0488f7df81a": {
+ "signature": "9443465290e747bbefb4435296af78a82a948222097df6559db0d0488f7df81a",
+ "alternativeSignatures": [
+ "47a1795431bb9f78383c54fd33cf3427a774ae9802aa994cbd688f81286904bd"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "01a56e39bd6a3652d95b21035efc6d165eb16451f9558d79ff13d297cd345cd9": {
+ "signature": "01a56e39bd6a3652d95b21035efc6d165eb16451f9558d79ff13d297cd345cd9",
+ "alternativeSignatures": [
+ "2169e62964a8fa3bb4ccde41e33232efa8b7ddfb6d5a45688c28318c96ccbe52"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "a9c67896453ec9e7fb742e05ec0a47f13c5c6b7bd3886497afe3c3bb860ef006": {
+ "signature": "a9c67896453ec9e7fb742e05ec0a47f13c5c6b7bd3886497afe3c3bb860ef006",
+ "alternativeSignatures": [
+ "5973211461980400fe2aeea7dafe6079e6f771d799c347a0bcb7c631dc379d5e"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "2689cc88d4721d762e3783920aa7150cd00e4b5f7f15bdd81476dbb56876aa08": {
+ "signature": "2689cc88d4721d762e3783920aa7150cd00e4b5f7f15bdd81476dbb56876aa08",
+ "alternativeSignatures": [
+ "ba41ff939940ab49d1a4b39dfb5fac6108111616c0d7fb87e6f64f1b82cbfbd2"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "64d08c256034d4907fa6655e4914850c945bf1f6db4e14f52a8032eefe8e1245": {
+ "signature": "64d08c256034d4907fa6655e4914850c945bf1f6db4e14f52a8032eefe8e1245",
+ "alternativeSignatures": [
+ "639e5b7c91137d49bd041d7f241bd2403067f445de5058048c4c6c926af226bd"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "689ed96056f498ca67a5a056efa247ee9aea196362e693a0b196e6e9eb2cba0f": {
+ "signature": "689ed96056f498ca67a5a056efa247ee9aea196362e693a0b196e6e9eb2cba0f",
+ "alternativeSignatures": [
+ "9473554d81655d5cf548e8033fc5f34cd42cec8697306b75fc2ec31e8c19b29e"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "f497cbbab92fbbd65c27b122c7ceaf0d181859365ea121a885d32898dec963c6": {
+ "signature": "f497cbbab92fbbd65c27b122c7ceaf0d181859365ea121a885d32898dec963c6",
+ "alternativeSignatures": [
+ "2fe25bb29ed8a90e5dba2e8e899f42713b61d178fd18231d560d4873656fe8a4"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "669b421bcaea46b4f3a2b63097a357920df16b02075d1b86a476f9ee6fc4314a": {
+ "signature": "669b421bcaea46b4f3a2b63097a357920df16b02075d1b86a476f9ee6fc4314a",
+ "alternativeSignatures": [
+ "5647958533f690de004b8f82064ed0fc779fe1206b64a1813f90988481dfb72e"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "8bb84450c75dcbee365ee2b2eb2ff83ef91925afb50d9c96aec845729f3a9be1": {
+ "signature": "8bb84450c75dcbee365ee2b2eb2ff83ef91925afb50d9c96aec845729f3a9be1",
+ "alternativeSignatures": [
+ "85d7ccfcf73dbbc98b78cbd81581f3e81e9bc9a632a589fd79abb6f9cdd3236d"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "9beca9c8ed341ed7dbc682811ca43ec7174d945df99613c85e76e45ad55ac7f3": {
+ "signature": "9beca9c8ed341ed7dbc682811ca43ec7174d945df99613c85e76e45ad55ac7f3",
+ "alternativeSignatures": [
+ "147836cc11afe71d92bdf75ef6d5b1b97ae5f5709d07a9d8c58ef8bce0631a86"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "a0f61b31ca15ee653301086835bfb62889b4f4b537fd703ccfc21df9aa280a59": {
+ "signature": "a0f61b31ca15ee653301086835bfb62889b4f4b537fd703ccfc21df9aa280a59",
+ "alternativeSignatures": [
+ "62828b4278eba310bc7982e5afdac6b0a865bb647f8d3cb078a6391e1a48054f"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "235159b32d9022a9e8bf8e37fd5489bb11ca6f1bf56e8ee8737e63358c3610e5": {
+ "signature": "235159b32d9022a9e8bf8e37fd5489bb11ca6f1bf56e8ee8737e63358c3610e5",
+ "alternativeSignatures": [
+ "ddb5cc4ca95b12e6fcccfd2c5089c798307d3bb664d91e9a87f6efbd1ea78a19"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "48738e93956293a663a2d1f6933bd6856afc4699c22d45da51ca02ffe4781230": {
+ "signature": "48738e93956293a663a2d1f6933bd6856afc4699c22d45da51ca02ffe4781230",
+ "alternativeSignatures": [
+ "e83017371567ceabc524ef3e26a5520be1aac07e75b1f02a173f2eb847fbc3e5"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "6d0c84954b066bde9f165d3e7471f621d824bf0f9d920125f2188196c3e7be99": {
+ "signature": "6d0c84954b066bde9f165d3e7471f621d824bf0f9d920125f2188196c3e7be99",
+ "alternativeSignatures": [
+ "07e93499ac1047ac94bc10474ba57d397bf395f28f8d6e0dd08eeab03f17a539"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "b033555adb13ce0c0ec9e65689e4be5f9856f49f9e201f3dbbb24d430d76ec15": {
+ "signature": "b033555adb13ce0c0ec9e65689e4be5f9856f49f9e201f3dbbb24d430d76ec15",
+ "alternativeSignatures": [
+ "0a59d205aee1fdc5cb027a46c424e4a2da06c5650aadbfdfec77d744278d6b7b"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "c522ca7bfcad2bc36cfb9567a5bbe36395bb3a5969ce411832197ff9ccfd4b32": {
+ "signature": "c522ca7bfcad2bc36cfb9567a5bbe36395bb3a5969ce411832197ff9ccfd4b32",
+ "alternativeSignatures": [
+ "32eb8b00cbe99b945a02337c349a0fb97e1763fa9782469531a6859714a7160f"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "1c58db43c898e119381ecd4a9bb9701f2bbbffd3d0889ca734a905c151b168db": {
+ "signature": "1c58db43c898e119381ecd4a9bb9701f2bbbffd3d0889ca734a905c151b168db",
+ "alternativeSignatures": [
+ "a87bb1c17c23667355c9b8e17f84f37671b65040a3aa7870a7d169165583211e"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "ef7ba70ebe8984da430b1787f439496e14810afd9848a851a3d4cacc37ae7eac": {
+ "signature": "ef7ba70ebe8984da430b1787f439496e14810afd9848a851a3d4cacc37ae7eac",
+ "alternativeSignatures": [
+ "bbff3ea19b6dd5baa7d56928526a38313685c1d81a30c7c2e7c31d7105d8287f"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "5bb44f02281666fb7ef18753b4ed0e08923d741efe0361ab1336c18dd0086111": {
+ "signature": "5bb44f02281666fb7ef18753b4ed0e08923d741efe0361ab1336c18dd0086111",
+ "alternativeSignatures": [
+ "a4f1b29f64aa99073ad3678c41b29ab15bd3af2cbc87ae6b05e6568265734146"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "1621b0375d4c98eb6822a7ae37feccda594bbd0137cba47b721f9f9288929947": {
+ "signature": "1621b0375d4c98eb6822a7ae37feccda594bbd0137cba47b721f9f9288929947",
+ "alternativeSignatures": [
+ "05396ecc761c29e0e0b0a1508c1ed091b213ea18917b9f0ba118c1e7032c51df"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "c566d2437202984d3a9d2682ca810d7c52eb78c7b6236c7b9c82db6f7ba63ac8": {
+ "signature": "c566d2437202984d3a9d2682ca810d7c52eb78c7b6236c7b9c82db6f7ba63ac8",
+ "alternativeSignatures": [
+ "2bcbfb431661bacfa69c2c43c8f09f47444b22353d9e3f7db28f98c7b8126bd6"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "8f8856d0c4f85bb601ea84e7b9da0d5d636573c772951c4e85bf4cf61fef72bc": {
+ "signature": "8f8856d0c4f85bb601ea84e7b9da0d5d636573c772951c4e85bf4cf61fef72bc",
+ "alternativeSignatures": [
+ "769ffcc5ae3360b1017647384c184dc56574e0d9ddd00f4083e1c986e9f616b2"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "b4c31c908facbb22d23b15c3280359184d736901c154d516be16495dbb35ccb0": {
+ "signature": "b4c31c908facbb22d23b15c3280359184d736901c154d516be16495dbb35ccb0",
+ "alternativeSignatures": [
+ "d4603cccc6c303b5f16f1120b15dc74e8bdbef5877922fdcf57f3b29423c027b"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "7e3401dab114451f8ccc26a6ee0ac27639a41cef983b5c7ca7b22f8e03748b53": {
+ "signature": "7e3401dab114451f8ccc26a6ee0ac27639a41cef983b5c7ca7b22f8e03748b53",
+ "alternativeSignatures": [
+ "32964f7bed67a8e77a61cdc1cdedfb55c8800e04f16e9673dbc1c9dda0d2fcf0"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "1599eec39bd8bfe41754c1b87f6d4cf2517107bf55a31fd6f06e57853f0edcb3": {
+ "signature": "1599eec39bd8bfe41754c1b87f6d4cf2517107bf55a31fd6f06e57853f0edcb3",
+ "alternativeSignatures": [
+ "1d0195a64263b4be03267b1ce650ac0ad6b3589f32639ecd3792df0a39134d2a"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "c7e28dfe20e2c60575af07324e9960283b6ab567f4d0877763109330077b535d": {
+ "signature": "c7e28dfe20e2c60575af07324e9960283b6ab567f4d0877763109330077b535d",
+ "alternativeSignatures": [
+ "22da5e4da2ab3befa6aea6c7b562de7057d367a0bf4f05a5791a02c6d7de5886"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "da7db308719d405aa91b08fcda683bc73d9fb73906ad14857b07f1487e2538fb": {
+ "signature": "da7db308719d405aa91b08fcda683bc73d9fb73906ad14857b07f1487e2538fb",
+ "alternativeSignatures": [
+ "e8a05e57577cfff0f0614b0e2ac77ef86185b636ac9a85322decda6d93bb1025"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "406449365cf5b8a747cda6bcb9f698ab04e5f23c76ea26b15ae5f6dd199e200a": {
+ "signature": "406449365cf5b8a747cda6bcb9f698ab04e5f23c76ea26b15ae5f6dd199e200a",
+ "alternativeSignatures": [
+ "ab85af1c9f00c18837eddc1a658df6f16759b57337f0c576979a7ead9ca5aea5"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "2d3985d721950fdc54d6dd67f6da4e2f26da1de752237d6eff2bee79e76e74cf": {
+ "signature": "2d3985d721950fdc54d6dd67f6da4e2f26da1de752237d6eff2bee79e76e74cf",
+ "alternativeSignatures": [
+ "eb8fe28224b13b24a5fd5dab39c73356ab0e958242fefd3468a632b6f1fc8468"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "73a9b54e10ff814734690c8e99319851d3caffb8d7ee02237ccef08057623c57": {
+ "signature": "73a9b54e10ff814734690c8e99319851d3caffb8d7ee02237ccef08057623c57",
+ "alternativeSignatures": [
+ "a8395f556a6edc7f633b06820ab22d4ae275f1e2f0fb9f0389520cba4a3fa038"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "f5e7a576035cfef04eaefb5c3d64e7575c80aea1449c6528d16bd18f19601938": {
+ "signature": "f5e7a576035cfef04eaefb5c3d64e7575c80aea1449c6528d16bd18f19601938",
+ "alternativeSignatures": [
+ "e3bf1d972a8173cd7c9e853facdd28b184614cffc18ce2a47e00114894a9a0f3"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "85150297f02b3d19a5a032b1ec6b083b4bc2eec2643f60cceac18fd07551134e": {
+ "signature": "85150297f02b3d19a5a032b1ec6b083b4bc2eec2643f60cceac18fd07551134e",
+ "alternativeSignatures": [
+ "56a1cb19171420c70451d831140f44f8beace9ee605870a54998170e9b9eea44"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "db5e6cce78b5039be2e56eb828caea7fbc1b2c0ddf2204f3c95e90805f480025": {
+ "signature": "db5e6cce78b5039be2e56eb828caea7fbc1b2c0ddf2204f3c95e90805f480025",
+ "alternativeSignatures": [
+ "38588e5b5cbf9208115ae67488467545f67a83e5ea18d08f65e76318ba2809c1"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "87cbf986f8699bddcd94445159a5772945dd63bb4f55587afaecb5be2846e3cb": {
+ "signature": "87cbf986f8699bddcd94445159a5772945dd63bb4f55587afaecb5be2846e3cb",
+ "alternativeSignatures": [
+ "229e52e7992660959c3cc4581b73623f6807f87a266ecced4af4343f1f8a2c06"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "c3cc891778043c08b6177ace3e90a4af4be52f7936d9df603efcfa77f11df9cf": {
+ "signature": "c3cc891778043c08b6177ace3e90a4af4be52f7936d9df603efcfa77f11df9cf",
+ "alternativeSignatures": [
+ "4d98cab41917051c77b027daaa0ebaad30ae99b738bb3721331ddacb3d13e990"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "dbd00c32ac388db25b7b4095d242411fb192ecc6d471c80d72f6c83bc5790f5d": {
+ "signature": "dbd00c32ac388db25b7b4095d242411fb192ecc6d471c80d72f6c83bc5790f5d",
+ "alternativeSignatures": [
+ "5d3a76ad12be60e1fc117dae08b4e56f70e0e905000e6bac82b7c0d7d47efa12"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "5b68b91f6e33cf24cb0a6b106bad2cccc5f7191510437ce703a42f1fefbb1d13": {
+ "signature": "5b68b91f6e33cf24cb0a6b106bad2cccc5f7191510437ce703a42f1fefbb1d13",
+ "alternativeSignatures": [
+ "cbd85190a9dc566b475d9d0da29ef2890469d545129695dccd33e12b042c7f87"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "48a3d50b09e89367e161fa2e843b605dbf840ac3264623bad804634b9e17f0b1": {
+ "signature": "48a3d50b09e89367e161fa2e843b605dbf840ac3264623bad804634b9e17f0b1",
+ "alternativeSignatures": [
+ "ecf7b4e72800b2f2881b924e7c602984c0101738bfe7d901ef9bf68d54f22acc"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "5b641532bc10265a307b0984e2c1cf7478d345aa73e0b9f52f57de6b6139db0d": {
+ "signature": "5b641532bc10265a307b0984e2c1cf7478d345aa73e0b9f52f57de6b6139db0d",
+ "alternativeSignatures": [
+ "93f72434bf401ab42b1478aae49174f0f231385f2d190646de90b2f321bf0405"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "f5bbdce1f432ce0cc0f8eab2a548e86389c11972a0fd807d5b0218929dc0667f": {
+ "signature": "f5bbdce1f432ce0cc0f8eab2a548e86389c11972a0fd807d5b0218929dc0667f",
+ "alternativeSignatures": [
+ "c0dd620ed7794312e1f535291893133d2983ef6af266bf1261e08f5a40030184"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "b48abf4f4fc439b180232125d632b47c3ca44cde8f518e08d38905578255a76e": {
+ "signature": "b48abf4f4fc439b180232125d632b47c3ca44cde8f518e08d38905578255a76e",
+ "alternativeSignatures": [
+ "8b1d9c30d610788b227bcf7b1a02f715887adb26d9d476705a864bfbd3eec42d"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "5b91412070b80c595c93a131c6423a78aca0eb174e67b49a72f3a28b2f2e04fc": {
+ "signature": "5b91412070b80c595c93a131c6423a78aca0eb174e67b49a72f3a28b2f2e04fc",
+ "alternativeSignatures": [
+ "3b52062806f35937f2372d4497d5679d95e9c28d9cef710ac9f0551b3bf6fa69"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "4e6e328cd795ad8ffa3d409d0e0313ae91f87124a058e5dfe64dfbc93e236f78": {
+ "signature": "4e6e328cd795ad8ffa3d409d0e0313ae91f87124a058e5dfe64dfbc93e236f78",
+ "alternativeSignatures": [
+ "656279220733cb5f45e3ef13a50ae9174c9763f7c24ff163245f6bea398d0794"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "4dd68b37dee025fa0a77ac00e6e85ce7e1ad8add70a2226e10a6423534359a9b": {
+ "signature": "4dd68b37dee025fa0a77ac00e6e85ce7e1ad8add70a2226e10a6423534359a9b",
+ "alternativeSignatures": [
+ "c63dd7cfcff47e1a2f686035319925e8b2d3b0f1ac8db86b39d4b1821ae4797d"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "62a125c376534b19e9083efbad081f32bc294602b7f19a5210ad940e1c450a5f": {
+ "signature": "62a125c376534b19e9083efbad081f32bc294602b7f19a5210ad940e1c450a5f",
+ "alternativeSignatures": [
+ "2b2732249979c5e87cc79cbdec660e2b1c8eba1f93a362e5595ec03cdf1e4951"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ },
+ "f918c167a1a70deba61361fd3138b76fba86387a1f41237efeda8f01d464457e": {
+ "signature": "f918c167a1a70deba61361fd3138b76fba86387a1f41237efeda8f01d464457e",
+ "alternativeSignatures": [
+ "959e93d957e0e5ec521d2f3b9dae02db123812fb8d523d8175329b08694d65d9"
+ ],
+ "memberOf": [
+ "default"
+ ],
+ "createdDate": "2023-09-29 19:39:12Z"
+ }
+ }
+}
\ No newline at end of file
diff --git a/build/config/template.appinstaller b/build/config/template.appinstaller
new file mode 100644
index 00000000000..7977fd950b8
--- /dev/null
+++ b/build/config/template.appinstaller
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/config/tsa.json b/build/config/tsa.json
new file mode 100644
index 00000000000..89874d37fc0
--- /dev/null
+++ b/build/config/tsa.json
@@ -0,0 +1,6 @@
+{
+ "instanceUrl": "https://microsoft.visualstudio.com",
+ "projectName": "OS",
+ "areaPath": "OS\\Windows Client and Services\\ADEPT\\E4D-Engineered for Developers\\SHINE\\Terminal",
+ "notificationAliases": ["condev@microsoft.com", "duhowett@microsoft.com"]
+}
diff --git a/build/pipelines/nightly.yml b/build/pipelines/nightly.yml
deleted file mode 100644
index 025a643509f..00000000000
--- a/build/pipelines/nightly.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-trigger: none
-pr: none
-schedules:
- - cron: "30 3 * * 2-6" # Run at 03:30 UTC Tuesday through Saturday (After the work day in Pacific, Mon-Fri)
- displayName: "Nightly Terminal Build"
- branches:
- include:
- - main
- always: false # only run if there's code changes!
-
-name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr)
-
-extends:
- template: templates-v2\pipeline-full-release-build.yml
- parameters:
- branding: Canary
- buildTerminal: true
- pgoBuildMode: Optimize
- codeSign: true
- generateSbom: true
- publishSymbolsToPublic: true
- publishVpackToWindows: false
- symbolExpiryTime: 15 # Nightly builds do not keep symbols for very long!
diff --git a/build/pipelines/ob-nightly.yml b/build/pipelines/ob-nightly.yml
new file mode 100644
index 00000000000..1c90866f9e2
--- /dev/null
+++ b/build/pipelines/ob-nightly.yml
@@ -0,0 +1,53 @@
+trigger: none
+pr: none
+schedules:
+ - cron: "30 3 * * 2-6" # Run at 03:30 UTC Tuesday through Saturday (After the work day in Pacific, Mon-Fri)
+ displayName: "Nightly Terminal Build"
+ branches:
+ include:
+ - main
+ always: false # only run if there's code changes!
+
+parameters:
+ - name: publishToAzure
+ displayName: "Deploy to **PUBLIC** Azure Storage"
+ type: boolean
+ default: true
+
+name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr)
+
+variables:
+ - template: templates-v2/variables-nuget-package-version.yml
+ parameters:
+ branding: Canary
+ - template: templates-v2/variables-onebranch-config.yml
+
+extends:
+ template: templates-v2/pipeline-onebranch-full-release-build.yml
+ parameters:
+ official: true
+ branding: Canary
+ buildTerminal: true
+ pgoBuildMode: Optimize
+ codeSign: true
+ publishSymbolsToPublic: true
+ publishVpackToWindows: false
+ symbolExpiryTime: 15
+ ${{ if eq(true, parameters.publishToAzure) }}:
+ extraPublishJobs:
+ - template: build/pipelines/templates-v2/job-deploy-to-azure-storage.yml@self
+ parameters:
+ pool: { type: windows }
+ variables:
+ ob_git_checkout: false # This job checks itself out
+ ob_git_skip_checkout_none: true
+ ob_outputDirectory: "$(Build.SourcesDirectory)/_none"
+ dependsOn: [PublishSymbols]
+ storagePublicRootURL: $(AppInstallerRootURL)
+ subscription: $(AzureSubscriptionName)
+ storageAccount: $(AzureStorageAccount)
+ storageContainer: $(AzureStorageContainer)
+ buildConfiguration: Release
+ buildPlatforms: [x64, x86, arm64]
+ environment: production-canary
+
diff --git a/build/pipelines/release.yml b/build/pipelines/ob-release.yml
similarity index 81%
rename from build/pipelines/release.yml
rename to build/pipelines/ob-release.yml
index e016270e87f..ca168e6d337 100644
--- a/build/pipelines/release.yml
+++ b/build/pipelines/ob-release.yml
@@ -44,14 +44,6 @@ parameters:
- x64
- x86
- arm64
- - name: codeSign
- displayName: "Sign all build outputs"
- type: boolean
- default: true
- - name: generateSbom
- displayName: "Generate a Bill of Materials"
- type: boolean
- default: true
- name: terminalInternalPackageVersion
displayName: "Terminal Internal Package Version"
type: string
@@ -68,9 +60,16 @@ parameters:
name: $(BuildDefinitionName)_$(date:yyMM).$(date:dd)$(rev:rrr)
+variables:
+ - template: templates-v2/variables-nuget-package-version.yml
+ parameters:
+ branding: ${{ parameters.branding }}
+ - template: templates-v2/variables-onebranch-config.yml
+
extends:
- template: templates-v2/pipeline-full-release-build.yml
+ template: templates-v2/pipeline-onebranch-full-release-build.yml
parameters:
+ official: true
branding: ${{ parameters.branding }}
buildTerminal: ${{ parameters.buildTerminal }}
buildConPTY: ${{ parameters.buildConPTY }}
@@ -78,8 +77,7 @@ extends:
pgoBuildMode: ${{ parameters.pgoBuildMode }}
buildConfigurations: ${{ parameters.buildConfigurations }}
buildPlatforms: ${{ parameters.buildPlatforms }}
- codeSign: ${{ parameters.codeSign }}
- generateSbom: ${{ parameters.generateSbom }}
+ codeSign: true
terminalInternalPackageVersion: ${{ parameters.terminalInternalPackageVersion }}
publishSymbolsToPublic: ${{ parameters.publishSymbolsToPublic }}
publishVpackToWindows: ${{ parameters.publishVpackToWindows }}
diff --git a/build/pipelines/templates-v2/job-build-package-wpf.yml b/build/pipelines/templates-v2/job-build-package-wpf.yml
index c9329eab519..9d64e1c7cff 100644
--- a/build/pipelines/templates-v2/job-build-package-wpf.yml
+++ b/build/pipelines/templates-v2/job-build-package-wpf.yml
@@ -97,7 +97,7 @@ jobs:
flattenFolders: true
- ${{ if eq(parameters.codeSign, true) }}:
- - task: EsrpCodeSigning@1
+ - task: EsrpCodeSigning@3
displayName: Submit *.nupkg to ESRP for code signing
inputs:
ConnectedServiceName: 9d6d2960-0793-4d59-943e-78dcb434840a
diff --git a/build/pipelines/templates-v2/job-build-project.yml b/build/pipelines/templates-v2/job-build-project.yml
index eda45842bbe..35d342236f9 100644
--- a/build/pipelines/templates-v2/job-build-project.yml
+++ b/build/pipelines/templates-v2/job-build-project.yml
@@ -62,6 +62,9 @@ parameters:
- name: publishArtifacts
type: boolean
default: true
+ - name: removeAllNonSignedFiles
+ type: boolean
+ default: false
jobs:
- job: ${{ parameters.jobName }}
@@ -89,6 +92,11 @@ jobs:
# Yup.
BuildTargetParameter: ' '
SelectedSigningFragments: ' '
+ # When building the unpackaged distribution, build it in portable mode if it's Canary-branded
+ ${{ if eq(parameters.branding, 'Canary') }}:
+ UnpackagedBuildArguments: -PortableMode
+ ${{ else }}:
+ UnpackagedBuildArguments: ' '
JobOutputDirectory: $(Terminal.BinDir)
JobOutputArtifactName: build-$(BuildPlatform)-$(BuildConfiguration)${{ parameters.artifactStem }}
${{ insert }}: ${{ parameters.variables }}
@@ -114,7 +122,7 @@ jobs:
$SignFragments += "wpfdotnet"
}
If ([bool]::Parse("${{ parameters.buildWPF }}")) {
- $BuildTargets += "Terminal\wpf\PublicTerminalCore"
+ $BuildTargets += "Terminal\Control\Microsoft_Terminal_Control"
$SignFragments += "wpf"
}
If ([bool]::Parse("${{ parameters.buildConPTY }}")) {
@@ -168,6 +176,7 @@ jobs:
# - Directories ending in Lib (static lib projects that we fully linked into DLLs which may also contain unnecessary resources)
# - All LocalTests_ project outputs, as they were subsumed into TestHostApp
# - All PDB files inside the WindowsTerminal/ output, which do not belong there.
+ # - console.dll, which apparently breaks XFGCheck? lol.
- pwsh: |-
$binDir = '$(Terminal.BinDir)'
$ImportLibs = Get-ChildItem $binDir -Recurse -File -Filter '*.exp' | ForEach-Object { $_.FullName -Replace "exp$","lib" }
@@ -184,6 +193,8 @@ jobs:
$Items += Get-ChildItem '$(Terminal.BinDir)' -Filter '*.pdb' -Recurse
}
+ $Items += Get-ChildItem $binDir -Filter 'console.dll'
+
$Items | Remove-Item -Recurse -Force -Verbose -ErrorAction:Ignore
displayName: Clean up static libs and extra symbols
errorActionPreference: silentlyContinue # It's OK if this silently fails
@@ -224,7 +235,7 @@ jobs:
# Code-sign everything we just put together.
# We run the signing in Terminal.BinDir, because all of the signing batches are relative to the final architecture/configuration output folder.
- - task: EsrpCodeSigning@1
+ - task: EsrpCodeSigning@3
displayName: Submit Signing Request
inputs:
ConnectedServiceName: 9d6d2960-0793-4d59-943e-78dcb434840a
@@ -241,6 +252,14 @@ jobs:
Write-Host "##vso[task.setvariable variable=WindowsTerminalPackagePath]${PackageFilename}"
displayName: Re-pack the new Terminal package after signing
+ # Some of our governed pipelines explicitly fail builds that have *any* non-codesigned filed (!)
+ - ${{ if eq(parameters.removeAllNonSignedFiles, true) }}:
+ - pwsh: |-
+ Get-ChildItem "$(Terminal.BinDir)" -Recurse -Include "*.dll","*.exe" |
+ Where-Object { (Get-AuthenticodeSignature $_).Status -Ne "Valid" } |
+ Remove-Item -Verbose -Force
+ displayName: Remove all non-signed output files
+
- ${{ else }}: # No Signing
- ${{ if or(parameters.buildTerminal, parameters.buildEverything) }}:
- pwsh: |-
@@ -255,7 +274,7 @@ jobs:
- pwsh: |-
$XamlAppxPath = (Get-Item "src\cascadia\CascadiaPackage\AppPackages\*\Dependencies\$(BuildPlatform)\Microsoft.UI.Xaml*.appx").FullName
$outDir = New-Item -Type Directory "$(Terminal.BinDir)/_unpackaged" -ErrorAction:Ignore
- & .\build\scripts\New-UnpackagedTerminalDistribution.ps1 -TerminalAppX $(WindowsTerminalPackagePath) -XamlAppX $XamlAppxPath -Destination $outDir.FullName
+ & .\build\scripts\New-UnpackagedTerminalDistribution.ps1 $(UnpackagedBuildArguments) -TerminalAppX $(WindowsTerminalPackagePath) -XamlAppX $XamlAppxPath -Destination $outDir.FullName
displayName: Build Unpackaged Distribution (from MSIX)
condition: and(succeeded(), ne(variables.WindowsTerminalPackagePath, ''))
diff --git a/build/pipelines/templates-v2/job-deploy-to-azure-storage.yml b/build/pipelines/templates-v2/job-deploy-to-azure-storage.yml
new file mode 100644
index 00000000000..69b82e57bb3
--- /dev/null
+++ b/build/pipelines/templates-v2/job-deploy-to-azure-storage.yml
@@ -0,0 +1,92 @@
+parameters:
+ - name: buildConfiguration
+ type: string
+ - name: buildPlatforms
+ type: object
+ - name: pool
+ type: object
+ default: []
+ - name: dependsOn
+ type: object
+ default: null
+ - name: artifactStem
+ type: string
+ default: ''
+ - name: variables
+ type: object
+ default: {}
+ - name: environment
+ type: string
+ - name: storagePublicRootURL
+ type: string
+ - name: subscription
+ type: string
+ - name: storageAccount
+ type: string
+ - name: storageContainer
+ type: string
+
+jobs:
+- job: DeployAzure
+ ${{ if ne(length(parameters.pool), 0) }}:
+ pool: ${{ parameters.pool }}
+ displayName: Publish to Azure Storage (Prod)
+ dependsOn: ${{ parameters.dependsOn }}
+ variables:
+ ${{ insert }}: ${{ parameters.variables }}
+ steps:
+ - download: none
+
+ - checkout: self
+ clean: true
+ fetchDepth: 1
+ fetchTags: false # Tags still result in depth > 1 fetch; we don't need them here
+ submodules: true
+ persistCredentials: True
+
+ - task: DownloadPipelineArtifact@2
+ displayName: Download MSIX Bundle Artifact
+ inputs:
+ artifactName: appxbundle-${{ parameters.buildConfiguration }}${{ parameters.artifactStem }}
+ downloadPath: '$(Build.SourcesDirectory)/_out'
+ itemPattern: '**/*.msixbundle'
+
+ - ${{ each platform in parameters.buildPlatforms }}:
+ - task: DownloadPipelineArtifact@2
+ displayName: Download unpackaged build for ${{ platform }} ${{ parameters.buildConfiguration }}
+ inputs:
+ artifactName: build-${{ platform }}-${{ parameters.buildConfiguration }}${{ parameters.artifactStem }}
+ downloadPath: '$(Build.SourcesDirectory)/_unpackaged'
+ itemPattern: '**/_unpackaged/*.zip'
+
+ - pwsh: |-
+ $b = Get-Item _out/*.msixbundle
+ ./build/scripts/New-AppInstallerFromTemplateAndBundle.ps1 -BundlePath $b.FullName -AppInstallerTemplatePath ./build/config/template.appinstaller -AppInstallerRoot "${{ parameters.storagePublicRootURL }}" -OutputPath _out/Microsoft.WindowsTerminalCanary.appinstaller
+ displayName: "Produce AppInstaller for MSIX bundle"
+
+ - pwsh: |-
+ $zips = Get-ChildItem -Recurse -Filter *.zip _unpackaged
+ $zips | ForEach-Object {
+ $name = $_.Name
+ $parts = $name.Split('_')
+ $parts[1] = "latest"
+ $name = [String]::Join('_', $parts)
+ $_ | Move-Item -Destination (Join-Path "_out" $name)
+ }
+ displayName: "Wrangle Unpackaged builds into place, rename"
+
+ - powershell: |-
+ Get-PackageProvider -Name NuGet -ForceBootstrap
+ Install-Module -Verbose -AllowClobber -Force Az.Accounts, Az.Storage, Az.Network, Az.Resources, Az.Compute
+ displayName: Install Azure Module Dependencies
+
+ - task: AzureFileCopy@5
+ displayName: Publish to Storage Account
+ inputs:
+ sourcePath: _out/*
+ Destination: AzureBlob
+ azureSubscription: ${{ parameters.subscription }}
+ storage: ${{ parameters.storageAccount }}
+ ContainerName: ${{ parameters.storageContainer }}
+ AdditionalArgumentsForBlobCopy: "--content-type application/octet-stream"
+
diff --git a/build/pipelines/templates-v2/job-merge-msix-into-bundle.yml b/build/pipelines/templates-v2/job-merge-msix-into-bundle.yml
index 121e07b4417..6d6ad09cdad 100644
--- a/build/pipelines/templates-v2/job-merge-msix-into-bundle.yml
+++ b/build/pipelines/templates-v2/job-merge-msix-into-bundle.yml
@@ -29,6 +29,9 @@ parameters:
- name: publishArtifacts
type: boolean
default: true
+ - name: afterBuildSteps
+ type: stepList
+ default: []
jobs:
- job: ${{ parameters.jobName }}
@@ -48,6 +51,8 @@ jobs:
BundleStemName: Microsoft.WindowsTerminal
${{ elseif eq(parameters.branding, 'Preview') }}:
BundleStemName: Microsoft.WindowsTerminalPreview
+ ${{ elseif eq(parameters.branding, 'Canary') }}:
+ BundleStemName: Microsoft.WindowsTerminalCanary
${{ else }}:
BundleStemName: WindowsTerminalDev
JobOutputDirectory: '$(System.ArtifactsDirectory)/bundle'
@@ -83,11 +88,13 @@ jobs:
$Components[0] = ([int]$Components[0] + $VersionEpoch)
$BundleVersion = $Components -Join "."
New-Item -Type Directory "$(System.ArtifactsDirectory)/bundle"
- .\build\scripts\Create-AppxBundle.ps1 -InputPath 'bin/' -ProjectName CascadiaPackage -BundleVersion $BundleVersion -OutputPath "$(System.ArtifactsDirectory)\bundle\$(BundleStemName)_$(XES_APPXMANIFESTVERSION)_8wekyb3d8bbwe.msixbundle"
+ $BundlePath = "$(System.ArtifactsDirectory)\bundle\$(BundleStemName)_$(XES_APPXMANIFESTVERSION)_8wekyb3d8bbwe.msixbundle"
+ .\build\scripts\Create-AppxBundle.ps1 -InputPath 'bin/' -ProjectName CascadiaPackage -BundleVersion $BundleVersion -OutputPath $BundlePath
+ Write-Host "##vso[task.setvariable variable=MsixBundlePath]${BundlePath}"
displayName: Create msixbundle
- ${{ if eq(parameters.codeSign, true) }}:
- - task: EsrpCodeSigning@1
+ - task: EsrpCodeSigning@3
displayName: Submit *.msixbundle to ESRP for code signing
inputs:
ConnectedServiceName: 9d6d2960-0793-4d59-943e-78dcb434840a
@@ -137,6 +144,8 @@ jobs:
ValidateSignature: true
Verbosity: 'Verbose'
+ - ${{ parameters.afterBuildSteps }}
+
- ${{ if eq(parameters.publishArtifacts, true) }}:
- publish: $(JobOutputDirectory)
artifact: $(JobOutputArtifactName)
diff --git a/build/pipelines/templates-v2/job-package-conpty.yml b/build/pipelines/templates-v2/job-package-conpty.yml
index 52f3a5c15d9..2f777cdf4f5 100644
--- a/build/pipelines/templates-v2/job-package-conpty.yml
+++ b/build/pipelines/templates-v2/job-package-conpty.yml
@@ -82,7 +82,7 @@ jobs:
versionEnvVar: XES_PACKAGEVERSIONNUMBER
- ${{ if eq(parameters.codeSign, true) }}:
- - task: EsrpCodeSigning@1
+ - task: EsrpCodeSigning@3
displayName: Submit *.nupkg to ESRP for code signing
inputs:
ConnectedServiceName: 9d6d2960-0793-4d59-943e-78dcb434840a
diff --git a/build/pipelines/templates-v2/job-publish-symbols.yml b/build/pipelines/templates-v2/job-publish-symbols.yml
index 65663885602..83c472872b8 100644
--- a/build/pipelines/templates-v2/job-publish-symbols.yml
+++ b/build/pipelines/templates-v2/job-publish-symbols.yml
@@ -17,6 +17,12 @@ parameters:
- name: symbolExpiryTime
type: string
default: 36530 # This is the default from PublishSymbols@2
+ - name: variables
+ type: object
+ default: {}
+ - name: symbolPatGoesInTaskInputs
+ type: boolean
+ default: false
jobs:
- job: ${{ parameters.jobName }}
@@ -27,6 +33,8 @@ jobs:
${{ else }}:
displayName: Publish Symbols Internally
dependsOn: ${{ parameters.dependsOn }}
+ variables:
+ ${{ insert }}: ${{ parameters.variables }}
steps:
- checkout: self
clean: true
@@ -76,6 +84,8 @@ jobs:
SymbolsProduct: 'Windows Terminal Converged Symbols'
SymbolsVersion: '$(XES_APPXMANIFESTVERSION)'
SymbolExpirationInDays: ${{ parameters.symbolExpiryTime }}
+ ${{ if eq(parameters.symbolPatGoesInTaskInputs, true) }}:
+ Pat: $(ADO_microsoftpublicsymbols_PAT)
# The ADO task does not support indexing of GitHub sources.
# There is a bug which causes this task to fail if LIB includes an inaccessible path (even though it does not depend on it).
# To work around this issue, we just force LIB to be any dir that we know exists.
@@ -83,4 +93,5 @@ jobs:
env:
LIB: $(Build.SourcesDirectory)
ArtifactServices_Symbol_AccountName: microsoftpublicsymbols
- ArtifactServices_Symbol_PAT: $(ADO_microsoftpublicsymbols_PAT)
+ ${{ if ne(parameters.symbolPatGoesInTaskInputs, true) }}:
+ ArtifactServices_Symbol_PAT: $(ADO_microsoftpublicsymbols_PAT)
diff --git a/build/pipelines/templates-v2/pipeline-full-release-build.yml b/build/pipelines/templates-v2/pipeline-full-release-build.yml
index 42c5c6250d8..06358de5c5b 100644
--- a/build/pipelines/templates-v2/pipeline-full-release-build.yml
+++ b/build/pipelines/templates-v2/pipeline-full-release-build.yml
@@ -51,6 +51,9 @@ parameters:
type: boolean
default: false
+ - name: extraPublishJobs
+ type: object
+ default: []
- name: pool
type: object
default:
@@ -58,28 +61,9 @@ parameters:
demands: ImageOverride -equals SHINE-VS17-Latest
variables:
- # If we are building a branch called "release-*", change the NuGet suffix
- # to "preview". If we don't do that, XES will set the suffix to "release1"
- # because it truncates the value after the first period.
- # We also want to disable the suffix entirely if we're Release branded while
- # on a release branch.
- # main is special, however. XES ignores main. Since we never produce actual
- # shipping builds from main, we want to force it to have a beta label as
- # well.
- #
- # In effect:
- # BRANCH / BRANDING | Release | Preview
- # ------------------|----------------------------|-----------------------------
- # release-* | 1.12.20220427 | 1.13.20220427-preview
- # main | 1.14.20220427-experimental | 1.14.20220427-experimental
- # all others | 1.14.20220427-mybranch | 1.14.20220427-mybranch
- ${{ if startsWith(variables['Build.SourceBranchName'], 'release-') }}:
- ${{ if eq(parameters.branding, 'Release') }}:
- NoNuGetPackBetaVersion: true
- ${{ else }}:
- NuGetPackBetaVersion: preview
- ${{ elseif eq(variables['Build.SourceBranchName'], 'main') }}:
- NuGetPackBetaVersion: experimental
+ - template: variables-nuget-package-version.yml
+ parameters:
+ branding: ${{ parameters.branding }}
resources:
repositories:
@@ -193,4 +177,5 @@ stages:
includePublicSymbolServer: ${{ parameters.publishSymbolsToPublic }}
symbolExpiryTime: ${{ parameters.symbolExpiryTime }}
+ - ${{ parameters.extraPublishJobs }}
...
diff --git a/build/pipelines/templates-v2/pipeline-onebranch-full-release-build.yml b/build/pipelines/templates-v2/pipeline-onebranch-full-release-build.yml
new file mode 100644
index 00000000000..271e7d3e121
--- /dev/null
+++ b/build/pipelines/templates-v2/pipeline-onebranch-full-release-build.yml
@@ -0,0 +1,265 @@
+parameters:
+ - name: official
+ type: boolean
+ default: false
+ - name: branding
+ type: string
+ default: Release
+ values:
+ - Release
+ - Preview
+ - Canary
+ - Dev
+ - name: buildTerminal
+ type: boolean
+ default: true
+ - name: buildConPTY
+ type: boolean
+ default: false
+ - name: buildWPF
+ type: boolean
+ default: false
+ - name: pgoBuildMode
+ type: string
+ default: Optimize
+ values:
+ - Optimize
+ - Instrument
+ - None
+ - name: buildConfigurations
+ type: object
+ default:
+ - Release
+ - name: buildPlatforms
+ type: object
+ default:
+ - x64
+ - x86
+ - arm64
+ - name: codeSign
+ type: boolean
+ default: true
+ - name: terminalInternalPackageVersion
+ type: string
+ default: '0.0.8'
+
+ - name: publishSymbolsToPublic
+ type: boolean
+ default: true
+ - name: symbolExpiryTime
+ type: string
+ default: 36530 # This is the default from PublishSymbols@2
+ - name: publishVpackToWindows
+ type: boolean
+ default: false
+
+ - name: extraPublishJobs
+ type: object
+ default: []
+
+resources:
+ repositories:
+ - repository: templates
+ type: git
+ name: OneBranch.Pipelines/GovernedTemplates
+ ref: refs/heads/main
+
+extends:
+ ${{ if eq(parameters.official, true) }}:
+ template: v2/Microsoft.Official.yml@templates # https://aka.ms/obpipelines/templates
+ ${{ else }}:
+ template: v2/Microsoft.NonOfficial.yml@templates
+ parameters:
+ featureFlags:
+ WindowsHostVersion: 1ESWindows2022
+ platform:
+ name: 'windows_undocked'
+ product: 'Windows Terminal'
+ cloudvault: # https://aka.ms/obpipelines/cloudvault
+ enabled: false
+ globalSdl: # https://aka.ms/obpipelines/sdl
+ tsa:
+ enabled: true
+ configFile: '$(Build.SourcesDirectory)\build\config\tsa.json'
+ binskim:
+ break: false
+ scanOutputDirectoryOnly: true
+ policheck:
+ break: false
+ severity: Note
+ baseline:
+ baselineFile: '$(Build.SourcesDirectory)\build\config\release.gdnbaselines'
+ suppressionSet: default
+
+ stages:
+ - stage: Build
+ displayName: Build
+ dependsOn: []
+ jobs:
+ - template: ./build/pipelines/templates-v2/job-build-project.yml@self
+ parameters:
+ pool: { type: windows }
+ variables:
+ ob_git_checkout: false # This job checks itself out
+ ob_git_skip_checkout_none: true
+ ob_outputDirectory: $(JobOutputDirectory)
+ ob_artifactBaseName: $(JobOutputArtifactName)
+ publishArtifacts: false # Handled by OneBranch
+ branding: ${{ parameters.branding }}
+ buildTerminal: ${{ parameters.buildTerminal }}
+ buildConPTY: ${{ parameters.buildConPTY }}
+ buildWPF: ${{ parameters.buildWPF }}
+ pgoBuildMode: ${{ parameters.pgoBuildMode }}
+ buildConfigurations: ${{ parameters.buildConfigurations }}
+ buildPlatforms: ${{ parameters.buildPlatforms }}
+ generateSbom: false # this is handled by onebranch
+ removeAllNonSignedFiles: true # appease the overlords
+ codeSign: ${{ parameters.codeSign }}
+ beforeBuildSteps: # Right before we build, lay down the universal package and localizations
+ - task: PkgESSetupBuild@12
+ displayName: Package ES - Setup Build
+ inputs:
+ disableOutputRedirect: true
+
+ - task: UniversalPackages@0
+ displayName: Download terminal-internal Universal Package
+ inputs:
+ feedListDownload: 2b3f8893-a6e8-411f-b197-a9e05576da48
+ packageListDownload: e82d490c-af86-4733-9dc4-07b772033204
+ versionListDownload: ${{ parameters.terminalInternalPackageVersion }}
+
+ - template: ./build/pipelines/templates-v2/steps-fetch-and-prepare-localizations.yml@self
+ parameters:
+ includePseudoLoc: true
+
+ - ${{ if eq(parameters.buildWPF, true) }}:
+ # Add an Any CPU build flavor for the WPF control bits
+ - template: ./build/pipelines/templates-v2/job-build-project.yml@self
+ parameters:
+ pool: { type: windows }
+ variables:
+ ob_git_checkout: false # This job checks itself out
+ ob_git_skip_checkout_none: true
+ ob_outputDirectory: $(JobOutputDirectory)
+ ob_artifactBaseName: $(JobOutputArtifactName)
+ publishArtifacts: false # Handled by OneBranch
+ jobName: BuildWPF
+ branding: ${{ parameters.branding }}
+ buildTerminal: false
+ buildWPFDotNetComponents: true
+ buildConfigurations: ${{ parameters.buildConfigurations }}
+ buildPlatforms:
+ - Any CPU
+ generateSbom: false # this is handled by onebranch
+ removeAllNonSignedFiles: true # appease the overlords
+ codeSign: ${{ parameters.codeSign }}
+ beforeBuildSteps:
+ - task: PkgESSetupBuild@12
+ displayName: Package ES - Setup Build
+ inputs:
+ disableOutputRedirect: true
+ # WPF doesn't need the localizations or the universal package, but if it does... put them here.
+
+ - stage: Package
+ displayName: Package
+ dependsOn: [Build]
+ jobs:
+ - ${{ if eq(parameters.buildTerminal, true) }}:
+ - template: ./build/pipelines/templates-v2/job-merge-msix-into-bundle.yml@self
+ parameters:
+ pool: { type: windows }
+ variables:
+ ob_git_checkout: false # This job checks itself out
+ ob_git_skip_checkout_none: true
+ ob_outputDirectory: $(JobOutputDirectory)
+ ob_artifactBaseName: $(JobOutputArtifactName)
+ ### This job is also in charge of submitting the vpack to Windows if it's enabled
+ ob_createvpack_enabled: ${{ and(parameters.buildTerminal, parameters.publishVpackToWindows) }}
+ ob_updateOSManifest_enabled: ${{ and(parameters.buildTerminal, parameters.publishVpackToWindows) }}
+ ### If enabled above, these options are in play.
+ ob_createvpack_packagename: 'WindowsTerminal.app'
+ ob_createvpack_owneralias: 'conhost@microsoft.com'
+ ob_createvpack_description: 'VPack for the Windows Terminal Application'
+ ob_createvpack_targetDestinationDirectory: '$(Destination)'
+ ob_createvpack_propsFile: false
+ ob_createvpack_provData: true
+ ob_createvpack_metadata: '$(Build.SourceVersion)'
+ ob_createvpack_topLevelRetries: 0
+ ob_createvpack_failOnStdErr: true
+ ob_createvpack_taskLogVerbosity: Detailed
+ ob_createvpack_verbose: true
+ ob_createvpack_vpackdirectory: '$(JobOutputDirectory)\vpack'
+ ob_updateOSManifest_gitcheckinConfigPath: '$(Build.SourcesDirectory)\build\config\GitCheckin.json'
+ # We're skipping the 'fetch' part of the OneBranch rules, but that doesn't mean
+ # that it doesn't expect to have downloaded a manifest directly to some 'destination'
+ # folder that it can then update and upload.
+ # Effectively: it says "destination" but it means "source"
+ # DH: Don't ask why.
+ ob_updateOSManifest_destination: $(XES_VPACKMANIFESTDIRECTORY)
+ ob_updateOSManifest_skipFetch: true
+ publishArtifacts: false # Handled by OneBranch
+ jobName: Bundle
+ branding: ${{ parameters.branding }}
+ buildConfigurations: ${{ parameters.buildConfigurations }}
+ buildPlatforms: ${{ parameters.buildPlatforms }}
+ generateSbom: false # Handled by onebranch
+ codeSign: ${{ parameters.codeSign }}
+ afterBuildSteps:
+ # This directory has to exist, even if we aren't using createvpack, because the Guardian rules demand it.
+ - pwsh: |-
+ New-Item "$(JobOutputDirectory)/vpack" -Type Directory
+ displayName: Make sure the vpack directory exists
+
+ - ${{ if parameters.publishVpackToWindows }}:
+ - pwsh: |-
+ Copy-Item -Verbose -Path "$(MsixBundlePath)" -Destination (Join-Path "$(JobOutputDirectory)/vpack" 'Microsoft.WindowsTerminal_8wekyb3d8bbwe.msixbundle')
+ displayName: Stage msixbundle for vpack
+
+ - ${{ if eq(parameters.buildConPTY, true) }}:
+ - template: ./build/pipelines/templates-v2/job-package-conpty.yml@self
+ parameters:
+ pool: { type: windows }
+ variables:
+ ob_git_checkout: false # This job checks itself out
+ ob_git_skip_checkout_none: true
+ ob_outputDirectory: $(JobOutputDirectory)
+ ob_artifactBaseName: $(JobOutputArtifactName)
+ publishArtifacts: false # Handled by OneBranch
+ buildConfigurations: ${{ parameters.buildConfigurations }}
+ buildPlatforms: ${{ parameters.buildPlatforms }}
+ generateSbom: false # this is handled by onebranch
+ codeSign: ${{ parameters.codeSign }}
+
+ - ${{ if eq(parameters.buildWPF, true) }}:
+ - template: ./build/pipelines/templates-v2/job-build-package-wpf.yml@self
+ parameters:
+ pool: { type: windows }
+ variables:
+ ob_git_checkout: false # This job checks itself out
+ ob_git_skip_checkout_none: true
+ ob_outputDirectory: $(JobOutputDirectory)
+ ob_artifactBaseName: $(JobOutputArtifactName)
+ publishArtifacts: false # Handled by OneBranch
+ buildConfigurations: ${{ parameters.buildConfigurations }}
+ buildPlatforms: ${{ parameters.buildPlatforms }}
+ generateSbom: false # this is handled by onebranch
+ codeSign: ${{ parameters.codeSign }}
+
+ - stage: Publish
+ displayName: Publish
+ dependsOn: [Build, Package]
+ jobs:
+ - template: ./build/pipelines/templates-v2/job-publish-symbols.yml@self
+ parameters:
+ pool: { type: windows }
+ includePublicSymbolServer: ${{ parameters.publishSymbolsToPublic }}
+ symbolPatGoesInTaskInputs: true # onebranch tries to muck with the PAT variable, so we need to change how it get the PAT
+ symbolExpiryTime: ${{ parameters.symbolExpiryTime }}
+ variables:
+ ob_git_checkout: false # This job checks itself out
+ ob_git_skip_checkout_none: true
+ ob_outputDirectory: $(Build.ArtifactStagingDirectory)
+ # Without this, OneBranch will nerf our symbol tasks
+ ob_symbolsPublishing_enabled: true
+
+ - ${{ parameters.extraPublishJobs }}
diff --git a/build/pipelines/templates-v2/variables-nuget-package-version.yml b/build/pipelines/templates-v2/variables-nuget-package-version.yml
new file mode 100644
index 00000000000..d3a137ba0e0
--- /dev/null
+++ b/build/pipelines/templates-v2/variables-nuget-package-version.yml
@@ -0,0 +1,27 @@
+parameters:
+ - name: branding
+ type: string
+
+variables:
+ # If we are building a branch called "release-*", change the NuGet suffix
+ # to "preview". If we don't do that, XES will set the suffix to "release1"
+ # because it truncates the value after the first period.
+ # We also want to disable the suffix entirely if we're Release branded while
+ # on a release branch.
+ # main is special, however. XES ignores main. Since we never produce actual
+ # shipping builds from main, we want to force it to have a beta label as
+ # well.
+ #
+ # In effect:
+ # BRANCH / BRANDING | Release | Preview
+ # ------------------|----------------------------|-----------------------------
+ # release-* | 1.12.20220427 | 1.13.20220427-preview
+ # main | 1.14.20220427-experimental | 1.14.20220427-experimental
+ # all others | 1.14.20220427-mybranch | 1.14.20220427-mybranch
+ ${{ if startsWith(variables['Build.SourceBranchName'], 'release-') }}:
+ ${{ if eq(parameters.branding, 'Release') }}:
+ NoNuGetPackBetaVersion: true
+ ${{ else }}:
+ NuGetPackBetaVersion: preview
+ ${{ elseif eq(variables['Build.SourceBranchName'], 'main') }}:
+ NuGetPackBetaVersion: experimental
diff --git a/build/pipelines/templates-v2/variables-onebranch-config.yml b/build/pipelines/templates-v2/variables-onebranch-config.yml
new file mode 100644
index 00000000000..d7180e3e090
--- /dev/null
+++ b/build/pipelines/templates-v2/variables-onebranch-config.yml
@@ -0,0 +1,2 @@
+variables:
+ WindowsContainerImage: 'onebranch.azurecr.io/windows/ltsc2022/vse2022:latest'
diff --git a/build/scripts/New-AppInstallerFromTemplateAndBundle.ps1 b/build/scripts/New-AppInstallerFromTemplateAndBundle.ps1
new file mode 100644
index 00000000000..b49ad244ffb
--- /dev/null
+++ b/build/scripts/New-AppInstallerFromTemplateAndBundle.ps1
@@ -0,0 +1,42 @@
+[CmdletBinding()]
+Param(
+ [Parameter(Mandatory,
+ HelpMessage="Path to the .msixbundle")]
+ [string]
+ $BundlePath,
+
+ [Parameter(Mandatory,
+ HelpMessage="Path to the .appinstaller template")]
+ [string]
+ $AppInstallerTemplatePath,
+
+ [string]
+ $AppInstallerRoot,
+
+ [Parameter(Mandatory,
+ HelpMessage="Output Path")]
+ [string]
+ $OutputPath
+)
+
+$ErrorActionPreference = "Stop"
+
+$sentinelFile = New-TemporaryFile
+$directory = New-Item -Type Directory "$($sentinelFile.FullName)_Package"
+Remove-Item $sentinelFile -Force -EA:Ignore
+
+$bundle = (Get-Item $BundlePath)
+& tar.exe -x -f $bundle.FullName -C $directory AppxMetadata/AppxBundleManifest.xml
+
+$xml = [xml](Get-Content (Join-Path $directory "AppxMetadata\AppxBundleManifest.xml"))
+$name = $xml.Bundle.Identity.Name
+$version = $xml.Bundle.Identity.Version
+
+$doc = (Get-Content -ReadCount 0 $AppInstallerTemplatePath)
+$doc = $doc -Replace '\$\$ROOT\$\$',$AppInstallerRoot
+$doc = $doc -Replace '\$\$NAME\$\$',$name
+$doc = $doc -Replace '\$\$VERSION\$\$',$version
+$doc = $doc -Replace '\$\$PACKAGE\$\$',$bundle.Name
+$doc | Out-File -Encoding utf8NoBOM $OutputPath
+
+Get-Item $OutputPath
diff --git a/build/scripts/New-UnpackagedTerminalDistribution.ps1 b/build/scripts/New-UnpackagedTerminalDistribution.ps1
index b9ae23a2954..9605f132562 100644
--- a/build/scripts/New-UnpackagedTerminalDistribution.ps1
+++ b/build/scripts/New-UnpackagedTerminalDistribution.ps1
@@ -25,7 +25,12 @@ Param(
[Parameter(HelpMessage="Path to makeappx.exe", ParameterSetName='Layout')]
[ValidateScript({Test-Path $_ -Type Leaf})]
[string]
- $MakeAppxPath = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\MakeAppx.exe"
+ $MakeAppxPath = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\MakeAppx.exe",
+
+ [Parameter(HelpMessage="Include the portable mode marker file by default", ParameterSetName='AppX')]
+ [Parameter(HelpMessage="Include the portable mode marker file by default", ParameterSetName='Layout')]
+ [switch]
+ $PortableMode = $PSCmdlet.ParameterSetName -eq 'Layout'
)
$filesToRemove = @("*.xml", "*.winmd", "Appx*", "Images/*Tile*", "Images/*Logo*") # Remove from Terminal
@@ -128,6 +133,11 @@ $finalTerminalPriFile = Join-Path $terminalAppPath "resources.pri"
# Packaging
########
+$portableModeMarkerFile = Join-Path $terminalAppPath ".portable"
+If ($PortableMode) {
+ "" | Out-File $portableModeMarkerFile
+}
+
If ($PSCmdlet.ParameterSetName -Eq "AppX") {
# We only produce a ZIP when we're combining two AppX directories.
New-Item -ItemType Directory -Path $Destination -ErrorAction:SilentlyContinue | Out-Null
diff --git a/custom.props b/custom.props
index 6027b31193d..328d7042eb2 100644
--- a/custom.props
+++ b/custom.props
@@ -5,7 +5,7 @@
true20231
- 19
+ 20Windows Terminal
diff --git a/dep/nuget/packages.config b/dep/nuget/packages.config
index d0c670dcd57..e401b157d67 100644
--- a/dep/nuget/packages.config
+++ b/dep/nuget/packages.config
@@ -9,7 +9,7 @@
-
+
diff --git a/doc/ORGANIZATION.md b/doc/ORGANIZATION.md
index d220c9034e4..07a6e41ee7e 100644
--- a/doc/ORGANIZATION.md
+++ b/doc/ORGANIZATION.md
@@ -32,7 +32,6 @@
* `/src/cascadia/TerminalApp` - This DLL represents the implementation of the Windows Terminal application. This includes parsing settings, hosting tabs & panes with Terminals in them, and displaying other UI elements. This DLL is almost entirely UWP-like code, and shouldn't be doing any Win32-like UI work.
* `/src/cascadia/WindowsTerminal` - This EXE provides Win32 hosting for the TerminalApp. It will set up XAML islands, and is responsible for drawing the window, either as a standard window or with content in the titlebar (non-client area).
* `/src/cascadia/CascadiaPackage` - This is a project for packaging the Windows Terminal and its dependencies into an .appx/.msix for deploying to the machine.
- * `/src/cascadia/PublicTerminalCore` - This is a DLL wrapper for the TerminalCore and Renderer, similar to `TermControl`, which exposes some exported functions that so the Terminal can be used from C#.
* `/src/cascadia/WpfTerminalControl` - A DLL implementing a WPF version of the Terminal Control.
* `/src/host` – The meat of the windows console host. This includes buffer, input, output, windowing, server management, clipboard, and most interactions with the console host window that aren’t stated anywhere else. We’re trying to pull things out that are reusable into other libraries, but it’s a work in progress
* `/src/host/lib` – Builds the reusable LIB copy of the host
diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json
index d43a9e4e7d8..9dc3a8afd58 100644
--- a/doc/cascadia/profiles.schema.json
+++ b/doc/cascadia/profiles.schema.json
@@ -378,8 +378,12 @@
},
"ShortcutActionName": {
"enum": [
+ "addMark",
"adjustFontSize",
+ "adjustOpacity",
+ "clearAllMarks",
"clearBuffer",
+ "clearMark",
"closeOtherPanes",
"closeOtherTabs",
"closePane",
@@ -390,6 +394,7 @@
"copy",
"duplicateTab",
"expandSelectionToWord",
+ "experimental.colorSelection",
"exportBuffer",
"find",
"findMatch",
@@ -397,64 +402,60 @@
"globalSummon",
"identifyWindow",
"identifyWindows",
+ "markMode",
"moveFocus",
"movePane",
- "swapPane",
- "markMode",
"moveTab",
"multipleActions",
"newTab",
"newWindow",
"nextTab",
+ "openAbout",
"openNewTabDropdown",
"openSettings",
+ "openSystemMenu",
"openTabColorPicker",
+ "openTabRenamer",
"openWindowRenamer",
"paste",
"prevTab",
- "renameTab",
- "openSystemMenu",
- "openTabRenamer",
"quakeMode",
+ "quit",
+ "renameTab",
+ "renameWindow",
"resetFontSize",
"resizePane",
- "renameWindow",
+ "restoreLastClosed",
"scrollDown",
"scrollDownPage",
- "scrollUp",
- "scrollUpPage",
"scrollToBottom",
+ "scrollToMark",
"scrollToTop",
+ "scrollUp",
+ "scrollUpPage",
+ "searchWeb",
+ "selectAll",
"sendInput",
"setColorScheme",
+ "setFocusMode",
+ "setFullScreen",
+ "setMaximized",
"setTabColor",
"showSuggestions",
"splitPane",
+ "swapPane",
+ "switchSelectionEndpoint",
"switchToTab",
"tabSearch",
"toggleAlwaysOnTop",
"toggleBlockSelection",
"toggleFocusMode",
- "selectAll",
- "setFocusMode",
- "switchSelectionEndpoint",
"toggleFullscreen",
- "setFullScreen",
- "setMaximized",
"togglePaneZoom",
- "toggleSplitOrientation",
"toggleReadOnlyMode",
"toggleShaderEffects",
+ "toggleSplitOrientation",
"wt",
- "quit",
- "adjustOpacity",
- "restoreLastClosed",
- "addMark",
- "scrollToMark",
- "clearMark",
- "clearAllMarks",
- "searchWeb",
- "experimental.colorSelection",
"unbound"
],
"type": "string"
@@ -672,7 +673,7 @@
},
"allowEmpty": {
"description": "Whether to render a folder without entries, or to hide it",
- "default": "false",
+ "default": false,
"type": "boolean"
}
}
@@ -2279,11 +2280,6 @@
"description": "When set to true, the background image for the currently focused profile is expanded to encompass the entire window, beneath other panes.",
"type": "boolean"
},
- "compatibility.reloadEnvironmentVariables": {
- "default": true,
- "description": "When set to true, when opening a new tab or pane it will get reloaded environment variables.",
- "type": "boolean"
- },
"initialCols": {
"default": 120,
"description": "The number of columns displayed in the window upon first load. If \"launchMode\" is set to \"maximized\" (or \"maximizedFocus\"), this property is ignored.",
@@ -2532,6 +2528,11 @@
"null"
]
},
+ "compatibility.reloadEnvironmentVariables": {
+ "default": true,
+ "description": "When set to true, when opening a new tab or pane it will get reloaded environment variables.",
+ "type": "boolean"
+ },
"unfocusedAppearance": {
"$ref": "#/$defs/AppearanceConfig",
"description": "Sets the appearance of the terminal when it is unfocused.",
diff --git a/doc/specs/#1595 - Suggestions UI/3121-suggestion-menu-2023-000.gif b/doc/specs/#1595 - Suggestions UI/3121-suggestion-menu-2023-000.gif
new file mode 100644
index 00000000000..da5f0c4f663
Binary files /dev/null and b/doc/specs/#1595 - Suggestions UI/3121-suggestion-menu-2023-000.gif differ
diff --git a/doc/specs/#1595 - Suggestions UI/Suggestions-UI.md b/doc/specs/#1595 - Suggestions UI/Suggestions-UI.md
new file mode 100644
index 00000000000..84f307c0ce6
--- /dev/null
+++ b/doc/specs/#1595 - Suggestions UI/Suggestions-UI.md
@@ -0,0 +1,744 @@
+---
+author: Mike Griese
+created on: 2022-08-22
+last updated: 2023-08-03
+issue id: 1595
+---
+
+# Windows Terminal - Suggestions UI
+
+## Abstract
+
+Multiple related scenarios have come up where it would be beneficial to display
+actionable UI to the user within the context of the active terminal itself. This
+UI would be akin to the Intellisense UI in Visual Studio. It appears right where
+the user is typing, and can help provide immediate content for the user, based
+on some context. The "Suggestions UI" is this new ephemeral UI within the
+Windows Terminal that can display different types of actions, from different
+sources.
+
+## Background
+
+The Suggestions UI is the singular UI by which the Terminal can display a
+variety of suggestions to the user. These include:
+
+* Recent commands the user has executed in this terminal, powered by shell integration.
+* Recent directories, similarly powered by shell integration
+* Completions from the shell itself (like the shell completions in PowerShell)
+* Tasks, which are `sendInput` actions from the user's settings
+* Buffer Completions, which is a dumb type of autocomplete based on words in the buffer
+* and more (as provided via extensions)
+
+All of these scenarios are places where it makes sense to present the user a
+menu at the point of text insertion in the terminal control itself.
+
+### Inspiration
+
+Primarily, the inspiration is any Intellisense-like experience, in any app.
+Visual Studio, VsCode, PowerShell, vim, Sublime any JetBrains IDE - there's more
+than enough examples in the wild.
+
+Ultimately, the inspiration for the Suggestions UI came from a bunch of places
+all at once. In the course of a few months though, it became clear that we'd
+need a unified UI for displaying a variety of suggestion-like experiences in the
+Terminal. Our work with the PowerShell and VsCode teams helped refine these
+requests all into the unified design below.
+
+### User Stories
+
+ Size | Description
+-----------|--
+ 🐣 Crawl | The user can bring up the Suggestions UI with recent commands, powered by shell integration
+ 🐣 Crawl | [#12863] The user can bring up the Suggestions UI with recent directories, powered by shell integration
+ 🚶 Walk | The user can bring up the Suggestions UI with tasks from their settings
+ 🚶 Walk | CLI apps can invoke the Suggestions UI with a new VT sequence
+ 🚶 Walk | The Suggestions UI can be opened using the current typed commandline as a filter
+ 🚶 Walk | Recent commands and directories are stored in `state.json`, across sessions
+ 🏃♂️ Run | Suggestions can have descriptions presented in / alongside the UI
+ 🏃♂️ Run | The Suggestions UI can be opened without any nesting
+ 🏃♂️ Run | The Suggestions UI can be opened, nested by `source` of the suggestion
+ 🚀 Sprint | Extensions can provide suggestion sources for the Suggestions UI
+ 🚀 Sprint | The Suggestions UI can be opened in "inline" mode, only showing the text of the first suggestion
+
+### Elevator Pitch
+
+The Suggestions UI is a UI element displayed in the Terminal for providing
+different types of text suggestions to the user - anything from recently run
+commands, to saved commands, to tab-completion suggestions from the shell
+itself.
+
+## Business Justification
+
+It will delight developers.
+
+Furthermore, our partners on the Visual Studio team have been requesting similar
+functionality for some time now. The way autocompletion menus in PowerShell
+currently interact with UIA clients leaves much to be desired. They'd like a way
+to provide richer context to screen readers. Something to enable the terminal to
+more specifically describe the context of what's being presented to the user.
+
+## Scenario Details
+
+### UI/UX Design
+
+#### Prototypes
+
+The following gif was a VsCode prototype of [shell-driven autocompletion]. This
+is the point of reference we're starting from when talking about what the
+suggestions UI might look like.
+
+![](vscode-shell-suggestions.gif)
+
+These suggestions are populated by logic within PowerShell itself, and
+communicated to the Terminal. The Terminal can then display them in the
+Suggestions UI.
+
+The following demonstrate a prototype of what that might look like for the
+Terminal. These are meant to be informative, not normative, representations of
+what the UI would look like.
+
+![](shell-autocomplete-july-2022-000.gif)
+
+A prototype of the recent commands UI, powered by shell integration:
+
+![](command-history-suggestions.gif)
+
+A prototype of the tasks UI, powered by the user's settings:
+
+![](tasks-suggestions.gif)
+
+(admittedly, the `TeachingTip` in that gif is a prototype and was later replaced
+with a better version.)
+
+In general, the Suggestions UI will present a list of elements to select from,
+near the text cursor. This control might be contain a text box for filtering
+these items (a "**palette**"), or it might not (a "**menu**").
+
+![An example of the menu mode](3121-suggestion-menu-2023-000.gif)
+
+#### Palette vs Menu
+
+Depending on how the suggestions UI is invoked, we may or may not want to
+display a text box for filtering these suggestions. Consider the Intellisense
+menu in Visual Studio. That's a UI that only allows for up/down for navigation
+(and enter/tab for selecting the suggestion).
+
+For suggestions driven by the Terminal, we'll display a filtering text box in
+the Suggestions UI. This is similar to the command palette's search - a fuzzy
+search to filter the contents. This is the "**palette**" style of the
+suggestions dialog.
+
+For completions driven by the shell, we should probably not display the
+filtering text box. This is the "**menu**" style of the suggestion dialog. The
+user is primarily interacting with the shell here, not the Terminal.
+
+> **Warning**
+> TODO! For discussion, possibly with a real UX designer.
+
+How should we handle completions here? Tab? Enter? Right-Arrow? Should we have
+an element selected when we open the menu, or should tab/enter only work once
+the user has used the arrows at least once? Sublime allows for tab to
+complete the suggestion immediately.
+
+Consider also that these suggestions might be provided by the shell, as the user
+is typing at a commandline shell. For something like PowerShell, the user might
+want to start typing a command and have it tab-complete based off the shell's
+tab expansion rules. PowerShell's inline suggestions use right-arrow to
+differentiate "use this suggestion" vs tab for "tab expand what I'm typing at
+the prompt". We should probably preserve this behavior.
+
+We probably don't want to provide different experiences for the **menu** version
+of the Suggestions UI vs. the **palette** version. In the palette version, the
+user won't be pressing tab to tab-complete at the shell - the focus is out of
+the of terminal and in the Suggestions UI. With the menu version, the focus is
+still "in the terminal", and users would expect tab to tab-complete.
+
+We will want to make sure that there's some semblance of consistency across our
+implementation for the Suggestions UI, our own Command Palette, VsCode's
+intellisense and their own implementation of shell-completions in the Terminal.
+
+> **Note**
+> In my prototype, for the "Menu" mode, I accepted ALL of right-arrow, tab, and
+> enter as "accept completion", and any other key dismissed the UI. This _felt_
+> right for that mode. I'm not sure we could make the same call for "palette"
+> mode, where we'd need tab for navigating focus.
+
+### Implementation Details
+
+#### Fork the Command Palette
+
+We're largely going to start with the Command Palette to build the Suggestions
+UI[[1](#footnote-1)]. The Command Palette is already a control we've built for displaying a
+transient list of commands and dispatching them to the rest of the app.
+
+Currently, the Command Palette is a single static control, at the top-center of
+the Terminal window, and occupying a decent portion of the screen. For the
+Suggestions UI, we'll instead want to make sure that the control appears
+relative to the current cursor position.
+
+We'll start by taking the command palette, and copying it over to a new control.
+This will allow us to remove large chunks of code dealing with different modes
+(i.e. the tab switcher), and code dealing with prefix characters to switch
+modes.
+
+We'll need to make some small modifications to enable the Suggestions UI to
+* work as a text cursor-relative control
+* exist as a Flyout outside the bounds of the Terminal window
+* If the Suggestions UI is too close to the bottom of the screen, we'll need it to open
+ "upwards", with the search box at the _bottom_ and the list extending above it
+* prevent it from switching to command-line mode
+* display tooltips / `TeachingTip`s / some secondary flyout with a description
+ of the suggestion (if provided)
+
+#### Completion sources
+
+The Suggestions UI will support suggestions from a variety of different
+"sources". As an example, consider the following actions:
+
+```json
+ { "command": { "action":"suggestions", "source": "commandHistory" } },
+ { "command": { "action":"suggestions", "source": "directoryHistory" } },
+
+ { "command": { "action":"suggestions", "source": "tasks" } },
+ { "command": { "action":"suggestions", "source": "local" } },
+
+ { "command": { "action":"suggestions", "source": ["local", "tasks", "commandHistory"] } },
+
+ { "command": { "action":"suggestions", "source": "Microsoft.Terminal.Extensions.BufferComplete" } },
+```
+
+Each of these `suggestions` actions would open the Suggestions UI with a
+different set of actions.
+
+* `commandHistory`: Use commands from this session, as identified via shell
+ integration. This won't be able to return any suggestions if the user has not
+ configured their shell to support shell integration sequences yet.
+* `directoryHistory`: Populate the list with a series of `cd {path}` commands,
+ where the paths are populated via shell integration. Paths are in MRU order.
+* `tasks`: Populate the list with all `sendInput` actions in the user's settings
+ file. The command structure should remain unchanged. For example, if they have
+ `sendInput` actions nested under a "git" command, then the "git" entry will
+ remain in this tasks view with their `sendInput` actions nested inside it. For
+ more details, see the [Tasks] spec.
+* `local`: Populate the list with tasks that are located in the CWD, in a file
+ named `.wt.json`. For more details, see the [Tasks] spec.
+* `Microsoft.Terminal.Extensions.BufferComplete`: As an example, this
+ demonstrates how an action might be authored to reference a suggestion source
+ from an extension[[2](#footnote-2)].
+
+Each of these different sources will build a different set of `Command`s,
+primarily populated with `sendInput` actions. We'll load those `Command`s into
+the Suggestions UI control, and open it at the text cursor.
+
+To drill in on a single example - the `commandHistory` source. In that
+particular case, the TerminalPage will query the active TermControl for a list
+of its recent commands. If it knows these (via shell integration), then the
+TerminalPage will use that list of commands to build a list of `sendInput`
+actions. Those will then get fed to the suggestions UI.
+
+Not listed above is [shell-driven autocompletion]. These aren't something that
+the Terminal can invoke all on its own - these are something the shell would
+need to invoke themselves.
+
+#### Pre-populate the current commandline context
+
+Consider the following scenario. A user has typed `git c` in their shell, and
+has [shell integration] enabled for their shell. They want to open the
+Suggestions UI filtered to their recent history, but starting with what they've
+already typed. To support this scenario, we'll add an additional property:
+
+* `"useCommandline"`: `bool` (**default**: `true`)
+ * `true`: the current commandline the user has typed will pre-populate the
+ filter of the Suggestions UI. This requires that the user has enabled shell
+ integration in their shell's config.
+ * `false`: the filter will start empty, regardless of what the user has typed.
+
+With that setting, the user can achieve their desired UX with the following action:
+
+```json
+{ "command": { "action":"suggestions", "source": "commandHistory", "useCommandline": true } },
+```
+
+Now, when they type `git c` and invoke the Suggestions UI, they can immediately
+start searching for recent commands that started with `git c`.
+
+The primary use case for `useCommandline: false` was for `"nesting": "source"`.
+When filtering a list of ["Tasks...", "Recent commands...", "Recent
+directories...", "Docker...", "Git..."], then there's minimal value to start by
+filtering to "git c".
+
+#### Default actions
+
+I propose adding the following actions to the Terminal by default:
+
+```json
+{ "command": { "action":"suggestions", "source": "commandHistory", "useCommandline": true } },
+{ "command": { "action":"suggestions", "source": "directoryHistory" } },
+{ "command": { "action":"suggestions", "source": ["local", "tasks", "commandHistory"], "useCommandline": true, "nesting": "disabled" } },
+{ "command": { "action":"suggestions", "source": ["all"], "useCommandline": false, "nesting": "source" } },
+```
+
+These actions are colloquially:
+* Give me suggestions from my recent commands, using what I've typed
+* Give me suggestions of directories I've recently been in
+* _(After [Tasks] are implemented)_ Give me suggestions from recent commands,
+ commands I've saved, and commands for this project. Don't nest any, so they're
+ all in the top-level menu. Use what I've typed already to start filtering.
+* Just open the Suggestions UI with all suggestions sources, and group them by
+ the source of the suggestions.
+
+This should cover most of the basic use cases for suggestions.
+
+#### Who owns this menu?
+
+There was some discussion of who should own the suggestions menu. The control
+itself? Or the app hosting the control?
+
+A main argument for hosting this UI in the control itself is that any consumer
+of the `TermControl` should be able to display the [shell-driven autocompletion]
+menu. And they should get the UI from us "for free". Consumers shouldn't need to
+reimplement it themselves. This probably could be done without many changes:
+* Instead of operating on `Command`s and actions from the terminal settings,
+ the control could just know that all the entries in the menu are "send
+ input" "actions".
+* The control could offer a method to manually invoke the Suggestions UI for a
+ list of {suggestion, name, description} objects.
+* The app layer could easily translate between sendInput actions and these
+ pseudo-actions.
+
+A big argument in favor of having the app layer host the control: Consider an
+app like Visual Studio. When they embed the control, they'll want to style the
+shell-completions UI in their own way. They already have their own intellisense
+menu, and their own UI paradigm.
+
+For now, we'll leave this as something that's owned by the app layer. When we
+get around to finalizing the [shell-driven autocompletion] design, we can
+iterate on ideas for supporting both consumers that want to use a pre-built
+suggestions control, or consumers who want to bring their own.
+
+## Tenets
+
+
+
+
Compatibility
+
+This shouldn't break any existing flows. This is a general purpose UI element,
+to be extended in a variety of ways. Those customizations will all be opt-in by
+the user, so I'm not expecting any breaking compatibility changes here.
+
+
+
+
Accessibility
+
+The Suggestions UI was designed with the goal of making commandline shell
+suggestions _more_ accessible. As Carlos previously wrote:
+
+> Screen readers struggle with this because the entire menu is redrawn every time, making it harder to understand what exactly is "selected" (as the concept of selection in this instance is a shell-side concept represented by visual manipulation).
+>
+> ...
+>
+> _\[Shell driven suggestions\]_ can then be leveraged by Windows Terminal to create UI elements. Doing so leverages WinUI's accessible design.
+
+This will allow the Terminal to provide more context-relevant information to
+screen readers.
+
+
+
+
Sustainability
+
+No sustainability changes expected.
+
+
+
+
Localization
+
+The localization needs of the Suggestions UI will be effectively the same as the
+needs of the Command Palette.
+
+The Terminal will have no way to localize suggestions that are provided via
+[shell-driven autocompletion]. These are just verbatim strings that the shell
+told us to use. We don't consider this to be something to worry about, however.
+This is no different than the fact that Terminal cannot localize the `Get-Help`
+(or any other) output of PowerShell.
+
+