From 43a02fef4179af9c7178d35d7da9ff332fde223e Mon Sep 17 00:00:00 2001 From: Ryan Trauntvein Date: Fri, 19 Jun 2026 01:50:29 -0700 Subject: [PATCH 01/10] Clarify that ghe-check-background-upgrade-jobs gates feature upgrades, not replica progression (#61825) Co-authored-by: Ryan Trauntvein Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: djdefi <3662109+djdefi@users.noreply.github.com> Co-authored-by: mc <42146119+mchammer01@users.noreply.github.com> --- .../command-line-utilities.md | 5 ++++- .../upgrading-with-an-upgrade-package.md | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/content/admin/administering-your-instance/administering-your-instance-from-the-command-line/command-line-utilities.md b/content/admin/administering-your-instance/administering-your-instance-from-the-command-line/command-line-utilities.md index bbb744db633e..fb7fe38911b5 100644 --- a/content/admin/administering-your-instance/administering-your-instance-from-the-command-line/command-line-utilities.md +++ b/content/admin/administering-your-instance/administering-your-instance-from-the-command-line/command-line-utilities.md @@ -1384,12 +1384,15 @@ In this example, `ghe-repl-status -vv` sends verbose status information from a r ### ghe-check-background-upgrade-jobs -During an upgrade to a feature release, this utility displays the status of background jobs on {% data variables.location.product_location %}. If you're running back-to-back upgrades, you should use this utility to check that all background jobs are complete before proceeding with the next upgrade. +During an upgrade to a feature release, this utility displays the status of background upgrade jobs, such as Elasticsearch index migrations, on {% data variables.location.product_location %}. If you're running back-to-back upgrades, you should use this utility to check that all background jobs are complete before proceeding with the next feature upgrade. ```shell ghe-check-background-upgrade-jobs ``` +> [!NOTE] +> This utility only gates a **subsequent feature upgrade**. It is not a prerequisite for upgrading replica or other additional nodes to the same release. + ### ghe-migrations During an upgrade to a feature release, this utility displays the status of active database migrations on {% data variables.location.product_location %}. The output includes a version identifier for the migration, the migration's name, the migration's status, and the current duration of the migration. diff --git a/content/admin/upgrading-your-instance/performing-an-upgrade/upgrading-with-an-upgrade-package.md b/content/admin/upgrading-your-instance/performing-an-upgrade/upgrading-with-an-upgrade-package.md index 21750db34a98..858d7c19f4e5 100644 --- a/content/admin/upgrading-your-instance/performing-an-upgrade/upgrading-with-an-upgrade-package.md +++ b/content/admin/upgrading-your-instance/performing-an-upgrade/upgrading-with-an-upgrade-package.md @@ -53,6 +53,9 @@ While you can use a hotpatch to upgrade to the latest patch release within a fea See [AUTOTITLE](/admin/configuration/configuring-your-enterprise/command-line-utilities#ghe-check-background-upgrade-jobs). + > [!NOTE] + > Background upgrade jobs only need to complete before you begin a subsequent feature upgrade. You don't need to wait for `ghe-check-background-upgrade-jobs` before upgrading replica or other additional nodes to the same release. + To monitor progress of the configuration run, read the output in `/data/user/common/ghe-config.log`. For example, you can tail the log by running the following command: ```shell From fa36943fa00dae2ac46007e32dab9b39bee4a65b Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Jun 2026 08:55:10 +0000 Subject: [PATCH 02/10] Enable MAI-Code-1-Flash across all Copilot clients (#61758) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: timrogers <116134+timrogers@users.noreply.github.com> Co-authored-by: Tim Rogers Co-authored-by: stehf <10836668+stehf@users.noreply.github.com> Co-authored-by: mc <42146119+mchammer01@users.noreply.github.com> --- .../copilot-cli-reference/cli-command-reference.md | 1 + .../copilot/copilot-cloud-agent-non-auto-models.md | 1 + data/tables/copilot/auto-model-selection.yml | 2 +- data/tables/copilot/model-supported-clients.yml | 12 ++++++------ 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/content/copilot/reference/copilot-cli-reference/cli-command-reference.md b/content/copilot/reference/copilot-cli-reference/cli-command-reference.md index 2a717c770796..5ac5fb18061e 100644 --- a/content/copilot/reference/copilot-cli-reference/cli-command-reference.md +++ b/content/copilot/reference/copilot-cli-reference/cli-command-reference.md @@ -352,6 +352,7 @@ Use `--model=MODEL` or the `COPILOT_MODEL` environment variable to select the AI | `gpt-5.3-codex` | Code-focused tasks | | `gemini-3.1-pro-preview` | Google Gemini reasoning | | `gemini-3.5-flash` | Fast Google Gemini responses | +| `mai-code-1-flash` | Fast, adaptive coding tasks | You can also switch models during an interactive session using the `/model` slash command. diff --git a/data/reusables/copilot/copilot-cloud-agent-non-auto-models.md b/data/reusables/copilot/copilot-cloud-agent-non-auto-models.md index 8224bb221fc7..7b9e6f6732cf 100644 --- a/data/reusables/copilot/copilot-cloud-agent-non-auto-models.md +++ b/data/reusables/copilot/copilot-cloud-agent-non-auto-models.md @@ -3,3 +3,4 @@ * {% data variables.copilot.copilot_gemini_31_pro %} * {% data variables.copilot.copilot_gemini_35_flash %} * {% data variables.copilot.copilot_gpt_54_mini %} +* {% data variables.copilot.copilot_mai_code_1_flash %} diff --git a/data/tables/copilot/auto-model-selection.yml b/data/tables/copilot/auto-model-selection.yml index 1106a6c70b8a..05a89d89f044 100644 --- a/data/tables/copilot/auto-model-selection.yml +++ b/data/tables/copilot/auto-model-selection.yml @@ -53,7 +53,7 @@ - name: MAI-Code-1-Flash cloud_agent: false chat: true - cli: false + cli: true # Fine-tuned OAI models - name: Raptor mini diff --git a/data/tables/copilot/model-supported-clients.yml b/data/tables/copilot/model-supported-clients.yml index 124981149d1f..fb6d267fb538 100644 --- a/data/tables/copilot/model-supported-clients.yml +++ b/data/tables/copilot/model-supported-clients.yml @@ -132,13 +132,13 @@ jetbrains: true - name: MAI-Code-1-Flash - dotcom: false - cli: false + dotcom: true + cli: true vscode: true - vs: false - eclipse: false - xcode: false - jetbrains: false + vs: true + eclipse: true + xcode: true + jetbrains: true - name: GPT-5 mini dotcom: false From 5e11ea3e8e584a9b2d85ae4d44ab5035bfc3dbeb Mon Sep 17 00:00:00 2001 From: Jenni C <97056108+dihydroJenoxide@users.noreply.github.com> Date: Fri, 19 Jun 2026 01:55:22 -0700 Subject: [PATCH 03/10] fable 5 - adding a notes in a couple more places (#61814) Co-authored-by: mc <42146119+mchammer01@users.noreply.github.com> --- content/copilot/reference/ai-models/model-hosting.md | 2 ++ content/copilot/reference/ai-models/supported-models.md | 4 ++++ data/reusables/copilot/model-fable-disabled.md | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/content/copilot/reference/ai-models/model-hosting.md b/content/copilot/reference/ai-models/model-hosting.md index 5287fe5b2c6f..96892c829142 100644 --- a/content/copilot/reference/ai-models/model-hosting.md +++ b/content/copilot/reference/ai-models/model-hosting.md @@ -60,6 +60,8 @@ Used for: > [!WARNING] > When {% data variables.copilot.copilot_claude_fable_5 %} is used, Anthropic retains data, including prompts and outputs, to operate safety classifiers that detect harmful use. Other Claude models in {% data variables.product.prodname_copilot %} remain covered by {% data variables.product.github %}'s existing data retention agreements, as documented below. Enterprise and business users need to enable the {% data variables.copilot.copilot_claude_fable_5 %} model to make it available for your organization. You can read more about Anthropic's data handling practices for this model under section F of their [Service Specific Terms](https://www.anthropic.com/legal/service-specific-terms). +{% data reusables.copilot.model-fable-disabled %} + These models are hosted by Amazon Web Services, Anthropic PBC, and Google Cloud Platform. {% data variables.product.github %} has provider agreements in place to ensure data is not used for training. Additional details for each provider are included below: * Amazon Bedrock: Amazon makes the [following data commitments](https://docs.aws.amazon.com/bedrock/latest/userguide/data-protection.html): _Amazon Bedrock doesn't store or log your prompts and completions. Amazon Bedrock doesn't use your prompts and completions to train any AWS models and doesn't distribute them to third parties_. diff --git a/content/copilot/reference/ai-models/supported-models.md b/content/copilot/reference/ai-models/supported-models.md index c8988cc5fd33..a4530de64ac3 100644 --- a/content/copilot/reference/ai-models/supported-models.md +++ b/content/copilot/reference/ai-models/supported-models.md @@ -34,6 +34,8 @@ For all of the default AI models, input prompts and output completions run throu This table lists the AI models available in {% data variables.product.prodname_copilot_short %}, along with their release status. +{% data reusables.copilot.model-fable-disabled %} + {% rowheaders %} | Model name | Provider | Release status | @@ -107,6 +109,8 @@ The following table lists AI models that are retired or scheduled for retirement The following table shows which models are available in each client. +{% data reusables.copilot.model-fable-disabled %} + {% rowheaders %} | Model | {% data variables.product.prodname_dotcom_the_website %} | {% data variables.copilot.copilot_cli_short %} | {% data variables.product.prodname_vscode %} | {% data variables.product.prodname_vs %} | Eclipse | Xcode | JetBrains IDEs | diff --git a/data/reusables/copilot/model-fable-disabled.md b/data/reusables/copilot/model-fable-disabled.md index 3fe3c546eba8..c7feac2a8541 100644 --- a/data/reusables/copilot/model-fable-disabled.md +++ b/data/reusables/copilot/model-fable-disabled.md @@ -1 +1 @@ -> [!NOTE] Claude Fable 5 is currently unavailable. For more information, see [Anthropic's announcement](https://www.anthropic.com/news/fable-mythos-access). \ No newline at end of file +> [!NOTE] {% data variables.copilot.copilot_claude_fable_5 %} is currently unavailable. For more information, see [Anthropic's announcement](https://www.anthropic.com/news/fable-mythos-access). \ No newline at end of file From 4caa7292773d3ee3000fe0a809d3235cda59b9d1 Mon Sep 17 00:00:00 2001 From: Ben Ahmady <32935794+subatoi@users.noreply.github.com> Date: Fri, 19 Jun 2026 09:55:40 +0100 Subject: [PATCH 04/10] Update Copilot versioning instructions (#61829) --- .github/instructions/content.instructions.md | 44 +++++++------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/.github/instructions/content.instructions.md b/.github/instructions/content.instructions.md index d6a1443502d2..67847dcda393 100644 --- a/.github/instructions/content.instructions.md +++ b/.github/instructions/content.instructions.md @@ -95,17 +95,23 @@ Examples: ## Versioning -Avoid `{% ifversion fpt %}`, `{% ifversion ghec %}`, and `{% ifversion fpt or ghec %}` in content files whenever possible. Instead of suggesting or adding version-gating within an article: +Follow one of these sets of instructions, depending on how articles are versioned in the frontmatter. Articles may be versioned for FPT and GHEC, for GHES only, or for all three. Articles may also be versioned using feature-based versioning defined in `data/features`. Feature-based versioning allows centralized control of when content appears for specific GHES releases. -* Write content that applies to all versions the article is versioned for -* If content is truly version-specific, consider whether it is low-harm to show it to all readers (e.g., an enterprise-only row in a reference table) -* Only use `{% ifversion %}` as a last resort when content would be actively misleading for readers on a different version +### FPT/GHEC-only articles -**FPT and GHEC content**: When dotcom content applies to both products, version the page for `fpt` and `ghec` in the frontmatter. Do NOT use in-article Liquid versioning. Do NOT suggest adding `{% ifversion fpt or ghec %}` blocks as a fix for content that mentions a dotcom-only feature. Instead, suggest rewriting the content using the alternatives to inline versioning options listed below. +All articles that are ONLY for FPT and GHEC should be versioned for these versions in the frontmatter. -**GHES content**: If versioning is necessary for GitHub Enterprise Server content, use feature-based versioning (FBV). GHES content should rely on feature flags defined in `data/features/` rather than inline `{% ifversion ghes %}` blocks. Feature flags allow centralized control of when content appears for specific GHES releases. +For such content, DO NOT use in-article Liquid versioning such as `{% ifversion fpt %}`, `{% ifversion ghec %}`, and `{% ifversion fpt or ghec %}`. -### Alternatives to inline versioning +### GHES-only articles + +All articles that are ONLY for GitHub Enterprise Server (GHES) should be versioned in the frontmatter using feature-based versioning defined in `data/features/`. + +### FPT, GHEC, GHES articles + +All articles that are versioned for all of FPT, GHEC, and GHES in the frontmatter MAY require certain blocks of content to be versioned using in-article Liquid versioning. Before recommending this, check if this is really the case. + +#### Check in-article versioning is required Before resorting to in-article versioning, first consider whether the content is actually different across versions. Often procedures can be simplified to work at both levels. @@ -127,26 +133,6 @@ Use these strategies instead of `{% ifversion %}`, depending on the level of con * End list items with "({% data variables.product.prodname_ghe_cloud %} only)", "({% data variables.product.prodname_dotcom_the_website %} only)", etc. * Specify if the feature is not available for GHES with "NAME-OF-FEATURE is not available for {% data variables.product.prodname_ghe_server %}", "... (not available in {% data variables.product.prodname_ghe_server %})", etc. -### Example - -When documenting a feature that only applies to dotcom (not GHES): - -❌ Don't wrap content in version blocks: - -```markdown -{% ifversion fpt or ghec %} - -## Immutable subject claims - -Repositories created after July 15, 2026 now use an immutable default subject format. - -{% endif %} -``` - -✅ Do use prose to indicate availability: - -```markdown -## Immutable subject claims +#### If in-article versioning is required -Repositories created after July 15, 2026 now use an immutable default subject format. This rollout does not include {% data variables.product.prodname_ghe_server %}. -``` +In-article versioning is required if a block of content in an article is definitely ONLY relevant for GHES, but the article itself is otherwise versioned in the frontmatter for all of FPT, GHEC, and GHES. In this situation, use feature-based versioning (FBV) wherever possible, using `{% ifversion FBV %}` blocks, where FBV is defined in `data/features/`. If it's not possible to use FBV, use {% ifversion ghes %} blocks, which will version the content block for all versions of GHES. From 6cea86032e5a8d5bd283430e9b1d0090a107cacb Mon Sep 17 00:00:00 2001 From: hubwriter Date: Fri, 19 Jun 2026 10:30:38 +0100 Subject: [PATCH 05/10] Copilot CLI: Update `/context` output (#61790) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../copilot/copilot-cli-context-usage.png | Bin 67506 -> 87407 bytes .../agents/copilot-cli/context-management.md | 15 +++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/assets/images/help/copilot/copilot-cli-context-usage.png b/assets/images/help/copilot/copilot-cli-context-usage.png index 451a7a6eb70de871acdaa9151f46e411b27c070b..1541ee8184df2c4e30c12dd74ea6d0f13b649772 100644 GIT binary patch literal 87407 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 _Fs&a$J@?gPo9Rv_Yqs7&ooGJ{c*Mo z=P@cPRlqytO;{AMw$9pwI1VMV8qTNRqwfHcVySSD(r2lhqj>HER5BaF|5?;u-UQjsR>&={sROT>iO2xYW>s*lBV@9` z-o>_mRD?yF+b!r{U%!`8?Xkq)EoKfWVY^U4Y?qX(s<_#q#BnDG+re*(Q(jt$~!%@1`N%>eHhZTsN;90!*rW z&LPAaFXs9UHfEoHX!+kC(0sQxtH{=7YB;(YpJ-B|0GzgedQ6M9U=s>8)-5{k5aQTqf0fVWe&wM_ z9-J9BlVQ6sBgh9K)BMb8$U&xl`lZqL77BEQ=_^vo#^l+Q2)5FsLLKp&NPe+BmEZ$0 zz=6zumh^ruD0ENNcoYbD`rdrkJN@0lHJgOjNeu`@V`xQ082fEjGfF74$5E3tntq7% z-Js~&XedSlRwoT263_olYdD4UVl#)3pIHL%k;#CH4o~rG`xdF8PTe)S_P#T-C@Xcg zSErd00+NOeF{79D84~k=ElO9o6(QOs;KSn5OPVk7O6_FX(7nxwR?No5g^3TSf%s#l z9l{?akiSD1-LA)HaNjr88vgj?fc>OScXMOpR<1LA!ZmcJ^?R*J<@ z4Cz-mA_xoR8@FFMAkLL`t1>d~tE}M+q}gXA59pv@SnWTz!_z~|&y$0s_g6*2>NXmi8cRzX2i~I$Ub5oVJ!2-o8_EwN(}6W)pxW;~tW{UV@$p4Yj;t`+CS!;5+GzK79{w3nGW)onGMl=;`8`eS z@yHQ<{wE&*6Ka20G9+WZKIeO43HOJ3`*ZHPJllZEbwAdcgABoaYPB%OF zdh)Vo0WK7pXCNXZRM8JHmvcLY$O(_5-_t&3-tCPx4t~zKl*AX;Ctw@FuM|Vo%wBAM zj=5M&%=s_LEFz|;Fe3F~XdRYiAe*Lv_Gi{5Oso?1Vk=Sck*{ChWHF)MzMYsTvNg4; z3YmLBdiouvI-P*^&4)ZxBSoO2sLwAc=ivzY4fDyODA~&_JZL>Qe8dys#rECh0`%50 zLS6|dTarb&OUv_JH z`L7BzL!T)}BL-s_^)SAlk->2!bqzq^^lOK-T`hbf*^$o{?zVJU7DY{hPlG$w4_5Sw zq)L@Whwwaa`Ssb#yA$b{+9;GTu7F-j1Sh48?keI~_t?=Cw3;=+TH!mKA)6G^mzNKILa-CiNu?R<5P&WsX%{vJD%Xz&ppweQ_bM z^fRTZ|I;mz`?XwJj|SGxTlw_klu}d+(It@u2T!NGp1F!RgTHMRUW>tC9MpSu2;emY zOHX1>L}0Rj6-EbC)DH^3F1&p;HiFgX7jteq~W&~ zK+Vn7BZGEQ{$@4+ZCD`7vXiteJ#vnjb^M$nf&Adnh7uHyMru!5G-JI^(ydpKSZ#3n zCYB|n&XYR_ti2BeUXayqmyaiviE_OMtO+h!&;g(|vVI-E#i3KTea`OAA>W?OG0C2l zbn`r$=EDOPbWB!BDFz=Je~-FS-n4B9@48?e>YJ;I*B-S@#nnT<^D;n#I_my+lKKl@ zft!r)A|r}`QP6*X<-WE#%j`0XW3IT(`Tox%rqe8)IDqd}IhQUx#v&WVKE+RmgPH36 z>l3nfY^^_JV?;)Uw4uUxyPK!(%6ihr^q^47ehRc@p|tc^yoAH~8vN&Q&n@}TybjI81vhWs4c^OMj5rASvw0TlR;*J4h6t~z)^!U$exoGgkmAX_ zwFpcbi-s4otmY(5@0MS>Z7Df#gTR9v#sti; ze(wxwl$W9ir~x>A-uB>lreEY%e+c0b_{`b!I}|qIkrvX{8cg4r81@kJ$`e@>vt+ZU z8Da&gRoP?Ws`QrPf}fCI^>X_m*D56{l9`={tMX?(b97vevduyU;SV}#>EWt1VCPTx z&?+|OYMc*ck2=%~uamLDiHuYdPzO0|qYZFn@pIU!htUYOexYjiwZV6pfSM0MkJgt7 zTueGgH(!o^hDdvPh2TRm6N9SYRPvxDAHw}*JHBP|88T7fNeW)SZt}vBo2!JpB;IMP ztnx*b8c97qWBK#mB;ULMkK3(y7^(2u<5zxAG!pDPn9h5w7g=3?PAL=d{tfM^#7#C=08k!+vIRfj2BqeLh=qL6Cw6Y2rw9E7A z7Ham1WW^N8=j*qKC=k0Dvi+mPE|Af9mqpso`}G(=yO=OJvF;YRrW92WT$f@#HRUZD zrT8HBGgw=wMU>wI=c|F}QV9nVPG!HwR1rx^TNoFLnMjnF&slxI%P^J9vBb4!~ z_W&}%^gs4nU)zLO0V729h1#si=@b7aD`Kev`KkA@J4Tda=9aWJlm`R>Z4#X@l_ieR zR?~?zUYzYhI}Ki{A~}4nN-e+7-)mB_{!Tjyt#{l0&7A{ub=UPZ!!k}Jf(Xqi{Epz{i|Vm0W9S|bctOJ-YEf0Zd3u+E94XAK1SB?kR8 z@S|iJYZ7F%Lkgk>qS@Wu3NAG8!peRR;|y)$SEq_mi=X=JQNA5qsHhyob2yTT=Zy%z zt$p^No3=RF+B_nhDPvI^OdU-eYlZMPV^HSsWEfC>MuzlOzlG1OsJO4a)^$8W_uxBT zD5p|hPHdoULUnr;2oLh*Mfi^c6A$2^-{Jai`eldUPQW%BR({<0QTo*g)L$(2X|*^%>?+kC^E!d~+-F-|o`YyIcxV8BvwH#41br2@jD;F(+a zDS{9E^5`0)THZ6JW9(9rZ&r|wb3f?l^5cogLyOV`_0;T=mOa&zoBW3ywv!XltF4n- z!a?&LYTy_xAW36Qa#~t{=`W=QW6(H7FTQ2Sl9^s`tXK29&Uw(o5MN6xJXMM6jwOsy zL`9?%#{V@ z?-@uzsLj^!@R9iiBYr|LM6DpZ>O?G9qMQXi!hx=uZrQFPVNg*=g;6>pS_)=?ENVWQ zu5L4EOwZJoTt7Q03NbBflmw@-!TnZ*5Js}M-!HXzwD57zsr8f>nbr!))_!os}eKP~qUY zhMZhDJ_Mb-u}l>Nzs#i-QV-j)zgN5ynVUkJ#DTy+o9s?JdY#7Gd6SpF5%lSoZgr7t zvm>!a7V?|554`whmWL+7_uiy&8Rs}5#kzA7x;7I(`TM1&DY})VYf;J6_?ZooS^CGh zaMj)_#>=`Hn6_;?(JKcd+4xLll&%OZ}==!287^+kUqw+=$xJ!=2#W@XLN z-e`kKYshK)MsKNR3pM(1g0B4L&_JJJ`~$}1^bPzh1snbipCoqB7Iva#vu)e5t976(0zPRXmvv=Xh-#SJM?5tIOu6wa5MIEF&q*3G<;L{& zvH=8}CiE0Yn&iXgmh$(J*QTtB-DgnJ8PqyhG4CI$xuDXt)$%*TQ)D~0>&{uUI6=rr zc9_n{uw*W#de>O8_d#|UY*FLyItX#%Pkm>-zESU_q8}xlk%bn1{z>eguIP~mO9>V4 z#9>tL;fmr!LCQNisARis8B8P8CR6oYb11$R=k({{?Ri@O1YRg%;;&F)Q}#IT&18SI zCB_L6R44m_Q0}$QzwNwF4Sz*GS()H_)VxsMjShOBL7fxa=3xk3=urIxE;wfB%X50r zsaa+dMD!zSj-lwJd~;MmLWkXbXPae&s9(|kYE z5KU?ZMampdKZ@3bE*U0g#>rMV&@Ko2J;)Y3EuX~g=+#Mn6|lBVRH=Uf+BRg0bV~<^=+HPNZEaQ_ zh*jOqCAX%omtkUsvU(DojO|)ao8wD+Cghk3m*Ju)HuFtJU&3K*L zO1pw&@cZVu+B6UT50mbC%^7sn(2X9_86zuYmY21pk*4gRG8F~cg1wlXR!+{MYnJbg zI~if+<&T{j^Rd>@qN46H7at|%?Cq<$J4zB>{rkb|KiN7a1H4l}bZY-A!mrk4WL4Rq z-;K@{RnCiS>_P4;9b!f2=O0@)7ZzFti*ag-6?h-c@euBe0RQ~*9aix>F2R`CLTaS! z37BQI8;Qb2evNSfu&&B`%4Y)jW^-#UL&2(@lo4Dkh`Oe1qI)RfGMMws>Pl#8Hbd#C zQAtCwmJ4idmUz~;#z!SVTD~= zgxM*r+8SEP9a0nZhR|!ZHLf0x>GeGX1%(S?zCxa=2S-bfuTP=h-~~slkKuivncP>h zbN-9W2^DQX#w&qo(!dTF$@&agPBLG^+xloU*KYW@th}jM1-i)?%O>$CcIt?l~X!`JiG#W+Uhg zMM7g%dCKP5Ove@Vng7KbYOU@ewlY!d-I4T+wT7sXUT$s6&@5(LK7q^62mcvT6bgbV zAmfHE-(0y|9yzjIdLd(Cyvk9`T_p?KuUob|YNX1_K|KIExE@`SSzh}Md76B;y!X(K z6cVg3_HvgqmJ)3`37zNM^s%#ZQ+i8jK1xnGHp@XF#@ERL92pwM_Cl3UTRGPy*DC^y zMteNCs0q0foG$Vo3zm-DG~a~sv`o9Dv>%$cl#~xYV+v2A3;sUQnLyE5__TTLM99kTlEUu>BIKK>W+Z3aGDzxo^}dza|OY6s(GZk;ybJM}wDZ4Q0!-ydq`0XQKm zZoOu9P~%H|M8HEY4(F;3s`+Q(I>S~fNr8tTV9@>kr{|bzW^Sn3ycUsTV0x=&hyePb=a5dXrlTQ zv|!zTX;HIQ@2_~z8JfUhTp^!$0T&0Yy<&azUuwkWHf}C{N4-<6qTK&$?6y(dr-ZRy z*G13NVDrr}$Ni^*S?B<1z{d^J-9a)rTyWVx>?%7vtkvk$VEaWgnVlfpdQYog%6{@@ zDz9^ybPT&ZA~&Ilsc1~lRdmWN|H)+b($;<&HBT=Lv&PG5(DflS{(LaWJuKrr%Cmy6 z8pBBiXgLAiV_+(Ze~n+BUnS$MuK3;|k`=f;PzK*c$xV(d+5syfJ`VP_atzVv9baW$ ztETqaMGrOM(cxpGc#Hx7Rog^G#$v9o)?#3xV~`TsnX%uEoS;LLu#Mtha~1aqym&Xv zHA>JaBJ%kA2fBzTf&_@4L$uqg+j&jEvCU8Q@z6@eM}V3oKJ1lMW!4tzpQDY?683c6 z?+M{Lp0)Ja_T9Ti@ML|&XHpTP*EVt2_YC4k<&=vz_C0=cpA8e>mzz9NO05d8Nw5nm zb@j{Sx6OB}&U(L#D2h|lcJKNi&38T`;O!%t)noXbpUKIsl2szqTplQB*k7_}9syL_+e>&(rgj+T!L5ze3j5;u+ za2N(vEE49hYZ|L8)MihnBo1FGSEAvMOpzTBvXSt)Oj}Pz8uFYTN;9L9@&3u;feT(5 zrV~NDj(rj-Z-4J)HJ%IhG|!@zryJ*RFQZXt+)$b1k$vckDRL3s3M&}D;Z4Muq_w$M zy_aENOHD&-HDbvhK|G1v5N1nQ(~?iF`{o}t@XN+?gq|Y`w)$KVI*_U($9BkseM^vj z{K6-}IIPr&z|h>Avl%_f8148_+|ZydS<+?G70!oU@fmXe#;nJTg)q6-in6i;IrO&)pJ-L0?|;l{;l8bbZa=$R25M|1FzB9et96b&cDo zs1JaLzhnLyL$FW4Q&7+dL56JVP9U5pfo-CoPQX2PtN$lFh>zxx0UOp)Pmy`4d9G+C zS~evqsSJUMt3ULf5-3^j%MWGewmqh5;S7A{?t9!(KkM_lxG&W(Sj4@Y7>t>E2}wRs zF^2m!TxEyalk(YN_nxtN%!#~admVLKnIj?mz9{Qu@1@yQ$T}0iPDqc)HG#FZKE%0f zj)<#W!yz$EOF=%ww%&5aW~H)b6!MfptY^MvRGvt#-wCta&JjHKG=WH?%)vwdEUs0$ z7egad4=|lFdk^V)nfrd&WJo+WSGBC}+lpDB_r$*ge`f3?Fqh>xHJ zfGX|??L1?4gHe4w!gUokhXb{7u?J`e07MSzk^bWN!^uoT<7&bbWpK(81*wsI+Q&~g zqovgS+F=jar@Z2Xlmlw71+haG-x7g4Q&ut%N=cE!8>8bjt`t(uq7wYMdFl>?DQ2bB z)icOU%mVtU$~q`aI?#qj*h|slIGfjb#}P+3&h07f&Yy2ewSUh7uk;6Kxh29p9M!7H zY?JfvnnHmEM~a2k(IAP(B-G27jjLi zTcfj7mKpXrPlYoj^cqq_3_C&pp~``LG*ZYpu^I*L7ldlJ9`XCej~mz%hM}j9nw41- zZ{B;}saoe)96IR+ae8z3@%z<;kx6q&KI0=Z7?cz0q|HKW8$o0@xVGrEo z%uguSEQ-Qw7hD$7$*U$D%*^B4DsK1K5%8Skm!15zHUHuPl6f6ZJjwZf(ij*gYVP5DAdJl(X z8a$n|_5rCkh{&v1*R1&QOS(+4{evz+nFnU-*n(}2_F#_xFMBgQ2!&pGJp6SP5{9=s zwocOtm=z6gB>QpwFE)j21)CO67%djxnN!DpocBWrztzWBFh-TvGIcYb8T%V*w)3e+ z{v}RYdREEy@ZiKor+p_X*{?S~up37Nt_=TdR`Km7D54(%(RiPFqGh>t@Xa25R#Fmo zN?=1n&$T3^e!3@uJg+hpTW)?vy&|QuUJ5_?hYd4f#;W(O(S`n+E;)O*F?Dy@ZMHWS z?81C7gI9{u$oam7dVt(u{V~^#8uThpMw2j;+9Tm#Q4qx&6lR_Ha#buW(=1OK746c^ z!Y`Z_iJM$e(|GU+j`00Xo=5e4r}1NgVTX8sZ&WlMxjp6q0F)Jik_Y(b4NXxCgnnzT&zf;YYHqXyxh-G0?NUfi+a#gp;=^Xy!*zs2%1&91_d?dji z<*zsYCQFjsVlqLnt>&_#(X~kd@qqNaH3`K6DSiX?KRMf<&ni06yn$@A&;Oa|e@=%$ z71%UVsq=^VdHl12Xtj50a+nsq2|0GmG!xe-!NmVLK>mCJ53E{(iY@#0U-Khs%yjs8 z_UC0Gjigt4Qjora-u(aeoSv{{cRM2?|0hKMuUP#*KS)QxghAiIjxPP5Tlsrd{ntON z#{nMq|Lb3nw)&Lte+>bmgvnyPv(5fgl+Ahp%D(?KocptXrT5M0xXG7w&p$(BqJgZK zhFMtDqo}cAeqv}SwBHdDkw1Y^J*j#Sx2K(3S#4EZ`m=!dvBpfM5}KX8ESiCwaa3(d z3r#BYvGN|WkRvL_Yo?OMww|G4Tr!&%8CN?gEWu~WofTEQO ze51rQ3o@KbQHfon$YB?;gN%u(`iCP2UzS+uxrsQ`lJh$H+?rp|Aorb&H;^#Bv2tdP=r{}nI z=`j#)!PjG1szm_3Yt*_tFg}`nzg%_r0rW;b&jyq!N%pUEpAO1U#%G9D1>+Ca^V_Gp zO95P{ubRt>Ng`O8#qh1daC#CX3`z*56m9sfW3}VQqM>Qjm?wO@nQZZL<BI@=E)Kx~cR)3h7*7Cc6SD)_rvDX~$Ms-3%R@eT?|JrpZF-e8QI)+KZ zI|wa*`pxN}OPsnNhUms2y^Pct6>1X|@um3r0)vro>`HJq1+!glzKc-~v9ZC6!MjQ! z&xXC=mJ|@Ou2HStkq)ZsXJ=G)r3wf%PB*w-qGspHlWi9(Wt2rnPinp!2YETEV8=lt zY_2O%buYo9pPfd7RNbGS;HDQBIZRsIJMv}V+Tt!d4&&SdI{b6uG4tPw=rj5nbmGkS z{*)>p7MJF+|5DoBG+AsjT{ExmPl>Ya6(L(=cgtMkVEAnSi%ksKQi*52M#k03s_qK~ znK34)`a8C!%XcQ+$$7cV$&VS^CBA2gSGZ7s)c#sw;PBmn?DW1TTmaQhtCB&D`0dEM zt*wtx(&yz5aLA{|Q!vy9e>YqpR5Occ=Sy!XEvY}g2=o=wxv`_@d@G8M4(j7r4I{h( zBodnLTSYCZG$9tDq+@?^fMft#v7Y2|t&t7uk3KTa(%u&3;Ia+m%lQ%trEQmTMXUf^M=J@3H=WF!!+KJ_T%=Vg2 z-wzBcXvF~yY3{F#619EACN9!Kyp|^?iu&Ovd|AZT_yyc{zc;FRxdy6o0~9V;w!yd; zv*Gl_v^>%PdAg0-j1G+1*@TLtes-ol?db2Sy5vCWTTdam?03&7r8qdt@Csjc1nTF* zB$RMkjhU<3JqT=1f3F_)ApZW4)npzs5cypd*?eahA0uBkH}U;two8qzRl`DVbAF4y z=`!B>bT`^d?<)@-fuB8pnG{jj(?of>^rE&f5)B_IgDP4TM~7pL^77A`QPi+GZ4~+) zNyuJhnW0ehvw>HKLRP$YI271983edRav%JHvU7QTcja?bFLiF|25uI`(i|}HxQ)t< z3=6teh+jFxM9%JCC%|7cvwdzhJxvalt@Y7vFqp(cy*4Z5UizT^nJHsxv;Ww%0(f9I zLgw0~t1VqkP4{Y*lDneFnp4(H5fKI2B39iDv>U(tQwUB1P6JCq(b{PqV_ksf3m#tS zHqktr*lZoLe+|aqLqx^j$419wl#yKts}cHk#xvvL`K@o|A*`X7ILyw>(7;t{<)FMj z%T3A_Hcb2??=Fb)?l8IPCpyaK5Sh;+l+oL1!PB3t*~Wl&3ss0+5~MB$yu&1~RZ@5= z-<~RDa2VFPS3?Zxw8B2)BhH(|d7MP{;#>MJ2q7-qDUdyPHOR?j6%{G;p^H1y_KQA< z#cA;E!|pi9?fWl$t0WuVi}*w|Ari{2oQ+*RDr5;ck>jo+=KOWdBlZCBO`{us!?x+` z1vvcAY%5iMI?`Jc3ZE-%^H3KG3mg0^PlbP3`lF3I(EskexKU-_n6uh}5cZq?o};7F zlxTT=A8V!Wk+W8w!hq7gHU}rs_ez|ht0TUi#Ppb5<4&S4s|~;GLRjfIOCfc0fBa#1 z;a@L+C2`Pv&Ba$_C864-K&zx3eq3BpR;JKvQUR?cZNb&An^qF!)j!c}uMT4=(KPET z$v;b8U_#qjRO%_e3H-zKKK!e5r#7Kv*T(iAVH#Gumdd=@YCB5Ge92+c9SsZFP2vcWAH5$mLuNi=RqM5B}4~q=!{Imwn@##9I&&|(e&Tdaq597|6smt2NL=DZ*889K(N>@nL^TWW-2Z4uvvle{oX=CHGue zAm`C%iKx#jUNQb*$ac-ETBywDbxShYnp&NSfbgk}Aigf3%VhHhYduJ!T;x#(>F7gu zw6CU4a>a@IjgYdk^Agfs-Kz%yFg1&QYVr2q32!KLkjg-`1eHMl2epif`6`IY6l{W@ zd10iMSb>dWxC1XYAQVP#>=&IP$45vzEZEDz<4}K`-Z3B*jyXSTWDIp$9!%XaVkq8e;q8MHsMf52I_mXW(QQ%iK*K19YoOS z>Riag7I2X6iWQt;H@-H~sVFEy!PZO6L%`qk7B9)n0usiiS~$a**S#+#*1d-!seZb! zhnv9~6Lw;)%4ss@A(SV=!9~q&m~XeLViOSz!U$4QYWdY1Wi~QW@_W=uCstEQB6)pE zcvGt|g5hGlYM_+#g4fa>jm8ckPawzNSH9D;Sp;4z)7yK)PE(Ix-Dh~s;57k3^GcEI z*BcG2Z|uZ^+Kk2xmZM0~?s;ylhhSi^CHaH&(KTS3T*?5EG&dwYXtvW|fi2gdm$0!ETuLT-4FvGl4fFU<0kL_BSvil+!a@H-QgU09=kW+ifkB)oQL8p+hS)$eE)U6F z5=2WnDbPb26B9uTOS!NZ&|T4b(fVJIByLX80}Xr5+%VNJ5{ACp7boQqY;3Snvl}Ms zj&+AkZ}n1#Zv{Rg*Tlvp92ukK(TXv|YA#~ku;zpFr|6^zflZ-?b7~HOP)1~hKC>62 zZ;66S0e9DyT1tN8`z~fd`F@GrVAZfE6PVce6v53d9bJlSdp>^ildkKy1+A0LnkK2l z@zniC26wSUrq2peT{APvN4iLPs9$M*GJ_5B`~=VnFDzz7SYHRp(gix%hyKD-IL_+q zB+|1JP5bU;5*~=)>{CnKAKtNn=jD?LdN0r{DHH|;1X?s$K3T}ihDL3|B#&o})i7G^ zF_x3tUfy4~>O(`lG89pA`&*UHnm*pIaE%U4t}PRof3;iybX7JfkD-z)1QNS1kC7nQ zF6gBMmBy}*Hw)b+S)RxR>|iz1_l3C>nv^71c?Vi~P&s%8jpYjxtEt%){9_*XZV_tp zHeZO`%7&FZYaJlExP%{*BWlxm=~V%Q&eY88?^N_C6|d^a`)4SN){I`}F^V;}vxnPw z(5sm&Srs%F1AJw=5j|YfdLoftNh1}?FHC*@F920PN%wzK^?j8u3lEUwH)F^grn+;B)6!b2U5&4G(&}FNmM5vtOj1yspFyr7wjif@LTH%gA)LRT_8gpcle7&}~`#Pkg*)!EysKQI3t6^tD2Ti>ViL zPvOIdr!H9dJ5j~BAQaT=-9X79NG z!l)9m;wi1zh}eT`1WZt-Ah=IvIh%B06hl_=s2}@lJ9IiMJEl9SP+wamWXyFh(N8#g zZFe;A6X^X5TC7z=Z=fut#ly_p9ob z@~1x>X=M(3S4<2kC1w>>x_jXJX!50T_N(4>e!${}>%~q@vwvqyoU5aZzkP|J$SJu0 zv#u1K1Yw#c;aRPHGH9grVZ98WO|WjSaUowhyX4HE3}3d8eyFPJ6A5Hu0UXVPTo~8~ zdqyqvT8t414;>R4JUtSKj_&dTdb^hQa_!Y=nYa$=6FV!r__Vv6!6yS%F#Uzrr=>=p zNKXMz0}?0JdGj%#C1#i&MGE2>dzISFFBDBMj2kCtS*4GfI25XLHYJ|Tp^}FR=Y^a| z$lFD1%S84?vhN2MSoRQWd_ujwvo_D8_3&=g0tkf@e;ClNoGnyKlPyz*cX7ezbzwqR zqfi9=_P_9hb0;|B(0`tJd!6>cJ+}B@{LuOImFN^zDvkZ82ROX*0`Zy{cdV)!NQEkn zI+!H_D5=E`f3;PrO(QV`-4)1<+W_oXjp+u-Fd`1`0`(7KP}eXfsskwLO~^Ns%Elh}JLm%nnd+n)*lx42_-HhlgPZVd!yN5@qitGr-B%D4j0A8AA%Woin>3|8G@ zP}@s67eO{8gcmOncPIVbzmJDo<}vgXeiywFIICS6$?f{{p5E{$Qip zQ0y$9S`{e7f!f!dv(zfny-8KTc&7DC2#7sIUWA%k0SG|}9T~^Xl9Vh@GL-C=G@F-0 zKH}O^7K}sIDb!V{sBj7&%#N1ONJyv1P;Bk=Ca8HZ-x^q2vhm3)!c%m+%qAA36op9eP z;xo>%CwnMNQFLTz6nQ3>B6L-+tNyDzYIO6>1eI5XimHW$m!3%@^>R-S`x$JUbLduw z`YZc&64TC?!4^fn7_$h?#T zA;oe#=}LxD_Tek@bsxeHU(8p46LP^Hsfh%`jm`qU1`&1vCy$YVL3!tkXtyB9j>}>O zFG+uLqqqcPS>SkA7vY4q35n-7hAA2g=dW;81U4iU%2ARKDYua=ev&62*Pr?%3$wGYwjN4HCmwosw|%WG#}OW7v-e#WHH_=D z%CW}es(1d_WMwpA(Lmwz$i#Ie=>nUq>}E^H+pVjXnuBQf4@Ca?rhPHE6;yb4j)Etr z%i7Qvb{p0m!Y6439R;sC-;{SU9?$KVpCgRWI{I3LWe-GDYg8 zLX@u5*I#FeT)6V3B1Df%uTa*Ju6l`R|F?~jFwj(*gAnohR+L%#Tq}=}jG2*9o^r1~ zDSb}W4(_whYYiX{E%w8(AZ3JG!$9#cGp~v&D8YofxWor?tL#+h)G`}WwrwT6)^0f- zn3af6|2D1pV170I>OJL#jV1*~@&(Nl&RRAml>H(ONnYa}+ z>#k8+`K=i*L4#MnpI0&Fd<1(tB9`80pXdI8!yxxUQ4AV$f@}DqX5Wd2Or~ypTXj)m z;fay$yqkB;*YBKecgob|`9MT6Ck$RaPlC6R=SwL9<@QtB4?OX1y#9X$BsB+gI`Hvz z)R@(%lxY@HU*FMnc_*!Oyt)Fog3K$@Sa(9VV63P3+^6+0X*oe(W510IH22*hR1`mF zY$&_HfjNc``DOVPXh%{9-Nkx)rx=37X&W0al$;<_L0GC9ru&|{{MvGS{1NZL?Iy17 zC24BJ;H?WUd<9idBt@X)GA6{N$uk856H-Oe)-Ujr3qc&u-*ZORh(-WNTltBax!!SL zisOOuCbHiqKK?)Ly>(br+uQ%INVgy*jWi-40@B@$Gjs}wG?GJicXvt-NJw{sC?Udt zbW3*(&2Qs5=X1{U`JU&m-@gynTwEJ2m|1(Twbx$v{eIo=bvRqUzTTDh>M^TY{xI}M zJpC7~Rr3jBk)OiomK}?Oi>wi(+aD@^wvT|>5tqDC*QHEnqlE-E36G+zyF1IMtx%UR z#{Hb;`KOz&0+<+|(Sg5e| zd}7NR;%lSt!4{4wpWu_TEQg3ihO~J)NNMU}My1;s_vi!Fjg;4CWXgZ^Xq; z4$Gv{@5mCgwAE+t4xTi!%?p2VK~YvkRY#S^9*@vqYztNqFO8J)F1vzz*ecpYhIt>a zj*QXE4nH$yVj4R!c_@_4ud~kx63rK5G)h?I`xP>~v)gpanfL{a zFBGX_S>$=jIyuE|N{#OYy6CF`*kh^a0Rll)+9)H&1i$Nub4&9*$L3%f?_Wu*$4-0D zM{2qc8lN#JrZM&+sEy}I@>+ylUx|EaS-+VgjZR_cMX#g~BOb~Wxodv`U;8^JAc7!H z^FWy*fmeFIaNwoG28%{g{e7fryNk1K9|DHF?jB@Ct|CtO=FznK0w2%VIypU1W(VEB zKGg}C^xH3iL$!`Y_sQY#<<^P7-ba`O=#i1qFCO8D|Ijl2(#%DSv3|^zva;p^P*Z3P zamvj-G$HHiZ0aK`zA;Ef=wbw2jVLT2tzITbyQcN4OXIorb@%HentTkxXYC8lL9)cg zGL?}Fu0KuWUx-xCUxsb@O4ZCTmzb*Mf2I;}=N9DDScf)kJ*&vC{iFi1WqpFTfhY~+ zep_-P*3$>>)*^Abt_>RuNNnFhj6@So>AQxLLbFyAUW4`La~S6BuvW74RY!}DdOo64 zK&EI`yV9pA!=s}&XUcdx#?d_u$hvJAL6J-G-^B0Df`FIrDE)UTUUDjs5pL90qYRXv z7(<=ke+sVB=AWv)!W4*tZ#xhAi4s6fTTq)GDM=@~n(1f6zBd)+D$>NdRzB37IREoV zSOE9QlO_SiN@5rg8>lmr8^uJSj0%uAe#DDie^jvUvLh6{ees!}5D4PJ|UqRx~eQ1T_nv-*nqPw`a_KTDopqY}USH z6!hJkK^*&|SypNhkEl|wU^C0f)jQXHlR26w;%1MF!hi@p(1M3~m7m5$(z+Z_t|$1U zrf2t^aQ6ke@A~LR>17T~oT?rlXM(|FFHyw2+HJX$+v;k3Cw->oVTDQ9wJwcy=`5$> zXp9Zz`pjyzUw=j;Ti%^afcNQ^VrD!Z!K)hrs6rLVNmb#mBt4C1Zc`m4H6eYS{{PuX z1C`#_xW8QJu@L=++Uzf*{uv>v7-G@BCdJC>syf~TctL^I^c*D)M2TC2`GDF54U>i( zxpp4Y-zAlsk+enNXj2j^Eh8Mf)tuqlpOh^STs`bw0OGE9Rg)U4=ij#ERCD@v8++KVea=LN%5!sQS zJ-G&!uGrb$4`c1PArXH<5$t`aAQ@OEDUUAaIz)wuIW0GkbeoDy45cM11|Jd4Dt5nf z49K9GHT&PR0MdpwJ>3NLH7#Agg)$?AaR34qHe7_fq|-pgD>lXr?|dzW?m=>->*N2} zn+lJPp}z!4Iqrm}^CIvV>rom9Z)>4EU`shm%fuqwXiF6pj0|EBGhk1VGB8B#KY3N= zj~gT>eLjCgaKX&aFWVMeDLFaunj%EE*eb*;6-Coh2Z)TyJXhR-yNby7DH;doGB3sa z(rH+RVBdi)sjKVPq+gqoKPOP9-jTM5H2^>aL3GY*R%}Btg!aRO9zT`n7IhZ&1~2c* z8yIs*mJNOuS=p^2rF!@NKZ^WGRQ3=mI_38u+ z+`S{E43MjpXL(}A(1N~Jy(w6>r2-PL*wMu-$`WF_-{@ZQ8n+THyGbE<=%TPga15Fp zyZ6h}-dgmkvEsu`Yl1B?uD%W{O=M{uOdR*y-K5I$qV~;qVcnQpmf4K0AM2^KY*zGb zi5@llp#j`iMF8p<9S(AN+_#j&)8{-Cs2C7L5*N5&^EW!c{$;98c=trEfG?nh+NJws zlS7S{Sw0f~A)^1QK{Nc7(>$?%>#9SU?Q|g?pWpfcFdhDY| zxm*W1VtI2#tGO1PU1VBkGI1yRZ`{usy5!4tCBBJM+dC{$bLtEW#$7ALh`ze?7k$-& z_Fbv~^DA|+B4H=G*mzrOq9+ctuoV!4nl4rIRtLLyyTs|cOzFd32MTCG>{!1jCwdJf zrQS{PS@m+ZD;8(6IaqlBE|D7ycE|66nUh-hapUpujB6ThAG8a;(QO}Uh_;#+P##L% zhK{>bmngR0%^yC5``#UzDa*b*@L-*OHqNg)E!N;-qyHI#YWkjyUQblnOFCv`13*_p z8CSACqPL=}dtXL>KgC{p|K-jEvppP8Lg8znFTXwVM5<0K)t%Qu9T4&=o3_NirwG-^ zxPLN%pSYX+=(PBPL(Ce_?Had8(cV13R0YkuZdz5bUl_j3RB?;G8W4NzgL@mSA`;Mj zVc7{R{U^jvbuw0_s>fg-gQLMUv&XuA=AYfv_rA&K<9yh)UvoO$EHXo$ebjo|Tw1Dg z%WAUe%`is$oWeL&ps|m~CXU&MvrzWjpnCci=IU8-HW8$y56UQ17i@I46Ul*=xxXh2yp&+ivyBc+=C+aU^$S`Dx+_cU867)$9cL}|^16a#fG&f5N;OTOX zeZlazi&GZnHRX137j&!9#%VkJ9xCvBldWfaN)I)h<7IPX>MxA-ZJ7H$IT-Mb1F^;h z%Lu55F;>&7NPm2d<9*((db(9=>V}*3LTs{rUb7tK_&v`2+mzGb*MaO*wz=3q(s|bK z@DVWY()-xeDhmmf1kysphwvUg^*-mp+Gkps3iXDc56#q_mJy~29OiD33V;_sKsPKi*D_Iaj4dP|?N@zbpjJOexB6Oe- zNbRDvzEB4$*GO?Kc%OP6*D6CU^P1Sg{1Ot^O5zzTZU}w+T<0Hug)gD>kIS>MP3SA5 zo(2Gw$um3?A~tn^!9R?_Uf7d%vZ+02+j%?Lj5e}Umv#PycE(2}w%P2`(sWoqWhNOr ziRonBtk6{-)_J|dG=0Xxo_lOv1i%VpexP9cts-=!Fg!TySp9O4L^f%FI`neIX8LKF zB_9POimW{D^N6B_e}I9=dCDseZ2?E!Zd?dX?(T$+3oMa^=j8cky}Lgd+^I5hGcJ74VxUttVl^O-VRk` z{y9X(6&?H@2Ur*0?uw$>4!&_%%Qa7fMCJ+(COy;QkJ=A{XizEO`aAw7CH)Xjg)f14 zNzT%Q#wZDLED_FAh_>Fl|B~Xsa+R8FK6zrxM%@{xM|?a|MuK<7Bk4`l?vGo2s1vfk zK&0B-1l96nozH38lf@MXnx?c|IJixk)xqAWa0Ca$e_3}}-|~wqBg232>lRfR#2_Bk zHLzTQd`!RR5A112p@H8^>YQ;sF`Q6o8Dc3Ycm~$ZJmdMXZAaM=5PGN?7M;C3={a)3 z39P8C=l1u&EE+`bZOuTlfx#U1rAB@Q+IZRfKR>8Cg&C3*Q)mB-B;Ac0W7Q~-`RN^< z!Kqt;Lg$DNSMvP8hX#MbRrg>DF)GzQ zo}4B_m^6+66c@pd#P*G3|AHQJDG-&cTl23Lhs1wReT~MILNhOw^2s`xU5G5%OeVvO zv{CKHrSNUg$(fcg(X8Di&bIUnvXAo6l}9J-^D^qUkf#paVl8{e!Z~YdNvs=LW?h=#01fznIvx!+LNIusjGXD z4cqU)oY~$N8c=;gKtR_8slUw>(R857V);deSs+}9was#Lm&->UCiUG<`GM@|-StTQ zMvDrix1(6s;tNa*24DhgFe@nN-5el+*cgcoPI|hkWMVJMTTT!{_dQ$+uyb#Eg{?Gd z%g)!OY-ftROSqWbK#fLAf0-Ns=mWjal!*W%=BW|2<}T(bM74{|n?CnKWu_axbYT+L zg*;8sMmktY2$7tPAu+zj>J?k_z*-|d*TW7D`zTMq@W-?lJL3aS!$84Va^U^JfIEcSINY>D=OkyEQgtLP=l*%X&(#z z7jXeRCq63sh`~0pAD#W@J*mXdsB*7$+J$nWDH3ta|MM)N#oYwLY{^T4j+Or`$%(lT z4vHqWeMg@GivP(^hmpVE{~xUaeo2V% z1p1u)Jn3J~`F@#XcmhCkPX*6re;304hi&`&z$XwWT*km`yLXxXw->P>@BvcMf^dcZ z#Uag*8X)=*{B8ffPycg?eji9h1DxHc@rdA`kk3DR^!KqQszPPU`aiA!F$cnjG5S&_ zpw?m|RF&Dn<8F59blYXz9|h-TPr7pY&^>tek6ttEL6wk}F8Q$1R|0Tok7tVN$s;L+ zm2!pUBIB<>6~LC2RrQKnXsvQbWUVqy;A^FehIl2B$LuduXNyiK<4cjq|#AbEMS1v6V);Gt80)(Gsz z4fqU3K0wTkh=8Pu*a_0lH+s6L;Ean~oBhZ~Lx)#0+1tv*O@6Rn=0ao2u36+IIso)bWc~IgoM;^i)MOeAdNnugm2wtUlo(5w*0TGDQt|tLPfX)etnl05 zR>z`Q{|%s>O_>#;c&3OqdX@2$EAZn><_AjueDau%;mZfZ40|0!osc;3+HfM$@w8e= zKmszipBo1t3mfd(0gfwAbg=Q+_)*6n0SHa(gLm1H(l9|1&|H0hoI;XQRaLy{_v}K# z0iWi=CN0miO>?KsA6Td7Ro+V&orX;x#&lWL1UFoZl_)CIVO&Em<>&Y3kdh(ZfaAq^ zHJi7kLeENeW9PH(_6@%?wygT?+dGsv_;-i4E-Jf2f zVD)+2+^yKJY%*`sP4b>G@hY`mYNwvz3bD>Bbep~@lql8E*UOV+UQO^@AD?ec?!j-= z3xM`B)A6bU+HHOk>$hb0ZQ8k__N(^#$f-&pgA51z_;G~BcH?DBARA|s^`ouLasub{ zl0=T*?w39z0<6BRRToY^X;2LrR3x%((9qY)`(dV_LFr|uD{yhiFfn+0?TM70$^W8w zd6@(%(F5(uBiXucbn|YfP@PdN4l5oT^8aJ%4WUIyOjHDr&94uGF{`$ey(+bbGSf>0 z(~~Mv3V^DH9iQDGtv(Zy?Z7iQ*`j zh2vsyhc@-6?C6zk9Q(yWyL-=&f9aV`sm1%(%)G65Cp|b_Qy3Boq)LZnI8q_4qw6*R z3_y!_lm<>Pz-b5;Z}l3)MwuBlVcI)NgFNZtv>LgUbCMG%o}Sq+aV^lYIIcb(4@*Sa z>Iy`5x*Y%BqZ%=!t<6XK#IdPu{u>)N_6(O*O27(BAk3b72Q0Sw?%OKSP97?ouljq;zEgisoPx{f5-;hj=^HJB+b}RlF7=3DVjg3Xr zt46Rbgw}?-v!tfyoIcJ;w7EDKgoERy>?}XOFY1Ri|# z?6?OK5#yEVuxjq6a8p-yR%05`A3PUdHl$UuHs1p&D!PoXeN%+)X_xN$hnhdC2$U=V zQeax)Ab02FZBcuBxiV&!^a9HKw=49eN&}67?ES|5Q1C|q#HbU*sM_{Fyt~v9WVmmJ zY+p=-+ss>Ov|rY@;$`h#D%RVqZ+ik={9x1YCAsa)3~N6k3iDzT>kxiL{vn^L0A8Q*TP8BA&{;8>Q*=BoL$X@D`yL^a-XtA7ZD8_1Ki;cV3k%LgHQC-%K zHjqcNo^c!Au8VE*1A^VG3u+1;s3#mqu$foNOK?(vQt`StsQEPZ%y3{6Y$KbgAbz33ih=@8SkoyT4MVI z4b#C#N4^)U6~vp z-{W^*j7-WJ8}InvrB-N!fI?+Cwovfmgjs|YHIlE6!pDq&%I@=sh6@oIi*j|YE56l- z+x{PJaz=A&#^(3%kT@<7N1jJu7={pw?LF7jNq6bQqnKbyDdvo-gj#vX(TXf>hCGK`dFv+YZM#k{y6z> zIvczy+jDFD<-X|IW2;&fg6K0BwOC~zg3=(Fw)48s{)YrKaoSk;1`Sdi$X|x!@eVhA z1BT^}yeWg$m$V1QLS@SoQeTUEJ=YZmR{Kw&ms;l@!MK1+BVGu`QCfiLxsK3`S-1bJ zVa+9{=OyU0o3bL25@wEGAnkooafQry8)DnPFd6sYa4k8x__JyCc(m7NrJI`tPdYgl z?}h;?oVi`gooLdihm>E;9^lm@t*!(acLb}faOU`bY@r&zph{q!e>oQZkVEVea1WP? z%M$bG+*zEAtFUOm9FRFQd#*>%7op;`Mz`f?5Vz?A5bMfBptNmo-G_-rS$j| zeRCLL8^`H5hpGM%sg zosB-!jq0N7VAg#@B~cd=m(BZhc^vUDAUsjdmy^x~TnC|3QU{7#zp~|`dwxm`#MM+}USmX>~kYe29wkKqX}9j0voB>T{!465~7N3%C-#S%_s1_rC5e&-q~N zoxw(aL``XiFnrJK0LDcC4T&O@&OM}RsZP|mxRJW>{%|WbU%0#A1}KWyYF(gAl&Eo$ zrdVX$eLUaB_yM~#CUqY$M)*a~Xv7$$)!B8%!<1xT0nGNhswx?_(A=Sznw`E7yZXUsTP}<=t0W!v2W- zZ@W+IfbtbRbKHS7jt^DuWy@Dz?x;lP$A?e>E>HJtqWh%e1q+YC@kJO1VqERrdC~SN zm%h8rjp$zgL@0T7WWX0>yH$2%?EZ{n1^N5d&?T#4}I`0HiO^Zt!>3B<;F5kMh zpD&kru`|9Hi1DD6eaT4<+4)Q^b=DsxclYvW)657S<*`$I!iK>mbR&on>9W*;;tv@d zC+YUVKp>bsv9wI)*F8(stJvo8biWxIJv>V zA!viL!9ov+qHstiR({x1GM0NcZhDP`>aXHXA6PK z$`>g?3%3~Sq>k}yvI(eht
    ^$MUGNhf|<2Vs}9G>N$gxaCU<>vu9j5+NYKi2>y9 zo_sks6I_6&>&f0M^wwIdn~lGh<#`4c`~nb;$Bhm%TNOSV8;5+)J7{Ia8+s76 zxV5>pZ?x(>lAf~h#8to(;B&YK#^F%!g{yhFNh*EhyOoc9C4g%d2r4wbMQL>~&AL~K z6liV{I4FfEU;NfPqeA5W9qa@Ik$j-J@0|}w(TrmK(W-rfFE%mt)UV+CWTSqGQ#NI7 z%c8~SvYQS9x;0-G@v9H#cj^+PgQ?+&b(WUR>(*~tuQx_ZwI4XlhOqpRA40|jQpeXk z9c6(j2ZN)wH~WV(LS#YC9G$l}!djnNvvJcjSY0D*xNA2T+#s_ZEL*3xi6xP0hFd(g z)We!@f`cNY`o8J4=Vv<#|Io7H=)1wole8qx<4pML5G6X9$PQnr*}N^x&|IYNxIIC!V5FCBZaSB&uBB+ni+EIE^{t-iG{XFjSEpV@UAA zyI3V4TXof-i8~;`U*BbQJ#2JKxvnS3cw!EE&hYHvBF@AHFsL zf)@yNiZ*$TI>w} z1en~8Zkl;t)?CiqHG$C`UI(||yWi9lVMmcH&y-z*oTSA16cTwIB9@N$Oy%11?e5x2 z)$|)q=BAZ1FcdaA!z(Ho6~(UXSEq!v%B!ULzzAIku{!u!4sT4!0t2>jD23E{Bp5n+ z)awV zK-0Yh1Z)umPx7~BLHnU7FoIM`A0zg=_M3e+C{1c3w-`a(L|y&Do5LScm4JI6{h#iA ze+PhrDD6u?B3%u+p9wwDjr~nZDhb=8s!k1$rx%>K=M<4Lfws${j67^pX3tUt0~L>q zam@uPJ-EMO{gKK+#`R$|ZPBGBbaZx>e@w3-`Qf$VoXzf!1>X=;ys{PkZi1#LiA@0g z;->}8zNjJP4aJQ+2S`VAU*r3_IXYT8ppKq%qBU;U z=dt;C4LJ@8)NIx5$f|?HViwRV@8VyD zhPSb&Cnqc$s3ktBPC+DX;s4t}%*1&IWs?!YLT zgqI$^d)hv26i>HVQr||M%N+STy=-WQI9-5l9Rvyr?Cn#sM+4K~QYGVLF>P(@#WPLl zf_G^^Sjk3sC_z_!vCm-oE)Lh4k(cH9BEHhtEmn5XALRD1qwfnhDr$e8wO?1HOKhZ- z^+rpD{%m|K0u!kqf4W4VUco~q-=M8z^Lbd@Q@^EN+2CVfAOOxST8cb zw=XOvv<0S`o-jilHH;@pMLnG{fK>YO(!(Mlf#diTKT zW^IA=gX1YikB%_>+GE$%squ6BAUz&-Uc%Mx#BdHd>(xrcf8VhE2-!1gCtWE6iAF*? zC{s#rpHR?u^|JHZ3glDB--i05l%L-a$tFJTUi0{z4MZ@;;Xo-gxbH_csyZX&1E3xb zV1O2qGaoUP20rbz8l--*X6}rY7Af9QwoA^%Cto; zgAC+4nItlMT(S#yK!`Kieft1i=pkGDg5(U6mm;5Qd3oMBr)jz!e-7N_V7I_ac$QG1{qf``^ zYUo@}4}Fs#O)M-cczvageS~$jf*JK+6J0+7rDY};U%v|@M z$?;mPW(SyH&?|9`hkvh3y16u;~%xUsZPEIrpsfS`sw8=OcmT*;eB-pM|f0TMj zAw!mJ%DDL6udPxZx(aYp8r?vhAuGmm#mG-U(1?}i-+zs#69#$7l+;*p9QgqH!sFckd0k}ONt8^@)We7Sbw&;Iz zJdqmMarC?s{leXoEgh}PBt<`fC@vc+U)+WGZ6LnZYZq6)8+A=wa{|aZ@!iFY5m7(k z3ZHx<_0F&DF87i$Pi6-**WgPDl6ZMn`HQ<_tfileo&Gnp0K8YStGLX)&u`t7mB^1BcU36^4@u5{7+Ejzw5V>ORE17m*lmvwN$24!z-RPQ7#gkE1q&T)$;SZ>}Wl zi2j!zh~)#q^r*@XJ?_kWZY{U{fj=_(+`sOS_`NYtPrn*v-f@B00i3{fDaoKq2_V#UrwpvoDzE^<)^HL29z8EUpB}7Xp zXsXXiZ3$J~sX(@~+nk;Ir}H8SjIN6e`XdkPprcG+<D3@M{?)E#L)J&kbPdR;poO z0PU7+8JZpeO#5Pd2t=`e^)EpxG#mbJ9dw28Z09iXV7d-1FnaE1#fT;D3> zr&WgS&kNCBlp(8ovBbLOhcjrF^9gL;RUp! zy$bXxS=0l_Els!Y$CaxYc`1BcT|&;KVbLJm(sJ*4d+*Q}SIvBWhdM>M{zm4%GWWT| zW_vBq1BH!KRO|v(1SaMyiSwVyvU+vz?rf-{Q6~9wuuP{~B zQAWDdky7D1oRKL{L6c;1{QZRzH6@SkzDAnQit6{_{#6(*zCc3i=XFD*$KTT7B3~$| z_nmqL4SC2_#&`C+eUJZB8nl`&XqWCS5%Gx{P8S z2;{Qd`t*tiWuq_rzBjk?)8Lcey0Udz5`(oADVQern{1=AlaiDGe|zO(4FjD#mg7Vj zo9EX{LX4-c9p{;;zT;ETyrm-edb({*$n4vCvokgpC(a?6`;<+8C8{@DYm1D7c9UZg;S|*dfW$R<-GfT)vB|D8$!4&^p#qDkBah5%lKznItw8cx4=f>E}7^4g}}qIQpFICl)7w)-kH^xz;A^|IElsTaAeM4GrPo3;Q>}XxfhM`dFZ^5lfG0>| zWjjT);^|9Np1XZE=dX{trg{Y0uETRXF^q8QX}xs-SQE+dD) zM!ruGN0^F~VVC4fAC4p<+YIv9AiqNKqH_;lQsXoSvx@}yrzAgkfQl$9AqrA01I#zn z46OOr8G)kPFLr0n6+Z6|_x7<%vu}5pkW_670(i4xTl8)rkr%#3nmnRE>D4*_%|b#s zh8l-ezK69!?OezFMGjb|M?GiDp9!<}!m zQ!Ur`INRZB@6r&Q2?-b}_cpc9zh|8uzR!yF3F_a#dDt^K96#k&+(o>h93v|90;=zd zYo5^KCLOI0a}~5RCP4!dQ%v!H)BuuNO#UwA+|~T`i0#>`xt}JCiQ;n#n5<;sH1>7; zYnNjE6dL^JM^;o~`pF5RM4}_nvkcEhh4+4MMn{wQ;715m^2qB{X^|I{MFRu|5x7wJ z`QbBiq-9H;=F<%fdo${5avXtAc+QY3=k=INllp8sy`XE*-6mVsr2fEun}cRcElc;Q zN>J^BOs0>A$wAK*KqwLAjtR-$RXWoIkS?5U8dyZi-QnB-Cdpl9EDB9QsT%myEGhoify?{~?O zkZ*6Yg;|g+;$S6jxV8-LTy5Vwu_L+}2QUZS26hY(v*?KsBfo7F@BK-+&MEp|bI&U0 z(O{$WeL#Kx@*SnCwBFXr^bz8+ZYn?b+AxG|I5YN~MIk)rtd0l6TPaQ(S7|@GGAzpV zEqV(6wO!|b;VeGSd}r#L$D?+Mo-i*a0y_{jSksp4vJ2}}PgNJa{Z3sR+ZCDX9cy3c zn(^;M4{jc!!Um-vRO|$?O6Pz16Z3n(XqsgG@ZYVgL_+X@tw8b^g695mOaAK||2$I} z04iesG5k6@`QND_u>@ce!4>4#`O9YHZ(Qj2=}J5WR>85(eXcG4O9S(O1_o|~8rA<1 zUH|uYsviK96jsAIyz=kVkuNSC&_D@g%;tYsjs5eZVx@fkiGu!D9{`F4BhWxu~GbPo7n&7z3;DuNIqbNMqqB1(f_YIO^P5; z%K;4x$s%?R|Mx2l&_97tV2@J){eN#Dsw&Vxv6G(4{~H4THw6AU^8Y@@{l8h@|Nks- aC*1wqW#snrCiDUDB`c{UQ7&fa_x}N+)B3mo literal 67506 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 A9smFU diff --git a/content/copilot/concepts/agents/copilot-cli/context-management.md b/content/copilot/concepts/agents/copilot-cli/context-management.md index 5894159630e3..f72fc19d375c 100644 --- a/content/copilot/concepts/agents/copilot-cli/context-management.md +++ b/content/copilot/concepts/agents/copilot-cli/context-management.md @@ -34,12 +34,15 @@ This means that in a very long session, {% data variables.product.prodname_copil ## Checking your context usage -You can check how much of the context window is currently in use by entering the `/context` slash command. This displays a visual breakdown of your token usage, showing: - -* **System/Tools**: The fixed overhead of system instructions and tool definitions. -* **Messages**: The space used by your conversation history. -* **Free Space**: How much room is left for new messages. -* **Buffer**: A reserved portion that triggers automatic context management. +You can use the `/context` slash command to visualize your current context window usage. The first line of the output shows the active model and the number of tokens currently in use out of the model's total context window capacity. The remainder of the output shows token usage, and context window percentage, for: + +* **System Prompt**: the base system prompt. +* **Custom Instructions**: your loaded custom instructions (shown only when present). +* **System Tools**: built-in tool definitions. +* **MCP Tools**: tool definitions contributed by MCP servers. +* **Messages**: your conversation history. +* **Free Space**: unused context still available. +* **Buffer**: capacity reserved for the model's response and headroom. ![Screenshot of the output of the '/context' CLI command.](/assets/images/help/copilot/copilot-cli-context-usage.png) From 346f3a29f14f89a09c6d3843735249f19da09233 Mon Sep 17 00:00:00 2001 From: hubwriter Date: Fri, 19 Jun 2026 11:58:39 +0100 Subject: [PATCH 06/10] Copilot CLI: Update the rewind functionality in roll-back-changes.md (#61760) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../use-copilot-cli/roll-back-changes.md | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/content/copilot/how-tos/copilot-cli/use-copilot-cli/roll-back-changes.md b/content/copilot/how-tos/copilot-cli/use-copilot-cli/roll-back-changes.md index b6f272102903..023c4efb4e76 100644 --- a/content/copilot/how-tos/copilot-cli/use-copilot-cli/roll-back-changes.md +++ b/content/copilot/how-tos/copilot-cli/use-copilot-cli/roll-back-changes.md @@ -1,7 +1,7 @@ --- title: Rolling back changes made during a {% data variables.copilot.copilot_cli %} session shortTitle: Roll back changes -intro: 'Rewind your {% data variables.copilot.copilot_cli_short %} session to a previous prompt to undo changes and restore your repository to a previous state.' +intro: 'Rewind your {% data variables.copilot.copilot_cli_short %} session to a previous prompt to undo changes in conversation history, and optionally restore files.' versions: feature: copilot contentType: how-tos @@ -18,34 +18,55 @@ docsTeamMetrics: When you work in an interactive {% data variables.copilot.copilot_cli_short %} session, {% data variables.product.prodname_copilot_short %} can make changes to files, run shell commands, and modify your repository. If the result isn't what you expected, you can rewind to a previous point in the session to undo those changes. -When you enter a prompt, the first thing {% data variables.copilot.copilot_cli_short %} does is take a snapshot of your workspace state. This snapshot allows you to roll back to that point in the session if you need to. You can trigger a rewind by pressing Esc twice, or by using the `/undo` slash command. +You can trigger a rewind by pressing Esc twice, or by using the `/undo` slash command (or its alias `/rewind`). + +{% data variables.copilot.copilot_cli_short %} supports two rewind behaviors: + +* **Git-based rewind**: rolls back to a workspace snapshot taken at the start of a prompt. +* **Tools-based rewind**: lets you rewind conversation history only, or rewind conversation history and restore files that {% data variables.product.prodname_copilot_short %} changed. + +> [!NOTE] +> Tools-based rewind is currently an experimental feature and is only available if you have used the `/experimental on` slash command, or the `--experimental` command line option. + +{% data variables.copilot.copilot_cli_short %} automatically chooses one of these rewind behaviors based on your environment to provide the best possible rewind experience. + +To tell which of the rewind behaviors is active: + +* If the picker immediately shows snapshots and selecting one performs the rollback, you're using **Git-based rewind**. +* If selecting a rewind point opens an action menu with **Conversation only** and **Conversation + files**, you're using **tools-based rewind**. This article explains how to roll back changes. For more conceptual information about rewinding to an earlier point in a session, see [AUTOTITLE](/copilot/concepts/agents/copilot-cli/cancel-and-roll-back). ## Prerequisites -* **You must be working in a Git repository with at least one commit.** {% data variables.copilot.copilot_cli_short %} uses Git operations to track and restore workspace state. -* **A snapshot must exist.** Snapshots are created automatically at the start of each of your interactions with {% data variables.product.prodname_copilot_short %} in a CLI session. You can't roll back changes made before your first prompt in a session, or to the repository state for a step where snapshot creation was skipped, see [Changes that can't be rolled back](/copilot/concepts/agents/copilot-cli/cancel-and-roll-back#changes-that-cant-be-rolled-back). +* **A rewind point must exist.** You can't roll back before your first prompt in a session. +* **For Git-based rewind only:** you must be in a Git repository with at least one commit. +* **For tools-based rewind:** file restoration can be skipped for files that were changed after {% data variables.product.prodname_copilot_short %} last touched them. ## Rolling back with a double Esc keypress > [!WARNING] -> * {% data reusables.copilot.copilot-cli.cli-rewind-warning %} -> * Rewinding cannot be undone. Once you roll back to a snapshot, all snapshots and session history after that point are permanently removed. +> * Rewinding cannot be undone. Once you roll back, later session history is permanently removed. +> * In **Git-based rewind**, rolling back restores your entire workspace to the state it was in at the selected snapshot. This reverts all changes made after that point—not only changes made by {% data variables.product.prodname_copilot_short %}, but also any manual edits and changes from shell commands. Any new files created in the workspace after the snapshot was taken are deleted, regardless of their Git status. +> * In **tools-based rewind**, you can choose whether to restore files. If you choose file restoration, files changed after {% data variables.product.prodname_copilot_short %} may be left unchanged to avoid overwriting your newer edits. When {% data variables.product.prodname_copilot_short %} has finished responding to a prompt you've entered: 1. Make sure the input area is empty. If there's text in the input area, pressing Esc twice in quick succession clears the text. 1. Press Esc twice in quick succession to open the rewind picker. - The rewind picker lists the available snapshots for the current session, with the most recent first. The ten most recent snapshots are displayed. If there are more than ten snapshots available you can use the arrow key to scroll down through earlier snapshots. + The picker lists available rewind points for the current session, with the most recent first. The ten most recent points are displayed at once. If there are more than ten, use the arrow key to scroll down through earlier points. + For each rewind point, the beginning of the prompt you entered is shown, with an indication of how long ago you submitted it. - For each snapshot, the beginning of the prompt you entered is shown, with an indication of how long ago you submitted it. +1. Choose a rewind point. -1. Choose a snapshot to roll back to. This will return you to the state of the repository when you entered the associated prompt. + * In Git-based rewind, selecting a snapshot restores the workspace to the state at the start of that prompt. + * In tools-based rewind, after choosing a rewind point you can select: + * **Conversation only** (history rewound, files unchanged), or + * **Conversation + files** (history rewound and restorable files changed by {% data variables.product.prodname_copilot_short %} are restored). > [!NOTE] - > The repository is rolled back to its state immediately before {% data variables.product.prodname_copilot_short %} started working on the prompt, not immediately after it finished working on the prompt. + > In Git-based rewind, the repository is rolled back to its state immediately before {% data variables.product.prodname_copilot_short %} started working on the prompt, not immediately after it finished working on the prompt. The prompt you selected is shown in the input area, so you can edit and resubmit it, if required. From f949ea3c1f432984fe7cc9adabdffd33543c0552 Mon Sep 17 00:00:00 2001 From: Kevin Heis Date: Fri, 19 Jun 2026 06:53:27 -0700 Subject: [PATCH 07/10] Remove final no-explicit-any exception (MainContext.tsx) (#61695) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eslint.config.ts | 8 -- src/audit-logs/pages/audit-log-events.tsx | 6 +- src/frame/components/context/MainContext.tsx | 99 ++++++++++--------- ...or-fine-grained-personal-access-tokens.tsx | 7 +- ...-github-app-installation-access-tokens.tsx | 7 +- ...able-for-github-app-user-access-tokens.tsx | 7 +- ...or-fine-grained-personal-access-tokens.tsx | 7 +- .../permissions-required-for-github-apps.tsx | 7 +- src/graphql/pages/breaking-changes.tsx | 3 +- src/graphql/pages/changelog-year.tsx | 3 +- src/graphql/pages/changelog.tsx | 3 +- src/graphql/pages/reference.tsx | 3 +- src/graphql/pages/schema-previews.tsx | 3 +- src/rest/pages/category.tsx | 3 +- src/rest/pages/subcategory.tsx | 3 +- .../supported-secret-scanning-patterns.tsx | 3 +- src/types/types.ts | 8 ++ .../lib/enterprise-server-releases.d.ts | 1 + .../pages/webhook-events-and-payloads.tsx | 6 +- 19 files changed, 115 insertions(+), 72 deletions(-) diff --git a/eslint.config.ts b/eslint.config.ts index 874457e2bb09..3a72c57bc708 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -231,14 +231,6 @@ export default [ }, }, - // Legacy files with @typescript-eslint/no-explicit-any violations (see github/docs-engineering#5797) - { - files: ['src/frame/components/context/MainContext.tsx'], - rules: { - '@typescript-eslint/no-explicit-any': 'off', - }, - }, - // Ignored patterns // CodeQL scripts included because cocofix is install manually by the workflow { diff --git a/src/audit-logs/pages/audit-log-events.tsx b/src/audit-logs/pages/audit-log-events.tsx index 27e84296aaf7..9389b6be21e0 100644 --- a/src/audit-logs/pages/audit-log-events.tsx +++ b/src/audit-logs/pages/audit-log-events.tsx @@ -1,4 +1,6 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' +import type { ExtendedRequest } from '@/types' import { addUINamespaces, @@ -60,8 +62,8 @@ export const getServerSideProps: GetServerSideProps = async (context) => const { getAutomatedPageMiniTocItems } = await import('@/frame/lib/get-mini-toc-items') const { getCategorizedAuditLogEvents, getCategoryNotes } = await import('../lib') - const req = context.req as object - const res = context.res as object + const req = context.req as unknown as ExtendedRequest + const res = context.res as unknown as Response const currentVersion = context.query.versionId as string const url = context.req.url diff --git a/src/frame/components/context/MainContext.tsx b/src/frame/components/context/MainContext.tsx index 2316958598c0..9a48ac250781 100644 --- a/src/frame/components/context/MainContext.tsx +++ b/src/frame/components/context/MainContext.tsx @@ -1,9 +1,10 @@ import { createContext, useContext } from 'react' import pick from 'lodash/pick' +import type { Response } from 'express' import type { BreadcrumbT } from '@/frame/components/page-header/Breadcrumbs' import type { FeatureFlags } from '@/frame/components/hooks/useFeatureFlags' -import type { SidebarLink } from '@/types' +import type { ExtendedRequest, Permalink, SidebarLink } from '@/types' export type ProductT = { external: boolean @@ -106,7 +107,7 @@ export type MainContextT = { currentProduct?: ProductT currentProductName: string currentProductTree?: ProductTreeNode | null - currentLayoutName?: string + currentLayoutName?: string | null currentVersion?: string data: DataT enterpriseServerReleases: EnterpriseServerReleases @@ -127,7 +128,7 @@ export type MainContextT = { applicableVersions: string[] docsTeamMetrics: string[] | null } | null - relativePath?: string + relativePath?: string | null sidebarTree?: ProductTreeNode | null status: number xHost?: string @@ -154,8 +155,8 @@ const DEFAULT_UI_NAMESPACES = [ 'cookbook_landing', ] -export function addUINamespaces(req: any, ui: UIStrings, namespaces: string[]) { - const pool = req.context.site.data.ui +export function addUINamespaces(req: ExtendedRequest, ui: UIStrings, namespaces: string[]) { + const pool = req.context!.site!.data.ui for (const namespace of namespaces) { if (!(namespace in pool)) { throw new Error( @@ -168,22 +169,26 @@ export function addUINamespaces(req: any, ui: UIStrings, namespaces: string[]) { } } -export const getMainContext = async (req: any, res: any): Promise => { +export const getMainContext = async ( + req: ExtendedRequest, + res: Response, +): Promise => { + const context = req.context! // Our current translation process adds 'ms.*' frontmatter properties to files // it translates including when data/ui.yml is translated. We don't use these // properties and their syntax (e.g. 'ms.openlocfilehash', // 'ms.sourcegitcommit', etc.) causes problems so just delete them. - if (req.context.site.data.ui.ms) { - delete req.context.site.data.ui.ms + if (context.site!.data.ui.ms) { + delete context.site!.data.ui.ms } - const { page } = req.context + const { page } = context const documentType = page ? (page.documentType as string) : undefined const ui: UIStrings = {} addUINamespaces(req, ui, DEFAULT_UI_NAMESPACES) - if (req.context.currentJourneyTrack?.trackId) { + if (context.currentJourneyTrack?.trackId) { addUINamespaces(req, ui, ['journey_track_nav']) } @@ -197,26 +202,26 @@ export const getMainContext = async (req: any, res: any): Promise // To know whether we need this key, we need to match this // with the business logic in `DeprecationBanner.tsx` which is as follows: if ( - req.context.enterpriseServerReleases.releasesWithOldestDeprecationDate.includes( - req.context.currentRelease, + context.enterpriseServerReleases!.releasesWithOldestDeprecationDate.includes( + context.currentRelease as string, ) ) { reusables.enterprise_deprecation = { - version_was_deprecated: req.context.getDottedData( + version_was_deprecated: context.getDottedData!( 'reusables.enterprise_deprecation.version_was_deprecated', - ), - version_will_be_deprecated: req.context.getDottedData( + ) as string, + version_will_be_deprecated: context.getDottedData!( 'reusables.enterprise_deprecation.version_will_be_deprecated', - ), - deprecation_details: req.context.getDottedData( + ) as string, + deprecation_details: context.getDottedData!( 'reusables.enterprise_deprecation.deprecation_details', - ), + ) as string, } } // This is a number, like 3.13 or it's possibly null if there is no // supported release candidate at the moment. - const { releaseCandidate } = req.context.enterpriseServerReleases + const { releaseCandidate } = context.enterpriseServerReleases! // Combine the version number with the prefix so it can appear // as a full version string if the release candidate is set. const releaseCandidateVersion = releaseCandidate ? `enterprise-server@${releaseCandidate}` : null @@ -224,38 +229,38 @@ export const getMainContext = async (req: any, res: any): Promise const pageInfo = (page && { documentType, - contentType: req.context.page.contentType || null, - title: req.context.page.title, - fullTitle: req.context.page.fullTitle || null, - introPlainText: req.context.page?.introPlainText || null, - applicableVersions: req.context.page?.permalinks.map((obj: any) => obj.pageVersion) || [], - hidden: req.context.page.hidden || false, - noEarlyAccessBanner: req.context.page.noEarlyAccessBanner || false, - docsTeamMetrics: req.context.page.docsTeamMetrics || null, + contentType: page.contentType || null, + title: page.title, + fullTitle: page.fullTitle || null, + introPlainText: page.introPlainText || null, + applicableVersions: page.permalinks.map((obj: Permalink) => obj.pageVersion), + hidden: page.hidden || false, + noEarlyAccessBanner: page.noEarlyAccessBanner || false, + docsTeamMetrics: page.docsTeamMetrics || null, }) || null - const currentProduct: ProductT = req.context.productMap[req.context.currentProduct] || null - const currentProductName: string = req.context.currentProductName || '' + const currentProduct = (context.productMap?.[context.currentProduct || ''] || null) as ProductT + const currentProductName: string = context.currentProductName || '' const props: MainContextT = { - allVersions: minimalAllVersions(req.context.allVersions), - breadcrumbs: req.context.breadcrumbs || {}, - communityRedirect: req.context.page?.communityRedirect || {}, - currentCategory: req.context.currentCategory || '', - currentLayoutName: req.context.currentLayoutName || null, - currentPathWithoutLanguage: req.context.currentPathWithoutLanguage, + allVersions: minimalAllVersions(context.allVersions!), + breadcrumbs: (context.breadcrumbs || {}) as MainContextT['breadcrumbs'], + communityRedirect: (context.page?.communityRedirect || {}) as MainContextT['communityRedirect'], + currentCategory: context.currentCategory || '', + currentLayoutName: context.currentLayoutName || null, + currentPathWithoutLanguage: context.currentPathWithoutLanguage!, currentProduct, currentProductName, - // This is a slimmed down version of `req.context.currentProductTree` + // This is a slimmed down version of `context.currentProductTree` // that only has the minimal titles stuff needed for sidebars and // any page that is hidden is omitted. // However, it's not needed on most pages. For example, on article pages, // you don't need it. It's similar to the minimal product tree but, // has the full length titles and not just the short titles. currentProductTree: - (includeFullProductTree && req.context.currentProductTreeTitlesExcludeHidden) || null, - currentVersion: req.context.currentVersion, + (includeFullProductTree && context.currentProductTreeTitlesExcludeHidden) || null, + currentVersion: context.currentVersion, data: { ui, reusables, @@ -265,24 +270,24 @@ export const getMainContext = async (req: any, res: any): Promise }, }, }, - enterpriseServerReleases: pick(req.context.enterpriseServerReleases, [ + enterpriseServerReleases: pick(context.enterpriseServerReleases!, [ 'isOldestReleaseDeprecated', 'oldestSupported', 'nextDeprecationDate', 'supported', 'releasesWithOldestDeprecationDate', - ]), - enterpriseServerVersions: req.context.enterpriseServerVersions, - error: req.context.error ? req.context.error.toString() : '', + ]) as EnterpriseServerReleases, + enterpriseServerVersions: context.enterpriseServerVersions!, + error: context.error ? context.error.toString() : '', featureFlags: {}, fullUrl: `${req.protocol}://${req.hostname}${req.originalUrl}`, // does not include port for localhost - isHomepageVersion: req.context.page?.documentType === 'homepage', - nonEnterpriseDefaultVersion: req.context.nonEnterpriseDefaultVersion, - page: pageInfo, - relativePath: req.context.page?.relativePath || null, + isHomepageVersion: context.page?.documentType === 'homepage', + nonEnterpriseDefaultVersion: context.nonEnterpriseDefaultVersion!, + page: pageInfo as MainContextT['page'], + relativePath: context.page?.relativePath || null, // The minimal product tree is needed on all pages that depend on // the product sidebar or the rest sidebar. - sidebarTree: (includeSidebarTree && req.context.sidebarTree) || null, + sidebarTree: (includeSidebarTree && context.sidebarTree) || null, status: res.statusCode, xHost: req.get('x-host') || '', } diff --git a/src/github-apps/pages/endpoints-available-for-fine-grained-personal-access-tokens.tsx b/src/github-apps/pages/endpoints-available-for-fine-grained-personal-access-tokens.tsx index 4ed5f5886956..f277786d7c0c 100644 --- a/src/github-apps/pages/endpoints-available-for-fine-grained-personal-access-tokens.tsx +++ b/src/github-apps/pages/endpoints-available-for-fine-grained-personal-access-tokens.tsx @@ -1,4 +1,6 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' +import type { ExtendedRequest } from '@/types' import { AutomatedPageContextT, @@ -41,7 +43,10 @@ export const getServerSideProps: GetServerSideProps = async (context) => return { props: { - mainContext: await getMainContext(context.req, context.res), + mainContext: await getMainContext( + context.req as unknown as ExtendedRequest, + context.res as unknown as Response, + ), currentVersion, appsItems: appsItems as EnabledListT, automatedPageContext: getAutomatedPageContextFromRequest(context.req), diff --git a/src/github-apps/pages/endpoints-available-for-github-app-installation-access-tokens.tsx b/src/github-apps/pages/endpoints-available-for-github-app-installation-access-tokens.tsx index 3ac0fccc0f76..61cc5c8a9598 100644 --- a/src/github-apps/pages/endpoints-available-for-github-app-installation-access-tokens.tsx +++ b/src/github-apps/pages/endpoints-available-for-github-app-installation-access-tokens.tsx @@ -1,4 +1,6 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' +import type { ExtendedRequest } from '@/types' import { AutomatedPageContextT, @@ -41,7 +43,10 @@ export const getServerSideProps: GetServerSideProps = async (context) => return { props: { - mainContext: await getMainContext(context.req, context.res), + mainContext: await getMainContext( + context.req as unknown as ExtendedRequest, + context.res as unknown as Response, + ), currentVersion, appsItems: appsItems as EnabledListT, automatedPageContext: getAutomatedPageContextFromRequest(context.req), diff --git a/src/github-apps/pages/endpoints-available-for-github-app-user-access-tokens.tsx b/src/github-apps/pages/endpoints-available-for-github-app-user-access-tokens.tsx index 4f45615698b8..3d49f73c7af8 100644 --- a/src/github-apps/pages/endpoints-available-for-github-app-user-access-tokens.tsx +++ b/src/github-apps/pages/endpoints-available-for-github-app-user-access-tokens.tsx @@ -1,4 +1,6 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' +import type { ExtendedRequest } from '@/types' import { AutomatedPageContextT, @@ -41,7 +43,10 @@ export const getServerSideProps: GetServerSideProps = async (context) => return { props: { - mainContext: await getMainContext(context.req, context.res), + mainContext: await getMainContext( + context.req as unknown as ExtendedRequest, + context.res as unknown as Response, + ), currentVersion, appsItems: appsItems as EnabledListT, automatedPageContext: getAutomatedPageContextFromRequest(context.req), diff --git a/src/github-apps/pages/permissions-required-for-fine-grained-personal-access-tokens.tsx b/src/github-apps/pages/permissions-required-for-fine-grained-personal-access-tokens.tsx index cd84db30b503..8e512ba6eb1b 100644 --- a/src/github-apps/pages/permissions-required-for-fine-grained-personal-access-tokens.tsx +++ b/src/github-apps/pages/permissions-required-for-fine-grained-personal-access-tokens.tsx @@ -1,4 +1,6 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' +import type { ExtendedRequest } from '@/types' import { AutomatedPageContextT, @@ -42,7 +44,10 @@ export const getServerSideProps: GetServerSideProps = async (context) => return { props: { - mainContext: await getMainContext(context.req, context.res), + mainContext: await getMainContext( + context.req as unknown as ExtendedRequest, + context.res as unknown as Response, + ), currentVersion, appsItems: appsItems as PermissionListT, automatedPageContext: getAutomatedPageContextFromRequest(context.req), diff --git a/src/github-apps/pages/permissions-required-for-github-apps.tsx b/src/github-apps/pages/permissions-required-for-github-apps.tsx index 583a234b7a5a..14de389c3c52 100644 --- a/src/github-apps/pages/permissions-required-for-github-apps.tsx +++ b/src/github-apps/pages/permissions-required-for-github-apps.tsx @@ -1,4 +1,6 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' +import type { ExtendedRequest } from '@/types' import { AutomatedPageContextT, getAutomatedPageContextFromRequest, @@ -42,7 +44,10 @@ export const getServerSideProps: GetServerSideProps = async (context) => return { props: { - mainContext: await getMainContext(context.req, context.res), + mainContext: await getMainContext( + context.req as unknown as ExtendedRequest, + context.res as unknown as Response, + ), currentVersion, appsItems: appsItems as PermissionListT, automatedPageContext: getAutomatedPageContextFromRequest(context.req), diff --git a/src/graphql/pages/breaking-changes.tsx b/src/graphql/pages/breaking-changes.tsx index 1224d0e54e75..b39033517190 100644 --- a/src/graphql/pages/breaking-changes.tsx +++ b/src/graphql/pages/breaking-changes.tsx @@ -1,4 +1,5 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' import GithubSlugger from 'github-slugger' import type { ExtendedRequest } from '@/types' import type { ServerResponse } from 'http' @@ -73,7 +74,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => return { props: { - mainContext: await getMainContext(req, res), + mainContext: await getMainContext(req, res as unknown as Response), automatedPageContext, schema, headings, diff --git a/src/graphql/pages/changelog-year.tsx b/src/graphql/pages/changelog-year.tsx index 79df6419c61b..99474ccf759d 100644 --- a/src/graphql/pages/changelog-year.tsx +++ b/src/graphql/pages/changelog-year.tsx @@ -1,4 +1,5 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' import type { ExtendedRequest } from '@/types' import type { ServerResponse } from 'http' @@ -64,7 +65,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => return { props: { - mainContext: await getMainContext(req, res), + mainContext: await getMainContext(req, res as unknown as Response), automatedPageContext, schema, years, diff --git a/src/graphql/pages/changelog.tsx b/src/graphql/pages/changelog.tsx index 46bc884988a1..1aee0f1921bd 100644 --- a/src/graphql/pages/changelog.tsx +++ b/src/graphql/pages/changelog.tsx @@ -1,4 +1,5 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' import type { ExtendedRequest } from '@/types' import type { ServerResponse } from 'http' @@ -59,7 +60,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => return { props: { - mainContext: await getMainContext(req, res), + mainContext: await getMainContext(req, res as unknown as Response), automatedPageContext, schema, years, diff --git a/src/graphql/pages/reference.tsx b/src/graphql/pages/reference.tsx index 1b8185a91fa6..bef78e785891 100644 --- a/src/graphql/pages/reference.tsx +++ b/src/graphql/pages/reference.tsx @@ -1,4 +1,5 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' import { GraphqlCategoryPage, type CategorySchema } from '@/graphql/components/GraphqlCategoryPage' import { @@ -114,7 +115,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => }) } - const mainContext = await getMainContext(req, res) + const mainContext = await getMainContext(req, res as unknown as Response) addUINamespaces(req, mainContext.data.ui, ['graphql']) return { diff --git a/src/graphql/pages/schema-previews.tsx b/src/graphql/pages/schema-previews.tsx index 5a1ac1beb260..f2eda650a55f 100644 --- a/src/graphql/pages/schema-previews.tsx +++ b/src/graphql/pages/schema-previews.tsx @@ -1,4 +1,5 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' import type { ExtendedRequest } from '@/types' import type { ServerResponse } from 'http' @@ -53,7 +54,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => // Update the existing context to include the miniTocItems from GraphQL automatedPageContext.miniTocItems.push(...changelogMiniTocItems) - const mainContext = await getMainContext(req, res) + const mainContext = await getMainContext(req, res as unknown as Response) addUINamespaces(req, mainContext.data.ui, ['graphql']) return { diff --git a/src/rest/pages/category.tsx b/src/rest/pages/category.tsx index fc8912b5cd1f..652d82c86342 100644 --- a/src/rest/pages/category.tsx +++ b/src/rest/pages/category.tsx @@ -1,4 +1,5 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' import type { ServerResponse } from 'http' import { Operation } from '@/rest/components/types' import type { ExtendedRequest, AllVersions } from '@/types/types' @@ -207,7 +208,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => // created. tocLandingContext.tocItems = restCategoryTocItems - const mainContext = await getMainContext(req, res) + const mainContext = await getMainContext(req, res as unknown as Response) return { props: { diff --git a/src/rest/pages/subcategory.tsx b/src/rest/pages/subcategory.tsx index b53d1d03f055..773ae3913861 100644 --- a/src/rest/pages/subcategory.tsx +++ b/src/rest/pages/subcategory.tsx @@ -1,4 +1,5 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' import type { ServerResponse } from 'http' import { Operation } from '@/rest/components/types' import type { ExtendedRequest, AllVersions } from '@/types/types' @@ -87,7 +88,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => } } - const mainContext = await getMainContext(req, res) + const mainContext = await getMainContext(req, res as unknown as Response) addUINamespaces(req, mainContext.data.ui, ['parameter_table', 'rest_reference']) return { diff --git a/src/secret-scanning/pages/supported-secret-scanning-patterns.tsx b/src/secret-scanning/pages/supported-secret-scanning-patterns.tsx index 152c7bbcd4d5..7307840715cc 100644 --- a/src/secret-scanning/pages/supported-secret-scanning-patterns.tsx +++ b/src/secret-scanning/pages/supported-secret-scanning-patterns.tsx @@ -1,4 +1,5 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' import { getMainContext, @@ -37,7 +38,7 @@ export default function SupportedSecretScanningPatterns({ export const getServerSideProps: GetServerSideProps = async (context) => { const req = context.req as unknown as ExtendedRequest - const res = context.res as object + const res = context.res as unknown as Response const mainContext = await getMainContext(req, res) addUINamespaces(req, mainContext.data.ui, ['secret_scanning']) const automatedPageContext = getAutomatedPageContextFromRequest(req) diff --git a/src/types/types.ts b/src/types/types.ts index 53a1d508457f..d1472f619b8c 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -4,6 +4,7 @@ import type { Failbot } from '@github/failbot' import type enterpriseServerReleases from '@/versions/lib/enterprise-server-releases.d' import type { ValidOcticon } from '@/landings/types' import type { Language, Languages } from '@/languages/lib/languages-server' +import type { JourneyContext } from '@/journeys/lib/journey-path-resolver' import type { MiniTocItem } from '@/frame/lib/get-mini-toc-items' import type { UIStrings } from '@/frame/components/context/MainContext' @@ -119,6 +120,7 @@ export type Context = { // Allows dynamic properties like features & version shortnames as keys [key: string]: unknown currentCategory?: string + currentJourneyTrack?: JourneyContext | null error?: Error siteTree?: SiteTree pages?: Record @@ -341,6 +343,12 @@ export type Page = { contentType?: string docsTeamMetrics?: string[] children?: string[] + introPlainText?: string + noEarlyAccessBanner?: boolean + communityRedirect?: { + name: string + href: string + } } export type SidebarLink = { diff --git a/src/versions/lib/enterprise-server-releases.d.ts b/src/versions/lib/enterprise-server-releases.d.ts index cab010afad08..e7405ea5b3a8 100644 --- a/src/versions/lib/enterprise-server-releases.d.ts +++ b/src/versions/lib/enterprise-server-releases.d.ts @@ -81,6 +81,7 @@ const allExports = { dates, nextDeprecationDate, isOldestReleaseDeprecated, + releasesWithOldestDeprecationDate, deprecatedOnNewSite, deprecatedReleasesWithLegacyFormat, deprecatedReleasesWithNewFormat, diff --git a/src/webhooks/pages/webhook-events-and-payloads.tsx b/src/webhooks/pages/webhook-events-and-payloads.tsx index 479dee096a8d..6c9cec91bbe9 100644 --- a/src/webhooks/pages/webhook-events-and-payloads.tsx +++ b/src/webhooks/pages/webhook-events-and-payloads.tsx @@ -1,4 +1,6 @@ import { GetServerSideProps } from 'next' +import type { Response } from 'express' +import type { ExtendedRequest } from '@/types' import { useRouter } from 'next/router' import { useEffect } from 'react' @@ -78,8 +80,8 @@ export const getServerSideProps: GetServerSideProps = async (context) => const { getInitialPageWebhooks } = await import('@/webhooks/lib') const { getAutomatedPageMiniTocItems } = await import('@/frame/lib/get-mini-toc-items') - const req = context.req as object - const res = context.res as object + const req = context.req as unknown as ExtendedRequest + const res = context.res as unknown as Response const currentVersion = context.query.versionId as string const mainContext = await getMainContext(req, res) addUINamespaces(req, mainContext.data.ui, ['parameter_table', 'webhooks']) From 9ac9bfaa78761b8746c60b5ed114b92f071abce1 Mon Sep 17 00:00:00 2001 From: Kevin Heis Date: Fri, 19 Jun 2026 06:53:33 -0700 Subject: [PATCH 08/10] Hard-purge Fastly + consolidate purge scripts into one workflow (#61810) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/index-general-search.yml | 3 +- .github/workflows/purge-fastly-all.yml | 44 --- .github/workflows/purge-fastly.yml | 119 ++++--- package.json | 4 +- .../purge-fastly-edge-cache-per-language.ts | 131 -------- src/workflows/README.md | 2 +- src/workflows/purge-edge-cache.ts | 62 ---- src/workflows/purge-fastly-all.ts | 59 ---- src/workflows/purge-fastly-edge-cache.ts | 28 -- src/workflows/purge-fastly.ts | 297 ++++++++++++++++++ 10 files changed, 369 insertions(+), 380 deletions(-) delete mode 100644 .github/workflows/purge-fastly-all.yml delete mode 100644 src/languages/scripts/purge-fastly-edge-cache-per-language.ts delete mode 100644 src/workflows/purge-edge-cache.ts delete mode 100644 src/workflows/purge-fastly-all.ts delete mode 100755 src/workflows/purge-fastly-edge-cache.ts create mode 100644 src/workflows/purge-fastly.ts diff --git a/.github/workflows/index-general-search.yml b/.github/workflows/index-general-search.yml index ef82ce76b22b..69636ecd3217 100644 --- a/.github/workflows/index-general-search.yml +++ b/.github/workflows/index-general-search.yml @@ -231,8 +231,7 @@ jobs: env: FASTLY_TOKEN: ${{ secrets.FASTLY_TOKEN }} FASTLY_SERVICE_ID: ${{ secrets.FASTLY_SERVICE_ID }} - FASTLY_SURROGATE_KEY: api-search:${{ matrix.language }} - run: npm run purge-fastly-edge-cache + run: npm run purge-fastly -- --surrogate-key api-search:${{ matrix.language }} - name: Upload failures artifact if: ${{ steps.check-failures.outputs.has_failures == 'true' }} diff --git a/.github/workflows/purge-fastly-all.yml b/.github/workflows/purge-fastly-all.yml deleted file mode 100644 index 4aa2745ce409..000000000000 --- a/.github/workflows/purge-fastly-all.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Purge Fastly (all) - -# **What it does**: Purges the ENTIRE Fastly cache for docs (every URL) on demand. -# **Why we have it**: So docs engineering can clear a bad cache state without asking core engineering to run a purge-all in the Fastly UI. -# **Who does it impact**: All readers. Origin sees a traffic spike while the cache refills, so only run this when a targeted purge will not do. - -on: - workflow_dispatch: - inputs: - confirm: - description: "Type 'purge everything' to confirm a full hard purge of the Fastly cache." - required: true - -permissions: - contents: read - -# Only one purge-all may run at a time. Do not cancel an in-flight purge: -# a half-finished purge leaves the cache in an unknown state. -concurrency: - group: purge-fastly-all - cancel-in-progress: false - -env: - FASTLY_TOKEN: ${{ secrets.FASTLY_TOKEN }} - FASTLY_SERVICE_ID: ${{ secrets.FASTLY_SERVICE_ID }} - -jobs: - purge-all: - if: github.repository == 'github/docs-internal' - runs-on: ubuntu-latest - steps: - - name: Validate confirmation input - if: ${{ inputs.confirm != 'purge everything' }} - run: | - echo "::error::Confirmation text did not match. Re-run and type exactly: purge everything" - exit 1 - - - name: Check out repo - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - - uses: ./.github/actions/node-npm-setup - - - name: Purge entire Fastly cache - run: npm run purge-fastly-all diff --git a/.github/workflows/purge-fastly.yml b/.github/workflows/purge-fastly.yml index f60e6f96604f..c78651c7161f 100644 --- a/.github/workflows/purge-fastly.yml +++ b/.github/workflows/purge-fastly.yml @@ -1,29 +1,50 @@ name: Purge Fastly -# **What it does**: Sends a soft-purge to Fastly. -# **Why we have it**: So that, right after a production deploy, we start afresh -# **Who does it impact**: Writers and engineers. +# **What it does**: Purges Fastly after a deploy and on demand. Soft purge by +# default; can hard purge specific languages, or hard purge the ENTIRE cache. +# **Why we have it**: So that, right after a production deploy, we start afresh, +# and so docs engineering can clear a bad cache state without the Fastly UI. +# **Who does it impact**: Writers and engineers. A full purge impacts all readers, +# origin sees a traffic spike while the cache refills, so it's gated below. on: deployment_status: workflow_dispatch: inputs: languages: - description: "Comma separated languages. E.g. 'en,es,ja,pt,zh,ru,fr,ko,de' (defaults to en)" + description: "Comma separated languages, e.g. 'en,es,ja,pt,zh,ru,fr,ko,de'. Blank = all languages." required: false - default: 'en' # Temporary, only purge English on deploy. Set to empty string for all + default: 'en' + hard: + description: 'Evict immediately instead of the default soft purge. Use when a soft purge fails to clear stale content.' + type: boolean + required: false + default: false + everything: + description: 'DANGER: hard-purge the ENTIRE Fastly cache... every key, all readers. Ignores the language/hard inputs. To confirm, type exactly: "purge everything". Otherwise leave blank.' + required: false + default: '' permissions: contents: read +# Serialize full-cache purges so two can't overlap and leave the cache in an +# unknown state. Every other run (per-deploy, per-language) gets a unique group +# so those never block each other. +concurrency: + group: ${{ (inputs.everything == 'purge everything' && 'purge-fastly-all') || format('purge-fastly-{0}', github.run_id) }} + cancel-in-progress: false + env: FASTLY_TOKEN: ${{ secrets.FASTLY_TOKEN }} FASTLY_SERVICE_ID: ${{ secrets.FASTLY_SERVICE_ID }} jobs: send-purges: - # Run when workflow_dispatch is the event (manual) or when deployment_status is the event (automatic) and it's a successful production deploy. - # NOTE: This workflow triggers on all deployment_status events (including staging), but only runs for production. + # Run when workflow_dispatch is the event + # or when deployment_status is the event and it's a successful production deploy. + # NOTE: This workflow triggers on all deployment_status events, + # including staging, but only runs for production. # Non-production deploys will show as "skipped" - this is expected behavior. if: >- ${{ @@ -38,52 +59,50 @@ jobs: - uses: ./.github/actions/node-npm-setup - - name: Wait for production to match build commit SHA - if: github.event_name != 'workflow_dispatch' - # A single /_build match only proves *one* Moda instance is serving the - # new build; others can still be mid-rollout. If we purge then, Fastly's - # soft purge serves stale-while-revalidate and may revalidate against a - # lagging instance, re-caching old content as fresh for a full TTL. So we - # require several consecutive matches to confirm the rollout has settled - # across instances before purging. + - name: Validate confirmation input + # A full-cache purge only triggers on the exact string "purge everything". + # Any other non-empty value (e.g. a typo) would otherwise be silently + # ignored and fall through to a normal soft purge that finishes green, so + # an operator could think they evicted the whole cache when they didn't. + # Fail loudly instead. + env: + EVERYTHING_INPUT: ${{ inputs.everything }} run: | - needs=$(git rev-parse HEAD) - start_time=$(date +%s) - timeout_seconds=1200 - required_matches=5 - interval_seconds=10 - consecutive=0 - while [[ $consecutive -lt $required_matches ]] - do - if [[ $(($(date +%s) - $start_time)) -gt $timeout_seconds ]] - then - echo "Production did not reach $required_matches consecutive build matches within $timeout_seconds seconds" - exit 1 - fi - if [[ $needs == $(curl -s --fail --retry-connrefused --retry 5 https://docs.github.com/_build) ]] - then - consecutive=$((consecutive + 1)) - echo "Production matches the build commit ($consecutive/$required_matches)" - else - if [[ $consecutive -gt 0 ]] - then - echo "Production stopped matching the build commit; resetting consecutive count" - else - echo "Production is not up to date with the build commit" - fi - consecutive=0 - fi - if [[ $consecutive -lt $required_matches ]] - then - sleep $interval_seconds - fi - done - echo "Production is up to date with the build commit ($required_matches consecutive matches)" + if [ -n "$EVERYTHING_INPUT" ] && [ "$EVERYTHING_INPUT" != "purge everything" ]; then + echo "::error::To purge the entire cache, the 'everything' input must be exactly 'purge everything'. Got: '$EVERYTHING_INPUT'. Leave it blank for a normal purge." + exit 1 + fi - - name: Purge Fastly edge cache per language + - name: Purge Fastly + # Auto post-deploy runs wait for the build, purge English only (temporary), + # and stay soft. A manual run uses the inputs: blank languages = all, the + # `hard` toggle, or a confirmed full-cache purge. + # + # Raw inputs are passed through the environment and quoted, never spliced + # into the command string, so a value like `en' --everything` can't break + # out of its argument and inject another flag. env: - LANGUAGES: ${{ inputs.languages || 'en' }} # Temporary, only purge English on deploy. Set to empty string for all - run: npm run purge-fastly-edge-cache-per-language + EVENT_NAME: ${{ github.event_name }} + LANGUAGES_INPUT: ${{ inputs.languages }} + HARD_INPUT: ${{ inputs.hard }} + EVERYTHING_INPUT: ${{ inputs.everything }} + run: | + args=() + if [ "$EVENT_NAME" != "workflow_dispatch" ]; then + args+=(--wait-for-build) + fi + if [ "$EVENT_NAME" = "deployment_status" ]; then + args+=(--languages en) + elif [ -n "$LANGUAGES_INPUT" ]; then + args+=(--languages "$LANGUAGES_INPUT") + fi + if [ "$HARD_INPUT" = "true" ]; then + args+=(--hard) + fi + if [ "$EVERYTHING_INPUT" = "purge everything" ]; then + args+=(--everything) + fi + npm run purge-fastly -- "${args[@]}" - uses: ./.github/actions/slack-alert if: ${{ failure() && github.event_name != 'workflow_dispatch' }} diff --git a/package.json b/package.json index 4e4950b1d08b..eea32e0326fc 100644 --- a/package.json +++ b/package.json @@ -79,9 +79,7 @@ "prettier": "prettier -w \"**/*.{ts,tsx,scss,yml,yaml}\"", "prettier-check": "prettier -c \"**/*.{ts,tsx,scss,yml,yaml}\"", "prevent-pushes-to-main": "tsx src/workflows/prevent-pushes-to-main.ts", - "purge-fastly-edge-cache": "tsx src/workflows/purge-fastly-edge-cache.ts", - "purge-fastly-edge-cache-per-language": "tsx src/languages/scripts/purge-fastly-edge-cache-per-language.ts", - "purge-fastly-all": "tsx src/workflows/purge-fastly-all.ts", + "purge-fastly": "tsx src/workflows/purge-fastly.ts", "readability-report": "tsx src/workflows/experimental/readability-report.ts", "ready-for-docs-review": "tsx src/workflows/ready-for-docs-review.ts", "release-banner": "tsx src/ghes-releases/scripts/release-banner.ts", diff --git a/src/languages/scripts/purge-fastly-edge-cache-per-language.ts b/src/languages/scripts/purge-fastly-edge-cache-per-language.ts deleted file mode 100644 index 8f68c02a6403..000000000000 --- a/src/languages/scripts/purge-fastly-edge-cache-per-language.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { languageKeys } from '@/languages/lib/languages-server' - -import { makeLanguageSurrogateKey } from '@/frame/middleware/set-fastly-surrogate-key' -import purgeEdgeCache from '@/workflows/purge-edge-cache' - -/** - * In simple terms, this script sends purge commands for... - * - * 1. no-language - * 2. 'en' - * 3. 'ja' - * 4. 'pt' - * ... - * - * ...and so on for all languages. - * - * Each surrogate key is purged twice because of Fastly shielding: the first - * purge clears the edge nodes and the second clears the origin shield. - * - * Two delays shape the schedule: - * - * - To avoid a stampeding herd after each purge, and to avoid unnecessary load - * on the backend, there's a slight delay between each language's FIRST purge. - * This gives the backend a chance to finish processing all the now stale URLs, - * for that language, before tackling the next. - * - The SECOND purge of a key happens a while after its first purge, long enough - * for the now-stale content to be re-fetched and re-shielded before we clear - * the shield again. Fastly's docs recommend ~2s for surrogate-key purges, but - * in practice that's been too short and stale content survives the shielding - * race, so we use a larger margin. See the "Race conditions" subsection of - * https://www.fastly.com/documentation/guides/concepts/cache/purging#race-conditions - * (the 30s figure there is for purge-all, which we don't use). The value must - * stay a multiple of DELAY_BETWEEN_LANGUAGES to keep the slot alignment below. - * - * Rather than block on the second purge (which would serialize everything and - * make the whole run take `DELAY_BEFORE_SECOND_PURGE` per key), we schedule all - * purges against a wall-clock timeline up front. Because the second-purge delay - * is a multiple of the between-languages delay, a key's second purge lands on - * the same slot as a later key's first purge. For example, with a 10s cadence - * and a 20s second-purge delay: - * - * t=0 no-language (1st) - * t=10 en (1st) - * t=20 es (1st) + no-language (2nd) - * t=30 ja (1st) + en (2nd) - * t=40 pt (1st) + es (2nd) - * ... - */ -const DELAY_BETWEEN_LANGUAGES = 10 * 1000 -const DELAY_BEFORE_SECOND_PURGE = 20 * 1000 - -// The pipelining only lines up if the second-purge delay is a whole number of -// language slots; otherwise second purges would drift off the cadence. Enforce -// it so a future tweak to either constant can't silently break the schedule. -if (DELAY_BEFORE_SECOND_PURGE % DELAY_BETWEEN_LANGUAGES !== 0) { - throw new Error( - `DELAY_BEFORE_SECOND_PURGE (${DELAY_BEFORE_SECOND_PURGE}ms) must be a multiple of ` + - `DELAY_BETWEEN_LANGUAGES (${DELAY_BETWEEN_LANGUAGES}ms) to keep second purges ` + - `aligned with later first-purge slots`, - ) -} - -const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) - -type PurgePhase = 'first' | 'second' -type PurgeOutcome = { key: string; phase: PurgePhase; error?: unknown } - -const languages = process.env.LANGUAGES - ? languagesFromString(process.env.LANGUAGES) - : // Make sure `en` is first because contributors write mostly in English - // and they're most likely wanting to see their landed changes appear - // in production as soon as possible. - languageKeys.sort((a) => (a === 'en' ? -1 : 1)) - -// This covers things like `/api/webhooks` which isn't language specific, hence -// the no-language key (an empty `makeLanguageSurrogateKey()`) leading the list. -const surrogateKeys = [ - makeLanguageSurrogateKey(), - ...languages.map((language) => makeLanguageSurrogateKey(language)), -] - -// Schedule every purge against a single wall-clock start time so the cadence -// doesn't drift with per-purge network latency, and so each second purge aligns -// with a later first purge as described above. -const startTime = Date.now() -const purges: Promise[] = [] - -// Each call returns a promise that resolves (never rejects) to an outcome: the -// internal try/catch means a failed purge can't become an unhandled rejection -// while we wait for the rest of the schedule, which can outlast an early second -// purge. Failures are surfaced after all purges settle, below. -async function runPurge(key: string, phase: PurgePhase, targetTime: number): Promise { - await sleep(Math.max(0, targetTime - Date.now())) - try { - // `purgeEdgeCache` logs its own "Attempting Fastly purge..." line; word this - // as the scheduled phase trigger so the two purges of a key are distinguishable. - console.log(`Triggering ${phase}-phase purge for '${key}'...`) - await purgeEdgeCache(key) - return { key, phase } - } catch (error) { - return { key, phase, error } - } -} - -for (const [index, key] of surrogateKeys.entries()) { - const slotStart = startTime + index * DELAY_BETWEEN_LANGUAGES - purges.push(runPurge(key, 'first', slotStart)) - purges.push(runPurge(key, 'second', slotStart + DELAY_BEFORE_SECOND_PURGE)) -} - -const outcomes = await Promise.all(purges) -const failures = outcomes.filter((outcome) => outcome.error) -if (failures.length) { - for (const failure of failures) { - console.error(`Fastly ${failure.phase} purge failed for '${failure.key}':`, failure.error) - } - throw new Error(`${failures.length} Fastly purge(s) failed`) -} - -function languagesFromString(str: string): string[] { - const parsedLanguages = str - .split(/,/) - .map((x) => x.trim()) - .filter(Boolean) - if (!parsedLanguages.every((lang) => languageKeys.includes(lang))) { - throw new Error( - `Unrecognized language code (${parsedLanguages.find((lang) => !languageKeys.includes(lang))})`, - ) - } - return parsedLanguages -} diff --git a/src/workflows/README.md b/src/workflows/README.md index e0c1c0e2d306..dd726a0ff986 100644 --- a/src/workflows/README.md +++ b/src/workflows/README.md @@ -26,7 +26,7 @@ Scripts are registered in `package.json`: | check-content-type | `npm run check-content-type` | Validates content types | | delete-orphan-translation-files | `npm run delete-orphan-translation-files` | Removes orphaned translations | | enable-automerge | `npm run enable-automerge` | Enables PR automerge | -| purge-fastly-edge-cache | `npm run purge-fastly-edge-cache` | Purges Fastly CDN cache | +| purge-fastly | `npm run purge-fastly` | Purges Fastly CDN cache (per-language, single-key, or entire cache) | | prevent-pushes-to-main | (Husky hook) | Prevents pushing to main | ### Running tests diff --git a/src/workflows/purge-edge-cache.ts b/src/workflows/purge-edge-cache.ts deleted file mode 100644 index 4546ceaee4fb..000000000000 --- a/src/workflows/purge-edge-cache.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { fetchWithRetry } from '@/frame/lib/fetch-utils' - -async function purgeFastlyBySurrogateKey({ - apiToken, - serviceId, - surrogateKey, -}: { - apiToken: string - serviceId: string - surrogateKey: string -}) { - const safeServiceId = encodeURIComponent(serviceId) - const safeSurrogateKey = encodeURIComponent(surrogateKey) - - const headers = { - 'fastly-key': apiToken, - accept: 'application/json', - 'fastly-soft-purge': '1', - } - const requestPath = `https://api.fastly.com/service/${safeServiceId}/purge/${safeSurrogateKey}` - const response = await fetchWithRetry( - requestPath, - { - method: 'POST', - headers: { - ...headers, - 'Content-Type': 'application/json', - }, - }, - { - retries: 0, - timeout: 30_000, - throwHttpErrors: false, - }, - ) - if (!response.ok) { - throw new Error(`HTTP ${response.status}: ${response.statusText}`) - } - return response -} - -export default async function purgeEdgeCache(surrogateKey: string | undefined) { - if (!surrogateKey) { - throw new Error('No key set and/or no FASTLY_SURROGATE_KEY env var set') - } - console.log(`Fastly purgeEdgeCache initialized for: '${surrogateKey}'`) - - const { FASTLY_TOKEN, FASTLY_SERVICE_ID } = process.env - if (!FASTLY_TOKEN || !FASTLY_SERVICE_ID) { - throw new Error('Fastly env vars not detected; skipping purgeEdgeCache step') - } - - const purgingParams = { - apiToken: FASTLY_TOKEN, - serviceId: FASTLY_SERVICE_ID, - surrogateKey, - } - - console.log('Attempting Fastly purge...') - const result = await purgeFastlyBySurrogateKey(purgingParams) - console.log('Fastly purge result:', result.status) -} diff --git a/src/workflows/purge-fastly-all.ts b/src/workflows/purge-fastly-all.ts deleted file mode 100644 index 2d94ec0b0694..000000000000 --- a/src/workflows/purge-fastly-all.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { fetchWithRetry } from '@/frame/lib/fetch-utils' - -// Purges the ENTIRE Fastly cache for the docs service via Fastly's purge_all -// endpoint. This is the workflow equivalent of the "Purge all" button in the -// Fastly UI. It is intentionally a separate, manually triggered entry point: -// routine post-deploy purging is handled by -// `purge-fastly-edge-cache-per-language.ts`, and a gentler "refresh everything" -// can be done by running the Purge Fastly workflow with an empty languages -// input (a soft surrogate-key purge of every language). -// -// NOTE: Fastly's purge_all is always a HARD purge. The `fastly-soft-purge` -// header has no effect on this endpoint, so every object is evicted immediately -// and origin sees a traffic spike while the cache refills. Only reach for this -// when a targeted purge will not do. -// https://www.fastly.com/documentation/reference/api/purging/ - -async function purgeFastlyAll({ apiToken, serviceId }: { apiToken: string; serviceId: string }) { - const safeServiceId = encodeURIComponent(serviceId) - const requestPath = `https://api.fastly.com/service/${safeServiceId}/purge_all` - const response = await fetchWithRetry( - requestPath, - { - method: 'POST', - headers: { - 'fastly-key': apiToken, - accept: 'application/json', - 'Content-Type': 'application/json', - }, - }, - { - retries: 0, - timeout: 30_000, - throwHttpErrors: false, - }, - ) - if (!response.ok) { - // Fastly puts permission/feature-disabled details in the response body, - // which is often the only actionable signal, so surface it best-effort. - let body = '' - try { - body = await response.text() - } catch { - body = '' - } - throw new Error( - `Fastly purge_all failed: HTTP ${response.status} ${response.statusText}${body ? `: ${body}` : ''}`, - ) - } - return response -} - -const { FASTLY_TOKEN, FASTLY_SERVICE_ID } = process.env -if (!FASTLY_TOKEN || !FASTLY_SERVICE_ID) { - throw new Error('Fastly env vars not detected; refusing to run purge_all') -} - -console.log('Attempting Fastly purge_all (hard purge of the entire cache)...') -const result = await purgeFastlyAll({ apiToken: FASTLY_TOKEN, serviceId: FASTLY_SERVICE_ID }) -console.log('Fastly purge_all result:', result.status) diff --git a/src/workflows/purge-fastly-edge-cache.ts b/src/workflows/purge-fastly-edge-cache.ts deleted file mode 100755 index 54637b0cd163..000000000000 --- a/src/workflows/purge-fastly-edge-cache.ts +++ /dev/null @@ -1,28 +0,0 @@ -import purgeEdgeCache from './purge-edge-cache' - -// This will purge every response that *contains* -// `process.env.FASTLY_SURROGATE_KEY`. -// We send Surrogate-Key values like: -// -// language:en -// language:fr -// language:ja -// or -// no-language -// -// `purgeEdgeCache` throws if no key is set, so a `FASTLY_SURROGATE_KEY` must be -// provided. This is the manual/targeted purge entry point; routine per-deploy -// purging is handled by `purge-fastly-edge-cache-per-language.ts`. -// -// Because we use Fastly shielding, a single surrogate-key purge can lose a race -// with the shield re-fetching stale content, so we purge twice: the first purge -// clears the edge nodes and the second clears the origin shield. Fastly -// recommends ~2s between surrogate-key purges. See -// https://developer.fastly.com/learning/concepts/purging/#shielding -const DELAY_BETWEEN_PURGES = 2 * 1000 -const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) - -const surrogateKey = process.env.FASTLY_SURROGATE_KEY -await purgeEdgeCache(surrogateKey) -await sleep(DELAY_BETWEEN_PURGES) -await purgeEdgeCache(surrogateKey) diff --git a/src/workflows/purge-fastly.ts b/src/workflows/purge-fastly.ts new file mode 100644 index 000000000000..09d2c320827e --- /dev/null +++ b/src/workflows/purge-fastly.ts @@ -0,0 +1,297 @@ +import { execFileSync } from 'node:child_process' + +import { program } from 'commander' + +import { fetchWithRetry } from '@/frame/lib/fetch-utils' +import { languageKeys } from '@/languages/lib/languages-server' +import { makeLanguageSurrogateKey } from '@/frame/middleware/set-fastly-surrogate-key' + +// Single entry point for purging Fastly. It runs in one of three modes: +// +// - --everything -> hard purge the ENTIRE cache via `purge_all`. +// - --surrogate-key -> double-purge that one surrogate key. Search uses +// this for `api-search:`. +// - otherwise -> double-purge `no-language` + each `language:` +// key, the routine post-deploy / manual purge. +// +// --wait-for-build polls production until it serves this commit before purging, +// so an automatic post-deploy purge doesn't revalidate against a still-rolling- +// out instance. --hard forces a hard purge; --everything ignores it and is +// always hard. + +const { FASTLY_TOKEN, FASTLY_SERVICE_ID } = process.env + +const DELAY_BETWEEN_KEYS = 10 * 1000 +const DELAY_BEFORE_SECOND_PURGE = 20 * 1000 + +const BUILD_WAIT_REQUIRED_MATCHES = 5 +const BUILD_WAIT_INTERVAL = 15 * 1000 +const BUILD_WAIT_TIMEOUT = 1200 * 1000 + +// The pipelining in purgeKeys only lines up if the second-purge delay is a whole +// number of key slots; otherwise second purges would drift off the cadence. +// Enforce it so a future tweak to either constant can't silently break it. +if (DELAY_BEFORE_SECOND_PURGE % DELAY_BETWEEN_KEYS !== 0) { + throw new Error( + `DELAY_BEFORE_SECOND_PURGE (${DELAY_BEFORE_SECOND_PURGE}ms) must be a multiple of ` + + `DELAY_BETWEEN_KEYS (${DELAY_BETWEEN_KEYS}ms) to keep second purges ` + + `aligned with later first-purge slots`, + ) +} + +const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) + +program + .description( + 'Purges Fastly after a deploy and on demand. Soft purge by default; can hard ' + + 'purge specific languages, or hard purge the entire cache.', + ) + .option('--wait-for-build', 'Wait until production serves the current commit before purging') + .option( + '--languages ', + "Comma separated languages to purge, e.g. 'en,es,ja'. Blank/omitted = all languages.", + ) + .option('--surrogate-key ', 'Purge a single explicit surrogate key. e.g. api-search:en') + .option('--hard', 'Evict immediately instead of the default soft purge') + .option('--everything', 'Hard purge the ENTIRE cache: every key. Ignores --languages/--hard.') + .parse(process.argv) + +type Options = { + waitForBuild?: boolean + languages?: string + surrogateKey?: string + hard?: boolean + everything?: boolean +} + +await main(program.opts()) + +async function main(options: Options) { + if (!FASTLY_TOKEN) { + throw new Error('FASTLY_TOKEN not detected; refusing to purge') + } + if (!FASTLY_SERVICE_ID) { + throw new Error('FASTLY_SERVICE_ID not detected; refusing to purge') + } + + if (options.waitForBuild) { + await waitForBuild() + } + + if (options.everything) { + // NOTE: Fastly's purge_all is always a HARD purge. The `fastly-soft-purge` + // header has no effect here, so every object is evicted immediately and + // origin sees a traffic spike while the cache refills. It clears every + // surrogate key: content, no-language, manual-purge assets, search, and so + // on. A targeted surrogate-key purge cannot reach those, so only reach for + // this when a targeted purge will not do. + // https://www.fastly.com/documentation/reference/api/purging/ + console.log('Attempting hard purge of the entire cache...') + const result = await fastlyPurge('purge_all') + console.log('Fastly purge_all result:', result.status) + return + } + + const soft = !options.hard + const surrogateKeys = options.surrogateKey + ? [options.surrogateKey] + : languageSurrogateKeys(options.languages) + await purgeKeys(surrogateKeys, soft) +} + +// Poll production until it serves the build commit. A single /_build match only +// proves one Moda instance has the new build; others may still be mid-rollout, +// and a soft purge could then revalidate against a lagging instance and re-cache +// old content for a full TTL. So require several consecutive matches first. +async function waitForBuild() { + const needs = execFileSync('git', ['rev-parse', 'HEAD']).toString().trim() + const startTime = Date.now() + let consecutive = 0 + + while (consecutive < BUILD_WAIT_REQUIRED_MATCHES) { + if (Date.now() - startTime > BUILD_WAIT_TIMEOUT) { + throw new Error( + `Production did not reach ${BUILD_WAIT_REQUIRED_MATCHES} consecutive build matches within ${BUILD_WAIT_TIMEOUT / 1000} seconds`, + ) + } + + let current = '' + try { + const response = await fetchWithRetry( + 'https://docs.github.com/_build', + {}, + { retries: 5, timeout: 30_000, throwHttpErrors: false }, + ) + if (response.ok) { + current = (await response.text()).trim() + } + } catch { + // Treat a fetch failure like a non-match: reset and keep polling. + current = '' + } + + if (current && current === needs) { + consecutive += 1 + console.log( + `Production matches the build commit (${consecutive}/${BUILD_WAIT_REQUIRED_MATCHES})`, + ) + } else { + if (consecutive > 0) { + console.log('Production stopped matching the build commit; resetting consecutive count') + } else { + console.log('Production is not up to date with the build commit') + } + consecutive = 0 + } + + if (consecutive < BUILD_WAIT_REQUIRED_MATCHES) { + await sleep(BUILD_WAIT_INTERVAL) + } + } + console.log( + `Production is up to date with the build commit.`, + `${BUILD_WAIT_REQUIRED_MATCHES} consecutive matches.`, + ) +} + +function languageSurrogateKeys(languagesInput?: string): string[] { + // Put `en` first because contributors write mostly in English and are most + // likely waiting to see their landed changes appear in production. Build a + // new array rather than sorting `languageKeys` in place, which is shared + // state. + const trimmed = languagesInput?.trim() + const languages = trimmed + ? languagesFromString(trimmed) + : ['en', ...languageKeys.filter((lang) => lang !== 'en')] + + // The leading no-language key, an empty `makeLanguageSurrogateKey()`, covers + // things like `/api/webhooks` which aren't language specific. + return [ + makeLanguageSurrogateKey(), + ...languages.map((language) => makeLanguageSurrogateKey(language)), + ] +} + +function languagesFromString(str: string): string[] { + const parsedLanguages = str + .split(/,/) + .map((x) => x.trim()) + .filter(Boolean) + if (!parsedLanguages.every((lang) => languageKeys.includes(lang))) { + throw new Error( + `Unrecognized language code (${parsedLanguages.find((lang) => !languageKeys.includes(lang))})`, + ) + } + return parsedLanguages +} + +type PurgePhase = 'first' | 'second' +type PurgeOutcome = { key: string; phase: PurgePhase; error?: unknown } + +/** + * Double-purge a set of surrogate keys. Per-deploy / manual purges pass + * `no-language` plus each `language:` key; the search reindex passes a + * single `api-search:` key. + * + * Each key is purged twice because of Fastly shielding: the first purge clears + * the edge nodes, the second clears the origin shield. Two delays shape the run. + * DELAY_BETWEEN_KEYS spaces out each key's first purge to avoid a stampeding + * herd on the backend. DELAY_BEFORE_SECOND_PURGE waits long enough for the now- + * stale content to be re-fetched and re-shielded before the second purge clears + * it. Fastly suggests ~2s between surrogate-key purges, but that's been too short + * in practice, so we use a larger margin. See the "Race conditions" section of + * https://www.fastly.com/documentation/guides/concepts/cache/purging#race-conditions + * Its 30s figure is for purge-all, which we don't use. + * + * To avoid serializing the run, we schedule every purge against one wall-clock + * timeline up front instead of blocking on each second purge. Because the second- + * purge delay is a multiple of the between-keys delay, a key's second purge + * shares a slot with a later key's first purge: + * + * t=0 no-language (1st) + * t=10 en (1st) + * t=20 es (1st) + no-language (2nd) + * t=30 ja (1st) + en (2nd) + * t=40 pt (1st) + es (2nd) + * ... + * + * A single-key purge is the degenerate case: first at t=0, second at t=20s. + */ +async function purgeKeys(surrogateKeys: string[], soft: boolean) { + // One wall-clock start time so the cadence doesn't drift with per-purge network + // latency and each second purge aligns with a later first purge, as above. + const startTime = Date.now() + const purges: Promise[] = [] + + // Each call resolves to an outcome and never rejects: the try/catch keeps a + // failed purge from becoming an unhandled rejection while later scheduled + // purges are still pending. Failures are surfaced after all purges settle. + async function runPurge( + key: string, + phase: PurgePhase, + targetTime: number, + ): Promise { + await sleep(Math.max(0, targetTime - Date.now())) + try { + console.log(`Triggering ${phase}-phase ${soft ? 'soft' : 'hard'} purge for '${key}'...`) + const result = await fastlyPurge(`purge/${encodeURIComponent(key)}`, { soft }) + console.log(`Fastly purge result for '${key}':`, result.status) + return { key, phase } + } catch (error) { + return { key, phase, error } + } + } + + for (const [index, key] of surrogateKeys.entries()) { + const slotStart = startTime + index * DELAY_BETWEEN_KEYS + purges.push(runPurge(key, 'first', slotStart)) + purges.push(runPurge(key, 'second', slotStart + DELAY_BEFORE_SECOND_PURGE)) + } + + const outcomes = await Promise.all(purges) + const failures = outcomes.filter((outcome) => outcome.error) + if (failures.length) { + for (const failure of failures) { + console.error(`Fastly ${failure.phase} purge failed for '${failure.key}':`, failure.error) + } + throw new Error(`${failures.length} Fastly purge(s) failed`) + } +} + +// Low-level Fastly purge. `endpoint` is appended to the service path, e.g. +// `purge/` or `purge_all`. Returns the response; on a non-2xx throws with +// the body best-effort, since Fastly puts permission/feature details there. +// +// Soft purge marks the object stale and serves stale-while-revalidate; hard +// purge evicts it outright. Soft can fail to clear content whose origin returns +// `304 Not Modified` on revalidation, since a 304 just extends the stale object, +// so use hard then. `purge_all` ignores the soft header and is always hard. +async function fastlyPurge(endpoint: string, { soft = false }: { soft?: boolean } = {}) { + const headers: Record = { + 'fastly-key': FASTLY_TOKEN as string, + accept: 'application/json', + 'Content-Type': 'application/json', + } + if (soft) { + headers['fastly-soft-purge'] = '1' + } + + const url = `https://api.fastly.com/service/${encodeURIComponent(FASTLY_SERVICE_ID as string)}/${endpoint}` + const response = await fetchWithRetry( + url, + { method: 'POST', headers }, + { retries: 0, timeout: 30_000, throwHttpErrors: false }, + ) + if (!response.ok) { + let body = '' + try { + body = await response.text() + } catch { + body = '' + } + throw new Error( + `Fastly purge failed: HTTP ${response.status} ${response.statusText}${body ? `: ${body}` : ''}`, + ) + } + return response +} From a82ebb26450ec8639bdc0122dfa761781f965981 Mon Sep 17 00:00:00 2001 From: Steve S Date: Fri, 19 Jun 2026 10:47:12 -0400 Subject: [PATCH 09/10] Fix screen reader announcing incorrect list info on audit log pages (#61821) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/audit-logs/components/GroupedEvents.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audit-logs/components/GroupedEvents.tsx b/src/audit-logs/components/GroupedEvents.tsx index 1240f328bcdc..ffa28309c224 100644 --- a/src/audit-logs/components/GroupedEvents.tsx +++ b/src/audit-logs/components/GroupedEvents.tsx @@ -50,7 +50,7 @@ export default function GroupedEvents({ auditLogEvents, category, categoryNote }
    {auditLogEvents.map((event) => (
    -
    +
    {event.action}
    From 815b739077403f5f8d08a675efc49578c02497e7 Mon Sep 17 00:00:00 2001 From: Kevin Heis Date: Fri, 19 Jun 2026 07:54:47 -0700 Subject: [PATCH 10/10] Fastly purge: soften input descriptions and add name labels (#61833) Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .github/workflows/purge-fastly.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/purge-fastly.yml b/.github/workflows/purge-fastly.yml index c78651c7161f..44340c93662d 100644 --- a/.github/workflows/purge-fastly.yml +++ b/.github/workflows/purge-fastly.yml @@ -12,16 +12,16 @@ on: workflow_dispatch: inputs: languages: - description: "Comma separated languages, e.g. 'en,es,ja,pt,zh,ru,fr,ko,de'. Blank = all languages." + description: "Languages: Comma separated languages, e.g. 'en,es,ja,pt,zh,ru,fr,ko,de'. Blank = all languages." required: false default: 'en' hard: - description: 'Evict immediately instead of the default soft purge. Use when a soft purge fails to clear stale content.' + description: 'Hard purge: Evict immediately instead of the default soft purge. Use when a soft purge fails to clear stale content.' type: boolean required: false default: false everything: - description: 'DANGER: hard-purge the ENTIRE Fastly cache... every key, all readers. Ignores the language/hard inputs. To confirm, type exactly: "purge everything". Otherwise leave blank.' + description: 'Everything: Hard-purge the entire Fastly cache... every key, all readers. Ignores the languages/hard inputs. To confirm, type exactly: "purge everything". Otherwise leave blank.' required: false default: ''